From 7441f76e79741b9ea050d76dede1266305615b90 Mon Sep 17 00:00:00 2001
From: onlyLYJ <382266293@qq.com>
Date: Sun, 11 Jun 2017 22:12:13 +0800
Subject: [PATCH 001/332] Merge pull request #6 from onlyliuxin/master

season 2
---
 students/382266293/src/pom.xml                |  32 ++++
 .../com/coderising/ood/srp/Configuration.java |  27 +++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  27 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 172 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 students/382266293/src/test.java              |   9 +
 8 files changed, 298 insertions(+)
 create mode 100644 students/382266293/src/pom.xml
 create mode 100644 students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/382266293/src/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/382266293/src/test.java

diff --git a/students/382266293/src/pom.xml b/students/382266293/src/pom.xml
new file mode 100644
index 0000000000..2bf55e64c9
--- /dev/null
+++ b/students/382266293/src/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>ood-assignment</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..db20a8a5d5
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,27 @@
+package src.main.java.com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> 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/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..4946f09f38
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package src.main.java.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/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..6edf953e19
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,27 @@
+package src.main.java.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/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..3b6716de70
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package src.main.java.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/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..e23638c4b2
--- /dev/null
+++ b/students/382266293/src/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,172 @@
+package src.main.java.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.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+    private static Configuration config;
+    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;
+
+
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        readFile(file);
+
+
+        config = new Configuration();
+
+        setSMTPHost();
+        setAltSMTPHost();
+
+
+        setFromAddress();
+
+
+        setLoadQuery();
+
+        sendEMails(mailDebug, loadMailingList());
+
+
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("E:\\git\\coding2017\\students\\382266293\\src\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(f, emailDebug);
+
+    }
+
+    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/382266293/src/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/382266293/src/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/382266293/src/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/382266293/src/test.java b/students/382266293/src/test.java
new file mode 100644
index 0000000000..56d4d4396e
--- /dev/null
+++ b/students/382266293/src/test.java
@@ -0,0 +1,9 @@
+/**
+ * Created by onlyLYJ on 2017/6/11.
+ */
+
+
+public class test {
+
+
+}

From 883818b1bad21bdb336ddac8dbc7af674cb40b7c Mon Sep 17 00:00:00 2001
From: Wen Wei <wenwei0415@qq.com>
Date: Sun, 11 Jun 2017 23:02:32 +0800
Subject: [PATCH 002/332] test

---
 students/463256809/src/Demo.java | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 students/463256809/src/Demo.java

diff --git a/students/463256809/src/Demo.java b/students/463256809/src/Demo.java
new file mode 100644
index 0000000000..a67375a605
--- /dev/null
+++ b/students/463256809/src/Demo.java
@@ -0,0 +1,6 @@
+
+public class Demo {
+	public static void main(String[] args) {
+		System.out.println("Test");
+	}
+}

From 704865b3cefc5da7e1487acb5a6af8062c43995f Mon Sep 17 00:00:00 2001
From: SYCHS <429301805@qq.com>
Date: Sun, 11 Jun 2017 23:14:59 +0800
Subject: [PATCH 003/332] This is a test

---
 students/429301805/src/gz/sychs/cn/test.java | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 students/429301805/src/gz/sychs/cn/test.java

diff --git a/students/429301805/src/gz/sychs/cn/test.java b/students/429301805/src/gz/sychs/cn/test.java
new file mode 100644
index 0000000000..9fa342b44f
--- /dev/null
+++ b/students/429301805/src/gz/sychs/cn/test.java
@@ -0,0 +1,10 @@
+package gz.sychs.cn;
+
+public class test {
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		System.out.println("This is a test");
+	}
+
+}

From 45f8857bffbb3b4256cb1831b74af6df3ed28ea0 Mon Sep 17 00:00:00 2001
From: Lyccccc <liuyuchen_0312@163.com>
Date: Mon, 12 Jun 2017 10:27:09 +0800
Subject: [PATCH 004/332] first commit

---
 students/472779948/helloworld.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/472779948/helloworld.txt

diff --git a/students/472779948/helloworld.txt b/students/472779948/helloworld.txt
new file mode 100644
index 0000000000..fe51499bb2
--- /dev/null
+++ b/students/472779948/helloworld.txt
@@ -0,0 +1 @@
+helloworld!
\ No newline at end of file

From 866444ee2a2c807d7be4024735573b3a0879053c Mon Sep 17 00:00:00 2001
From: nightn <nightn.dev@gmail.com>
Date: Mon, 12 Jun 2017 10:36:31 +0800
Subject: [PATCH 005/332] first commit

---
 students/276137509/276137509Learning/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/276137509/276137509Learning/readme.md

diff --git a/students/276137509/276137509Learning/readme.md b/students/276137509/276137509Learning/readme.md
new file mode 100644
index 0000000000..88093b9187
--- /dev/null
+++ b/students/276137509/276137509Learning/readme.md
@@ -0,0 +1 @@
+### nightn (杭州-莱顿) 的代码仓库
\ No newline at end of file

From 0c42579305e136986ed644c3302e1bcb72ba614c Mon Sep 17 00:00:00 2001
From: nightn <nightn.dev@gmail.com>
Date: Mon, 12 Jun 2017 10:51:44 +0800
Subject: [PATCH 006/332] update readme.md

---
 students/276137509/276137509Learning/readme.md | 2 +-
 students/276137509/readme.md                   | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 students/276137509/readme.md

diff --git a/students/276137509/276137509Learning/readme.md b/students/276137509/276137509Learning/readme.md
index 88093b9187..7c847014a2 100644
--- a/students/276137509/276137509Learning/readme.md
+++ b/students/276137509/276137509Learning/readme.md
@@ -1 +1 @@
-### nightn (杭州-莱顿) 的代码仓库
\ No newline at end of file
+### This is my first project just for testing
\ No newline at end of file
diff --git a/students/276137509/readme.md b/students/276137509/readme.md
new file mode 100644
index 0000000000..065efcdbbe
--- /dev/null
+++ b/students/276137509/readme.md
@@ -0,0 +1 @@
+#### Nightn (杭州-莱顿) 代码仓库
\ No newline at end of file

From 0e40448f7e46700db6f500d8b4a3ed80380daf4c Mon Sep 17 00:00:00 2001
From: maneng <marnner@qq.com>
Date: Mon, 12 Jun 2017 11:58:00 +0800
Subject: [PATCH 007/332] first pull request

---
 students/643449856/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/643449856/readme.md

diff --git a/students/643449856/readme.md b/students/643449856/readme.md
new file mode 100644
index 0000000000..b8e87ead7c
--- /dev/null
+++ b/students/643449856/readme.md
@@ -0,0 +1 @@
+first pull request
\ No newline at end of file

From fd03bd64cdf5db36ba0b104c978ebdbe4a5367c4 Mon Sep 17 00:00:00 2001
From: tjc <501917623@qq.com>
Date: Mon, 12 Jun 2017 12:05:47 +0800
Subject: [PATCH 008/332] =?UTF-8?q?=E6=B5=8B=E8=AF=95git?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/501917623/src/work/Test/Test.java | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 students/501917623/src/work/Test/Test.java

diff --git a/students/501917623/src/work/Test/Test.java b/students/501917623/src/work/Test/Test.java
new file mode 100644
index 0000000000..3da24e1f28
--- /dev/null
+++ b/students/501917623/src/work/Test/Test.java
@@ -0,0 +1,10 @@
+package work.Test;
+
+public class Test {
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+		System.out.println("hello world");
+	}
+
+}

From 87119062e0aa3f88c40d447fa40a4f5fcdf33437 Mon Sep 17 00:00:00 2001
From: maneng <marnner@qq.com>
Date: Mon, 12 Jun 2017 12:08:15 +0800
Subject: [PATCH 009/332] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9?=
 =?UTF-8?q?=E7=9B=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/643449856/ood-assignment/pom.xml     |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/643449856/ood-assignment/pom.xml
 create mode 100644 students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/643449856/ood-assignment/pom.xml b/students/643449856/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/643449856/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/643449856/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<String,String> 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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/643449856/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/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/643449856/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/643449856/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

From 67d0e7d5a2829f07f7c5c52dcff384c4232c94a9 Mon Sep 17 00:00:00 2001
From: tianxianhu <329866097@qq.com>
Date: Mon, 12 Jun 2017 17:23:02 +0800
Subject: [PATCH 010/332] initial homework environment

---
 students/329866097/.gitignore                 |  80 +++++++
 students/329866097/README.md                  |   1 +
 students/329866097/pom.xml                    |  45 ++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 198 ++++++++++++++++++
 .../src/main/resources/product_promotion.txt  |   4 +
 9 files changed, 403 insertions(+)
 create mode 100644 students/329866097/.gitignore
 create mode 100644 students/329866097/README.md
 create mode 100644 students/329866097/pom.xml
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/329866097/src/main/resources/product_promotion.txt

diff --git a/students/329866097/.gitignore b/students/329866097/.gitignore
new file mode 100644
index 0000000000..bf58d0a162
--- /dev/null
+++ b/students/329866097/.gitignore
@@ -0,0 +1,80 @@
+######################
+# 解决java产生文件
+######################
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+######################
+# 解决maven产生的文件
+######################
+
+target/
+**/target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+
+######################
+# 解决各类编辑器自动产生的文件
+######################
+
+*.iml
+
+## Directory-based project format:
+.idea/
+# if you remove the above rule, at least ignore the following:
+
+# User-specific stuff:
+# .idea/workspace.xml
+# .idea/tasks.xml
+# .idea/dictionaries
+
+# Sensitive or high-churn files:
+# .idea/dataSources.ids
+# .idea/dataSources.xml
+# .idea/sqlDataSources.xml
+# .idea/dynamic.xml
+# .idea/uiDesigner.xml
+
+# Gradle:
+# .idea/gradle.xml
+# .idea/libraries
+
+# Mongo Explorer plugin:
+# .idea/mongoSettings.xml
+
+## File-based project format:
+*.ipr
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+/target/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
diff --git a/students/329866097/README.md b/students/329866097/README.md
new file mode 100644
index 0000000000..87f2e553da
--- /dev/null
+++ b/students/329866097/README.md
@@ -0,0 +1 @@
+Mr.Who 作业提交
\ No newline at end of file
diff --git a/students/329866097/pom.xml b/students/329866097/pom.xml
new file mode 100644
index 0000000000..b1b8d4d410
--- /dev/null
+++ b/students/329866097/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment-txh</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/Configuration.java b/students/329866097/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/329866097/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<String,String> 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/329866097/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/329866097/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/329866097/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/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/329866097/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/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/329866097/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/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..d32df49c79
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,198 @@
+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.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("src/main/resources/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/329866097/src/main/resources/product_promotion.txt b/students/329866097/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/329866097/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 92191804f605251d5d8b3b394b582738d5ec5b54 Mon Sep 17 00:00:00 2001
From: renxin <renxin@renxin.shule.com>
Date: Mon, 12 Jun 2017 17:30:23 +0800
Subject: [PATCH 011/332] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=B8=8A=E6=AC=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/335402763/pom.xml | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 students/335402763/pom.xml

diff --git a/students/335402763/pom.xml b/students/335402763/pom.xml
new file mode 100644
index 0000000000..d73cd62750
--- /dev/null
+++ b/students/335402763/pom.xml
@@ -0,0 +1,6 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.coderising</groupId>
+  <artifactId>335402763Learning</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+</project>
\ No newline at end of file

From a0c616972623b4a600ee2ad1d180bf8a4125eda9 Mon Sep 17 00:00:00 2001
From: renxin <renxin@renxin.shule.com>
Date: Mon, 12 Jun 2017 17:32:32 +0800
Subject: [PATCH 012/332] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=8E=9F=E5=A7=8Bcod?=
 =?UTF-8?q?e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 6 files changed, 278 insertions(+)
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java b/students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..927c7155cc
--- /dev/null
+++ b/students/335402763/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<String,String> 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/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..868a03ff83
--- /dev/null
+++ b/students/335402763/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/335402763/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..65383e4dba
--- /dev/null
+++ b/students/335402763/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/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..373f3ee306
--- /dev/null
+++ b/students/335402763/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/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..94bfcbaf54
--- /dev/null
+++ b/students/335402763/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/335402763/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/335402763/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/335402763/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

From b684e959f56984552b1073c5e518b2119a38a703 Mon Sep 17 00:00:00 2001
From: gongxun <gongxun@wesai.com>
Date: Mon, 12 Jun 2017 19:02:26 +0800
Subject: [PATCH 013/332] =?UTF-8?q?=E6=9A=82=E5=AD=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../first/ood/srp/Configuration.java          | 28 +++++++++
 .../first/ood/srp/ConfigurationKeys.java      | 10 ++++
 students/785396327/first/ood/srp/DBUtil.java  | 38 ++++++++++++
 students/785396327/first/ood/srp/Email.java   | 59 +++++++++++++++++++
 .../785396327/first/ood/srp/EmailParser.java  | 54 +++++++++++++++++
 .../785396327/first/ood/srp/FileParser.java   | 44 ++++++++++++++
 .../785396327/first/ood/srp/MailSender.java   | 22 +++++++
 .../785396327/first/ood/srp/MailUtil.java     | 16 +++++
 .../first/ood/srp/PromotionMail.java          | 26 ++++++++
 .../785396327/first/ood/srp/SendMailTest.java | 11 ++++
 .../785396327/first/ood/srp/StringUtils.java  | 17 ++++++
 .../first/ood/srp/product_promotion.txt       |  4 ++
 12 files changed, 329 insertions(+)
 create mode 100644 students/785396327/first/ood/srp/Configuration.java
 create mode 100644 students/785396327/first/ood/srp/ConfigurationKeys.java
 create mode 100644 students/785396327/first/ood/srp/DBUtil.java
 create mode 100644 students/785396327/first/ood/srp/Email.java
 create mode 100644 students/785396327/first/ood/srp/EmailParser.java
 create mode 100644 students/785396327/first/ood/srp/FileParser.java
 create mode 100644 students/785396327/first/ood/srp/MailSender.java
 create mode 100644 students/785396327/first/ood/srp/MailUtil.java
 create mode 100644 students/785396327/first/ood/srp/PromotionMail.java
 create mode 100644 students/785396327/first/ood/srp/SendMailTest.java
 create mode 100644 students/785396327/first/ood/srp/StringUtils.java
 create mode 100644 students/785396327/first/ood/srp/product_promotion.txt

diff --git a/students/785396327/first/ood/srp/Configuration.java b/students/785396327/first/ood/srp/Configuration.java
new file mode 100644
index 0000000000..2d4130423e
--- /dev/null
+++ b/students/785396327/first/ood/srp/Configuration.java
@@ -0,0 +1,28 @@
+package first.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> configurations = new HashMap<String, String>();
+
+
+    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/785396327/first/ood/srp/ConfigurationKeys.java b/students/785396327/first/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..28de2ced0a
--- /dev/null
+++ b/students/785396327/first/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package first.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";
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/785396327/first/ood/srp/DBUtil.java b/students/785396327/first/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..463b464df4
--- /dev/null
+++ b/students/785396327/first/ood/srp/DBUtil.java
@@ -0,0 +1,38 @@
+package first.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DBUtil {
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     *
+     * @param sql
+     * @return
+     */
+    public static List<HashMap<String, String>> query(String sql) {
+//        validateSQL(sql, params);
+
+        List userList = new ArrayList();
+        for (int i = 1; i <= 3; i++) {
+            Map<String, String> userInfo = new HashMap();
+            userInfo.put("NAME", "User" + i);
+            userInfo.put("EMAIL", "aa@bb.com");
+            userList.add(userInfo);
+        }
+
+        return userList;
+    }
+
+    private static void validateSQL(String sql, Object[] params) {
+        if (StringUtils.isEmpty(sql))
+            throw new RuntimeException("empty sql");
+        String[] sqlFaction = sql.split("\\?");
+        if (sqlFaction.length - 1 != params.length)
+            throw new RuntimeException("wrong number of parameters");
+
+    }
+}
diff --git a/students/785396327/first/ood/srp/Email.java b/students/785396327/first/ood/srp/Email.java
new file mode 100644
index 0000000000..417e9aba6d
--- /dev/null
+++ b/students/785396327/first/ood/srp/Email.java
@@ -0,0 +1,59 @@
+package first.ood.srp;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public class Email {
+    protected String smtpHost;
+    protected String altSmtpHost;
+    protected String fromAddress;
+    protected String toAddress;
+    protected String subject;
+    protected String message;
+
+    public Email() {
+
+    }
+
+    public Email(String smtpHost, String altSmtpHost, String fromAddress, String toAddress, String subject, String message) {
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    protected void setSMTPHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+    }
+
+    protected void setAltSMTPHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+
+    }
+
+    protected void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    protected void setMessage(String message) {
+        this.message = message;
+    }
+
+    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;
+    }
+}
diff --git a/students/785396327/first/ood/srp/EmailParser.java b/students/785396327/first/ood/srp/EmailParser.java
new file mode 100644
index 0000000000..1129beaf34
--- /dev/null
+++ b/students/785396327/first/ood/srp/EmailParser.java
@@ -0,0 +1,54 @@
+package first.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public class EmailParser {
+
+    public List<PromotionMail> parseEmailList(String filepath, String loadQuery) {
+        List<PromotionMail> mailList = new ArrayList<PromotionMail>();
+        Email email = parseCommonInfo(filepath);
+        List<HashMap<String, String>> individualInfo = getIndividualInfo(loadQuery);
+        for (HashMap<String, String> map : individualInfo) {
+            PromotionMail promotionMail = new PromotionMail(email);
+            promotionMail.setToAddress(parseToAddress(map));
+            promotionMail.setMessage(parseMessage(map, promotionMail));
+            promotionMail.setSubject("您关注的产品降价了");
+            mailList.add(promotionMail);
+        }
+        return mailList;
+    }
+
+    private String parseMessage(HashMap<String, String> map, PromotionMail promotionMail) {
+        String name = map.get(ConfigurationKeys.NAME_KEY);
+        String message = "尊敬的 " + name + ", 您关注的产品 " + promotionMail.getProductDesc() + " 降价了，欢迎购买!";
+        return message;
+    }
+
+    private String parseToAddress(HashMap<String, String> map) {
+        return map.get(ConfigurationKeys.EMAIL_KEY);
+    }
+
+    private PromotionMail parseCommonInfo(String filepath) {
+        Email email = new Email();
+
+        FileParser fileParser = new FileParser(filepath);
+//        email.setProductID(fileParser.parseProductID());
+//        email.setProductDesc(fileParser.parseProductDesc());
+
+        Configuration configuration = new Configuration();
+//        promotionMail.setSMTPHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+//        promotionMail.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+//        promotionMail.setAltSMTPHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+//        return promotionMail;
+        return null;
+    }
+
+    private List<HashMap<String, String>> getIndividualInfo(String loadQuery) {
+        return DBUtil.query(loadQuery);
+    }
+}
diff --git a/students/785396327/first/ood/srp/FileParser.java b/students/785396327/first/ood/srp/FileParser.java
new file mode 100644
index 0000000000..52827cdd32
--- /dev/null
+++ b/students/785396327/first/ood/srp/FileParser.java
@@ -0,0 +1,44 @@
+package first.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public class FileParser {
+    private String[] data;
+
+    public FileParser(String filePath) {
+        try {
+            if (StringUtils.isEmpty(filePath))
+                throw new RuntimeException("init file parser must contains a legal file");
+            readFile(filePath);
+        } catch (IOException e) {
+            throw new RuntimeException("parse file cause errors");
+        }
+    }
+
+    private void readFile(String filePath) throws IOException
+    {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(filePath));
+            String temp = br.readLine();
+            data = temp.split(" ");
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+    public String parseProductID() {
+        return data[0];
+    }
+
+    public String parseProductDesc() {
+        return data[1];
+    }
+}
diff --git a/students/785396327/first/ood/srp/MailSender.java b/students/785396327/first/ood/srp/MailSender.java
new file mode 100644
index 0000000000..90d7f42bdb
--- /dev/null
+++ b/students/785396327/first/ood/srp/MailSender.java
@@ -0,0 +1,22 @@
+package first.ood.srp;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public class MailSender {
+
+    private void sendMail(PromotionMail mail, boolean isDebug) {
+        MailUtil.sendEmail(mail.toAddress, mail.fromAddress, mail.subject, mail.message, StringUtils.isEmpty(mail.smtpHost) == true ? mail.smtpHost : mail.altSmtpHost, isDebug);
+    }
+
+    public void sendMailList(List<PromotionMail> mailList, boolean isDebug) {
+        if (mailList != null) {
+            for (Iterator<PromotionMail> iterator = mailList.iterator(); iterator.hasNext(); ) {
+                sendMail(iterator.next(), isDebug);
+            }
+        }
+    }
+}
diff --git a/students/785396327/first/ood/srp/MailUtil.java b/students/785396327/first/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..2ec9de8c42
--- /dev/null
+++ b/students/785396327/first/ood/srp/MailUtil.java
@@ -0,0 +1,16 @@
+package first.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/785396327/first/ood/srp/PromotionMail.java b/students/785396327/first/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..1a604b7fe3
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionMail.java
@@ -0,0 +1,26 @@
+package first.ood.srp;
+
+public class PromotionMail extends Email {
+    private String productID = null;
+    private String productDesc = null;
+
+    public PromotionMail(Email email) {
+        super(email.smtpHost, email.altSmtpHost, email.fromAddress, email.toAddress, email.subject, email.message);
+    }
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public String getproductID() {
+        return productID;
+    }
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+    public String getProductDesc() {
+        return this.productDesc;
+    }
+}
diff --git a/students/785396327/first/ood/srp/SendMailTest.java b/students/785396327/first/ood/srp/SendMailTest.java
new file mode 100644
index 0000000000..69681f6c6d
--- /dev/null
+++ b/students/785396327/first/ood/srp/SendMailTest.java
@@ -0,0 +1,11 @@
+package first.ood.srp;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public class SendMailTest {
+
+    public static void main(String[] args) {
+        String loadQuery = "Select name from subscriptions where product_id= ? and send_mail=1";
+    }
+}
diff --git a/students/785396327/first/ood/srp/StringUtils.java b/students/785396327/first/ood/srp/StringUtils.java
new file mode 100644
index 0000000000..f5321161bb
--- /dev/null
+++ b/students/785396327/first/ood/srp/StringUtils.java
@@ -0,0 +1,17 @@
+package first.ood.srp;
+
+/**
+ * Created by gongxun on 2017/6/12.
+ */
+public class StringUtils {
+
+    /**
+     * 判断文件路径是否为空
+     *
+     * @param filePath
+     * @return
+     */
+    public static boolean isEmpty(String filePath) {
+        return filePath == null || filePath.trim().isEmpty();
+    }
+}
diff --git a/students/785396327/first/ood/srp/product_promotion.txt b/students/785396327/first/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/785396327/first/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

From 68efe80768238d3a81eaac6762076b6c4df3f30e Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Mon, 12 Jun 2017 21:44:50 +0800
Subject: [PATCH 014/332] add 1204187480

---
 students/1204187480/.gitignore                |  21 ++
 students/1204187480/code/homework/.gitignore  |  21 ++
 .../code/homework/coderising/pom.xml          |  26 ++
 .../com/coderising/jvm/clz/AccessFlag.java    |   7 +
 .../com/coderising/jvm/clz/ClassFile.java     |   7 +
 .../com/coderising/jvm/clz/ClassIndex.java    |  10 +
 .../jvm/loader/ClassFileLoader.java           | 114 ++++++
 .../jvm/loader/ClassFileParser.java           |   7 +
 .../coderising/litestruts/LoginAction.java    |  39 ++
 .../com/coderising/litestruts/Struts.java     | 121 ++++++
 .../com/coderising/litestruts/StrutsTest.java |  43 +++
 .../java/com/coderising/litestruts/View.java  |  23 ++
 .../litestruts/parser/ActionConfig.java       |  45 +++
 .../parser/DefaultStrutsParser.java           |  52 +++
 .../coderising/litestruts/parser/Result.java  |  22 ++
 .../litestruts/parser/StrutsConfig.java       |  23 ++
 .../litestruts/parser/StrutsParser.java       |   8 +
 .../coderising/src/main/resources/struts.xml  |  11 +
 .../java/com/coderising/api/ComputeTest.java  |  21 ++
 .../java/com/coderising/api/CycleTest.java    |  25 ++
 .../java/com/coderising/api/FileTest.java     |  32 ++
 .../java/com/coderising/api/ObjectTest.java   |  18 +
 .../java/com/coderising/api/StrmanTest.java   |  17 +
 .../jvm/test/ClassFileloaderTest.java         | 354 ++++++++++++++++++
 .../com/coderising/jvm/test/EmployeeV1.java   |  28 ++
 .../litestruts/parser/StructsParserTest.java  |  14 +
 .../1204187480/code/homework/coding/pom.xml   |  12 +
 .../java/com/coding/basic/BinaryTreeNode.java |  32 ++
 .../main/java/com/coding/basic/Iterator.java  |   7 +
 .../src/main/java/com/coding/basic/List.java  |  10 +
 .../src/main/java/com/coding/basic/Queue.java |  24 ++
 .../src/main/java/com/coding/basic/Stack.java |  32 ++
 .../com/coding/basic/array/ArrayList.java     | 111 ++++++
 .../com/coding/basic/array/ArrayUtil.java     | 252 +++++++++++++
 .../coding/basic/linklist/LRUPageFrame.java   | 169 +++++++++
 .../basic/linklist/LRUPageFrameTest.java      |  34 ++
 .../com/coding/basic/linklist/LinkedList.java | 351 +++++++++++++++++
 .../test/java/com/coding/api/ArraysTest.java  |  22 ++
 .../test/java/com/coding/api/SystemTest.java  |  24 ++
 .../java/com/coding/basic/LinkedListTest.java | 202 ++++++++++
 .../com/coding/basic/array/ArrayListTest.java |  37 ++
 .../com/coding/basic/array/ArrayUtilTest.java |  76 ++++
 .../1204187480/code/homework/common/pom.xml   |  13 +
 .../com/coding/common/util/BeanUtils.java     | 144 +++++++
 .../com/coding/common/util/ByteUtils.java     |  21 ++
 .../com/coding/common/util/FileUtils2.java    |  69 ++++
 .../java/com/coding/common/util/IOUtils2.java |  24 ++
 .../com/coding/common/util/StringUtils2.java  |  34 ++
 .../test/java/com/coding/api/ArraysTest.java  |  22 ++
 .../test/java/com/coding/api/SystemTest.java  |  24 ++
 .../com/coding/common/util/ByteUtilsTest.java |  20 +
 .../coding/common/util/FileUtils2Test.java    |  35 ++
 .../code/homework/parent-dependencies/pom.xml | 169 +++++++++
 .../1204187480/code/homework/parent/pom.xml   |  23 ++
 students/1204187480/code/homework/pom.xml     |  18 +
 ...0\210\350\256\241\347\256\227\346\234\272" |   0
 students/1204187480/note/todo/homework.md     |   8 +
 57 files changed, 3128 insertions(+)
 create mode 100644 students/1204187480/.gitignore
 create mode 100644 students/1204187480/code/homework/.gitignore
 create mode 100644 students/1204187480/code/homework/coderising/pom.xml
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/resources/struts.xml
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java
 create mode 100644 students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
 create mode 100644 students/1204187480/code/homework/coding/pom.xml
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java
 create mode 100644 students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java
 create mode 100644 students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java
 create mode 100644 students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java
 create mode 100644 students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java
 create mode 100644 students/1204187480/code/homework/common/pom.xml
 create mode 100755 students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java
 create mode 100644 students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java
 create mode 100644 students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
 create mode 100644 students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
 create mode 100644 students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java
 create mode 100644 students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java
 create mode 100644 students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java
 create mode 100644 students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java
 create mode 100644 students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java
 create mode 100644 students/1204187480/code/homework/parent-dependencies/pom.xml
 create mode 100644 students/1204187480/code/homework/parent/pom.xml
 create mode 100644 students/1204187480/code/homework/pom.xml
 create mode 100644 "students/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272"
 create mode 100644 students/1204187480/note/todo/homework.md

diff --git a/students/1204187480/.gitignore b/students/1204187480/.gitignore
new file mode 100644
index 0000000000..2a5296f902
--- /dev/null
+++ b/students/1204187480/.gitignore
@@ -0,0 +1,21 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
diff --git a/students/1204187480/code/homework/.gitignore b/students/1204187480/code/homework/.gitignore
new file mode 100644
index 0000000000..2a5296f902
--- /dev/null
+++ b/students/1204187480/code/homework/.gitignore
@@ -0,0 +1,21 @@
+*.class
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#ide config
+.metadata
+.recommenders
+.idea/
+*.iml
+rebel.*
+.rebel.*
+
+target
diff --git a/students/1204187480/code/homework/coderising/pom.xml b/students/1204187480/code/homework/coderising/pom.xml
new file mode 100644
index 0000000000..d7d922d4d8
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/pom.xml
@@ -0,0 +1,26 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>coderising</artifactId>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent/pom.xml</relativePath>
+    </parent>
+
+    <properties>
+        <commons-digester.version>2.1</commons-digester.version>
+
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-digester</groupId>
+            <artifactId>commons-digester</artifactId>
+            <version>${commons-digester.version}</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..6b60e0bed2
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/AccessFlag.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.clz;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class AccessFlag {
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..855bf9c7e0
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassFile.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.clz;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class ClassFile {
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..7b177aa12f
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/clz/ClassIndex.java
@@ -0,0 +1,10 @@
+package com.coderising.jvm.clz;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class ClassIndex {
+
+    String minorVersion;
+    String majorVersion;
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..1c5f8196e8
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,114 @@
+package com.coderising.jvm.loader;
+
+
+import com.coding.common.util.FileUtils2;
+import org.apache.commons.lang3.StringUtils;
+import strman.Strman;
+
+import java.io.File;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.coding.common.util.FileUtils2.getCanonicalPath;
+import static org.apache.commons.lang3.StringUtils.replace;
+import static org.apache.commons.lang3.StringUtils.substringAfter;
+
+/**
+ * Created by luoziyihao on 4/27/17.
+ */
+public class ClassFileLoader {
+
+    private List<String> clzPaths;
+
+    private Map<String, byte[]> clzContext;
+
+    public void addClassPath(String path) {
+        if (clzPaths == null) {
+            clzPaths = new ArrayList<>(5);
+        }
+        if (StringUtils.isBlank(path)) {
+            return;
+        }
+        File file = new File(path);
+        if (!file.isDirectory()) {
+            return;
+        }
+        String canonicalName = getCanonicalPath(file);
+        if (clzPaths.contains(canonicalName)) {
+            return;
+        }
+        clzPaths.add(getCanonicalPath(file));
+    }
+
+
+    private static final String SPLIT = ";";
+
+    public String getClassPath() {
+        StringBuilder classPath = new StringBuilder();
+
+        for (String e : clzPaths) {
+            classPath.append(e)
+                    .append(SPLIT);
+        }
+        if (classPath.length() > 1) {
+            classPath.deleteCharAt(classPath.length() - 1);
+        }
+        return classPath.toString();
+    }
+
+    private static final String CLZ_SUFFIX = ".class";
+
+    public byte[] readBinaryCode(String className) {
+        if (StringUtils.isBlank(className)) {
+            throw new IllegalStateException("className is blank");
+        }
+        byte[] binaryCode = getClzContext().get(Strman.append(className, CLZ_SUFFIX));
+        if (binaryCode == null) {
+            throw new IllegalStateException(
+                    Strman.format("className={0} is not found in classpath", className));
+        }
+        return binaryCode;
+    }
+
+    private Map<String, byte[]> getClzContext() {
+        if (clzContext == null) {
+            clzContext = createClzContextWithClzPaths(clzPaths);
+        }
+        return clzContext;
+    }
+
+    private Map<String, byte[]> createClzContextWithClzPaths(List<String> clzPaths) {
+        Map<String, byte[]> clzContext = new ConcurrentHashMap<>(60);
+        for (String e : clzPaths) {
+            File file = new File(e);
+            if (file.isDirectory()) {
+                List<File> files = FileUtils2.listAllFiles(file);
+                clzContext = addClassElements(clzContext, e, files);
+            }
+        }
+        return clzContext;
+    }
+
+    private Map<String, byte[]> addClassElements(Map<String, byte[]> clzContext, String classpath, List<File> files) {
+        for (File classFile : files) {
+            String filePath = getCanonicalPath(classFile);
+            String canonicalName = getCanonicalName(classpath, filePath);
+            byte[] bytes = FileUtils2.getBytes(classFile);
+            clzContext.put(canonicalName, bytes);
+        }
+        return clzContext;
+    }
+
+    /**
+     * 将classpath 下的文件路径转成 a.b.c.class 的格式
+     */
+    private static final String POINT = ".";
+
+    private String getCanonicalName(String classpath, String filePath) {
+        String tmp = replace(substringAfter(filePath, classpath), File.separator, POINT);
+        if (tmp.startsWith(POINT)) {
+            tmp = StringUtils.removeStart(tmp, POINT);
+        }
+        return tmp;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..9c77821341
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
@@ -0,0 +1,7 @@
+package com.coderising.jvm.loader;
+
+/**
+ * Created by luoziyihao on 5/23/17.
+ */
+public class ClassFileParser {
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..0b238b2db0
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,121 @@
+package com.coderising.litestruts;
+
+import com.coderising.litestruts.parser.ActionConfig;
+import com.coderising.litestruts.parser.DefaultStrutsParser;
+import com.coderising.litestruts.parser.StrutsConfig;
+import com.coderising.litestruts.parser.StrutsParser;
+import com.coding.common.util.BeanUtils;
+
+import java.util.Map;
+
+
+public class Struts {
+
+    private static StrutsParser strutsParser = new DefaultStrutsParser();
+
+    private static final String STRUTS_CONFIG_PATH = "struts.xml";
+    private static final BeanUtils beanUtils = new BeanUtils();
+
+    public static View runAction(String actionName, Map<String, String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+
+        */
+
+        /**
+         * 0. 读取配置文件struts.xml
+         */
+        StrutsConfig strutsConfig = strutsParser.parser(STRUTS_CONFIG_PATH);
+        ActionConfig actionConfig = strutsConfig.getActions().get(actionName);
+        /**
+         * 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+         据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+         ("name"="test" ,  "password"="1234") ,
+         那就应该调用 setName和setPassword方法
+         */
+        Object action = setPropertiesForAction(actionConfig, actionName, parameters);
+
+        /**
+         * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+         */
+        String resultName = doExecute(action);
+        /**
+         * 3. 通过反射找到对象的所有getter方法（例如 getMessage）,
+         通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,
+         放到View对象的parameters
+         */
+        View view = createViewAndSetParameters(action);
+        /**
+         * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，
+         放到View对象的jsp字段中。
+         */
+        setViewValue(view, resultName, actionConfig);
+        return view;
+    }
+
+    private static void setViewValue(View view, String resultName, ActionConfig config) {
+        view.setJsp(config.getResults().get(resultName).getView());
+    }
+
+    private static View createViewAndSetParameters(Object action) {
+        View view = new View();
+        view.setParameters(beanUtils.describe(action));
+        return view;
+    }
+
+    private static String doExecute(Object action) {
+        return (String) beanUtils.invokeWithNoParamter("execute", action);
+    }
+
+    private static Object setPropertiesForAction(ActionConfig actionConfig, String actionName, Map<String, String> parameters) {
+        Object action = createInstance(findActionClass(actionConfig.getClassName()));
+        for (Map.Entry<String, String> entry : parameters.entrySet()) {
+            setProperty(entry.getKey(), entry.getValue(), action);
+        }
+        return action;
+    }
+
+    /**
+     * todo 校验 key 是否存在
+     *
+     * @param key
+     * @param value
+     * @param action
+     */
+    private static void setProperty(String key, String value, Object action) {
+        beanUtils.setPara(value, key, action);
+    }
+
+    private static Object createInstance(Class classValue) {
+        try {
+            return classValue.newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private static Class findActionClass(String className) {
+        try {
+            return Class.forName(className);
+        } catch (ClassNotFoundException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
new file mode 100644
index 0000000000..4aaba284fb
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/ActionConfig.java
@@ -0,0 +1,45 @@
+package com.coderising.litestruts.parser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ActionConfig {
+    private String name;
+    private String className;
+    private Map<String, Result> results = new HashMap<>(10);
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Map<String, Result> getResults() {
+        return results;
+    }
+
+    public void setResults(Map<String, Result> results) {
+        this.results = results;
+    }
+
+    public void addResult(Result result) {
+        this.results.put(result.getName(), result);
+    }
+
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
new file mode 100644
index 0000000000..ea58507738
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/DefaultStrutsParser.java
@@ -0,0 +1,52 @@
+package com.coderising.litestruts.parser;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.commons.digester.Digester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 解析 struts.xml 文件
+ * @apiNote 借鉴 http://www.everycoding.com/coding/78.html; http://blog.csdn.net/caihaijiang/article/details/5944955
+ * Created by luoziyihao on 3/5/17.
+ */
+public class DefaultStrutsParser implements StrutsParser {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Override
+    public StrutsConfig parser(String filePathInClasspath) {
+        String path = this.getClass().getClassLoader().getResource(filePathInClasspath).getPath();
+        File input = new File(path);
+        Digester digester = new Digester();
+        // 创建 StrutsConfig 对象
+        digester.addObjectCreate("struts", StrutsConfig.class);
+        // 将 struts 节点上的attribute属性映射到 StrutsConfig 对象的属性上
+        digester.addSetProperties("struts");
+        digester.addObjectCreate("struts/action", ActionConfig.class);
+        // 将 struts/action 节点上的attribute属性映射到 Action 对象的属性上, 并自定义属性映射
+        digester.addSetProperties("struts/action"
+                , new String[]{"name", "class"}, new String[]{"name", "className"});
+        digester.addObjectCreate("struts/action/result", Result.class);
+        digester.addSetProperties("struts/action/result"
+                , new String[]{"name"}, new String[]{"name"});
+        // 将 struts/action/result 节点上的body属性映射到 Result 对象的属性上
+        digester.addCallMethod("struts/action/result", "setView", 0);
+        // 对应struts/action/result 生成的对象添加到 Action中
+        digester.addSetNext("struts/action/result", "addResult");
+        // 对应struts/action 生成的对象添加到 Struts中
+        digester.addSetNext("struts/action", "addAction");
+
+        try {
+            StrutsConfig strutsConfig = (StrutsConfig) digester.parse(input);
+            logger.debug("strutsConfig={}", JSON.toJSONString(strutsConfig));
+            return strutsConfig;
+        } catch (IOException | SAXException e) {
+            throw new IllegalStateException(e);
+        }
+
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
new file mode 100644
index 0000000000..c402418e6b
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/Result.java
@@ -0,0 +1,22 @@
+package com.coderising.litestruts.parser;
+
+public class Result {
+    private String name;
+    private String view;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getView() {
+        return view;
+    }
+
+    public void setView(String view) {
+        this.view = view;
+    }
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
new file mode 100644
index 0000000000..88f769157e
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsConfig.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StrutsConfig {
+    public Map<String, ActionConfig> actions = new HashMap<>(10);
+
+    public Map<String, ActionConfig> getActions() {
+        return actions;
+    }
+
+    public void setActions(Map<String, ActionConfig> actions) {
+        this.actions = actions;
+    }
+
+    public void addAction(ActionConfig action) {
+        this.actions.put(action.getName(), action);
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
new file mode 100644
index 0000000000..ab7358c777
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/parser/StrutsParser.java
@@ -0,0 +1,8 @@
+package com.coderising.litestruts.parser;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public interface StrutsParser {
+    StrutsConfig parser(String filePathInClasspath);
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/resources/struts.xml b/students/1204187480/code/homework/coderising/src/main/resources/struts.xml
new file mode 100644
index 0000000000..876156eb4d
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
new file mode 100644
index 0000000000..f02816a555
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ComputeTest.java
@@ -0,0 +1,21 @@
+package com.coderising.api;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ComputeTest {
+
+    @Test
+    public void testDivisionExactly(){
+        System.out.println( 7 >> 1);
+        System.out.println( -5 >> 2);
+        System.out.println( -5 << 2);
+    }
+
+    @Test
+    public void testSqrt() {
+        System.out.println(Math.sqrt(10));
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
new file mode 100644
index 0000000000..6abb5d925d
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/CycleTest.java
@@ -0,0 +1,25 @@
+package com.coderising.api;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class CycleTest {
+
+    /**
+     * checkIndex will be excuted in each cycle
+     */
+    @Test
+    public void  testForSize() {
+        int[] arr = new int[]{1, 2, 3, 4, 54};
+        for (int i = 0; checkIndex(i, arr); i++ ) {
+
+        }
+    }
+
+    private boolean checkIndex(int i, int[] arr) {
+        System.out.println(i);
+        return i < arr.length;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java
new file mode 100644
index 0000000000..bd918a011c
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/FileTest.java
@@ -0,0 +1,32 @@
+package com.coderising.api;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by luoziyihao on 4/28/17.
+ */
+@Slf4j
+public class FileTest {
+
+    @Test
+    public void testFile() {
+        File file = new File("./hahah");
+        Assert.assertFalse(file.isDirectory());
+
+    }
+
+    @Test
+    public void  testAbsolutePath() throws IOException {
+        File file = new File("../src");
+        log.info("isDirectory={}", file.isDirectory());
+        log.info(file.getAbsolutePath());
+        log.info(file.getCanonicalPath());
+        log.info(file.getName());
+        log.info(file.getPath());
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java
new file mode 100644
index 0000000000..06cd373de5
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/ObjectTest.java
@@ -0,0 +1,18 @@
+package com.coderising.api;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+@Slf4j
+public class ObjectTest {
+    @Test
+    public void test(){
+        Object a[] = {1};
+      log.info(a.getClass().getName());
+      log.info(a.getClass().getCanonicalName());
+      log.info(a.getClass().getSimpleName());
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java
new file mode 100644
index 0000000000..6831eb0ad6
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/api/StrmanTest.java
@@ -0,0 +1,17 @@
+package com.coderising.api;
+
+import org.junit.Test;
+import strman.Strman;
+
+/**
+ * Created by luoziyihao on 5/3/17.
+ */
+public class StrmanTest {
+
+    @Test
+    public void testFormat() {
+
+        System.out.println(Strman.format("className is not found in classpath, className={1}", ",333 ","cccc"));
+
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java
new file mode 100644
index 0000000000..b7c5bab54e
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java
@@ -0,0 +1,354 @@
+package com.coderising.jvm.test;
+
+import java.io.File;
+import java.util.List;
+
+import ch.qos.logback.core.encoder.ByteArrayUtil;
+import com.coding.common.util.ByteUtils;
+import com.coding.common.util.FileUtils2;
+import org.junit.After;
+import  org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+//import com.coderising.jvm.clz.ClassFile;
+//import com.coderising.jvm.clz.ClassIndex;
+//import com.coderising.jvm.cmd.BiPushCmd;
+//import com.coderising.jvm.cmd.ByteCodeCommand;
+//import com.coderising.jvm.cmd.OneOperandCmd;
+//import com.coderising.jvm.cmd.TwoOperandCmd;
+//import com.coderising.jvm.constant.ClassInfo;
+//import com.coderising.jvm.constant.ConstantPool;
+//import com.coderising.jvm.constant.MethodRefInfo;
+//import com.coderising.jvm.constant.NameAndTypeInfo;
+//import com.coderising.jvm.constant.UTF8Info;
+//import com.coderising.jvm.field.Field;
+import com.coderising.jvm.loader.ClassFileLoader;
+
+import static com.coding.common.util.FileUtils2.getCanonicalPath;
+//import com.coderising.jvm.method.Method;
+
+
+
+
+
+public class ClassFileloaderTest {
+
+	
+	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
+	
+	static String path1 = "target/classes";
+	static String path2 = "target/test-classes";
+	
+//	static ClassFile clzFile = null;
+//	static {
+//		ClassFileLoader loader = new ClassFileLoader();
+//		loader.addClassPath(path1);
+//		String className = "com.coderising.jvm.test.EmployeeV1";
+//
+//		clzFile = loader.loadClass(className);
+//
+//	}
+
+	
+	@Before
+	public void setUp() throws Exception {		 
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	private void addClassPath(ClassFileLoader loader) {
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+	}
+
+	@Test
+	public void testClassPath(){		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		addClassPath(loader);
+		String clzPath = loader.getClassPath();
+		
+		Assert.assertEquals(getCanonicalPath(new File(path1))+";"+getCanonicalPath(new File(path2)),clzPath);
+		
+	}
+
+	@Test
+	public void testClassFileLength() {		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		addClassPath(loader);
+		
+		String className = "com.coderising.jvm.test.EmployeeV1";
+
+		byte[] byteCodes = loader.readBinaryCode(className);
+		
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1056, byteCodes.length);
+		
+	}
+	
+	
+    @Test	
+	public void testMagicNumber(){
+    	ClassFileLoader loader = new ClassFileLoader();
+		addClassPath(loader);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+		
+		
+		String acctualValue = this.byteToHexString(codes);
+		
+		Assert.assertEquals("cafebabe", acctualValue);
+	}
+    
+    
+
+   	private String byteToHexString(byte[] codes ){
+		return ByteUtils.byteToHexString(codes);
+   	}
+
+//    add comment for behind test
+//    /**
+//     * ----------------------------------------------------------------------
+//     */
+//
+//
+//    @Test
+//    public void testVersion(){
+//
+//		Assert.assertEquals(0, clzFile.getMinorVersion());
+//		Assert.assertEquals(52, clzFile.getMajorVersion());
+//
+//    }
+//
+//    @Test
+//    public void testConstantPool(){
+//
+//
+//		ConstantPool pool = clzFile.getConstantPool();
+//
+//		Assert.assertEquals(53, pool.getSize());
+//
+//		{
+//			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+//			Assert.assertEquals(2, clzInfo.getUtf8Index());
+//
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+//			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+//		}
+//		{
+//			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+//			Assert.assertEquals(4, clzInfo.getUtf8Index());
+//
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+//			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+//		}
+//		{
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+//			Assert.assertEquals("name", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+//			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+//			Assert.assertEquals("age", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+//			Assert.assertEquals("I", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+//			Assert.assertEquals("<init>", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+//			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+//
+//			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+//			Assert.assertEquals("Code", utf8Info.getValue());
+//		}
+//
+//		{
+//			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+//			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+//			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+//		}
+//
+//		{
+//			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+//			Assert.assertEquals(9, nameAndType.getIndex1());
+//			Assert.assertEquals(14, nameAndType.getIndex2());
+//		}
+//		//抽查几个吧
+//		{
+//			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+//			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+//			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+//		}
+//
+//		{
+//			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+//			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+//		}
+//    }
+//    @Test
+//    public void testClassIndex(){
+//
+//    	ClassIndex clzIndex = clzFile.getClzIndex();
+//    	ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+//    	ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+//
+//
+//    	Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+//    	Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+//    }
+//
+//    /**
+//     * 下面是第三次JVM课应实现的测试用例
+//     */
+//    @Test
+//    public void testReadFields(){
+//
+//    	List<Field> fields = clzFile.getFields();
+//    	Assert.assertEquals(2, fields.size());
+//    	{
+//    		Field f = fields.get(0);
+//    		Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+//    	}
+//    	{
+//    		Field f = fields.get(1);
+//    		Assert.assertEquals("age:I", f.toString());
+//    	}
+//    }
+//    @Test
+//    public void testMethods(){
+//
+//    	List<Method> methods = clzFile.getMethods();
+//    	ConstantPool pool = clzFile.getConstantPool();
+//
+//    	{
+//    		Method m = methods.get(0);
+//    		assertMethodEquals(pool,m,
+//    				"<init>",
+//    				"(Ljava/lang/String;I)V",
+//    				"2ab7000c2a2bb5000f2a1cb50011b1");
+//
+//    	}
+//    	{
+//    		Method m = methods.get(1);
+//    		assertMethodEquals(pool,m,
+//    				"setName",
+//    				"(Ljava/lang/String;)V",
+//    				"2a2bb5000fb1");
+//
+//    	}
+//    	{
+//    		Method m = methods.get(2);
+//    		assertMethodEquals(pool,m,
+//    				"setAge",
+//    				"(I)V",
+//    				"2a1bb50011b1");
+//    	}
+//    	{
+//    		Method m = methods.get(3);
+//    		assertMethodEquals(pool,m,
+//    				"sayHello",
+//    				"()V",
+//    				"b2001c1222b60024b1");
+//
+//    	}
+//    	{
+//    		Method m = methods.get(4);
+//    		assertMethodEquals(pool,m,
+//    				"main",
+//    				"([Ljava/lang/String;)V",
+//    				"bb000159122b101db7002d4c2bb6002fb1");
+//    	}
+//    }
+//
+//    private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){
+//    	String methodName = pool.getUTF8String(m.getNameIndex());
+//		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+//		String code = m.getCodeAttr().getCode();
+//		Assert.assertEquals(expectedName, methodName);
+//		Assert.assertEquals(expectedDesc, methodDesc);
+//		Assert.assertEquals(expectedCode, code);
+//    }
+//
+//    @Test
+//    public void testByteCodeCommand(){
+//    	{
+//	    	Method initMethod = this.clzFile.getMethod("<init>", "(Ljava/lang/String;I)V");
+//	    	ByteCodeCommand [] cmds = initMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: aload_0", cmds[0]);
+//	    	assertOpCodeEquals("1: invokespecial #12", cmds[1]);
+//	    	assertOpCodeEquals("4: aload_0", cmds[2]);
+//	    	assertOpCodeEquals("5: aload_1", cmds[3]);
+//	    	assertOpCodeEquals("6: putfield #15", cmds[4]);
+//	    	assertOpCodeEquals("9: aload_0", cmds[5]);
+//	    	assertOpCodeEquals("10: iload_2", cmds[6]);
+//	    	assertOpCodeEquals("11: putfield #17", cmds[7]);
+//	    	assertOpCodeEquals("14: return", cmds[8]);
+//    	}
+//
+//    	{
+//	    	Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V");
+//	    	ByteCodeCommand [] cmds = setNameMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: aload_0", cmds[0]);
+//	    	assertOpCodeEquals("1: aload_1", cmds[1]);
+//	    	assertOpCodeEquals("2: putfield #15", cmds[2]);
+//	    	assertOpCodeEquals("5: return", cmds[3]);
+//
+//    	}
+//
+//    	{
+//	    	Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V");
+//	    	ByteCodeCommand [] cmds = sayHelloMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: getstatic #28", cmds[0]);
+//	    	assertOpCodeEquals("3: ldc #34", cmds[1]);
+//	    	assertOpCodeEquals("5: invokevirtual #36", cmds[2]);
+//	    	assertOpCodeEquals("8: return", cmds[3]);
+//
+//    	}
+//
+//    	{
+//	    	Method mainMethod = this.clzFile.getMainMethod();
+//
+//	    	ByteCodeCommand [] cmds = mainMethod.getCmds();
+//
+//	    	assertOpCodeEquals("0: new #1", cmds[0]);
+//	    	assertOpCodeEquals("3: dup", cmds[1]);
+//	    	assertOpCodeEquals("4: ldc #43", cmds[2]);
+//	    	assertOpCodeEquals("6: bipush 29", cmds[3]);
+//	    	assertOpCodeEquals("8: invokespecial #45", cmds[4]);
+//	    	assertOpCodeEquals("11: astore_1", cmds[5]);
+//	    	assertOpCodeEquals("12: aload_1", cmds[6]);
+//	    	assertOpCodeEquals("13: invokevirtual #47", cmds[7]);
+//	    	assertOpCodeEquals("16: return", cmds[8]);
+//    	}
+//
+//    }
+//
+//    private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){
+//
+//    	String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText();
+//
+//    	if(cmd instanceof OneOperandCmd){
+//    		if(cmd instanceof BiPushCmd){
+//    			acctual += " " + ((OneOperandCmd)cmd).getOperand();
+//    		} else{
+//    			acctual += " #" + ((OneOperandCmd)cmd).getOperand();
+//    		}
+//    	}
+//    	if(cmd instanceof TwoOperandCmd){
+//    		acctual += " #" + ((TwoOperandCmd)cmd).getIndex();
+//    	}
+//    	Assert.assertEquals(expected, acctual);
+//    }
+
+}
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java
new file mode 100644
index 0000000000..12e3d7efdd
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/jvm/test/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.test;
+
+public class EmployeeV1 {
+	
+	
+	private String name;
+    private int age;
+    
+    public EmployeeV1(String name, int age) {
+        this.name = name;
+        this.age = age;        
+    }    
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public void setAge(int age){
+    	this.age = age;
+    }
+    public void sayHello() {        
+    	System.out.println("Hello , this is class Employee ");    	
+    }
+    public static void main(String[] args){
+    	EmployeeV1 p = new EmployeeV1("Andy",29);
+    	p.sayHello();    
+    	
+    }
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
new file mode 100644
index 0000000000..72e841a230
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/test/java/com/coderising/litestruts/parser/StructsParserTest.java
@@ -0,0 +1,14 @@
+package com.coderising.litestruts.parser;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StructsParserTest {
+    @Test
+    public void parser() throws Exception {
+        new DefaultStrutsParser().parser("struts.xml");
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/pom.xml b/students/1204187480/code/homework/coding/pom.xml
new file mode 100644
index 0000000000..08acfc3528
--- /dev/null
+++ b/students/1204187480/code/homework/coding/pom.xml
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>coding</artifactId>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent/pom.xml</relativePath>
+    </parent>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..d7ac820192
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+	
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+	
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..ef939ae2cc
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,10 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+	public Iterator iterator();
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..e333496198
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java
@@ -0,0 +1,24 @@
+package com.coding.basic;
+
+import com.coding.basic.linklist.LinkedList;
+
+public class Queue {
+
+	private LinkedList elementData = new LinkedList();
+
+	public void enQueue(Object o){
+		elementData.add(o);
+	}
+	
+	public Object deQueue(){
+		return elementData.remove(0);
+	}
+	
+	public boolean isEmpty(){
+		return size() == 0;
+	}
+	
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java
new file mode 100644
index 0000000000..7336dccfe9
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java
@@ -0,0 +1,32 @@
+package com.coding.basic;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		if (isEmpty()) {
+			throw new IllegalStateException("the stack is empty");
+		}
+		return elementData.remove(elementData.size() - 1);
+	}
+	
+	public Object peek(){
+		if (isEmpty()) {
+			throw new IllegalStateException("the stack is empty");
+		}
+		return elementData.get(elementData.size() - 1);
+	}
+
+	public boolean isEmpty(){
+		return size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..cbe1f87a05
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,111 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+import java.util.Arrays;
+
+public class ArrayList implements List {
+
+    private int size = 0;
+
+    private Object[] elementData = new Object[100];
+
+    private Iterator iterator = new ArrayListIterator();
+
+    private int length() {
+        return elementData.length;
+    }
+
+    private static final int ENLARGE_LENGTH = 100;
+
+    private Object[] enlarge(Object[] origin) {
+        return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH);
+    }
+
+    private void enLargeElementData() {
+        if (size == length()) {
+            elementData = enlarge(elementData);
+        }
+    }
+
+    public void add(Object o) {
+        enLargeElementData();
+        elementData[size] = o;
+        size++;
+    }
+
+    public void add(int index, Object o) {
+        checkForAdd(index);
+        enLargeElementData();
+        // 备份 index 处及后面的数据
+        Object[] elementsBehindIndex = backBehindElements(elementData, index);
+        // 给index处 设值
+        elementData[index] = o;
+        // 追加 备份的数据
+        appendElement(elementData, index, elementsBehindIndex);
+        size++;
+    }
+
+    private void appendElement(Object[] origin, int pos, Object[] append) {
+        System.arraycopy(append, 0, origin, pos, append.length);
+    }
+
+    private Object[] backBehindElements(Object[] elementData, int index) {
+        int backSize = size - index;
+        Object[] back = new Object[backSize];
+        System.arraycopy(elementData, index, back, 0, backSize);
+        return back;
+    }
+
+    public Object get(int index) {
+        checkIndex(index);
+        return elementData[index];
+    }
+
+    private void checkIndex(int index) {
+        if (index < 0 || index >= size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+    private void checkForAdd(int index) {
+        if (index < 0 || index > size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+    public Object remove(int index) {
+        checkIndex(index);
+        Object[] back = backBehindElements(elementData, index + 1);
+        System.arraycopy(back, 0, elementData, index, back.length);
+        Object ret = elementData[index];
+        elementData[index] = null;
+        size--;
+        return ret;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public Iterator iterator() {
+        return iterator;
+    }
+
+    private class ArrayListIterator implements Iterator {
+
+        int next = 0;
+
+        @Override
+        public boolean hasNext() {
+           return next < size;
+        }
+
+        @Override
+        public Object next() {
+            return elementData[next++];
+        }
+    }
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..42ec6efe57
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,252 @@
+package com.coding.basic.array;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ArrayUtil {
+	private final Logger logger = LoggerFactory.getLogger(this.getClass());
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+	    int length = origin.length;
+	    int mid = length >> 1;
+		for (int i = 0; i < mid; i++) {
+		    int hIndex = length - 1 -i;
+		    int l = origin[i];
+		    int h = origin[hIndex];
+		    origin[hIndex] = l;
+		    origin[i] = h;
+        }
+
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+	    int removeValue = 0;
+	    return removeValue(oldArray, removeValue);
+	}
+
+    private int[] removeValue(int[] oldArray, int removeValue) {
+	    int length = oldArray.length;
+	    int[] dest = new int[length];
+	    int j = 0;
+	    for(int i = 0; i < length; i++) {
+	        int v = oldArray[i];
+	        if (v != removeValue) {
+	            dest[j++] = v;
+            }
+        }
+
+        int[] retArray = new int[j];
+	    System.arraycopy(dest, 0, retArray, 0, j);
+        return retArray;
+    }
+
+    /**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+     * todo 数组 a1, b1 自身去重
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		int length1 = array1.length;
+		int length2 = array2.length;
+		int length = length1 + length2;
+	    int[] newArray = new int[length];
+
+	    return findAndSetLeastWithOutDuplicate(array1, array2, 0, 0, 0, 0, newArray);
+	}
+
+    /**
+     * todo 优化递归出口判断, 优化三个条件判断为一个
+     * @param array1
+     * @param array2
+     * @param i
+     * @param j
+     * @param k
+     * @param duplicate
+     * @param newArray
+     * @return
+     */
+    private int[] findAndSetLeastWithOutDuplicate(int[] array1, int[] array2, int i, int j, int k, int duplicate, int[] newArray) {
+
+	        if (i == array1.length && j < array2.length) {
+	            System.arraycopy(array2, j, newArray, k, array2.length - j);
+                return copyLastValues(newArray, duplicate);
+            }
+            if (j == array2.length && i < array1.length) {
+                System.arraycopy(array1, i, newArray, k, array1.length - i);
+                return copyLastValues(newArray, duplicate);
+            }
+            if (j == array2.length && i == array1.length) {
+                return copyLastValues(newArray, duplicate);
+            }
+
+            int v1 = array1[i];
+            int v2 = array2[j];
+            if (v1 < v2) {
+                newArray [k] = v1;
+                return findAndSetLeastWithOutDuplicate(array1, array2, ++i, j,  ++k, duplicate, newArray);
+            } else if (v1 > v2){
+                newArray [k] = v2;
+                return findAndSetLeastWithOutDuplicate(array1, array2, i, ++j,  ++k, duplicate, newArray);
+            } else {
+                newArray [k] = v2;
+                return findAndSetLeastWithOutDuplicate(array1, array2, ++i, ++j,  ++k, ++duplicate, newArray);
+            }
+
+    }
+
+    private int[] copyLastValues(int[] newArray, int duplicate) {
+        int[] retArray = new int[newArray.length - duplicate];
+        System.arraycopy(newArray, 0, retArray, 0, retArray.length);
+        return retArray;
+    }
+
+
+    /**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+	    int[] newArray = new int[oldArray.length + size];
+	    System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
+		return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+	    if (max <= 1) {
+	        return new int[]{};
+        }
+        int [] newArray = new int[max];
+	    newArray[0] = 1;
+	    return fibonacciN(1, 1, 1, max, newArray);
+	}
+
+    private int[] fibonacciN(int size, int current, int next, int max, int[] newArray) {
+        if (next >= max) {
+            int[] retArray = new int[size];
+            System.arraycopy(newArray, 0, retArray, 0, size);
+            return retArray;
+        } else {
+            newArray[++size - 1] = next;
+            return fibonacciN(size, next, current + next,  max, newArray);
+        }
+    }
+
+    /**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+     * todo 使用已有的质数序列 优化质数验证
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+	    if (max <= 2) {
+	        return new int[]{};
+        }
+
+	    int[] newArray = new int[max];
+	    int j = 0;
+	    for (int i = 2; i < max; i++) {
+	        if (isPrime(i)) {
+	            newArray[j++] = i;
+            }
+        }
+        int[] retArray = new int[j];
+	    System.arraycopy(newArray, 0, retArray, 0, j);
+		return retArray;
+	}
+
+    private boolean isPrime(int number) {
+        int limit = Double.valueOf(Math.sqrt(number)).intValue();
+        for(int i = 2; i <= limit; i++) {
+            if (number % i == 0 ) {
+                return false;
+            }
+        }
+        return true;
+
+    }
+
+    /**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+	    int[] newArray = new int[48];   // 经过不少数学家研究，到2013年2月6日为止，一共找到了48个完全数。
+        int j = 0;
+        for (int i = 2; i < max; i++) {
+            if (isPerfectNumber(i)) {
+                if (j >= newArray.length) {
+                    newArray = this.grow(newArray, 1);
+                }
+                newArray[j++] = i;
+
+            }
+        }
+        int[] retArray = new int[j];
+        System.arraycopy(newArray, 0, retArray, 0, j);
+		return retArray;
+	}
+
+    private boolean isPerfectNumber(int number) {
+	    int sum = 0;
+	    for (int i = 1; i < number; i++) {
+	        if (number % i == 0) {
+	            sum += i;
+            }
+        }
+
+        return sum == number;
+    }
+
+    /**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+	    StringBuilder builder = new StringBuilder(20);
+	    int length = array.length;
+	    for (int i = 0; i< length; i++) {
+	        builder.append(array[i]).append(seperator);
+        }
+        builder.deleteCharAt(builder.length() - seperator.length());
+		return builder.toString();
+	}
+	
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..96c2e2cdab
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,169 @@
+package com.coding.basic.linklist;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 定长链表
+ * 命中后更新 pageNumber的位置
+ * 随时要考虑 first, node 的变化
+ */
+@Slf4j
+public class LRUPageFrame {
+
+    private static class Node {
+
+        Node prev;
+        Node next;
+        int pageNum;
+
+        public Node(Node next, int pageNum) {
+            this.next = next;
+            this.pageNum = pageNum;
+        }
+
+        public Node(int pageNum) {
+            this.pageNum = pageNum;
+        }
+
+        Node() {
+        }
+
+        public String debug() {
+            return new StringBuilder().
+                    append("\n##########################pre: ")
+                    .append(prev)
+                    .append("\n##########################node: ")
+                    .append(this)
+                    .append("\n##########################next: ")
+                    .append(next)
+                    .append("\n##########################pageNum: ")
+                    .append(pageNum)
+
+                    .toString();
+        }
+    }
+
+
+    private int capacity;
+
+    private int currentSize;
+    private Node first;// 链表头
+    private Node last;// 链表尾
+
+
+    public LRUPageFrame(int capacity) {
+        this.currentSize = 0;
+        this.capacity = capacity;
+
+    }
+
+    /**
+     * 获取缓存中对象
+     * 新的对象应该放在前面
+     *
+     * @param pageNum
+     * @return
+     */
+    public void access(int pageNum) {
+        if (capacity == 0) {
+            return;
+        }
+
+        // 如果已经存在, 删除已经存在的
+        removeContainedNode(pageNum);
+
+        /**
+         * 向前追加
+         */
+        // 如果 first 为空,   first=last=newNode
+        if (first == null && last == null) {
+            first = last = new Node(pageNum);
+            // 如果不为空 , first=newNode, first.next.pre = first
+        } else {
+            first = new Node(first, pageNum);
+            first.next.prev = first;
+        }
+        // 修改 size
+        currentSize++;
+        debugContent("addNewNode");
+
+        // 如果 size = capacity + 1, 去除last (额外考虑 capacity 为 1 的情况), last.next=null
+        if (currentSize == capacity + 1) {
+            last = last.prev;
+            last.next = null;
+            currentSize--;
+            debugContent("rmSpareNode");
+        }
+    }
+
+    private Node removeContainedNode(int pageNum) {
+        Node node = first;
+        while (node != null) {
+
+            if (node.pageNum == pageNum) {
+                Node nodePre = node.prev;
+                Node nodeNext = node.next;
+                if (nodePre == null) {  // 说明在第一个节点就 hit了
+                    first = nodeNext;
+                    first.prev = null;
+                } else {
+                    nodePre.next = nodeNext;
+                    if (nodeNext != null) {
+                        nodeNext.prev = nodePre;
+                    } else {
+                        last = nodePre; // 如果 nodeNext 为空, 说明原先 last 是 node, 现在是 nodePre
+                    }
+                }
+                currentSize--;
+                return node;
+            }
+            node = node.next;
+        }
+        debugContent("removeContainedNode");
+        return null;
+    }
+
+    private void debugContent(String tag) {
+        log.debug("tag={}, currentSize={}, toString={}", tag, currentSize, debug());
+    }
+
+
+    public String toString() {
+        StringBuilder buffer = new StringBuilder();
+        Node node = first;
+        while (node != null) {
+            buffer.append(node.pageNum);
+
+            node = node.next;
+            if (node != null) {
+                buffer.append(",");
+            }
+        }
+        return buffer.toString();
+    }
+
+    public String debug() {
+        StringBuilder buffer = new StringBuilder();
+        Node node = first;
+        while (node != null) {
+            buffer
+                    .append(node.debug())
+                    .append("\n##########################last: ")
+                    .append(last)
+                    .append("\n##########################capacity: ")
+                    .append(capacity)
+                    .append("\n##########################toString: ")
+                    .append(toString())
+
+            ;
+
+            node = node.next;
+            if (node != null) {
+                buffer.append("\n,");
+            }
+        }
+        return buffer.toString() + "\n";
+    }
+
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7fd72fc2b4
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..d9c4ee3c7b
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,351 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+
+    private Node head;
+    private int size = 0;
+
+    public void add(Object o) {
+        Node newNode = new Node(o, null);
+        if (head == null) {
+            head = newNode;
+        } else {
+            node(size - 1).next = newNode;
+        }
+        size++;
+    }
+
+    public void add(int index, Object o) {
+        checkForAdd(index);
+        if (index == size) {
+            add(o);
+        } else {
+            Node newNode = new Node(o, null);
+            if (index == 0) {
+                addFirst(o);
+            } else {
+                Node preNode = node(index - 1);
+                Node now = preNode.next;
+                preNode.next = newNode;
+                newNode.next = now;
+                size++;
+            }
+        }
+
+    }
+
+    private Node node(int index) {
+        Node x = head;
+        for (int i = 0; i < index; i++) {
+            x = x.next;
+        }
+        return x;
+    }
+
+    public Object get(int index) {
+        checkIndex(index);
+        return node(index).data;
+    }
+
+    /**
+     * 让被删除的引用的持有者指向下一个节点
+     *
+     * @param index
+     * @return
+     */
+    public Object remove(int index) {
+        final Object ret;
+        checkIndex(index);
+        if (index == 0) {
+            Node removeNode = head;
+            ret = head.data;
+            head = removeNode.next;
+        } else {
+            Node pre = node(index - 1);
+            Node removeNode = pre.next;
+            ret = removeNode.data;
+            pre.next = removeNode.next;
+        }
+        size--;
+        return ret;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    public void addFirst(Object o) {
+        head = new Node(o, head);
+        ;
+        size++;
+    }
+
+    public void addLast(Object o) {
+        add(o);
+    }
+
+    public Object removeFirst() {
+        if (size == 0) {
+            return null;
+        } else {
+            return remove(0);
+        }
+    }
+
+    public Object removeLast() {
+        return remove(size - 1);
+    }
+
+    public LinkedListIterator iterator() {
+        return new LinkedListIterator(head);
+    }
+
+    private void checkIndex(int index) {
+        if (index < 0 || index >= size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+    private void checkForAdd(int index) {
+        if (index < 0 || index > size) {
+            throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size));
+        }
+    }
+
+
+    @Override
+    public String toString() {
+        Iterator iterator = iterator();
+        StringBuilder builder = new StringBuilder("[");
+        while ((iterator.hasNext())) {
+            builder.append(iterator.next()).append(',');
+        }
+        if (size() > 0) {
+            builder.deleteCharAt(builder.length() - 1);
+        }
+        return builder
+                .append(']')
+                .toString();
+    }
+
+    /**
+     * 把该链表逆置
+     * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+     */
+    public void reverse() {
+        if (size == 0) {
+            return;
+        }
+        Object[] datas = new Object[size];
+        int i = 0;
+        // 迭代链表的数据生成数组
+        Iterator iterator = iterator();
+        while (iterator.hasNext()) {
+            datas[i++] = iterator.next();
+        }
+        // 遍历数组越生成新的 链表
+        Node newHead = new Node(datas[--i], null);
+        Node next = newHead;
+        for (int j = --i; j >= 0; j--) {
+            next.next = new Node(datas[j], null);
+            next = next.next;
+
+        }
+        this.head = newHead;
+
+    }
+
+    /**
+     * 删除一个单链表的前半部分
+     * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+     * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+     */
+    public void removeFirstHalf() {
+        removeFirstSize(size >> 1);
+    }
+
+    public void removeFirstSize(int firstSize) {
+        firstSize = firstSize > size() ? size() : firstSize;
+        LinkedListIterator iterator = iterator();
+        int i = 1;
+        while (i++ <= firstSize) {
+            iterator.nextNode();
+        }
+        if (size > 0) {
+            head = iterator.nextNode();
+            size = size() - firstSize;
+        }
+    }
+
+
+    /**
+     * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+     *
+     * @param i
+     * @param length
+     */
+    public void remove(int i, int length) {
+        if (i == 0) {
+            removeFirstSize(length);
+            return;
+        }
+        if (i >= size || length == 0) {
+            return;
+        }
+
+        int lastLenth = size - i;
+        length = length <= lastLenth ? length : lastLenth;
+        Node pre = node(i - 1);
+        int j = 0;
+
+        Node next = pre;
+        while (j++ < length) {
+            next = next.next;
+        }
+        pre.next = next.next;
+        size = size - length;
+
+
+    }
+
+    /**
+     * 假定当前链表和listB均包含已升序排列的整数
+     * 从当前链表中取出那些listB所指定的元素
+     * 例如当前链表 = 11->101->201->301->401->501->601->701
+     * listB = 1->3->4->6
+     * 返回的结果应该是[101,301,401,601]
+     *
+     * @param list
+     */
+    public int[] getElements(LinkedList list) {
+        if (size() == 0) {
+            return new int[0];
+        }
+        Iterator iterator = list.iterator();
+        Node fromNode = iterator().nextNode();
+        int fromIndex = 0;
+
+        int[] retArray = new int[list.size()];
+        int retIndex = 0;
+        while (iterator.hasNext()) {
+            int index = (int) iterator.next();
+            Node node = node(fromNode, fromIndex, index);
+            fromIndex = index;
+            fromNode = node;
+            if (node == null) {
+                return retArray;
+            } else {
+                retArray[retIndex++] = (int)node.data;
+            }
+        }
+        return retArray;
+    }
+
+    private Node node(Node fromNode, int fromIndex, int index) {
+        Node next = fromNode;
+        int nextIndex = fromIndex;
+        while (next != null && nextIndex < index) {
+            next = next.next;
+            nextIndex++;
+        }
+        if (nextIndex == index) {
+            return next;
+        } else {
+            return null;
+        }
+    }
+
+
+    /**
+     * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+     * 从当前链表中中删除在listB中出现的元素
+     *
+     * @param list
+     */
+
+    public void subtract(LinkedList list) {
+
+    }
+
+    /**
+     * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+     * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+     */
+    public void removeDuplicateValues() {
+
+    }
+
+    /**
+     * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+     * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+     *
+     * @param min
+     * @param max
+     */
+    public void removeRange(int min, int max) {
+
+    }
+
+    /**
+     * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+     * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+     *
+     * @param list
+     */
+    public LinkedList intersection(LinkedList list) {
+        return null;
+    }
+
+    private static class Node {
+        Object data;
+        Node next;
+
+        public Node() {
+        }
+
+        public Node(Object data, Node next) {
+            this.data = data;
+            this.next = next;
+        }
+    }
+
+    private class LinkedListIterator implements Iterator {
+
+        private Node next;
+
+        public LinkedListIterator() {
+        }
+
+        private LinkedListIterator(Node next) {
+            this.next = next;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return next != null;
+        }
+
+        @Override
+        public Object next() {
+            if (next == null) {
+                throw new IndexOutOfBoundsException("there is no node in list");
+            }
+            Node ret = next;
+            next = next.next;
+            return ret.data;
+        }
+
+
+        private Node nextNode() {
+            if (next == null) {
+                throw new IndexOutOfBoundsException("there is no node in list");
+            }
+            Node ret = next;
+            next = next.next;
+            return ret;
+        }
+    }
+}
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java
new file mode 100644
index 0000000000..eb41a7e262
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java
@@ -0,0 +1,22 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class ArraysTest {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    @Test
+    public void testCopyOf(){
+        Object[] a = new Object[]{1, 2, 3, 4};
+        Object[] b = Arrays.copyOf(a, 10);
+        logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b));
+    }
+}
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java
new file mode 100644
index 0000000000..efc4022378
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java
@@ -0,0 +1,24 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class SystemTest {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+        @Test
+    public void testArrayCopy() {
+        int[] a = new int[]{1, 2, 3, 4, 5, 6, 7};
+        int[] b = new int[]{11, 22, 33, 44, 55, 66, 77};
+        System.arraycopy(a, 2, b, 4, 3);
+        logger.info("b={}", Arrays.toString(b));
+
+    }
+}
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java
new file mode 100644
index 0000000000..9e951354ef
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java
@@ -0,0 +1,202 @@
+package com.coding.basic;
+
+import com.coding.basic.linklist.LinkedList;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 3/23/17.
+ */
+public class LinkedListTest {
+
+    @Test
+    public void add() throws Exception {
+
+    }
+
+    @Test
+    public void add1() throws Exception {
+
+    }
+
+    @Test
+    public void get() throws Exception {
+
+    }
+
+    @Test
+    public void remove() throws Exception {
+
+    }
+
+    @Test
+    public void size() throws Exception {
+
+    }
+
+    @Test
+    public void addFirst() throws Exception {
+
+    }
+
+    @Test
+    public void addLast() throws Exception {
+
+    }
+
+    @Test
+    public void removeFirst() throws Exception {
+
+    }
+
+    @Test
+    public void removeLast() throws Exception {
+
+    }
+
+    @Test
+    public void removeFirstHalf() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(0);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[]", linkedList.toString());
+    }
+
+    @Test
+    public void removeFirstHalf1() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(1);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[1]", linkedList.toString());
+    }
+
+    @Test
+    public void removeFirstHalf2() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(2);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[2]", linkedList.toString());
+    }
+
+    @Test
+    public void removeFirstHalf3() throws Exception {
+        LinkedList linkedList = createAndFillLinkedList(3);
+        linkedList.removeFirstHalf();
+        Assert.assertEquals("[2,3]", linkedList.toString());
+    }
+
+    private LinkedList createAndFillLinkedList() {
+        return createAndFillLinkedList(4);
+    }
+
+    private LinkedList createAndFillLinkedList(int length) {
+        return createAndFillLinkedList(1, length);
+    }
+
+    private LinkedList createAndFillLinkedList(int start, int length) {
+        LinkedList linkedList = new LinkedList();
+        for (int i = start; i <= length; i++) {
+            linkedList.add(i);
+        }
+        return linkedList;
+    }
+
+    @Test
+    public void remove1() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(0, 0);
+        Assert.assertEquals("[1,2,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove2() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(0, 1);
+        Assert.assertEquals("[2,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove3() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 0);
+        Assert.assertEquals("[1,2,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove4() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 1);
+        Assert.assertEquals("[1,3,4]", list.toString());
+    }
+
+    @Test
+    public void remove5() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 3);
+        Assert.assertEquals("[1]", list.toString());
+    }
+
+    @Test
+    public void remove6() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 4);
+        Assert.assertEquals("[1]", list.toString());
+    }
+
+    @Test
+    public void remove7() throws Exception {
+        LinkedList list = createAndFillLinkedList(4);
+        list.remove(1, 5);
+        Assert.assertEquals("[1]", list.toString());
+    }
+
+    @Test
+    public void getElements() throws Exception {
+//        LinkedList listA = createAndFillLinkedList(0, 8);
+//        LinkedList listB = createAndFillLinkedList(4, 4);
+//        Assert.assertEquals("[4,5,6,7]", Arrays.toString(listA.getElements(listB)));
+
+    }
+
+    @Test
+    public void subtract() throws Exception {
+
+    }
+
+    @Test
+    public void removeDuplicateValues() throws Exception {
+
+    }
+
+    @Test
+    public void removeRange() throws Exception {
+
+    }
+
+    @Test
+    public void intersection() throws Exception {
+
+    }
+
+    @Test
+    public void iterator() throws Exception {
+
+        List linkedList = new LinkedList();
+        linkedList.add("1");
+        linkedList.add("2");
+        linkedList.add("3");
+        linkedList.add("4");
+        Assert.assertEquals("[1,2,3,4]", linkedList.toString());
+    }
+
+    @Test
+    public void reverse() throws Exception {
+        LinkedList linkedList = new LinkedList();
+        linkedList.add("1");
+        linkedList.add("2");
+        linkedList.add("3");
+        linkedList.add("4");
+        linkedList.reverse();
+        Assert.assertEquals("[4,3,2,1]", linkedList.toString());
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java
new file mode 100644
index 0000000000..e70c52a725
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayListTest.java
@@ -0,0 +1,37 @@
+package com.coding.basic.array;
+
+import com.coding.basic.List;
+import com.coding.basic.array.ArrayList;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class ArrayListTest {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    private List list = new ArrayList();
+
+    @Before
+    public void before() {
+
+    }
+
+    @Test
+    public void add() throws Exception {
+        list.add(1);
+    }
+
+    @Test
+    public void get() throws Exception {
+        add();
+        logger.info("{}", list.get(0));
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..04c8b51547
--- /dev/null
+++ b/students/1204187480/code/homework/coding/src/test/java/com/coding/basic/array/ArrayUtilTest.java
@@ -0,0 +1,76 @@
+package com.coding.basic.array;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class ArrayUtilTest {
+
+    private ArrayUtil creatArrayUtil(){
+        return new ArrayUtil();
+    }
+
+    @Test
+    public void reverseArray() throws Exception {
+        int[] origin = new int[]{1, 2, 3};
+        int[] destArray = new int[]{3, 2, 1};
+        creatArrayUtil().reverseArray(origin);
+        Assert.assertArrayEquals(destArray, origin);
+    }
+
+    @Test
+    public void removeZero() throws Exception {
+        int[] origin = new int[]{1, 2, 3, 0, 10};
+        int[] destArray = new int[]{1, 2, 3, 10};
+        int[] retArray = creatArrayUtil().removeZero(origin);
+        Assert.assertArrayEquals(destArray, retArray);
+    }
+
+    @Test
+    public void merge() throws Exception {
+        int[] a = new int[]{1, 2, 3};
+        int[] b = new int[]{2, 3};
+
+        int[] newArray = creatArrayUtil().merge(a, b);
+        info(newArray);
+        assertArrayEquals(new int[]{1, 2, 3}, newArray);
+    }
+
+    @Test
+    public void grow() throws Exception {
+        assertArrayEquals(new int[]{1, 2, 0, 0}, creatArrayUtil().grow(new int[]{1, 2}, 2));
+    }
+
+    @Test
+    public void fibonacci() throws Exception {
+        assertArrayEquals(new int[]{1, 1, 2, 3, 5, 8}, creatArrayUtil().fibonacci(10));
+    }
+
+    @Test
+    public void getPrimes() throws Exception {
+        int max = Double.valueOf(Math.pow(2, 4)).intValue();
+        assertArrayEquals(new int[]{2, 3, 5, 7, 11, 13}, creatArrayUtil().getPrimes(max));
+    }
+
+    @Test
+    public void getPerfectNumbers() throws Exception {
+        int max = Double.valueOf(Math.pow(2, 8)).intValue();
+        assertArrayEquals(new int[]{6, 28}, creatArrayUtil().getPerfectNumbers(max));
+
+    }
+
+    @Test
+    public void join() throws Exception {
+        assertEquals("1_2_3_10", creatArrayUtil().join(new int[]{1, 2, 3, 10}, "_"));
+    }
+
+    private void info(int[] array) {
+        System.out.println(Arrays.toString(array));
+    }
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/pom.xml b/students/1204187480/code/homework/common/pom.xml
new file mode 100644
index 0000000000..3cbad444b6
--- /dev/null
+++ b/students/1204187480/code/homework/common/pom.xml
@@ -0,0 +1,13 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>common</artifactId>
+    <packaging>jar</packaging>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent-dependencies</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent-dependencies/pom.xml</relativePath>
+    </parent>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java
new file mode 100755
index 0000000000..67dd8fd1f1
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/BeanUtils.java
@@ -0,0 +1,144 @@
+package com.coding.common.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by luoziyihao on 5/25/16.
+ */
+public class BeanUtils {
+
+
+    public static final String SET = "set";
+    public static final String GET = "get";
+    // 日志输出类
+    private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private final StringUtils2 stringUtils = new StringUtils2();
+
+    public Object setInvoke(Object para, String methodName, Object obj) {
+        Method method = null;
+        Object returnObj = null;
+        try {
+
+            method = obj.getClass().getMethod(methodName, para.getClass());
+            returnObj = method.invoke(obj, para);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+    public Object getInvoke(String methodName, Object obj) {
+        Method method = null;
+        Object returnObj = null;
+        try {
+            method = obj.getClass().getMethod(methodName);
+            returnObj = method.invoke(obj);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+    public Object invokeWithNoParamter(String methodName, Object obj) {
+        Method method;
+        Object returnObj = null;
+        try {
+            method = obj.getClass().getMethod(methodName);
+            returnObj = method.invoke(obj);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return returnObj;
+    }
+
+
+
+    public Object getPara(String paraName, Object object) {
+        if (stringUtils.isSpaceOrNull(paraName)) {
+            throw new RuntimeException("paraname is null or space");
+        }
+        String methodName = new StringBuilder().append(GET).append(stringUtils.toUpperCase(paraName, 0)).toString();
+        return getInvoke(methodName, object);
+    }
+
+
+
+    public Object setPara(Object para, String paraName, Object object) {
+        if (stringUtils.isSpaceOrNull(paraName)) {
+            throw new RuntimeException("paraname is null or space");
+        }
+        String methodName = new StringBuilder().append(SET).append(stringUtils.toUpperCase(paraName, 0)).toString();
+        return setInvoke(para, methodName, object);
+    }
+
+    public <T> T get(String paraName, Object object, Class<T> clazz) {
+        return (T) getPara(paraName, object);
+    }
+
+    public Integer getInt(String paraName, Object object) {
+        return (Integer) getPara(paraName, object);
+    }
+
+    public Long getLong(String paraName, Object object) {
+        return (Long) getPara(paraName, object);
+    }
+
+    public Double getDouble(String paraName, Object object) {
+        return (Double) getPara(paraName, object);
+    }
+
+    public BigDecimal getBigDecimal(String paraName, Object object) {
+        return (BigDecimal) getPara(paraName, object);
+    }
+
+    public String getString(String paraName, Object object) {
+        return getPara(paraName, object).toString();
+    }
+
+    public Date getDate(String paraName, Object object) {
+        return (Date) getPara(paraName, object);
+    }
+
+    public Long getLongByString(String paraName, Object object) {
+        return Long.parseLong(getString(paraName, object));
+    }
+
+    public Integer getIntByString(String paraName, Object object) {
+        return Integer.parseInt(getString(paraName, object));
+    }
+
+    public Double getDoubleByString(String paraName, Object object) {
+        return Double.parseDouble(getString(paraName, object));
+    }
+
+    public BigDecimal getBigDecimalByString(String paraName, Object object) {
+        return new BigDecimal(getString(paraName, object));
+    }
+
+    private final static String GETTER_PRE = "get";
+    public Map<String, Object> describe(Object model) {
+        Method[] methods = model.getClass().getDeclaredMethods(); //获取实体类的所有属性，返回Field数组
+        Map<String, Object> properties = new HashMap<>();
+        for (Method method : methods) {
+            String methodName = method.getName();
+            if (methodName.startsWith(GETTER_PRE)) {
+                try {
+                    Object o = method.invoke(model);
+                    String valueName = stringUtils.toLowwerCase(methodName.substring(GETTER_PRE.length()), 0);
+                    properties.put(valueName, o);
+                } catch (IllegalAccessException | InvocationTargetException e) {
+                   throw new IllegalStateException(e);
+                }
+            }
+        }
+        return properties;
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java
new file mode 100644
index 0000000000..4126765ff1
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/ByteUtils.java
@@ -0,0 +1,21 @@
+package com.coding.common.util;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+public abstract class ByteUtils {
+
+    public static String byteToHexString(byte[] codes ){
+        StringBuffer buffer = new StringBuffer();
+        for(int i=0;i<codes.length;i++){
+            byte b = codes[i];
+            int value = b & 0xFF;
+            String strHex = Integer.toHexString(value);
+            if(strHex.length()< 2){
+                strHex = "0" + strHex;
+            }
+            buffer.append(strHex);
+        }
+        return buffer.toString();
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
new file mode 100644
index 0000000000..1d4aef10f5
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
@@ -0,0 +1,69 @@
+package com.coding.common.util;
+
+import com.google.common.base.Preconditions;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 4/28/17.
+ */
+public abstract class FileUtils2 {
+
+    public static List<File> listAllFiles(File directory) {
+        Preconditions.checkNotNull(directory);
+        Preconditions.checkArgument(directory.isDirectory()
+                , "file=%s is not directory", directory.getPath());
+        return listAllFiles(new ArrayList<>(), directory);
+    }
+
+    private static List<File> listAllFiles(List<File> files, File directory) {
+        File[] fileArr = directory.listFiles();
+        if (fileArr == null) {
+            return files;
+        }
+        for (File file : fileArr) {
+            if (file.isDirectory()) {
+                files = listAllFiles(files, file);
+            } else {
+                files.add(file);
+            }
+        }
+        return files;
+    }
+
+
+    public static String getCanonicalPath(File file) {
+        Preconditions.checkNotNull(file);
+        try {
+            return file.getCanonicalPath();
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+
+    public static byte[] getBytes(File classFile) throws IllegalStateException {
+        // byteArrayOutputStream, 可写的动长数组
+        ByteArrayOutputStream baos = null;
+        BufferedInputStream bis = null;
+        try {
+            baos = new ByteArrayOutputStream();
+            bis = new BufferedInputStream(new FileInputStream(classFile));
+            int intTmp = bis.read();
+            while (intTmp != -1) {
+                baos.write(intTmp);
+                intTmp = bis.read();
+            }
+            return baos.toByteArray();
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        } finally {
+            IOUtils2.close(baos);
+            IOUtils2.close(bis);
+        }
+    }
+
+
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
new file mode 100644
index 0000000000..a302a6c199
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
@@ -0,0 +1,24 @@
+package com.coding.common.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+public abstract class IOUtils2 {
+
+    public static void close(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                throw new IllegalStateException(e);
+
+            }
+        }
+    }
+
+
+}
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java
new file mode 100644
index 0000000000..0883351690
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/StringUtils2.java
@@ -0,0 +1,34 @@
+package com.coding.common.util;
+
+/**
+ * Created by luoziyihao on 3/5/17.
+ */
+public class StringUtils2 {
+
+    /**
+     * 改变指定位置的 char的大小写
+     */
+    public String toUpperCase(String str, int index) {
+        char[] chars = str.toCharArray();
+        if (index + 1 > chars.length) {
+            throw new RuntimeException("the char at the index don't exist");
+        }
+        chars[index] = Character.toUpperCase(chars[index]);
+        return new String(chars);
+    }
+
+    /**
+     * 改变指定位置的 char的大小写
+     */
+    public String toLowwerCase(String str, int index) {
+        char[] chars = str.toCharArray();
+        if (index + 1 > chars.length ) {throw new RuntimeException("the char at the index don't exist");}
+        chars[index] = Character.toLowerCase(chars[index]);
+        return new String(chars);
+    }
+
+    public boolean isSpaceOrNull(String paraName) {
+        return (paraName == null || paraName.trim().isEmpty());
+    }
+
+}
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java b/students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java
new file mode 100644
index 0000000000..eb41a7e262
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/api/ArraysTest.java
@@ -0,0 +1,22 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class ArraysTest {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    @Test
+    public void testCopyOf(){
+        Object[] a = new Object[]{1, 2, 3, 4};
+        Object[] b = Arrays.copyOf(a, 10);
+        logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b));
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java b/students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java
new file mode 100644
index 0000000000..efc4022378
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/api/SystemTest.java
@@ -0,0 +1,24 @@
+package com.coding.api;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+
+/**
+ * Created by luoziyihao on 2/25/17.
+ */
+public class SystemTest {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+        @Test
+    public void testArrayCopy() {
+        int[] a = new int[]{1, 2, 3, 4, 5, 6, 7};
+        int[] b = new int[]{11, 22, 33, 44, 55, 66, 77};
+        System.arraycopy(a, 2, b, 4, 3);
+        logger.info("b={}", Arrays.toString(b));
+
+    }
+}
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java
new file mode 100644
index 0000000000..62dd4907cc
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/ByteUtilsTest.java
@@ -0,0 +1,20 @@
+package com.coding.common.util;
+
+import org.junit.Test;
+
+/**
+ * Created by luoziyihao on 5/2/17.
+ */
+public class ByteUtilsTest {
+
+    @Test
+    public void testByteToHexString(){
+        byte[] bytes = new byte[]{
+                1,
+                (byte) 255
+        };
+        System.out.println(ByteUtils.byteToHexString(bytes));
+        System.out.println(Integer.toHexString(255));
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java
new file mode 100644
index 0000000000..cb58cf99c5
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/FileUtils2Test.java
@@ -0,0 +1,35 @@
+package com.coding.common.util;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 4/28/17.
+ */
+public class FileUtils2Test {
+    @Test
+    public void getCanonicalPath() throws Exception {
+        System.out.println(FileUtils2.getCanonicalPath(new File("")));
+    }
+
+    @Test
+    public void getBytes() throws Exception {
+        byte[] bytes = FileUtils2.getBytes(new File("pom.xml"));
+        System.out.println(new String(bytes));
+        System.out.println(ByteUtils.byteToHexString(bytes));
+
+    }
+
+
+    @Test
+    public void listAllFiles() throws Exception {
+        String currentPath = new File("").getCanonicalPath();
+        List<File> files = FileUtils2.listAllFiles(new File(currentPath ));
+        for (File file : files) {
+            System.out.println(file.getCanonicalPath());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/parent-dependencies/pom.xml b/students/1204187480/code/homework/parent-dependencies/pom.xml
new file mode 100644
index 0000000000..b961e90c59
--- /dev/null
+++ b/students/1204187480/code/homework/parent-dependencies/pom.xml
@@ -0,0 +1,169 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coding</groupId>
+    <artifactId>parent-dependencies</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0-SNAPSHOT</version>
+    <url>https://github.com/luoziyihao/coding2017</url>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>alimaven</id>
+            <name>aliyun maven</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+    <repositories>
+        <repository>
+            <id>alimaven</id>
+            <name>aliyun maven</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>spring-snapshots</id>
+            <name>Spring Snapshots</name>
+            <url>https://repo.spring.io/libs-snapshot</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version>
+        <logback.version>1.1.7</logback.version>
+        <logback-classic.version>1.1.7</logback-classic.version>
+        <commons-logging.version>1.2</commons-logging.version>
+        <log4j.version>1.2.17</log4j.version>
+        <junit.version>4.12</junit.version>
+        <commons-lang3.version>3.4</commons-lang3.version>
+        <commons-collections4.version>4.1</commons-collections4.version>
+        <commons-io.version>2.5</commons-io.version>
+        <commons-beanutils.version>1.9.2</commons-beanutils.version>
+        <guava.version>19.0</guava.version>
+        <rxjava.version>1.1.6</rxjava.version>
+        <lombok.version>1.16.10</lombok.version>
+        <fastjson.version>1.2.22</fastjson.version>
+        <strman.version>0.2.0</strman.version>
+        <joda-time.version>2.9.4</joda-time.version>
+
+    </properties>
+
+    <dependencies>
+        <!-- 日志 -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback-classic.version}</version>
+        </dependency>
+        <!-- 配置所有依赖库的日志依赖 start-->
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>${commons-logging.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>${log4j.version}</version>
+        </dependency>
+        <!-- 配置所有依赖库的日志依赖 end-->
+        <!--  utils 相关jar包 start -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>${commons-collections4.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>${commons-beanutils.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>${guava.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>${joda-time.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.reactivex</groupId>
+            <artifactId>rxjava</artifactId>
+            <version>${rxjava.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.shekhargulati</groupId>
+            <artifactId>strman</artifactId>
+            <version>${strman.version}</version>
+        </dependency>
+        <!--  utils 相关jar包 end -->
+
+        <!-- 测试 -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <!-- 编译插件 制定编译级别 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+                <configuration>
+                    <source>${maven.compiler.source}</source>
+                    <target>${maven.compiler.target}</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/parent/pom.xml b/students/1204187480/code/homework/parent/pom.xml
new file mode 100644
index 0000000000..e6a94a2e4f
--- /dev/null
+++ b/students/1204187480/code/homework/parent/pom.xml
@@ -0,0 +1,23 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>parent</artifactId>
+    <packaging>pom</packaging>
+    <description>manage the dependencies for modules</description>
+    <parent>
+        <groupId>com.coding</groupId>
+        <artifactId>parent-dependencies</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../parent-dependencies/pom.xml</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.coding</groupId>
+            <artifactId>common</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/students/1204187480/code/homework/pom.xml b/students/1204187480/code/homework/pom.xml
new file mode 100644
index 0000000000..28ac74f159
--- /dev/null
+++ b/students/1204187480/code/homework/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.coding</groupId>
+    <artifactId>coding2017</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <modules>
+        <module>parent-dependencies</module>
+        <module>common</module>
+        <module>parent</module>
+        <module>coding</module>
+        <module>coderising</module>
+    </modules>
+
+
+</project>
diff --git "a/students/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272" "b/students/1204187480/note/homework/cpu, \345\206\205\345\255\230, \347\243\201\347\233\230, \346\214\207\344\273\244-\346\274\253\350\260\210\350\256\241\347\256\227\346\234\272"
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/1204187480/note/todo/homework.md b/students/1204187480/note/todo/homework.md
new file mode 100644
index 0000000000..5f111a9ea6
--- /dev/null
+++ b/students/1204187480/note/todo/homework.md
@@ -0,0 +1,8 @@
+# 0326 操作系统中的lru算法
+
+ClassFileLoader
+
+LRUPageFrame
+
+深入理解java虚拟机 第6章
+

From f0447b8a16bbe95a71ffc12e1970ef8c8d1a20c1 Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Mon, 12 Jun 2017 21:53:50 +0800
Subject: [PATCH 015/332] add ood src:

---
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../src/main/resources/product_promotion.txt  |   4 +
 6 files changed, 278 insertions(+)
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/resources/product_promotion.txt

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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<String,String> 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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/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/1204187480/code/homework/coderising/src/main/resources/product_promotion.txt b/students/1204187480/code/homework/coderising/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo R15
+P4955 Vivo X20
\ No newline at end of file

From e80ed54717dc7af1d2728d77150bfb29f11f1773 Mon Sep 17 00:00:00 2001
From: leozhaopeng <14zhaopeng@gmail.com>
Date: Mon, 12 Jun 2017 21:57:55 +0800
Subject: [PATCH 016/332] =?UTF-8?q?git=E6=8F=90=E4=BA=A4=E6=B5=8B=E8=AF=95?=
 =?UTF-8?q?=EF=BC=8C=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/309229350/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/309229350/readme.md

diff --git a/students/309229350/readme.md b/students/309229350/readme.md
new file mode 100644
index 0000000000..48b857086e
--- /dev/null
+++ b/students/309229350/readme.md
@@ -0,0 +1 @@
+#测试git，第一次提交

From 4280fc089c9452b1a52ec7a02303d0c039c2ff75 Mon Sep 17 00:00:00 2001
From: EightWolf <675554906@qq.com>
Date: Mon, 12 Jun 2017 22:00:19 +0800
Subject: [PATCH 017/332] this is a test

---
 students/675554906/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/675554906/readme.md

diff --git a/students/675554906/readme.md b/students/675554906/readme.md
new file mode 100644
index 0000000000..a51b977d60
--- /dev/null
+++ b/students/675554906/readme.md
@@ -0,0 +1 @@
+第一次提交    仅为学习
\ No newline at end of file

From 060700d899c23d957d4b6d3394fd6e9c772bfad8 Mon Sep 17 00:00:00 2001
From: gongxun <gongxun@wesai.com>
Date: Mon, 12 Jun 2017 22:06:25 +0800
Subject: [PATCH 018/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore                                    |  3 +
 .../785396327/first/ood/srp/BeanUtils.java    | 12 ++++
 students/785396327/first/ood/srp/DBUtil.java  | 11 +++-
 students/785396327/first/ood/srp/Email.java   | 13 -----
 .../785396327/first/ood/srp/EmailParser.java  | 55 +++++++++++--------
 .../first/ood/srp/PromotionMail.java          |  8 +--
 .../785396327/first/ood/srp/SendMailTest.java |  9 +++
 7 files changed, 66 insertions(+), 45 deletions(-)
 create mode 100644 students/785396327/first/ood/srp/BeanUtils.java

diff --git a/.gitignore b/.gitignore
index f1e9957cfa..4b65de1971 100644
--- a/.gitignore
+++ b/.gitignore
@@ -280,6 +280,9 @@ target
 liuxin/.DS_Store
 liuxin/src/.DS_Store
 
+students/*
+!students/785396327
+
 
 
 
diff --git a/students/785396327/first/ood/srp/BeanUtils.java b/students/785396327/first/ood/srp/BeanUtils.java
new file mode 100644
index 0000000000..617c96666e
--- /dev/null
+++ b/students/785396327/first/ood/srp/BeanUtils.java
@@ -0,0 +1,12 @@
+package first.ood.srp;
+
+/**
+ * Created by IBM on 2017/6/12.
+ */
+public class BeanUtils {
+
+    public static void copyProperties(Object dst, Object src) {
+        //拷贝方法暂不实现
+    }
+
+}
diff --git a/students/785396327/first/ood/srp/DBUtil.java b/students/785396327/first/ood/srp/DBUtil.java
index 463b464df4..473b8b1ca4 100644
--- a/students/785396327/first/ood/srp/DBUtil.java
+++ b/students/785396327/first/ood/srp/DBUtil.java
@@ -13,8 +13,8 @@ public class DBUtil {
      * @param sql
      * @return
      */
-    public static List<HashMap<String, String>> query(String sql) {
-//        validateSQL(sql, params);
+    public static List<HashMap<String, String>> query(String sql, Object[] params) {
+        formateSQL(sql, params);
 
         List userList = new ArrayList();
         for (int i = 1; i <= 3; i++) {
@@ -27,12 +27,17 @@ public static List<HashMap<String, String>> query(String sql) {
         return userList;
     }
 
-    private static void validateSQL(String sql, Object[] params) {
+    private static String formateSQL(String sql, Object[] params) {
         if (StringUtils.isEmpty(sql))
             throw new RuntimeException("empty sql");
         String[] sqlFaction = sql.split("\\?");
         if (sqlFaction.length - 1 != params.length)
             throw new RuntimeException("wrong number of parameters");
+        for (int i = 0; i < params.length; i++) {
+            sql = sql.replaceFirst("\\?", "'" + params[i].toString() + "'");
+        }
 
+        return sql;
     }
+
 }
diff --git a/students/785396327/first/ood/srp/Email.java b/students/785396327/first/ood/srp/Email.java
index 417e9aba6d..11a2c408ae 100644
--- a/students/785396327/first/ood/srp/Email.java
+++ b/students/785396327/first/ood/srp/Email.java
@@ -11,19 +11,6 @@ public class Email {
     protected String subject;
     protected String message;
 
-    public Email() {
-
-    }
-
-    public Email(String smtpHost, String altSmtpHost, String fromAddress, String toAddress, String subject, String message) {
-        this.smtpHost = smtpHost;
-        this.altSmtpHost = altSmtpHost;
-        this.fromAddress = fromAddress;
-        this.toAddress = toAddress;
-        this.subject = subject;
-        this.message = message;
-    }
-
     protected void setSMTPHost(String smtpHost) {
         this.smtpHost = smtpHost;
     }
diff --git a/students/785396327/first/ood/srp/EmailParser.java b/students/785396327/first/ood/srp/EmailParser.java
index 1129beaf34..4c14b8a66f 100644
--- a/students/785396327/first/ood/srp/EmailParser.java
+++ b/students/785396327/first/ood/srp/EmailParser.java
@@ -9,18 +9,10 @@
  */
 public class EmailParser {
 
-    public List<PromotionMail> parseEmailList(String filepath, String loadQuery) {
-        List<PromotionMail> mailList = new ArrayList<PromotionMail>();
-        Email email = parseCommonInfo(filepath);
-        List<HashMap<String, String>> individualInfo = getIndividualInfo(loadQuery);
-        for (HashMap<String, String> map : individualInfo) {
-            PromotionMail promotionMail = new PromotionMail(email);
-            promotionMail.setToAddress(parseToAddress(map));
-            promotionMail.setMessage(parseMessage(map, promotionMail));
-            promotionMail.setSubject("您关注的产品降价了");
-            mailList.add(promotionMail);
-        }
-        return mailList;
+    public List<PromotionMail> parseEmailList(String filepath, String loadQuery, Object[] params) {
+        PromotionMail email = packageInfoFromConfig();
+        packageInfoFromFile(email, filepath);
+        return packageInfoFromDB(loadQuery, email, params);
     }
 
     private String parseMessage(HashMap<String, String> map, PromotionMail promotionMail) {
@@ -33,22 +25,39 @@ private String parseToAddress(HashMap<String, String> map) {
         return map.get(ConfigurationKeys.EMAIL_KEY);
     }
 
-    private PromotionMail parseCommonInfo(String filepath) {
-        Email email = new Email();
 
+    private List<PromotionMail> packageInfoFromDB(String loadQuery, PromotionMail email, Object[] params) {
+        List<HashMap<String, String>> individualInfo = getIndividualInfo(loadQuery, params);
+        List<PromotionMail> mailList = new ArrayList<PromotionMail>();
+        for (HashMap<String, String> map : individualInfo) {
+            PromotionMail completeMail = new PromotionMail();
+            BeanUtils.copyProperties(completeMail, email);
+            completeMail.setToAddress(parseToAddress(map));
+            completeMail.setMessage(parseMessage(map, completeMail));
+            completeMail.setSubject("您关注的产品降价了");
+            mailList.add(completeMail);
+        }
+        return mailList;
+    }
+
+    private PromotionMail packageInfoFromFile(PromotionMail email, String filepath) {
         FileParser fileParser = new FileParser(filepath);
-//        email.setProductID(fileParser.parseProductID());
-//        email.setProductDesc(fileParser.parseProductDesc());
+        email.setProductDesc(fileParser.parseProductDesc());
+        email.setProductID(fileParser.parseProductID());
+        return email;
+    }
+
+    private PromotionMail packageInfoFromConfig() {
+        PromotionMail email = new PromotionMail();
 
         Configuration configuration = new Configuration();
-//        promotionMail.setSMTPHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
-//        promotionMail.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
-//        promotionMail.setAltSMTPHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
-//        return promotionMail;
-        return null;
+        email.setSMTPHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+        email.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        email.setAltSMTPHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+        return email;
     }
 
-    private List<HashMap<String, String>> getIndividualInfo(String loadQuery) {
-        return DBUtil.query(loadQuery);
+    private List<HashMap<String, String>> getIndividualInfo(String loadQuery, Object[] params) {
+        return DBUtil.query(loadQuery, params);
     }
 }
diff --git a/students/785396327/first/ood/srp/PromotionMail.java b/students/785396327/first/ood/srp/PromotionMail.java
index 1a604b7fe3..48096fa54a 100644
--- a/students/785396327/first/ood/srp/PromotionMail.java
+++ b/students/785396327/first/ood/srp/PromotionMail.java
@@ -1,12 +1,8 @@
 package first.ood.srp;
 
 public class PromotionMail extends Email {
-    private String productID = null;
-    private String productDesc = null;
-
-    public PromotionMail(Email email) {
-        super(email.smtpHost, email.altSmtpHost, email.fromAddress, email.toAddress, email.subject, email.message);
-    }
+    private String productID;
+    private String productDesc;
 
     public void setProductID(String productID) {
         this.productID = productID;
diff --git a/students/785396327/first/ood/srp/SendMailTest.java b/students/785396327/first/ood/srp/SendMailTest.java
index 69681f6c6d..d82df14609 100644
--- a/students/785396327/first/ood/srp/SendMailTest.java
+++ b/students/785396327/first/ood/srp/SendMailTest.java
@@ -1,5 +1,7 @@
 package first.ood.srp;
 
+import java.util.List;
+
 /**
  * Created by gongxun on 2017/6/12.
  */
@@ -7,5 +9,12 @@ public class SendMailTest {
 
     public static void main(String[] args) {
         String loadQuery = "Select name from subscriptions where product_id= ? and send_mail=1";
+        String filepath = "D:\\workspace\\IDEA\\homework\\coding2017_section2\\coding2017\\students\\785396327\\first\\ood\\srp\\product_promotion.txt";
+        boolean isDebug = false;
+
+        EmailParser emailParser = new EmailParser();
+        List<PromotionMail> promotionMails = emailParser.parseEmailList(filepath, loadQuery);
+        MailSender mailSender = new MailSender();
+        mailSender.sendMailList(promotionMails, isDebug);
     }
 }

From c46230c4f1587df2c2bc4b1939f3e3328d12ae4d Mon Sep 17 00:00:00 2001
From: gongxun <gongxun@wesai.com>
Date: Mon, 12 Jun 2017 22:11:58 +0800
Subject: [PATCH 019/332] update

---
 students/785396327/first/ood/srp/EmailParser.java | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/students/785396327/first/ood/srp/EmailParser.java b/students/785396327/first/ood/srp/EmailParser.java
index 4c14b8a66f..06782d2c09 100644
--- a/students/785396327/first/ood/srp/EmailParser.java
+++ b/students/785396327/first/ood/srp/EmailParser.java
@@ -9,10 +9,10 @@
  */
 public class EmailParser {
 
-    public List<PromotionMail> parseEmailList(String filepath, String loadQuery, Object[] params) {
+    public List<PromotionMail> parseEmailList(String filepath, String loadQuery) {
         PromotionMail email = packageInfoFromConfig();
         packageInfoFromFile(email, filepath);
-        return packageInfoFromDB(loadQuery, email, params);
+        return packageInfoFromDB(loadQuery, email);
     }
 
     private String parseMessage(HashMap<String, String> map, PromotionMail promotionMail) {
@@ -26,8 +26,8 @@ private String parseToAddress(HashMap<String, String> map) {
     }
 
 
-    private List<PromotionMail> packageInfoFromDB(String loadQuery, PromotionMail email, Object[] params) {
-        List<HashMap<String, String>> individualInfo = getIndividualInfo(loadQuery, params);
+    private List<PromotionMail> packageInfoFromDB(String loadQuery, PromotionMail email) {
+        List<HashMap<String, String>> individualInfo = getIndividualInfo(loadQuery, new Object[]{email.getproductID()});
         List<PromotionMail> mailList = new ArrayList<PromotionMail>();
         for (HashMap<String, String> map : individualInfo) {
             PromotionMail completeMail = new PromotionMail();

From 793257d2362df0ac5eb765533560737066e16589 Mon Sep 17 00:00:00 2001
From: cheungchan <1377699408@qq.com>
Date: Mon, 12 Jun 2017 22:27:47 +0800
Subject: [PATCH 020/332] =?UTF-8?q?=E5=A2=9E=E5=8A=A0readmee?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1377699408/README.md | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 students/1377699408/README.md

diff --git a/students/1377699408/README.md b/students/1377699408/README.md
new file mode 100644
index 0000000000..bf3d9bbc98
--- /dev/null
+++ b/students/1377699408/README.md
@@ -0,0 +1,2 @@
+## 1377699408的文件夹
+测试

From 219d3c7e9e92d7cba1a50d23bf2c510e8065a63d Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Mon, 12 Jun 2017 22:31:26 +0800
Subject: [PATCH 021/332] design fro promotionMail

---
 .../ood/srp/optimize/EmailSendClaim.java      | 17 +++++++++++++++++
 .../srp/optimize/EmailSendableBehavior.java   | 12 ++++++++++++
 .../coderising/ood/srp/optimize/Product.java  |  9 +++++++++
 .../ood/srp/optimize/ProductParser.java       | 19 +++++++++++++++++++
 .../ood/srp/optimize/PromotionMail.java       | 11 +++++++++++
 .../ood/srp/optimize/SmptPropeties.java       | 10 ++++++++++
 .../com/coderising/ood/srp/optimize/User.java |  9 +++++++++
 .../ood/srp/optimize/UserService.java         | 13 +++++++++++++
 8 files changed, 100 insertions(+)
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
 create mode 100644 students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java
new file mode 100644
index 0000000000..e61704ec60
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class EmailSendClaim {
+    private String toAddress;
+    private String fromAddress;
+    private String subject;
+    private String message;
+    private String smtpHost;
+    private String debug;
+
+    public void setMessage(Product product, User user) {
+        this.message = null;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java
new file mode 100644
index 0000000000..aede0fdc66
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class EmailSendableBehavior {
+    void send(List<EmailSendClaim> emailSendClaimList) {
+
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
new file mode 100644
index 0000000000..652897a7f3
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class Product {
+    private static String productID;
+    private static String productDesc;
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
new file mode 100644
index 0000000000..7860dd6047
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class ProductParser {
+
+    private String productFilePath;
+
+    public void setProductFilePath(String productFilePath) {
+        this.productFilePath = productFilePath;
+    }
+
+    public List<Product> parse(){
+        return null;
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java
new file mode 100644
index 0000000000..4288925d1e
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class PromotionMail {
+
+    public static void main(String args[]){
+
+    }
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
new file mode 100644
index 0000000000..fd6d7be8d7
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class SmptPropeties {
+    private String smtpHost;
+    private String altSmtpHost;
+    private String fromAddress;
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
new file mode 100644
index 0000000000..45f7739a7b
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.optimize;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class User {
+    private String name;
+    private String email;
+}
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
new file mode 100644
index 0000000000..5178489e0f
--- /dev/null
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.optimize;
+
+import java.util.List;
+
+/**
+ * Created by luoziyihao on 6/12/17.
+ */
+public class UserService {
+
+    List<User> loadMailingList(){
+        return null;
+    }
+}

From bde7e7b6f698ad4c594b4e2c703d2b1ba0bd1869 Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Mon, 12 Jun 2017 22:34:50 +0800
Subject: [PATCH 022/332] design fro promotionMail2

---
 .../optimize/{PromotionMail.java => PromotionMailApp.java}   | 2 +-
 .../{EmailSendClaim.java => PromotionMailClaim.java}         | 2 +-
 ...lSendableBehavior.java => PromotionMailableBehavior.java} | 5 +++--
 3 files changed, 5 insertions(+), 4 deletions(-)
 rename students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/{PromotionMail.java => PromotionMailApp.java} (81%)
 rename students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/{EmailSendClaim.java => PromotionMailClaim.java} (91%)
 rename students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/{EmailSendableBehavior.java => PromotionMailableBehavior.java} (53%)

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
similarity index 81%
rename from students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java
rename to students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
index 4288925d1e..ef89a79d77 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMail.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
@@ -3,7 +3,7 @@
 /**
  * Created by luoziyihao on 6/12/17.
  */
-public class PromotionMail {
+public class PromotionMailApp {
 
     public static void main(String args[]){
 
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
similarity index 91%
rename from students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java
rename to students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
index e61704ec60..06d447b817 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendClaim.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
@@ -3,7 +3,7 @@
 /**
  * Created by luoziyihao on 6/12/17.
  */
-public class EmailSendClaim {
+public class PromotionMailClaim {
     private String toAddress;
     private String fromAddress;
     private String subject;
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
similarity index 53%
rename from students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java
rename to students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
index aede0fdc66..548f69722a 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/EmailSendableBehavior.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
@@ -5,8 +5,9 @@
 /**
  * Created by luoziyihao on 6/12/17.
  */
-public class EmailSendableBehavior {
-    void send(List<EmailSendClaim> emailSendClaimList) {
+public class PromotionMailableBehavior {
+
+    void send(List<PromotionMailClaim> emailSendClaimList) {
 
     }
 }

From 251022e66ff6a536a6ead1d31d8152a64dddfcfb Mon Sep 17 00:00:00 2001
From: palmshe <palmshe@foxmail.com>
Date: Mon, 12 Jun 2017 22:57:15 +0800
Subject: [PATCH 023/332] =?UTF-8?q?=E6=8C=89=E5=8D=95=E4=B8=80=E8=B4=A3?=
 =?UTF-8?q?=E4=BB=BB=E5=8E=9F=E5=88=99=E8=BF=9B=E8=A1=8C=E4=BF=AE=E6=94=B9?=
 =?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/Configuration.java |   2 +-
 .../com/coderising/ood/srp/DataGenerator.java |  64 ++++++
 .../com/coderising/ood/srp/InitDataUtils.java |  61 ------
 .../java/com/coderising/ood/srp/MailUtil.java |  39 +++-
 .../java/com/coderising/ood/srp/Main.java     |  34 +++
 .../com/coderising/ood/srp/PromotionMail.java | 207 +-----------------
 6 files changed, 142 insertions(+), 265 deletions(-)
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java
 delete mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/InitDataUtils.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java

diff --git a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
index f328c1816a..1faff3f68d 100644
--- a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -15,7 +15,7 @@ public class Configuration {
 	 * @param key
 	 * @return
 	 */
-	public String getProperty(String key) {
+	public static String getProperty(String key) {
 		
 		return configurations.get(key);
 	}
diff --git a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java
new file mode 100644
index 0000000000..6e9f1c2e84
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/InitDataUtils.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/InitDataUtils.java
deleted file mode 100644
index 35cdb939f6..0000000000
--- a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/InitDataUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * 版权 (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.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
-  * @Description: 加载所需要的数据，以便PromotionMail取用
-  * @author palmshe
-  * @date 2017年6月11日 下午10:24:46
-  */
-public class InitDataUtils {
-	
-	protected static final String GOOD_NAME= "good_name";
-	protected static final String GOOD_ID= "good_id";
-	
-	/**
-	  * @Description：生产商品
-	  * @param file
-	  * @return
-	  * @throws IOException
-	  */
-	public static List generateGoods(File file) throws IOException{
-		List goods= new ArrayList();
-		BufferedReader br = null;
-		try {
-			br = new BufferedReader(new FileReader(file));
-			String temp = br.readLine();
-			String[] data = temp.split(" ");
-			
-			for (int i = 0; i < 1; i++) {
-				Map goodMaps= new HashMap();
-				goodMaps.put(GOOD_ID, data[0]);
-				goodMaps.put(GOOD_NAME, data[1]);
-				goods.add(goodMaps);
-			}
-			
-//			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();
-		}
-		
-		return goods;
-	}
-}
diff --git a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
index 9f9e749af7..e31d8a9b75 100644
--- a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -2,17 +2,40 @@
 
 public class MailUtil {
 
-	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
-			boolean debug) {
-		//假装发了一封邮件
+	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(fromAddress).append("\n");
-		buffer.append("To:").append(toAddress).append("\n");
+		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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 0000000000..8029d24a4c
--- /dev/null
+++ b/students/2842295913/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("E:\\Workspace-Sourcetree\\coding2017\\students\\2842295913\\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/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index f293eb1f45..a773d878ee 100644
--- a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,209 +1,26 @@
 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.Iterator;
-import java.util.List;
 import java.util.Map;
 
 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()); 
-
-		
-	}
-
-
-
-
-	private 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("没有邮件发送");
-			
-		}
-
-	}
-	
-	/**
-	  * @Description：设置商品信息
-	  * @param goods
-	  */
-	public void setGoods(List goods){
-		Map goodMap= (HashMap)goods.get(0);
-		setProductDesc((String)goodMap.get(InitDataUtils.GOOD_NAME));
-		setProductID((String)goodMap.get(InitDataUtils.GOOD_ID));
+	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 + " 降价了，欢迎购买!" ;
 	}
 }

From 7f7332d57fdbf085027ffafcbae8ad2a5a968a01 Mon Sep 17 00:00:00 2001
From: fade <511739113@qq.com>
Date: Mon, 12 Jun 2017 23:39:04 +0800
Subject: [PATCH 024/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=20=E5=8E=9F=E7=89=88?=
 =?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../511739113/6.11/ood-assignment/pom.xml     |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/511739113/6.11/ood-assignment/pom.xml
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/511739113/6.11/ood-assignment/pom.xml b/students/511739113/6.11/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/511739113/6.11/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<String,String> 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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/511739113/6.11/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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/511739113/6.11/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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/511739113/6.11/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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/511739113/6.11/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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/511739113/6.11/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

From 37e47d3afa21b0f22a12f0c848fb4f5035887499 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Mon, 12 Jun 2017 23:39:21 +0800
Subject: [PATCH 025/332] work init

---
 students/1395844061/.gitignore                | 27 +++++++++++++++++++
 students/1395844061/README.md                 |  1 +
 students/1395844061/build.gradle              | 18 +++++++++++++
 students/1395844061/course-pro-1/build.gradle | 14 ++++++++++
 students/1395844061/settings.gradle           |  2 ++
 5 files changed, 62 insertions(+)
 create mode 100644 students/1395844061/.gitignore
 create mode 100644 students/1395844061/README.md
 create mode 100644 students/1395844061/build.gradle
 create mode 100644 students/1395844061/course-pro-1/build.gradle
 create mode 100644 students/1395844061/settings.gradle

diff --git a/students/1395844061/.gitignore b/students/1395844061/.gitignore
new file mode 100644
index 0000000000..15df76b3b5
--- /dev/null
+++ b/students/1395844061/.gitignore
@@ -0,0 +1,27 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+1395844061.iml
+src/
diff --git a/students/1395844061/README.md b/students/1395844061/README.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/students/1395844061/README.md
@@ -0,0 +1 @@
+
diff --git a/students/1395844061/build.gradle b/students/1395844061/build.gradle
new file mode 100644
index 0000000000..db1cbf8def
--- /dev/null
+++ b/students/1395844061/build.gradle
@@ -0,0 +1,18 @@
+group 'peng-test'
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.5
+
+repositories {
+    maven{
+        url "http://maven.oschina.net/content/groups/public/"
+    }
+}
+
+dependencies {
+
+    compile 'org.htmlparser:htmlparser:2.1'
+    testCompile group: 'junit', name: 'junit', version: '4.11'
+}
diff --git a/students/1395844061/course-pro-1/build.gradle b/students/1395844061/course-pro-1/build.gradle
new file mode 100644
index 0000000000..939cf6ccbe
--- /dev/null
+++ b/students/1395844061/course-pro-1/build.gradle
@@ -0,0 +1,14 @@
+group 'peng-test'
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+}
diff --git a/students/1395844061/settings.gradle b/students/1395844061/settings.gradle
new file mode 100644
index 0000000000..f66e41c2f9
--- /dev/null
+++ b/students/1395844061/settings.gradle
@@ -0,0 +1,2 @@
+include 'course-pro-1'
+

From 56965fe72c76a7dd73a0e538e623f91d910c1d1f Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Mon, 12 Jun 2017 23:44:23 +0800
Subject: [PATCH 026/332] work init

---
 .../com/coderising/ood/srp/Configuration.java |  33 +++
 .../coderising/ood/srp/ConfigurationKeys.java |  16 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  31 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  27 +++
 .../com/coderising/ood/srp/PromotionMail.java | 203 ++++++++++++++++++
 5 files changed, 310 insertions(+)
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..cd447ad225
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Configuration
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:30
+ */
+public class Configuration {
+
+    static Map<String,String> 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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..7c3aa420b9
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+/**
+ * ConfigurationKeys
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:31
+ */
+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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..437a74cb40
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * DBUtil
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:32
+ */
+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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..83b3ef844b
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+/**
+ * MailUtil
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:28
+ */
+public final class MailUtil {
+
+
+    private MailUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
+    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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..331537f5d9
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,203 @@
+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.Iterator;
+import java.util.List;
+
+/**
+ * PromotionMail
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/12/23:33
+ */
+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("没有邮件发送");
+
+        }
+
+    }
+}

From 029e31e55bdf64c11fbe2cb4cd885e2bb5791ab4 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Mon, 12 Jun 2017 23:45:27 +0800
Subject: [PATCH 027/332] add gitignore file

---
 students/1395844061/.gitignore | 1 -
 1 file changed, 1 deletion(-)

diff --git a/students/1395844061/.gitignore b/students/1395844061/.gitignore
index 15df76b3b5..d41523dfd3 100644
--- a/students/1395844061/.gitignore
+++ b/students/1395844061/.gitignore
@@ -24,4 +24,3 @@
 hs_err_pid*
 
 1395844061.iml
-src/

From 58298121161fba45621585d7b40e13113c10e985 Mon Sep 17 00:00:00 2001
From: onlyLYJ <382266293@qq.com>
Date: Sun, 11 Jun 2017 22:12:13 +0800
Subject: [PATCH 028/332] Merge pull request #6 from onlyliuxin/master

season 2
---
 .../com/coderising/ood/srp/MailSender.java    | 52 ++++++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 40 ++++++++++++++
 .../src/com/coderising/ood/srp/bean/Mail.java | 53 +++++++++++++++++++
 .../com/coderising/ood/srp/bean/Product.java  | 38 +++++++++++++
 .../coderising/ood/srp/bean/Subscriber.java   | 27 ++++++++++
 .../ood/srp/config/Configuration.java         | 38 +++++++++++++
 .../ood/srp/config/ServerConfig.java          | 32 +++++++++++
 .../com/coderising/ood/srp/dao/MailDAO.java   | 39 ++++++++++++++
 .../coderising/ood/srp/dao/ProductDAO.java    | 49 +++++++++++++++++
 .../com/coderising/ood/srp/dao/UserDAO.java   | 31 +++++++++++
 .../ood/srp/data/product_promotion.txt        |  4 ++
 .../com/coderising/ood/srp/util/DBUtil.java   | 16 ++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 32 +++++++++++
 students/382266293/src/pom.xml                | 32 +++++++++++
 14 files changed, 483 insertions(+)
 create mode 100644 students/382266293/src/com/coderising/ood/srp/MailSender.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/bean/Mail.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/bean/Product.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/config/Configuration.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/data/product_promotion.txt
 create mode 100644 students/382266293/src/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/382266293/src/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 students/382266293/src/pom.xml

diff --git a/students/382266293/src/com/coderising/ood/srp/MailSender.java b/students/382266293/src/com/coderising/ood/srp/MailSender.java
new file mode 100644
index 0000000000..6d52844059
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/MailSender.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.bean.Mail;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ServerConfig;
+import com.coderising.ood.srp.dao.MailDAO;
+import com.coderising.ood.srp.dao.ProductDAO;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public abstract class MailSender {
+
+    protected static ServerConfig sc = new Configuration().config().getServerConfig();
+    protected static MailDAO mailDAO = new MailDAO();
+    protected static ProductDAO productDAO = new ProductDAO();
+    protected boolean debug;
+
+    protected List<Mail> prepareMails(File productFile) throws Exception {
+
+        List<Product> products = productDAO.list(productFile);
+        List<Mail> mailingList = mailDAO.loadMailingList(products);
+        setMailContext(mailingList);
+
+        return mailingList;
+    }
+
+    protected abstract void setMailContext(List<Mail> mailingList);
+
+    protected void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    protected void sendEMails(List<Mail> mailingList) {
+
+        if (mailDAO.isValide(mailingList)) {
+            System.out.println("开始发送邮件");
+
+            for (Mail mail : mailingList) {
+                MailUtil.send(mail, sc);
+            }
+        }
+
+    }
+
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/PromotionMail.java b/students/382266293/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..abde88278d
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.bean.Mail;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail extends MailSender {
+
+    private static final String EMAIL_ADMIN = "email.admin";
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("E:\\git\\coding2017\\students\\382266293\\src\\com\\coderising\\ood\\srp\\data\\product_promotion.txt");
+        MailSender pm = new PromotionMail();
+        pm.setDebug(false);
+        List<Mail> mailList = pm.prepareMails(f);
+        pm.sendEMails(mailList);
+
+    }
+
+    @Override
+    protected void setMailContext(List<Mail> mailingList) {
+
+        String subject = "您关注的产品降价了";
+
+        for (Mail mail : mailingList) {
+            mail.setFromAddress(EMAIL_ADMIN);
+            mail.setSubject(subject);
+            String name = mail.getSubscriber().getName();
+            String productDesc = mail.getProduct().getProductDesc();
+            String message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+            mail.setSubject(subject);
+            mail.setMessage(message);
+        }
+
+    }
+
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/bean/Mail.java b/students/382266293/src/com/coderising/ood/srp/bean/Mail.java
new file mode 100644
index 0000000000..6a612dbd48
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/bean/Mail.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class Mail {
+
+    private String fromAddress;
+    private String subject;
+    private String message;
+    private Product product;
+    private Subscriber subscriber;
+
+    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 Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    public Subscriber getSubscriber() {
+        return subscriber;
+    }
+
+    public void setSubscriber(Subscriber subscriber) {
+        this.subscriber = subscriber;
+    }
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/bean/Product.java b/students/382266293/src/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 0000000000..783f2033c4
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp.bean;
+
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class Product {
+
+    private String productID;
+    private String productDesc;
+    private List<Subscriber> subscribers;
+
+    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;
+    }
+
+    public List<Subscriber> getSubscribers() {
+        return subscribers;
+    }
+
+    public void setSubscribers(List<Subscriber> subscribers) {
+        this.subscribers = subscribers;
+    }
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java b/students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java
new file mode 100644
index 0000000000..048c1eaf34
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class Subscriber {
+
+    private String name;
+    private String mailAddress;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMailAddress() {
+        return mailAddress;
+    }
+
+    public void setMailAddress(String mailAddress) {
+        this.mailAddress = mailAddress;
+    }
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/config/Configuration.java b/students/382266293/src/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 0000000000..2ed21e3af8
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    private static final String SMTP_SERVER = "smtp.server";
+    private static final String ALT_SMTP_SERVER = "alt.smtp.server";
+
+
+    private static Map<String, String> configurations = null;
+
+    public Configuration config() {
+
+        configurations = new HashMap<>();
+        configurations.put(SMTP_SERVER, "smtp.163.com");
+        configurations.put(ALT_SMTP_SERVER, "smtp1.163.com");
+
+        return this;
+    }
+
+    public ServerConfig getServerConfig() {
+
+        ServerConfig sc = new ServerConfig();
+
+        sc.setSmtpHost(getProperty(SMTP_SERVER));
+        sc.setAltSmtpHost(getProperty(ALT_SMTP_SERVER));
+
+        return sc;
+    }
+
+    private String getProperty(String key) {
+
+        return configurations.get(key);
+    }
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java b/students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java
new file mode 100644
index 0000000000..4b4b374b73
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.config;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class ServerConfig {
+
+    private String smtpHost;
+    private String altSmtpHost;
+
+    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;
+    }
+
+
+}
+
+
+
+
diff --git a/students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java b/students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java
new file mode 100644
index 0000000000..9dd5ee2259
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.bean.Mail;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.bean.Subscriber;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class MailDAO {
+
+    public List<Mail> loadMailingList(List<Product> products) throws Exception {
+
+        List<Mail> mails = new ArrayList<>();
+
+        for (Product p : products) {
+            List<Subscriber> subscribers = new UserDAO().list(p);
+
+            for (Subscriber s : subscribers) {
+                Mail mail = new Mail();
+                mail.setProduct(p);
+                mail.setSubscriber(s);
+                mails.add(mail);
+            }
+        }
+        return mails;
+    }
+
+    public boolean isValide(List<Mail> mailingList) {
+        if (null == mailingList || mailingList.isEmpty()) {
+            throw new RuntimeException("没有邮件发送");
+        }
+        return true;
+    }
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java b/students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java
new file mode 100644
index 0000000000..9aa998ebc1
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.bean.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class ProductDAO {
+
+    public List<Product> list(File productFile) throws IOException // @02C
+    {
+
+        System.out.println(productFile);
+        List<Product> products = new ArrayList<>();
+
+        System.out.println("开始导入产品清单");
+        try (BufferedReader br = new BufferedReader(new FileReader(productFile))) {
+            String temp = null;
+            while (null != (temp = br.readLine())) {
+                String[] data = temp.split(" ");
+
+                String productID = data[0];
+                String productDesc = data[1];
+
+                Product p = new Product();
+                p.setProductID(productID);
+                p.setProductDesc(productDesc);
+                System.out.println("产品ID = " + productID);
+                System.out.println("产品描述 = " + productDesc + "\r\n");
+
+                products.add(p);
+            }
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        }
+
+
+        return products;
+    }
+
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java b/students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java
new file mode 100644
index 0000000000..58bdbd07e9
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.bean.Subscriber;
+import com.coderising.ood.srp.util.DBUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by onlyLYJ on 2017/6/12.
+ */
+public class UserDAO {
+
+    public List<Subscriber> list(Product p) throws Exception {
+
+        DBUtil.setLoadQuery(p);
+
+        List<Subscriber> subscribers = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            Subscriber s = new Subscriber();
+            s.setName("user" + i);
+            s.setMailAddress(s.getName() + "@amazon.com");
+            subscribers.add(s);
+
+        }
+        return subscribers;
+
+    }
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/data/product_promotion.txt b/students/382266293/src/com/coderising/ood/srp/data/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/data/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/382266293/src/com/coderising/ood/srp/util/DBUtil.java b/students/382266293/src/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..a5885fe70e
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.bean.Product;
+
+public class DBUtil {
+
+    public static void setLoadQuery(Product p) {
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + p.getProductID() + "' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set");
+    }
+
+}
diff --git a/students/382266293/src/com/coderising/ood/srp/util/MailUtil.java b/students/382266293/src/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..a28e8aaadb
--- /dev/null
+++ b/students/382266293/src/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.bean.Mail;
+import com.coderising.ood.srp.config.ServerConfig;
+
+public class MailUtil {
+
+    public static void send(Mail mail, ServerConfig sc) {
+        try {
+            sendEmail(mail, sc.getSmtpHost());
+        } catch (Exception e) {
+            try {
+                sendEmail(mail, sc.getAltSmtpHost());
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+    public static void sendEmail(Mail mail, String SmtpHost) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(mail.getFromAddress()).append("\n");
+        buffer.append("To:").append(mail.getSubscriber().getMailAddress()).append("\n");
+        buffer.append("Subject:").append(mail.getSubject()).append("\n");
+        buffer.append("Content:").append(mail.getMessage()).append("\n");
+        System.out.println(buffer.toString());
+
+    }
+
+
+}
diff --git a/students/382266293/src/pom.xml b/students/382266293/src/pom.xml
new file mode 100644
index 0000000000..2bf55e64c9
--- /dev/null
+++ b/students/382266293/src/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>ood-assignment</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>

From 61b06dc82cf9883ec3242e787df9ef4959fc0ca4 Mon Sep 17 00:00:00 2001
From: onlyLYJ <382266293@qq.com>
Date: Tue, 13 Jun 2017 00:06:40 +0800
Subject: [PATCH 029/332] Merge pull request #6 from onlyliuxin/master

season 2
---
 .../src/com/coderising/ood/srp/config/Configuration.java         | 1 -
 1 file changed, 1 deletion(-)

diff --git a/students/382266293/src/com/coderising/ood/srp/config/Configuration.java b/students/382266293/src/com/coderising/ood/srp/config/Configuration.java
index 2ed21e3af8..5f0d181d16 100644
--- a/students/382266293/src/com/coderising/ood/srp/config/Configuration.java
+++ b/students/382266293/src/com/coderising/ood/srp/config/Configuration.java
@@ -31,7 +31,6 @@ public ServerConfig getServerConfig() {
     }
 
     private String getProperty(String key) {
-
         return configurations.get(key);
     }
 

From 473b854ec1fc1d5de0f692d49a04747e4b8cb0c1 Mon Sep 17 00:00:00 2001
From: onlyLYJ <382266293@qq.com>
Date: Tue, 13 Jun 2017 00:14:16 +0800
Subject: [PATCH 030/332] week 1 done

---
 .../coderising => }/ood/srp/MailSender.java    | 18 +++++++++---------
 .../coderising => }/ood/srp/PromotionMail.java |  4 ++--
 .../coderising => }/ood/srp/bean/Mail.java     |  2 +-
 .../coderising => }/ood/srp/bean/Product.java  |  2 +-
 .../ood/srp/bean/Subscriber.java               |  2 +-
 .../ood/srp/config/Configuration.java          |  2 +-
 .../ood/srp/config/ServerConfig.java           |  2 +-
 .../coderising => }/ood/srp/dao/MailDAO.java   |  8 ++++----
 .../ood/srp/dao/ProductDAO.java                |  4 ++--
 .../coderising => }/ood/srp/dao/UserDAO.java   |  8 ++++----
 .../ood/srp/data/product_promotion.txt         |  0
 .../coderising => }/ood/srp/util/DBUtil.java   |  4 ++--
 .../coderising => }/ood/srp/util/MailUtil.java |  6 +++---
 13 files changed, 31 insertions(+), 31 deletions(-)
 rename students/382266293/src/{com/coderising => }/ood/srp/MailSender.java (75%)
 rename students/382266293/src/{com/coderising => }/ood/srp/PromotionMail.java (93%)
 rename students/382266293/src/{com/coderising => }/ood/srp/bean/Mail.java (96%)
 rename students/382266293/src/{com/coderising => }/ood/srp/bean/Product.java (95%)
 rename students/382266293/src/{com/coderising => }/ood/srp/bean/Subscriber.java (92%)
 rename students/382266293/src/{com/coderising => }/ood/srp/config/Configuration.java (95%)
 rename students/382266293/src/{com/coderising => }/ood/srp/config/ServerConfig.java (92%)
 rename students/382266293/src/{com/coderising => }/ood/srp/dao/MailDAO.java (82%)
 rename students/382266293/src/{com/coderising => }/ood/srp/dao/ProductDAO.java (93%)
 rename students/382266293/src/{com/coderising => }/ood/srp/dao/UserDAO.java (75%)
 rename students/382266293/src/{com/coderising => }/ood/srp/data/product_promotion.txt (100%)
 rename students/382266293/src/{com/coderising => }/ood/srp/util/DBUtil.java (78%)
 rename students/382266293/src/{com/coderising => }/ood/srp/util/MailUtil.java (87%)

diff --git a/students/382266293/src/com/coderising/ood/srp/MailSender.java b/students/382266293/src/ood/srp/MailSender.java
similarity index 75%
rename from students/382266293/src/com/coderising/ood/srp/MailSender.java
rename to students/382266293/src/ood/srp/MailSender.java
index 6d52844059..83e3fbef85 100644
--- a/students/382266293/src/com/coderising/ood/srp/MailSender.java
+++ b/students/382266293/src/ood/srp/MailSender.java
@@ -1,12 +1,12 @@
-package com.coderising.ood.srp;
-
-import com.coderising.ood.srp.bean.Mail;
-import com.coderising.ood.srp.bean.Product;
-import com.coderising.ood.srp.config.Configuration;
-import com.coderising.ood.srp.config.ServerConfig;
-import com.coderising.ood.srp.dao.MailDAO;
-import com.coderising.ood.srp.dao.ProductDAO;
-import com.coderising.ood.srp.util.MailUtil;
+package ood.srp;
+
+import ood.srp.bean.Mail;
+import ood.srp.bean.Product;
+import ood.srp.config.Configuration;
+import ood.srp.config.ServerConfig;
+import ood.srp.dao.MailDAO;
+import ood.srp.dao.ProductDAO;
+import ood.srp.util.MailUtil;
 
 import java.io.File;
 import java.util.List;
diff --git a/students/382266293/src/com/coderising/ood/srp/PromotionMail.java b/students/382266293/src/ood/srp/PromotionMail.java
similarity index 93%
rename from students/382266293/src/com/coderising/ood/srp/PromotionMail.java
rename to students/382266293/src/ood/srp/PromotionMail.java
index abde88278d..c3d6520a67 100644
--- a/students/382266293/src/com/coderising/ood/srp/PromotionMail.java
+++ b/students/382266293/src/ood/srp/PromotionMail.java
@@ -1,6 +1,6 @@
-package com.coderising.ood.srp;
+package ood.srp;
 
-import com.coderising.ood.srp.bean.Mail;
+import ood.srp.bean.Mail;
 
 import java.io.File;
 import java.util.List;
diff --git a/students/382266293/src/com/coderising/ood/srp/bean/Mail.java b/students/382266293/src/ood/srp/bean/Mail.java
similarity index 96%
rename from students/382266293/src/com/coderising/ood/srp/bean/Mail.java
rename to students/382266293/src/ood/srp/bean/Mail.java
index 6a612dbd48..91e1363140 100644
--- a/students/382266293/src/com/coderising/ood/srp/bean/Mail.java
+++ b/students/382266293/src/ood/srp/bean/Mail.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.bean;
+package ood.srp.bean;
 
 /**
  * Created by onlyLYJ on 2017/6/12.
diff --git a/students/382266293/src/com/coderising/ood/srp/bean/Product.java b/students/382266293/src/ood/srp/bean/Product.java
similarity index 95%
rename from students/382266293/src/com/coderising/ood/srp/bean/Product.java
rename to students/382266293/src/ood/srp/bean/Product.java
index 783f2033c4..3b879b274f 100644
--- a/students/382266293/src/com/coderising/ood/srp/bean/Product.java
+++ b/students/382266293/src/ood/srp/bean/Product.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.bean;
+package ood.srp.bean;
 
 import java.util.List;
 
diff --git a/students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java b/students/382266293/src/ood/srp/bean/Subscriber.java
similarity index 92%
rename from students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java
rename to students/382266293/src/ood/srp/bean/Subscriber.java
index 048c1eaf34..a2a2641622 100644
--- a/students/382266293/src/com/coderising/ood/srp/bean/Subscriber.java
+++ b/students/382266293/src/ood/srp/bean/Subscriber.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.bean;
+package ood.srp.bean;
 
 /**
  * Created by onlyLYJ on 2017/6/12.
diff --git a/students/382266293/src/com/coderising/ood/srp/config/Configuration.java b/students/382266293/src/ood/srp/config/Configuration.java
similarity index 95%
rename from students/382266293/src/com/coderising/ood/srp/config/Configuration.java
rename to students/382266293/src/ood/srp/config/Configuration.java
index 5f0d181d16..59bf7bfbd1 100644
--- a/students/382266293/src/com/coderising/ood/srp/config/Configuration.java
+++ b/students/382266293/src/ood/srp/config/Configuration.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.config;
+package ood.srp.config;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java b/students/382266293/src/ood/srp/config/ServerConfig.java
similarity index 92%
rename from students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java
rename to students/382266293/src/ood/srp/config/ServerConfig.java
index 4b4b374b73..2c8c52a79a 100644
--- a/students/382266293/src/com/coderising/ood/srp/config/ServerConfig.java
+++ b/students/382266293/src/ood/srp/config/ServerConfig.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.config;
+package ood.srp.config;
 
 /**
  * Created by onlyLYJ on 2017/6/12.
diff --git a/students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java b/students/382266293/src/ood/srp/dao/MailDAO.java
similarity index 82%
rename from students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java
rename to students/382266293/src/ood/srp/dao/MailDAO.java
index 9dd5ee2259..c80eb7f7bc 100644
--- a/students/382266293/src/com/coderising/ood/srp/dao/MailDAO.java
+++ b/students/382266293/src/ood/srp/dao/MailDAO.java
@@ -1,8 +1,8 @@
-package com.coderising.ood.srp.dao;
+package ood.srp.dao;
 
-import com.coderising.ood.srp.bean.Mail;
-import com.coderising.ood.srp.bean.Product;
-import com.coderising.ood.srp.bean.Subscriber;
+import ood.srp.bean.Mail;
+import ood.srp.bean.Product;
+import ood.srp.bean.Subscriber;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java b/students/382266293/src/ood/srp/dao/ProductDAO.java
similarity index 93%
rename from students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java
rename to students/382266293/src/ood/srp/dao/ProductDAO.java
index 9aa998ebc1..39312cf24a 100644
--- a/students/382266293/src/com/coderising/ood/srp/dao/ProductDAO.java
+++ b/students/382266293/src/ood/srp/dao/ProductDAO.java
@@ -1,6 +1,6 @@
-package com.coderising.ood.srp.dao;
+package ood.srp.dao;
 
-import com.coderising.ood.srp.bean.Product;
+import ood.srp.bean.Product;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java b/students/382266293/src/ood/srp/dao/UserDAO.java
similarity index 75%
rename from students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java
rename to students/382266293/src/ood/srp/dao/UserDAO.java
index 58bdbd07e9..91ebd5cd23 100644
--- a/students/382266293/src/com/coderising/ood/srp/dao/UserDAO.java
+++ b/students/382266293/src/ood/srp/dao/UserDAO.java
@@ -1,8 +1,8 @@
-package com.coderising.ood.srp.dao;
+package ood.srp.dao;
 
-import com.coderising.ood.srp.bean.Product;
-import com.coderising.ood.srp.bean.Subscriber;
-import com.coderising.ood.srp.util.DBUtil;
+import ood.srp.bean.Product;
+import ood.srp.bean.Subscriber;
+import ood.srp.util.DBUtil;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/students/382266293/src/com/coderising/ood/srp/data/product_promotion.txt b/students/382266293/src/ood/srp/data/product_promotion.txt
similarity index 100%
rename from students/382266293/src/com/coderising/ood/srp/data/product_promotion.txt
rename to students/382266293/src/ood/srp/data/product_promotion.txt
diff --git a/students/382266293/src/com/coderising/ood/srp/util/DBUtil.java b/students/382266293/src/ood/srp/util/DBUtil.java
similarity index 78%
rename from students/382266293/src/com/coderising/ood/srp/util/DBUtil.java
rename to students/382266293/src/ood/srp/util/DBUtil.java
index a5885fe70e..9d14f02cba 100644
--- a/students/382266293/src/com/coderising/ood/srp/util/DBUtil.java
+++ b/students/382266293/src/ood/srp/util/DBUtil.java
@@ -1,6 +1,6 @@
-package com.coderising.ood.srp.util;
+package ood.srp.util;
 
-import com.coderising.ood.srp.bean.Product;
+import ood.srp.bean.Product;
 
 public class DBUtil {
 
diff --git a/students/382266293/src/com/coderising/ood/srp/util/MailUtil.java b/students/382266293/src/ood/srp/util/MailUtil.java
similarity index 87%
rename from students/382266293/src/com/coderising/ood/srp/util/MailUtil.java
rename to students/382266293/src/ood/srp/util/MailUtil.java
index a28e8aaadb..d41af6667e 100644
--- a/students/382266293/src/com/coderising/ood/srp/util/MailUtil.java
+++ b/students/382266293/src/ood/srp/util/MailUtil.java
@@ -1,7 +1,7 @@
-package com.coderising.ood.srp.util;
+package ood.srp.util;
 
-import com.coderising.ood.srp.bean.Mail;
-import com.coderising.ood.srp.config.ServerConfig;
+import ood.srp.bean.Mail;
+import ood.srp.config.ServerConfig;
 
 public class MailUtil {
 

From 91b94b790c9806dc5380cdb3f7cdb299461292a7 Mon Sep 17 00:00:00 2001
From: dtwj03 <l>
Date: Tue, 13 Jun 2017 00:56:49 +0800
Subject: [PATCH 031/332] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=B4=E6=98=8E?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/469880403/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/469880403/readme.md

diff --git a/students/469880403/readme.md b/students/469880403/readme.md
new file mode 100644
index 0000000000..8fc153b34f
--- /dev/null
+++ b/students/469880403/readme.md
@@ -0,0 +1 @@
+说明文件
\ No newline at end of file

From b8a284b0b3d597f196d131b7cbc5470f5a9d40b1 Mon Sep 17 00:00:00 2001
From: fade <511739113@qq.com>
Date: Tue, 13 Jun 2017 02:06:26 +0800
Subject: [PATCH 032/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/srp/ConfigurationKeys.java |   9 -
 .../java/com/coderising/ood/srp/MailUtil.java |  18 --
 .../com/coderising/ood/srp/PromotionMail.java | 207 +++---------------
 .../com/coderising/ood/srp/bean/Message.java  |  37 ++++
 .../com/coderising/ood/srp/bean/Product.java  |  40 ++++
 .../coderising/ood/srp/bean/ServerBean.java   |  61 ++++++
 .../ood/srp/{ => config}/Configuration.java   |  14 +-
 .../ood/srp/config/ConfigurationKeys.java     |  21 ++
 .../com/coderising/ood/srp/jdbc/UserJDBC.java |  29 +++
 .../ood/srp/service/MessageService.java       |  83 +++++++
 .../ood/srp/service/UserService.java          |  35 +++
 .../coderising/ood/srp/{ => util}/DBUtil.java |   9 +-
 .../com/coderising/ood/srp/util/FileUtil.java |  52 +++++
 .../com/coderising/ood/srp/util/MailUtil.java |  25 +++
 14 files changed, 429 insertions(+), 211 deletions(-)
 delete mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 delete mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java
 rename students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/{ => config}/Configuration.java (64%)
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
 rename students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/{ => util}/DBUtil.java (74%)
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 create mode 100644 students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java

diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
deleted file mode 100644
index 8695aed644..0000000000
--- a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 9f9e749af7..0000000000
--- a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 781587a846..bf42021028 100644
--- a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,199 +1,46 @@
 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;
 
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.service.MessageService;
+import com.coderising.ood.srp.service.UserService;
+import com.coderising.ood.srp.util.FileUtil;
+
+/**
+ * 模拟 商品促销通知系统
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:43:57
+*/
 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; 
-	
 	
+	/** 模拟注入userService */
+	private UserService userService = new UserService();
 	
-	private static final String NAME_KEY = "NAME";
-	private static final String EMAIL_KEY = "EMAIL";
-	
+	/** 模拟注入messageService */
+	private MessageService messageService = new MessageService();
 
 	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);
-
+		new PromotionMail(f, emailDebug);
 	}
-
 	
+	/**
+	 * 商品促销通知系统
+	 * <p>标题: </p>
+	 * <p>描述: </p>
+	 * @param file
+	 * @param mailDebug
+	 * @throws Exception
+	*/
 	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");
+		Product product = FileUtil.readFile(file);
+		messageService.sendEMails(mailDebug, userService.queryUserInfo(product.getProductId()),product); 
 	}
-
 	
-	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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java
new file mode 100644
index 0000000000..01cd33b04c
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Message.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * 推送的消息 实体
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午2:01:17
+*/
+public class Message extends ServerBean{
+	
+	/**  */
+	private static final long serialVersionUID = 3850050693864793038L;
+
+	/** 标题 */
+	private String subject;
+	
+	/** 消息 */
+	private String message;
+
+	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;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 0000000000..ed841c4f72
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.bean;
+
+import java.io.Serializable;
+
+/**
+ * 商品类
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午12:29:56
+*/
+public class Product implements Serializable{
+	
+	/**  */
+	private static final long serialVersionUID = 2966621699675433678L;
+
+	/** 商品Id */
+	private String productId;
+	
+	/** 商品描述 */
+	private String 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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java
new file mode 100644
index 0000000000..948f501f01
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ServerBean.java
@@ -0,0 +1,61 @@
+package com.coderising.ood.srp.bean;
+
+import java.io.Serializable;
+
+/**
+ * 服务配置
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午1:22:38
+*/
+public class ServerBean implements Serializable{
+	
+	/**  */
+	private static final long serialVersionUID = -1842399098772577584L;
+
+	/** 服务器地址 */
+	private String smtpHost;
+	
+	/** 备用服务器地址 */
+	private String altSmtpHost;
+	
+	/** 发送地址 */
+	private String fromAddress;
+	
+	/** 接受地址 */
+	private String toAddress;
+
+	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 fromAddress;
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+	public String getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java
similarity index 64%
rename from students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java
index f328c1816a..45cbf41c11 100644
--- a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -1,22 +1,30 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.config;
 import java.util.HashMap;
 import java.util.Map;
 
+/**
+ * 配置类，模拟从配置文件中读取参数
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:44:36
+*/
 public class Configuration {
 
-	static Map<String,String> configurations = new HashMap<>();
+	private static Map<String,String> configurations = new HashMap<String,String>();
+	
 	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/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..0e8c889f2e
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp.config;
+
+/**
+ * 常量类 存放配置文件key
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:45:43
+*/
+public class ConfigurationKeys {
+
+	/** 服务器地址 */
+	public static final String SMTP_SERVER = "smtp.server";
+	
+	/** 备用服务器地址 */
+	public static final String ALT_SMTP_SERVER = "alt.smtp.server";
+	
+	/** email地址 */
+	public static final String EMAIL_ADMIN = "email.admin";
+
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java
new file mode 100644
index 0000000000..b0382b21a8
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/jdbc/UserJDBC.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.jdbc;
+
+import java.util.List;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+/**
+ * 用户 jdbc
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午12:51:00
+*/
+public class UserJDBC {
+	
+	/**
+	 * 根据商品Id 获取用户信息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param productId
+	 * @return
+	 * @autho zx
+	 * @time 2017年6月13日 上午12:51:14
+	 */
+	public List selectUserId(String sql){
+		return DBUtil.query(sql);
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java
new file mode 100644
index 0000000000..61202c0a6f
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/MessageService.java
@@ -0,0 +1,83 @@
+package com.coderising.ood.srp.service;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.bean.Message;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+import com.coderising.ood.srp.util.MailUtil;
+
+/**
+ * 推送消息 
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午1:10:27
+*/
+public class MessageService {
+	
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	private static final String NAME_KEY = "NAME";
+	
+	private Configuration configuration = new Configuration();
+	
+	/**
+	 * 推送消息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param debug
+	 * @param mailingList
+	 * @param product
+	 * @throws IOException
+	 * @autho zx
+	 * @time 2017年6月13日 上午1:59:31
+	 */
+	public void sendEMails(boolean debug, List mailingList,Product product) throws IOException{
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				Message message = configureEMail((HashMap) iter.next(),product.getProductDesc());  
+				try {
+					if (message!=null)
+						MailUtil.sendEmail(message, debug);
+				}catch (Exception e){
+					try {
+						MailUtil.sendEmail(message, debug); 
+					} catch (Exception e2){
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		}else {
+			System.out.println("没有邮件发送");
+		}
+	}
+	
+	private Message configureEMail(HashMap userInfo,String productDesc) throws IOException{
+		String toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) 
+			return getMessage(userInfo,productDesc,toAddress); 
+		return null;
+	}
+	
+	private Message getMessage(HashMap userInfo,String productDesc,String toAddress) throws IOException{
+		String name = (String) userInfo.get(NAME_KEY);
+		Message messageBean = new Message();
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
+		messageBean.setMessage(message);
+		messageBean.setSubject(subject);
+		messageBean.setToAddress(toAddress);
+		messageBean.setAltSmtpHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		messageBean.setSmtpHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+		messageBean.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		return messageBean;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 0000000000..99161f9349
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.jdbc.UserJDBC;
+
+/**
+ * 用户 service
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午12:53:30
+*/
+public class UserService {
+	
+	/** 模拟注入userJDBC */
+	private UserJDBC userJDBC = new UserJDBC();
+	
+	/**
+	 * 获取用户信息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param productId
+	 * @return
+	 * @autho zx
+	 * @time 2017年6月13日 上午12:56:45
+	 */
+	public List queryUserInfo(String productId){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productId +"' "
+				+ "and send_mail=1 ";
+		return userJDBC.selectUserId(sendMailQuery);
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
similarity index 74%
rename from students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
index 82e9261d18..e466fcb0d4 100644
--- a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -1,8 +1,15 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.util;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
+/**
+ * 模拟获取数据库
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月12日 下午11:47:21
+*/
 public class DBUtil {
 	
 	/**
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..01eeef3227
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.bean.Product;
+
+/**
+ * file工具类
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zx
+ * @time 2017年6月13日 上午2:04:59
+*/
+public class FileUtil {
+	
+	/**
+	 * 读取商品信息
+	 * <p>方法名称：</p>
+	 * <p>方法说明：</p>
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 * @autho zx
+	 * @time 2017年6月13日 上午12:39:06
+	 */
+	public static Product readFile(File file) throws IOException{
+		BufferedReader br = null;
+		Product product = new Product();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			String productId = data[0];
+			String productDesc = data[1];
+			product.setProductId(productId);
+			product.setProductDesc(productDesc);
+			
+			System.out.println("产品ID = " + productId + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return product;
+	}
+	
+}
diff --git a/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..a7ecb7f213
--- /dev/null
+++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.bean.Message;
+
+/**
+ * 消息推送工具类
+ * <p>标题: </p>
+ * <p>描述: </p>
+ * @autho zhangxu
+ * @time 2017年6月13日 上午2:03:46
+*/
+public class MailUtil {
+
+	public static void sendEmail(Message message,boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(message.getFromAddress()).append("\n");
+		buffer.append("To:").append(message.getToAddress()).append("\n");
+		buffer.append("Subject:").append(message.getSubject()).append("\n");
+		buffer.append("Content:").append(message.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+	}
+
+	
+}

From 426445742fdbd728a8f5759077ba2855d22397bb Mon Sep 17 00:00:00 2001
From: luoziyihao <luoziyihao@gmail.com>
Date: Tue, 13 Jun 2017 11:10:50 +0800
Subject: [PATCH 033/332] ok ProductParser

---
 .../coderising/ood/srp/optimize/Product.java  | 23 +++++++++++--
 .../ood/srp/optimize/ProductParser.java       | 33 ++++++++++++++++---
 .../ood/srp/optimize/PromotionMailApp.java    |  6 +++-
 .../com/coding/common/util/FileUtils2.java    |  6 +++-
 .../java/com/coding/common/util/IOUtils2.java | 17 ++++++++--
 .../com/coding/common/util/IOUtils2Test.java  | 26 +++++++++++++++
 .../common/src/test/resources/test.json       |  4 +++
 7 files changed, 103 insertions(+), 12 deletions(-)
 create mode 100644 students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java
 create mode 100644 students/1204187480/code/homework/common/src/test/resources/test.json

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
index 652897a7f3..ffb440712f 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
@@ -1,9 +1,28 @@
 package com.coderising.ood.srp.optimize;
 
+import lombok.Setter;
+
 /**
  * Created by luoziyihao on 6/12/17.
  */
+
 public class Product {
-    private static String productID;
-    private static String productDesc;
+    private String productID;
+    private String 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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
index 7860dd6047..dd3198c42d 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
@@ -1,19 +1,42 @@
 package com.coderising.ood.srp.optimize;
 
 import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.coding.common.util.FileUtils2.openStream;
+import static com.coding.common.util.IOUtils2.readToStringList;
 
 /**
  * Created by luoziyihao on 6/12/17.
  */
 public class ProductParser {
 
-    private String productFilePath;
+    private String productClassPath;
 
-    public void setProductFilePath(String productFilePath) {
-        this.productFilePath = productFilePath;
+    public void setProductClassPath(String productClassPath) {
+        this.productClassPath = productClassPath;
     }
 
-    public List<Product> parse(){
-        return null;
+    public List<Product> parse() {
+        List<String> stringList = readToStringList(openStream(productClassPath));
+        return stringList.stream()
+                .map(String::trim)
+                .filter(s -> !s.isEmpty())
+                .filter(s -> s.contains(SPLIT_STRING))
+                .map(this::parseLine)
+                .collect(Collectors.toList());
+
+    }
+
+    private static final String SPLIT_STRING = " ";
+
+    private Product parseLine(String s) {
+        int index = s.indexOf(SPLIT_STRING);
+        String productID = s.substring(0, index);
+        String productDesc = s.substring(index);
+        Product product = new Product();
+        product.setProductDesc(productDesc);
+        product.setProductID(productID);
+        return product;
     }
 }
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
index ef89a79d77..8b9061e7e5 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
@@ -1,11 +1,15 @@
 package com.coderising.ood.srp.optimize;
 
+import java.util.List;
+
 /**
  * Created by luoziyihao on 6/12/17.
  */
 public class PromotionMailApp {
 
     public static void main(String args[]){
-
+        ProductParser productParser = new ProductParser();
+        productParser.setProductClassPath("product_promotion.txt");
+        List<Product> products = productParser.parse();
     }
 }
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
index 1d4aef10f5..08e42fb615 100644
--- a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/FileUtils2.java
@@ -3,6 +3,7 @@
 import com.google.common.base.Preconditions;
 
 import java.io.*;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -44,7 +45,7 @@ public static String getCanonicalPath(File file) {
     }
 
 
-    public static byte[] getBytes(File classFile) throws IllegalStateException {
+    public static byte[] getBytes(File classFile) {
         // byteArrayOutputStream, 可写的动长数组
         ByteArrayOutputStream baos = null;
         BufferedInputStream bis = null;
@@ -65,5 +66,8 @@ public static byte[] getBytes(File classFile) throws IllegalStateException {
         }
     }
 
+    public static InputStream openStream(String classPath) {
+        return ClassLoader.getSystemResourceAsStream(classPath);
+    }
 
 }
diff --git a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
index a302a6c199..889c6cefb6 100644
--- a/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
+++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java
@@ -1,8 +1,8 @@
 package com.coding.common.util;
 
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.io.*;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Created by luoziyihao on 5/2/17.
@@ -21,4 +21,15 @@ public static void close(Closeable closeable) {
     }
 
 
+    public static List<String> readToStringList(InputStream inputStream) {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new InputStreamReader(inputStream));
+            return br.lines().collect(Collectors.toList());
+        } finally {
+            close(br);
+        }
+
+    }
+
 }
diff --git a/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java
new file mode 100644
index 0000000000..6870919037
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/java/com/coding/common/util/IOUtils2Test.java
@@ -0,0 +1,26 @@
+package com.coding.common.util;
+
+import org.junit.Test;
+
+import java.util.List;
+
+import static com.coding.common.util.FileUtils2.openStream;
+import static com.coding.common.util.IOUtils2.readToStringList;
+import static org.junit.Assert.*;
+
+/**
+ * <p>
+ * <p>
+ *
+ * @author raoxiang <xiangrao@qilin99.com>
+ * @version 6/13/17
+ * @since 1.8
+ */
+public class IOUtils2Test {
+    @Test
+    public void readToStringListTest() throws Exception {
+        List<String> poms = readToStringList(openStream("test.json"));
+        System.out.println(poms);
+    }
+
+}
\ No newline at end of file
diff --git a/students/1204187480/code/homework/common/src/test/resources/test.json b/students/1204187480/code/homework/common/src/test/resources/test.json
new file mode 100644
index 0000000000..ccc0682ac2
--- /dev/null
+++ b/students/1204187480/code/homework/common/src/test/resources/test.json
@@ -0,0 +1,4 @@
+{
+  "key1": "value1"
+  , "key2": "value2"
+}
\ No newline at end of file

From f0b779eaddc44cbfda1e408ea577b1ad2591205c Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Tue, 13 Jun 2017 11:41:20 +0800
Subject: [PATCH 034/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

第一次
---
 .../data-structure/build.gradle               |  30 ++++
 .../gradle/wrapper/gradle-wrapper.properties  |   6 +
 .../data-structure/data-structure/gradlew     | 169 ++++++++++++++++++
 .../data-structure/data-structure/gradlew.bat |  84 +++++++++
 .../data-structure/settings.gradle            |  19 ++
 .../data-structure/src/main/java/Library.java |  11 ++
 .../src/test/java/LibraryTest.java            |  15 ++
 students/992331664/ood/ood/build.gradle       |  30 ++++
 .../gradle/wrapper/gradle-wrapper.properties  |   6 +
 students/992331664/ood/ood/gradlew            | 169 ++++++++++++++++++
 students/992331664/ood/ood/gradlew.bat        |  84 +++++++++
 students/992331664/ood/ood/settings.gradle    |  19 ++
 .../ood/ood/src/main/java/Library.java        |  11 ++
 .../ood/ood/src/test/java/LibraryTest.java    |  15 ++
 14 files changed, 668 insertions(+)
 create mode 100644 students/992331664/data-structure/data-structure/build.gradle
 create mode 100644 students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties
 create mode 100644 students/992331664/data-structure/data-structure/gradlew
 create mode 100644 students/992331664/data-structure/data-structure/gradlew.bat
 create mode 100644 students/992331664/data-structure/data-structure/settings.gradle
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/Library.java
 create mode 100644 students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java
 create mode 100644 students/992331664/ood/ood/build.gradle
 create mode 100644 students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties
 create mode 100644 students/992331664/ood/ood/gradlew
 create mode 100644 students/992331664/ood/ood/gradlew.bat
 create mode 100644 students/992331664/ood/ood/settings.gradle
 create mode 100644 students/992331664/ood/ood/src/main/java/Library.java
 create mode 100644 students/992331664/ood/ood/src/test/java/LibraryTest.java

diff --git a/students/992331664/data-structure/data-structure/build.gradle b/students/992331664/data-structure/data-structure/build.gradle
new file mode 100644
index 0000000000..588e5e86aa
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/build.gradle
@@ -0,0 +1,30 @@
+/*
+ * This build file was auto generated by running the Gradle 'init' task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * This generated file contains a sample Java project to get you started.
+ * For more details take a look at the Java Quickstart chapter in the Gradle
+ * user guide available at https://docs.gradle.org/3.0/userguide/tutorial_java_projects.html
+ */
+
+// Apply the java plugin to add support for Java
+apply plugin: 'java'
+
+// In this section you declare where to find the dependencies of your project
+repositories {
+    // Use 'jcenter' for resolving your dependencies.
+    // You can declare any Maven/Ivy/file repository here.
+    jcenter()
+}
+
+// In this section you declare the dependencies for your production and test code
+dependencies {
+    // The production code uses the SLF4J logging API at compile time
+    compile 'org.slf4j:slf4j-api:1.7.21'
+
+    // Declare the dependency for your favourite test framework you want to use in your tests.
+    // TestNG is also supported by the Gradle Test task. Just change the
+    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
+    // 'test.useTestNG()' to your build script.
+    testCompile 'junit:junit:4.12'
+}
diff --git a/students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties b/students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..d4aaec595d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 13 11:30:56 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
diff --git a/students/992331664/data-structure/data-structure/gradlew b/students/992331664/data-structure/data-structure/gradlew
new file mode 100644
index 0000000000..9aa616c273
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/gradlew
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/students/992331664/data-structure/data-structure/gradlew.bat b/students/992331664/data-structure/data-structure/gradlew.bat
new file mode 100644
index 0000000000..f9553162f1
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/students/992331664/data-structure/data-structure/settings.gradle b/students/992331664/data-structure/data-structure/settings.gradle
new file mode 100644
index 0000000000..e5c7e27790
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/settings.gradle
@@ -0,0 +1,19 @@
+/*
+ * This settings file was auto generated by the Gradle buildInit task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/3.0/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = 'data-structure'
diff --git a/students/992331664/data-structure/data-structure/src/main/java/Library.java b/students/992331664/data-structure/data-structure/src/main/java/Library.java
new file mode 100644
index 0000000000..3a465d0ed5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/Library.java
@@ -0,0 +1,11 @@
+/*
+ * This Java source file was auto generated by running 'gradle buildInit --type java-library'
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * @author gant, @date 17-6-13 上午11:30
+ */
+public class Library {
+    public boolean someLibraryMethod() {
+        return true;
+    }
+}
diff --git a/students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java b/students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java
new file mode 100644
index 0000000000..da00ff25a0
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java
@@ -0,0 +1,15 @@
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/*
+ * This Java source file was auto generated by running 'gradle init --type java-library'
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * @author gant, @date 17-6-13 上午11:30
+ */
+public class LibraryTest {
+    @Test public void testSomeLibraryMethod() {
+        Library classUnderTest = new Library();
+        assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
+    }
+}
diff --git a/students/992331664/ood/ood/build.gradle b/students/992331664/ood/ood/build.gradle
new file mode 100644
index 0000000000..588e5e86aa
--- /dev/null
+++ b/students/992331664/ood/ood/build.gradle
@@ -0,0 +1,30 @@
+/*
+ * This build file was auto generated by running the Gradle 'init' task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * This generated file contains a sample Java project to get you started.
+ * For more details take a look at the Java Quickstart chapter in the Gradle
+ * user guide available at https://docs.gradle.org/3.0/userguide/tutorial_java_projects.html
+ */
+
+// Apply the java plugin to add support for Java
+apply plugin: 'java'
+
+// In this section you declare where to find the dependencies of your project
+repositories {
+    // Use 'jcenter' for resolving your dependencies.
+    // You can declare any Maven/Ivy/file repository here.
+    jcenter()
+}
+
+// In this section you declare the dependencies for your production and test code
+dependencies {
+    // The production code uses the SLF4J logging API at compile time
+    compile 'org.slf4j:slf4j-api:1.7.21'
+
+    // Declare the dependency for your favourite test framework you want to use in your tests.
+    // TestNG is also supported by the Gradle Test task. Just change the
+    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
+    // 'test.useTestNG()' to your build script.
+    testCompile 'junit:junit:4.12'
+}
diff --git a/students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties b/students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..5a2cbbeeab
--- /dev/null
+++ b/students/992331664/ood/ood/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 13 11:30:26 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
diff --git a/students/992331664/ood/ood/gradlew b/students/992331664/ood/ood/gradlew
new file mode 100644
index 0000000000..9aa616c273
--- /dev/null
+++ b/students/992331664/ood/ood/gradlew
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/students/992331664/ood/ood/gradlew.bat b/students/992331664/ood/ood/gradlew.bat
new file mode 100644
index 0000000000..f9553162f1
--- /dev/null
+++ b/students/992331664/ood/ood/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/students/992331664/ood/ood/settings.gradle b/students/992331664/ood/ood/settings.gradle
new file mode 100644
index 0000000000..f98d8fb6d8
--- /dev/null
+++ b/students/992331664/ood/ood/settings.gradle
@@ -0,0 +1,19 @@
+/*
+ * This settings file was auto generated by the Gradle buildInit task
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * In a single project build this file can be empty or even removed.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user guide at https://docs.gradle.org/3.0/userguide/multi_project_builds.html
+ */
+
+/*
+// To declare projects as part of a multi-project build use the 'include' method
+include 'shared'
+include 'api'
+include 'services:webservice'
+*/
+
+rootProject.name = 'ood'
diff --git a/students/992331664/ood/ood/src/main/java/Library.java b/students/992331664/ood/ood/src/main/java/Library.java
new file mode 100644
index 0000000000..3a465d0ed5
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/Library.java
@@ -0,0 +1,11 @@
+/*
+ * This Java source file was auto generated by running 'gradle buildInit --type java-library'
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * @author gant, @date 17-6-13 上午11:30
+ */
+public class Library {
+    public boolean someLibraryMethod() {
+        return true;
+    }
+}
diff --git a/students/992331664/ood/ood/src/test/java/LibraryTest.java b/students/992331664/ood/ood/src/test/java/LibraryTest.java
new file mode 100644
index 0000000000..da00ff25a0
--- /dev/null
+++ b/students/992331664/ood/ood/src/test/java/LibraryTest.java
@@ -0,0 +1,15 @@
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/*
+ * This Java source file was auto generated by running 'gradle init --type java-library'
+ * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
+ *
+ * @author gant, @date 17-6-13 上午11:30
+ */
+public class LibraryTest {
+    @Test public void testSomeLibraryMethod() {
+        Library classUnderTest = new Library();
+        assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
+    }
+}

From a98b1029eb11c8f2c136f693677990f67c9e5f8c Mon Sep 17 00:00:00 2001
From: orajavac <oraclegit@126.com>
Date: Tue, 13 Jun 2017 11:41:23 +0800
Subject: [PATCH 035/332] 20170613_1140 readme.md

---
 students/562768642/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/562768642/readme.md

diff --git a/students/562768642/readme.md b/students/562768642/readme.md
new file mode 100644
index 0000000000..97979001f4
--- /dev/null
+++ b/students/562768642/readme.md
@@ -0,0 +1 @@
+最新提交
\ No newline at end of file

From 4a2ca08c0124785c92915d7a9b8b2515161c40a1 Mon Sep 17 00:00:00 2001
From: orajavac <oraclegit@126.com>
Date: Tue, 13 Jun 2017 11:45:39 +0800
Subject: [PATCH 036/332] =?UTF-8?q?20170613=5F1145=20=E6=B5=8B=E8=AF=95?=
 =?UTF-8?q?=E4=B8=80=E4=B8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/562768642/readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/562768642/readme.md b/students/562768642/readme.md
index 97979001f4..f363197d69 100644
--- a/students/562768642/readme.md
+++ b/students/562768642/readme.md
@@ -1 +1 @@
-最新提交
\ No newline at end of file
+最新提交，测试一下
\ No newline at end of file

From 9d909c569f737d238c3272f854a7f374ba96486a Mon Sep 17 00:00:00 2001
From: orajavac <oraclegit@126.com>
Date: Tue, 13 Jun 2017 11:52:56 +0800
Subject: [PATCH 037/332] =?UTF-8?q?20170613=5F1152=20=E6=B5=8B=E8=AF=95?=
 =?UTF-8?q?=E6=8F=90=E4=BA=A4java=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coding2017/ood/srp/Configuration.java     | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java

diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
new file mode 100644
index 0000000000..465fe66675
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.github.orajavac.coding2017.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+}

From 82d9a01304f0be5a824719a6136a9beff425e006 Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Tue, 13 Jun 2017 11:59:35 +0800
Subject: [PATCH 038/332] =?UTF-8?q?=E5=87=86=E5=A4=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../data-structure/src/main/java/Library.java |  11 --
 .../src/test/java/LibraryTest.java            |  15 --
 .../ood/ood/src/main/java/Library.java        |  11 --
 .../com/coderising/ood/srp/Configuration.java |  23 +++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  27 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 162 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../ood/ood/src/test/java/LibraryTest.java    |  15 --
 10 files changed, 243 insertions(+), 52 deletions(-)
 delete mode 100644 students/992331664/data-structure/data-structure/src/main/java/Library.java
 delete mode 100644 students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java
 delete mode 100644 students/992331664/ood/ood/src/main/java/Library.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt
 delete mode 100644 students/992331664/ood/ood/src/test/java/LibraryTest.java

diff --git a/students/992331664/data-structure/data-structure/src/main/java/Library.java b/students/992331664/data-structure/data-structure/src/main/java/Library.java
deleted file mode 100644
index 3a465d0ed5..0000000000
--- a/students/992331664/data-structure/data-structure/src/main/java/Library.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * This Java source file was auto generated by running 'gradle buildInit --type java-library'
- * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
- *
- * @author gant, @date 17-6-13 上午11:30
- */
-public class Library {
-    public boolean someLibraryMethod() {
-        return true;
-    }
-}
diff --git a/students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java b/students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java
deleted file mode 100644
index da00ff25a0..0000000000
--- a/students/992331664/data-structure/data-structure/src/test/java/LibraryTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/*
- * This Java source file was auto generated by running 'gradle init --type java-library'
- * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
- *
- * @author gant, @date 17-6-13 上午11:30
- */
-public class LibraryTest {
-    @Test public void testSomeLibraryMethod() {
-        Library classUnderTest = new Library();
-        assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
-    }
-}
diff --git a/students/992331664/ood/ood/src/main/java/Library.java b/students/992331664/ood/ood/src/main/java/Library.java
deleted file mode 100644
index 3a465d0ed5..0000000000
--- a/students/992331664/ood/ood/src/main/java/Library.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * This Java source file was auto generated by running 'gradle buildInit --type java-library'
- * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
- *
- * @author gant, @date 17-6-13 上午11:30
- */
-public class Library {
-    public boolean someLibraryMethod() {
-        return true;
-    }
-}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/Configuration.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/992331664/ood/ood/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<String,String> 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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/992331664/ood/ood/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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..7597905da1
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,27 @@
+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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/992331664/ood/ood/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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..d98b32e7fc
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,162 @@
+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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/992331664/ood/ood/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/992331664/ood/ood/src/test/java/LibraryTest.java b/students/992331664/ood/ood/src/test/java/LibraryTest.java
deleted file mode 100644
index da00ff25a0..0000000000
--- a/students/992331664/ood/ood/src/test/java/LibraryTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/*
- * This Java source file was auto generated by running 'gradle init --type java-library'
- * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
- *
- * @author gant, @date 17-6-13 上午11:30
- */
-public class LibraryTest {
-    @Test public void testSomeLibraryMethod() {
-        Library classUnderTest = new Library();
-        assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
-    }
-}

From 9b48654b4b35e9cad8f4835869d6161d84fa0968 Mon Sep 17 00:00:00 2001
From: yangdd1205 <yangdd1205@126.com>
Date: Tue, 13 Jun 2017 13:10:44 +0800
Subject: [PATCH 039/332] srp

---
 students/1049843090/ood/build.gradle          |  28 +++
 students/1049843090/ood/settings.gradle       |   2 +
 .../com/coderising/ood/srp/Configuration.java |  23 +++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 181 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 8 files changed, 290 insertions(+)
 create mode 100644 students/1049843090/ood/build.gradle
 create mode 100644 students/1049843090/ood/settings.gradle
 create mode 100644 students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1049843090/ood/build.gradle b/students/1049843090/ood/build.gradle
new file mode 100644
index 0000000000..adca958b35
--- /dev/null
+++ b/students/1049843090/ood/build.gradle
@@ -0,0 +1,28 @@
+group 'com.yangdd'
+version '1.0-SNAPSHOT'
+description = '面向对象设计'
+
+apply plugin: 'java'
+
+sourceCompatibility = 1.8
+
+repositories {
+    mavenLocal()
+    mavenCentral()
+}
+
+//项目布局，下面是Java plugin的默认布局
+sourceSets {
+    main.java.srcDir('src/main/java')
+    main.resources.srcDir('src/main/resources')
+    test.java.srcDir('src/test/java')
+    test.resources.srcDir('src/test/resources')
+}
+
+dependencies {
+    testCompile('junit:junit:4.12')
+}
+
+tasks.withType(JavaCompile) {
+    options.encoding = 'UTF-8'
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/settings.gradle b/students/1049843090/ood/settings.gradle
new file mode 100644
index 0000000000..4ffc61b06a
--- /dev/null
+++ b/students/1049843090/ood/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = 'ood'
+
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..d1209d44e4
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package java.com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..5f4b048948
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package java.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";
+
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..299aa8bc46
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package java.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;
+	}
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..3c75104aeb
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package java.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());
+		
+	}
+
+	
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..1a3d4a6c15
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,181 @@
+package java.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("没有邮件发送");
+
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/product_promotion.txt b/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/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

From a9a1e31781560531d48394707cc8d2e0b0f714b6 Mon Sep 17 00:00:00 2001
From: mddonly <275677638@qq.com>
Date: Tue, 13 Jun 2017 13:20:49 +0800
Subject: [PATCH 040/332] first

---
 students/275677638/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/275677638/README.md

diff --git a/students/275677638/README.md b/students/275677638/README.md
new file mode 100644
index 0000000000..2e9f085533
--- /dev/null
+++ b/students/275677638/README.md
@@ -0,0 +1 @@
+愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去

From 6e88a41a17fd2046eef43d80a38d6043fd3d9ca8 Mon Sep 17 00:00:00 2001
From: mddonly <275677638@qq.com>
Date: Tue, 13 Jun 2017 13:52:05 +0800
Subject: [PATCH 041/332] new line

---
 students/275677638/1.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 students/275677638/1.txt

diff --git a/students/275677638/1.txt b/students/275677638/1.txt
new file mode 100644
index 0000000000..e69de29bb2

From b20f426ea7c341b6fa90b91e072ce67f3179a8da Mon Sep 17 00:00:00 2001
From: mddonly <275677638@qq.com>
Date: Tue, 13 Jun 2017 13:52:45 +0800
Subject: [PATCH 042/332] mod

---
 students/275677638/README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/students/275677638/README.md b/students/275677638/README.md
index 2e9f085533..aa7a31b814 100644
--- a/students/275677638/README.md
+++ b/students/275677638/README.md
@@ -1 +1,3 @@
 愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去
+
+diff

From 35fd5945ccc8d665bafca3c0208dccbc248cb2a1 Mon Sep 17 00:00:00 2001
From: orajavac <oraclegit@126.com>
Date: Tue, 13 Jun 2017 15:13:18 +0800
Subject: [PATCH 043/332] =?UTF-8?q?20170613=5F1513=20=E5=88=A0=E9=99=A4rea?=
 =?UTF-8?q?dme.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/562768642/readme.md                  |   1 -
 .../coding2017/ood/srp/ConfigurationKeys.java |   9 +
 .../orajavac/coding2017/ood/srp/DBUtil.java   |  25 +++
 .../orajavac/coding2017/ood/srp/MailUtil.java |  18 ++
 .../coding2017/ood/srp/PromotionMail.java     | 199 ++++++++++++++++++
 .../coding2017/ood/srp/product_promotion.txt  |   4 +
 6 files changed, 255 insertions(+), 1 deletion(-)
 delete mode 100644 students/562768642/readme.md
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/product_promotion.txt

diff --git a/students/562768642/readme.md b/students/562768642/readme.md
deleted file mode 100644
index f363197d69..0000000000
--- a/students/562768642/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-最新提交，测试一下
\ No newline at end of file
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..94eb56e6e4
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.github.orajavac.coding2017.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/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..c4d5f8a65d
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.github.orajavac.coding2017.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/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..c9614ebfc5
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package com.github.orajavac.coding2017.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/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..db982d9f34
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
@@ -0,0 +1,199 @@
+package com.github.orajavac.coding2017.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/562768642/src/com/github/orajavac/coding2017/ood/srp/product_promotion.txt b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/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

From f022b287b3e4bc9472649078496f1a4b24d23fbb Mon Sep 17 00:00:00 2001
From: guozheng5 <840145455@qq.com>
Date: Tue, 13 Jun 2017 15:15:56 +0800
Subject: [PATCH 044/332] test

---
 students/840145455/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/840145455/readme.md

diff --git a/students/840145455/readme.md b/students/840145455/readme.md
new file mode 100644
index 0000000000..6afb392c20
--- /dev/null
+++ b/students/840145455/readme.md
@@ -0,0 +1 @@
+﻿愿意自荐代码的，可以每个人一个目录 以自己的QQ号命名 ，把自荐的代码放到里边去

From 57ec996333fbabdd4fc210f3a6701b96941e8d0f Mon Sep 17 00:00:00 2001
From: orajavac <oraclegit@126.com>
Date: Tue, 13 Jun 2017 15:17:51 +0800
Subject: [PATCH 045/332] =?UTF-8?q?20170613=5F1517=20=E6=B5=8B=E8=AF=95?=
 =?UTF-8?q?=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/github/orajavac/coding2017/ood/srp/Configuration.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
index 465fe66675..bf9902bf99 100644
--- a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java
@@ -9,7 +9,7 @@ public class Configuration {
 		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

From eb26a759ece77b182554690ec3f6bb7f44b8c94c Mon Sep 17 00:00:00 2001
From: yuyingzhi <yuyz@mdf.com>
Date: Tue, 13 Jun 2017 15:38:15 +0800
Subject: [PATCH 046/332] first ood-assignment finish

---
 .../first_OOP_homework/ood-assignment/pom.xml |  32 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  24 ++++
 .../java/com/coderising/ood/srp/Email.java    |  80 ++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  15 +++
 .../java/com/coderising/ood/srp/Message.java  |  19 ++++
 .../java/com/coderising/ood/srp/Product.java  |  43 ++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 103 ++++++++++++++++++
 .../java/com/coderising/ood/srp/TestMain.java |  16 +++
 .../java/com/coderising/ood/srp/User.java     |  21 ++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../81681981/first_OOP_homework/readme.txt    |  11 ++
 12 files changed, 377 insertions(+)
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/pom.xml
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
 create mode 100644 students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/81681981/first_OOP_homework/readme.txt

diff --git a/students/81681981/first_OOP_homework/ood-assignment/pom.xml b/students/81681981/first_OOP_homework/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/81681981/first_OOP_homework/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/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..0af0155e33
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<User>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setUserName("User" + i);
+			user.setMail(i+"aa@bb.com");		
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 0000000000..b6d62acbeb
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,80 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+/*
+ * email
+ */
+
+public class Email {
+	
+	static Map<String,String> 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");
+	}
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	protected String subject = null;
+	protected String message = null;
+	
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+	
+	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 fromAddress;
+	}
+
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+	protected void setSMTPHost() 
+	{
+		smtpHost = this.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+
+	
+	protected void setAltSMTPHost() 
+	{
+		altSmtpHost = this.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
+
+	
+	protected void setFromAddress() 
+	{
+			fromAddress = this.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..f0adff0ab8
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp;
+
+
+public class MailUtil {
+	public static void sendEmail(String toAddress,Message mes,boolean debug) {
+		Email email = new Email();
+				//假装发了一封邮件
+				StringBuilder buffer = new StringBuilder();
+				buffer.append("From:").append(email.getFromAddress()).append("\n");
+				buffer.append("To:").append(toAddress).append("\n");
+				buffer.append("Subject:").append(mes.getSubject()).append("\n");
+				buffer.append("Content:").append(mes.getMessageDesc()).append("\n");
+				System.out.println(buffer.toString());
+			}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 0000000000..59d916286b
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp;
+
+public class Message {
+	private String subject;
+	private String messageDesc;
+	public String getSubject() {
+		return subject;
+	}
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+	public String getMessageDesc() {
+		return messageDesc;
+	}
+	public void setMessageDesc(String messageDesc) {
+		this.messageDesc = messageDesc;
+	}
+	
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..236f61d132
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Product {
+	
+	protected String productID = null;
+	protected String productDesc = null;
+	
+	protected void setProductID(String productID) 
+	{ 
+		this.productID = productID; 
+		
+	} 
+
+	protected String getproductID() 
+	{
+		return productID; 
+	} 
+
+	public String getProductDesc() {
+		return productDesc;
+	}
+
+	public void setProductDesc(String productDesc) {
+		this.productDesc = productDesc;
+	}
+
+	public String getProductID() {
+		return productID;
+	}
+
+	//获得该产品的所有订阅者
+	protected List<User> getLoadQuery(String productID){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		System.out.println("loadQuery set");
+		return  DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..b0641c9789
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,103 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PromotionMail {
+
+	protected String sendMailQuery = null;
+
+	protected String toAddress = null;
+
+	protected String subject = null;
+	protected String message = null;
+	/**
+	 * 1.读产品信息 2.获取发送地址 3.组织内容 4.发送
+	 * 
+	 * */
+	// 1.获取产品信息
+	protected List<Product> readFile(File file) throws IOException // @02C
+	{
+		List<Product> productlist = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			productlist.add(product);
+			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 productlist;
+	}
+
+	// 获取产品信息
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+		// 读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		List<Product> productlist = readFile(file);
+		if (productlist != null) {
+			for (int i = 0; i < productlist.size(); i++) {
+				Product product = (Product) productlist.get(i);
+				if(product != null){
+					this.consistAndSend(product);
+				}
+			}
+
+		}
+	}
+
+	//获取某产品的所有订阅用户，并推送对应内容
+	public void consistAndSend(Product product){
+		List<User> toAddressList = product.getLoadQuery(product
+				.getproductID());// 获取该产品的订阅者
+		if (toAddressList != null){
+			for (int j = 0; j < toAddressList.size(); j++) {
+				User user = (User) toAddressList.get(j);
+				Message mes = this.setMessage(user.getUserName(),
+						product.getProductDesc());
+				this.sendEMails(true, mes, user.getMail());
+			}
+		}
+	}
+	
+	
+	protected Message setMessage(String name, String productDesc){
+		Message mes = new Message();
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 " + name + ", 您关注的产品 " + productDesc
+				+ " 降价了，欢迎购买!";
+		mes.setSubject(subject);
+		mes.setMessageDesc(message);
+		return mes;
+	}
+
+	protected void sendEMails(boolean debug, Message mes, String toAddress){
+		System.out.println("开始发送邮件");
+		if (null != toAddress && !toAddress.equals("")) {
+			try{
+			 MailUtil.sendEmail(toAddress, mes, debug);
+		
+			}catch(Exception e){
+				
+			}
+		} else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java
new file mode 100644
index 0000000000..88b43c18ac
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/TestMain.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class TestMain {
+
+	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);
+		
+
+	}
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..cb03ec5d2c
--- /dev/null
+++ b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class User {
+	private String userName;
+	private String mail;
+	public String getUserName() {
+		return userName;
+	}
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+	public String getMail() {
+		return mail;
+	}
+	public void setMail(String mail) {
+		this.mail = mail;
+	}
+	
+}
diff --git a/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/81681981/first_OOP_homework/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/81681981/first_OOP_homework/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/81681981/first_OOP_homework/readme.txt b/students/81681981/first_OOP_homework/readme.txt
new file mode 100644
index 0000000000..0ddf999fd4
--- /dev/null
+++ b/students/81681981/first_OOP_homework/readme.txt
@@ -0,0 +1,11 @@
+ҵ˵
+
+༰
+1.conifgurationKeys.java ʼͷϢ
+2.User.java  ӦûϢû䣩 
+3.޸DBUtil.java ݿ࣬Ѽֵ ޸ΪUser
+4.Email.java άʼ͵ǰϢʼ⣬ʼݣsmtphost,altSmtpHost,fromAddress,subject,message
+5.Product.java άƷϢû
+6.Message.javaάҪ͵
+7.޸PromotionMail.java ܣȡƷϢ֯Ҫ͵ݷװΪMessage󣬻ȡòƷӦĶûMailUtil.java ʼ
+8.MailUtil.java 
\ No newline at end of file

From 24e2243834b12893c5fd68579f66cdb3cee4ee86 Mon Sep 17 00:00:00 2001
From: yangdd1205 <yangdd1205@126.com>
Date: Tue, 13 Jun 2017 16:24:13 +0800
Subject: [PATCH 047/332] update package name

---
 .../{java => }/com/coderising/ood/srp/Configuration.java     | 2 +-
 .../{java => }/com/coderising/ood/srp/ConfigurationKeys.java | 2 +-
 .../main/java/{java => }/com/coderising/ood/srp/DBUtil.java  | 2 +-
 .../java/{java => }/com/coderising/ood/srp/MailUtil.java     | 2 +-
 .../{java => }/com/coderising/ood/srp/PromotionMail.java     | 5 ++---
 .../{java => }/com/coderising/ood/srp/product_promotion.txt  | 0
 6 files changed, 6 insertions(+), 7 deletions(-)
 rename students/1049843090/ood/src/main/java/{java => }/com/coderising/ood/srp/Configuration.java (93%)
 rename students/1049843090/ood/src/main/java/{java => }/com/coderising/ood/srp/ConfigurationKeys.java (85%)
 rename students/1049843090/ood/src/main/java/{java => }/com/coderising/ood/srp/DBUtil.java (92%)
 rename students/1049843090/ood/src/main/java/{java => }/com/coderising/ood/srp/MailUtil.java (93%)
 rename students/1049843090/ood/src/main/java/{java => }/com/coderising/ood/srp/PromotionMail.java (96%)
 rename students/1049843090/ood/src/main/java/{java => }/com/coderising/ood/srp/product_promotion.txt (100%)

diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/Configuration.java
similarity index 93%
rename from students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java
rename to students/1049843090/ood/src/main/java/com/coderising/ood/srp/Configuration.java
index d1209d44e4..70759b547a 100644
--- a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/Configuration.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -1,4 +1,4 @@
-package java.com.coderising.ood.srp;
+package com.coderising.ood.srp;
 import java.util.HashMap;
 import java.util.Map;
 
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
similarity index 85%
rename from students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/1049843090/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
index 5f4b048948..c57f37c4ce 100644
--- a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -1,4 +1,4 @@
-package java.com.coderising.ood.srp;
+package com.coderising.ood.srp;
 
 public class ConfigurationKeys {
 
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
similarity index 92%
rename from students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java
rename to students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
index 299aa8bc46..4b8452ded2 100644
--- a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -1,4 +1,4 @@
-package java.com.coderising.ood.srp;
+package com.coderising.ood.srp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
similarity index 93%
rename from students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java
rename to students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
index 3c75104aeb..9e77ef1968 100644
--- a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -1,4 +1,4 @@
-package java.com.coderising.ood.srp;
+package com.coderising.ood.srp;
 
 public class MailUtil {
 
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
similarity index 96%
rename from students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java
rename to students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 1a3d4a6c15..55c1f2558c 100644
--- a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,10 +1,9 @@
-package java.com.coderising.ood.srp;
+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;
@@ -34,7 +33,7 @@ public class PromotionMail {
 
     public static void main(String[] args) throws Exception {
 
-        File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+        File f = new File("E:\\git\\coding2017-Q2\\students\\1049843090\\ood\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
         boolean emailDebug = false;
 
         PromotionMail pe = new PromotionMail(f, emailDebug);
diff --git a/students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/product_promotion.txt b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt
similarity index 100%
rename from students/1049843090/ood/src/main/java/java/com/coderising/ood/srp/product_promotion.txt
rename to students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt

From 8fbe00cb9afb8af880d8185618f0ee2869bc2087 Mon Sep 17 00:00:00 2001
From: gaohuan30 <threadgaohuan@gmail.com>
Date: Tue, 13 Jun 2017 16:41:46 +0800
Subject: [PATCH 048/332] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/862726639/pom.xml                    |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/862726639/pom.xml
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/862726639/pom.xml b/students/862726639/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/862726639/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java b/students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/862726639/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<String,String> 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/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/862726639/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/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/862726639/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/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/862726639/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/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/862726639/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/862726639/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/862726639/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/862726639/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

From f0d88f2a1d087778a09f049f73e4041e92bcee4e Mon Sep 17 00:00:00 2001
From: Xujie <jie.xu@coer-scnu.org>
Date: Tue, 13 Jun 2017 17:19:22 +0800
Subject: [PATCH 049/332] =?UTF-8?q?=E5=88=9B=E5=BB=BA617314917=E6=96=87?=
 =?UTF-8?q?=E4=BB=B6=E5=A4=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

创建文件夹，并添加README.md
---
 students/617314917/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/617314917/readme.md

diff --git a/students/617314917/readme.md b/students/617314917/readme.md
new file mode 100644
index 0000000000..d620ba5b0a
--- /dev/null
+++ b/students/617314917/readme.md
@@ -0,0 +1 @@
+这是“广州-许洁”提交代码的qq命名文件夹。
\ No newline at end of file

From 24f5e9c38be98d6d36157e595b95ca580de9c119 Mon Sep 17 00:00:00 2001
From: Horace He <horacehxw@gmail.com>
Date: Tue, 13 Jun 2017 18:51:26 +0800
Subject: [PATCH 050/332] first commit homework

---
 students/108847244/ood/ood-assignment/pom.xml |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/108847244/ood/ood-assignment/pom.xml
 create mode 100644 students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/108847244/ood/ood-assignment/pom.xml b/students/108847244/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/108847244/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/108847244/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<String,String> 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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/108847244/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/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/108847244/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/108847244/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

From e51fcd95b99647b826623c2dfc9832cf6c8b2c7f Mon Sep 17 00:00:00 2001
From: KevinSmile <kevinwang013@hotmail.com>
Date: Tue, 13 Jun 2017 19:29:02 +0800
Subject: [PATCH 051/332] create readme

---
 students/279069328/readme.md | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 students/279069328/readme.md

diff --git a/students/279069328/readme.md b/students/279069328/readme.md
new file mode 100644
index 0000000000..ce14d38509
--- /dev/null
+++ b/students/279069328/readme.md
@@ -0,0 +1,3 @@
+# Coding 2017
+
+@KevinSmile
\ No newline at end of file

From 6ea33cd859287af627c1c8cf61ea0cbe1e005a64 Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Tue, 13 Jun 2017 21:35:13 +0800
Subject: [PATCH 052/332] =?UTF-8?q?optimize=20promotioMail=20v1=20todo=20?=
 =?UTF-8?q?=E5=A3=AE=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ood/srp/optimize/ProductParser.java       |  8 +-
 .../ood/srp/optimize/PromotionMailApp.java    | 15 +++-
 .../ood/srp/optimize/PromotionMailClaim.java  | 87 ++++++++++++++++++-
 .../optimize/PromotionMailableBehavior.java   | 29 ++++++-
 .../ood/srp/optimize/SmptPropeties.java       | 30 ++++++-
 .../com/coderising/ood/srp/optimize/User.java | 16 ++++
 .../ood/srp/optimize/UserService.java         | 12 ++-
 7 files changed, 177 insertions(+), 20 deletions(-)

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
index dd3198c42d..0c1cbba2e4 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
@@ -11,13 +11,7 @@
  */
 public class ProductParser {
 
-    private String productClassPath;
-
-    public void setProductClassPath(String productClassPath) {
-        this.productClassPath = productClassPath;
-    }
-
-    public List<Product> parse() {
+    public List<Product> parse(String productClassPath) {
         List<String> stringList = readToStringList(openStream(productClassPath));
         return stringList.stream()
                 .map(String::trim)
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
index 8b9061e7e5..ce49ae101b 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
@@ -7,9 +7,16 @@
  */
 public class PromotionMailApp {
 
-    public static void main(String args[]){
-        ProductParser productParser = new ProductParser();
-        productParser.setProductClassPath("product_promotion.txt");
-        List<Product> products = productParser.parse();
+    public static void main(String args[]) {
+        List<Product> products = new ProductParser().parse("product_promotion.txt");
+
+        List<User> users = new UserService().loadMailingList();
+
+        List<PromotionMailClaim> promotionMailClaims = new PromotionMailClaim()
+                .load(products, users, new SmptPropeties(), true);
+
+        new PromotionMailableBehavior().send(promotionMailClaims);
+
     }
+
 }
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
index 06d447b817..7d2011a5df 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
@@ -1,5 +1,8 @@
 package com.coderising.ood.srp.optimize;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Created by luoziyihao on 6/12/17.
  */
@@ -9,9 +12,87 @@ public class PromotionMailClaim {
     private String subject;
     private String message;
     private String smtpHost;
-    private String debug;
+    private String altSmtpHost;
+    private Boolean mailDebug;
+
+    private PromotionMailClaim init(Product product, User user, SmptPropeties smptPropeties, Boolean mailDebug) {
+        this.toAddress = user.getEmail();
+        this.fromAddress = smptPropeties.getFromAddress();
+        this.subject = "您关注的产品降价了";
+        this.message = "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        this.smtpHost = smptPropeties.getSmtpHost();
+        this.altSmtpHost = smptPropeties.getAltSmtpHost();
+        this.mailDebug = mailDebug;
+        return this;
+    }
+
+    public List<PromotionMailClaim> load(List<Product> products, List<User> users, SmptPropeties smptPropeties
+            , boolean mailDebug) {
+        List<PromotionMailClaim> promotionMailClaims = new ArrayList<>();
+        for (Product product : products) {
+            for (User user : users) {
+                PromotionMailClaim promotionMailClaim = new PromotionMailClaim()
+                        .init(product, user, smptPropeties, true);
+                promotionMailClaims.add(promotionMailClaim);
+            }
+        }
+        return promotionMailClaims;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public void setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+    }
+
+    public Boolean getMailDebug() {
+        return mailDebug;
+    }
+
+    public void setMailDebug(Boolean mailDebug) {
+        this.mailDebug = mailDebug;
+    }
+
+    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 setMessage(Product product, User user) {
-        this.message = null;
+    public void setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
     }
+
 }
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
index 548f69722a..39321d554a 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
@@ -7,7 +7,34 @@
  */
 public class PromotionMailableBehavior {
 
-    void send(List<PromotionMailClaim> emailSendClaimList) {
+    public void send(List<PromotionMailClaim> emailSendClaimList) {
+        for (PromotionMailClaim promotionMailClaim : emailSendClaimList) {
+            sendEmailForOneClaim(promotionMailClaim);
+        }
+    }
+
+    private void sendEmailForOneClaim(PromotionMailClaim promotionMailClaim) {
+        System.out.println("开始发送邮件");
+
+        try {
+            doSendMail(promotionMailClaim);
+        } catch (Exception e) {
+            promotionMailClaim.setSmtpHost(promotionMailClaim.getAltSmtpHost());
+            try {
+                doSendMail(promotionMailClaim);
+            } catch (Exception e1) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e.getMessage());
+            }
+        }
+    }
 
+    private void doSendMail(PromotionMailClaim promotionMailClaim) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(promotionMailClaim.getFromAddress()).append("\n");
+        buffer.append("To:").append(promotionMailClaim.getToAddress()).append("\n");
+        buffer.append("Subject:").append(promotionMailClaim.getSubject()).append("\n");
+        buffer.append("Content:").append(promotionMailClaim.getMessage()).append("\n");
+        System.out.println(buffer.toString());
     }
 }
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
index fd6d7be8d7..affdf946fd 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
@@ -4,7 +4,31 @@
  * Created by luoziyihao on 6/12/17.
  */
 public class SmptPropeties {
-    private String smtpHost;
-    private String altSmtpHost;
-    private String fromAddress;
+    private String smtpHost =  "smtp.server";;
+    private String altSmtpHost = "smtp1.163.com";
+    private String fromAddress = " admin@company.com";
+
+    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 fromAddress;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
 }
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
index 45f7739a7b..b7ec110914 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
@@ -6,4 +6,20 @@
 public class User {
     private String name;
     private String 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/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
index 5178489e0f..fe5317cc55 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
@@ -1,5 +1,6 @@
 package com.coderising.ood.srp.optimize;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -7,7 +8,14 @@
  */
 public class UserService {
 
-    List<User> loadMailingList(){
-        return null;
+    List<User> loadMailingList() {
+        List<User> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            User user = new User();
+            user.setName("User" + i);
+            user.setEmail("aa@bb.com");
+            userList.add(user);
+        }
+        return userList;
     }
 }

From 93d655df3e04ebed259db9d8802cc36f26b079dc Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Tue, 13 Jun 2017 21:36:23 +0800
Subject: [PATCH 053/332] com

---
 .../coderising/ood/srp/optimize/PromotionMailableBehavior.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
index 39321d554a..e350b1f735 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
@@ -19,8 +19,8 @@ private void sendEmailForOneClaim(PromotionMailClaim promotionMailClaim) {
         try {
             doSendMail(promotionMailClaim);
         } catch (Exception e) {
-            promotionMailClaim.setSmtpHost(promotionMailClaim.getAltSmtpHost());
             try {
+                promotionMailClaim.setSmtpHost(promotionMailClaim.getAltSmtpHost());
                 doSendMail(promotionMailClaim);
             } catch (Exception e1) {
                 System.out.println("通过备用 SMTP服务器发送邮件失败: " + e.getMessage());

From 9fae307f75dfbab4f191c4169f58a1f0acc601bf Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Tue, 13 Jun 2017 21:39:00 +0800
Subject: [PATCH 054/332] com

---
 .../com/coderising/ood/srp/optimize/PromotionMailClaim.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
index 7d2011a5df..c1bd087af7 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
@@ -32,7 +32,7 @@ public List<PromotionMailClaim> load(List<Product> products, List<User> users, S
         for (Product product : products) {
             for (User user : users) {
                 PromotionMailClaim promotionMailClaim = new PromotionMailClaim()
-                        .init(product, user, smptPropeties, true);
+                        .init(product, user, smptPropeties, mailDebug);
                 promotionMailClaims.add(promotionMailClaim);
             }
         }

From d20173c84894798cd630715afd261f14e1b7f919 Mon Sep 17 00:00:00 2001
From: luoziyihao <wangyiraoxiang@163.com>
Date: Tue, 13 Jun 2017 21:41:51 +0800
Subject: [PATCH 055/332] add comment

---
 .../src/main/java/com/coderising/ood/srp/optimize/Product.java | 3 +--
 .../java/com/coderising/ood/srp/optimize/ProductParser.java    | 1 +
 .../java/com/coderising/ood/srp/optimize/PromotionMailApp.java | 1 +
 .../com/coderising/ood/srp/optimize/PromotionMailClaim.java    | 1 +
 .../coderising/ood/srp/optimize/PromotionMailableBehavior.java | 1 +
 .../java/com/coderising/ood/srp/optimize/SmptPropeties.java    | 1 +
 .../src/main/java/com/coderising/ood/srp/optimize/User.java    | 1 +
 .../main/java/com/coderising/ood/srp/optimize/UserService.java | 1 +
 8 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
index ffb440712f..3aef295085 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java
@@ -1,8 +1,7 @@
 package com.coderising.ood.srp.optimize;
 
-import lombok.Setter;
-
 /**
+ * 产品对象
  * Created by luoziyihao on 6/12/17.
  */
 
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
index 0c1cbba2e4..080c999ffa 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java
@@ -7,6 +7,7 @@
 import static com.coding.common.util.IOUtils2.readToStringList;
 
 /**
+ * 产品文件解析器
  * Created by luoziyihao on 6/12/17.
  */
 public class ProductParser {
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
index ce49ae101b..6ee832307a 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java
@@ -3,6 +3,7 @@
 import java.util.List;
 
 /**
+ * main 函数启动类
  * Created by luoziyihao on 6/12/17.
  */
 public class PromotionMailApp {
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
index c1bd087af7..189b3ced17 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java
@@ -4,6 +4,7 @@
 import java.util.List;
 
 /**
+ * 发发送邮件的必要参数 vo
  * Created by luoziyihao on 6/12/17.
  */
 public class PromotionMailClaim {
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
index e350b1f735..ad37998e45 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java
@@ -3,6 +3,7 @@
 import java.util.List;
 
 /**
+ * 发邮件的行为类
  * Created by luoziyihao on 6/12/17.
  */
 public class PromotionMailableBehavior {
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
index affdf946fd..c6664fafc3 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java
@@ -1,6 +1,7 @@
 package com.coderising.ood.srp.optimize;
 
 /**
+ * 邮件服务器配置类
  * Created by luoziyihao on 6/12/17.
  */
 public class SmptPropeties {
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
index b7ec110914..996efadbb6 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java
@@ -1,6 +1,7 @@
 package com.coderising.ood.srp.optimize;
 
 /**
+ * 用户类
  * Created by luoziyihao on 6/12/17.
  */
 public class User {
diff --git a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
index fe5317cc55..f5da2d3908 100644
--- a/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
+++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java
@@ -4,6 +4,7 @@
 import java.util.List;
 
 /**
+ * 用户service, 管理用户的数据
  * Created by luoziyihao on 6/12/17.
  */
 public class UserService {

From ca957fc96db0c1d27032225cbfaf4bbba3bf3179 Mon Sep 17 00:00:00 2001
From: liyang34 <liyang34@58ganji.com>
Date: Tue, 13 Jun 2017 22:04:25 +0800
Subject: [PATCH 056/332] =?UTF-8?q?360682644=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/360682644/ood-assignment/pom.xml     | 32 +++++++
 .../com/coderising/ood/srp/Configuration.java | 25 ++++++
 .../java/com/coderising/ood/srp/DBUtil.java   | 24 +++++
 .../com/coderising/ood/srp/IMailable.java     | 10 +++
 .../com/coderising/ood/srp/MailHosts.java     | 23 +++++
 .../com/coderising/ood/srp/MailReceiver.java  | 38 ++++++++
 .../com/coderising/ood/srp/MailSender.java    | 87 +++++++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 21 +++++
 .../java/com/coderising/ood/srp/Product.java  | 28 ++++++
 .../coderising/ood/srp/ReceiverService.java   | 24 +++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 11 files changed, 316 insertions(+)
 create mode 100644 students/360682644/ood-assignment/pom.xml
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java
 create mode 100644 students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/360682644/ood-assignment/pom.xml b/students/360682644/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/360682644/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..e17b664d48
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	public static final String EMAIL_ADMIN = "email.admin";
+	private Map<String,String> configurations = new HashMap();
+	private static Configuration configuration = new Configuration();
+	{
+		configurations.put(EMAIL_ADMIN, "admin@company.com");
+	}
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		return configurations.get(key);
+	}
+
+	public static Configuration getInstance(){
+		return configuration;
+	}
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..e6f0ca21cb
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<MailReceiver> query(String sql, Product product){
+		List<MailReceiver> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			MailReceiver receiver = new MailReceiver();
+			receiver.setName("User" + i);
+			receiver.setEmail("aa@bb.com");
+			receiver.setMessage(product);
+			receiver.setSubject(product);
+			userList.add(receiver);
+		}
+		return userList;
+	}
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java
new file mode 100644
index 0000000000..019a96394e
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/IMailable.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public interface IMailable {
+
+    String toEmailText(String... params);
+    String toEmailSubject(String... params);
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java
new file mode 100644
index 0000000000..72a39d0601
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailHosts.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class MailHosts {
+
+    private List<String> hosts = new ArrayList();
+    {
+        hosts.add("smtp.163.com");
+        hosts.add("smtp1.163.com");
+    }
+
+    public List<String> getHosts() {
+        return hosts;
+    }
+    public void setHosts(List<String> hosts) {
+        this.hosts = hosts;
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java
new file mode 100644
index 0000000000..250f594a89
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailReceiver.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class MailReceiver {
+    private String name;
+    private String email;
+    private String message;
+    private String subject;
+    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 String getMessage() {
+        return message;
+    }
+    public void setMessage(IMailable IMailable) {
+        message = IMailable.toEmailText(name);
+    }
+    public void setSubject(IMailable IMailable) {
+        subject = IMailable.toEmailSubject(null);
+    }
+    public void setMessage(String message) {
+        this.message = message;
+    }
+    public String getSubject() {
+        return subject;
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java
new file mode 100644
index 0000000000..4d22aff9c5
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailSender.java
@@ -0,0 +1,87 @@
+package com.coderising.ood.srp;
+
+import org.junit.Assert;
+
+import java.io.*;
+import java.util.*;
+
+public class MailSender {
+
+    protected MailHosts hosts = null;
+    protected String fromAddress = null;
+    protected InputStream is = null;
+    protected List<MailReceiver> receivers = null;
+    private Configuration config = Configuration.getInstance();
+
+    public void init() throws Exception {
+        setSMTPHost();
+        setFromAddress();
+    }
+
+    protected MailSender setEmailInput(InputStream is) throws IOException {
+        this.is = is;
+        return this;
+    }
+
+    protected MailSender setReceiver() throws IOException {
+        Assert.assertNotNull("is cannot be null", is);
+        List<Product> products = read(is);
+        receivers = new ArrayList();
+        for (Product product : products) {
+            receivers.addAll(ReceiverService.getInstance().loadMailingList(product));
+        }
+        return this;
+    }
+
+    protected void setSMTPHost() {
+        hosts = new MailHosts();
+    }
+
+    protected void setFromAddress() {
+        fromAddress = config.getProperty(Configuration.EMAIL_ADMIN);
+    }
+
+    protected List<Product> read(InputStream is) throws IOException {
+        BufferedReader br = null;
+        List<Product> products = new ArrayList();
+        try {
+            br = new BufferedReader(new InputStreamReader(is));
+            String temp;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+                products.add(product);
+                System.out.println("产品ID = " + product.getProductID() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+            }
+        } catch (IOException e) {
+            throw e;
+        } finally {
+            br.close();
+        }
+        return products;
+    }
+
+    protected void send() throws IOException {
+        System.out.println("开始发送邮件");
+        if (receivers == null || receivers.isEmpty()) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+        for (MailReceiver receiver : receivers) {
+            MailUtil.sendEmail(receiver.getEmail(), fromAddress, receiver.getSubject(), receiver.getMessage(), hosts);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("D:\\coding2017\\students\\360682644\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        MailSender pe = new MailSender();
+        pe.init();
+        pe.setEmailInput(new FileInputStream(f))
+                .setReceiver()
+                .send();
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..2d4545cf06
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, MailHosts smtpHosts) {
+		for(String hosts : smtpHosts.getHosts()) {
+			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());
+				break;
+			} catch (Exception e) {
+				System.err.println(String.format("通过SMTP服务器(%s)发送邮件失败: %s", hosts,e.getMessage()));
+			}
+		}
+	}
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..51dc9ea460
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class Product implements IMailable {
+    private String productID = null;
+    private String productDesc = null;
+
+    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;
+    }
+    public String toEmailText(String... params) {
+        return "尊敬的 "+ params[0] +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
+    }
+    public String toEmailSubject(String... params) {
+        return "您关注的产品降价了";
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java
new file mode 100644
index 0000000000..f5ea863389
--- /dev/null
+++ b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/ReceiverService.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by 360682644 on 2017/6/13.
+ */
+public class ReceiverService {
+
+    private final static ReceiverService service = new ReceiverService();
+    public static ReceiverService getInstance(){return service;}
+
+    public List<MailReceiver> loadMailingList(Product product){
+        return DBUtil.query(getLoadQuery(), product);
+    }
+
+    public String getLoadQuery(){
+        String query = "Select name from subscriptions "
+                + "where product_id= ? "
+                + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return query;
+    }
+}
diff --git a/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/360682644/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/360682644/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

From 2c7ddedf6e6a85f68d6624171b6b3df93e5f2be7 Mon Sep 17 00:00:00 2001
From: EightWolf <675554906@qq.com>
Date: Tue, 13 Jun 2017 22:04:55 +0800
Subject: [PATCH 057/332] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=20=EF=BC=9A=E7=AC=AC?=
 =?UTF-8?q?=E4=B8=80=E6=AC=A1=E6=80=9D=E8=80=83=20=20=20=E8=BF=98=E6=9C=89?=
 =?UTF-8?q?=E4=B8=8D=E8=B6=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/lilei/com/cn/Configuration.java       |  27 +++++
 .../src/lilei/com/cn/ConfigurationKeys.java   |  13 +++
 .../675554906/src/lilei/com/cn/DBUtil.java    |  29 +++++
 .../src/lilei/com/cn/MailAssemble.java        | 100 ++++++++++++++++++
 .../675554906/src/lilei/com/cn/MailUtil.java  |  60 +++++++++++
 .../src/lilei/com/cn/PromotionMail.java       |  29 +++++
 .../675554906/src/lilei/com/cn/ReadFile.java  |  33 ++++++
 .../src/lilei/com/cn/product_promotion.txt    |   4 +
 8 files changed, 295 insertions(+)
 create mode 100644 students/675554906/src/lilei/com/cn/Configuration.java
 create mode 100644 students/675554906/src/lilei/com/cn/ConfigurationKeys.java
 create mode 100644 students/675554906/src/lilei/com/cn/DBUtil.java
 create mode 100644 students/675554906/src/lilei/com/cn/MailAssemble.java
 create mode 100644 students/675554906/src/lilei/com/cn/MailUtil.java
 create mode 100644 students/675554906/src/lilei/com/cn/PromotionMail.java
 create mode 100644 students/675554906/src/lilei/com/cn/ReadFile.java
 create mode 100644 students/675554906/src/lilei/com/cn/product_promotion.txt

diff --git a/students/675554906/src/lilei/com/cn/Configuration.java b/students/675554906/src/lilei/com/cn/Configuration.java
new file mode 100644
index 0000000000..c8020595fd
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/Configuration.java
@@ -0,0 +1,27 @@
+package lilei.com.cn;
+import java.util.HashMap;
+import java.util.Map;
+/**
+ * Configuration 读取/获取配置信息类
+ * 唯一能引起此类变化的是配置文件的改变
+ * 
+ * */
+public class Configuration {
+
+	static Map<String,String> 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/675554906/src/lilei/com/cn/ConfigurationKeys.java b/students/675554906/src/lilei/com/cn/ConfigurationKeys.java
new file mode 100644
index 0000000000..ddcaeb4def
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/ConfigurationKeys.java
@@ -0,0 +1,13 @@
+package lilei.com.cn;
+/**
+ * ConfigurationKeys 配置信息定义类
+ * 个人理解，唯一能引发变化的是“需求”比如，要增加一个KEY
+ * 
+ * */
+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/675554906/src/lilei/com/cn/DBUtil.java b/students/675554906/src/lilei/com/cn/DBUtil.java
new file mode 100644
index 0000000000..9ae43cc7dc
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/DBUtil.java
@@ -0,0 +1,29 @@
+package lilei.com.cn;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+ /**
+  * DBUtil 连接数据库，获取数据
+  * 个人理解，此类只是负责数据库的连接，和数据的读取，存储，修改
+  * 
+  * */
+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/675554906/src/lilei/com/cn/MailAssemble.java b/students/675554906/src/lilei/com/cn/MailAssemble.java
new file mode 100644
index 0000000000..8c17e5f3bf
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/MailAssemble.java
@@ -0,0 +1,100 @@
+package lilei.com.cn;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+/**
+ * MailAssemble 组装邮件类
+ * 个人理解， 此类的职责是组装邮件，而邮件是根据Configuration(配置信息类)、ReadFile(读取信息类)来组成的，这两个类也是引起变化的因素
+ * 
+ * */
+public class MailAssemble {
+	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 = new Configuration(); 
+	private static ReadFile rf = new ReadFile();;
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	//组装信息
+	public void assembleMail() throws Exception{
+		String data[] = rf.readFile();
+		setProductID(data[0]); 
+		setProductDesc(data[1]); 
+		setSMTPHost();
+		setAltSMTPHost(); 
+		setFromAddress();
+		setLoadQuery();
+	}
+	
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+	
+	protected void configureEMail(HashMap userInfo) throws IOException 
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) 
+			setMessage(userInfo); 
+	}
+	
+	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 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); 
+
+	}
+	
+	private void setProductDesc(String desc) {
+		this.productDesc = desc;		
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/MailUtil.java b/students/675554906/src/lilei/com/cn/MailUtil.java
new file mode 100644
index 0000000000..2bd129dc75
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/MailUtil.java
@@ -0,0 +1,60 @@
+package lilei.com.cn;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * MailUtil 邮件方法类   
+ * 个人理解，唯一引起变化的就是邮件发送方法的改变
+ * 
+ * */
+public class MailUtil {
+
+	private static MailAssemble assembleMail = new MailAssemble();
+	
+	public static void sendEmail(MailAssemble assembleMail , boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(assembleMail.fromAddress).append("\n");
+		buffer.append("To:").append(assembleMail.toAddress).append("\n");
+		buffer.append("Subject:").append(assembleMail.subject).append("\n");
+		buffer.append("Content:").append(assembleMail.message).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+	
+	protected void sendEMails(boolean debug) throws Exception 
+	{	
+		assembleMail.assembleMail();
+		List mailingList = assembleMail.loadMailingList();
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				assembleMail.configureEMail((HashMap) iter.next());  
+				try 
+				{
+					if (assembleMail.toAddress.length() > 0)
+						sendEmail(assembleMail, debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(assembleMail, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/PromotionMail.java b/students/675554906/src/lilei/com/cn/PromotionMail.java
new file mode 100644
index 0000000000..7522bab6b1
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/PromotionMail.java
@@ -0,0 +1,29 @@
+package lilei.com.cn;
+
+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;
+/**
+ * PromotionMail 推送邮件类  
+ * 个人理解， 此类唯一能引起变化的就是发送邮件的方法变化
+ * 
+ * */
+public class PromotionMail {
+
+	private static MailUtil mailUtil;
+	public static void main(String[] args) throws Exception {
+
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(emailDebug);
+	}
+
+	public PromotionMail(boolean mailDebug) throws Exception {
+		mailUtil = new MailUtil();
+		mailUtil.sendEMails(mailDebug); 
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/ReadFile.java b/students/675554906/src/lilei/com/cn/ReadFile.java
new file mode 100644
index 0000000000..e13a9d644e
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/ReadFile.java
@@ -0,0 +1,33 @@
+package lilei.com.cn;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+/**
+ * ReadFile 读取文件类  
+ * 个人理解， 唯一能引发变化的就是文件路径的变动
+ * 
+ * */
+public class ReadFile {
+	
+	private File file;
+	private String filePath = "F:\\product_promotion.txt";
+	
+	protected String[] readFile() throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			file = new File(filePath);
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			return data;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/675554906/src/lilei/com/cn/product_promotion.txt b/students/675554906/src/lilei/com/cn/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/675554906/src/lilei/com/cn/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From bb922a12e63663fc1e18a53027cf3b3af550d4d4 Mon Sep 17 00:00:00 2001
From: Arthur <465034663@qq.com>
Date: Tue, 13 Jun 2017 22:09:35 +0800
Subject: [PATCH 058/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90?=
 =?UTF-8?q?=E4=BA=A4=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/465034663/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/465034663/README.md

diff --git a/students/465034663/README.md b/students/465034663/README.md
new file mode 100644
index 0000000000..773f79cede
--- /dev/null
+++ b/students/465034663/README.md
@@ -0,0 +1 @@
+OOD面向对象
\ No newline at end of file

From a4a1a1671bc210408582bfb5b4175e7350ef589b Mon Sep 17 00:00:00 2001
From: jiangzhimin <jimmy_kwong@qq.com>
Date: Tue, 13 Jun 2017 22:59:41 +0800
Subject: [PATCH 059/332] the first time commit

---
 students/630727874/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/630727874/README.md

diff --git a/students/630727874/README.md b/students/630727874/README.md
new file mode 100644
index 0000000000..fbfe6df257
--- /dev/null
+++ b/students/630727874/README.md
@@ -0,0 +1 @@
+This is my first git commit

From bf1d250c989711a8ae240a779a4726645dd9a8b5 Mon Sep 17 00:00:00 2001
From: jimmy <jimmy_kwong@qq.com>
Date: Tue, 13 Jun 2017 23:07:56 +0800
Subject: [PATCH 060/332] Revert "the first time commit"

This reverts commit a4a1a1671bc210408582bfb5b4175e7350ef589b.
---
 students/630727874/README.md | 1 -
 1 file changed, 1 deletion(-)
 delete mode 100644 students/630727874/README.md

diff --git a/students/630727874/README.md b/students/630727874/README.md
deleted file mode 100644
index fbfe6df257..0000000000
--- a/students/630727874/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This is my first git commit

From a35a5f9356ec0654ef4d351d4218d19832c1e56a Mon Sep 17 00:00:00 2001
From: jimmy <jimmy_kwong@qq.com>
Date: Tue, 13 Jun 2017 23:19:17 +0800
Subject: [PATCH 061/332] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=87=AA=E5=B7=B1?=
 =?UTF-8?q?=E7=9A=84=E7=9B=AE=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/63072784/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/63072784/README.md

diff --git a/students/63072784/README.md b/students/63072784/README.md
new file mode 100644
index 0000000000..f5e57e7b78
--- /dev/null
+++ b/students/63072784/README.md
@@ -0,0 +1 @@
+这是我的目录

From 3f0e0a912f0a9237784e17ec566390967d78863e Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Tue, 13 Jun 2017 23:47:05 +0800
Subject: [PATCH 062/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/srp/{ => config}/Configuration.java   | 0
 .../com/coderising/ood/srp/{ => config}/ConfigurationKeys.java    | 0
 .../src/main/java/com/coderising/ood/srp/{ => util}/DBUtil.java   | 0
 .../src/main/java/com/coderising/ood/srp/{ => util}/MailUtil.java | 0
 4 files changed, 0 insertions(+), 0 deletions(-)
 rename students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/{ => config}/Configuration.java (100%)
 rename students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/{ => config}/ConfigurationKeys.java (100%)
 rename students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/{ => util}/DBUtil.java (100%)
 rename students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/{ => util}/MailUtil.java (100%)

diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/Configuration.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
similarity index 100%
rename from students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
similarity index 100%
rename from students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
similarity index 100%
rename from students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java
similarity index 100%
rename from students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
rename to students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java

From 9ba07844b62008a74ee078631541be73e79cf15c Mon Sep 17 00:00:00 2001
From: zhanghaojie <zhanghaojie@192.168.0.105>
Date: Wed, 14 Jun 2017 00:08:46 +0800
Subject: [PATCH 063/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=91=A8=20=E9=87=8D?=
 =?UTF-8?q?=E6=9E=84=E4=BF=83=E9=94=80=E9=82=AE=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/550727632/pom.xml                    | 37 ++++++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 31 ++++++++++
 .../java/com/coderising/ood/srp/FileUtil.java | 28 ++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 56 +++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  | 29 ++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 37 ++++++++++++
 .../java/com/coderising/ood/srp/User.java     | 34 +++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 10 files changed, 288 insertions(+)
 create mode 100644 students/550727632/pom.xml
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/User.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/550727632/pom.xml b/students/550727632/pom.xml
new file mode 100644
index 0000000000..3483fcca18
--- /dev/null
+++ b/students/550727632/pom.xml
@@ -0,0 +1,37 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.codering.ood</groupId>
+	<artifactId>coderising</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<name>ood-assignment</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.4</version>
+		</dependency>
+
+
+	</dependencies>
+	<repositories>
+		<repository>
+			<id>aliyunmaven</id>
+			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+		</repository>
+	</repositories>
+</project>
\ No newline at end of file
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java b/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/550727632/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<String,String> 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/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/550727632/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/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..3b73afe420
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql) {
+
+		List<User> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User("User" + i, "aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+	
+	public static List<User> loadProductUsers(Product product){
+		String sql = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+		return query(sql);
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..0054feb8e0
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+	public static Product readProductFile(File file) throws IOException {
+		BufferedReader br = null;
+		Product product = new Product();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			System.out.println(product.toString());
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return product;
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..a61ab7e52c
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,56 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class MailUtil {
+
+	private static String fromAddress;
+	private static String smtpHost;
+	private static String altSmtpHost;
+
+	static {
+		Configuration config = new Configuration();
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	}
+
+	public static void sendPromotionEmail(PromotionMail mail, Product product, boolean debug) {
+		System.out.println("开始发送邮件");
+		List<User> userList = DBUtil.loadProductUsers(product);
+		if(userList != null && !userList.isEmpty()){
+			for (User user : userList) {
+				mail.setMessage(user, product);
+				if (StringUtils.isNotEmpty(user.getEmail())){
+					sendEmail(mail.getSubject(), mail.getMessage(), user.getEmail(), debug);
+				}
+			}
+		} else {
+			System.out.println("没有需要发送的邮件");
+		}
+	}
+	
+	public static void sendEmail(String subject, String message,String toAddress,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");
+		// 先用smtpHost发送
+		// 如果失败用altSmtpHost发送
+		// 如果还失败，则记录日志
+		try {
+			buffer.append("smtpHost:").append(smtpHost).append("\n");
+		} catch (Exception e) {
+			try {
+				buffer.append("smtpHost:").append(altSmtpHost).append("\n");
+			} catch (Exception e2) {
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+		System.out.println(buffer.toString());
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/Product.java b/students/550727632/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..fd107fa4f4
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp;
+
+public class Product {
+
+	private String productID;
+	private String 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;
+	}
+
+	@Override
+	public String toString() {
+		return "Product [productID=" + productID + ", productDesc=" + productDesc + "]";
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..23d48b0ae1
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class PromotionMail {
+	private String subject;
+	private String message;
+
+	public PromotionMail() {
+		subject = "您关注的产品降价了";
+	}
+
+	public static void main(String[] args) throws Exception {
+		File f = new File("src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		boolean emailDebug = false;
+		Product product = FileUtil.readProductFile(f);
+		PromotionMail mail = new PromotionMail();
+		MailUtil.sendPromotionEmail(mail, product, emailDebug);
+	}
+
+	public String getSubject() {
+		return subject;
+	}
+
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	public void setMessage(User user, Product product) {
+		message = "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/User.java b/students/550727632/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..b63f655e7c
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+public class User {
+
+	private String name;
+	private String email;
+
+	public User() {
+		super();
+	}
+
+	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/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/550727632/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

From 51be40786b1f53a2e0cff22a15620d02d29ff19d Mon Sep 17 00:00:00 2001
From: Star <294022181@qq.com>
Date: Wed, 14 Jun 2017 00:15:47 +0800
Subject: [PATCH 064/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BF=83=E9=94=80?=
 =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81=E7=A8=8B=E5=BA=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ood-assignment/product_promotion.txt      |  4 +
 .../com/coderising/ood/srp/Configuration.java | 23 +++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++
 .../src/com/coderising/ood/srp/DBUtil.java    | 25 ++++++
 .../src/com/coderising/ood/srp/Email.java     | 85 +++++++++++++++++++
 .../src/com/coderising/ood/srp/MailUtil.java  | 18 ++++
 .../src/com/coderising/ood/srp/Product.java   | 23 +++++
 .../com/coderising/ood/srp/ProductDao.java    | 36 ++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 70 +++++++++++++++
 .../coderising/ood/srp/SubscriptionDao.java   | 15 ++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 11 files changed, 312 insertions(+)
 create mode 100644 students/294022181/ood-assignment/product_promotion.txt
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java
 create mode 100644 students/294022181/ood-assignment/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/294022181/ood-assignment/product_promotion.txt b/students/294022181/ood-assignment/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/294022181/ood-assignment/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/294022181/ood-assignment/src/com/coderising/ood/srp/Configuration.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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<String,String> 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/294022181/ood-assignment/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/294022181/ood-assignment/src/com/coderising/ood/srp/DBUtil.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java
new file mode 100644
index 0000000000..956cb57493
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Email.java
@@ -0,0 +1,85 @@
+package com.coderising.ood.srp;
+
+public class Email {
+	private String smtpHost;
+	private String altSmtpHost; 
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+	private boolean debug;
+	
+	public Email() {
+		
+	}
+	
+	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 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 getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public boolean isDebug() {
+		return debug;
+	}
+
+	public void setDebug(boolean debug) {
+		this.debug = debug;
+	}
+
+	public void sendToTarget() {
+		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()); 
+			}
+		}
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/MailUtil.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..fbb4f29db3
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	private String productID;
+	private String 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/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java
new file mode 100644
index 0000000000..ad5c53356e
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/ProductDao.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductDao {
+
+	public Product getProduct(String productFileName) throws IOException {
+		BufferedReader br = null;
+		Product product = null;
+		
+		try {
+			File file = new File(productFileName);
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			String productID = data[0];
+			String productDesc = data[1];
+			
+			System.out.println("产品ID = " + productID + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+			product = new Product();
+			product.setProductID(productID);
+			product.setProductDesc(productDesc);
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		
+		return product;
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..1cda5d5859
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,70 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	private Configuration config;
+	private ProductDao productDao;
+	private SubscriptionDao subscriptionDao;
+	
+	public static void main(String[] args) throws Exception {
+		boolean emailDebug = false;
+		String productFileName = "./product_promotion.txt";
+		PromotionMail pe = new PromotionMail(productFileName, emailDebug);
+	}
+	
+	public PromotionMail(String productFileName, boolean mailDebug) throws Exception {
+		config = new Configuration();
+		productDao = new ProductDao();
+		subscriptionDao = new SubscriptionDao();
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		Product product = productDao.getProduct(productFileName);
+		
+		if (product == null) {
+			return;
+		}
+		
+		sendEMails(mailDebug, product, subscriptionDao.loadMailingList(product.getProductID())); 
+	}
+
+	protected void sendEMails(boolean debug, Product product, List mailingList) throws IOException {
+
+		System.out.println("开始发送邮件");
+	
+		if (mailingList != null) {
+			Email email = new Email();
+			String smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+			String altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+			String fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+			Iterator iter = mailingList.iterator();
+			
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();
+				String toAddress = (String) userInfo.get(EMAIL_KEY); 
+				
+				if (toAddress.length() > 0) {
+					String name = (String) userInfo.get(NAME_KEY);
+					String subject = "您关注的产品降价了";
+					String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+					email.setFromAddress(fromAddress);
+					email.setToAddress(toAddress);
+					email.setSmtpHost(smtpHost);
+					email.setAltSmtpHost(altSmtpHost);
+					email.setSubject(subject);
+					email.setMessage(message);
+					email.setDebug(debug);
+					email.sendToTarget();
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java b/students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java
new file mode 100644
index 0000000000..2cd57ed644
--- /dev/null
+++ b/students/294022181/ood-assignment/src/com/coderising/ood/srp/SubscriptionDao.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class SubscriptionDao {
+	
+	public List loadMailingList(String productID) throws Exception {
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/294022181/ood-assignment/src/com/coderising/ood/srp/product_promotion.txt b/students/294022181/ood-assignment/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/294022181/ood-assignment/src/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

From c3bfe5112c9dee7dbb803c272026c333dc8b7e5d Mon Sep 17 00:00:00 2001
From: MAC <mac@MACdeMacBook-Air-2.local>
Date: Wed, 14 Jun 2017 00:15:58 +0800
Subject: [PATCH 065/332] srp first commit

---
 students/89460886/ood/srp/Configuration.java  | 25 ++++++++
 .../89460886/ood/srp/ConfigurationKeys.java   |  9 +++
 students/89460886/ood/srp/DBUtil.java         | 43 ++++++++++++++
 students/89460886/ood/srp/IRequest.java       | 16 ++++++
 students/89460886/ood/srp/MailRequest.java    | 57 +++++++++++++++++++
 students/89460886/ood/srp/Product.java        | 26 +++++++++
 .../89460886/ood/srp/ProductRepository.java   | 38 +++++++++++++
 students/89460886/ood/srp/PromotionMail.java  | 42 ++++++++++++++
 students/89460886/ood/srp/SmtpClient.java     | 45 +++++++++++++++
 students/89460886/ood/srp/User.java           | 26 +++++++++
 .../89460886/ood/srp/product_promotion.txt    |  4 ++
 11 files changed, 331 insertions(+)
 create mode 100644 students/89460886/ood/srp/Configuration.java
 create mode 100644 students/89460886/ood/srp/ConfigurationKeys.java
 create mode 100644 students/89460886/ood/srp/DBUtil.java
 create mode 100644 students/89460886/ood/srp/IRequest.java
 create mode 100644 students/89460886/ood/srp/MailRequest.java
 create mode 100644 students/89460886/ood/srp/Product.java
 create mode 100644 students/89460886/ood/srp/ProductRepository.java
 create mode 100644 students/89460886/ood/srp/PromotionMail.java
 create mode 100644 students/89460886/ood/srp/SmtpClient.java
 create mode 100644 students/89460886/ood/srp/User.java
 create mode 100644 students/89460886/ood/srp/product_promotion.txt

diff --git a/students/89460886/ood/srp/Configuration.java b/students/89460886/ood/srp/Configuration.java
new file mode 100644
index 0000000000..20cb685583
--- /dev/null
+++ b/students/89460886/ood/srp/Configuration.java
@@ -0,0 +1,25 @@
+package ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String,String> 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/89460886/ood/srp/ConfigurationKeys.java b/students/89460886/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..47cf4153b3
--- /dev/null
+++ b/students/89460886/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package 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/89460886/ood/srp/DBUtil.java b/students/89460886/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..89dbacc9bf
--- /dev/null
+++ b/students/89460886/ood/srp/DBUtil.java
@@ -0,0 +1,43 @@
+package ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     * @param sql
+     * @return
+     */
+    public static List<User> query(String sql){
+        List<User> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            User user = new User();
+            user.setName("User" + i);
+            user.setEmail("aa@bb.com");
+            userList.add(user);
+        }
+        return userList;
+    }
+
+    public static List<User> queryValidUserList(String sql) {
+        List<User> userList = query(sql);
+        List<User> resultList = new ArrayList<>();
+        for (int i = 0, len = userList.size(); i < len; i++) {
+            String email = userList.get(i).getEmail();
+            if (email != null && email.length() > 0) {
+                resultList.add(userList.get(i));
+            }
+        }
+        return resultList;
+    }
+
+    public static List<User> queryUserListByProduct(Product product) {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() + "' "
+                + "and send_mail=1 ";
+        return queryValidUserList(sendMailQuery);
+    }
+
+}
diff --git a/students/89460886/ood/srp/IRequest.java b/students/89460886/ood/srp/IRequest.java
new file mode 100644
index 0000000000..5d15088f60
--- /dev/null
+++ b/students/89460886/ood/srp/IRequest.java
@@ -0,0 +1,16 @@
+package ood.srp;
+
+import java.util.Map;
+
+/**
+ * @author jiaxun
+ */
+public interface IRequest {
+
+    Map<String, String> getHeaders();
+
+    Map<String, String> getParams();
+
+    String getUrl();
+
+}
diff --git a/students/89460886/ood/srp/MailRequest.java b/students/89460886/ood/srp/MailRequest.java
new file mode 100644
index 0000000000..62b9c6ed52
--- /dev/null
+++ b/students/89460886/ood/srp/MailRequest.java
@@ -0,0 +1,57 @@
+package ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author jiaxun
+ */
+public class MailRequest implements IRequest {
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    @Override
+    public Map<String, String> getHeaders() {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getParams() {
+        Map<String, String> map = new HashMap<>();
+        map.put("toAddress", toAddress);
+        map.put("subject", subject);
+        map.put("message", message);
+        return map;
+    }
+
+    @Override
+    public String getUrl() {
+        return null;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+}
diff --git a/students/89460886/ood/srp/Product.java b/students/89460886/ood/srp/Product.java
new file mode 100644
index 0000000000..f92235f0a7
--- /dev/null
+++ b/students/89460886/ood/srp/Product.java
@@ -0,0 +1,26 @@
+package ood.srp;
+
+/**
+ * @author jiaxun
+ */
+public class Product {
+
+    private String productID = null;
+    private String productDesc = null;
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/89460886/ood/srp/ProductRepository.java b/students/89460886/ood/srp/ProductRepository.java
new file mode 100644
index 0000000000..0c987504ac
--- /dev/null
+++ b/students/89460886/ood/srp/ProductRepository.java
@@ -0,0 +1,38 @@
+package ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * @author jiaxun
+ */
+public class ProductRepository {
+
+    public static Product getProductFromFile(File file) throws IOException {
+        Product product = null;
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String line = br.readLine();
+            String[] data = line.split(" ");
+
+            product = new Product();
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID() + "\n");
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+        return product;
+    }
+
+}
diff --git a/students/89460886/ood/srp/PromotionMail.java b/students/89460886/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..199a80a7cc
--- /dev/null
+++ b/students/89460886/ood/srp/PromotionMail.java
@@ -0,0 +1,42 @@
+package ood.srp;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+
+        File file = new File("/Users/jiaxun/OpenSource/Algorithm/src/ood/srp/product_promotion.txt");
+        boolean emailDebug = false;
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        Product product = ProductRepository.getProductFromFile(file);
+
+        List<User> userList = DBUtil.queryUserListByProduct(product);
+
+        PromotionMail pe = new PromotionMail();
+
+        pe.sendEMails(emailDebug, userList, product);
+    }
+
+    protected void sendEMails(boolean debug, List<User> userList, Product product) {
+
+        System.out.println("开始发送邮件");
+
+        if (userList != null) {
+            for (int i = 0, len = userList.size(); i < len; i++) {
+                MailRequest mailRequest = new MailRequest();
+
+                mailRequest.setSubject("您关注的产品降价了");
+                mailRequest.setMessage("尊敬的 " + userList.get(i).getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");
+                mailRequest.setToAddress(userList.get(i).getEmail());
+
+                SmtpClient.sharedInstance().sendEmail(mailRequest, debug);
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+}
diff --git a/students/89460886/ood/srp/SmtpClient.java b/students/89460886/ood/srp/SmtpClient.java
new file mode 100644
index 0000000000..a0c52b6fc3
--- /dev/null
+++ b/students/89460886/ood/srp/SmtpClient.java
@@ -0,0 +1,45 @@
+package ood.srp;
+
+import java.util.Map;
+
+/**
+ * @author jiaxun
+ */
+public class SmtpClient {
+
+    private static volatile SmtpClient instance = null;
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+
+    private SmtpClient() {
+        Configuration config = new Configuration();
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public static SmtpClient sharedInstance() {
+        if (instance == null) {
+            synchronized (SmtpClient.class) {
+                if (instance == null) {
+                    return new SmtpClient();
+                }
+            }
+        }
+        return instance;
+    }
+
+    public void sendEmail(IRequest request, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(fromAddress).append("\n");
+        Map<String, String> params = request.getParams();
+        // 这里为了演示方便，直接根据请求的 key 获取内容
+        buffer.append("To:").append(params.get("toAddress")).append("\n");
+        buffer.append("Subject:").append(params.get("subject")).append("\n");
+        buffer.append("Content:").append(params.get("message")).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/89460886/ood/srp/User.java b/students/89460886/ood/srp/User.java
new file mode 100644
index 0000000000..71bc2b7702
--- /dev/null
+++ b/students/89460886/ood/srp/User.java
@@ -0,0 +1,26 @@
+package ood.srp;
+
+/**
+ * @author jiaxun
+ */
+public class User {
+
+    private String name;
+    private String email;
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/students/89460886/ood/srp/product_promotion.txt b/students/89460886/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/89460886/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

From 30695118965726d5000c29c3fbd86281382f1ed6 Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Wed, 14 Jun 2017 00:32:51 +0800
Subject: [PATCH 066/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/PromotionMail.java | 189 ++++++------------
 .../ood/srp/config/Configuration.java         |   3 +-
 .../ood/srp/config/ConfigurationKeys.java     |   2 +-
 .../ood/srp/config/ConnectionConfig.java      |  37 ++++
 .../com/coderising/ood/srp/model/Mail.java    |  48 +++++
 .../com/coderising/ood/srp/model/Product.java |  38 ++++
 .../ood/srp/model/Subscriptions.java          |  48 +++++
 .../ood/srp/service/ProductService.java       |  17 ++
 .../ood/srp/service/SubscriptionsService.java |  11 +
 .../srp/service/impl/ProductServiceImpl.java  |  40 ++++
 .../impl/SubscriptionsServiceImpl.java        |  40 ++++
 .../com/coderising/ood/srp/util/DBUtil.java   |   2 +-
 .../com/coderising/ood/srp/util/MailUtil.java |   2 +-
 .../coderising/ood/srp/PromotionMailTest.java |  34 ++++
 14 files changed, 375 insertions(+), 136 deletions(-)
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java
 create mode 100644 students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java
 create mode 100644 students/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java

diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
index d98b32e7fc..cd31beac90 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,162 +1,89 @@
 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.ArrayList;
 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 ";
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConnectionConfig;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.Subscriptions;
+import com.coderising.ood.srp.service.ProductService;
+import com.coderising.ood.srp.service.SubscriptionsService;
+import com.coderising.ood.srp.util.MailUtil;
 
-		System.out.println("loadQuery set");
-	}
+public class PromotionMail {
 
-	protected void setSMTPHost() {
-		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
-	}
+	protected SubscriptionsService subscriptionsService;
 
-	protected void setAltSMTPHost() {
-		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	protected ProductService productService;
 
+	public PromotionMail(SubscriptionsService subscriptionsService, ProductService productService) {
+		this.subscriptionsService = subscriptionsService;
+		this.productService = productService;
 	}
 
-	protected void setFromAddress() {
-		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
-	}
+	/**
+	 * 发送促销邮件
+	 * @param file 促销产品文件
+	 * @param mailDebug
+	 * @throws Exception
+	 */
+	public void sendPromotionMail(File file, boolean mailDebug) throws Exception {
 
-	protected void setMessage(HashMap userInfo) throws IOException {
+		// 得到促销的产品
+		List<Product> products = productService.doFindPromotionalProducts(file);
 
-		String name = (String) userInfo.get(NAME_KEY);
+		// 得到促销产品的订阅信息
+		List<Subscriptions> subscriptions = subscriptionsService.doFindByProducts(products);
 
-		subject = "您关注的产品降价了";
-		message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+		// 得到订阅人的邮箱和名称，邮箱内容
+		List<Mail> mails = getMails(subscriptions);
 
+		// 发送邮箱
+		sendEMails(new ConnectionConfig(new Configuration()), mails, mailDebug);
 	}
 
-	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]);
+	protected List<Mail> getMails(List<Subscriptions> subscriptions) {
 
-			System.out.println("产品ID = " + productID + "\n");
-			System.out.println("产品描述 = " + productDesc + "\n");
+		List<Mail> mails = new ArrayList<Mail>();
+		String subject = "您关注的产品降价了";
 
-		} catch (IOException e) {
-			throw new IOException(e.getMessage());
-		} finally {
-			br.close();
+		for (Subscriptions sub : subscriptions) {
+			String productDesc = sub.getProduct().getProductDesc();
+			String message = "尊敬的 " + sub.getName() + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+			mails.add(new Mail(subject, message, sub.getEmail()));
 		}
+		return mails;
 	}
 
-	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 {
-
+	protected void sendEMails(ConnectionConfig config, List<Mail> mails, boolean debug) {
+		if (mails == null) {
+			System.out.println("没有邮件需要发送");
+			return;
+		}
 		System.out.println("开始发送邮件");
-
-		if (mailingList != null) {
-			Iterator iter = mailingList.iterator();
-			while (iter.hasNext()) {
-				configureEMail((HashMap) iter.next());
+		Iterator<Mail> iter = mails.iterator();
+		while (iter.hasNext()) {
+			Mail mail = iter.next();
+			if (mail.getToAddress().length() <= 0) {
+				continue;
+			}
+			try {
+				MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(), mail.getMessage(),
+						config.getSmtpHost(), debug);
+			} catch (Exception e) {
 				try {
-					if (toAddress.length() > 0)
-						MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
-				} catch (Exception e) {
+					MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(),
+							mail.getMessage(), config.getAltSmtpHost(), debug);
 
-					try {
-						MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
-
-					} catch (Exception e2) {
-						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
-					}
+				} catch (Exception e2) {
+					System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
 				}
 			}
-
-		}
-
-		else {
-			System.out.println("没有邮件发送");
-
 		}
-
+		System.out.println("发送邮件结束");
 	}
 }
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
index f328c1816a..bbed122807 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.config;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -16,7 +16,6 @@ public class Configuration {
 	 * @return
 	 */
 	public String getProperty(String key) {
-		
 		return configurations.get(key);
 	}
 
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
index 8695aed644..7fe226d1bd 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.config;
 
 public class ConfigurationKeys {
 
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
new file mode 100644
index 0000000000..be33ad6ed2
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.config;
+
+public class ConnectionConfig {
+	private String smtpHost;
+	private String altSmtpHost;
+	private String fromAddress;
+
+	public ConnectionConfig(Configuration config) {
+		this.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		this.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		this.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	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 fromAddress;
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java
new file mode 100644
index 0000000000..f0b72d7759
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp.model;
+
+public class Mail {
+	private String subject;
+	private String message;
+	private String toAddress;
+
+	public Mail() {
+		super();
+	}
+
+	public Mail(String subject, String message, String toAddress) {
+		super();
+		this.subject = subject;
+		this.message = message;
+		this.toAddress = toAddress;
+	}
+
+	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 getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+
+	@Override
+	public String toString() {
+		return "Mail [subject=" + subject + ", message=" + message + ", toAddress=" + toAddress + "]";
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
new file mode 100644
index 0000000000..fbcbcf9a89
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp.model;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class Product {
+
+	private String productID;
+
+	private String productDesc;
+
+	public Product() {
+	}
+
+	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/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
new file mode 100644
index 0000000000..8ac1def689
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp.model;
+
+public class Subscriptions {
+
+	private String name;
+	private String email;
+	private String productId;
+	private Product product;
+
+	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 String getProductId() {
+		return productId;
+	}
+
+	public void setProductId(String productId) {
+		this.productId = productId;
+	}
+
+	public Product getProduct() {
+		return product;
+	}
+
+	public void setProduct(Product product) {
+		this.product = product;
+	}
+
+	@Override
+	public String toString() {
+		return "Subscriptions [name=" + name + ", email=" + email + ", productId=" + productId + ", product=" + product
+				+ "]";
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
new file mode 100644
index 0000000000..23f5ffb7e3
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import com.coderising.ood.srp.model.Product;
+
+public interface ProductService {
+
+	/**
+	 * 查询促销产品
+	 * @return
+	 * @throws IOException 
+	 */
+	List<Product> doFindPromotionalProducts(File file) throws IOException;
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
new file mode 100644
index 0000000000..5b5cc2830b
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.Subscriptions;
+
+public interface SubscriptionsService {
+
+	List<Subscriptions> doFindByProducts(List<Product> products);
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java
new file mode 100644
index 0000000000..66fe9b6d90
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/ProductServiceImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.service.impl;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.service.ProductService;
+
+public class ProductServiceImpl implements ProductService {
+
+	@Override
+	public List<Product> doFindPromotionalProducts(File file) throws IOException {
+
+		List<Product> products = new ArrayList<Product>();
+		
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			while (br.read() != -1) {
+				Product product = new Product();
+				String temp = br.readLine();
+				String[] data = temp.split(" ");
+				product.setProductID(data[0]);
+				product.setProductDesc(data[1]);
+				products.add(product);
+			}
+			
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return products;
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java
new file mode 100644
index 0000000000..164621e2ea
--- /dev/null
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/impl/SubscriptionsServiceImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.service.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.Subscriptions;
+import com.coderising.ood.srp.service.SubscriptionsService;
+import com.coderising.ood.srp.util.DBUtil;
+
+public class SubscriptionsServiceImpl implements SubscriptionsService {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	@SuppressWarnings({ "unused", "rawtypes" })
+	@Override
+	public List<Subscriptions> doFindByProducts(List<Product> products) {
+
+		List<String> productIds = products.stream().map(Product::getProductID).collect(Collectors.toList());
+		String sendMailQuery = "Select name from subscriptions where product_id in( productIds ) and send_mail = 1 ";
+		List list = DBUtil.query(sendMailQuery);
+
+		// 这里只是模拟数据
+		List<Subscriptions> subscriptions = new ArrayList<Subscriptions>();
+		for (int i = 0; i < list.size(); i++) {
+			HashMap userInfo = (HashMap) list.get(i);
+			Subscriptions ss = new Subscriptions();
+			ss.setName((String) userInfo.get(NAME_KEY));
+			ss.setEmail((String) userInfo.get(EMAIL_KEY));
+			ss.setProduct(products.get(i));
+			subscriptions.add(ss);
+		}
+
+		return subscriptions;
+	}
+
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
index 7597905da1..9af40a67bd 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.util;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java
index 9f9e749af7..bb028c690c 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.util;
 
 public class MailUtil {
 
diff --git a/students/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java b/students/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java
new file mode 100644
index 0000000000..a3c91dc4bb
--- /dev/null
+++ b/students/992331664/ood/ood/src/test/java/com/coderising/ood/srp/PromotionMailTest.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.ood.srp.service.ProductService;
+import com.coderising.ood.srp.service.SubscriptionsService;
+import com.coderising.ood.srp.service.impl.ProductServiceImpl;
+import com.coderising.ood.srp.service.impl.SubscriptionsServiceImpl;
+
+public class PromotionMailTest {
+
+	PromotionMail promotionMail;
+
+	@Before
+	public void before() {
+		SubscriptionsService subscriptionsService = new SubscriptionsServiceImpl();
+		ProductService productService = new ProductServiceImpl();
+		promotionMail = new PromotionMail(subscriptionsService, productService);
+	}
+
+	@Test
+	public void testSendPromotionMail() throws Exception {
+		String path = System.getProperty("user.dir");
+
+		path += "\\bin\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+		File file = new File(path);
+
+		promotionMail.sendPromotionMail(file, false);
+	}
+}

From 3dbbd57c01540014b73d436abb930e570ef755d5 Mon Sep 17 00:00:00 2001
From: johnChnia <zhouqiang847@gmail.com>
Date: Wed, 14 Jun 2017 04:54:05 +0800
Subject: [PATCH 067/332] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=AE=BE=E8=AE=A1?=
 =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=AC=AC=E4=B8=80=E5=91=A8=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/315863321/ood/ood-assignment/pom.xml | 32 ++++++++
 .../java/com/coderising/ood/srp/Build.java    | 18 +++++
 .../com/coderising/ood/srp/BuildMail.java     | 59 ++++++++++++++
 .../coderising/ood/srp/BuildMailServer.java   | 20 +++++
 .../com/coderising/ood/srp/BuildProduct.java  | 21 +++++
 .../com/coderising/ood/srp/Configuration.java | 34 +++++++++
 .../coderising/ood/srp/ConfigurationKeys.java | 11 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 ++++++
 .../java/com/coderising/ood/srp/Mail.java     | 44 +++++++++++
 .../com/coderising/ood/srp/MailServer.java    | 25 ++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 18 +++++
 .../java/com/coderising/ood/srp/Product.java  | 25 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 76 +++++++++++++++++++
 .../coderising/ood/srp/ReadFromDatabase.java  | 21 +++++
 .../com/coderising/ood/srp/ReadFromFile.java  | 44 +++++++++++
 .../com/coderising/ood/srp/ReadFromMap.java   | 18 +++++
 .../java/com/coderising/ood/srp/Reader.java   | 22 ++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 18 files changed, 517 insertions(+)
 create mode 100644 students/315863321/ood/ood-assignment/pom.xml
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/315863321/ood/ood-assignment/pom.xml b/students/315863321/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java
new file mode 100644
index 0000000000..e8ea1476cd
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Build.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public abstract class Build {
+    Reader reader = null;
+
+    abstract void build();
+
+    public Reader getReader() {
+        return reader;
+    }
+
+    public void setReader(Reader reader) {
+        this.reader = reader;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java
new file mode 100644
index 0000000000..b1176d9eff
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMail.java
@@ -0,0 +1,59 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class BuildMail extends Build{
+    List mailList;
+    Product product;
+    Mail mail;
+    Configuration config = new Configuration();
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+
+    public BuildMail(List mailList, Product product) {
+        this.mailList = mailList;
+        this.product = product;
+    }
+    void build() {
+        List list = reader.read();
+        if (list != null) {
+            Iterator iter = list.iterator();
+            while (iter.hasNext()) {
+                mail = new Mail();
+                mail.setSubject(config.getProperty(ConfigurationKeys.SUBJECT));
+                mail.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+                try {
+                    configureEMail((HashMap) iter.next());
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                this.mailList.add(mail);
+            }
+
+        }
+
+    }
+
+    protected void configureEMail(HashMap userInfo) throws IOException {
+        mail.setToAddress((String) userInfo.get(EMAIL_KEY));
+        if (mail.getToAddress().length() > 0)
+            setMessage(userInfo);
+    }
+
+    protected void setMessage(HashMap userInfo) throws IOException {
+
+        String name = (String) userInfo.get(NAME_KEY);
+
+        mail.setMessage("尊敬的 "+name+", 您关注的产品 " + this.product.getProductDesc() + " 降价了，欢迎购买!");
+
+
+    }
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java
new file mode 100644
index 0000000000..eebc5946c6
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildMailServer.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class BuildMailServer extends Build{
+    private MailServer mailServer;
+
+    public BuildMailServer(MailServer mailServer) {
+        this.mailServer = mailServer;
+    }
+    void build() {
+        List data = reader.read();
+        mailServer.setSmtpHost((String) data.get(0));
+        mailServer.setAltSmtpHost((String) data.get(1));
+    }
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java
new file mode 100644
index 0000000000..0c8a66942e
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/BuildProduct.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class BuildProduct extends Build{
+    private Product product;
+
+    public BuildProduct(Product product) {
+        this.product = product;
+    }
+    void build() {
+        List data = reader.read();
+        product.setProductID((String) data.get(0));
+        product.setProductDesc((String) data.get(1));
+    }
+
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..815afc3101
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> configurations = new HashMap();
+    static final String QUERY = "Select name from subscriptions "
+            + "where product_id= '" + "%s" +"' "
+            + "and send_mail=1 ";
+
+    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");
+        configurations.put(ConfigurationKeys.SEND_MAIL_QUERY, QUERY);
+        configurations.put(ConfigurationKeys.SUBJECT, "您关注的产品降价了");
+
+    }
+
+    /**
+     * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+     *
+     * @param key
+     * @return
+     */
+    public String getProperty(String key) {
+
+        return configurations.get(key);
+    }
+
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..afda0b749f
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,11 @@
+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";
+    public static final String SEND_MAIL_QUERY = "email.query";
+	public static final String SUBJECT = "email.subject";
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/315863321/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/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..5d8d222aed
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+
+public class Mail {
+    protected String fromAddress = null;
+    protected String toAddress = null;
+    protected String subject = null;
+    protected String message = null;
+
+    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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java
new file mode 100644
index 0000000000..07a8d588e6
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailServer.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class MailServer {
+    protected String smtpHost = null;
+    protected String altSmtpHost = null;
+
+    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;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..3346dfb597
--- /dev/null
+++ b/students/315863321/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(Mail mail, MailServer mailServer,
+			boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(mail.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..a3027a26cc
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class Product {
+    private String productID = null;
+    private String productDesc = null;
+
+    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/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..93fce8bbbd
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,76 @@
+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;
+
+public class PromotionMail {
+
+    private Product product = new Product();
+    private MailServer mailServer = new MailServer();
+    private List<Mail> mailList = new ArrayList<Mail>();
+    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("/Users/john/Documents/mygit_2/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+        boolean emailDebug = false;
+
+        PromotionMail promotionMail = new PromotionMail();
+        //配置产品
+        Build build = new BuildProduct(promotionMail.product);
+        build.setReader(new ReadFromFile(f));
+        build.build();
+
+        //配置邮件服务器
+        build = new BuildMailServer(promotionMail.mailServer);
+        build.setReader(new ReadFromMap());
+        build.build();
+
+        //配置邮件
+        build = new BuildMail(promotionMail.mailList, promotionMail.product);
+        build.setReader(new ReadFromDatabase(promotionMail.product));
+        build.build();
+        //发送邮件
+        promotionMail.sendEMails(emailDebug, promotionMail.mailList);
+
+
+    }
+
+
+    protected void sendEMails(boolean debug, List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件");
+
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                Mail mail = (Mail) iter.next();
+                try {
+                    if (mail.getToAddress().length() > 0) {
+						MailUtil.sendEmail(mail, mailServer, debug);
+
+                    }
+                } catch (Exception e) {
+
+                    try {
+						MailUtil.sendEmail(mail, mailServer, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java
new file mode 100644
index 0000000000..e3f6f2bae8
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromDatabase.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class ReadFromDatabase extends Reader {
+    Configuration config = new Configuration();
+    Product product = null;
+
+    public ReadFromDatabase(Product product) {
+        this.product = product;
+    }
+
+    List read() {
+        System.out.println("loadQuery set");
+        return DBUtil.query(config.getProperty(String.format(ConfigurationKeys.SEND_MAIL_QUERY, product.getProductID())));
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java
new file mode 100644
index 0000000000..a3a7eb2d5f
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromFile.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/13.
+ */
+public class ReadFromFile  extends Reader{
+
+
+    public ReadFromFile(File file) {
+        super(file);
+    }
+
+    List read() {
+        BufferedReader br = null;
+        List data = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            data = Arrays.asList(temp.split(" "));
+        } catch (IOException e) {
+            try {
+                throw new IOException(e.getMessage());
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        System.out.println("产品ID = " + data.get(0) + "\n");
+        System.out.println("产品描述 = " + data.get(1) + "\n");
+        return data;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java
new file mode 100644
index 0000000000..880f297411
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ReadFromMap.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public class ReadFromMap extends Reader{
+    Configuration config = new Configuration();
+
+    List read() {
+        List list = new ArrayList();
+        list.add(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        list.add(config.getProperty((ConfigurationKeys.ALT_SMTP_SERVER)));
+        return list;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java
new file mode 100644
index 0000000000..7e59a0bb68
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Reader.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by john on 2017/6/14.
+ */
+public abstract class Reader {
+    File file;
+
+    public Reader(File file) {
+        this.file = file;
+    }
+
+    public Reader() {
+
+    }
+
+    abstract List read();
+
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/315863321/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

From 47d1952354085013e748437cf7329f74cd9c5178 Mon Sep 17 00:00:00 2001
From: zheng <765324639@qq.com>
Date: Wed, 14 Jun 2017 09:25:43 +0800
Subject: [PATCH 068/332] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=BB=93?=
 =?UTF-8?q?=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/765324639/ood/ood-assignment/pom.xml |  45 ++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 323 insertions(+)
 create mode 100644 students/765324639/ood/ood-assignment/pom.xml
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/765324639/ood/ood-assignment/pom.xml b/students/765324639/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cb72faa5f8
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/pom.xml
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/765324639/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<String,String> 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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/765324639/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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/765324639/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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/765324639/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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/765324639/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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/765324639/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

From c00bd7946417cdcb5171f53bed24ad31d858027b Mon Sep 17 00:00:00 2001
From: wuliLawra <lz986547781@qq.com>
Date: Wed, 14 Jun 2017 09:36:10 +0800
Subject: [PATCH 069/332] first

---
 students/986547781/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/986547781/README.md

diff --git a/students/986547781/README.md b/students/986547781/README.md
new file mode 100644
index 0000000000..d25f86ec2d
--- /dev/null
+++ b/students/986547781/README.md
@@ -0,0 +1 @@
+##һγ

From 58ff91c21cacbf433306a0bfa13cc8e340a5cadb Mon Sep 17 00:00:00 2001
From: lizhao <lizhao.coder@foxmail.com>
Date: Wed, 14 Jun 2017 09:48:13 +0800
Subject: [PATCH 070/332] new line

---
 students/986547781/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/students/986547781/README.md b/students/986547781/README.md
index d25f86ec2d..f568850ceb 100644
--- a/students/986547781/README.md
+++ b/students/986547781/README.md
@@ -1 +1,2 @@
-##һγ
+﻿##第一次尝试
+##解决编码问题
\ No newline at end of file

From 2264d865850c93d6950873711fa68796d9e8af7e Mon Sep 17 00:00:00 2001
From: kkc7316 <1170794299@qq.com>
Date: Wed, 14 Jun 2017 10:06:19 +0800
Subject: [PATCH 071/332] first commit

---
 students/1170794299/README.MD | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/1170794299/README.MD

diff --git a/students/1170794299/README.MD b/students/1170794299/README.MD
new file mode 100644
index 0000000000..f29dee6099
--- /dev/null
+++ b/students/1170794299/README.MD
@@ -0,0 +1 @@
+测试

From ab89336e4efe42d0ac6eb0ca25dafb37884be64c Mon Sep 17 00:00:00 2001
From: KevinSmile <kevinwang013@hotmail.com>
Date: Wed, 14 Jun 2017 11:47:25 +0800
Subject: [PATCH 072/332] update readme

---
 students/279069328/readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/279069328/readme.md b/students/279069328/readme.md
index ce14d38509..e84336bfe0 100644
--- a/students/279069328/readme.md
+++ b/students/279069328/readme.md
@@ -1,3 +1,3 @@
 # Coding 2017
 
-@KevinSmile
\ No newline at end of file
+KevinSmile@coderising
\ No newline at end of file

From c371b4e7dc13ef4c06e804e1b54162ba09ff3304 Mon Sep 17 00:00:00 2001
From: sheng <1158154002@qq.com>
Date: Wed, 14 Jun 2017 12:28:07 +0800
Subject: [PATCH 073/332] test01

---
 students/1158154002/pom.xml                   | 32 ++++++++++
 .../coderising/ood/srp/BaseFileLoader.java    | 10 +++
 .../com/coderising/ood/srp/Configuration.java | 23 +++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 ++++++++
 .../coderising/ood/srp/FileLoaderImpl.java    | 39 ++++++++++++
 .../com/coderising/ood/srp/HandlerEmail.java  | 55 ++++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 18 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 63 +++++++++++++++++++
 .../coderising/ood/srp/api/FileLoader.java    |  8 +++
 .../coderising/ood/srp/model/Constant.java    |  6 ++
 .../com/coderising/ood/srp/model/Mail.java    | 63 +++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 13 files changed, 355 insertions(+)
 create mode 100644 students/1158154002/pom.xml
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1158154002/pom.xml b/students/1158154002/pom.xml
new file mode 100644
index 0000000000..1be81576cc
--- /dev/null
+++ b/students/1158154002/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java b/students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java
new file mode 100644
index 0000000000..8294670ffd
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/BaseFileLoader.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.Map;
+
+import com.coderising.ood.srp.api.FileLoader;
+
+public abstract class BaseFileLoader implements FileLoader {
+	public abstract  Map readFile(File file);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1158154002/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..927c7155cc
--- /dev/null
+++ b/students/1158154002/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<String,String> 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/1158154002/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1158154002/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..868a03ff83
--- /dev/null
+++ b/students/1158154002/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/1158154002/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1158154002/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..65383e4dba
--- /dev/null
+++ b/students/1158154002/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/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java b/students/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java
new file mode 100644
index 0000000000..75c0bf4954
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/FileLoaderImpl.java
@@ -0,0 +1,39 @@
+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.Map;
+
+public class FileLoaderImpl extends BaseFileLoader{
+
+	@Override
+	public  Map readFile(File file) {
+		BufferedReader br = null;
+		Map map=new HashMap<String,String>();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			map.put("productID", data[0]);
+			map.put("productDesc", data[1]);
+			
+			System.out.println("产品ID = " + data[0] + "\n");
+			System.out.println("产品描述 = " + data[1] + "\n");
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				br.close();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+		return map;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java b/students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java
new file mode 100644
index 0000000000..f9ec8061e6
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/HandlerEmail.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.ood.srp.model.Constant;
+import com.coderising.ood.srp.model.Mail;
+
+public class HandlerEmail {
+	
+	protected String sendMailQuery;
+
+	protected Configuration config = new Configuration();
+	
+	protected Mail mail=new Mail();
+
+	protected FileLoaderImpl fileLoader=new FileLoaderImpl();
+	
+	public HandlerEmail(File file) {
+		Map map=fileLoader.readFile(file);
+		mail.setProductDesc((String)map.get("productDesc"));
+		mail.setProductID((String)map.get("productID"));
+		mail.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mail.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mail.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+	}
+
+	protected void setLoadQuery() throws Exception {
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + mail.getProductID() + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+
+	protected void setMessage(HashMap userInfo) throws IOException {
+		String name = (String) userInfo.get(Constant.NAME_KEY);
+		mail.setSubject("您关注的产品降价了");
+		mail.setMessage("尊敬的 " + name + ", 您关注的产品 " + mail.getProductDesc() + " 降价了，欢迎购买!");
+	}
+
+	protected void configureEMail(HashMap userInfo) throws IOException {
+		mail.setToAddress((String) userInfo.get(Constant.EMAIL_KEY));
+		if (mail.getToAddress().length() > 0)
+			setMessage(userInfo);
+	}
+
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1158154002/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..373f3ee306
--- /dev/null
+++ b/students/1158154002/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/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..91a5c0328c
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+	protected HandlerEmail hanlder;
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File(
+				"D:\\mygit\\coding2017\\students\\1158154002\\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 {
+		
+		hanlder = new HandlerEmail(file);
+		hanlder.setLoadQuery();
+		sendEMails(mailDebug, hanlder.loadMailingList());
+
+	}
+
+	protected void sendEMails(boolean debug, List mailingList) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				hanlder.configureEMail((HashMap) iter.next());
+				try {
+					if (hanlder.mail.getToAddress().length() > 0)
+						MailUtil.sendEmail(hanlder.mail.getToAddress(), hanlder.mail.getFromAddress(), hanlder.mail.getSubject(),
+								hanlder.mail.getMessage(), hanlder.mail.getSmtpHost(), debug);
+				} catch (Exception e) {
+
+					try {
+						MailUtil.sendEmail(hanlder.mail.getToAddress(), hanlder.mail.getFromAddress(), hanlder.mail.getSubject(),
+								hanlder.mail.getMessage(), hanlder.mail.getAltSmtpHost(), debug);
+
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java b/students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java
new file mode 100644
index 0000000000..d864d5e74e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/api/FileLoader.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.srp.api;
+
+import java.io.File;
+import java.util.Map;
+
+public interface FileLoader {
+	Map  readFile(File file);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java
new file mode 100644
index 0000000000..ad6258531e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Constant.java
@@ -0,0 +1,6 @@
+package com.coderising.ood.srp.model;
+
+public class Constant {	
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java
new file mode 100644
index 0000000000..c6715e4385
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/srp/model/Mail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.srp.model;
+
+public class Mail {
+	private String smtpHost;
+	private String altSmtpHost; 
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+	private String productID;
+	private String productDesc;
+	
+	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 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 getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+	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/1158154002/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1158154002/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/1158154002/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

From d894371dd19dbbf3e29fba98e30e521c7a9b3e72 Mon Sep 17 00:00:00 2001
From: renxin <renxin@renxin.shule.com>
Date: Wed, 14 Jun 2017 14:50:31 +0800
Subject: [PATCH 074/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/Configuration.java |  23 ---
 .../coderising/ood/srp/ConfigurationKeys.java |   9 -
 .../java/com/coderising/ood/srp/MailUtil.java |  18 --
 .../com/coderising/ood/srp/PromotionMail.java | 192 +-----------------
 .../ood/srp/dao/PromotionMailDao.java         |  12 ++
 .../srp/dao/impl/PromotionMailDaoImpl.java    |  35 ++++
 .../ood/srp/service/PromotionMailService.java |   9 +
 .../impl/PromotionMailServiceImpl.java        |  86 ++++++++
 .../ood/srp/{ => utils}/DBUtil.java           |   2 +-
 .../coderising/ood/srp/utils/FileUtil.java    |  28 +++
 .../coderising/ood/srp/utils/MailUtil.java    |  55 +++++
 .../ood/srp/utils/PropertiesUtils.java        |  40 ++++
 .../resources/configurationKeys.properties    |   3 +
 13 files changed, 276 insertions(+), 236 deletions(-)
 delete mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java
 delete mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 delete mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java
 rename students/335402763/src/main/java/com/coderising/ood/srp/{ => utils}/DBUtil.java (88%)
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
 create mode 100644 students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java
 create mode 100644 students/335402763/src/main/resources/configurationKeys.properties

diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java b/students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java
deleted file mode 100644
index 927c7155cc..0000000000
--- a/students/335402763/src/main/java/com/coderising/ood/srp/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.srp;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> 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/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
deleted file mode 100644
index 868a03ff83..0000000000
--- a/students/335402763/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 373f3ee306..0000000000
--- a/students/335402763/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-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/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 94bfcbaf54..4e777b5cd0 100644
--- a/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,199 +1,21 @@
 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;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.service.impl.PromotionMailServiceImpl;
 
 
-	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;
+public class PromotionMail {
 
-	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 ";
 		
+		File f = new File("D:\\Program Files\\mygit\\coding2017\\students\\335402763\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		boolean emailDebug = false;
 		
-		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);
+		PromotionMailService promotionMailService = new PromotionMailServiceImpl();
+		promotionMailService.sendPromotionMail(f, emailDebug);
 	}
 	
-	
-	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/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java b/students/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
new file mode 100644
index 0000000000..21f143ff11
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.List;
+
+public interface PromotionMailDao {
+
+	/**
+	 * 读取用户信息
+	 */
+	List loadMailingList(String productID);
+
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java b/students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java
new file mode 100644
index 0000000000..339f5b648e
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/dao/impl/PromotionMailDaoImpl.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.dao.impl;
+
+import java.util.List;
+
+import com.coderising.ood.srp.dao.PromotionMailDao;
+import com.coderising.ood.srp.utils.DBUtil;
+
+public class PromotionMailDaoImpl implements PromotionMailDao {
+
+	protected String productID = null;
+	protected String sendMailQuery = null;
+	
+	/**
+	 * 读取用户信息
+	 */
+	@Override
+	public List loadMailingList(String productID) {
+		try {
+			setLoadQuery(productID);
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return DBUtil.query(this.sendMailQuery);
+
+	}
+
+	protected void setLoadQuery(String productID) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java b/students/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
new file mode 100644
index 0000000000..9d1db0cd71
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+
+public interface PromotionMailService {
+
+	void sendPromotionMail(File file, boolean mailDebug) throws Exception;
+
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java b/students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java
new file mode 100644
index 0000000000..2d1e8b491a
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailServiceImpl.java
@@ -0,0 +1,86 @@
+package com.coderising.ood.srp.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.dao.PromotionMailDao;
+import com.coderising.ood.srp.dao.impl.PromotionMailDaoImpl;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.utils.FileUtil;
+import com.coderising.ood.srp.utils.MailUtil;
+import com.coderising.ood.srp.utils.PropertiesUtils;
+
+public class PromotionMailServiceImpl implements PromotionMailService {
+
+	private PromotionMailDao promotionMailDao = new PromotionMailDaoImpl();
+
+	protected String smtpHost = (String) PropertiesUtils.get(PropertiesUtils.SMTP_SERVER);;
+	protected String altSmtpHost = (String) PropertiesUtils.get(PropertiesUtils.ALT_SMTP_SERVER);;
+	protected String fromAddress = (String) PropertiesUtils.get(PropertiesUtils.EMAIL_ADMIN);
+
+	@Override
+	public void sendPromotionMail(File file, boolean mailDebug) throws Exception {
+
+		// 读取商品信息
+		String[] productData = FileUtil.readFile(file);
+		String productID = productData[0];
+		String productDesc = productData[1];
+
+		List mailingList = promotionMailDao.loadMailingList(productID);
+
+		sendEMails(mailDebug, mailingList, productDesc);
+
+	}
+
+	
+	/**
+	 * 发送邮件
+	 * @param debug
+	 * @param mailingList
+	 * @param productDesc
+	 * @throws IOException
+	 */
+	protected void sendEMails(boolean debug, List mailingList, String productDesc) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+
+				HashMap usrInfo = (HashMap) iter.next();
+
+				HashMap eMailInfo = MailUtil.configureEMail(usrInfo, productDesc);
+				String toAddress = (String) eMailInfo.get("toAddress");
+				String subject = (String) eMailInfo.get("subject");
+				String message = (String) eMailInfo.get("message");
+				
+				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/335402763/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
similarity index 88%
rename from students/335402763/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
index 65383e4dba..2a7002dede 100644
--- a/students/335402763/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.utils;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
new file mode 100644
index 0000000000..d0a53ec6ae
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class FileUtil {
+
+		public static String[] readFile(File file) throws IOException // @02C
+		{
+			HashMap map = new HashMap();
+			BufferedReader br = null;
+			String[] data = null;
+			try {
+				br = new BufferedReader(new FileReader(file));
+				String temp = br.readLine();
+				data = temp.split(" ");
+			} catch (IOException e) {
+				throw new IOException(e.getMessage());
+			} finally {
+				br.close();
+			}
+			return data;
+		}
+
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
new file mode 100644
index 0000000000..5e72b2e163
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class MailUtil {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+	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());
+		
+	}
+	
+	//配置发送地址及内容
+	public static HashMap configureEMail(HashMap userInfo , String productDesc) throws IOException {
+		HashMap map = new HashMap();
+		String toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) {
+			map = setMessage(userInfo,productDesc); 
+		}
+		map.put("toAddress", toAddress);
+		return map;
+	}
+
+	//设置信息内容
+	public static HashMap setMessage(HashMap userInfo , String productDesc) throws IOException 
+	{
+		HashMap map = new HashMap();
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
+		
+		map.put("subject", subject);
+		map.put("message", message);
+		
+		return map;
+
+	}
+	
+	
+	
+}
diff --git a/students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java
new file mode 100644
index 0000000000..e8b94b20e7
--- /dev/null
+++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/PropertiesUtils.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class PropertiesUtils {
+	
+	private static Map<String,Object> props=new HashMap<String,Object>();
+	private static Properties properties=new Properties();
+	
+	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";
+	static{
+		try {
+			InputStream inStream=PropertiesUtils.class.getClassLoader().getResourceAsStream("configurationKeys.properties");
+			properties.load(inStream);
+
+			props.put(SMTP_SERVER, properties.get(SMTP_SERVER));
+			props.put(ALT_SMTP_SERVER, properties.get(ALT_SMTP_SERVER));
+			props.put(EMAIL_ADMIN, properties.get(EMAIL_ADMIN));
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	
+	public static Object get(String key){
+		return props.get(key);
+	}
+	
+	public static void set(String key,Object obj){
+		props.put(key, obj);
+	}
+	
+}
diff --git a/students/335402763/src/main/resources/configurationKeys.properties b/students/335402763/src/main/resources/configurationKeys.properties
new file mode 100644
index 0000000000..acde908d1c
--- /dev/null
+++ b/students/335402763/src/main/resources/configurationKeys.properties
@@ -0,0 +1,3 @@
+SMTP_SERVER=smtp.server
+ALT_SMTP_SERVER=alt.smtp.server
+EMAIL_ADMIN=email.admin
\ No newline at end of file

From 0417aeca8ce1d53321f60b283b5d5d850709497a Mon Sep 17 00:00:00 2001
From: zheng <765324639@qq.com>
Date: Wed, 14 Jun 2017 15:13:25 +0800
Subject: [PATCH 075/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E9=87=8D?=
 =?UTF-8?q?=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/srp/DBUtil.java   |  10 +-
 .../java/com/coderising/ood/srp/MailInfo.java |  40 ++++
 .../java/com/coderising/ood/srp/MailUtil.java |  50 +++--
 .../java/com/coderising/ood/srp/Product.java  |  30 +++
 .../coderising/ood/srp/ProductInfoReader.java |  36 ++++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++----------------
 .../java/com/coderising/ood/srp/UserInfo.java |  30 +++
 .../coderising/ood/srp/UserInfoReader.java    |  14 ++
 8 files changed, 213 insertions(+), 196 deletions(-)
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
 create mode 100644 students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java

diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
index 82e9261d18..60c50b34f0 100644
--- a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -10,13 +10,13 @@ public class DBUtil {
 	 * @param sql
 	 * @return
 	 */
-	public static List query(String sql){
+	public static List<UserInfo> query(String sql){
 		
-		List userList = new ArrayList();
+		List<UserInfo> 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");
+			UserInfo userInfo = new UserInfo();
+			userInfo.setUsername("User" + i);
+			userInfo.setEmail("aa@bb.com");
 			userList.add(userInfo);
 		}
 
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
new file mode 100644
index 0000000000..dcb42dcc95
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+public class MailInfo {
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
index 9f9e749af7..614de5a438 100644
--- a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -1,18 +1,44 @@
 package com.coderising.ood.srp;
 
+import java.util.List;
+
 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());
-		
-	}
+	public static void sendEmail(List<MailInfo> mailInfoList, boolean debug) {
+	    if (mailInfoList == null && mailInfoList.size() == 0) {
+            System.out.println("无邮件发送");
+            return;
+        }
+        System.out.println("开始发送邮件");
+        for (MailInfo mailInfo : mailInfoList) {
+	        sendEmail(mailInfo, debug);
+        }
+    }
+
+	public static void sendEmail(MailInfo mailInfo, boolean debug) {
+	    Configuration configuration = new Configuration();
+	    String smtpServer = configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+	    String altSmtpServer = configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        String emailAdmin = configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        try {
+            send(mailInfo.getToAddress(), emailAdmin, mailInfo.getSubject(), mailInfo.getMessage(), smtpServer, debug);
+        } catch (Exception e) {
+            try {
+                send(mailInfo.getToAddress(), emailAdmin, mailInfo.getSubject(), mailInfo.getMessage(), altSmtpServer, debug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
 
-	
+    public static void send(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/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..8887870547
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+public class Product {
+    private String id;
+    private String 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;
+    }
+
+    @Override
+    public String toString() {
+        return "Product{" +
+            "id='" + id + '\'' +
+            ", desc='" + desc + '\'' +
+            '}';
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java
new file mode 100644
index 0000000000..3e1660608d
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfoReader.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ProductInfoReader {
+
+    protected static List<Product> readProductInfo() {
+        File file = new File("E:\\coding2017\\students\\765324639\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        List<Product> productList = new ArrayList<>();
+        try (BufferedReader br = new BufferedReader(new FileReader(file));) {
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setId(data[0]);
+                product.setDesc(data[1]);
+                productList.add(product);
+                System.out.println("产品ID = " + data[0]);
+                System.out.println("产品描述 = " + data[1] + "\n");
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return productList;
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 781587a846..b47f451636 100644
--- a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -5,195 +5,36 @@
 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 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");
+        List<Product> productList = ProductInfoReader.readProductInfo();
 
-		} 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); 
-	}
+        for (Product product : productList) {
+            List<UserInfo> userInfoList = UserInfoReader.readUserInfo(product.getId());
+            List<MailInfo> mailInfoList = generateEmails(product, userInfoList);
+            boolean emailDebug = false;
+            MailUtil.sendEmail(mailInfoList, emailDebug);
+        }
 
-	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("没有邮件发送");
-			
-		}
-
-	}
+    public static List<MailInfo> generateEmails(Product product, List<UserInfo> userInfoList) {
+	    List<MailInfo> mailInfoList = new ArrayList<>();
+	    for (UserInfo userInfo : userInfoList) {
+            MailInfo mailInfo = new MailInfo();
+            mailInfo.setToAddress(userInfo.getEmail());
+            mailInfo.setSubject("您关注的产品降价了");
+            mailInfo.setMessage("尊敬的 "+ userInfo.getUsername() +", 您关注的产品 " + product.getDesc() + " 降价了，欢迎购买!");
+            mailInfoList.add(mailInfo);
+        }
+        return mailInfoList;
+    }
 }
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..c4f501a3ff
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+public class UserInfo {
+    private String username;
+    private String email;
+
+    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;
+    }
+
+    @Override
+    public String toString() {
+        return "UserInfo{" +
+            "username='" + username + '\'' +
+            ", email='" + email + '\'' +
+            '}';
+    }
+}
diff --git a/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java
new file mode 100644
index 0000000000..edfe66d829
--- /dev/null
+++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoReader.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class UserInfoReader {
+
+    public static List<UserInfo> readUserInfo(String productID) {
+        String sendMailQuery = "Select name from subscriptions "
+            + "where product_id= '" + productID +"' "
+            + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return DBUtil.query(sendMailQuery);
+    }
+}

From 7f7a9e6991454a22f95624a147403aed6882d0a8 Mon Sep 17 00:00:00 2001
From: Wen Wei <wenwei0415@qq.com>
Date: Wed, 14 Jun 2017 16:34:02 +0800
Subject: [PATCH 076/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/463256809/ood-assignment/pom.xml     |  32 ++++
 .../com/coderising/ood/srp/Configuration.java |  23 +++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ++++
 .../java/com/coderising/ood/srp/FileUtil.java |  35 +++++
 .../java/com/coderising/ood/srp/Mail.java     |  73 +++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 138 ++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  |  26 ++++
 .../com/coderising/ood/srp/PromotionMail.java |  27 ++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 10 files changed, 392 insertions(+)
 create mode 100644 students/463256809/ood-assignment/pom.xml
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/463256809/ood-assignment/pom.xml b/students/463256809/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/463256809/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/463256809/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<String,String> 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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/463256809/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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/463256809/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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..fad6f3219b
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by wenwei on 2017/6/14.
+ */
+public class FileUtil {
+
+    private static Product product = new Product();
+
+    public static 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(" ");
+
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID() + "\n");
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..9c6bfff697
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,73 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by wenwei on 2017/6/14.
+ */
+public class Mail {
+
+    private String sendMailQuery = null;
+
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+    private String toAddress = null;
+    private String subject = null;
+    private String message = null;
+
+    public String getSendMailQuery() {
+        return sendMailQuery;
+    }
+
+    public void setSendMailQuery(String sendMailQuery) {
+        this.sendMailQuery = sendMailQuery;
+    }
+
+    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 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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..73e822f361
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,138 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+
+
+	private static String sendMailQuery = null;
+	private static String smtpHost = null;
+	private static String altSmtpHost = null;
+	private static String fromAddress = null;
+	private static String toAddress = null;
+	private static String subject = null;
+	private static String message = null;
+
+
+	private static Configuration config = new Configuration();
+	private static Product product = new Product();
+
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	protected static void setLoadQuery() throws Exception {
+
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+	}
+
+
+	protected static void setSMTPHost()
+	{
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+
+	protected static void setAltSMTPHost()
+	{
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+	}
+
+
+	protected static void setFromAddress()
+	{
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	protected static void setMessage(HashMap userInfo) throws IOException
+	{
+
+		String name = (String) userInfo.get(NAME_KEY);
+
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+
+
+
+	}
+
+
+
+	protected static void configureEMail(HashMap userInfo) throws IOException
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY);
+		if (toAddress.length() > 0)
+			setMessage(userInfo);
+	}
+
+	protected static List loadMailingList() throws Exception {
+		return DBUtil.query(sendMailQuery);
+	}
+
+
+	public static void sendEMails(boolean debug, List mailingList) throws Exception
+	{
+
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+		setLoadQuery();
+
+		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("没有邮件发送");
+
+		}
+
+	}
+
+	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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..4420dfc603
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by wenwei on 2017/6/14.
+ */
+public class Product {
+
+    private String productID = null;
+    private String productDesc = null;
+
+    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/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..e4241217a2
--- /dev/null
+++ b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+
+//		File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		File f = new File("/Users/wenwei/mygit/coding2017/students/463256809/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
+		FileUtil.readFile(file);
+
+		MailUtil.sendEMails(mailDebug, MailUtil.loadMailingList());
+	}
+
+
+}
diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/463256809/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

From 014e1177d0e60e9ab14a5a0f9d692bf401237794 Mon Sep 17 00:00:00 2001
From: gaohuan30 <threadgaohuan@gmail.com>
Date: Wed, 14 Jun 2017 16:36:19 +0800
Subject: [PATCH 077/332] =?UTF-8?q?=E8=87=AA=E5=B7=B1=E7=9A=84=E4=BB=A3?=
 =?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 coding2017                                    |   1 +
 .../com/coderising/ood/srp/Configuration.java |  23 --
 .../coderising/ood/srp/ConfigurationKeys.java |   9 -
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ---
 .../java/com/coderising/ood/srp/Email.java    | 145 +++++++++++++
 .../java/com/coderising/ood/srp/Goods.java    |  79 +++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 --
 .../java/com/coderising/ood/srp/Main.java     |  35 +++
 .../java/com/coderising/ood/srp/Message.java  |  12 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ------------------
 .../java/com/coderising/ood/srp/User.java     |  53 +++++
 11 files changed, 325 insertions(+), 274 deletions(-)
 create mode 160000 coding2017
 delete mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java
 delete mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 delete mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/Email.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/Goods.java
 delete mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/Main.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/Message.java
 delete mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/862726639/src/main/java/com/coderising/ood/srp/User.java

diff --git a/coding2017 b/coding2017
new file mode 160000
index 0000000000..bdbfcff8c9
--- /dev/null
+++ b/coding2017
@@ -0,0 +1 @@
+Subproject commit bdbfcff8c9b106c07b6cbd6702fe97accc1dc90b
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java b/students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java
deleted file mode 100644
index f328c1816a..0000000000
--- a/students/862726639/src/main/java/com/coderising/ood/srp/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.srp;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> 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/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
deleted file mode 100644
index 8695aed644..0000000000
--- a/students/862726639/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java
deleted file mode 100644
index 82e9261d18..0000000000
--- a/students/862726639/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ /dev/null
@@ -1,25 +0,0 @@
-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/862726639/src/main/java/com/coderising/ood/srp/Email.java b/students/862726639/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 0000000000..fd2d231ecb
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,145 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import org.apache.commons.mail.EmailException;
+import org.apache.commons.mail.HtmlEmail;
+/**
+ * 只提交发送邮件的功能，主邮箱，备用邮箱需要赋予
+ * @author gaohuan
+ *
+ */
+public class Email {
+	public static final String ENCODEING = "UTF-8";  
+	  
+    private String host; // 服务器地址  
+  
+    private String sender; // 发件人的邮箱  
+  
+    private String receiver; // 收件人的邮箱  
+  
+    private String name; // 发件人昵称  
+  
+    private String username; // 账号  
+  
+    private String password; // 密码  
+  
+    private String subject; // 主题  
+  
+    private String message; // 信息(支持HTML)  
+	
+	public boolean send2(Email mail) {  
+		if ("".equals(mail.getReceiver())&&null == mail.getReceiver()) {
+			return false;
+		}
+		System.out.println("开始发送邮件");
+        // 发送email  
+        HtmlEmail email = new HtmlEmail();  
+        try {  
+            // 这里是SMTP发送服务器的名字：163的如下："smtp.163.com"  
+            email.setHostName(mail.getHost());  
+            // 字符编码集的设置  
+            email.setCharset("utf-8");  
+            // 收件人的邮箱  
+            email.addTo(mail.getReceiver());  
+            // 发送人的邮箱  
+            email.setFrom(mail.getSender(), mail.getName());  
+            // 如果需要认证信息的话，设置认证：用户名-密码。分别为发件人在邮件服务器上的注册名称和密码  
+            email.setAuthentication(mail.getUsername(), mail.getPassword());  
+            // 要发送的邮件主题  
+            email.setSubject(mail.getSubject());  
+            // 要发送的信息，由于使用了HtmlEmail，可以在邮件内容中使用HTML标签  
+            email.setMsg(mail.getMessage());  
+            // 发送  
+            email.send();  
+        	System.out.println(mail.getSender() + " 发送邮件到 " + mail.getReceiver());  
+            return true;  
+        } catch (EmailException e) {  
+            e.printStackTrace();  
+            System.out.println(mail.getSender() + " 发送邮件到 " + mail.getReceiver()  
+                    + " 失败");  
+            return false;  
+        }  
+    }
+
+
+	public String getHost() {
+		return host;
+	}
+
+
+	public void setHost(String host) {
+		this.host = host;
+	}
+
+
+	public String getSender() {
+		return sender;
+	}
+
+
+	public void setSender(String sender) {
+		this.sender = sender;
+	}
+
+
+	public String getReceiver() {
+		return receiver;
+	}
+
+
+	public void setReceiver(String receiver) {
+		this.receiver = receiver;
+	}
+
+
+	public String getName() {
+		return name;
+	}
+
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+	public String getUsername() {
+		return username;
+	}
+
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+
+	public String getPassword() {
+		return password;
+	}
+
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+
+	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;
+	}  
+	
+	
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Goods.java b/students/862726639/src/main/java/com/coderising/ood/srp/Goods.java
new file mode 100644
index 0000000000..376bc87de2
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Goods.java
@@ -0,0 +1,79 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+/**
+ * 这个类的作用只是用于获取资源文件中的降价商品
+ * @author gaohuan
+ *
+ */
+public class Goods {
+	private String productID;
+	private String productDesc;
+	
+	/**
+	 * 获得降价
+	 * @return
+	 * @throws IOException
+	 */
+	@SuppressWarnings("finally")
+	public ArrayList<Goods>  getSaleGoods() throws IOException {
+		ArrayList<Goods> goodsList = new ArrayList<Goods>();
+		File file = new File("src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Goods goods = new Goods(data[0], data[1]);
+			goodsList.add(goods);
+			System.out.println("产品ID = " + goods.getProductID() + "\n");
+			System.out.println("产品描述 = " + goods.getProductDesc() + "\n");
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			br.close();
+			return goodsList;
+		}
+	}
+
+	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;
+	}
+
+	public Goods() {
+		super();
+	}
+
+	public Goods(String productID, String productDesc) {
+		super();
+		this.productID = productID;
+		this.productDesc = productDesc;
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 9f9e749af7..0000000000
--- a/students/862726639/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-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/862726639/src/main/java/com/coderising/ood/srp/Main.java b/students/862726639/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 0000000000..1e347cdd18
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Main.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.junit.Test;
+
+public class Main {
+	//发送邮件
+	@Test
+	public void test() throws Exception{
+		//获得降价商品
+		Goods goods = new Goods();
+		ArrayList<Goods> saleGoods = goods.getSaleGoods();
+		//获得对应用户
+		for (Goods goods2 : saleGoods) {
+			User user = new User();
+			ArrayList<User> userById = user.getUserById(goods2.getProductID());
+			for (User user2 : userById) {
+				//发送邮件
+				Email email = new Email();
+				email.setHost("smtp.163.com"); // 设置邮件服务器,如果不用163的,自己找找看相关的  
+				email.setSender("15237140070@163.com");  
+				email.setReceiver(user2.getEmail()); // 接收人  
+				email.setUsername("15237140070@163.com"); // 登录账号,一般都是和邮箱名一样吧  
+				email.setPassword("sudan521"); // 发件人邮箱的登录密码  
+				email.setSubject("降价了降价了");  
+				email.setMessage(Message.saleMessage(user2.getName(), goods2.getProductDesc())+"");  
+				email.send2(email);  
+				
+			}
+		}
+	}
+
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/Message.java b/students/862726639/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 0000000000..af09775311
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp;
+
+public class Message {
+	
+	public static StringBuilder saleMessage(String userName ,String goodsName){
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+		buffer.append("Content:").append("尊敬的 "+userName+", 您关注的产品 " + goodsName + " 降价了，欢迎购买!").append("\n");
+		return buffer;
+	}
+
+}
diff --git a/students/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index 781587a846..0000000000
--- a/students/862726639/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,199 +0,0 @@
-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/862726639/src/main/java/com/coderising/ood/srp/User.java b/students/862726639/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..8821a97490
--- /dev/null
+++ b/students/862726639/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+public class User {
+	private String name;
+	private String email;
+
+	
+	/**
+	 * 通过降价商品的id 获取需要返回的用户
+	 * @param productID
+	 * @return
+	 */
+	public ArrayList<User> getUserById(String productID){
+		ArrayList<User> userList = new ArrayList<User>();
+		userList.add(new User("高欢1","15582372277@163.com"));
+		userList.add(new User("高欢2"));
+		userList.add(new User("高欢3"));
+		return userList;
+	}
+	
+	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 User(String name) {
+		super();
+		this.name = name;
+	}
+
+	public User() {
+		super();
+		// TODO Auto-generated constructor stub
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+}

From 63b1474bf5e791cd124ff480eda92b923f696add Mon Sep 17 00:00:00 2001
From: Wen Wei <wenwei0415@qq.com>
Date: Wed, 14 Jun 2017 16:37:47 +0800
Subject: [PATCH 078/332] merge

---
 students/463256809/src/Demo.java | 6 ------
 1 file changed, 6 deletions(-)
 delete mode 100644 students/463256809/src/Demo.java

diff --git a/students/463256809/src/Demo.java b/students/463256809/src/Demo.java
deleted file mode 100644
index a67375a605..0000000000
--- a/students/463256809/src/Demo.java
+++ /dev/null
@@ -1,6 +0,0 @@
-
-public class Demo {
-	public static void main(String[] args) {
-		System.out.println("Test");
-	}
-}

From 22105d448b6b507fd8c8464a06a215d030048e9e Mon Sep 17 00:00:00 2001
From: Wen Wei <wenwei0415@qq.com>
Date: Wed, 14 Jun 2017 16:40:44 +0800
Subject: [PATCH 079/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/srp/Mail.java     | 73 -------------------
 1 file changed, 73 deletions(-)
 delete mode 100644 students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java

diff --git a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
deleted file mode 100644
index 9c6bfff697..0000000000
--- a/students/463256809/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.coderising.ood.srp;
-
-/**
- * Created by wenwei on 2017/6/14.
- */
-public class Mail {
-
-    private String sendMailQuery = null;
-
-
-    private String smtpHost = null;
-    private String altSmtpHost = null;
-    private String fromAddress = null;
-    private String toAddress = null;
-    private String subject = null;
-    private String message = null;
-
-    public String getSendMailQuery() {
-        return sendMailQuery;
-    }
-
-    public void setSendMailQuery(String sendMailQuery) {
-        this.sendMailQuery = sendMailQuery;
-    }
-
-    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 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 getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-}

From f558eac06059fe7d449ea10f0f5f81ad96a6bcbf Mon Sep 17 00:00:00 2001
From: cheungchan <1377699408@qq.com>
Date: Tue, 13 Jun 2017 00:32:05 +0800
Subject: [PATCH 080/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1srp=E9=87=8D?=
 =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../1377699408/data-structure/answer/pom.xml  |  32 +++
 .../coderising/download/DownloadThread.java   |  20 ++
 .../coderising/download/FileDownloader.java   |  73 +++++++
 .../download/FileDownloaderTest.java          |  59 ++++++
 .../coderising/download/api/Connection.java   |  23 ++
 .../download/api/ConnectionException.java     |   5 +
 .../download/api/ConnectionManager.java       |  10 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/impl/ConnectionImpl.java         |  27 +++
 .../download/impl/ConnectionManagerImpl.java  |  15 ++
 .../coderising/litestruts/LoginAction.java    |  39 ++++
 .../com/coderising/litestruts/Struts.java     |  34 +++
 .../com/coderising/litestruts/StrutsTest.java |  43 ++++
 .../java/com/coderising/litestruts/View.java  |  23 ++
 .../java/com/coderising/litestruts/struts.xml |  11 +
 .../main/java/com/coding/basic/Iterator.java  |   7 +
 .../src/main/java/com/coding/basic/List.java  |   9 +
 .../com/coding/basic/array/ArrayList.java     |  35 +++
 .../com/coding/basic/array/ArrayUtil.java     |  96 +++++++++
 .../coding/basic/linklist/LRUPageFrame.java   | 164 +++++++++++++++
 .../basic/linklist/LRUPageFrameTest.java      |  34 +++
 .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++
 .../com/coding/basic/queue/CircleQueue.java   |  47 +++++
 .../coding/basic/queue/CircleQueueTest.java   |  44 ++++
 .../java/com/coding/basic/queue/Josephus.java |  39 ++++
 .../com/coding/basic/queue/JosephusTest.java  |  27 +++
 .../java/com/coding/basic/queue/Queue.java    |  61 ++++++
 .../basic/queue/QueueWithTwoStacks.java       |  55 +++++
 .../com/coding/basic/stack/QuickMinStack.java |  44 ++++
 .../coding/basic/stack/QuickMinStackTest.java |  39 ++++
 .../java/com/coding/basic/stack/Stack.java    |  24 +++
 .../com/coding/basic/stack/StackUtil.java     | 168 +++++++++++++++
 .../com/coding/basic/stack/StackUtilTest.java |  86 ++++++++
 .../basic/stack/StackWithTwoQueues.java       |  53 +++++
 .../basic/stack/StackWithTwoQueuesTest.java   |  36 ++++
 .../java/com/coding/basic/stack/Tail.java     |   5 +
 .../basic/stack/TwoStackInOneArray.java       | 117 ++++++++++
 .../basic/stack/TwoStackInOneArrayTest.java   |  65 ++++++
 .../coding/basic/stack/expr/InfixExpr.java    |  72 +++++++
 .../basic/stack/expr/InfixExprTest.java       |  52 +++++
 .../basic/stack/expr/InfixToPostfix.java      |  43 ++++
 .../basic/stack/expr/InfixToPostfixTest.java  |  41 ++++
 .../coding/basic/stack/expr/PostfixExpr.java  |  46 ++++
 .../basic/stack/expr/PostfixExprTest.java     |  41 ++++
 .../coding/basic/stack/expr/PrefixExpr.java   |  52 +++++
 .../basic/stack/expr/PrefixExprTest.java      |  45 ++++
 .../com/coding/basic/stack/expr/Token.java    |  50 +++++
 .../coding/basic/stack/expr/TokenParser.java  |  57 +++++
 .../basic/stack/expr/TokenParserTest.java     |  41 ++++
 .../coding/basic/tree/BinarySearchTree.java   | 189 +++++++++++++++++
 .../basic/tree/BinarySearchTreeTest.java      | 108 ++++++++++
 .../com/coding/basic/tree/BinaryTreeNode.java |  36 ++++
 .../com/coding/basic/tree/BinaryTreeUtil.java | 116 ++++++++++
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 +++++++
 .../java/com/coding/basic/tree/FileList.java  |  34 +++
 .../data-structure/assignment/pom.xml         |  32 +++
 .../coderising/download/DownloadThread.java   |  20 ++
 .../coderising/download/FileDownloader.java   |  73 +++++++
 .../download/FileDownloaderTest.java          |  59 ++++++
 .../coderising/download/api/Connection.java   |  23 ++
 .../download/api/ConnectionException.java     |   5 +
 .../download/api/ConnectionManager.java       |  10 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/impl/ConnectionImpl.java         |  27 +++
 .../download/impl/ConnectionManagerImpl.java  |  15 ++
 .../coderising/litestruts/LoginAction.java    |  39 ++++
 .../com/coderising/litestruts/Struts.java     |  34 +++
 .../com/coderising/litestruts/StrutsTest.java |  43 ++++
 .../java/com/coderising/litestruts/View.java  |  23 ++
 .../java/com/coderising/litestruts/struts.xml |  11 +
 .../com/coderising/ood/course/bad/Course.java |  24 +++
 .../ood/course/bad/CourseOffering.java        |  26 +++
 .../ood/course/bad/CourseService.java         |  16 ++
 .../coderising/ood/course/bad/Student.java    |  14 ++
 .../coderising/ood/course/good/Course.java    |  18 ++
 .../ood/course/good/CourseOffering.java       |  34 +++
 .../ood/course/good/CourseService.java        |  14 ++
 .../coderising/ood/course/good/Student.java   |  21 ++
 .../java/com/coderising/ood/ocp/DateUtil.java |  10 +
 .../java/com/coderising/ood/ocp/Logger.java   |  38 ++++
 .../java/com/coderising/ood/ocp/MailUtil.java |  10 +
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  10 +
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../main/java/com/coding/basic/Iterator.java  |   7 +
 .../src/main/java/com/coding/basic/List.java  |   9 +
 .../com/coding/basic/array/ArrayList.java     |  35 +++
 .../com/coding/basic/array/ArrayUtil.java     |  96 +++++++++
 .../coding/basic/linklist/LRUPageFrame.java   |  57 +++++
 .../basic/linklist/LRUPageFrameTest.java      |  34 +++
 .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++
 .../com/coding/basic/queue/CircleQueue.java   |  39 ++++
 .../java/com/coding/basic/queue/Josephus.java |  18 ++
 .../com/coding/basic/queue/JosephusTest.java  |  27 +++
 .../java/com/coding/basic/queue/Queue.java    |  61 ++++++
 .../basic/queue/QueueWithTwoStacks.java       |  47 +++++
 .../com/coding/basic/stack/QuickMinStack.java |  19 ++
 .../java/com/coding/basic/stack/Stack.java    |  24 +++
 .../com/coding/basic/stack/StackUtil.java     |  48 +++++
 .../com/coding/basic/stack/StackUtilTest.java |  65 ++++++
 .../basic/stack/StackWithTwoQueues.java       |  16 ++
 .../basic/stack/TwoStackInOneArray.java       |  57 +++++
 .../coding/basic/stack/expr/InfixExpr.java    |  15 ++
 .../basic/stack/expr/InfixExprTest.java       |  52 +++++
 .../basic/stack/expr/InfixToPostfix.java      |  14 ++
 .../coding/basic/stack/expr/PostfixExpr.java  |  18 ++
 .../basic/stack/expr/PostfixExprTest.java     |  41 ++++
 .../coding/basic/stack/expr/PrefixExpr.java   |  18 ++
 .../basic/stack/expr/PrefixExprTest.java      |  45 ++++
 .../com/coding/basic/stack/expr/Token.java    |  50 +++++
 .../coding/basic/stack/expr/TokenParser.java  |  57 +++++
 .../basic/stack/expr/TokenParserTest.java     |  41 ++++
 .../coding/basic/tree/BinarySearchTree.java   |  55 +++++
 .../basic/tree/BinarySearchTreeTest.java      | 109 ++++++++++
 .../com/coding/basic/tree/BinaryTreeNode.java |  35 +++
 .../com/coding/basic/tree/BinaryTreeUtil.java |  66 ++++++
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 +++++++
 .../java/com/coding/basic/tree/FileList.java  |  10 +
 .../1377699408/ood/ood-assignment/pom.xml     |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../coderising/ood/srp/EmailException.java    |   7 +
 .../com/coderising/ood/srp/PromotionMail.java |  57 +++++
 .../com/coderising/ood/srp/bean/Email.java    | 102 +++++++++
 .../com/coderising/ood/srp/bean/Product.java  |  66 ++++++
 .../com/coderising/ood/srp/dao/EmailDAO.java  |  22 ++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../ood/srp/utils/CollectionUtils.java        |   9 +
 .../coderising/ood/srp/utils/StringUtils.java |   7 +
 133 files changed, 5652 insertions(+)
 create mode 100644 students/1377699408/data-structure/answer/pom.xml
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 create mode 100644 students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
 create mode 100644 students/1377699408/data-structure/assignment/pom.xml
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 create mode 100644 students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
 create mode 100644 students/1377699408/ood/ood-assignment/pom.xml
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java
 create mode 100644 students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java

diff --git a/students/1377699408/data-structure/answer/pom.xml b/students/1377699408/data-structure/answer/pom.xml
new file mode 100644
index 0000000000..ac6ba882df
--- /dev/null
+++ b/students/1377699408/data-structure/answer/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-answer</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-answer</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..900a3ad358
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..c3c8a3f27d
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..4ff7f46ae0
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..36a9d2ce15
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..172371dd55
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..4576c016af
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..45740e6d57
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..24b9d8b155
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,164 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		Node node = find(pageNum);
+		//在该队列中存在， 则提到队列头
+		if (node != null) {
+			
+			moveExistingNodeToHead(node);		
+			
+		} else{
+			
+			node = new Node();
+			node.pageNum = pageNum;
+			
+			// 缓存容器是否已经超过大小.
+			if (currentSize >= capacity) {			
+				removeLast();
+							
+			} 
+			
+			addNewNodetoHead(node);
+			
+			
+			
+						
+		}
+	}
+	
+	private void addNewNodetoHead(Node node) {
+		
+		if(isEmpty()){
+			
+			node.prev = null;
+			node.next = null;
+			first = node;
+			last = node;
+			
+		} else{
+			node.prev = null;
+			node.next = first;
+			first.prev = node;
+			first = node;
+		}
+		this.currentSize ++;
+	}
+
+	private Node find(int data){
+		
+		Node node = first;
+		while(node != null){
+			if(node.pageNum == data){
+				return node;
+			}
+			node = node.next;
+		}
+		return null;
+		
+	}
+
+	
+
+	
+	
+
+	/**
+	 * 删除链表尾部节点 表示 删除最少使用的缓存对象
+	 */
+	private void removeLast() {
+		Node prev = last.prev;
+		prev.next = null;
+		last.prev = null;
+		last = prev;
+		this.currentSize --;
+	}
+
+	/**
+	 * 移动到链表头，表示这个节点是最新使用过的
+	 * 
+	 * @param node
+	 */
+	private void moveExistingNodeToHead(Node node) {
+		
+		if (node == first) {
+			
+			return;
+		}
+		else if(node == last){
+			//当前节点是链表尾， 需要放到链表头
+			Node prevNode = node.prev;
+			prevNode.next = null;	
+			last.prev = null;
+			last  = prevNode;				
+			
+		} else{
+			//node 在链表的中间， 把node 的前后节点连接起来
+			Node prevNode = node.prev;
+			prevNode.next = node.next;
+			
+			Node nextNode = node.next;
+			nextNode.prev = prevNode;
+			
+			
+		}
+		
+		node.prev = null;
+		node.next = first;
+		first.prev = node;
+		first = node;	
+		
+	}
+	private boolean isEmpty(){		
+		return (first == null) && (last == null);
+	}
+
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7fd72fc2b4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..f4c7556a2e
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 0000000000..f169d5f8e4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+public class CircleQueue <E> {
+
+	//用数组来保存循环队列的元素
+	private Object[] elementData ;
+	int size = 0;
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public CircleQueue(int capacity){
+		elementData = new Object[capacity];
+	}
+	public boolean isEmpty() {
+		return (front == rear) && !isFull();
+        
+    }
+	
+	public boolean isFull(){
+		return  size == elementData.length;
+	}
+    public int size() {
+        return size;
+    }
+
+    public void enQueue(E data) {
+        if(isFull()){
+        	throw new RuntimeException("The queue is full");
+        }
+        rear = (rear+1) % elementData.length;
+        elementData[rear++] = data;
+        size++;
+    }
+
+    public E deQueue() {
+        if(isEmpty()){
+        	throw new RuntimeException("The queue is empty");
+        }
+        E data = (E)elementData[front];
+        elementData[front] = null;
+        front = (front+1) % elementData.length;
+        size --;
+        return data;
+    }
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
new file mode 100644
index 0000000000..7307eb77d4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
@@ -0,0 +1,44 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class CircleQueueTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		CircleQueue<String> queue = new CircleQueue<String>(5);		
+		Assert.assertTrue(queue.isEmpty());
+		Assert.assertFalse(queue.isFull());
+		
+		queue.enQueue("a");
+		queue.enQueue("b");
+		queue.enQueue("c");
+		queue.enQueue("d");
+		queue.enQueue("e");
+		
+		Assert.assertTrue(queue.isFull());
+		Assert.assertFalse(queue.isEmpty());
+		Assert.assertEquals(5, queue.size());
+		
+		Assert.assertEquals("a", queue.deQueue());
+		Assert.assertEquals("b", queue.deQueue());
+		Assert.assertEquals("c", queue.deQueue());
+		Assert.assertEquals("d", queue.deQueue());
+		Assert.assertEquals("e", queue.deQueue());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 0000000000..36ec615d36
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){
+		
+		Queue<Integer> queue = new Queue<Integer>();
+        for (int i = 0; i < n; i++){
+        	queue.enQueue(i);
+        }
+        
+        List<Integer> result = new ArrayList<Integer>();
+        int i = 0;
+
+        while (!queue.isEmpty()) {
+
+            int x = queue.deQueue();            
+
+            if (++i % m == 0){
+            	result.add(x);
+            } else{
+            	queue.enQueue(x);
+            }
+        }
+
+        
+        return result;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 0000000000..7d90318b51
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 0000000000..c4c4b7325e
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 0000000000..bc97df0800
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,55 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+import java.util.Stack;
+
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    private void moveStack1ToStack2() {
+        while (!stack1.isEmpty()){
+        	stack2.push(stack1.pop());
+        }
+            
+    }
+
+
+    public boolean isEmpty() {
+        return stack1.isEmpty() && stack2.isEmpty();
+    }
+
+
+    
+    public int size() {
+        return stack1.size() + stack2.size();     
+    }
+
+
+
+    public void enQueue(E item) {
+        stack1.push(item);
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue is empty");
+        }
+        if (stack2.isEmpty()) {
+        	moveStack1ToStack2();
+        }
+        
+        return stack2.pop();
+    }
+
+
+
+ }
+
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 0000000000..faf2644ab1
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,44 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	
+	private Stack<Integer> normalStack = new Stack<Integer>();
+	private Stack<Integer> minNumStack = new Stack<Integer>();
+	
+	public void push(int data){
+		
+		normalStack.push(data);
+		
+		if(minNumStack.isEmpty()){
+			minNumStack.push(data);
+		} else{
+			if(minNumStack.peek() >= data) {
+				minNumStack.push(data);
+	        }
+		}
+		
+	}
+	public int pop(){
+		if(normalStack.isEmpty()){
+			throw new RuntimeException("the stack is empty");
+		}
+		int value = normalStack.pop();
+		if(value == minNumStack.peek()){
+			minNumStack.pop();
+		}
+		return value;
+	}
+	public int findMin(){
+		if(minNumStack.isEmpty()){
+			throw new RuntimeException("the stack is empty");
+		}
+		return minNumStack.peek();
+	}
+}
\ No newline at end of file
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
new file mode 100644
index 0000000000..efe41a9f8f
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
@@ -0,0 +1,39 @@
+package com.coding.basic.stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class QuickMinStackTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		QuickMinStack stack = new QuickMinStack();
+		stack.push(5);
+		Assert.assertEquals(5, stack.findMin());
+		stack.push(6);
+		Assert.assertEquals(5, stack.findMin());
+		stack.push(4);
+		Assert.assertEquals(4, stack.findMin());
+		stack.push(4);
+		Assert.assertEquals(4, stack.findMin());
+		
+		stack.pop();
+		Assert.assertEquals(4, stack.findMin());
+		stack.pop();
+		Assert.assertEquals(5, stack.findMin());
+		stack.pop();
+		Assert.assertEquals(5, stack.findMin());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..fedb243604
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..7c86d22fe7
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,168 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	public static void bad_reverse(Stack<Integer> s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		Stack<Integer> tmpStack = new Stack();
+		while(!s.isEmpty()){
+			tmpStack.push(s.pop());
+		}
+		
+		s = tmpStack;
+		
+	}
+	
+	
+	
+	public static void reverse_247565311(Stack<Integer> s){
+        if(s == null || s.isEmpty()) {
+        	return;
+        }
+        
+        int size = s.size();
+        Stack<Integer> tmpStack = new Stack<Integer>();        
+        
+        for(int i=0;i<size;i++){
+            Integer top = s.pop();
+            while(s.size()>i){
+                tmpStack.push(s.pop());
+            }
+            s.push(top);
+            while(tmpStack.size()>0){
+                s.push(tmpStack.pop());
+            }
+        }
+    }
+
+
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		
+		Stack<Integer> tmp = new Stack<Integer>();
+		while(!s.isEmpty()){
+			tmp.push(s.pop());
+		}
+		while(!tmp.isEmpty()){
+			Integer top = tmp.pop();
+			addToBottom(s,top);
+		}	
+		
+		
+	}
+	public static void addToBottom(Stack<Integer> s,  Integer value){
+		if(s.isEmpty()){
+			s.push(value);
+		} else{
+			Integer top = s.pop();
+			addToBottom(s,value);
+			s.push(top);
+		}
+		
+	}
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		Stack tmpStack = new Stack();
+		
+		while(!s.isEmpty()){
+			Object value = s.pop();
+			if(!value.equals(o)){
+				tmpStack.push(value);
+			} 			
+		}
+		
+		while(!tmpStack.isEmpty()){
+			s.push(tmpStack.pop());
+		}
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		
+		if(s == null || s.isEmpty() || s.size()<len || len <=0 ){
+			return null;
+		}
+		
+		Stack tmpStack = new Stack();
+		int i = 0;
+		Object[] result = new Object[len];
+		while(!s.isEmpty()){
+			Object value = s.pop();			
+			tmpStack.push(value);
+			result[i++] = value;
+			if(i == len){
+				break;
+			}
+		}
+		while(!tmpStack.isEmpty()){
+			s.push(tmpStack.pop());
+		}
+		return result;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		
+		Stack<Character> stack = new Stack();
+		for(int i=0;i<s.length();i++){
+			char c = s.charAt(i);
+			
+			if(c == '(' || c =='[' || c == '{'){
+				
+				stack.push(c);
+				
+			} else if( c == ')'){
+				
+				char topChar = stack.pop();
+				if(topChar != '('){
+					return false;
+				}
+				
+			} else if( c == ']'){
+				
+				char topChar = stack.pop();
+				if(topChar != '['){
+					return false;
+				}
+					
+			} else if( c == '}'){
+				
+				char topChar = stack.pop();
+				if(topChar != '{'){
+					return false;
+				}
+				
+			}
+		}
+		return stack.size() == 0;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..ae0210ff47
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,86 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testAddToBottom() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		
+		StackUtil.addToBottom(s, 0);
+		
+		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+		
+	}
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	@Test
+	public void testReverse_247565311() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		
+		Assert.assertEquals("[1, 2, 3]", s.toString());
+		StackUtil.reverse_247565311(s);
+		Assert.assertEquals("[3, 2, 1]", s.toString());
+	}
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 0000000000..7a58fbff56
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,53 @@
+package com.coding.basic.stack;
+
+import java.util.ArrayDeque;
+import java.util.Queue;
+
+public class StackWithTwoQueues {
+	Queue<Integer> queue1 = new ArrayDeque<>();
+    Queue<Integer> queue2 = new ArrayDeque<>();
+
+    public void push(int data) {
+        //两个栈都为空时，优先考虑queue1
+        if (queue1.isEmpty()&&queue2.isEmpty()) {
+            queue1.add(data);
+            return;
+        }
+       
+        if (queue1.isEmpty()) {
+            queue2.add(data);
+            return;
+        }
+
+        if (queue2.isEmpty()) {
+            queue1.add(data);
+            return;
+        }
+
+    }
+
+    public int pop() {
+        
+        if (queue1.isEmpty()&&queue2.isEmpty()) {
+        	throw new RuntimeException("stack is empty");
+        } 
+        
+        if (queue1.isEmpty()) {
+            while (queue2.size()>1) {
+                queue1.add(queue2.poll());
+            }
+            return queue2.poll();
+        } 
+        
+        if (queue2.isEmpty()) {
+            while (queue1.size()>1) {
+                queue2.add(queue1.poll());
+            }
+            return queue1.poll();
+        }
+        
+        throw new RuntimeException("no queue is empty, this is not allowed");
+        
+
+    }
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
new file mode 100644
index 0000000000..4541b1f040
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
@@ -0,0 +1,36 @@
+package com.coding.basic.stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class StackWithTwoQueuesTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		StackWithTwoQueues stack = new StackWithTwoQueues();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+        Assert.assertEquals(4, stack.pop());
+        Assert.assertEquals(3, stack.pop());
+      
+        stack.push(5);
+        Assert.assertEquals(5, stack.pop());
+        Assert.assertEquals(2, stack.pop());
+        Assert.assertEquals(1, stack.pop());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
new file mode 100644
index 0000000000..7f30ce55c8
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
@@ -0,0 +1,5 @@
+package com.coding.basic.stack;
+
+public class Tail {
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 0000000000..a532fd6e6c
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,117 @@
+package com.coding.basic.stack;
+
+import java.util.Arrays;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	private Object[] data = new Object[10];
+	private int size;
+    private int top1, top2;
+    
+    public TwoStackInOneArray(int n){
+    	data = new Object[n];
+    	size = n;
+    	top1 = -1;
+        top2 = data.length;
+    }
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		ensureCapacity();
+		data[++top1] = o;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		ensureCapacity();
+		data[--top2] = o;
+	}
+	public void ensureCapacity(){
+		if(top2-top1>1){
+			return;
+		} else{
+			
+			Object[] newArray = new Object[data.length*2];
+			System.arraycopy(data, 0, newArray, 0, top1+1);
+			
+			int stack2Size = data.length-top2;
+			int newTop2 = newArray.length-stack2Size;
+			System.arraycopy(data, top2, newArray, newTop2, stack2Size);
+			
+			top2 = newTop2;
+			data = newArray;
+		}
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		if(top1 == -1){
+			throw new RuntimeException("Stack1 is empty");
+		}
+		Object o = data[top1];
+		data[top1] = null;
+		top1--;
+		return o;
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		if(top2 == data.length){
+			throw new RuntimeException("Stack2 is empty");
+		}
+		Object o = data[top2];
+		data[top2] = null;
+		top2++;
+		return o;
+	}
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		if(top1 == -1){
+			throw new RuntimeException("Stack1 is empty");
+		}
+		return data[top1];
+	}
+	
+	
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		if(top2 == data.length){
+			throw new RuntimeException("Stack2 is empty");
+		}
+		return data[top2];
+	}
+	
+	public Object[] stack1ToArray(){
+		return Arrays.copyOf(data, top1+1);
+	}
+	public Object[] stack2ToArray(){
+		int size = data.length-top2;
+		Object [] stack2Data = new Object[size];
+		int j=0;
+		for(int i=data.length-1; i>=top2 ;i--){
+			stack2Data[j++] = data[i];
+		}
+		return stack2Data;	
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
new file mode 100644
index 0000000000..b743d422c6
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class TwoStackInOneArrayTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test1() {
+		TwoStackInOneArray stack = new TwoStackInOneArray(10);
+		stack.push1(1);
+		stack.push1(2);
+		stack.push1(3);
+		stack.push1(4);
+		stack.push1(5);
+		
+		stack.push2(1);
+		stack.push2(2);
+		stack.push2(3);
+		stack.push2(4);
+		stack.push2(5);
+		
+		for(int i=1;i<=5;i++){
+			Assert.assertEquals(stack.peek1(), stack.peek2());
+			Assert.assertEquals(stack.pop1(), stack.pop2());
+		}
+		
+		
+	}
+	@Test
+	public void test2() {
+		TwoStackInOneArray stack = new TwoStackInOneArray(5);
+		stack.push1(1);
+		stack.push1(2);
+		stack.push1(3);
+		stack.push1(4);
+		stack.push1(5);
+		stack.push1(6);
+		stack.push1(7);	
+		
+		stack.push2(1);
+		stack.push2(2);
+		stack.push2(3);
+		stack.push2(4);
+		
+		
+		Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]",Arrays.toString(stack.stack1ToArray()));
+		Assert.assertEquals("[1, 2, 3, 4]",Arrays.toString(stack.stack2ToArray()));
+	}
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..cebef21fa3
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,72 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		
+		Stack<Token> opStack = new Stack<>();
+		Stack<Float> numStack = new Stack<>();
+		
+		for(Token token : tokens){
+			
+			if (token.isOperator()){
+				
+				while(!opStack.isEmpty() 
+						&& !token.hasHigherPriority(opStack.peek())){
+					Token prevOperator = opStack.pop();
+					Float f2 = numStack.pop();
+					Float f1 = numStack.pop();
+					Float result = calculate(prevOperator.toString(), f1,f2);
+					numStack.push(result);						
+					
+				}
+				opStack.push(token);
+			} 
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			}
+		}
+		
+		while(!opStack.isEmpty()){
+			Token token = opStack.pop();
+			Float f2 = numStack.pop();
+			Float f1 = numStack.pop();
+			numStack.push(calculate(token.toString(), f1,f2));
+		}
+		
+		
+		return numStack.pop().floatValue();
+	}
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+
+	
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..20e34e8852
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 0000000000..9e501eda20
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,43 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class InfixToPostfix {
+
+	public static List<Token> convert(String expr) {
+		List<Token> inFixTokens = new TokenParser().parse(expr);
+		
+		List<Token> postFixTokens = new ArrayList<>();
+		
+		Stack<Token> opStack = new Stack<Token>();
+		for(Token token : inFixTokens){
+			
+			if(token.isOperator()){
+				
+				while(!opStack.isEmpty() 
+						&& !token.hasHigherPriority(opStack.peek())){
+					postFixTokens.add(opStack.pop());					
+					
+				}
+				opStack.push(token);		
+				
+			}
+			if(token.isNumber()){
+				
+				postFixTokens.add(token);
+				
+			}
+		}
+		
+		while(!opStack.isEmpty()){
+			postFixTokens.add(opStack.pop());	
+		}
+		
+		return postFixTokens;
+	}
+
+	
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
new file mode 100644
index 0000000000..f879f55f14
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class InfixToPostfixTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testConvert() {
+		{
+			List<Token> tokens = InfixToPostfix.convert("2+3");
+			Assert.assertEquals("[2, 3, +]", tokens.toString());
+		}
+		{
+		
+			List<Token> tokens = InfixToPostfix.convert("2+3*4");
+			Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString());
+		}
+		
+		{
+			
+			List<Token> tokens = InfixToPostfix.convert("2-3*4+5");
+			Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString());
+		}
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 0000000000..c54eb69e2a
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,46 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		
+		Stack<Float> numStack = new Stack<>();
+		for(Token token : tokens){
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			} else{
+				Float f2 = numStack.pop();
+				Float f1 = numStack.pop();
+				numStack.push(calculate(token.toString(),f1,f2));
+			}
+		}
+		return numStack.pop().floatValue();
+	}
+	
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 0000000000..c0435a2db5
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 0000000000..f811fd6d9a
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		Stack<Token> exprStack = new Stack<>();
+		Stack<Float> numStack = new Stack<>();
+		for(Token token : tokens){
+			exprStack.push(token);
+		}
+		
+		while(!exprStack.isEmpty()){
+			Token t = exprStack.pop();
+			if(t.isNumber()){
+				numStack.push(new Float(t.getIntValue()));
+			}else{
+				Float f1 = numStack.pop();
+				Float f2 = numStack.pop();
+				numStack.push(calculate(t.toString(),f1,f2));
+				
+			}		
+		}
+		return numStack.pop().floatValue();
+	}
+	
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 0000000000..5cec210e75
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 0000000000..8579743fe9
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 0000000000..d3b0f167e1
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 0000000000..399d3e857e
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 0000000000..284e5b0011
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,189 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		if(root == null){
+			return null;
+		}
+		return findMin(root).data;
+	}
+	public T findMax(){
+		if(root == null){
+			return null;
+		}
+		return findMax(root).data;
+	}
+	public int height() {
+	    return height(root);
+	}
+	public int size() {
+		return size(root);
+	}
+	public void remove(T e){
+		remove(e, root);
+	}
+	
+	private BinaryTreeNode<T> remove(T x, BinaryTreeNode<T> t){
+		if(t == null){
+			return t;
+		}
+		int compareResult = x.compareTo(t.data);
+		
+		if(compareResult< 0 ){			
+			t.left = remove(x,t.left);			
+			
+		} else if(compareResult > 0){			
+			t.right = remove(x, t.right);
+			
+		} else {
+			if(t.left != null && t.right != null){
+			
+				t.data = findMin(t.right).data;
+				t.right = remove(t.data,t.right);
+				
+			} else{
+				t = (t.left != null) ? t.left : t.right;
+			}
+		}
+		return t;
+	}
+	
+	private BinaryTreeNode<T> findMin(BinaryTreeNode<T> p){
+		if (p==null){
+			return null;
+		} else if (p.left == null){
+			return p;
+		} else{
+			return findMin(p.left);
+		}
+	}
+	private BinaryTreeNode<T> findMax(BinaryTreeNode<T> p){
+		if (p==null){
+			return null;
+		}else if (p.right==null){
+			return p;
+		} else{
+			return findMax(p.right);
+		}
+	}
+	private int height(BinaryTreeNode<T> t){
+	    if (t==null){
+	        return 0;
+	    }else {
+	        int leftChildHeight=height(t.left);
+	        int rightChildHeight=height(t.right);
+	        if(leftChildHeight > rightChildHeight){
+	        	return leftChildHeight+1;
+	        } else{
+	        	return rightChildHeight+1;
+	        }
+	    }
+	}
+	private int size(BinaryTreeNode<T> t){
+		if (t == null){
+			return 0;
+		}
+		return size(t.left) + 1 + size(t.right);
+       
+   }
+	
+	public List<T> levelVisit(){		
+		List<T> result = new ArrayList<T>();
+		if(root == null){
+			return result;
+		}
+		Queue<BinaryTreeNode<T>> queue = new Queue<BinaryTreeNode<T>>();  
+		BinaryTreeNode<T> node = root;		
+		queue.enQueue(node); 
+        while (!queue.isEmpty()) {  
+            node = queue.deQueue(); 
+            result.add(node.data); 
+            if (node.left != null){
+                queue.enQueue(node.left);  
+            }
+            if (node.right != null){
+                queue.enQueue(node.right);  
+            }
+        }   
+		return result;
+	}
+	public boolean isValid(){
+		return isValid(root);
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		if (root == null){
+            return null;
+		}
+		return lowestCommonAncestor(root,n1,n2);
+        
+	}
+	public List<T> getNodesBetween(T n1, T n2){
+		List<T> elements = new ArrayList<>();
+		getNodesBetween(elements,root,n1,n2);
+		return elements;
+	}
+	
+	public void  getNodesBetween(List<T> elements ,BinaryTreeNode<T> node, T n1, T n2){
+		
+        if (node == null) {
+            return;
+        } 
+  
+        if (n1.compareTo(node.data) < 0) {
+        	getNodesBetween(elements,node.left, n1, n2);
+        } 
+       
+        if ((n1.compareTo(node.data) <= 0 )
+        		&& (n2.compareTo(node.data) >= 0  )) {
+        	elements.add(node.data);            
+        } 
+        if (n2.compareTo(node.data)>0) {
+        	getNodesBetween(elements,node.right, n1, n2);
+        }
+	}
+	private T lowestCommonAncestor(BinaryTreeNode<T> node,T n1, T n2){
+		if(node == null){
+			return null;
+		}
+		// 如果n1和n2都比 node的值小， LCA在左孩子
+        if (node.data.compareTo(n1) > 0 && node.data.compareTo(n2) >0){
+            return lowestCommonAncestor(node.left, n1, n2);
+        }
+  
+        // 如果n1和n2都比 node的值小， LCA在右孩子
+        if (node.data.compareTo(n1) < 0 && node.data.compareTo(n2) <0) 
+            return lowestCommonAncestor(node.right, n1, n2);
+  
+        return node.data;
+	}
+	private boolean isValid(BinaryTreeNode<T> t){
+		if(t == null){
+			return true;
+		}
+		if(t.left != null && findMax(t.left).data.compareTo(t.data) >0){
+			return false;
+		}
+		if(t.right !=null && findMin(t.right).data.compareTo(t.data) <0){
+			return false;
+		}
+		if(!isValid(t.left) || !isValid(t.right)){
+			return false;
+		}
+		return true;
+	}
+}
+
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 0000000000..590e60306c
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,108 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		Assert.assertEquals("[3, 4, 5, 6, 8]",numbers.toString());
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..3f6f4d2b44
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,36 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 0000000000..f2a6515fa6
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,116 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		preOrderVisit(root, result);
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		inOrderVisit(root, result);
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		postOrderVisit(root, result);
+		return result;
+	}
+
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
+		
+		BinaryTreeNode<T> node = root;
+		
+		if(node != null){
+			stack.push(node);
+		}
+		
+		while(!stack.isEmpty()){
+			node = stack.pop();
+			result.add(node.data);
+			
+			if(node.right != null){
+				stack.push(node.right);
+			}
+			
+			if(node.left != null){
+				stack.push(node.right);
+			}			
+		}
+		return result;
+	}
+
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		BinaryTreeNode<T> node = root;
+		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
+
+		while (node != null || !stack.isEmpty()) {
+
+			while (node != null) {
+				stack.push(node);
+				node = node.left;
+			}
+			BinaryTreeNode<T> currentNode = stack.pop();
+			result.add(currentNode.data);			
+			node = currentNode.right;
+		}
+		return result;
+	}
+	
+	private static <T> void preOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		result.add(node.getData());
+		preOrderVisit(node.getLeft(), result);
+		preOrderVisit(node.getRight(), result);
+	}
+
+	private static <T> void inOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		inOrderVisit(node.getLeft(), result);
+		result.add(node.getData());
+		inOrderVisit(node.getRight(), result);
+	}
+
+	private static <T> void postOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		postOrderVisit(node.getLeft(), result);
+		postOrderVisit(node.getRight(), result);
+		result.add(node.getData());
+	}
+
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 0000000000..41857e137d
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 0000000000..85fb8ab2a4
--- /dev/null
+++ b/students/1377699408/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,34 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {
+		list(f, 0);
+	}
+
+	public void list(File f, int depth) {
+		printName(f, depth);
+		if (f.isDirectory()) {
+			File[] files = f.listFiles();
+			for (File i : files)
+				list(i, depth + 1);
+		}
+	}
+
+	void printName(File f, int depth) {
+		String name = f.getName();
+		for (int i = 0; i < depth; i++)
+			System.out.print("+");
+		if (f.isDirectory())
+			System.out.println("Dir: " + name);
+		else
+			System.out.println(f.getName() + " " + f.length());
+	}
+
+	public static void main(String args[]) {
+		FileList L = new FileList();
+		File f = new File("C:\\coderising\\tmp");
+		L.list(f);
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/pom.xml b/students/1377699408/data-structure/assignment/pom.xml
new file mode 100644
index 0000000000..5024466d17
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..900a3ad358
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..c3c8a3f27d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..4ff7f46ae0
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..36a9d2ce15
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..172371dd55
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 0000000000..436d092f58
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 0000000000..ab8c764584
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 0000000000..8c34bad0c3
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 0000000000..a651923ef5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 0000000000..aefc9692bb
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 0000000000..8660ec8109
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 0000000000..22ba4a5450
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 0000000000..2c7e128b2a
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/1377699408/data-structure/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<String,String> 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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1377699408/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/1377699408/data-structure/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/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..4576c016af
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..45740e6d57
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..994a241a3d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,57 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		
+	}
+	
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7fd72fc2b4
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..f4c7556a2e
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 0000000000..2e0550c67e
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+/**
+ * 用数组实现循环队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private final static int DEFAULT_SIZE = 10;
+	
+	//用数组来保存循环队列的元素
+	private Object[] elementData = new Object[DEFAULT_SIZE] ;
+	
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public boolean isEmpty() {
+		return false;
+        
+    }
+
+    public int size() {
+        return -1;
+    }
+
+    
+
+    public void enQueue(E data) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 0000000000..6a3ea639b9
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,18 @@
+package com.coding.basic.queue;
+
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){		
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 0000000000..7d90318b51
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 0000000000..c4c4b7325e
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 0000000000..cef19a8b59
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+
+    
+    public int size() {
+        return -1;   
+    }
+
+
+
+    public void enQueue(E item) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+
+
+
+ }
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 0000000000..f391d92b8f
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,19 @@
+package com.coding.basic.stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	public void push(int data){
+		
+	}
+	public int pop(){
+		return -1;
+	}
+	public int findMin(){
+		return -1;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..fedb243604
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..b0ec38161d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,48 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		
+		
+		
+	}
+	
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		return null;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		return false;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..76f2cb7668
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 0000000000..d0ab4387d2
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,16 @@
+package com.coding.basic.stack;
+
+
+public class StackWithTwoQueues {
+	
+
+    public void push(int data) {       
+
+    }
+
+    public int pop() {
+       return -1;
+    }
+
+    
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 0000000000..e86d056a24
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	Object[] data = new Object[10];
+	
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		return null;
+	}
+	
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		return null;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		return null;
+	}
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		return null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..ef85ff007f
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..20e34e8852
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 0000000000..96a2194a67
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+		
+		return null;
+	}
+	
+	
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 0000000000..dcbb18be4b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 0000000000..c0435a2db5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 0000000000..956927e2df
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 0000000000..5cec210e75
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 0000000000..8579743fe9
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 0000000000..d3b0f167e1
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 0000000000..399d3e857e
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 0000000000..4536ee7a2b
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,55 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		return null;
+	}
+	public T findMax(){
+		return null;
+	}
+	public int height() {
+	    return -1;
+	}
+	public int size() {
+		return -1;
+	}
+	public void remove(T e){
+		
+	}
+	public List<T> levelVisit(){
+		
+		return null;
+	}
+	public boolean isValid(){
+		return false;
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		return null;
+        
+	}
+	/**
+	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
+	 * 该二叉查找树中的某一节点
+	 * @param n1
+	 * @param n2
+	 * @return
+	 */
+	public List<T> getNodesBetween(T n1, T n2){
+		return null;
+	}
+	
+}
+
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 0000000000..4a53dbe2f1
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,109 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		System.out.println(numbers.toString());
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..c1421cd398
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,35 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 0000000000..b033cbe1d5
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,66 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的前序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的中序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 0000000000..41857e137d
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 0000000000..6e65192e4a
--- /dev/null
+++ b/students/1377699408/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,10 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {		
+	}
+
+	
+}
diff --git a/students/1377699408/ood/ood-assignment/pom.xml b/students/1377699408/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..ccffce577d
--- /dev/null
+++ b/students/1377699408/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<String,String> configurations = new HashMap<String,String>();
+	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/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/1377699408/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/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java
new file mode 100644
index 0000000000..1be735e5f5
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailException.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp;
+
+public class EmailException extends Exception {
+    public EmailException(String message) {
+        super(message);
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..4397366a16
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,57 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.dao.EmailDAO;
+
+import java.io.IOException;
+import java.util.*;
+
+public class PromotionMail {
+    private static EmailDAO emailDAO = new EmailDAO();
+
+    public static void main(String[] args) throws Exception {
+        List<Email> emailList = getEmails("product_promotion.txt");
+        for (Email email : emailList) {
+            sendEmail(email);
+        }
+
+    }
+
+    public static List<Email> getEmails(String file) throws IOException {
+        List<Email> emailList = new ArrayList<Email>();
+        List<Product> list = Product.getProductByFile(file);
+
+        for (Product p : list) {
+            String productId = p.getProductID();
+            List<Map<String, String>> l = emailDAO.listSubscriptionsByProdoctId(productId);
+            for (Map<String, String> userInfo : l) {
+                String username = userInfo.get("NAME");
+                String productDesc = p.getProductDesc();
+                String fromAddr = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+                List<String> toAddr = new ArrayList<String>();
+                toAddr.add(userInfo.get("EMAIL"));
+                String smtpServer = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+                Email email = new Email(fromAddr, toAddr, "\"您关注的产品降价了\"", "尊敬的 " + username + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!", smtpServer, fromAddr);
+                emailList.add(email);
+            }
+        }
+        return emailList;
+    }
+
+    public static void sendEmail(Email email) {
+        if (email == null) {
+            System.out.println("没有邮件发送");
+        }
+        try {
+            email.send();
+        } catch (EmailException e) {
+            email.setSmtpServer(Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+            try {
+                email.send();
+            } catch (EmailException e1) {
+                System.out.println("使用备用服务器发送失败");
+            }
+        }
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
new file mode 100644
index 0000000000..de6cfe1636
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
@@ -0,0 +1,102 @@
+package com.coderising.ood.srp.bean;
+
+
+import com.coderising.ood.srp.utils.CollectionUtils;
+import com.coderising.ood.srp.EmailException;
+import com.coderising.ood.srp.utils.StringUtils;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Email {
+    private String fromAddress;
+    private List<String> toAddresses;
+    private String subject;
+    private String content;
+    private String smtpServer;
+    private String email_admin;
+
+    public Email(String fromAddress, List<String> toAddresses, String subject, String content, String smtpServer, String email_admin) {
+        this.fromAddress = fromAddress;
+        this.toAddresses = toAddresses;
+        this.subject = subject;
+        this.content = content;
+        this.smtpServer = smtpServer;
+        this.email_admin = email_admin;
+    }
+
+    public void send() throws EmailException {
+        //假装发了一封邮件
+        check_send();
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(this.getFromAddress()).append("\n");
+        buffer.append("To:").append(Arrays.toString(this.getToAddresses().toArray())).append("\n");
+        buffer.append("Subject:").append(this.getSubject()).append("\n");
+        buffer.append("Content:").append(this.getContent()).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+    private void check_send() throws EmailException {
+        if (StringUtils.isBlank(this.fromAddress)) {
+            throw new EmailException("fromAddress is empty");
+        }
+        if (CollectionUtils.isEmpty(this.toAddresses)) {
+            throw new EmailException("toAddresses is empty");
+        }
+        if (StringUtils.isBlank(this.subject)) {
+            throw new EmailException("subject is empty");
+        }
+    }
+
+    public Email() {
+    }
+
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    public List<String> getToAddresses() {
+        return toAddresses;
+    }
+
+    public void setToAddresses(List<String> toAddresses) {
+        this.toAddresses = toAddresses;
+    }
+
+    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;
+    }
+
+    public String getSmtpServer() {
+        return smtpServer;
+    }
+
+    public void setSmtpServer(String smtpServer) {
+        this.smtpServer = smtpServer;
+    }
+
+    public String getEmail_admin() {
+        return email_admin;
+    }
+
+    public void setEmail_admin(String email_admin) {
+        this.email_admin = email_admin;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 0000000000..c3872c33bb
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,66 @@
+package com.coderising.ood.srp.bean;
+
+import com.coderising.ood.srp.utils.StringUtils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Product {
+    private String productID;
+    private String productDesc;
+
+    public static List<Product> getProductByFile(String f) throws IOException {
+        List<Product> list = new ArrayList<Product>();
+        File file = new File(f);
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String s = "";
+            while (!StringUtils.isBlank((s=br.readLine()))) {
+                String[] data = s.split(" ");
+                Product p = new Product(data[0], data[1]);
+                System.out.println("产品ID = " + data[0] + "\n");
+                System.out.println("产品描述 = " + data[1] + "\n");
+                list.add(p);
+            }
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+        return list;
+    }
+
+    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;
+    }
+
+    public Product() {
+
+    }
+
+    public Product(String productID, String productDesc) {
+
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java
new file mode 100644
index 0000000000..39975b9276
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/EmailDAO.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class EmailDAO {
+    public List<Map<String, String>> listSubscriptionsByProdoctId(String productId) {
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + productId + "' "
+                + "and send_mail=1 ";
+        List<Map<String, String>> userList = new ArrayList<Map<String, String>>();
+        for (int i = 1; i <= 3; i++) {
+            Map<String, String> userInfo = new HashMap<String, String>();
+            userInfo.put("NAME", "User" + i);
+            userInfo.put("EMAIL", "aa@bb.com");
+            userList.add(userInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/1377699408/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/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java
new file mode 100644
index 0000000000..ff60683472
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/CollectionUtils.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.utils;
+
+import java.util.List;
+
+public class CollectionUtils {
+    public static boolean isEmpty(List list) {
+        return list == null || list.size() == 0;
+    }
+}
diff --git a/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java
new file mode 100644
index 0000000000..4d86f4ba08
--- /dev/null
+++ b/students/1377699408/ood/ood-assignment/src/main/java/com/coderising/ood/srp/utils/StringUtils.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp.utils;
+
+public class StringUtils {
+    public static boolean isBlank(String s) {
+        return s == null || "".equals(s.trim());
+    }
+}

From 86d52a9b0a2f8eea1d99a777db26fb42d117bc6d Mon Sep 17 00:00:00 2001
From: duoduo1222 <277093528@qq.com>
Date: Wed, 14 Jun 2017 17:44:44 +0800
Subject: [PATCH 081/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=82=AE=E4=BB=B6?=
 =?UTF-8?q?=E5=8F=91=E9=80=81=E5=B0=8F=E7=A8=8B=E5=BA=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/277093528/ood-assignment/pom.xml     | 32 ++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java | 12 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 ++++++
 .../com/coderising/ood/srp/FileUtils.java     | 39 +++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 82 +++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  | 26 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 40 +++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 9 files changed, 283 insertions(+)
 create mode 100644 students/277093528/ood-assignment/pom.xml
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/277093528/ood-assignment/pom.xml b/students/277093528/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/277093528/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/277093528/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<String,String> 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/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..1cd9f713c8
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,12 @@
+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";
+	public static final String MESSAGE_FILE_PATH = "D:\\BaiduYunDownload\\Second_Season\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/277093528/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/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java
new file mode 100644
index 0000000000..e206b0aa24
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtils.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtils {
+	/**
+	 * 解析文件内容
+	 * @return
+	 * @throws IOException
+	 */
+	public static Product readFile() throws IOException {
+		
+		BufferedReader br = null;
+		try {
+			Product product = new Product();
+			File file = new File( ConfigurationKeys.MESSAGE_FILE_PATH );
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			product.setProductID(data[0]); 
+			product.setProductDesc(data[1]); 
+			
+			System.out.println("产品ID = " + data[0] + "\n");
+			System.out.println("产品描述 = " + data[1] + "\n");
+			return product;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		
+	}
+	
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..5765cb0070
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,82 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+
+	private static String smtpHost = null;
+	private static String altSmtpHost = null; 
+	private static String fromAddress = null;
+	private static String toAddress = null;
+	private static String subject = null;
+	private static String message = null;
+	
+	static {
+		Configuration config = new Configuration();
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+	
+	protected static void sendEmail(String toAddress, String subject, String message,
+			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());
+		
+	}
+	
+	protected static void sendEMails(boolean debug,Product product, List mailingList) throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				configureEMail((HashMap) iter.next(),product);  
+				try 
+				{
+					if ( toAddress.length() > 0 )
+						sendEmail(toAddress,  subject,  message,  debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(toAddress, subject, message, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	
+	private static void setMessage( HashMap userInfo,Product product) throws IOException {
+		String name = (String) userInfo.get( ConfigurationKeys.NAME_KEY );
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;		
+	}
+
+	private static void configureEMail(HashMap userInfo,Product product) throws IOException 
+	{
+		toAddress = (String) userInfo.get( ConfigurationKeys.EMAIL_KEY ); 
+		if (toAddress.length() > 0) 
+			setMessage( userInfo, product ); 
+	}
+
+	
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..ba93dd2f1b
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+
+public class Product {
+	
+	private String productID = null;
+	
+	private String productDesc = null;
+	
+	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/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..5c10796dbf
--- /dev/null
+++ b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class PromotionMail {
+	
+	protected String sendMailQuery = null;
+	private Product product = null;
+	
+	public static void main(String[] args) throws Exception {
+		
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail( emailDebug );
+		
+	}
+	
+	public PromotionMail( boolean mailDebug ) throws Exception {
+		
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		product = FileUtils.readFile();
+		
+		setLoadQuery();
+		
+		MailUtil.sendEMails(mailDebug, product ,loadMailingList()); 
+		
+	}
+	
+	protected void setLoadQuery() throws Exception {
+		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+	}
+	
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+}
diff --git a/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/277093528/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/277093528/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

From 8d3bd06979ed82ca4e419d21cacac8c86ec34fe0 Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Wed, 14 Jun 2017 18:20:24 +0800
Subject: [PATCH 082/332] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/PromotionMail.java | 28 ++++++++++---------
 .../ood/srp/config/ConfigurationKeys.java     |  3 ++
 .../ood/srp/config/ConnectionConfig.java      |  4 +++
 .../srp/model/{Mail.java => MailInfo.java}    | 10 +++++--
 .../com/coderising/ood/srp/model/Product.java |  8 ++----
 .../ood/srp/model/Subscriptions.java          |  5 ++++
 .../ood/srp/service/ProductService.java       |  2 +-
 .../ood/srp/service/SubscriptionsService.java |  7 +++++
 .../com/coderising/ood/srp/util/DBUtil.java   |  1 +
 9 files changed, 46 insertions(+), 22 deletions(-)
 rename students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/{Mail.java => MailInfo.java} (84%)

diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
index cd31beac90..9df4e1c77a 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -7,7 +7,7 @@
 
 import com.coderising.ood.srp.config.Configuration;
 import com.coderising.ood.srp.config.ConnectionConfig;
-import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.MailInfo;
 import com.coderising.ood.srp.model.Product;
 import com.coderising.ood.srp.model.Subscriptions;
 import com.coderising.ood.srp.service.ProductService;
@@ -27,7 +27,9 @@ public PromotionMail(SubscriptionsService subscriptionsService, ProductService p
 
 	/**
 	 * 发送促销邮件
-	 * @param file 促销产品文件
+	 * 
+	 * @param file
+	 *            促销产品文件
 	 * @param mailDebug
 	 * @throws Exception
 	 */
@@ -40,44 +42,44 @@ public void sendPromotionMail(File file, boolean mailDebug) throws Exception {
 		List<Subscriptions> subscriptions = subscriptionsService.doFindByProducts(products);
 
 		// 得到订阅人的邮箱和名称，邮箱内容
-		List<Mail> mails = getMails(subscriptions);
+		List<MailInfo> mails = getMails(subscriptions);
 
 		// 发送邮箱
 		sendEMails(new ConnectionConfig(new Configuration()), mails, mailDebug);
 	}
 
-	protected List<Mail> getMails(List<Subscriptions> subscriptions) {
+	// 得到发送的邮箱对象
+	protected List<MailInfo> getMails(List<Subscriptions> subscriptions) {
 
-		List<Mail> mails = new ArrayList<Mail>();
+		List<MailInfo> mails = new ArrayList<MailInfo>();
 		String subject = "您关注的产品降价了";
 
 		for (Subscriptions sub : subscriptions) {
 			String productDesc = sub.getProduct().getProductDesc();
 			String message = "尊敬的 " + sub.getName() + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
-			mails.add(new Mail(subject, message, sub.getEmail()));
+			mails.add(new MailInfo(subject, message, sub.getEmail()));
 		}
 		return mails;
 	}
 
-	protected void sendEMails(ConnectionConfig config, List<Mail> mails, boolean debug) {
+	// 发送邮件
+	protected void sendEMails(ConnectionConfig config, List<MailInfo> mails, boolean debug) {
 		if (mails == null) {
 			System.out.println("没有邮件需要发送");
 			return;
 		}
 		System.out.println("开始发送邮件");
-		Iterator<Mail> iter = mails.iterator();
+		Iterator<MailInfo> iter = mails.iterator();
 		while (iter.hasNext()) {
-			Mail mail = iter.next();
+			MailInfo mail = iter.next();
 			if (mail.getToAddress().length() <= 0) {
 				continue;
 			}
 			try {
-				MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(), mail.getMessage(),
-						config.getSmtpHost(), debug);
+				MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(), mail.getMessage(),config.getSmtpHost(), debug);
 			} catch (Exception e) {
 				try {
-					MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(),
-							mail.getMessage(), config.getAltSmtpHost(), debug);
+					MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(),mail.getMessage(), config.getAltSmtpHost(), debug);
 
 				} catch (Exception e2) {
 					System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
index 7fe226d1bd..1c99770ed8 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -1,5 +1,8 @@
 package com.coderising.ood.srp.config;
 
+/**
+ * 实际该类应该为配置文件
+ */
 public class ConfigurationKeys {
 
 	public static final String SMTP_SERVER = "smtp.server";
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
index be33ad6ed2..531efe251d 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java
@@ -1,5 +1,9 @@
 package com.coderising.ood.srp.config;
 
+/**
+ * 邮箱连接配置类
+ *
+ */
 public class ConnectionConfig {
 	private String smtpHost;
 	private String altSmtpHost;
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java
similarity index 84%
rename from students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java
rename to students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java
index f0b72d7759..2744e2fd1f 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Mail.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java
@@ -1,15 +1,19 @@
 package com.coderising.ood.srp.model;
 
-public class Mail {
+/**
+ * 邮箱信息
+ *
+ */
+public class MailInfo {
 	private String subject;
 	private String message;
 	private String toAddress;
 
-	public Mail() {
+	public MailInfo() {
 		super();
 	}
 
-	public Mail(String subject, String message, String toAddress) {
+	public MailInfo(String subject, String message, String toAddress) {
 		super();
 		this.subject = subject;
 		this.message = message;
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
index fbcbcf9a89..fcfc5f7cf4 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java
@@ -1,10 +1,8 @@
 package com.coderising.ood.srp.model;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
+/**
+ * 产品信息
+ */
 public class Product {
 
 	private String productID;
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
index 8ac1def689..8a25fe19ed 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java
@@ -1,7 +1,12 @@
 package com.coderising.ood.srp.model;
 
+/**
+ * 订阅信息，主要有订阅产品，订阅用户
+ * 
+ */
 public class Subscriptions {
 
+	// name 和 email 应该存放在用户信息中，如叫订阅用户，
 	private String name;
 	private String email;
 	private String productId;
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
index 23f5ffb7e3..aae01818f9 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/ProductService.java
@@ -10,7 +10,7 @@ public interface ProductService {
 
 	/**
 	 * 查询促销产品
-	 * @return
+	 * @return 促销产品
 	 * @throws IOException 
 	 */
 	List<Product> doFindPromotionalProducts(File file) throws IOException;
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
index 5b5cc2830b..c31c25c084 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java
@@ -7,5 +7,12 @@
 
 public interface SubscriptionsService {
 
+	/**
+	 * 查询产品的订阅人
+	 * 
+	 * @param products
+	 *            产品
+	 * @return 订阅信息
+	 */
 	List<Subscriptions> doFindByProducts(List<Product> products);
 }
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
index 9af40a67bd..33bb5cfd43 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -12,6 +12,7 @@ public class DBUtil {
 	 * @param sql
 	 * @return
 	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
 	public static List query(String sql) {
 
 		List userList = new ArrayList();

From 20457bc7f4bf672e2e988c9633cb6930e42f5a23 Mon Sep 17 00:00:00 2001
From: ShiningChenCode <chenhui2study@163.com>
Date: Wed, 14 Jun 2017 18:47:52 +0800
Subject: [PATCH 083/332] =?UTF-8?q?=E4=BF=83=E9=94=80Mail=E9=87=8D?=
 =?UTF-8?q?=E6=9E=84=E5=90=8E=EF=BC=8C=E5=8F=AF=E4=BB=A5=E6=A0=B9=E6=8D=AE?=
 =?UTF-8?q?=E4=B8=8D=E5=90=8C=E8=BF=90=E8=90=A5=E6=96=B9=E6=A1=88=EF=BC=8C?=
 =?UTF-8?q?=E5=90=91=E8=AE=A2=E9=98=85=E8=80=85=E5=8F=91=E9=80=81=E9=80=9A?=
 =?UTF-8?q?=E5=91=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 students/2831099157/ood-assignment/pom.xml    |  32 +++++
 .../com/coderising/ood/srp/PromotionMail.java |  21 ++++
 .../ood/srp/configure/Configuration.java      |  23 ++++
 .../ood/srp/configure/ConfigurationKeys.java  |   9 ++
 .../com/coderising/ood/srp/dao/DBUtil.java    |  27 +++++
 .../srp/interfaces/GetProductsFunction.java   |  13 ++
 .../ood/srp/interfaces/SendMailFunction.java  |  13 ++
 .../com/coderising/ood/srp/model/Mail.java    | 112 ++++++++++++++++++
 .../com/coderising/ood/srp/model/Product.java |  46 +++++++
 .../com/coderising/ood/srp/model/User.java    |  25 ++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../ood/srp/service/GetProductsFromFile.java  |  47 ++++++++
 .../ood/srp/service/GoodsArrivalNotice.java   |  13 ++
 .../coderising/ood/srp/service/Notice.java    |  25 ++++
 .../ood/srp/service/PricePromotion.java       |  12 ++
 .../ood/srp/service/SendGoodsArrivalMail.java |  42 +++++++
 .../ood/srp/service/SendPriceMail.java        |  42 +++++++
 ...10\351\207\215\346\236\204\357\274\211.md" |  23 ++++
 19 files changed, 533 insertions(+)
 create mode 100644 students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/2831099157/ood-assignment/pom.xml
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
 create mode 100644 "students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"

diff --git a/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/2831099157/ood-assignment/out/production/main/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/2831099157/ood-assignment/pom.xml b/students/2831099157/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/2831099157/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..9eb1b21f29
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.service.GoodsArrivalNotice;
+import com.coderising.ood.srp.service.Notice;
+
+/**
+ * 可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
+ */
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+        //降价促销
+//      Notice notice = new PricePromotion();
+        //到货通知
+        Notice notice = new GoodsArrivalNotice();
+        notice.sendMail(notice.getProducts());
+
+    }
+
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
new file mode 100644
index 0000000000..5c0697782a
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.configure;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
new file mode 100644
index 0000000000..c9cfba4974
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.configure;
+
+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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
new file mode 100644
index 0000000000..c0e7f6508d
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.dao;
+import com.coderising.ood.srp.model.User;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.seteMail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
new file mode 100644
index 0000000000..f0894ea3c7
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.interfaces;
+
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public interface GetProductsFunction {
+
+    List<Product> getProducts();
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
new file mode 100644
index 0000000000..cd27a45767
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.interfaces;
+
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public interface SendMailFunction {
+
+    void sendMail(List<Product> products);
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
new file mode 100644
index 0000000000..b94f27b29d
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
@@ -0,0 +1,112 @@
+package com.coderising.ood.srp.model;
+
+import com.coderising.ood.srp.configure.Configuration;
+import com.coderising.ood.srp.configure.ConfigurationKeys;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class Mail {
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String content;
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+
+    public Mail() {
+        Configuration config = new Configuration();
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+
+    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;
+    }
+
+
+    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 void send() {
+        if(null==toAddress){
+            System.out.println("发送地址不能为空");
+            return;
+        }
+        try {
+            sendMailBySmtpHost();
+        } catch (Exception e) {
+            try {
+                sendMailBySmtpHost();
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+
+        }
+    }
+
+    private void sendMailBySmtpHost() {
+        System.out.println("通过SMTP服务器开始发送邮件");
+        //假装发了一封邮件
+        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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+    private void sendMailByAlSmtpHost() {
+        System.out.println("通过备用SMTP服务器开始发送邮件");
+        //假装发了一封邮件
+        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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
new file mode 100644
index 0000000000..f9f5b5a145
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp.model;
+
+import com.coderising.ood.srp.dao.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class Product {
+    String id;
+    String description;
+
+    public Product(String id, String descript) {
+        this.id = id;
+        this.description = descript;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public List<User> getSubscribers() {
+        List<User> userList = null;
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + id + "' "
+                + "and send_mail=1 ";
+        userList = DBUtil.query(sendMailQuery);
+        return userList;
+
+    }
+
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
new file mode 100644
index 0000000000..38bec29f59
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.model;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class User {
+    String name;
+    String 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/2831099157/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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
new file mode 100644
index 0000000000..92a1090c5e
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
@@ -0,0 +1,47 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.GetProductsFunction;
+import com.coderising.ood.srp.model.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class GetProductsFromFile implements GetProductsFunction {
+    public String filePath = "E:\\StudyProjects\\Java\\Workspace\\HomeWork\\coding2017\\liuxin\\ood\\ood-assignment\\" +
+            "src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+    @Override
+    public List<Product> getProducts() {
+        BufferedReader br = null;
+        List<Product> products = new ArrayList<>();
+        try {
+            File file = new File(filePath);
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product(data[0], data[1]);
+                System.out.println("促销产品ID = " + product.getId());
+                System.out.println("促销产品描述 = " + product.getDescription());
+                products.add(product);
+            }
+
+        } catch (IOException e) {
+            System.out.println("读取文件失败");
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return products;
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
new file mode 100644
index 0000000000..ee4723ec06
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.service;
+
+/**
+ * Created by Iden on 2017/6/14.
+ * 到货通知
+ */
+public class GoodsArrivalNotice extends Notice {
+    public GoodsArrivalNotice() {
+        getProductsFunction = new GetProductsFromFile();
+        sendMailFunction = new SendGoodsArrivalMail();
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
new file mode 100644
index 0000000000..6ac8e62402
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.GetProductsFunction;
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ * 各类通知（降价促销，抢购活动，到货通知等等）
+ */
+public abstract class Notice {
+    GetProductsFunction getProductsFunction;
+    SendMailFunction sendMailFunction;
+
+    public List<Product> getProducts() {
+        return getProductsFunction.getProducts();
+    }
+
+    public void sendMail(List<Product> products) {
+        sendMailFunction.sendMail(products);
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
new file mode 100644
index 0000000000..ebb59571c0
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.service;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class PricePromotion extends Notice {
+    public PricePromotion() {
+        getProductsFunction = new GetProductsFromFile();
+        sendMailFunction = new SendPriceMail();
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
new file mode 100644
index 0000000000..79f3a6985f
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.User;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class SendGoodsArrivalMail implements SendMailFunction {
+
+
+    @Override
+    public void sendMail(List<Product> products) {
+        if (null == products || products.size() == 0) {
+            System.out.println("没有发现到货的产品");
+            return;
+        }
+        Iterator<Product> iterator = products.iterator();
+        while (iterator.hasNext()) {
+            Product product = iterator.next();
+            List<User> userList = product.getSubscribers();
+            if (null == userList || userList.size() == 0) {
+                System.out.println("没有人订阅" + product.getDescription() + " 信息");
+                continue;
+            }
+            Iterator iter = userList.iterator();
+            while (iter.hasNext()) {
+                User user = (User) iter.next();
+                Mail mail = new Mail();
+                mail.setSubject("您关注的产品到货了");
+                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 到货了，欢迎购买");
+                mail.setToAddress(user.geteMail());
+                mail.send();
+            }
+        }
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
new file mode 100644
index 0000000000..bae4803e3f
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.User;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class SendPriceMail implements SendMailFunction {
+
+
+    @Override
+    public void sendMail(List<Product> products) {
+        if (null == products || products.size() == 0) {
+            System.out.println("没有发现需要促销的产品");
+            return;
+        }
+        Iterator<Product> iterator = products.iterator();
+        while (iterator.hasNext()) {
+            Product product = iterator.next();
+            List<User> userList = product.getSubscribers();
+            if (null == userList || userList.size() == 0) {
+                System.out.println("没有人订阅 " + product.getDescription() + " 信息");
+                continue;
+            }
+            Iterator iter = userList.iterator();
+            while (iter.hasNext()) {
+                User user = (User) iter.next();
+                Mail mail = new Mail();
+                mail.setSubject("您关注的产品降价了");
+                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 降价了，欢迎购买");
+                mail.setToAddress(user.geteMail());
+                mail.send();
+            }
+        }
+    }
+}
diff --git "a/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md" "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
new file mode 100644
index 0000000000..33634cb9a9
--- /dev/null
+++ "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
@@ -0,0 +1,23 @@
+# 第一次OOD练习 #
+
+## 需求 ##
+### 原项目已经实现根据产品列表文件发送促销Mail，需求一直在变化，比如通过数据库获取促销产品或者促销活动改为到货通知，抢购等；为了应变各种变化，需重构代码。 ###
+## 需求分析 ##
+需求可变因素:</br>
+
+1. 促销产品列表文件可能会变更，或者变更获取方式（如通过数据库获取）
+2. 促销活动会根据运营情况变更
+## 重构方案 ##
+1. 提取GetProductsFunction，SendMailFunction接口
+2. 添加Notice抽象类，针对接口添加getProducts,sendMai方法 -------各类通知（降价促销，抢购活动，到货通知等等）
+3. 添加Mail,Product,User实体类
+4. Mail初始化设置smtpHost,alSmtpHost,fromAddress参数，添加sendMail功能
+5. Product添加getSubscribers功能
+6. 添加GetProductsFunction，SendMailFunction接口实现类
+7. 添加PricePromotion继承Promotion，实现降价促销功能，实例化GetProductsFunction，SendMailFunction接口    
+8. 主函数调用sendMail方法
+
+## 重构后 ##
+重构后项目，可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
+
+

From 312602f928acca1625ea44d742f5adea308f7101 Mon Sep 17 00:00:00 2001
From: gongxun <gongxun@wesai.com>
Date: Wed, 14 Jun 2017 18:51:06 +0800
Subject: [PATCH 084/332] =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../785396327/first/ood/srp/ConfigParser.java |  9 +++
 .../785396327/first/ood/srp/DBParser.java     | 22 +++++++
 .../785396327/first/ood/srp/EmailParser.java  | 63 ++++---------------
 .../785396327/first/ood/srp/FileParser.java   | 16 ++---
 .../first/ood/srp/PromotionFileParser.java    | 27 ++++++++
 .../ood/srp/PromotionMailConfigParser.java    | 15 +++++
 .../first/ood/srp/PromotionMailDBParser.java  | 39 ++++++++++++
 .../785396327/first/ood/srp/SendMailTest.java | 10 ++-
 8 files changed, 137 insertions(+), 64 deletions(-)
 create mode 100644 students/785396327/first/ood/srp/ConfigParser.java
 create mode 100644 students/785396327/first/ood/srp/DBParser.java
 create mode 100644 students/785396327/first/ood/srp/PromotionFileParser.java
 create mode 100644 students/785396327/first/ood/srp/PromotionMailConfigParser.java
 create mode 100644 students/785396327/first/ood/srp/PromotionMailDBParser.java

diff --git a/students/785396327/first/ood/srp/ConfigParser.java b/students/785396327/first/ood/srp/ConfigParser.java
new file mode 100644
index 0000000000..21ab317bc9
--- /dev/null
+++ b/students/785396327/first/ood/srp/ConfigParser.java
@@ -0,0 +1,9 @@
+package first.ood.srp;
+
+/**
+ * Created by gongxun on 2017/6/14.
+ */
+public abstract class ConfigParser {
+
+   abstract void parseInfoFromConfig(Email email);
+}
diff --git a/students/785396327/first/ood/srp/DBParser.java b/students/785396327/first/ood/srp/DBParser.java
new file mode 100644
index 0000000000..d85f602528
--- /dev/null
+++ b/students/785396327/first/ood/srp/DBParser.java
@@ -0,0 +1,22 @@
+package first.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by gongxun on 2017/6/14.
+ */
+public abstract class DBParser<T> {
+    private String sql;
+
+    protected DBParser(String sql) {
+        this.sql = sql;
+    }
+
+    protected List<T> parseInfoFromDB(Email email) {
+        List<HashMap<String, String>> data = DBUtil.query(sql, null);
+        return convertData(email, data);
+    }
+
+    abstract List<T> convertData(Email email, List<HashMap<String, String>> data);
+}
diff --git a/students/785396327/first/ood/srp/EmailParser.java b/students/785396327/first/ood/srp/EmailParser.java
index 06782d2c09..74341ad610 100644
--- a/students/785396327/first/ood/srp/EmailParser.java
+++ b/students/785396327/first/ood/srp/EmailParser.java
@@ -1,63 +1,26 @@
 package first.ood.srp;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 /**
  * Created by gongxun on 2017/6/12.
  */
 public class EmailParser {
-
-    public List<PromotionMail> parseEmailList(String filepath, String loadQuery) {
-        PromotionMail email = packageInfoFromConfig();
-        packageInfoFromFile(email, filepath);
-        return packageInfoFromDB(loadQuery, email);
-    }
-
-    private String parseMessage(HashMap<String, String> map, PromotionMail promotionMail) {
-        String name = map.get(ConfigurationKeys.NAME_KEY);
-        String message = "尊敬的 " + name + ", 您关注的产品 " + promotionMail.getProductDesc() + " 降价了，欢迎购买!";
-        return message;
-    }
-
-    private String parseToAddress(HashMap<String, String> map) {
-        return map.get(ConfigurationKeys.EMAIL_KEY);
-    }
-
-
-    private List<PromotionMail> packageInfoFromDB(String loadQuery, PromotionMail email) {
-        List<HashMap<String, String>> individualInfo = getIndividualInfo(loadQuery, new Object[]{email.getproductID()});
-        List<PromotionMail> mailList = new ArrayList<PromotionMail>();
-        for (HashMap<String, String> map : individualInfo) {
-            PromotionMail completeMail = new PromotionMail();
-            BeanUtils.copyProperties(completeMail, email);
-            completeMail.setToAddress(parseToAddress(map));
-            completeMail.setMessage(parseMessage(map, completeMail));
-            completeMail.setSubject("您关注的产品降价了");
-            mailList.add(completeMail);
-        }
-        return mailList;
-    }
-
-    private PromotionMail packageInfoFromFile(PromotionMail email, String filepath) {
-        FileParser fileParser = new FileParser(filepath);
-        email.setProductDesc(fileParser.parseProductDesc());
-        email.setProductID(fileParser.parseProductID());
-        return email;
+    private ConfigParser configParser;
+    private FileParser fileParser;
+    private DBParser dbParser;
+
+    public EmailParser(ConfigParser configParser,FileParser fileParser,DBParser dbParser) {
+        this.configParser = configParser;
+        this.fileParser = fileParser;
+        this.dbParser = dbParser;
     }
 
-    private PromotionMail packageInfoFromConfig() {
-        PromotionMail email = new PromotionMail();
-
-        Configuration configuration = new Configuration();
-        email.setSMTPHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
-        email.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
-        email.setAltSMTPHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
-        return email;
+    public List<Email> parseEmailList() {
+        PromotionMail promotionMail = new PromotionMail();
+        configParser.parseInfoFromConfig(promotionMail);
+        fileParser.parseInfoFromFile(promotionMail);
+        return dbParser.parseInfoFromDB(promotionMail);
     }
 
-    private List<HashMap<String, String>> getIndividualInfo(String loadQuery, Object[] params) {
-        return DBUtil.query(loadQuery, params);
-    }
 }
diff --git a/students/785396327/first/ood/srp/FileParser.java b/students/785396327/first/ood/srp/FileParser.java
index 52827cdd32..1f14c11389 100644
--- a/students/785396327/first/ood/srp/FileParser.java
+++ b/students/785396327/first/ood/srp/FileParser.java
@@ -7,10 +7,10 @@
 /**
  * Created by gongxun on 2017/6/12.
  */
-public class FileParser {
-    private String[] data;
+public abstract class FileParser {
+    protected String[] data;
 
-    public FileParser(String filePath) {
+    protected FileParser(String filePath) {
         try {
             if (StringUtils.isEmpty(filePath))
                 throw new RuntimeException("init file parser must contains a legal file");
@@ -20,8 +20,7 @@ public FileParser(String filePath) {
         }
     }
 
-    private void readFile(String filePath) throws IOException
-    {
+    private void readFile(String filePath) throws IOException {
         BufferedReader br = null;
         try {
             br = new BufferedReader(new FileReader(filePath));
@@ -34,11 +33,6 @@ private void readFile(String filePath) throws IOException
         }
     }
 
-    public String parseProductID() {
-        return data[0];
-    }
+    protected abstract void parseInfoFromFile(Email email);
 
-    public String parseProductDesc() {
-        return data[1];
-    }
 }
diff --git a/students/785396327/first/ood/srp/PromotionFileParser.java b/students/785396327/first/ood/srp/PromotionFileParser.java
new file mode 100644
index 0000000000..78a8dfaa66
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionFileParser.java
@@ -0,0 +1,27 @@
+package first.ood.srp;
+
+/**
+ * Created by gongxun on 2017/6/14.
+ */
+public class PromotionFileParser extends FileParser {
+
+
+    public PromotionFileParser(String filePath) {
+        super(filePath);
+    }
+
+    @Override
+    protected void parseInfoFromFile(Email email) {
+        PromotionMail promotionMail = (PromotionMail) email;
+        promotionMail.setProductID(parseProductID());
+        promotionMail.setProductDesc(parseProductDesc());
+    }
+
+    private String parseProductID() {
+        return super.data[0];
+    }
+
+    private String parseProductDesc() {
+        return super.data[1];
+    }
+}
diff --git a/students/785396327/first/ood/srp/PromotionMailConfigParser.java b/students/785396327/first/ood/srp/PromotionMailConfigParser.java
new file mode 100644
index 0000000000..dd6ce2e89f
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionMailConfigParser.java
@@ -0,0 +1,15 @@
+package first.ood.srp;
+
+/**
+ * Created by gongxun on 2017/6/14.
+ */
+public class PromotionMailConfigParser extends ConfigParser {
+
+    @Override
+    void parseInfoFromConfig(Email email) {
+        Configuration configuration = new Configuration();
+        email.setSMTPHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+        email.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        email.setAltSMTPHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+    }
+}
diff --git a/students/785396327/first/ood/srp/PromotionMailDBParser.java b/students/785396327/first/ood/srp/PromotionMailDBParser.java
new file mode 100644
index 0000000000..68878c02d4
--- /dev/null
+++ b/students/785396327/first/ood/srp/PromotionMailDBParser.java
@@ -0,0 +1,39 @@
+package first.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by gongxun on 2017/6/14.
+ */
+public class PromotionMailDBParser extends DBParser<PromotionMail> {
+
+    protected PromotionMailDBParser(String sql) {
+        super(sql);
+    }
+
+    @Override
+    List<PromotionMail> convertData(Email email, List<HashMap<String, String>> data) {
+        List<PromotionMail> mailList = new ArrayList<PromotionMail>();
+        for (HashMap<String, String> map : data) {
+            PromotionMail completeMail = new PromotionMail();
+            BeanUtils.copyProperties(completeMail, email);
+            completeMail.setToAddress(parseToAddress(map));
+            completeMail.setMessage(parseMessage(map, completeMail));
+            completeMail.setSubject("您关注的产品降价了");
+            mailList.add(completeMail);
+        }
+        return mailList;
+    }
+
+    private String parseMessage(HashMap<String, String> map, PromotionMail promotionMail) {
+        String name = map.get(ConfigurationKeys.NAME_KEY);
+        String message = "尊敬的 " + name + ", 您关注的产品 " + promotionMail.getProductDesc() + " 降价了，欢迎购买!";
+        return message;
+    }
+
+    private String parseToAddress(HashMap<String, String> map) {
+        return map.get(ConfigurationKeys.EMAIL_KEY);
+    }
+}
diff --git a/students/785396327/first/ood/srp/SendMailTest.java b/students/785396327/first/ood/srp/SendMailTest.java
index d82df14609..ef917aa593 100644
--- a/students/785396327/first/ood/srp/SendMailTest.java
+++ b/students/785396327/first/ood/srp/SendMailTest.java
@@ -8,12 +8,16 @@
 public class SendMailTest {
 
     public static void main(String[] args) {
-        String loadQuery = "Select name from subscriptions where product_id= ? and send_mail=1";
+        String sql = "Select name from subscriptions where product_id= ? and send_mail=1";
         String filepath = "D:\\workspace\\IDEA\\homework\\coding2017_section2\\coding2017\\students\\785396327\\first\\ood\\srp\\product_promotion.txt";
         boolean isDebug = false;
 
-        EmailParser emailParser = new EmailParser();
-        List<PromotionMail> promotionMails = emailParser.parseEmailList(filepath, loadQuery);
+        ConfigParser configParser = new PromotionMailConfigParser();
+        FileParser fileParser = new PromotionFileParser(filepath);
+        DBParser<PromotionMail> DBParser = new PromotionMailDBParser(sql);
+
+        EmailParser emailParser = new EmailParser(configParser, fileParser, DBParser);
+        List promotionMails = emailParser.parseEmailList();
         MailSender mailSender = new MailSender();
         mailSender.sendMailList(promotionMails, isDebug);
     }

From aacfc516d9b527422345438ab52e9b730c030ae1 Mon Sep 17 00:00:00 2001
From: Xujie <jie.xu@coer-scnu.org>
Date: Wed, 14 Jun 2017 19:09:10 +0800
Subject: [PATCH 085/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9Asrp=E5=B7=A5=E7=A8=8B=E7=9A=84=E9=87=8D=E6=9E=8401?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

1、增加FileUtil类，负责读取txt中降价产品。
2、增加Product类，包含id和desc属性。
3、重构MailUtil类，负责配置邮件服务器和发送邮件。
4、增加UserService类，负责获得关注降价产品的用户列表。
5、重构PromotionMail类，只负责设置邮件主题、正文、收件人列表，以及发送邮件。
---
 .../edu/coerscnu/ood/srp/Configuration.java   | 25 +++++
 .../coerscnu/ood/srp/ConfigurationKeys.java   |  9 ++
 .../src/edu/coerscnu/ood/srp/DBUtil.java      | 26 ++++++
 .../src/edu/coerscnu/ood/srp/FileUtil.java    | 37 ++++++++
 .../src/edu/coerscnu/ood/srp/MailUtil.java    | 73 +++++++++++++++
 .../src/edu/coerscnu/ood/srp/Product.java     | 33 +++++++
 .../edu/coerscnu/ood/srp/PromotionMail.java   | 93 +++++++++++++++++++
 .../src/edu/coerscnu/ood/srp/UserService.java | 28 ++++++
 .../coerscnu/ood/srp/product_promotion.txt    |  4 +
 9 files changed, 328 insertions(+)
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/product_promotion.txt

diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java
new file mode 100644
index 0000000000..b6a82c425f
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Configuration.java
@@ -0,0 +1,25 @@
+package edu.coerscnu.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String, Object> 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");
+		configurations.put(ConfigurationKeys.IS_DEBUG, true);
+	}
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public Object getProperty(String key) {
+		return configurations.get(key);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..b7cecc897b
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package edu.coerscnu.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";
+	public static final String IS_DEBUG = "debug";
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..6632d110fa
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/DBUtil.java
@@ -0,0 +1,26 @@
+package edu.coerscnu.ood.srp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+	/**
+	 * 获取用户列表，应该从数据库读， 但是简化为直接生成。
+	 * 
+	 * @param sql
+	 * @return
+	 */
+	public static List<HashMap<String, String>> query(String sql) {
+
+		List<HashMap<String, String>> userList = new ArrayList<HashMap<String, String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String, String> userInfo = new HashMap<String, String>();
+			userInfo.put(UserService.NAME_KEY, "User" + i);
+			userInfo.put(UserService.MAIL_KEY, i + "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..fd474c2da2
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/FileUtil.java
@@ -0,0 +1,37 @@
+package edu.coerscnu.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * FileUtil类负责读取.txt文件内容，并以List<String[]>（产品id，产品描述）形式返回。
+ * 
+ * @author xujie
+ *
+ */
+public class FileUtil {
+
+	public static List<String[]> readFile(String path) throws IOException {
+		BufferedReader br = null;
+		List<String[]> list = new ArrayList<>();
+		try {
+			File file = new File(path);
+			FileReader fr = new FileReader(file);
+			br = new BufferedReader(fr);
+			String temp;
+			while ((temp = br.readLine()) != null) {
+				String[] data = temp.split(" ");
+				list.add(data);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			br.close();
+		}
+		return list;
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..806c9fff62
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
@@ -0,0 +1,73 @@
+package edu.coerscnu.ood.srp;
+
+/**
+ * 邮件类公共类 1、配置服务器 2、发送邮件
+ * 
+ * @author xujie
+ *
+ */
+public class MailUtil {
+
+	private static String smtpHost; // 主服务器
+	private static String altSmtpHost; // 备用服务器
+	private static String fromAddress; // 发件人
+	private static boolean isDebug; // 是否为调试环境
+
+	/**
+	 * 配置服务器
+	 */
+	public static void configureHost() {
+		Configuration config = new Configuration();
+		smtpHost = (String) config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = (String) config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		fromAddress = (String) config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		isDebug = (boolean) config.getProperty(ConfigurationKeys.IS_DEBUG);
+	}
+
+	/**
+	 * 发送邮件，对外不可见
+	 * 
+	 * @param toAddress
+	 * @param fromAddress
+	 * @param subject
+	 * @param message
+	 * @param smtpHost
+	 * @param debug
+	 */
+	private static void sendMail(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());
+	}
+
+	/**
+	 * 发送邮件，对外可见
+	 * 
+	 * @param toAddress
+	 * @param subject
+	 * @param message
+	 */
+	public static void sendMail(String toAddress, String subject, String message) {
+		configureHost();
+		if (isDebug) {
+			System.out.println("调试环境");
+		} else {
+			System.out.println("正式环境");
+		}
+		if (smtpHost != null) {
+			System.out.println("使用主服务器发送邮件");
+			sendMail(toAddress, fromAddress, subject, message, smtpHost, isDebug);
+		} else if (altSmtpHost != null) {
+			System.out.println("使用备用服务器发送邮件");
+			sendMail(toAddress, fromAddress, subject, message, altSmtpHost, isDebug);
+		} else {
+			System.out.println("服务器异常，无法发送邮件");
+		}
+
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java
new file mode 100644
index 0000000000..64cbcc6d0c
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/Product.java
@@ -0,0 +1,33 @@
+package edu.coerscnu.ood.srp;
+
+/**
+ * 产品类，包含id和描述两个属性
+ * 
+ * @author xujie
+ *
+ */
+public class Product {
+	protected String productID = null;
+	protected String productDesc = null;
+
+	public Product(String id, String desc) {
+		productID = id;
+		productDesc = desc;
+	}
+
+	public void setProductID(String id) {
+		productID = id;
+	}
+
+	public void setProductDesc(String desc) {
+		productDesc = desc;
+	}
+
+	public String getProductID() {
+		return productID;
+	}
+
+	public String getProductDesc() {
+		return productDesc;
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..14d80dcaf9
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
@@ -0,0 +1,93 @@
+package edu.coerscnu.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 促销邮件类
+ * 
+ * 1、设置邮件主题
+ * 
+ * 2、设置邮件正文
+ * 
+ * 3、设置邮件收件人列表
+ * 
+ * 4、发送邮件
+ * 
+ * @author xujie
+ *
+ */
+public class PromotionMail {
+
+	protected String subject = null;
+	protected String message = null;
+	protected List<HashMap<String, String>> mailList;
+
+	public static void main(String[] args) throws Exception {
+
+		String path = "src/edu/coerscnu/ood/srp/product_promotion.txt";
+		List<String[]> productList = FileUtil.readFile(path);
+		for (String[] prod : productList) {
+			Product product = new Product(prod[0], prod[1]);
+			PromotionMail pm = new PromotionMail();
+			pm.setMailList(product);
+			pm.sendMails(product);
+		}
+	}
+
+	/**
+	 * 设置邮件主题
+	 * 
+	 * @param subject
+	 */
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	/**
+	 * 设置邮件正文
+	 * 
+	 * @param userInfo
+	 * @param product
+	 * @throws IOException
+	 */
+	protected void setMessage(HashMap<String, String> userInfo, Product product) throws IOException {
+		String name = (String) userInfo.get(UserService.NAME_KEY);
+		String desc = product.getProductDesc();
+		message = "尊敬的 " + name + ", 您关注的产品 " + desc + " 降价了，欢迎购买!";
+	}
+
+	/**
+	 * 设置收件人列表
+	 * 
+	 * @param product
+	 * @throws Exception
+	 */
+	protected void setMailList(Product product) throws Exception {
+		UserService userService = new UserService();
+		userService.setLoadQuery(product);
+		mailList = userService.loadMailingList();
+	}
+
+	/**
+	 * 发送邮件
+	 * 
+	 * @throws IOException
+	 */
+	protected void sendMails(Product product) throws IOException {
+		if (mailList != null) {
+			Iterator<HashMap<String, String>> iter = mailList.iterator();
+			while (iter.hasNext()) {
+				HashMap<String, String> user = iter.next();
+				String toAddress = (String) user.get(UserService.MAIL_KEY);
+				if (toAddress.length() > 0) {
+					setSubject("您关注的产品降价了");
+					setMessage(user, product);
+					MailUtil.sendMail(toAddress, subject, message);
+				}
+			}
+		}
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java
new file mode 100644
index 0000000000..af04bf5709
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/UserService.java
@@ -0,0 +1,28 @@
+package edu.coerscnu.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 用户类，获取关注降价产品的客户的名字和邮箱地址
+ * 
+ * @author xujie
+ *
+ */
+public class UserService {
+
+	protected static final String NAME_KEY = "NAME";
+	protected static final String MAIL_KEY = "EMAIL";
+	
+	protected String query = "";
+
+	protected void setLoadQuery(Product product) {
+		query = "Select name from subscriptions " + "where product_id= '" + product.getProductID() + "' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set\n");
+	}
+
+	protected List<HashMap<String, String>> loadMailingList() throws Exception {
+		return DBUtil.query(query);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/product_promotion.txt b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/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

From 9c8a7b57e001e08f30fe7916d63c62fee70d2323 Mon Sep 17 00:00:00 2001
From: Xujie <jie.xu@coer-scnu.org>
Date: Wed, 14 Jun 2017 19:11:32 +0800
Subject: [PATCH 086/332] =?UTF-8?q?=E5=B9=BF=E5=B7=9E-=E8=AE=B8=E6=B4=81?=
 =?UTF-8?q?=EF=BC=9A=E7=AC=AC=E4=B8=80=E6=AC=A1ood=E4=BD=9C=E4=B8=9Asrp?=
 =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E9=87=8D=E6=9E=8402?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

1、增加FileUtil类，负责读取txt中降价产品。
2、增加Product类，包含id和desc属性。
3、重构MailUtil类，负责配置邮件服务器和发送邮件。
4、增加UserService类，负责获得关注降价产品的用户列表。
5、重构PromotionMail类，只负责设置邮件主题、正文、收件人列表，以及发送邮件。
---
 .../assignment01/src/edu/coerscnu/ood/srp/MailUtil.java         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
index 806c9fff62..1dd007b3d5 100644
--- a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/MailUtil.java
@@ -1,7 +1,7 @@
 package edu.coerscnu.ood.srp;
 
 /**
- * 邮件类公共类 1、配置服务器 2、发送邮件
+ * 邮件公共类 1、配置服务器 2、发送邮件
  * 
  * @author xujie
  *

From 9b9a3a8068a9a2eff80835807c5664265eec0b4d Mon Sep 17 00:00:00 2001
From: Lyccccc <liuyuchen_0312@163.com>
Date: Wed, 14 Jun 2017 21:34:26 +0800
Subject: [PATCH 087/332] ood-assignment task

---
 students/472779948/ood-assignment/pom.xml     | 34 ++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 +++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   | 37 ++++++++
 .../com/coderising/ood/srp/FileManager.java   | 25 ++++++
 .../java/com/coderising/ood/srp/Mail.java     | 83 ++++++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 23 +++++
 .../java/com/coderising/ood/srp/Product.java  | 30 +++++++
 .../com/coderising/ood/srp/PromotionMail.java | 85 +++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 10 files changed, 353 insertions(+)
 create mode 100644 students/472779948/ood-assignment/pom.xml
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/472779948/ood-assignment/pom.xml b/students/472779948/ood-assignment/pom.xml
new file mode 100644
index 0000000000..06d60721b0
--- /dev/null
+++ b/students/472779948/ood-assignment/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+      <maven.compiler.source>1.8</maven.compiler.source>
+      <maven.compiler.target>1.8</maven.compiler.target>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/472779948/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<String,String> 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/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/472779948/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/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..930ab2805c
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+
+	protected String sendMailQuery = null;
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param productID
+	 * @return
+	 */
+	public static List query(String productID){
+		
+		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;
+	}
+
+	protected void setLoadQuery(String productID) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+	}
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java
new file mode 100644
index 0000000000..a280c09d67
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/FileManager.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileManager {
+    //读取配置文件方法，单独提出来，其他的类需要时可复用
+    public static String[] readFile(File file) throws IOException // @02C
+    {
+        String data[] = null;
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            data = temp.split(" ");
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return data;
+    }
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..42da2ec0b1
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,83 @@
+package com.coderising.ood.srp;
+
+public class Mail {
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+    private String toAddress = null;
+    private String subject = null;
+    private String message = null;
+
+
+    public Mail() {
+    }
+
+    public Mail(String smtpHost, String altSmtpHost, String fromAddress, String toAddress, String subject, String message) {
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    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 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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @Override
+    public String toString() {
+        return "Mail{" +
+                "smtpHost='" + smtpHost + '\'' +
+                ", altSmtpHost='" + altSmtpHost + '\'' +
+                ", fromAddress='" + fromAddress + '\'' +
+                ", toAddress='" + toAddress + '\'' +
+                ", subject='" + subject + '\'' +
+                ", message='" + message + '\'' +
+                '}';
+    }
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..ff00545c91
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail, boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(mail.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+
+	}
+
+	public static List loadMailingList(String productID) throws Exception {
+		return DBUtil.query(productID);
+	}
+
+	
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..e4074ba44a
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by lenovo on 2017/6/13.
+ */
+public class Product {
+    private String productID;
+    private String productDesc;
+
+    public Product(String productID, String productDesc) {
+        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/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..f7e083ec4b
--- /dev/null
+++ b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,85 @@
+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 Mail mail = null;
+    protected Product product = 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("E:\\workspace\\private\\projects\\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 {
+        config = new Configuration();
+
+        //构造Mail对象
+        mail = new Mail();
+        mail.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        mail.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+        mail.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] data = FileManager.readFile(file);
+        product = new Product(data[0],data[1]);
+
+        sendEMails(mailDebug, MailUtil.loadMailingList(product.getproductID()));//MailUtil
+    }
+
+    protected void setMessage(HashMap userInfo) throws IOException {
+        String name = (String) userInfo.get(NAME_KEY);
+        mail.setSubject("您关注的产品降价了");
+        mail.setMessage("尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");
+
+    }
+
+    protected void configureEMail(HashMap userInfo) throws IOException {
+        mail.setToAddress((String) userInfo.get(EMAIL_KEY));
+        if (mail.getToAddress().length() > 0)
+            setMessage(userInfo);
+    }
+
+    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 (mail.getToAddress().length() > 0)
+                        MailUtil.sendEmail(mail, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(mail, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+    }
+}
diff --git a/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/472779948/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/472779948/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

From 2507cdbbbc0fc6af99146608515bbd671ec1b2d1 Mon Sep 17 00:00:00 2001
From: cmhello88 <cm_20094020@163.com>
Date: Wed, 14 Jun 2017 23:15:41 +0800
Subject: [PATCH 088/332] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../34594980/data-structure/answer/pom.xml    |  32 +++
 .../coderising/download/DownloadThread.java   |  20 ++
 .../coderising/download/FileDownloader.java   |  73 +++++++
 .../download/FileDownloaderTest.java          |  59 ++++++
 .../coderising/download/api/Connection.java   |  23 ++
 .../download/api/ConnectionException.java     |   5 +
 .../download/api/ConnectionManager.java       |  10 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/impl/ConnectionImpl.java         |  27 +++
 .../download/impl/ConnectionManagerImpl.java  |  15 ++
 .../coderising/litestruts/LoginAction.java    |  39 ++++
 .../com/coderising/litestruts/Struts.java     |  34 +++
 .../com/coderising/litestruts/StrutsTest.java |  43 ++++
 .../java/com/coderising/litestruts/View.java  |  23 ++
 .../java/com/coderising/litestruts/struts.xml |  11 +
 .../main/java/com/coding/basic/Iterator.java  |   7 +
 .../src/main/java/com/coding/basic/List.java  |   9 +
 .../com/coding/basic/array/ArrayList.java     |  35 +++
 .../com/coding/basic/array/ArrayUtil.java     |  96 +++++++++
 .../coding/basic/linklist/LRUPageFrame.java   | 164 +++++++++++++++
 .../basic/linklist/LRUPageFrameTest.java      |  34 +++
 .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++
 .../com/coding/basic/queue/CircleQueue.java   |  47 +++++
 .../coding/basic/queue/CircleQueueTest.java   |  44 ++++
 .../java/com/coding/basic/queue/Josephus.java |  39 ++++
 .../com/coding/basic/queue/JosephusTest.java  |  27 +++
 .../java/com/coding/basic/queue/Queue.java    |  61 ++++++
 .../basic/queue/QueueWithTwoStacks.java       |  55 +++++
 .../com/coding/basic/stack/QuickMinStack.java |  44 ++++
 .../coding/basic/stack/QuickMinStackTest.java |  39 ++++
 .../java/com/coding/basic/stack/Stack.java    |  24 +++
 .../com/coding/basic/stack/StackUtil.java     | 168 +++++++++++++++
 .../com/coding/basic/stack/StackUtilTest.java |  86 ++++++++
 .../basic/stack/StackWithTwoQueues.java       |  53 +++++
 .../basic/stack/StackWithTwoQueuesTest.java   |  36 ++++
 .../java/com/coding/basic/stack/Tail.java     |   5 +
 .../basic/stack/TwoStackInOneArray.java       | 117 ++++++++++
 .../basic/stack/TwoStackInOneArrayTest.java   |  65 ++++++
 .../coding/basic/stack/expr/InfixExpr.java    |  72 +++++++
 .../basic/stack/expr/InfixExprTest.java       |  52 +++++
 .../basic/stack/expr/InfixToPostfix.java      |  43 ++++
 .../basic/stack/expr/InfixToPostfixTest.java  |  41 ++++
 .../coding/basic/stack/expr/PostfixExpr.java  |  46 ++++
 .../basic/stack/expr/PostfixExprTest.java     |  41 ++++
 .../coding/basic/stack/expr/PrefixExpr.java   |  52 +++++
 .../basic/stack/expr/PrefixExprTest.java      |  45 ++++
 .../com/coding/basic/stack/expr/Token.java    |  50 +++++
 .../coding/basic/stack/expr/TokenParser.java  |  57 +++++
 .../basic/stack/expr/TokenParserTest.java     |  41 ++++
 .../coding/basic/tree/BinarySearchTree.java   | 189 +++++++++++++++++
 .../basic/tree/BinarySearchTreeTest.java      | 108 ++++++++++
 .../com/coding/basic/tree/BinaryTreeNode.java |  36 ++++
 .../com/coding/basic/tree/BinaryTreeUtil.java | 116 ++++++++++
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 +++++++
 .../java/com/coding/basic/tree/FileList.java  |  34 +++
 .../data-structure/assignment/pom.xml         |  32 +++
 .../coderising/download/DownloadThread.java   |  20 ++
 .../coderising/download/FileDownloader.java   |  73 +++++++
 .../download/FileDownloaderTest.java          |  59 ++++++
 .../coderising/download/api/Connection.java   |  23 ++
 .../download/api/ConnectionException.java     |   5 +
 .../download/api/ConnectionManager.java       |  10 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/impl/ConnectionImpl.java         |  27 +++
 .../download/impl/ConnectionManagerImpl.java  |  15 ++
 .../coderising/litestruts/LoginAction.java    |  39 ++++
 .../com/coderising/litestruts/Struts.java     |  34 +++
 .../com/coderising/litestruts/StrutsTest.java |  43 ++++
 .../java/com/coderising/litestruts/View.java  |  23 ++
 .../java/com/coderising/litestruts/struts.xml |  11 +
 .../com/coderising/ood/course/bad/Course.java |  24 +++
 .../ood/course/bad/CourseOffering.java        |  26 +++
 .../ood/course/bad/CourseService.java         |  16 ++
 .../coderising/ood/course/bad/Student.java    |  14 ++
 .../coderising/ood/course/good/Course.java    |  18 ++
 .../ood/course/good/CourseOffering.java       |  34 +++
 .../ood/course/good/CourseService.java        |  14 ++
 .../coderising/ood/course/good/Student.java   |  21 ++
 .../java/com/coderising/ood/ocp/DateUtil.java |  10 +
 .../java/com/coderising/ood/ocp/Logger.java   |  38 ++++
 .../java/com/coderising/ood/ocp/MailUtil.java |  10 +
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  10 +
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../main/java/com/coding/basic/Iterator.java  |   7 +
 .../src/main/java/com/coding/basic/List.java  |   9 +
 .../com/coding/basic/array/ArrayList.java     |  35 +++
 .../com/coding/basic/array/ArrayUtil.java     |  96 +++++++++
 .../coding/basic/linklist/LRUPageFrame.java   |  57 +++++
 .../basic/linklist/LRUPageFrameTest.java      |  34 +++
 .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++
 .../com/coding/basic/queue/CircleQueue.java   |  39 ++++
 .../java/com/coding/basic/queue/Josephus.java |  18 ++
 .../com/coding/basic/queue/JosephusTest.java  |  27 +++
 .../java/com/coding/basic/queue/Queue.java    |  61 ++++++
 .../basic/queue/QueueWithTwoStacks.java       |  47 +++++
 .../com/coding/basic/stack/QuickMinStack.java |  19 ++
 .../java/com/coding/basic/stack/Stack.java    |  24 +++
 .../com/coding/basic/stack/StackUtil.java     |  48 +++++
 .../com/coding/basic/stack/StackUtilTest.java |  65 ++++++
 .../basic/stack/StackWithTwoQueues.java       |  16 ++
 .../basic/stack/TwoStackInOneArray.java       |  57 +++++
 .../coding/basic/stack/expr/InfixExpr.java    |  15 ++
 .../basic/stack/expr/InfixExprTest.java       |  52 +++++
 .../basic/stack/expr/InfixToPostfix.java      |  14 ++
 .../coding/basic/stack/expr/PostfixExpr.java  |  18 ++
 .../basic/stack/expr/PostfixExprTest.java     |  41 ++++
 .../coding/basic/stack/expr/PrefixExpr.java   |  18 ++
 .../basic/stack/expr/PrefixExprTest.java      |  45 ++++
 .../com/coding/basic/stack/expr/Token.java    |  50 +++++
 .../coding/basic/stack/expr/TokenParser.java  |  57 +++++
 .../basic/stack/expr/TokenParserTest.java     |  41 ++++
 .../coding/basic/tree/BinarySearchTree.java   |  55 +++++
 .../basic/tree/BinarySearchTreeTest.java      | 109 ++++++++++
 .../com/coding/basic/tree/BinaryTreeNode.java |  35 +++
 .../com/coding/basic/tree/BinaryTreeUtil.java |  66 ++++++
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 +++++++
 .../java/com/coding/basic/tree/FileList.java  |  10 +
 students/34594980/ood/ood-assignment/pom.xml  |  44 ++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 129 files changed, 5636 insertions(+)
 create mode 100644 students/34594980/data-structure/answer/pom.xml
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 create mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
 create mode 100644 students/34594980/data-structure/assignment/pom.xml
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 create mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
 create mode 100644 students/34594980/ood/ood-assignment/pom.xml
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/34594980/data-structure/answer/pom.xml b/students/34594980/data-structure/answer/pom.xml
new file mode 100644
index 0000000000..ac6ba882df
--- /dev/null
+++ b/students/34594980/data-structure/answer/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-answer</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-answer</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..900a3ad358
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..c3c8a3f27d
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..4ff7f46ae0
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..36a9d2ce15
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..172371dd55
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..4576c016af
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..45740e6d57
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..24b9d8b155
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,164 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		Node node = find(pageNum);
+		//在该队列中存在， 则提到队列头
+		if (node != null) {
+			
+			moveExistingNodeToHead(node);		
+			
+		} else{
+			
+			node = new Node();
+			node.pageNum = pageNum;
+			
+			// 缓存容器是否已经超过大小.
+			if (currentSize >= capacity) {			
+				removeLast();
+							
+			} 
+			
+			addNewNodetoHead(node);
+			
+			
+			
+						
+		}
+	}
+	
+	private void addNewNodetoHead(Node node) {
+		
+		if(isEmpty()){
+			
+			node.prev = null;
+			node.next = null;
+			first = node;
+			last = node;
+			
+		} else{
+			node.prev = null;
+			node.next = first;
+			first.prev = node;
+			first = node;
+		}
+		this.currentSize ++;
+	}
+
+	private Node find(int data){
+		
+		Node node = first;
+		while(node != null){
+			if(node.pageNum == data){
+				return node;
+			}
+			node = node.next;
+		}
+		return null;
+		
+	}
+
+	
+
+	
+	
+
+	/**
+	 * 删除链表尾部节点 表示 删除最少使用的缓存对象
+	 */
+	private void removeLast() {
+		Node prev = last.prev;
+		prev.next = null;
+		last.prev = null;
+		last = prev;
+		this.currentSize --;
+	}
+
+	/**
+	 * 移动到链表头，表示这个节点是最新使用过的
+	 * 
+	 * @param node
+	 */
+	private void moveExistingNodeToHead(Node node) {
+		
+		if (node == first) {
+			
+			return;
+		}
+		else if(node == last){
+			//当前节点是链表尾， 需要放到链表头
+			Node prevNode = node.prev;
+			prevNode.next = null;	
+			last.prev = null;
+			last  = prevNode;				
+			
+		} else{
+			//node 在链表的中间， 把node 的前后节点连接起来
+			Node prevNode = node.prev;
+			prevNode.next = node.next;
+			
+			Node nextNode = node.next;
+			nextNode.prev = prevNode;
+			
+			
+		}
+		
+		node.prev = null;
+		node.next = first;
+		first.prev = node;
+		first = node;	
+		
+	}
+	private boolean isEmpty(){		
+		return (first == null) && (last == null);
+	}
+
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7fd72fc2b4
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..f4c7556a2e
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 0000000000..f169d5f8e4
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+public class CircleQueue <E> {
+
+	//用数组来保存循环队列的元素
+	private Object[] elementData ;
+	int size = 0;
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public CircleQueue(int capacity){
+		elementData = new Object[capacity];
+	}
+	public boolean isEmpty() {
+		return (front == rear) && !isFull();
+        
+    }
+	
+	public boolean isFull(){
+		return  size == elementData.length;
+	}
+    public int size() {
+        return size;
+    }
+
+    public void enQueue(E data) {
+        if(isFull()){
+        	throw new RuntimeException("The queue is full");
+        }
+        rear = (rear+1) % elementData.length;
+        elementData[rear++] = data;
+        size++;
+    }
+
+    public E deQueue() {
+        if(isEmpty()){
+        	throw new RuntimeException("The queue is empty");
+        }
+        E data = (E)elementData[front];
+        elementData[front] = null;
+        front = (front+1) % elementData.length;
+        size --;
+        return data;
+    }
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
new file mode 100644
index 0000000000..7307eb77d4
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
@@ -0,0 +1,44 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class CircleQueueTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		CircleQueue<String> queue = new CircleQueue<String>(5);		
+		Assert.assertTrue(queue.isEmpty());
+		Assert.assertFalse(queue.isFull());
+		
+		queue.enQueue("a");
+		queue.enQueue("b");
+		queue.enQueue("c");
+		queue.enQueue("d");
+		queue.enQueue("e");
+		
+		Assert.assertTrue(queue.isFull());
+		Assert.assertFalse(queue.isEmpty());
+		Assert.assertEquals(5, queue.size());
+		
+		Assert.assertEquals("a", queue.deQueue());
+		Assert.assertEquals("b", queue.deQueue());
+		Assert.assertEquals("c", queue.deQueue());
+		Assert.assertEquals("d", queue.deQueue());
+		Assert.assertEquals("e", queue.deQueue());
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 0000000000..36ec615d36
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){
+		
+		Queue<Integer> queue = new Queue<Integer>();
+        for (int i = 0; i < n; i++){
+        	queue.enQueue(i);
+        }
+        
+        List<Integer> result = new ArrayList<Integer>();
+        int i = 0;
+
+        while (!queue.isEmpty()) {
+
+            int x = queue.deQueue();            
+
+            if (++i % m == 0){
+            	result.add(x);
+            } else{
+            	queue.enQueue(x);
+            }
+        }
+
+        
+        return result;
+	}
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 0000000000..7d90318b51
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 0000000000..c4c4b7325e
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 0000000000..bc97df0800
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,55 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+import java.util.Stack;
+
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    private void moveStack1ToStack2() {
+        while (!stack1.isEmpty()){
+        	stack2.push(stack1.pop());
+        }
+            
+    }
+
+
+    public boolean isEmpty() {
+        return stack1.isEmpty() && stack2.isEmpty();
+    }
+
+
+    
+    public int size() {
+        return stack1.size() + stack2.size();     
+    }
+
+
+
+    public void enQueue(E item) {
+        stack1.push(item);
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue is empty");
+        }
+        if (stack2.isEmpty()) {
+        	moveStack1ToStack2();
+        }
+        
+        return stack2.pop();
+    }
+
+
+
+ }
+
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 0000000000..faf2644ab1
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,44 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	
+	private Stack<Integer> normalStack = new Stack<Integer>();
+	private Stack<Integer> minNumStack = new Stack<Integer>();
+	
+	public void push(int data){
+		
+		normalStack.push(data);
+		
+		if(minNumStack.isEmpty()){
+			minNumStack.push(data);
+		} else{
+			if(minNumStack.peek() >= data) {
+				minNumStack.push(data);
+	        }
+		}
+		
+	}
+	public int pop(){
+		if(normalStack.isEmpty()){
+			throw new RuntimeException("the stack is empty");
+		}
+		int value = normalStack.pop();
+		if(value == minNumStack.peek()){
+			minNumStack.pop();
+		}
+		return value;
+	}
+	public int findMin(){
+		if(minNumStack.isEmpty()){
+			throw new RuntimeException("the stack is empty");
+		}
+		return minNumStack.peek();
+	}
+}
\ No newline at end of file
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
new file mode 100644
index 0000000000..efe41a9f8f
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
@@ -0,0 +1,39 @@
+package com.coding.basic.stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class QuickMinStackTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		QuickMinStack stack = new QuickMinStack();
+		stack.push(5);
+		Assert.assertEquals(5, stack.findMin());
+		stack.push(6);
+		Assert.assertEquals(5, stack.findMin());
+		stack.push(4);
+		Assert.assertEquals(4, stack.findMin());
+		stack.push(4);
+		Assert.assertEquals(4, stack.findMin());
+		
+		stack.pop();
+		Assert.assertEquals(4, stack.findMin());
+		stack.pop();
+		Assert.assertEquals(5, stack.findMin());
+		stack.pop();
+		Assert.assertEquals(5, stack.findMin());
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..fedb243604
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..7c86d22fe7
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,168 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	public static void bad_reverse(Stack<Integer> s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		Stack<Integer> tmpStack = new Stack();
+		while(!s.isEmpty()){
+			tmpStack.push(s.pop());
+		}
+		
+		s = tmpStack;
+		
+	}
+	
+	
+	
+	public static void reverse_247565311(Stack<Integer> s){
+        if(s == null || s.isEmpty()) {
+        	return;
+        }
+        
+        int size = s.size();
+        Stack<Integer> tmpStack = new Stack<Integer>();        
+        
+        for(int i=0;i<size;i++){
+            Integer top = s.pop();
+            while(s.size()>i){
+                tmpStack.push(s.pop());
+            }
+            s.push(top);
+            while(tmpStack.size()>0){
+                s.push(tmpStack.pop());
+            }
+        }
+    }
+
+
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		
+		Stack<Integer> tmp = new Stack<Integer>();
+		while(!s.isEmpty()){
+			tmp.push(s.pop());
+		}
+		while(!tmp.isEmpty()){
+			Integer top = tmp.pop();
+			addToBottom(s,top);
+		}	
+		
+		
+	}
+	public static void addToBottom(Stack<Integer> s,  Integer value){
+		if(s.isEmpty()){
+			s.push(value);
+		} else{
+			Integer top = s.pop();
+			addToBottom(s,value);
+			s.push(top);
+		}
+		
+	}
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+		Stack tmpStack = new Stack();
+		
+		while(!s.isEmpty()){
+			Object value = s.pop();
+			if(!value.equals(o)){
+				tmpStack.push(value);
+			} 			
+		}
+		
+		while(!tmpStack.isEmpty()){
+			s.push(tmpStack.pop());
+		}
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		
+		if(s == null || s.isEmpty() || s.size()<len || len <=0 ){
+			return null;
+		}
+		
+		Stack tmpStack = new Stack();
+		int i = 0;
+		Object[] result = new Object[len];
+		while(!s.isEmpty()){
+			Object value = s.pop();			
+			tmpStack.push(value);
+			result[i++] = value;
+			if(i == len){
+				break;
+			}
+		}
+		while(!tmpStack.isEmpty()){
+			s.push(tmpStack.pop());
+		}
+		return result;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		
+		Stack<Character> stack = new Stack();
+		for(int i=0;i<s.length();i++){
+			char c = s.charAt(i);
+			
+			if(c == '(' || c =='[' || c == '{'){
+				
+				stack.push(c);
+				
+			} else if( c == ')'){
+				
+				char topChar = stack.pop();
+				if(topChar != '('){
+					return false;
+				}
+				
+			} else if( c == ']'){
+				
+				char topChar = stack.pop();
+				if(topChar != '['){
+					return false;
+				}
+					
+			} else if( c == '}'){
+				
+				char topChar = stack.pop();
+				if(topChar != '{'){
+					return false;
+				}
+				
+			}
+		}
+		return stack.size() == 0;
+	}
+	
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..ae0210ff47
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,86 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testAddToBottom() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		
+		StackUtil.addToBottom(s, 0);
+		
+		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+		
+	}
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	@Test
+	public void testReverse_247565311() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		
+		Assert.assertEquals("[1, 2, 3]", s.toString());
+		StackUtil.reverse_247565311(s);
+		Assert.assertEquals("[3, 2, 1]", s.toString());
+	}
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 0000000000..7a58fbff56
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,53 @@
+package com.coding.basic.stack;
+
+import java.util.ArrayDeque;
+import java.util.Queue;
+
+public class StackWithTwoQueues {
+	Queue<Integer> queue1 = new ArrayDeque<>();
+    Queue<Integer> queue2 = new ArrayDeque<>();
+
+    public void push(int data) {
+        //两个栈都为空时，优先考虑queue1
+        if (queue1.isEmpty()&&queue2.isEmpty()) {
+            queue1.add(data);
+            return;
+        }
+       
+        if (queue1.isEmpty()) {
+            queue2.add(data);
+            return;
+        }
+
+        if (queue2.isEmpty()) {
+            queue1.add(data);
+            return;
+        }
+
+    }
+
+    public int pop() {
+        
+        if (queue1.isEmpty()&&queue2.isEmpty()) {
+        	throw new RuntimeException("stack is empty");
+        } 
+        
+        if (queue1.isEmpty()) {
+            while (queue2.size()>1) {
+                queue1.add(queue2.poll());
+            }
+            return queue2.poll();
+        } 
+        
+        if (queue2.isEmpty()) {
+            while (queue1.size()>1) {
+                queue2.add(queue1.poll());
+            }
+            return queue1.poll();
+        }
+        
+        throw new RuntimeException("no queue is empty, this is not allowed");
+        
+
+    }
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
new file mode 100644
index 0000000000..4541b1f040
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
@@ -0,0 +1,36 @@
+package com.coding.basic.stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class StackWithTwoQueuesTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		StackWithTwoQueues stack = new StackWithTwoQueues();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+        Assert.assertEquals(4, stack.pop());
+        Assert.assertEquals(3, stack.pop());
+      
+        stack.push(5);
+        Assert.assertEquals(5, stack.pop());
+        Assert.assertEquals(2, stack.pop());
+        Assert.assertEquals(1, stack.pop());
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
new file mode 100644
index 0000000000..7f30ce55c8
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
@@ -0,0 +1,5 @@
+package com.coding.basic.stack;
+
+public class Tail {
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 0000000000..a532fd6e6c
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,117 @@
+package com.coding.basic.stack;
+
+import java.util.Arrays;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	private Object[] data = new Object[10];
+	private int size;
+    private int top1, top2;
+    
+    public TwoStackInOneArray(int n){
+    	data = new Object[n];
+    	size = n;
+    	top1 = -1;
+        top2 = data.length;
+    }
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		ensureCapacity();
+		data[++top1] = o;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		ensureCapacity();
+		data[--top2] = o;
+	}
+	public void ensureCapacity(){
+		if(top2-top1>1){
+			return;
+		} else{
+			
+			Object[] newArray = new Object[data.length*2];
+			System.arraycopy(data, 0, newArray, 0, top1+1);
+			
+			int stack2Size = data.length-top2;
+			int newTop2 = newArray.length-stack2Size;
+			System.arraycopy(data, top2, newArray, newTop2, stack2Size);
+			
+			top2 = newTop2;
+			data = newArray;
+		}
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		if(top1 == -1){
+			throw new RuntimeException("Stack1 is empty");
+		}
+		Object o = data[top1];
+		data[top1] = null;
+		top1--;
+		return o;
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		if(top2 == data.length){
+			throw new RuntimeException("Stack2 is empty");
+		}
+		Object o = data[top2];
+		data[top2] = null;
+		top2++;
+		return o;
+	}
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		if(top1 == -1){
+			throw new RuntimeException("Stack1 is empty");
+		}
+		return data[top1];
+	}
+	
+	
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		if(top2 == data.length){
+			throw new RuntimeException("Stack2 is empty");
+		}
+		return data[top2];
+	}
+	
+	public Object[] stack1ToArray(){
+		return Arrays.copyOf(data, top1+1);
+	}
+	public Object[] stack2ToArray(){
+		int size = data.length-top2;
+		Object [] stack2Data = new Object[size];
+		int j=0;
+		for(int i=data.length-1; i>=top2 ;i--){
+			stack2Data[j++] = data[i];
+		}
+		return stack2Data;	
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
new file mode 100644
index 0000000000..b743d422c6
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class TwoStackInOneArrayTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test1() {
+		TwoStackInOneArray stack = new TwoStackInOneArray(10);
+		stack.push1(1);
+		stack.push1(2);
+		stack.push1(3);
+		stack.push1(4);
+		stack.push1(5);
+		
+		stack.push2(1);
+		stack.push2(2);
+		stack.push2(3);
+		stack.push2(4);
+		stack.push2(5);
+		
+		for(int i=1;i<=5;i++){
+			Assert.assertEquals(stack.peek1(), stack.peek2());
+			Assert.assertEquals(stack.pop1(), stack.pop2());
+		}
+		
+		
+	}
+	@Test
+	public void test2() {
+		TwoStackInOneArray stack = new TwoStackInOneArray(5);
+		stack.push1(1);
+		stack.push1(2);
+		stack.push1(3);
+		stack.push1(4);
+		stack.push1(5);
+		stack.push1(6);
+		stack.push1(7);	
+		
+		stack.push2(1);
+		stack.push2(2);
+		stack.push2(3);
+		stack.push2(4);
+		
+		
+		Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]",Arrays.toString(stack.stack1ToArray()));
+		Assert.assertEquals("[1, 2, 3, 4]",Arrays.toString(stack.stack2ToArray()));
+	}
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..cebef21fa3
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,72 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		
+		Stack<Token> opStack = new Stack<>();
+		Stack<Float> numStack = new Stack<>();
+		
+		for(Token token : tokens){
+			
+			if (token.isOperator()){
+				
+				while(!opStack.isEmpty() 
+						&& !token.hasHigherPriority(opStack.peek())){
+					Token prevOperator = opStack.pop();
+					Float f2 = numStack.pop();
+					Float f1 = numStack.pop();
+					Float result = calculate(prevOperator.toString(), f1,f2);
+					numStack.push(result);						
+					
+				}
+				opStack.push(token);
+			} 
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			}
+		}
+		
+		while(!opStack.isEmpty()){
+			Token token = opStack.pop();
+			Float f2 = numStack.pop();
+			Float f1 = numStack.pop();
+			numStack.push(calculate(token.toString(), f1,f2));
+		}
+		
+		
+		return numStack.pop().floatValue();
+	}
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+
+	
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..20e34e8852
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 0000000000..9e501eda20
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,43 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class InfixToPostfix {
+
+	public static List<Token> convert(String expr) {
+		List<Token> inFixTokens = new TokenParser().parse(expr);
+		
+		List<Token> postFixTokens = new ArrayList<>();
+		
+		Stack<Token> opStack = new Stack<Token>();
+		for(Token token : inFixTokens){
+			
+			if(token.isOperator()){
+				
+				while(!opStack.isEmpty() 
+						&& !token.hasHigherPriority(opStack.peek())){
+					postFixTokens.add(opStack.pop());					
+					
+				}
+				opStack.push(token);		
+				
+			}
+			if(token.isNumber()){
+				
+				postFixTokens.add(token);
+				
+			}
+		}
+		
+		while(!opStack.isEmpty()){
+			postFixTokens.add(opStack.pop());	
+		}
+		
+		return postFixTokens;
+	}
+
+	
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
new file mode 100644
index 0000000000..f879f55f14
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class InfixToPostfixTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testConvert() {
+		{
+			List<Token> tokens = InfixToPostfix.convert("2+3");
+			Assert.assertEquals("[2, 3, +]", tokens.toString());
+		}
+		{
+		
+			List<Token> tokens = InfixToPostfix.convert("2+3*4");
+			Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString());
+		}
+		
+		{
+			
+			List<Token> tokens = InfixToPostfix.convert("2-3*4+5");
+			Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString());
+		}
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 0000000000..c54eb69e2a
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,46 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		
+		Stack<Float> numStack = new Stack<>();
+		for(Token token : tokens){
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			} else{
+				Float f2 = numStack.pop();
+				Float f1 = numStack.pop();
+				numStack.push(calculate(token.toString(),f1,f2));
+			}
+		}
+		return numStack.pop().floatValue();
+	}
+	
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 0000000000..c0435a2db5
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 0000000000..f811fd6d9a
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		TokenParser parser = new TokenParser();
+		List<Token> tokens = parser.parse(this.expr);
+		
+		Stack<Token> exprStack = new Stack<>();
+		Stack<Float> numStack = new Stack<>();
+		for(Token token : tokens){
+			exprStack.push(token);
+		}
+		
+		while(!exprStack.isEmpty()){
+			Token t = exprStack.pop();
+			if(t.isNumber()){
+				numStack.push(new Float(t.getIntValue()));
+			}else{
+				Float f1 = numStack.pop();
+				Float f2 = numStack.pop();
+				numStack.push(calculate(t.toString(),f1,f2));
+				
+			}		
+		}
+		return numStack.pop().floatValue();
+	}
+	
+	private Float calculate(String op, Float f1, Float f2){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 0000000000..5cec210e75
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 0000000000..8579743fe9
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 0000000000..d3b0f167e1
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 0000000000..399d3e857e
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 0000000000..284e5b0011
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,189 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		if(root == null){
+			return null;
+		}
+		return findMin(root).data;
+	}
+	public T findMax(){
+		if(root == null){
+			return null;
+		}
+		return findMax(root).data;
+	}
+	public int height() {
+	    return height(root);
+	}
+	public int size() {
+		return size(root);
+	}
+	public void remove(T e){
+		remove(e, root);
+	}
+	
+	private BinaryTreeNode<T> remove(T x, BinaryTreeNode<T> t){
+		if(t == null){
+			return t;
+		}
+		int compareResult = x.compareTo(t.data);
+		
+		if(compareResult< 0 ){			
+			t.left = remove(x,t.left);			
+			
+		} else if(compareResult > 0){			
+			t.right = remove(x, t.right);
+			
+		} else {
+			if(t.left != null && t.right != null){
+			
+				t.data = findMin(t.right).data;
+				t.right = remove(t.data,t.right);
+				
+			} else{
+				t = (t.left != null) ? t.left : t.right;
+			}
+		}
+		return t;
+	}
+	
+	private BinaryTreeNode<T> findMin(BinaryTreeNode<T> p){
+		if (p==null){
+			return null;
+		} else if (p.left == null){
+			return p;
+		} else{
+			return findMin(p.left);
+		}
+	}
+	private BinaryTreeNode<T> findMax(BinaryTreeNode<T> p){
+		if (p==null){
+			return null;
+		}else if (p.right==null){
+			return p;
+		} else{
+			return findMax(p.right);
+		}
+	}
+	private int height(BinaryTreeNode<T> t){
+	    if (t==null){
+	        return 0;
+	    }else {
+	        int leftChildHeight=height(t.left);
+	        int rightChildHeight=height(t.right);
+	        if(leftChildHeight > rightChildHeight){
+	        	return leftChildHeight+1;
+	        } else{
+	        	return rightChildHeight+1;
+	        }
+	    }
+	}
+	private int size(BinaryTreeNode<T> t){
+		if (t == null){
+			return 0;
+		}
+		return size(t.left) + 1 + size(t.right);
+       
+   }
+	
+	public List<T> levelVisit(){		
+		List<T> result = new ArrayList<T>();
+		if(root == null){
+			return result;
+		}
+		Queue<BinaryTreeNode<T>> queue = new Queue<BinaryTreeNode<T>>();  
+		BinaryTreeNode<T> node = root;		
+		queue.enQueue(node); 
+        while (!queue.isEmpty()) {  
+            node = queue.deQueue(); 
+            result.add(node.data); 
+            if (node.left != null){
+                queue.enQueue(node.left);  
+            }
+            if (node.right != null){
+                queue.enQueue(node.right);  
+            }
+        }   
+		return result;
+	}
+	public boolean isValid(){
+		return isValid(root);
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		if (root == null){
+            return null;
+		}
+		return lowestCommonAncestor(root,n1,n2);
+        
+	}
+	public List<T> getNodesBetween(T n1, T n2){
+		List<T> elements = new ArrayList<>();
+		getNodesBetween(elements,root,n1,n2);
+		return elements;
+	}
+	
+	public void  getNodesBetween(List<T> elements ,BinaryTreeNode<T> node, T n1, T n2){
+		
+        if (node == null) {
+            return;
+        } 
+  
+        if (n1.compareTo(node.data) < 0) {
+        	getNodesBetween(elements,node.left, n1, n2);
+        } 
+       
+        if ((n1.compareTo(node.data) <= 0 )
+        		&& (n2.compareTo(node.data) >= 0  )) {
+        	elements.add(node.data);            
+        } 
+        if (n2.compareTo(node.data)>0) {
+        	getNodesBetween(elements,node.right, n1, n2);
+        }
+	}
+	private T lowestCommonAncestor(BinaryTreeNode<T> node,T n1, T n2){
+		if(node == null){
+			return null;
+		}
+		// 如果n1和n2都比 node的值小， LCA在左孩子
+        if (node.data.compareTo(n1) > 0 && node.data.compareTo(n2) >0){
+            return lowestCommonAncestor(node.left, n1, n2);
+        }
+  
+        // 如果n1和n2都比 node的值小， LCA在右孩子
+        if (node.data.compareTo(n1) < 0 && node.data.compareTo(n2) <0) 
+            return lowestCommonAncestor(node.right, n1, n2);
+  
+        return node.data;
+	}
+	private boolean isValid(BinaryTreeNode<T> t){
+		if(t == null){
+			return true;
+		}
+		if(t.left != null && findMax(t.left).data.compareTo(t.data) >0){
+			return false;
+		}
+		if(t.right !=null && findMin(t.right).data.compareTo(t.data) <0){
+			return false;
+		}
+		if(!isValid(t.left) || !isValid(t.right)){
+			return false;
+		}
+		return true;
+	}
+}
+
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 0000000000..590e60306c
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,108 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		Assert.assertEquals("[3, 4, 5, 6, 8]",numbers.toString());
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..3f6f4d2b44
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,36 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+	
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 0000000000..f2a6515fa6
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,116 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		preOrderVisit(root, result);
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		inOrderVisit(root, result);
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		postOrderVisit(root, result);
+		return result;
+	}
+
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
+		
+		BinaryTreeNode<T> node = root;
+		
+		if(node != null){
+			stack.push(node);
+		}
+		
+		while(!stack.isEmpty()){
+			node = stack.pop();
+			result.add(node.data);
+			
+			if(node.right != null){
+				stack.push(node.right);
+			}
+			
+			if(node.left != null){
+				stack.push(node.right);
+			}			
+		}
+		return result;
+	}
+
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		BinaryTreeNode<T> node = root;
+		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
+
+		while (node != null || !stack.isEmpty()) {
+
+			while (node != null) {
+				stack.push(node);
+				node = node.left;
+			}
+			BinaryTreeNode<T> currentNode = stack.pop();
+			result.add(currentNode.data);			
+			node = currentNode.right;
+		}
+		return result;
+	}
+	
+	private static <T> void preOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		result.add(node.getData());
+		preOrderVisit(node.getLeft(), result);
+		preOrderVisit(node.getRight(), result);
+	}
+
+	private static <T> void inOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		inOrderVisit(node.getLeft(), result);
+		result.add(node.getData());
+		inOrderVisit(node.getRight(), result);
+	}
+
+	private static <T> void postOrderVisit(BinaryTreeNode<T> node, List<T> result) {
+		if (node == null) {
+			return;
+		}
+		postOrderVisit(node.getLeft(), result);
+		postOrderVisit(node.getRight(), result);
+		result.add(node.getData());
+	}
+
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 0000000000..41857e137d
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 0000000000..85fb8ab2a4
--- /dev/null
+++ b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,34 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {
+		list(f, 0);
+	}
+
+	public void list(File f, int depth) {
+		printName(f, depth);
+		if (f.isDirectory()) {
+			File[] files = f.listFiles();
+			for (File i : files)
+				list(i, depth + 1);
+		}
+	}
+
+	void printName(File f, int depth) {
+		String name = f.getName();
+		for (int i = 0; i < depth; i++)
+			System.out.print("+");
+		if (f.isDirectory())
+			System.out.println("Dir: " + name);
+		else
+			System.out.println(f.getName() + " " + f.length());
+	}
+
+	public static void main(String args[]) {
+		FileList L = new FileList();
+		File f = new File("C:\\coderising\\tmp");
+		L.list(f);
+	}
+}
diff --git a/students/34594980/data-structure/assignment/pom.xml b/students/34594980/data-structure/assignment/pom.xml
new file mode 100644
index 0000000000..5024466d17
--- /dev/null
+++ b/students/34594980/data-structure/assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..900a3ad358
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..c3c8a3f27d
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..4ff7f46ae0
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..36a9d2ce15
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..172371dd55
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 0000000000..436d092f58
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 0000000000..ab8c764584
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 0000000000..8c34bad0c3
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 0000000000..a651923ef5
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 0000000000..aefc9692bb
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 0000000000..8660ec8109
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 0000000000..22ba4a5450
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 0000000000..2c7e128b2a
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/34594980/data-structure/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<String,String> 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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/34594980/data-structure/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/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..4576c016af
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..45740e6d57
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..994a241a3d
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,57 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		
+	}
+	
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7fd72fc2b4
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..f4c7556a2e
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 0000000000..2e0550c67e
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+/**
+ * 用数组实现循环队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private final static int DEFAULT_SIZE = 10;
+	
+	//用数组来保存循环队列的元素
+	private Object[] elementData = new Object[DEFAULT_SIZE] ;
+	
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public boolean isEmpty() {
+		return false;
+        
+    }
+
+    public int size() {
+        return -1;
+    }
+
+    
+
+    public void enQueue(E data) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 0000000000..6a3ea639b9
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,18 @@
+package com.coding.basic.queue;
+
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){		
+		return null;
+	}
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 0000000000..7d90318b51
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 0000000000..c4c4b7325e
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 0000000000..cef19a8b59
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+
+    
+    public int size() {
+        return -1;   
+    }
+
+
+
+    public void enQueue(E item) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+
+
+
+ }
+
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 0000000000..f391d92b8f
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,19 @@
+package com.coding.basic.stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	public void push(int data){
+		
+	}
+	public int pop(){
+		return -1;
+	}
+	public int findMin(){
+		return -1;
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..fedb243604
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..b0ec38161d
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,48 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		
+		
+		
+	}
+	
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		return null;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		return false;
+	}
+	
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..76f2cb7668
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 0000000000..d0ab4387d2
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,16 @@
+package com.coding.basic.stack;
+
+
+public class StackWithTwoQueues {
+	
+
+    public void push(int data) {       
+
+    }
+
+    public int pop() {
+       return -1;
+    }
+
+    
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 0000000000..e86d056a24
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	Object[] data = new Object[10];
+	
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		return null;
+	}
+	
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		return null;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		return null;
+	}
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		return null;
+	}
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..ef85ff007f
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..20e34e8852
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 0000000000..96a2194a67
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+		
+		return null;
+	}
+	
+	
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 0000000000..dcbb18be4b
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 0000000000..c0435a2db5
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 0000000000..956927e2df
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 0000000000..5cec210e75
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 0000000000..8579743fe9
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 0000000000..d3b0f167e1
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 0000000000..399d3e857e
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 0000000000..4536ee7a2b
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,55 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		return null;
+	}
+	public T findMax(){
+		return null;
+	}
+	public int height() {
+	    return -1;
+	}
+	public int size() {
+		return -1;
+	}
+	public void remove(T e){
+		
+	}
+	public List<T> levelVisit(){
+		
+		return null;
+	}
+	public boolean isValid(){
+		return false;
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		return null;
+        
+	}
+	/**
+	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
+	 * 该二叉查找树中的某一节点
+	 * @param n1
+	 * @param n2
+	 * @return
+	 */
+	public List<T> getNodesBetween(T n1, T n2){
+		return null;
+	}
+	
+}
+
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 0000000000..4a53dbe2f1
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,109 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		System.out.println(numbers.toString());
+		
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..c1421cd398
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,35 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 0000000000..b033cbe1d5
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,66 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的前序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的中序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 0000000000..41857e137d
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 0000000000..6e65192e4a
--- /dev/null
+++ b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,10 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {		
+	}
+
+	
+}
diff --git a/students/34594980/ood/ood-assignment/pom.xml b/students/34594980/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..a7e5041647
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/pom.xml
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.coderising</groupId>
+	<artifactId>ood-assignment</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+
+	<name>ood-assignment</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+		</dependency>
+
+	</dependencies>
+	<repositories>
+		<repository>
+			<id>aliyunmaven</id>
+			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+		</repository>
+	</repositories>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/34594980/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<String,String> 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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/34594980/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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/34594980/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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/34594980/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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/34594980/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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/34594980/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

From 86c067292874746d004674e933ed53c2b177e1c8 Mon Sep 17 00:00:00 2001
From: Ginkee <jinkie@vip.qq.com>
Date: Thu, 15 Jun 2017 00:18:14 +0800
Subject: [PATCH 089/332] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=87=E4=BB=B6?=
 =?UTF-8?q?=E5=A4=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/466199956/readme.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 students/466199956/readme.md

diff --git a/students/466199956/readme.md b/students/466199956/readme.md
new file mode 100644
index 0000000000..e69de29bb2

From 2d6e92a007062557382ee59294234d4227e82921 Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Thu, 15 Jun 2017 09:37:34 +0800
Subject: [PATCH 090/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=95=B0=E6=8D=AE?=
 =?UTF-8?q?=E7=BB=93=E6=9E=84=E6=BA=90=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/download/DownloadThread.java   |  20 ++
 .../coderising/download/FileDownloader.java   |  73 +++++++
 .../download/FileDownloaderTest.java          |  59 ++++++
 .../coderising/download/api/Connection.java   |  23 ++
 .../download/api/ConnectionException.java     |   5 +
 .../download/api/ConnectionManager.java       |  10 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/impl/ConnectionImpl.java         |  27 +++
 .../download/impl/ConnectionManagerImpl.java  |  15 ++
 .../coderising/litestruts/LoginAction.java    |  39 ++++
 .../com/coderising/litestruts/Struts.java     |  34 +++
 .../com/coderising/litestruts/StrutsTest.java |  43 ++++
 .../java/com/coderising/litestruts/View.java  |  23 ++
 .../java/com/coderising/litestruts/struts.xml |  11 +
 .../com/coderising/ood/course/bad/Course.java |  24 +++
 .../ood/course/bad/CourseOffering.java        |  26 +++
 .../ood/course/bad/CourseService.java         |  16 ++
 .../coderising/ood/course/bad/Student.java    |  14 ++
 .../coderising/ood/course/good/Course.java    |  18 ++
 .../ood/course/good/CourseOffering.java       |  34 +++
 .../ood/course/good/CourseService.java        |  14 ++
 .../coderising/ood/course/good/Student.java   |  21 ++
 .../java/com/coderising/ood/ocp/DateUtil.java |  10 +
 .../java/com/coderising/ood/ocp/Logger.java   |  38 ++++
 .../java/com/coderising/ood/ocp/MailUtil.java |  10 +
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  10 +
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../main/java/com/coding/basic/Iterator.java  |   7 +
 .../src/main/java/com/coding/basic/List.java  |   9 +
 .../com/coding/basic/array/ArrayList.java     |  35 +++
 .../com/coding/basic/array/ArrayUtil.java     |  96 +++++++++
 .../coding/basic/linklist/LRUPageFrame.java   |  57 +++++
 .../basic/linklist/LRUPageFrameTest.java      |  34 +++
 .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++
 .../com/coding/basic/queue/CircleQueue.java   |  39 ++++
 .../java/com/coding/basic/queue/Josephus.java |  18 ++
 .../com/coding/basic/queue/JosephusTest.java  |  27 +++
 .../java/com/coding/basic/queue/Queue.java    |  61 ++++++
 .../basic/queue/QueueWithTwoStacks.java       |  47 +++++
 .../com/coding/basic/stack/QuickMinStack.java |  19 ++
 .../java/com/coding/basic/stack/Stack.java    |  24 +++
 .../com/coding/basic/stack/StackUtil.java     |  48 +++++
 .../com/coding/basic/stack/StackUtilTest.java |  65 ++++++
 .../basic/stack/StackWithTwoQueues.java       |  16 ++
 .../basic/stack/TwoStackInOneArray.java       |  57 +++++
 .../coding/basic/stack/expr/InfixExpr.java    |  15 ++
 .../basic/stack/expr/InfixExprTest.java       |  52 +++++
 .../basic/stack/expr/InfixToPostfix.java      |  14 ++
 .../coding/basic/stack/expr/PostfixExpr.java  |  18 ++
 .../basic/stack/expr/PostfixExprTest.java     |  41 ++++
 .../coding/basic/stack/expr/PrefixExpr.java   |  18 ++
 .../basic/stack/expr/PrefixExprTest.java      |  45 ++++
 .../com/coding/basic/stack/expr/Token.java    |  50 +++++
 .../coding/basic/stack/expr/TokenParser.java  |  57 +++++
 .../basic/stack/expr/TokenParserTest.java     |  41 ++++
 .../coding/basic/tree/BinarySearchTree.java   |  55 +++++
 .../basic/tree/BinarySearchTreeTest.java      | 109 ++++++++++
 .../com/coding/basic/tree/BinaryTreeNode.java |  35 +++
 .../com/coding/basic/tree/BinaryTreeUtil.java |  66 ++++++
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 +++++++
 .../java/com/coding/basic/tree/FileList.java  |  10 +
 .../ood/srp/config/ConfigurationKeys.java     |   4 +-
 67 files changed, 2386 insertions(+), 3 deletions(-)
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 create mode 100644 students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java

diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java
new file mode 100644
index 0000000000..900a3ad358
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread( Connection conn, int startPos, int endPos){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+	public void run(){	
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java
new file mode 100644
index 0000000000..c3c8a3f27d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloader.java
@@ -0,0 +1,73 @@
+package com.coderising.download;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+
+public class FileDownloader {
+	
+	String url;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			
+			conn = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			new DownloadThread(conn,0,length-1).start();
+			
+		} catch (ConnectionException e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+		
+		
+		
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java
new file mode 100644
index 0000000000..4ff7f46ae0
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/FileDownloaderTest.java
@@ -0,0 +1,59 @@
+package com.coderising.download;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://localhost:8080/test.jpg";
+		
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..0957eaf7f4
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,23 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..ce045393b1
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..36a9d2ce15
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,27 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection{
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+		
+		return 0;
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..172371dd55
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return null;
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+            if("test".equals(name) && "1234".equals(password)){
+                this.message = "login successful";
+                return "success";
+            }
+            this.message = "login failed,please check your user/pwd";
+            return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,34 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+
+
+public class Struts {
+
+    public static View runAction(String actionName, Map<String,String> parameters) {
+
+        /*
+         
+		0. 读取配置文件struts.xml
+ 		
+ 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
+		("name"="test" ,  "password"="1234") ,     	
+		那就应该调用 setName和setPassword方法
+		
+		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		
+		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
+		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
+		放到View对象的parameters
+		
+		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
+		放到View对象的jsp字段中。
+        
+        */
+    	
+    	return null;
+    }    
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,23 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/litestruts/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 0000000000..436d092f58
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 0000000000..ab8c764584
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 0000000000..8c34bad0c3
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 0000000000..a651923ef5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 0000000000..aefc9692bb
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 0000000000..8660ec8109
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 0000000000..22ba4a5450
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 0000000000..2c7e128b2a
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/Logger.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/Configuration.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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<String,String> 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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/992331664/data-structure/data-structure/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/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/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..06ef6311b2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,7 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..10d13b5832
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,9 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..4576c016af
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,35 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+	
+	private int size = 0;
+	
+	private Object[] elementData = new Object[100];
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index, Object o){
+		
+	}
+	
+	public Object get(int index){
+		return null;
+	}
+	
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public Iterator iterator(){
+		return null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..45740e6d57
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	
+	public int[] removeZero(int[] oldArray){
+		return null;
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+		return  null;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+		return null;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max){
+		return null;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max){
+		return null;
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+		return null;
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+		return null;
+	}
+	
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..994a241a3d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,57 @@
+package com.coding.basic.linklist;
+
+
+public class LRUPageFrame {
+	
+	private static class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+		
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+		
+		
+	}
+	
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+	
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7fd72fc2b4
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,34 @@
+package com.coding.basic.linklist;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+	
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..f4c7556a2e
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,125 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+	
+	private Node head;
+	
+	public void add(Object o){
+		
+	}
+	public void add(int index , Object o){
+		
+	}
+	public Object get(int index){
+		return null;
+	}
+	public Object remove(int index){
+		return null;
+	}
+	
+	public int size(){
+		return -1;
+	}
+	
+	public void addFirst(Object o){
+		
+	}
+	public void addLast(Object o){
+		
+	}
+	public Object removeFirst(){
+		return null;
+	}
+	public Object removeLast(){
+		return null;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+	
+	
+	private static  class Node{
+		Object data;
+		Node next;
+		
+	}
+	
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public  void reverse(){		
+		
+	}
+	
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public  void removeFirstHalf(){
+		
+	}
+	
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public  void remove(int i, int length){
+		
+	}
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数
+	 * 从当前链表中取出那些listB所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]  
+	 * @param list
+	 */
+	public  int[] getElements(LinkedList list){
+		return null;
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在listB中出现的元素 
+
+	 * @param list
+	 */
+	
+	public  void subtract(LinkedList list){
+		
+	}
+	
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public  void removeDuplicateValues(){
+		
+	}
+	
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+		
+	}
+	
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java
new file mode 100644
index 0000000000..2e0550c67e
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/CircleQueue.java
@@ -0,0 +1,39 @@
+package com.coding.basic.queue;
+
+/**
+ * 用数组实现循环队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private final static int DEFAULT_SIZE = 10;
+	
+	//用数组来保存循环队列的元素
+	private Object[] elementData = new Object[DEFAULT_SIZE] ;
+	
+	//队头
+	private int front = 0;  
+	//队尾  
+	private int rear = 0;
+	
+	public boolean isEmpty() {
+		return false;
+        
+    }
+
+    public int size() {
+        return -1;
+    }
+
+    
+
+    public void enQueue(E data) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java
new file mode 100644
index 0000000000..6a3ea639b9
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Josephus.java
@@ -0,0 +1,18 @@
+package com.coding.basic.queue;
+
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+ * @author liuxin
+ *
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){		
+		return null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java
new file mode 100644
index 0000000000..7d90318b51
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/JosephusTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic.queue;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java
new file mode 100644
index 0000000000..c4c4b7325e
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/Queue.java
@@ -0,0 +1,61 @@
+package com.coding.basic.queue;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
new file mode 100644
index 0000000000..cef19a8b59
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
@@ -0,0 +1,47 @@
+package com.coding.basic.queue;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @author liuxin
+ *
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+   
+    
+
+    public boolean isEmpty() {
+        return false;
+    }
+
+
+    
+    public int size() {
+        return -1;   
+    }
+
+
+
+    public void enQueue(E item) {
+        
+    }
+
+    public E deQueue() {
+        return null;
+    }
+
+
+
+ }
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java
new file mode 100644
index 0000000000..f391d92b8f
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/QuickMinStack.java
@@ -0,0 +1,19 @@
+package com.coding.basic.stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
+ * @author liuxin
+ *
+ */
+public class QuickMinStack {
+	public void push(int data){
+		
+	}
+	public int pop(){
+		return -1;
+	}
+	public int findMin(){
+		return -1;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..fedb243604
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,24 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){		
+	}
+	
+	public Object pop(){
+		return null;
+	}
+	
+	public Object peek(){
+		return null;
+	}
+	public boolean isEmpty(){
+		return false;
+	}
+	public int size(){
+		return -1;
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..b0ec38161d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,48 @@
+package com.coding.basic.stack;
+import java.util.Stack;
+public class StackUtil {
+	
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		
+		
+		
+	}
+	
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) {
+		return null;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		return false;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..76f2cb7668
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,65 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+	
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
new file mode 100644
index 0000000000..d0ab4387d2
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
@@ -0,0 +1,16 @@
+package com.coding.basic.stack;
+
+
+public class StackWithTwoQueues {
+	
+
+    public void push(int data) {       
+
+    }
+
+    public int pop() {
+       return -1;
+    }
+
+    
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
new file mode 100644
index 0000000000..e86d056a24
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ * @author liuxin
+ *
+ */
+public class TwoStackInOneArray {
+	Object[] data = new Object[10];
+	
+	/**
+	 * 向第一个栈中压入元素
+	 * @param o
+	 */
+	public void push1(Object o){
+		
+	}
+	/**
+	 * 从第一个栈中弹出元素
+	 * @return
+	 */
+	public Object pop1(){
+		return null;
+	}
+	
+	/**
+	 * 获取第一个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek1(){
+		return null;
+	}
+	/*
+	 * 向第二个栈压入元素
+	 */
+	public void push2(Object o){
+		
+	}
+	/**
+	 * 从第二个栈弹出元素
+	 * @return
+	 */
+	public Object pop2(){
+		return null;
+	}
+	/**
+	 * 获取第二个栈的栈顶元素
+	 * @return
+	 */
+	
+	public Object peek2(){
+		return null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..ef85ff007f
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..20e34e8852
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("10-2*3+50");
+			Assert.assertEquals(54, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
new file mode 100644
index 0000000000..96a2194a67
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
@@ -0,0 +1,14 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+		
+		return null;
+	}
+	
+	
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
new file mode 100644
index 0000000000..dcbb18be4b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
new file mode 100644
index 0000000000..c0435a2db5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
new file mode 100644
index 0000000000..956927e2df
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
@@ -0,0 +1,18 @@
+package com.coding.basic.stack.expr;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+	
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
new file mode 100644
index 0000000000..5cec210e75
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java
new file mode 100644
index 0000000000..8579743fe9
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/Token.java
@@ -0,0 +1,50 @@
+package com.coding.basic.stack.expr;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Token {
+	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
+	private static final Map<String,Integer> priorities = new HashMap<>();
+	static {
+		priorities.put("+", 1);
+		priorities.put("-", 1);
+		priorities.put("*", 2);
+		priorities.put("/", 2);
+	}
+	static final int OPERATOR = 1;
+	static final int NUMBER = 2;
+	String value;
+	int type;
+	public Token(int type, String value){
+		this.type = type;
+		this.value = value;
+	}		
+
+	public boolean isNumber() {
+		return type == NUMBER;
+	}
+
+	public boolean isOperator() {
+		return type == OPERATOR;
+	}
+
+	public int getIntValue() {
+		return Integer.valueOf(value).intValue();
+	}
+	public String toString(){
+		return value;
+	}
+	
+	public boolean hasHigherPriority(Token t){
+		if(!this.isOperator() && !t.isOperator()){
+			throw new RuntimeException("numbers can't compare priority");
+		}
+		return priorities.get(this.value) - priorities.get(t.value) > 0;
+	}
+	
+	
+
+}
\ No newline at end of file
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java
new file mode 100644
index 0000000000..d3b0f167e1
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParser.java
@@ -0,0 +1,57 @@
+package com.coding.basic.stack.expr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TokenParser {
+	
+	
+	public  List<Token> parse(String expr) {
+		List<Token> tokens = new ArrayList<>();
+
+		int i = 0;
+
+		while (i < expr.length()) {
+
+			char c = expr.charAt(i);
+
+			if (isOperator(c)) {
+
+				Token t = new Token(Token.OPERATOR, String.valueOf(c));
+				tokens.add(t);
+				i++;
+
+			} else if (Character.isDigit(c)) {
+
+				int nextOperatorIndex = indexOfNextOperator(i, expr);
+				String value = expr.substring(i, nextOperatorIndex);
+				Token t = new Token(Token.NUMBER, value);
+				tokens.add(t);
+				i = nextOperatorIndex;
+
+			} else{
+				System.out.println("char :["+c+"] is not number or operator,ignore");
+				i++;
+			}
+
+		}
+		return tokens;
+	}
+
+	private  int indexOfNextOperator(int i, String expr) {
+
+		while (Character.isDigit(expr.charAt(i))) {
+			i++;
+			if (i == expr.length()) {
+				break;
+			}
+		}
+		return i;
+
+	}
+
+	private  boolean isOperator(char c) {
+		String sc = String.valueOf(c);
+		return Token.OPERATORS.contains(sc);
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
new file mode 100644
index 0000000000..399d3e857e
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
@@ -0,0 +1,41 @@
+package com.coding.basic.stack.expr;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TokenParserTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test() {
+		
+		TokenParser parser = new TokenParser();
+		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
+		
+		Assert.assertEquals(300, tokens.get(0).getIntValue());
+		Assert.assertEquals("*", tokens.get(1).toString());
+		Assert.assertEquals(20, tokens.get(2).getIntValue());
+		Assert.assertEquals("+", tokens.get(3).toString());
+		Assert.assertEquals(12, tokens.get(4).getIntValue());
+		Assert.assertEquals("*", tokens.get(5).toString());
+		Assert.assertEquals(5, tokens.get(6).getIntValue());
+		Assert.assertEquals("-", tokens.get(7).toString());
+		Assert.assertEquals(20, tokens.get(8).getIntValue());
+		Assert.assertEquals("/", tokens.get(9).toString());
+		Assert.assertEquals(4, tokens.get(10).getIntValue());
+	}
+
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java
new file mode 100644
index 0000000000..4536ee7a2b
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTree.java
@@ -0,0 +1,55 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coding.basic.queue.Queue;
+
+public class BinarySearchTree<T extends Comparable> {
+	
+	BinaryTreeNode<T> root;
+	public BinarySearchTree(BinaryTreeNode<T> root){
+		this.root = root;
+	}
+	public BinaryTreeNode<T> getRoot(){
+		return root;
+	}
+	public T findMin(){
+		return null;
+	}
+	public T findMax(){
+		return null;
+	}
+	public int height() {
+	    return -1;
+	}
+	public int size() {
+		return -1;
+	}
+	public void remove(T e){
+		
+	}
+	public List<T> levelVisit(){
+		
+		return null;
+	}
+	public boolean isValid(){
+		return false;
+	}
+	public T getLowestCommonAncestor(T n1, T n2){
+		return null;
+        
+	}
+	/**
+	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
+	 * 该二叉查找树中的某一节点
+	 * @param n1
+	 * @param n2
+	 * @return
+	 */
+	public List<T> getNodesBetween(T n1, T n2){
+		return null;
+	}
+	
+}
+
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
new file mode 100644
index 0000000000..4a53dbe2f1
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -0,0 +1,109 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinarySearchTreeTest {
+	
+	BinarySearchTree<Integer> tree = null;
+	
+	@Before
+	public void setUp() throws Exception {
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(1);
+		root.left.right = new BinaryTreeNode<Integer>(4);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		root.left.right.right = new BinaryTreeNode<Integer>(5);
+		tree = new BinarySearchTree<Integer>(root);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		tree = null;
+	}
+
+	@Test
+	public void testFindMin() {
+		Assert.assertEquals(1, tree.findMin().intValue());
+		
+	}
+
+	@Test
+	public void testFindMax() {
+		Assert.assertEquals(8, tree.findMax().intValue());
+	}
+
+	@Test
+	public void testHeight() {
+		Assert.assertEquals(4, tree.height());
+	}
+
+	@Test
+	public void testSize() {
+		Assert.assertEquals(7, tree.size());
+	}
+
+	@Test
+	public void testRemoveLeaf() {
+		tree.remove(3);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(4, root.left.right.data.intValue());
+		
+	}
+	@Test
+	public void testRemoveMiddleNode1() {
+		tree.remove(4);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(5, root.left.right.data.intValue());
+		Assert.assertEquals(3, root.left.right.left.data.intValue());
+	}
+	@Test
+	public void testRemoveMiddleNode2() {
+		tree.remove(2);
+		BinaryTreeNode<Integer> root= tree.getRoot();
+		Assert.assertEquals(3, root.left.data.intValue());
+		Assert.assertEquals(4, root.left.right.data.intValue());
+	}
+	
+	@Test
+	public void testLevelVisit() {
+		List<Integer> values = tree.levelVisit();
+		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
+		
+	}
+	@Test
+	public void testLCA(){
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
+		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
+		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
+	}
+	@Test
+	public void testIsValid() {
+		
+		Assert.assertTrue(tree.isValid());
+		
+		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+		root.left = new BinaryTreeNode<Integer>(2);
+		root.right = new BinaryTreeNode<Integer>(8);
+		root.left.left = new BinaryTreeNode<Integer>(4);
+		root.left.right = new BinaryTreeNode<Integer>(1);
+		root.left.right.left = new BinaryTreeNode<Integer>(3);
+		tree = new BinarySearchTree<Integer>(root);
+		
+		Assert.assertFalse(tree.isValid());
+	}
+	@Test
+	public void testGetNodesBetween(){
+		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
+		System.out.println(numbers.toString());
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..c1421cd398
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
@@ -0,0 +1,35 @@
+package com.coding.basic.tree;
+
+public class BinaryTreeNode<T> {
+	
+	public T data;
+	public BinaryTreeNode<T> left;
+	public BinaryTreeNode<T> right;
+	
+	public BinaryTreeNode(T data){
+		this.data=data;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+	public BinaryTreeNode<T> getLeft() {
+		return left;
+	}
+	public void setLeft(BinaryTreeNode<T> left) {
+		this.left = left;
+	}
+	public BinaryTreeNode<T> getRight() {
+		return right;
+	}
+	public void setRight(BinaryTreeNode<T> right) {
+		this.right = right;
+	}
+	
+	public BinaryTreeNode<T> insert(Object o){
+		return  null;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
new file mode 100644
index 0000000000..b033cbe1d5
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
@@ -0,0 +1,66 @@
+package com.coding.basic.tree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class BinaryTreeUtil {
+	/**
+	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的中遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+
+	/**
+	 * 用递归的方式实现对二叉树的后遍历
+	 * 
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的前序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();		
+		
+		return result;
+	}
+	/**
+	 * 用非递归的方式实现对二叉树的中序遍历
+	 * @param root
+	 * @return
+	 */
+	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+		
+		List<T> result = new ArrayList<T>();
+		
+		return result;
+	}
+	
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
new file mode 100644
index 0000000000..41857e137d
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
@@ -0,0 +1,75 @@
+package com.coding.basic.tree;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class BinaryTreeUtilTest {
+
+	BinaryTreeNode<Integer> root = null;
+	@Before
+	public void setUp() throws Exception {
+		root = new BinaryTreeNode<Integer>(1);
+		root.setLeft(new BinaryTreeNode<Integer>(2));
+		root.setRight(new BinaryTreeNode<Integer>(5));
+		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testPreOrderVisit() {
+		
+		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+		
+		
+	}
+	@Test
+	public void testInOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
+		
+	}
+	
+	@Test
+	public void testPostOrderVisit() {
+		
+		
+		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
+		
+	}
+	
+	
+	@Test
+	public void testInOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
+		
+	}
+	@Test
+	public void testPreOrderVisitWithoutRecursion() {
+		BinaryTreeNode<Integer> node = root.getLeft().getRight();
+		node.setLeft(new BinaryTreeNode<Integer>(6));
+		node.setRight(new BinaryTreeNode<Integer>(7));
+		
+		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
+		
+	}
+}
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java
new file mode 100644
index 0000000000..6e65192e4a
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/tree/FileList.java
@@ -0,0 +1,10 @@
+package com.coding.basic.tree;
+
+import java.io.File;
+
+public class FileList {
+	public void list(File f) {		
+	}
+
+	
+}
diff --git a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
index 1c99770ed8..cadb23ed24 100644
--- a/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
+++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -1,8 +1,6 @@
 package com.coderising.ood.srp.config;
 
-/**
- * 实际该类应该为配置文件
- */
+
 public class ConfigurationKeys {
 
 	public static final String SMTP_SERVER = "smtp.server";

From d46668401fe69a4c920e452aaa130f6a576088b4 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 10:10:46 +0800
Subject: [PATCH 091/332] file stage by macvis

---
 students/75939388/ood/pom.xml                 |  15 ++
 .../ood/src/main/java/srp/Configuration.java  |  23 ++
 .../src/main/java/srp/ConfigurationKeys.java  |   9 +
 .../ood/src/main/java/srp/DBUtil.java         |  25 +++
 .../ood/src/main/java/srp/MailUtil.java       |  18 ++
 .../ood/src/main/java/srp/PromotionMail.java  | 198 ++++++++++++++++++
 .../src/main/java/srp/product_promotion.txt   |   4 +
 7 files changed, 292 insertions(+)
 create mode 100644 students/75939388/ood/pom.xml
 create mode 100644 students/75939388/ood/src/main/java/srp/Configuration.java
 create mode 100644 students/75939388/ood/src/main/java/srp/ConfigurationKeys.java
 create mode 100644 students/75939388/ood/src/main/java/srp/DBUtil.java
 create mode 100644 students/75939388/ood/src/main/java/srp/MailUtil.java
 create mode 100644 students/75939388/ood/src/main/java/srp/PromotionMail.java
 create mode 100644 students/75939388/ood/src/main/java/srp/product_promotion.txt

diff --git a/students/75939388/ood/pom.xml b/students/75939388/ood/pom.xml
new file mode 100644
index 0000000000..e6a1b1de5a
--- /dev/null
+++ b/students/75939388/ood/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>season2</artifactId>
+        <groupId>learning2017</groupId>
+        <version>2.0-SEASON2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ood</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/students/75939388/ood/src/main/java/srp/Configuration.java b/students/75939388/ood/src/main/java/srp/Configuration.java
new file mode 100644
index 0000000000..3a17cdd457
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/Configuration.java
@@ -0,0 +1,23 @@
+package srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/75939388/ood/src/main/java/srp/ConfigurationKeys.java b/students/75939388/ood/src/main/java/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..ef3a07a354
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package 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/75939388/ood/src/main/java/srp/DBUtil.java b/students/75939388/ood/src/main/java/srp/DBUtil.java
new file mode 100644
index 0000000000..912bebf080
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package 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/75939388/ood/src/main/java/srp/MailUtil.java b/students/75939388/ood/src/main/java/srp/MailUtil.java
new file mode 100644
index 0000000000..556976f5c9
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package 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/75939388/ood/src/main/java/srp/PromotionMail.java b/students/75939388/ood/src/main/java/srp/PromotionMail.java
new file mode 100644
index 0000000000..446f82e9ad
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/PromotionMail.java
@@ -0,0 +1,198 @@
+package srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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/75939388/ood/src/main/java/srp/product_promotion.txt b/students/75939388/ood/src/main/java/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From c478fdcd2695ce3651e10296007c97ac81ff7d59 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 10:18:25 +0800
Subject: [PATCH 092/332] datastructure demo code stage

---
 students/75939388/datastrure/pom.xml          | 15 +++++++++++++
 .../src/main/java/tree/BinaryTreeNode.java    | 10 +++++++++
 .../test/java/tree/BinaryTreeNodeTest.java    | 22 +++++++++++++++++++
 3 files changed, 47 insertions(+)
 create mode 100644 students/75939388/datastrure/pom.xml
 create mode 100644 students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java
 create mode 100644 students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java

diff --git a/students/75939388/datastrure/pom.xml b/students/75939388/datastrure/pom.xml
new file mode 100644
index 0000000000..b17b9fe45f
--- /dev/null
+++ b/students/75939388/datastrure/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>season2</artifactId>
+        <groupId>learning2017</groupId>
+        <version>2.0-SEASON2</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>datastrure</artifactId>
+
+
+</project>
\ No newline at end of file
diff --git a/students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java b/students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java
new file mode 100644
index 0000000000..f0802fdceb
--- /dev/null
+++ b/students/75939388/datastrure/src/main/java/tree/BinaryTreeNode.java
@@ -0,0 +1,10 @@
+package tree;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class BinaryTreeNode {
+    /**
+     * 二叉树
+     */
+}
diff --git a/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java b/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
new file mode 100644
index 0000000000..8de899c994
--- /dev/null
+++ b/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
@@ -0,0 +1,22 @@
+package tree;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class BinaryTreeNodeTest {
+
+    BinaryTreeNode tree;
+
+    @Before
+    public void init(){
+        tree = new BinaryTreeNode();
+    }
+
+    @Test
+    public void test1(){
+        
+    }
+}

From 8f8bfce1102861533ea3094174a094b4fbf6a5b9 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 10:19:27 +0800
Subject: [PATCH 093/332] maven structure

---
 .../ood/src/test/java/srp/SrpTest.java        |  23 ++++
 students/75939388/pom.xml                     | 104 ++++++++++++++++++
 2 files changed, 127 insertions(+)
 create mode 100644 students/75939388/ood/src/test/java/srp/SrpTest.java
 create mode 100644 students/75939388/pom.xml

diff --git a/students/75939388/ood/src/test/java/srp/SrpTest.java b/students/75939388/ood/src/test/java/srp/SrpTest.java
new file mode 100644
index 0000000000..7882177794
--- /dev/null
+++ b/students/75939388/ood/src/test/java/srp/SrpTest.java
@@ -0,0 +1,23 @@
+package srp;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class SrpTest {
+
+    @Before
+    public void init(){
+
+    }
+
+    /**
+     * 重构后的代码尝试运行
+     */
+    @Test
+    public void runTrial(){
+
+    }
+}
diff --git a/students/75939388/pom.xml b/students/75939388/pom.xml
new file mode 100644
index 0000000000..e5dd20227d
--- /dev/null
+++ b/students/75939388/pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>learning2017</groupId>
+    <artifactId>season2</artifactId>
+    <version>2.0-SEASON2</version>
+
+    <modules>
+        <!-- 数据结构模块 -->
+        <module>datastrure</module>
+        <!-- 面向对象设计 -->
+        <module>ood</module>
+    </modules>
+
+    <url>https://github.com/macvis/coding2017</url>
+    <description>
+        2017编程能力提高，第二季。
+        teacher：刘欣
+        gitHub:  https://github.com/onlyliuxin/coding2017.git
+        student: TerrenceWen
+    </description>
+
+    <developers>
+        <developer>
+            <name>TerrenceWen</name>
+            <url>https://github.com/macvis/</url>
+            <email>macvis@126.com</email>
+        </developer>
+    </developers>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.targetJdk>1.8</project.build.targetJdk>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+    </properties>
+
+    <!-- 阿里云镜像 -->
+    <repositories>
+        <repository>
+            <id>aliyun</id>
+            <name>aliyun</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+            <releases>
+                <enabled>true</enabled>
+                <updatePolicy>never</updatePolicy>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <!--junit-->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+        <!--dom4j-->
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+
+        <!--jaxen-->
+        <dependency>
+            <groupId>jaxen</groupId>
+            <artifactId>jaxen</artifactId>
+            <version>1.1.6</version>
+        </dependency>
+
+        <!--apache工具类包-->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

From 9de8835189acb7317fe399f74a65ca9f7cc840ab Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 10:26:13 +0800
Subject: [PATCH 094/332] add ignore file

---
 students/75939388/.gitignore | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 students/75939388/.gitignore

diff --git a/students/75939388/.gitignore b/students/75939388/.gitignore
new file mode 100644
index 0000000000..d3a81f6bdb
--- /dev/null
+++ b/students/75939388/.gitignore
@@ -0,0 +1,10 @@
+target/
+.idea/
+ood/target/
+datastrure/target/
+
+*.class
+*.jar
+*.war
+*.zip
+*.iml

From dc47b0ccf65ecd6ba0600a9129cccc30e29c33da Mon Sep 17 00:00:00 2001
From: yyglider <yaoyuan0120@126.com>
Date: Thu, 15 Jun 2017 11:18:59 +0800
Subject: [PATCH 095/332] update

update
---
 .../main/java/season_1/code01/ArrayList.java  | 138 ++++++++
 .../main/java/season_1/code01/BinaryTree.java |  97 +++++
 .../main/java/season_1/code01/Iterator.java   |   7 +
 .../main/java/season_1/code01/LinkedList.java | 327 +++++++++++++++++
 .../main/java/season_1/code01/List.java       |   9 +
 .../main/java/season_1/code01/Queue.java      |  24 ++
 .../main/java/season_1/code01/Stack.java      |  31 ++
 .../main/java/season_1/code02/ArrayUtil.java  | 257 ++++++++++++++
 .../code02/litestruts/ActionConfig.java       |  28 ++
 .../code02/litestruts/Configuration.java      |  64 ++++
 .../code02/litestruts/LoginAction.java        |  39 ++
 .../code02/litestruts/ReflectionUtil.java     | 120 +++++++
 .../season_1/code02/litestruts/Struts.java    |  76 ++++
 .../java/season_1/code02/litestruts/View.java |  23 ++
 .../season_1/code03/v1/DownloadThread.java    |  51 +++
 .../season_1/code03/v1/FileDownloader.java    | 115 ++++++
 .../season_1/code03/v1/api/Connection.java    |  23 ++
 .../code03/v1/api/ConnectionException.java    |   9 +
 .../code03/v1/api/ConnectionManager.java      |  10 +
 .../code03/v1/api/DownloadListener.java       |   5 +
 .../code03/v1/impl/ConnectionImpl.java        |  95 +++++
 .../code03/v1/impl/ConnectionManagerImpl.java |  34 ++
 .../season_1/code03/v2/DownloadThread.java    |  52 +++
 .../season_1/code03/v2/FileDownloader.java    | 133 +++++++
 .../season_1/code03/v2/api/Connection.java    |  23 ++
 .../code03/v2/api/ConnectionException.java    |   8 +
 .../code03/v2/api/ConnectionManager.java      |  10 +
 .../code03/v2/api/DownloadListener.java       |   5 +
 .../code03/v2/impl/ConnectionImpl.java        |  92 +++++
 .../code03/v2/impl/ConnectionManagerImpl.java |  16 +
 .../java/season_1/code04/LRUPageFrame.java    | 162 +++++++++
 .../main/java/season_1/code05/Stack.java      |  54 +++
 .../main/java/season_1/code05/StackUtil.java  | 148 ++++++++
 .../main/java/season_1/code06/InfixExpr.java  | 126 +++++++
 .../java/season_1/code07/InfixToPostfix.java  |  44 +++
 .../java/season_1/code07/PostfixExpr.java     |  47 +++
 .../main/java/season_1/code07/PrefixExpr.java |  55 +++
 .../main/java/season_1/code07/Token.java      |  63 ++++
 .../java/season_1/code07/TokenParser.java     |  89 +++++
 .../java/season_1/code08/CircleQueue.java     |  93 +++++
 .../main/java/season_1/code08/Josephus.java   |  55 +++
 .../main/java/season_1/code08/Queue.java      |  61 ++++
 .../season_1/code08/QueueWithTwoStacks.java   |  66 ++++
 .../java/season_1/code09/QuickMinStack.java   |  40 +++
 .../season_1/code09/StackWithTwoQueues.java   |  42 +++
 .../season_1/code09/TwoStackInOneArray.java   | 152 ++++++++
 .../java/season_1/code10/BinaryTreeNode.java  |  39 ++
 .../java/season_1/code10/BinaryTreeUtil.java  | 125 +++++++
 .../main/java/season_1/code10/FileList.java   |  38 ++
 .../season_1/code11/BinarySearchTree.java     | 305 ++++++++++++++++
 .../season_1/mini_jvm/attr/AttributeInfo.java |  19 +
 .../java/season_1/mini_jvm/attr/CodeAttr.java | 119 +++++++
 .../season_1/mini_jvm/attr/ConstantValue.java |  21 ++
 .../mini_jvm/attr/LineNumberTable.java        |  69 ++++
 .../mini_jvm/attr/LocalVariableTable.java     |  98 +++++
 .../season_1/mini_jvm/attr/StackMapTable.java |  30 ++
 .../season_1/mini_jvm/clz/AccessFlag.java     |  25 ++
 .../java/season_1/mini_jvm/clz/ClassFile.java | 121 +++++++
 .../season_1/mini_jvm/clz/ClassIndex.java     |  19 +
 .../java/season_1/mini_jvm/cmd/BiPushCmd.java |  29 ++
 .../mini_jvm/cmd/ByteCodeCommand.java         | 158 +++++++++
 .../season_1/mini_jvm/cmd/CommandParser.java  | 149 ++++++++
 .../season_1/mini_jvm/cmd/ComparisonCmd.java  |  79 +++++
 .../season_1/mini_jvm/cmd/GetFieldCmd.java    |  37 ++
 .../mini_jvm/cmd/GetStaticFieldCmd.java       |  39 ++
 .../season_1/mini_jvm/cmd/IncrementCmd.java   |  39 ++
 .../mini_jvm/cmd/InvokeSpecialCmd.java        |  46 +++
 .../mini_jvm/cmd/InvokeVirtualCmd.java        |  85 +++++
 .../java/season_1/mini_jvm/cmd/LdcCmd.java    |  51 +++
 .../season_1/mini_jvm/cmd/NewObjectCmd.java   |  39 ++
 .../season_1/mini_jvm/cmd/NoOperandCmd.java   | 146 ++++++++
 .../season_1/mini_jvm/cmd/OneOperandCmd.java  |  29 ++
 .../season_1/mini_jvm/cmd/PutFieldCmd.java    |  44 +++
 .../season_1/mini_jvm/cmd/TwoOperandCmd.java  |  67 ++++
 .../season_1/mini_jvm/constant/ClassInfo.java |  26 ++
 .../mini_jvm/constant/ConstantInfo.java       |  28 ++
 .../mini_jvm/constant/ConstantPool.java       |  25 ++
 .../mini_jvm/constant/FieldRefInfo.java       |  49 +++
 .../mini_jvm/constant/MethodRefInfo.java      |  52 +++
 .../mini_jvm/constant/NameAndTypeInfo.java    |  45 +++
 .../mini_jvm/constant/NullConstantInfo.java   |  12 +
 .../mini_jvm/constant/StringInfo.java         |  25 ++
 .../season_1/mini_jvm/constant/UTF8Info.java  |  33 ++
 .../mini_jvm/engine/ExecutionResult.java      |  57 +++
 .../mini_jvm/engine/ExecutorEngine.java       |  77 ++++
 .../java/season_1/mini_jvm/engine/Heap.java   |  39 ++
 .../season_1/mini_jvm/engine/JavaObject.java  |  71 ++++
 .../season_1/mini_jvm/engine/MethodArea.java  |  90 +++++
 .../season_1/mini_jvm/engine/MiniJVM.java     |  30 ++
 .../mini_jvm/engine/OperandStack.java         |  26 ++
 .../season_1/mini_jvm/engine/StackFrame.java  | 126 +++++++
 .../java/season_1/mini_jvm/field/Field.java   |  64 ++++
 .../mini_jvm/loader/ByteCodeIterator.java     |  63 ++++
 .../mini_jvm/loader/ClassFileLoader.java      | 144 ++++++++
 .../mini_jvm/loader/ClassFileParser.java      | 159 +++++++++
 .../java/season_1/mini_jvm/method/Method.java | 151 ++++++++
 .../java/season_1/mini_jvm/util/Util.java     |  22 ++
 .../java/season_1/code01/ArrayListTest.java   |  67 ++++
 .../java/season_1/code01/BinaryTreeTest.java  |  27 ++
 .../java/season_1/code01/LinkedListTest.java  | 174 +++++++++
 .../test/java/season_1/code01/QueueTest.java  |  24 ++
 .../test/java/season_1/code01/StackTest.java  |  27 ++
 .../java/season_1/code02/ArrayUtilTest.java   |  73 ++++
 .../code02/litestruts/StrutsTest.java         |  43 +++
 .../season_1/code03/FileDownloaderTest.java   |  60 ++++
 .../season_1/code04/LRUPageFrameTest.java     |  38 ++
 .../java/season_1/code05/StackUtilTest.java   |  79 +++++
 .../java/season_1/code06/InfixExprTest.java   |  49 +++
 .../java/season_1/code07/PostfixExprTest.java |  42 +++
 .../java/season_1/code07/PrefixExprTest.java  |  45 +++
 .../java/season_1/code08/JosephusTest.java    |  32 ++
 .../season_1/code09/QuickMinStackTest.java    |  34 ++
 .../code09/StackWithTwoQueuesTest.java        |  27 ++
 .../season_1/code10/BinaryTreeUtilTest.java   |  79 +++++
 .../season_1/code11/BinarySearchTreeTest.java |  93 +++++
 .../mini_jvm/ClassFileloaderTest.java         | 335 ++++++++++++++++++
 .../java/season_1/mini_jvm/EmployeeV1.java    |  28 ++
 .../java/season_1/mini_jvm/EmployeeV2.java    |  54 +++
 .../test/java/season_1/mini_jvm/Example.java  |  16 +
 .../season_1/mini_jvm/HourlyEmployee.java     |  27 ++
 .../java/season_1/mini_jvm/MiniJVMTest.java   |  28 ++
 students/769232552/season_two/pom.xml         |  31 ++
 .../src/main/java/work01/srp/DBUtil.java      |  25 ++
 .../src/main/java/work01/srp/Mail.java        |  73 ++++
 .../src/main/java/work01/srp/MailBox.java     |  43 +++
 .../java/work01/srp/MailBoxConfiguration.java |  62 ++++
 .../src/main/java/work01/srp/Product.java     |  28 ++
 .../main/java/work01/srp/PromotionMail.java   |  92 +++++
 .../work01/srp/product_promotion.txt          |   4 +
 129 files changed, 8556 insertions(+)
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/ArrayList.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/BinaryTree.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/Iterator.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/LinkedList.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/List.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/Queue.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code01/Stack.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/View.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code05/Stack.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code05/StackUtil.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code06/InfixExpr.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code07/Token.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code07/TokenParser.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code08/CircleQueue.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code08/Josephus.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code08/Queue.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code10/FileList.java
 create mode 100644 students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java
 create mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code01/QueueTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code01/StackTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code08/JosephusTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java
 create mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java
 create mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java
 create mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/Example.java
 create mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java
 create mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java
 create mode 100644 students/769232552/season_two/pom.xml
 create mode 100644 students/769232552/season_two/src/main/java/work01/srp/DBUtil.java
 create mode 100644 students/769232552/season_two/src/main/java/work01/srp/Mail.java
 create mode 100644 students/769232552/season_two/src/main/java/work01/srp/MailBox.java
 create mode 100644 students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java
 create mode 100644 students/769232552/season_two/src/main/java/work01/srp/Product.java
 create mode 100644 students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java
 create mode 100644 students/769232552/season_two/src/main/resources/work01/srp/product_promotion.txt

diff --git a/students/769232552/season_one/main/java/season_1/code01/ArrayList.java b/students/769232552/season_one/main/java/season_1/code01/ArrayList.java
new file mode 100644
index 0000000000..6746de2a50
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/ArrayList.java
@@ -0,0 +1,138 @@
+package code01;
+
+/**
+ * Created by yaoyuan on 2017/3/6.
+ */
+public class ArrayList implements List {
+
+    private int max_size = 0;//总长度
+    private int current_size = 0; //当前长度
+    private float extendPercent = 2; //扩展系数
+
+    private Object[] elementData;
+
+    /**
+     * 默认构造函数，初始化数组长度为100
+     */
+    public ArrayList(){
+        this.elementData = new Object[100];
+        this.max_size = 100;
+    }
+    /**
+     * 构造函数
+     * @param size，初始化数组长度
+     */
+    public ArrayList(int size){
+        this.elementData = new Object[size];
+        this.max_size = size;
+    }
+
+    /**
+     * 顺序添加元素，超出原始界限时，数组自动扩展
+     */
+    public void add(Object o) {
+        //如果越界了，需要复制原有的数组到扩充后的数组中
+        if(this.current_size + 1 > this.max_size) {
+            this.max_size = (int) Math.floor(this.max_size * this.extendPercent);
+            this.elementData = copyToNew(this.elementData,this.max_size);
+        }
+        this.elementData[this.current_size] = o;
+        this.current_size ++;
+
+    }
+
+    /**
+     * 指定位置添加元素
+     * 一种是在中间，一种是当前插入的位置尾部(如果超过尾部则默认添加到尾部)
+     */
+    public void add(int index, Object o){
+        assert(index>=0);
+        //如果越界了，需要复制原有的数组到扩充后的数组中
+        if(this.current_size + 1 > this.max_size) {
+            //如果越界了，需要复制原有的数组到扩充后的数组中
+            this.max_size = (int) Math.floor(this.max_size * this.extendPercent);
+            this.elementData = copyToNew(this.elementData,this.max_size);
+        }
+        //数组中间插入
+        if(index < this.current_size){
+            //需要把当前位置的元素往后移动
+            for (int i = this.current_size - 1; i >= index; i--) {
+                this.elementData[i+1] = this.elementData[i];
+            }
+            this.elementData[index] = o;
+        }else {
+            //后面加入
+            this.elementData[this.current_size] = o;
+        }
+        this.current_size ++;
+    }
+
+    public Object get(int index){
+        if(index >= 0 && index <= this.current_size-1){
+            return this.elementData[index];
+        }else {
+            throw new ArrayIndexOutOfBoundsException(index);
+        }
+    }
+
+    /**
+     * 删除指定位置的元素
+     * @param index
+     * @return
+     */
+    public Object remove(int index){
+        Object result = null;
+        if(index >= 0 && index <= current_size-1){
+            result = elementData[index];
+            //删除操作
+            if(index == current_size - 1){
+                elementData[index] = null;
+            }else {
+                //需要把当前位置后面的元素往前移动
+                for (int i = index; i < this.current_size-1 ; i++) {
+                    this.elementData[i] = this.elementData[i+1];
+                }
+                this.elementData[this.current_size-1] = null;
+            }
+            this.current_size --;
+        }else {
+            throw new ArrayIndexOutOfBoundsException(index);
+        }
+        return result;
+    }
+
+    public int size(){
+        return this.current_size;
+    }
+
+    public Iterator iterator(){
+        return new Iterator() {
+            int next_pos = 0;
+            int pos = -1;
+            public boolean hasNext() {
+                if(max_size <= 0){
+                    return false;
+                }
+                return next_pos < ArrayList.this.size();
+            }
+
+            public Object next() {
+                Object next = ArrayList.this.get(next_pos);
+                pos = next_pos ++;
+                return next;
+            }
+            public void remove(){
+                ArrayList.this.remove(pos);
+            }
+        };
+    }
+
+    private Object[] copyToNew(Object[] oldArray, int extendSize){
+        Object[] newArray = new Object[extendSize];
+        for (int i = 0; i < size(); i++) {
+            newArray[i] = oldArray[i];
+        }
+        return newArray;
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code01/BinaryTree.java b/students/769232552/season_one/main/java/season_1/code01/BinaryTree.java
new file mode 100644
index 0000000000..b29fb960cb
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/BinaryTree.java
@@ -0,0 +1,97 @@
+package code01;
+
+/**
+ * Created by yaoyuan on 2017/3/10.
+ */
+public class BinaryTree<T extends Comparable<T>>{
+
+    private BinaryTreeNode root = null;
+    private int size = 0;
+
+    public BinaryTreeNode createBinaryTree(T[] array){
+        for(T data : array){
+            this.insert(data);
+        }
+        return this.root;
+    }
+
+    // recursive way,
+    // t is the node that roots the subtree.
+    public BinaryTreeNode<T> insert(T data, BinaryTreeNode t){
+        if(t == null){
+            return new BinaryTreeNode<T>(data);
+        }
+        int comparator = ((T) t.data).compareTo(data);
+        if(comparator > 0){
+            t.left = insert(data,t.right);
+        }else if(comparator < 0){
+            t.right = insert(data,t.left);
+        }else {
+            // do nothing
+        }
+        return t;
+
+    }
+
+
+    //loop way
+    public void insert(T data){
+        if(this.root == null){
+            BinaryTreeNode node = new BinaryTreeNode(data);
+            this.root = node;
+            this.size ++;
+            return;
+        }
+        BinaryTreeNode cursor = this.root;
+        while (cursor != null){
+            if(data.compareTo((T) cursor.data) <= 0){
+                if(cursor.left == null) {
+                    cursor.left = new BinaryTreeNode(data);
+                    return;
+                }
+                cursor = cursor.left;
+            }
+            if(data.compareTo((T) cursor.data) > 0){
+                if(cursor.right == null) {
+                    cursor.right = new BinaryTreeNode(data);
+                    return;
+                }
+                cursor = cursor.right;
+            }
+        }
+        this.size ++;
+    }
+
+    public void leftOrderScan(BinaryTreeNode cursor){
+        if(cursor == null){
+            return;
+        }
+        leftOrderScan(cursor.left);
+        System.out.println(cursor.data.toString() + " ");
+        leftOrderScan(cursor.right);
+    }
+
+    public BinaryTreeNode getRoot(){
+        return this.root;
+    }
+
+    class BinaryTreeNode<T> {
+
+        private T data;
+        private BinaryTreeNode left;
+        private BinaryTreeNode right;
+
+        public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) {
+            this.left = right;
+            this.right = left;
+            this.data = data;
+        }
+
+        public BinaryTreeNode(T data) {
+            this.left = null;
+            this.right = null;
+            this.data = data;
+        }
+
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/code01/Iterator.java b/students/769232552/season_one/main/java/season_1/code01/Iterator.java
new file mode 100644
index 0000000000..b4074067bb
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/Iterator.java
@@ -0,0 +1,7 @@
+package code01;
+
+public interface Iterator {
+	public boolean hasNext();
+	public Object next();
+	public void remove();
+}
diff --git a/students/769232552/season_one/main/java/season_1/code01/LinkedList.java b/students/769232552/season_one/main/java/season_1/code01/LinkedList.java
new file mode 100644
index 0000000000..f7bbc970a9
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/LinkedList.java
@@ -0,0 +1,327 @@
+package code01;
+
+
+public class LinkedList implements List {
+
+	private Node head;
+    private Node tail; //指向链表最后一个元素的引用
+
+    private int size; //总长度
+
+    public LinkedList() {
+        this.head = null;
+        this.tail = null;
+        this.size = 0;
+    }
+
+    /**
+     * 新增顺序添加一个元素
+     * @param o
+     */
+    public void add(Object o){
+        Node node = new Node();
+        node.data = o;
+        node.next = null;
+        //空链表
+        if(head == null){
+            this.head = node;
+            this.tail = node;
+        }else { //非空链表，要先找到链表尾部，再加入新解答
+            this.tail.next = node;
+            this.tail = node;
+        }
+        this.size ++;
+	}
+
+    /**
+     * 指定索引处添加node
+     */
+    public void add(int index, Object o) {
+        assert(index >= 0);
+        Node node = new Node();
+        node.data = o;
+        node.next = null;
+
+        if(index == 0){
+            //添加在头部
+            node.next = head;
+            head = node;
+        }else if(index >= this.size){
+            //添加在尾部
+            this.tail.next = node;
+        }else {
+            //添加在中间
+            Node cursor = this.head;
+            for (int i = 0; i < index - 1; i++) {
+                cursor = cursor.next;
+            }
+            node.next = cursor.next;
+            cursor.next = node;
+        }
+        this.size ++;
+    }
+
+	public Object get(int index){
+		assert(index < this.size);
+        Node cursor = this.head;
+        for (int i = 0; i < index; i++) {
+            cursor = cursor.next;
+        }
+        return  cursor.data;
+	}
+
+	public Object remove(int index){
+        assert(index >= 0 && index < this.size);
+        Object result = null;
+        //删除的是链表尾部的元素
+        if(index == this.size - 1){
+            Node cursor = this.head;
+            for (int i = 0; i < index - 1; i++) {
+                cursor = cursor.next;
+            }
+            result = cursor.next.data;
+            tail = cursor;
+            cursor.next = null;
+        }else if(index == 0){
+            //删除的是头部元素
+            result = head.data;
+            head = head.next;
+        }else {
+            //删除的是链表中间的元素
+            Node cursor = this.head;
+            for (int i = 0; i < index - 1; i++) {
+                cursor = cursor.next;
+            }
+            result = cursor.next.data;
+            cursor.next = cursor.next.next;
+        }
+        this.size --;
+        return result;
+	}
+
+	public int size(){
+		return this.size;
+	}
+
+	public void addFirst(Object o){
+        Node node = new Node();
+        node.data = o;
+        node.next = null;
+        if(this.head == null){
+            this.head = node;
+            this.tail = node;
+        }else {
+            node.next = head;
+            this.head = node;
+        }
+        this.size ++;
+	}
+	public void addLast(Object o){
+        Node node = new Node();
+        node.data = o;
+        node.next = null;
+        if(this.head == null){
+            this.head = node;
+            this.tail = node;
+        }else {
+            this.tail.next = node;
+            this.tail = node;
+        }
+        this.size ++;
+    }
+
+	public Object removeFirst(){
+		Object first = null;
+        if(this.head != null){
+            first = this.head.data;
+            head = head.next;
+            this.size --;
+        }
+        return first;
+	}
+
+	public Object removeLast(){
+		Object last = null;
+        if(this.tail != null){
+            if(this.head != this.tail){
+                Node cursor;
+                for (cursor = head;cursor.next!=tail;cursor=cursor.next);
+                last = this.tail.data;
+                this.tail = cursor;
+                this.tail.next = null;
+            }else {
+                last = this.tail.data;
+                this.head = null;
+                this.tail = null;
+            }
+            this.size --;
+        }
+        return last;
+	}
+	public Iterator iterator(){
+		return null;
+	}
+
+    /**
+     * 节点类
+     */
+    private static class Node{
+		Object data;
+		Node next;
+
+	}
+
+	/**
+	 * 把该链表逆置
+	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
+	 */
+	public void reverse(){
+        if(this.head == null || this.head == this.tail){
+            return;
+        }
+
+        Node pre_cursor = null;
+        Node cursor = this.head;
+        Node after_cursor = cursor.next;
+
+        while(cursor != null){
+            cursor.next = pre_cursor;
+            pre_cursor = cursor;
+            cursor = after_cursor;
+            if(after_cursor != null){
+                after_cursor = after_cursor.next;
+            }
+        }
+
+        Node tmpNode = this.head;
+        this.head = this.tail;
+        this.tail = tmpNode;
+	}
+
+	/**
+	 * 删除一个单链表的前半部分
+	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
+	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
+
+	 */
+	public void removeFirstHalf(){
+        if(this.head == null || this.head.next == null){
+            return;
+        }
+        if(this.head.next.next == null){
+            this.head = this.head.next;
+        }
+
+        Node stepOne = this.head;
+        Node stepTwo = this.head;
+
+        while (stepTwo.next != null){
+            stepOne = stepOne.next;
+            stepTwo = stepTwo.next.next;
+        }
+        this.head = stepOne;
+	}
+
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * @param i
+	 * @param length
+	 */
+	public void remove(int i, int length){
+        Node current = head;
+        Node firstHalf = null;
+        for (int k = 0; k < i; k ++){
+            if(current == null){
+                return;
+            }
+            firstHalf = current;  //记录待删除节点的前一个节点
+            current = current.next;
+        }
+
+        //移动length长度
+        for (int j = 0; j < length; j++) {
+            if(current == null){
+                return;
+            }
+            current = current.next;
+        }
+
+        if(i == 0){
+            head = current;
+        }else {
+            firstHalf.next = current;
+        }
+    }
+	/**
+	 * 假定当前链表和list均包含已升序排列的整数
+	 * 从当前链表中取出那些list所指定的元素
+	 * 例如当前链表 = 11->101->201->301->401->501->601->701
+	 * listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]
+	 * @param list
+	 */
+	public static int[] getElements(LinkedList list){
+		return null;
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 从当前链表中中删除在list中出现的元素
+
+	 * @param list
+	 */
+
+	public  void subtract(LinkedList list){
+
+	}
+
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public void removeDuplicateValues(){
+        if(this.head == null){
+            return;
+        }
+        Node current = this.head;
+        Node current_next = this.head;
+        while (current_next != null){
+            current_next = current_next.next; //如果放到下个while循环后面写，就需要判断一次current_next是不是null了
+            while(current_next != null && current_next.data.equals(current.data)){
+                //删除重复节点
+                current.next = current_next.next;
+                current_next = current_next.next;
+            }
+            current = current_next;
+        }
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
+	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * @param min
+	 * @param max
+	 */
+	public  void removeRange(int min, int max){
+        //怎么才能高效呢
+	}
+
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * @param list
+	 */
+	public  LinkedList intersection( LinkedList list){
+		return null;
+	}
+
+    /**
+     * 遍历列表
+     */
+    public void printList(){
+        System.out.println();
+        for (Node cursor = this.head;cursor!=null;cursor=cursor.next){
+            System.out.print(cursor.data+" ");
+        }
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/code01/List.java b/students/769232552/season_one/main/java/season_1/code01/List.java
new file mode 100644
index 0000000000..95bc37d172
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/List.java
@@ -0,0 +1,9 @@
+package code01;
+
+public interface List {
+	public void add(Object o);
+	public void add(int index, Object o);
+	public Object get(int index);
+	public Object remove(int index);
+	public int size();
+}
diff --git a/students/769232552/season_one/main/java/season_1/code01/Queue.java b/students/769232552/season_one/main/java/season_1/code01/Queue.java
new file mode 100644
index 0000000000..d9956deb9a
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/Queue.java
@@ -0,0 +1,24 @@
+package code01;
+
+public class Queue {
+
+	private LinkedList linkedList = new LinkedList();
+
+	public void enQueue(Object o){
+		linkedList.addFirst(o);
+	}
+	
+	public Object deQueue(){
+		Object result = linkedList.removeLast();
+		return result;
+	}
+	
+	public boolean isEmpty(){
+		return linkedList.size() == 0;
+	}
+	
+	public int size(){
+		return linkedList.size();
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code01/Stack.java b/students/769232552/season_one/main/java/season_1/code01/Stack.java
new file mode 100644
index 0000000000..dbaeb91a48
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code01/Stack.java
@@ -0,0 +1,31 @@
+package code01;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		elementData.add(o);
+	}
+	
+	public Object pop(){
+		Object result = null;
+		if(elementData.size()!=0) {
+			result = elementData.remove(elementData.size() - 1);
+		}
+		return result;
+	}
+	
+	public Object peek(){
+		Object result = null;
+		if(elementData.size()!=0) {
+			result = elementData.get(elementData.size() - 1);
+		}
+		return result;
+	}
+	public boolean isEmpty(){
+		return elementData.size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java b/students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java
new file mode 100644
index 0000000000..23055ef138
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java
@@ -0,0 +1,257 @@
+package code02;
+import org.apache.commons.lang.ArrayUtils;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ArrayUtil {
+	
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换
+		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
+		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin){
+		if (origin == null || origin.length <= 1){
+			return;
+		}
+
+		int head = 0;
+		int tail = origin.length - 1;
+		int tmp;
+		while (head != tail){
+			//调换位置
+			tmp = origin[head];
+			origin[head] = origin[tail];
+			origin[tail] = tmp;
+
+            head ++;
+            tail --;
+		}
+
+	}
+	
+	/**
+	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
+	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * @param oldArray
+	 * @return
+	 */
+	public int[] removeZero(int[] oldArray){
+		if (oldArray == null || oldArray.length < 1){
+			return null;
+		}
+
+		List<Integer> newList = new ArrayList<Integer>();
+		for(int number : oldArray){
+			if(number != 0){
+				newList.add(number);
+			}
+		}
+
+        Integer[] result = new Integer[newList.size()];
+        result = (Integer[]) newList.toArray(result);
+        return ArrayUtils.toPrimitive(result);
+
+
+	}
+	
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
+	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+	
+	public int[] merge(int[] array1, int[] array2){
+        if(array1 == null && array2 == null){
+            return null;
+        }
+        if(array1 == null){
+            return array2;
+        }
+        if(array2 == null){
+            return array1;
+        }
+        int[] newArray = new int[array1.length + array2.length];
+        int m = 0,n = 0, k = 0;
+        while (m < array1.length && n < array2.length){
+            if(array1[m] <= array2[n]){
+                newArray[k++] = array1[m++];
+            }else {
+                newArray[k++] = array2[n++];
+            }
+        }
+        if(m >= array1.length){
+            while (n < array2.length){
+                newArray[k++] = array2[n++];
+            }
+        }
+        if(n >= array2.length){
+            while (m < array1.length){
+                newArray[k++] = array1[m++];
+            }
+        }
+		return  newArray;
+	}
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持
+	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int [] oldArray,  int size){
+        int[] newArray = new int[oldArray.length + size];
+        int i = 0;
+        for (; i < oldArray.length; i++) {
+            newArray[i] = oldArray[i];
+        }
+        for (int j = 0; j < size; j++){
+            newArray[i++] = 0;
+        }
+        return newArray;
+	}
+	
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
+	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
+	 * max = 1, 则返回空数组 []
+	 * @param max
+	 * @return
+	 */
+    //也就是需要生成一个小于max值的fibonacci数组
+	public int[] fibonacci(int max){
+        if(max < 2){
+            return new int[]{};
+        }
+        if(max < 3){
+            return new int[]{1,1};
+        }
+        List<Integer> list = new ArrayList<Integer>();
+        list.add(0,1);
+        list.add(1,1);
+        int i=0;
+        while (list.get(i) + list.get(i+1) < max){
+            list.add(i+2,list.get(i) + list.get(i+1));
+            i++;
+        }
+
+        int[] newArray = new int[list.size()];
+        for (int j = 0; j < list.size(); j++) {
+            newArray[j] = list.get(j).intValue();
+        }
+        return newArray;
+	}
+	
+	/**
+	 * 返回小于给定最大值max的所有素数数组
+	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * @param max
+	 * @return
+     *
+     * 原理：
+     * １，判断一个数字是否为素数，一个数 n 如果是合数，那么它的所有的因子不超过sqrt(n)
+     * ２，当i是素数的时候，i的所有的倍数必然是合数。
+	 */
+	public int[] getPrimes(int max){
+
+        if(max <= 2){
+            return null;
+        }
+        boolean[] prime = new boolean[max + 1];
+        for (int i = 2; i <= max; i++) {
+            if(i%2 == 0){
+                prime[i] = false; //偶数
+            }else {
+                prime[i] = true;
+            }
+        }
+
+        for (int i = 2; i <= Math.sqrt(max) ; i++) {
+            if(prime[i]){//奇数
+                //如果i是素数，那么把i的倍数标记为非素数
+                for(int j = i+i; j <= max; j += i){
+                    prime[j] = false;
+                }
+            }
+        }
+
+        List num = new ArrayList<Integer>();
+        for (int i = 2; i <= max; i++) {
+            if(prime[i]){
+                num.add(i);
+            }
+        }
+
+        Integer[] result = new Integer[num.size()];
+        result = (Integer[]) num.toArray(result);
+        return ArrayUtils.toPrimitive(result);
+	}
+	
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
+	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max){
+
+        if(max < 6){
+            return null;
+        }
+
+        List<Integer> perfectNumlist = new ArrayList<Integer>();
+
+        for (int j = 6;j <= max; j++){
+            List<Integer> factorNumlist = new ArrayList<Integer>();
+            factorNumlist.add(1);
+            for (int i = 2; i < j; i++) {
+                if(j % i == 0){
+                    factorNumlist.add(i);
+                }
+            }
+            int sum = 0;
+            for(Integer num : factorNumlist){
+                sum += num;
+            }
+
+            if(sum == j){
+                perfectNumlist.add(j);
+            }
+        }
+        Integer[] result = new Integer[perfectNumlist.size()];
+        result = (Integer[]) perfectNumlist.toArray(result);
+        return ArrayUtils.toPrimitive(result);
+	}
+	
+	/**
+	 * 用seperator 把数组 array给连接起来
+	 * 例如array= [3,8,9], seperator = "-"
+	 * 则返回值为"3-8-9"
+	 * @param array
+	 * @param seperator
+	 * @return
+	 */
+	public String join(int[] array, String seperator){
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < array.length - 1; i++) {
+            sb.append(array[i]);
+            sb.append(seperator);
+        }
+        sb.append(array[array.length - 1]);
+        return sb.toString();
+	}
+
+    public void printArr(int[] array){
+        for(int num : array){
+            System.out.print(num + " ");
+        }
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java
new file mode 100644
index 0000000000..b5e077e7a5
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java
@@ -0,0 +1,28 @@
+package code02.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by yaoyuan on 2017/3/22.
+ */
+public class ActionConfig {
+    String name;
+    String clzName;
+    Map<String,String> viewResult = new HashMap<String,String>();
+
+
+    public ActionConfig(String actionName, String clzName) {
+        this.name = actionName;
+        this.clzName = clzName;
+    }
+    public String getClassName(){
+        return clzName;
+    }
+    public void addViewResult(String name, String viewName){
+        viewResult.put(name, viewName);
+    }
+    public String getViewName(String resultName){
+        return viewResult.get(resultName);
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java
new file mode 100644
index 0000000000..85d3d98a1f
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java
@@ -0,0 +1,64 @@
+package code02.litestruts;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Created by yaoyuan on 2017/3/21.
+ */
+public class Configuration {
+
+
+    private String path;
+    private final Map<String, ActionConfig> actionMap = new HashMap<String, ActionConfig>();
+
+    Configuration(String path){
+        parseXML(path);
+    }
+
+    //解析xml文件
+    private void parseXML(String path){
+        //读取文件
+        File file = new File(path);
+        SAXReader reader = new SAXReader();
+        Document document = null;
+        try {
+            document = reader.read(file);
+        } catch (DocumentException e) {
+            e.printStackTrace();
+        }
+        Element root = document.getRootElement();
+
+        for (Iterator<Element> iterator = root.elementIterator("action"); iterator.hasNext();) {
+            Element e = iterator.next();
+            String actionName = e.attributeValue("name");
+            String clazName = e.attributeValue("class");
+            ActionConfig actionConfig = new ActionConfig(actionName,clazName);
+            for(Iterator<Element> childIterator = e.elementIterator();childIterator.hasNext();){
+                Element child = childIterator.next();
+                String jspKey = child.attributeValue("name");
+                String jspValue = child.getTextTrim();
+                actionConfig.addViewResult(jspKey,jspValue);
+            }
+            actionMap.put(actionName,actionConfig);
+        }
+    }
+
+    public String getView(String actionName, String result){
+        String jspKey = actionName + "." + result;
+        return actionMap.get(actionName).getViewName(result);
+    }
+
+
+    public Map<String, ActionConfig> getActionMap() {
+        return actionMap;
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java
new file mode 100644
index 0000000000..0799eae71a
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java
@@ -0,0 +1,39 @@
+package code02.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * @author liuxin
+ *
+ */
+public class LoginAction{
+    private String name ;
+    private String password;
+    private String message;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String execute(){
+        if("test".equals(name) && "1234".equals(password)){
+            this.message = "login successful";
+            return "success";
+        }
+        this.message = "login failed,please check your user/pwd";
+        return "fail";
+    }
+
+    public void setName(String name){
+        this.name = name;
+    }
+    public void setPassword(String password){
+        this.password = password;
+    }
+    public String getMessage(){
+        return this.message;
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java
new file mode 100644
index 0000000000..c4a8ed34fc
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java
@@ -0,0 +1,120 @@
+package code02.litestruts;
+
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by yaoyuan on 2017/3/21.
+ */
+public class ReflectionUtil {
+    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ReflectionUtil.class);
+
+    private static final Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
+
+    //加载xml文件中的类
+    public void initiateClazz(Configuration cfg){
+        Map<String, ActionConfig> actionMap = cfg.getActionMap();
+
+        for (Map.Entry<String, ActionConfig> entry : actionMap.entrySet()) {
+            String actionName = entry.getKey(); //login
+            ActionConfig actionConfig =entry.getValue();
+            String className = actionConfig.getClassName(); //code02.litestruts.LoginAction
+            Class<?> cls;
+            try {
+                cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader());
+                clazzMap.put(actionName,cls);
+            } catch (Exception e) {
+                logger.warn("加载类 " + className + "出错！");
+            }
+        }
+
+    }
+
+
+    //返回实例对象
+    public Object getInstance(String actionName){
+        Object instance = null;
+        for (Map.Entry<String, Class<?>> entry : clazzMap.entrySet()) {
+            String action = entry.getKey(); //login
+            Class<?> cls = entry.getValue(); //code02.litestruts.LoginAction.class
+            if(actionName.equals(action)){
+                try {
+                    instance = cls.newInstance();
+                } catch (Exception e) {
+                    logger.error("生成实例出错！", e);
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        return instance;
+    }
+
+
+    //参数赋值
+    public void setParameters(Object o, Map<String, String> params) {
+
+        List<Method> methods = getSetterMethods(o.getClass());
+        for (String name : params.keySet()) {
+            String methodName = "set" + name;
+            for (Method m : methods) {
+                if (m.getName().equalsIgnoreCase(methodName)) {
+                    try {
+                        m.invoke(o, params.get(name));
+                    } catch (InvocationTargetException e) {
+                        e.printStackTrace();
+                    } catch (IllegalAccessException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
+    //运行无参方法
+    public Object runMethodWithoutParams(Object o , String methodName){
+        Class<?> clz = o.getClass();
+        Object result = null;
+        try {
+            Method method = clz.getDeclaredMethod(methodName);
+            try {
+                result = method.invoke(o);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    //返回以set开头的方法
+    public List<Method> getSetterMethods(Class<?> clz){
+        return getMethods(clz,"set");
+    }
+
+    //返回以get开头的方法
+    public List<Method> getGetterMethods(Class<?> clz){
+        return getMethods(clz,"get");
+    }
+
+    private List<Method> getMethods(Class<?> clz, String startWithName){
+        List<Method> methodsList = new ArrayList<Method>();
+        Method[] methods = clz.getDeclaredMethods();
+        for (int i = 0; i < methods.length; i++) {
+            String methodName = methods[i].getName();
+            if(methodName.startsWith(startWithName)){
+                methodsList.add(methods[i]);
+            }
+        }
+        return methodsList;
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java
new file mode 100644
index 0000000000..de2c22ea94
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java
@@ -0,0 +1,76 @@
+package code02.litestruts;
+
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class Struts {
+    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Struts.class);
+    /*
+      0. 读取配置文件struts.xml
+
+       1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
+      据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+      ("name"="test" ,  "password"="1234") ,
+      那就应该调用 setName和setPassword方法
+
+
+
+
+  */
+    public static View runAction(String actionName, Map<String, String> parameters)  {
+        View view = new View();
+        Configuration cfg = new Configuration("src/main/resources/struts.xml");
+        ReflectionUtil reflectionUtil = new ReflectionUtil();
+        reflectionUtil.initiateClazz(cfg);
+       /* 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）*/
+        Object o = reflectionUtil.getInstance(actionName);
+        /*2. 根据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
+            ("name"="test" ,  "password"="1234") ,那就应该调用 setName和setPassword方法*/
+        reflectionUtil.setParameters(o,parameters);
+        /*3. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"*/
+        String result = (String) reflectionUtil.runMethodWithoutParams(o,"execute");
+       /* 4. 通过反射找到对象的所有getter方法（例如 getMessage）,通过反射来调用，
+       把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,放到View对象的parameters*/
+        Map params = new HashMap<String, String>();
+        List<Method> methods = reflectionUtil.getGetterMethods(o.getClass());
+        for(Method method : methods){
+            String key = method.getName().substring(3);
+            String value = null;
+            try {
+                value = (String) method.invoke(o);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+            params.put(key,value);
+        }
+        /*5. 根据struts.xml中的 <result> 配置,以及execute的返回值，确定哪一个jsp，放到View对象的jsp字段中。*/
+        String jsp = cfg.getView(actionName,result);
+        view.setParameters(params);
+        view.setJsp(jsp);
+
+        return view;
+    }
+
+    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
+
+        String actionName = "login";
+        HashMap<String,String> params = new HashMap<String, String>();
+        params.put("name","test");
+        params.put("password","12345");
+
+        View view = Struts.runAction(actionName,params);
+        System.out.println(view.getJsp());
+        System.out.println(view.getParameters());
+
+
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/View.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/View.java
new file mode 100644
index 0000000000..c7e630587c
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code02/litestruts/View.java
@@ -0,0 +1,23 @@
+package code02.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+	
+	public String getJsp() {
+		return jsp;
+	}
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+	public Map getParameters() {
+		return parameters;
+	}
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java b/students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java
new file mode 100644
index 0000000000..f91bff3bf1
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java
@@ -0,0 +1,51 @@
+package code03.v1;
+
+import code03.v1.api.Connection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * 定义线程类
+ */
+
+
+public class DownloadThread extends Thread{
+
+	private static final Logger logger = LoggerFactory.getLogger(DownloadThread.class);
+
+	private Connection conn;
+	private int startPos;
+	private int endPos;
+	private CountDownLatch finished;
+	private String fileName;
+
+
+	public DownloadThread(Connection conn, int startPos, int endPos, CountDownLatch finished,String fileName){
+		this.conn = conn;
+		this.startPos = startPos;
+		this.endPos = endPos;
+		this.finished = finished;
+		this.fileName = fileName;
+	}
+
+	@Override
+	public void run(){
+		logger.debug("thread {} begin to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos);
+
+		try {
+			byte[] data = conn.read(startPos,endPos);
+			RandomAccessFile rfile = new RandomAccessFile(fileName,"rw");
+			rfile.seek(startPos);
+			rfile.write(data);
+			rfile.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		finished.countDown();
+		logger.debug("thread {} end to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos);
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java b/students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java
new file mode 100644
index 0000000000..542fd978c2
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java
@@ -0,0 +1,115 @@
+package code03.v1;
+
+import code03.v1.api.Connection;
+import code03.v1.api.ConnectionException;
+import code03.v1.api.ConnectionManager;
+import code03.v1.api.DownloadListener;
+import code03.v1.impl.ConnectionManagerImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * 线程启动类
+ */
+
+public class FileDownloader {
+	private final static int THREAD_NUM = 5;
+
+	private static final String fileHolder = "D:/test.png";
+	private String url;
+	private DownloadListener listener;
+	private ConnectionManager cm;
+	private static boolean downloadFinished = false;
+
+	static final CountDownLatch finished = new CountDownLatch(THREAD_NUM); //v2的版本中使用了CyclicBarrier方式
+
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+	}
+
+	/*
+	(1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+	(2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+	     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。*/
+	public void execute(){
+		Connection conn = null;
+		try {
+			//启动线程
+			int startPos = 0, endPos = 0;
+			List<Thread> threads = new ArrayList<Thread>();
+			for (int i = 0; i < THREAD_NUM; i++) {
+				conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream
+				int length = conn.getContentLength();
+				startPos = length/THREAD_NUM *  i;
+				endPos = length/THREAD_NUM * (i + 1)- 1;
+				DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos,finished, fileHolder);
+				threads.add(downloadThread);
+				downloadThread.start();
+			}
+			finished.await();
+			//调用join方法，确保所有线程的工作已经完成
+			/*for (int i = 0; i < THREAD_NUM; i++) {
+				try {
+					threads.get(i).join();
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}*/
+			listener.notifyFinished();
+		} catch (ConnectionException e) {
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		} finally {
+			if(conn != null){
+				conn.close();
+			}
+		}
+	}
+
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+
+
+	public static void main(String[] args) {
+
+		String url = "http://litten.me/assets/blogImg/litten.png";
+		FileDownloader fileDownloader = new FileDownloader(url);
+		ConnectionManager cm = new ConnectionManagerImpl();
+		fileDownloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+		});
+		fileDownloader.setConnectionManager(cm);
+		fileDownloader.execute();
+
+
+		while (!downloadFinished){
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		System.out.println("download finished ! ");
+
+
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java
new file mode 100644
index 0000000000..92a3d4725a
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java
@@ -0,0 +1,23 @@
+package code03.v1.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos,int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java
new file mode 100644
index 0000000000..bee02c3717
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java
@@ -0,0 +1,9 @@
+package code03.v1.api;
+
+public class ConnectionException extends Exception {
+
+    public ConnectionException(String message,Throwable e){
+        super(message,e);
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java
new file mode 100644
index 0000000000..4ec1b87667
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package code03.v1.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java
new file mode 100644
index 0000000000..8cd24bfd57
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package code03.v1.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java b/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..75c91bb5bb
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java
@@ -0,0 +1,95 @@
+package code03.v1.impl;
+
+import code03.v1.api.Connection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLConnection;
+
+
+public class ConnectionImpl implements Connection{
+
+	private static final Logger logger = LoggerFactory.getLogger(ConnectionImpl.class);
+
+
+	private URLConnection urlConnection;
+	private int length = -1;
+
+
+    public ConnectionImpl(URLConnection urlConnection){
+		this.urlConnection  = urlConnection;
+	}
+
+	/**
+	 * 读取urlConnection.getInputStream()中的数据，返回byte[]
+	 */
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+		int contentLength = getContentLength();
+		if(startPos < 0 || endPos > contentLength || contentLength <= 0){
+			logger.info("index out of range !");
+			return null;
+		}
+
+		InputStream raw = null;
+		BufferedInputStream in = null;
+		int size = endPos - startPos + 1;
+		byte[] data = new byte[size];
+		try{
+			raw = urlConnection.getInputStream();
+			in = new BufferedInputStream(raw);
+			in.skip(startPos);
+
+			int offset = 0;
+			while(offset < size){
+				int bytesRead = in.read(data, offset, size - offset);
+				while (bytesRead  == -1){break;}
+				offset += bytesRead;
+			}
+            //用这种方式比较好
+            /*
+            int BUFFER_SIZE = 1024;
+            byte[] buff = new byte[BUFFER_SIZE];
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            while(baos.size() < size){
+                int bytesRead = in.read(buff); //缓存读取的数据，其SIZE大小不一定要等于总的SIZE
+                if(bytesRead<0) break;
+                baos.write(buff,0,bytesRead);
+            }
+            byte[] data = baos.toByteArray();
+            Arrays.copyOf(data,size);
+            */
+
+        } catch (IOException e) {
+			e.printStackTrace();
+		}finally {
+			raw.close();
+			in.close();
+		}
+		return data;
+	}
+
+	@Override
+	public int getContentLength() {
+		if(length != -1){
+			return length;
+		}
+		length = urlConnection.getContentLength();
+		//if without content-length header
+		if(length == -1) {
+            throw new RuntimeException("content-length error");
+        }
+		return length;
+	}
+
+	@Override
+	public void close() {
+		if(urlConnection != null){
+			urlConnection = null;
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java b/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..b4c9a1b90d
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java
@@ -0,0 +1,34 @@
+package code03.v1.impl;
+
+import code03.v1.api.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+/**
+ * 获取Connection实例
+ */
+
+public class ConnectionManagerImpl implements ConnectionManager {
+	private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class);
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		Connection connection = null;
+		try {
+			URL _url = new URL(url);
+			URLConnection urlConnection = _url.openConnection();
+			connection = new ConnectionImpl(urlConnection);
+		} catch (MalformedURLException e) {
+			logger.error("url {} format error",url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return connection;
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java b/students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java
new file mode 100644
index 0000000000..54cc1d3d0b
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java
@@ -0,0 +1,52 @@
+package code03.v2;
+
+import code03.v2.api.Connection;
+
+import java.io.RandomAccessFile;
+import java.util.concurrent.CyclicBarrier;
+
+public class DownloadThread extends Thread{
+
+	Connection conn;
+	int startPos;
+	int endPos;
+	CyclicBarrier barrier;
+	String localFile;
+	public DownloadThread( Connection conn, int startPos, int endPos, String localFile, CyclicBarrier barrier){
+		
+		this.conn = conn;		
+		this.startPos = startPos;
+		this.endPos = endPos;
+		this.localFile = localFile;
+		this.barrier = barrier;
+	}
+
+
+
+	public void run(){
+		
+		
+		try {
+			System.out.println("Begin to read [" + startPos +"-"+endPos+"]");
+			
+			byte[] data = conn.read(startPos, endPos);		
+			
+			RandomAccessFile file = new RandomAccessFile(localFile,"rw");
+			
+			file.seek(startPos);	
+			
+			file.write(data);
+			
+			file.close();
+			
+			conn.close();
+			
+			barrier.await(); //等待别的线程完成
+			
+		} catch (Exception e) {			
+			e.printStackTrace();
+			
+		} 
+		
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java b/students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java
new file mode 100644
index 0000000000..12c750145f
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java
@@ -0,0 +1,133 @@
+package code03.v2;
+
+import code03.v2.api.Connection;
+import code03.v2.api.ConnectionManager;
+import code03.v2.api.DownloadListener;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.concurrent.CyclicBarrier;
+
+
+
+public class FileDownloader {
+	
+	private String url;
+	private String localFile;
+	
+	DownloadListener listener;
+	
+	ConnectionManager cm;
+	
+
+	private static final int DOWNLOAD_TRHEAD_NUM = 3;
+	
+	public FileDownloader(String _url, String localFile) {
+		this.url = _url;
+		this.localFile = localFile;
+		
+	}
+	
+	public void execute(){
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+		
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		
+		CyclicBarrier barrier = new CyclicBarrier(DOWNLOAD_TRHEAD_NUM , new Runnable(){
+			public void run(){
+				listener.notifyFinished();
+			}
+		}); 
+		
+		Connection conn  = null;
+		try {
+			
+			conn  = cm.open(this.url);
+			
+			int length = conn.getContentLength();	
+			
+			createPlaceHolderFile(this.localFile, length);			
+			
+			int[][] ranges = allocateDownloadRange(DOWNLOAD_TRHEAD_NUM, length);
+			
+			for(int i=0; i< DOWNLOAD_TRHEAD_NUM; i++){
+			
+				
+				DownloadThread thread = new DownloadThread(
+						cm.open(url), 
+						ranges[i][0], 
+						ranges[i][1], 
+						localFile, 
+						barrier);
+				thread.start();
+			}
+			
+		} catch (Exception e) {			
+			e.printStackTrace();
+		}finally{
+			if(conn != null){
+				conn.close();
+			}
+		}
+		
+	}
+	
+	private void createPlaceHolderFile(String fileName, int contentLen) throws IOException{
+		
+		RandomAccessFile file = new RandomAccessFile(fileName,"rw");
+		
+		for(int i=0; i<contentLen ;i++){
+			file.write(0);
+		}
+		
+		file.close();
+	}
+	
+	private int[][] allocateDownloadRange(int threadNum, int contentLen){
+		int[][] ranges = new int[threadNum][2];
+		
+		int eachThreadSize = contentLen / threadNum;// 每个线程需要下载的文件大小
+		int left = contentLen % threadNum;// 剩下的归最后一个线程来处理
+		
+		for(int i=0;i<threadNum;i++){
+			
+			int startPos = i * eachThreadSize;
+			
+			int endPos = (i + 1) * eachThreadSize - 1;
+			
+			if ((i == (threadNum - 1))) {
+				endPos += left;
+			}
+			ranges[i][0] = startPos;
+			ranges[i][1] = endPos;
+			
+		}
+		
+		return ranges;
+	}
+	
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	
+	
+	public void setConnectionManager(ConnectionManager ucm){
+		this.cm = ucm;
+	}
+	
+	public DownloadListener getListener(){
+		return this.listener;
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java
new file mode 100644
index 0000000000..68e165d657
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java
@@ -0,0 +1,23 @@
+package code03.v2.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * @param startPos 开始位置， 从0开始
+	 * @param endPos 结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos, int endPos) throws IOException;
+	/**
+	 * 得到数据内容的长度
+	 * @return
+	 */
+	public int getContentLength();
+	
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java
new file mode 100644
index 0000000000..6dedcdd92b
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java
@@ -0,0 +1,8 @@
+package code03.v2.api;
+
+public class ConnectionException extends Exception {
+	public ConnectionException(Exception e){
+		super(e);
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java
new file mode 100644
index 0000000000..634564fbdf
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java
@@ -0,0 +1,10 @@
+package code03.v2.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java
new file mode 100644
index 0000000000..02402a1950
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package code03.v2.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java b/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..cd55020a66
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java
@@ -0,0 +1,92 @@
+package code03.v2.impl;
+
+import code03.v2.api.Connection;
+import code03.v2.api.ConnectionException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Arrays;
+
+
+class ConnectionImpl implements Connection {
+	
+	URL url;
+	static final int BUFFER_SIZE = 1024;
+	
+	ConnectionImpl(String _url) throws ConnectionException {
+		try {			
+			url = new URL(_url);
+		} catch (MalformedURLException e) {			
+			throw new ConnectionException(e);
+		}
+	}
+	
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {		
+		
+
+		HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
+		
+		httpConn.setRequestProperty("Range", "bytes=" + startPos + "-"
+                + endPos);
+		
+		InputStream is  = httpConn.getInputStream();
+
+		is.skip(startPos);
+		
+        byte[] buff = new byte[BUFFER_SIZE];  
+     
+        int totalLen = endPos - startPos + 1;
+        
+        
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();        
+      
+        while(baos.size() < totalLen){  
+        	
+        	int len = is.read(buff);           
+            if (len < 0) {  
+                break;  
+            }             
+            baos.write(buff,0, len);            
+        }  
+        
+        
+        if(baos.size() > totalLen){
+        	byte[] data = baos.toByteArray();
+        	return Arrays.copyOf(data, totalLen);
+        }
+        
+		return baos.toByteArray();
+	}
+
+	@Override
+	public int getContentLength() {
+		
+        URLConnection con;
+		try {
+			con = url.openConnection();
+			
+			return con.getContentLength(); 
+			
+		} catch (IOException e) {			
+			e.printStackTrace();
+		}  
+        
+		return -1;
+            
+        
+	}
+
+	@Override
+	public void close() {
+		
+		
+	}
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java b/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..596beaa191
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java
@@ -0,0 +1,16 @@
+package code03.v2.impl;
+
+
+import code03.v2.api.Connection;
+import code03.v2.api.ConnectionException;
+import code03.v2.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+		
+		return new ConnectionImpl(url);
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java b/students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java
new file mode 100644
index 0000000000..0ffce58b83
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java
@@ -0,0 +1,162 @@
+package code04;
+
+/**
+ * 用双向链表实现LRU算法
+ */
+public class LRUPageFrame {
+	
+	private  class Node {
+		
+		Node prev;
+		Node next;
+		int pageNum;
+		Node() {
+		}
+	}
+
+	private int size;
+	private int capacity;
+	
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	public LRUPageFrame(int capacity) {
+		this.capacity = capacity;
+		this.size = 0;
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 1、如果缓存中不存在，则直接加入表头
+	 * 2、如果缓存中存在，则把该对象移动到表头
+	 * @param pageNum
+	 * @return
+	 */
+	public void access(int pageNum) {
+		Node node = hasContains(pageNum);
+		if(node != null){
+			moveToHead(node);
+		}else {
+			addToHead(pageNum);
+		}
+	
+	}
+
+	/**
+	 * 对象是否存在缓存中，如存在则返回该对象在链表中的位置，否则返回null
+	 * @return
+     */
+	private Node hasContains(int key){
+		Node node = this.first;
+		while (node != null){
+			if(node.pageNum == key){
+				return node;
+			}
+			node = node.next;
+		}
+		return node;
+	}
+
+	/**
+	 * 对象加入表头，先先判断缓存是否已经满了
+	 * @return
+     */
+	private void addToHead(int key){
+		Node node = new Node();
+		node.pageNum = key;
+		if(size < capacity){
+			addFirst(node);
+		}else {
+			removeLast();
+			addFirst(node);
+		}
+
+	}
+
+
+	/**
+	 * 对象移动到表头
+	 * @return
+     */
+	private void moveToHead(Node node){
+		if(node == first){
+			return;
+		}
+		if(node == last){
+			node.next = first;
+			first.prev = node;
+			first = node;
+			last = node.prev;
+			last.next = null;
+			node.prev = null;
+			return;
+		}
+		node.prev.next = node.next;
+		node.next.prev = node.prev;
+		node.next = first;
+		node.prev = null;
+		first.prev = node;
+		first = node;
+	}
+
+	/**
+	 * 删除表尾
+	 * @return
+     */
+	private void removeLast(){
+		if(last != null){
+			Node newLast = last.prev;
+			last.prev = null;
+			last = newLast;
+			last.next = null;
+			size --;
+		}
+	}
+	/**
+	 * 添加元素到表头
+	 * @return
+     */
+	private void addFirst(Node node){
+		//0个节点
+		if(first == null){
+			first = node;
+			last = node;
+			size ++;
+			return;
+		}
+		//一个节点
+		else if(first == last){
+			first = node;
+			first.next = last;
+			last.prev = first;
+			size ++;
+			return;
+		}else {
+			node.next = first;
+			first.prev = node;
+			first = node;
+			size ++;
+		}
+	}
+	/**
+	 * 当前链表空间
+	 * @return
+     */
+	public int getSize() {
+		return size;
+	}
+
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while(node != null){
+			buffer.append(node.pageNum);			
+			node = node.next;
+			if(node != null){
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code05/Stack.java b/students/769232552/season_one/main/java/season_1/code05/Stack.java
new file mode 100644
index 0000000000..04e1f1aebb
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code05/Stack.java
@@ -0,0 +1,54 @@
+package code05;
+
+import code01.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+	
+	public void push(Object o){
+		if(o == null){
+			return;
+		}
+		elementData.add(o);
+	}
+
+
+	public Object pop(){
+		Object last = null;
+		int last_index = elementData.size() - 1;
+		if(last_index >= 0){
+			last = elementData.get(last_index);
+			elementData.remove(last_index);
+		}
+		return last;
+	}
+	
+	public Object peek(){
+		Object last = null;
+		int last_index = elementData.size() - 1 ;
+		if(last_index >= 0){
+			last = elementData.get(last_index);
+		}
+		return last;
+	}
+	public boolean isEmpty(){
+		return elementData.size() == 0;
+	}
+	public int size(){
+		return elementData.size();
+	}
+
+	@Override
+	public String toString(){
+		StringBuilder sb = new StringBuilder();
+		sb.append("[");
+		int i = 0;
+		for (; i < size() - 1; i++) {
+			sb.append(elementData.get(i));
+			sb.append(", ");
+		}
+		sb.append(elementData.get(i));
+		sb.append("]");
+		return sb.toString();
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code05/StackUtil.java b/students/769232552/season_one/main/java/season_1/code05/StackUtil.java
new file mode 100644
index 0000000000..fb9e90631a
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code05/StackUtil.java
@@ -0,0 +1,148 @@
+package code05;
+
+public class StackUtil {
+	
+	
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+
+	/**
+	 * 此处是传值，将原有栈的地址 复制给 变量 s， s在函数内相当于局部变量，因此 s 重新赋值并没有什么用
+	 * @param s
+	 */
+	public static void bad_reverse(Stack s) {
+		if(s == null){
+			return;
+		}
+		// need a new stack
+		Stack newStack = new Stack();
+		while (s.peek() != null){
+			newStack.push(s.pop());
+		}
+		s = newStack;
+	}
+
+
+	public static void reverse(Stack s) {
+		if(s == null || s.isEmpty()){
+			return;
+		}
+
+		Stack tmp = new Stack();
+		while(!s.isEmpty()){
+			tmp.push(s.pop());
+		}
+		while(!tmp.isEmpty()){
+			int top = (Integer) tmp.pop();
+			addToBottom(s,top);//加入到原来栈的栈底
+		}
+
+
+	}
+
+	public static void addToBottom(Stack s,  int value){
+		if(s.isEmpty()){
+			s.push(value);
+		} else{
+			int top = (Integer)  s.pop();
+			addToBottom(s,value);
+			s.push(top);
+		}
+
+	}
+
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param o
+	 */
+	public static void remove(Stack s,Object o) {
+		if(s == null || o == null){
+			return;
+		}
+		Stack newStack = new Stack();
+		while (s.peek() != null){
+			Object e = s.pop();
+			if(!e.equals(o)){
+				newStack.push(e);
+			}
+		}
+		while (newStack.peek() != null){
+			s.push(newStack.pop());
+		}
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s,int len) throws Exception {
+		if(s == null || s.isEmpty() || s.size() < len || len <= 0){
+			return null;
+		}
+		Stack newStack = new Stack();
+		for (int i = 0; i < len; i++) {
+			Object o = s.pop();
+			newStack.push(o);
+		}
+		Object[] objects = new Object[len];
+		for (int i = len - 1; i >= 0; i--) {
+			Object o = newStack.pop();
+			s.push(o);
+			objects[i] = o;
+		}
+		return objects;
+	}
+	/**
+	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
+	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
+	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
+	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s){
+		char tag_1_start = '{';
+		char tag_1_end = '}';
+		char tag_2_start = '[';
+		char tag_2_end = ']';
+		char tag_3_start = '(';
+		char tag_3_end = ')';
+
+		int length = s.length();
+		Stack stack = new Stack();
+		for (int i = 0; i < length; i++) {
+			char c  = s.charAt(i);
+			if(c == tag_1_start || c == tag_2_start || c == tag_3_start){
+				stack.push(c);
+			}
+			else if(c == tag_1_end){
+				//pop all element after tag_1_start
+				Object t= stack.pop();
+				if(!t.equals(tag_1_start)){
+					return false;
+				}
+			}
+			else if(c == tag_2_end){
+				//pop all element after tag_1_start
+				Object t=  stack.pop();
+				if(!t.equals(tag_2_start)){
+					return false;
+				}
+			}
+			else if(c == tag_3_end){
+				//pop all element after tag_1_start
+				Object t= stack.pop();
+				if(!t.equals(tag_3_start)){
+					return false;
+				}
+			}
+		}
+		return stack.size() == 0;
+	}
+	
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code06/InfixExpr.java b/students/769232552/season_one/main/java/season_1/code06/InfixExpr.java
new file mode 100644
index 0000000000..a13e190091
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code06/InfixExpr.java
@@ -0,0 +1,126 @@
+package code06;
+
+import code05.Stack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class InfixExpr {
+	String expr = null;
+	
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	private float calc(float a, float b, String ops){
+		float result = 0.0f;
+		if (ops.equals("+")) {
+			return b + a;
+		}
+		if (ops.equals("-")) {
+			return b - a;
+		}
+		if (ops.equals("*")) {
+			return b * a;
+		}
+		if (ops.equals("/")) {
+			return b / a;
+		}
+		return result;
+	}
+
+	private boolean isOperator(String ch){
+		boolean isOperator = (ch.equals("+") || ch.equals("-") || ch.equals("*") || ch.equals("/"));
+		return isOperator;
+	}
+
+	//parse string to list
+	private List parser(){
+		char[] chs = expr.toCharArray();
+		List values = new ArrayList<String>();
+		int currentCharPos = 0; // 当前字符的位置
+		while (currentCharPos < chs.length) {
+			String currentStr = String.valueOf(chs[currentCharPos]);
+			if(isOperator(currentStr)){
+				values.add(currentStr);
+				currentCharPos ++;
+			}
+			else {
+				int numberOffset  =  0;
+				while (currentCharPos + numberOffset < chs.length && !isOperator(String.valueOf(chs[currentCharPos+numberOffset]))){
+					numberOffset ++ ;
+				}
+				if(numberOffset == 1){
+					values.add(currentStr);
+					currentCharPos++;
+				}else {
+					String number = new String(chs,currentCharPos,numberOffset);
+					values.add(number);
+					currentCharPos = currentCharPos + numberOffset;
+				}
+			}
+		}
+		return values;
+	}
+
+	private int morePriority(String peek, String e) {
+		boolean hasMorePriority = ((e.equals("+") || e.equals("-")) && (peek.equals("*") || peek.equals("/")));
+		boolean hasLessPriority = ((e.equals("*") || e.equals("/")) && (peek.equals("+") || peek.equals("-")));
+		if(hasMorePriority) {
+			return 1;
+		}
+		if(hasLessPriority){
+			return -1;
+		}
+		return 0;
+	}
+
+	public float evaluate() {
+		float result = 0.0f;
+
+		Stack numberStack = new Stack();
+		Stack opsStack = new Stack();
+
+		List<String> elements = this.parser();
+		for(String e : elements){
+			if(!isOperator(e)){ //数字直接入栈
+				float number = Float.valueOf(e);
+				numberStack.push(number);
+			}else {//操作符
+				if(opsStack.isEmpty()){
+					opsStack.push(e);
+				}else {
+					//栈顶符号有着相等或者更高的优先级
+					if(morePriority((String) opsStack.peek(),e) >= 0){
+						float a = (Float) numberStack.pop();
+						float b = (Float) numberStack.pop();
+						String ops = (String) opsStack.pop();
+
+						float value = calc(a,b,ops);
+
+						numberStack.push(value);
+						opsStack.push(e);
+					}else {
+						opsStack.push(e);
+					}
+				}
+			}
+		}
+		while (!opsStack.isEmpty()) {
+			float a = (Float) numberStack.pop();
+			float b = (Float) numberStack.pop();
+			String ops = (String) opsStack.pop();
+			float value = calc(a, b, ops);
+			numberStack.push(value);
+		}
+
+		result = (Float) numberStack.pop();
+		return result;
+	}
+
+	public static void main(String[] args) {
+		InfixExpr expr = new InfixExpr("20+30.8*400/500");
+		List<String> elements = expr.parser();
+		System.out.println(expr.evaluate());
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java b/students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java
new file mode 100644
index 0000000000..7da7c7d58d
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java
@@ -0,0 +1,44 @@
+package code07;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class InfixToPostfix {
+	
+	public static List<Token> convert(String expr) {
+
+	    List<Token> tokens = new ArrayList<Token>();
+
+        Stack<Token> tokenStack = new Stack<Token>();
+        List<Token> infixTokens =TokenParser.parseInfix(expr);
+
+        for(Token t : infixTokens){
+            if(t.isNumber()){
+                tokens.add(t);
+            }else {
+                while (!tokenStack.isEmpty() && !t.hasHigherPriority(tokenStack.peek())){
+                    tokens .add(tokenStack.pop());
+                }
+                tokenStack.push(t);
+            }
+        }
+
+        while(!tokenStack.isEmpty()){
+            tokens.add(tokenStack.pop());
+        }
+
+		return tokens;
+	}
+
+    public static void main(String[] args) {
+        String expr = "2+3*4+5";
+        List<Token> tokens = InfixToPostfix.convert(expr);
+        for(Token t : tokens){
+            System.out.println(t.getStringValue());
+        }
+
+    }
+
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java b/students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java
new file mode 100644
index 0000000000..cf9e3e6722
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java
@@ -0,0 +1,47 @@
+package code07;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PostfixExpr {
+String expr = null;
+	
+	public PostfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+
+		Stack<Float> numStack = new Stack<Float>();
+		List<Token> tokens = TokenParser.parseNoInfix(this.expr);
+
+		for(Token token : tokens){
+			if(token.isNumber()){
+				numStack.push(new Float(token.getIntValue()));
+			} else{
+				Float f2 = numStack.pop();
+				Float f1 = numStack.pop();
+				numStack.push(calc(f1,f2,token.getStringValue()));
+			}
+		}
+
+		return numStack.pop().floatValue();
+	}
+
+	//如下类似排比句的代码写法就是卫语句
+	private Float calc(Float f1, Float f2, String op){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java b/students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java
new file mode 100644
index 0000000000..1f8bcff595
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java
@@ -0,0 +1,55 @@
+package code07;
+
+import java.util.List;
+import java.util.Stack;
+
+public class PrefixExpr {
+	String expr = null;
+	
+	public PrefixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		Stack<Token> exprStack = new Stack<Token>();
+		Stack<Float> numberStack = new Stack<Float>();
+
+		List<Token> tokens = TokenParser.parseNoInfix(this.expr);
+
+		for(Token t: tokens){
+			 exprStack.push(t);
+		}
+
+		while (!exprStack.isEmpty()){
+			Token t = exprStack.pop();
+			if(Token.OPERATOR == t.getType()){
+				float a = numberStack.pop();
+				float b = numberStack.pop();
+				float result = calc(a,b,t.getStringValue());
+				numberStack.push(result);
+			}else if(Token.NUMBER == t.getType()){
+				numberStack.push(Float.parseFloat(t.getStringValue()));
+			}else {
+				System.out.println("char :["+t.getStringValue()+"] is not number or operator,ignore");
+			}
+		}
+
+		return numberStack.pop().floatValue();
+	}
+
+	private Float calc(Float f1, Float f2, String op){
+		if(op.equals("+")){
+			return f1+f2;
+		}
+		if(op.equals("-")){
+			return f1-f2;
+		}
+		if(op.equals("*")){
+			return f1*f2;
+		}
+		if(op.equals("/")){
+			return f1/f2;
+		}
+		throw new RuntimeException(op + " is not supported");
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/code07/Token.java b/students/769232552/season_one/main/java/season_1/code07/Token.java
new file mode 100644
index 0000000000..a5d6735427
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code07/Token.java
@@ -0,0 +1,63 @@
+package code07;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by yyglider on 2017/4/19.
+ */
+public class Token {
+
+    public static final List<String> OPERATORS = Arrays.asList("+","-","*","/");
+
+    private static final Map<String,Integer> priorities = new HashMap<String, Integer>();
+
+    static {
+        priorities.put("+",1);
+        priorities.put("-",1);
+        priorities.put("*",2);
+        priorities.put("/",2);
+    }
+
+    public static final int OPERATOR = 1;
+    public static final int NUMBER = 2;
+
+    private String value;
+    private int type;
+
+    public Token(int type, String value) {
+        this.value = value;
+        this.type = type;
+    }
+
+    public boolean isNumber(){
+        return type == NUMBER;
+    }
+
+    public boolean isOperator(){
+        return type == OPERATOR;
+    }
+
+    public int getIntValue(){
+        return Integer.valueOf(value).intValue();
+    }
+
+    public String getStringValue(){
+        return value;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public boolean hasHigherPriority(Token t){
+        if(!this.isOperator() && !t.isOperator()){
+            throw new RuntimeException("numbers can't compare priority");
+        }
+        return priorities.get(this.value) - priorities.get(t.value) > 0;
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code07/TokenParser.java b/students/769232552/season_one/main/java/season_1/code07/TokenParser.java
new file mode 100644
index 0000000000..df91e4d3dc
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code07/TokenParser.java
@@ -0,0 +1,89 @@
+package code07;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by yyglider on 2017/4/20.
+ * 解析表达式成各个Token
+ */
+public class TokenParser {
+
+    public static List<Token> parseNoInfix(String expr){
+        List<Token> tokens = new ArrayList<Token>();
+
+        String[] chs = expr.split(" ");
+
+        for (int i = 0; i < chs.length; i++) {
+            if(isOperator(chs[i])){
+                tokens.add(new Token(Token.OPERATOR,chs[i]));
+            }else {
+                String value = chs[i];
+                tokens.add(new Token(Token.NUMBER,value));
+            }
+        }
+        return tokens;
+    }
+
+
+    public static List<Token> parseInfix(String expr){
+        List<Token> tokens = new ArrayList<Token>();
+
+        char[] chs = expr.toCharArray();
+
+        int i = 0;
+        while (i < chs.length){
+            if(isOperator(chs[i])){
+                tokens.add(new Token(Token.OPERATOR,String.valueOf(chs[i])));
+                i++;
+            }else if(Character.isDigit(chs[i])){
+
+                int nextOperatorPos = findNextOperatorPos(i,chs);
+                String value = expr.substring(i,nextOperatorPos);
+                tokens.add(new Token(Token.NUMBER,value));
+                i = nextOperatorPos;
+
+            }else {
+                System.out.println("char :["+chs[i]+"] is not number or operator,ignore");
+                i++;
+            }
+        }
+        return tokens;
+    }
+
+    private static int findNextOperatorPos(int i, char[] chs) {
+        while (Character.isDigit(chs[i])) {
+            i++;
+            if (i == chs.length) {
+                break;
+            }
+        }
+        return i;
+    }
+
+    private static boolean isOperator(char c) {
+        String sc = String.valueOf(c);
+        return Token.OPERATORS.contains(sc);
+    }
+
+    private static boolean isOperator(String c) {
+        return Token.OPERATORS.contains(c);
+    }
+
+    public static void main(String[] args) {
+/*
+        String expr = "20+30.8*400/500";
+        List<Token> tokens = TokenParser.parseInfix(expr);
+        for(Token t: tokens){
+            System.out.println(t.getStringValue());
+        }
+*/
+
+
+        String expr2 = "- + + 6 / * 2 9 3 * 4 2 8";
+        List<Token> tokens2 = TokenParser.parseNoInfix(expr2);
+        for(Token t: tokens2){
+            System.out.println(t.getStringValue());
+        }
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/code08/CircleQueue.java b/students/769232552/season_one/main/java/season_1/code08/CircleQueue.java
new file mode 100644
index 0000000000..99ccd2cc57
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code08/CircleQueue.java
@@ -0,0 +1,93 @@
+package code08;
+
+/**
+ * 用数组实现循环队列 - 杜绝“假上溢”
+ * 在入队和出队的操作中，头尾指针只增加不减小，致使被删除元素的空间永远无法重新利用。
+ *
+ * 因此，尽管队列中实际的元素个数远远小于向量空间的规模，但也可能由于尾指针巳超出向量空间的上界而不能做入队操作。
+ * 为充分利用向量空间。克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆环，并称这种向量为循环队列。
+ * 在循环队列中进行出队、入队操作时，头尾指针仍要加1，朝前移动。
+ * 只不过当头尾指针指向向量上界（QueueSize-1）时，其加1操作的结果是指向向量的下界0。
+ * @param <E>
+ */
+public class CircleQueue <E> {
+	
+	private int maxSize;
+    //用数组来保存循环队列的元素
+    private Object[] elementData;
+    //队头
+    private int front;
+    //队尾
+    private int rear;
+    //元素个数
+    private int count;
+
+    public CircleQueue(int maxSize) {
+        this.maxSize = maxSize+1; //队列需要一个空的位置用于区分队列满和队列空
+        this.elementData  = new Object[maxSize+1];
+        this.front = 0;
+        this.rear = 0;
+    }
+
+    public int size() {
+        return count;
+    }
+
+    public void enQueue(E data) {
+        if(this.isFull()){
+            System.out.println("queue is full, enQueue failed");
+            return;
+        }
+        elementData[rear] = data;
+        rear = (rear + 1) % this.maxSize;
+        count ++;
+    }
+
+    public E deQueue() {
+        if(this.isEmpty()){
+            System.out.println("queue is empty, deQueue failed");
+            return null;
+        }
+        E e = (E) elementData[front];
+        front = (front + 1) % this.maxSize;
+        count --;
+        return e;
+    }
+
+    public boolean isFull(){
+	    return ((rear + 1) % this.maxSize == front);
+    }
+
+    public boolean isEmpty() {
+        return rear == front;
+    }
+
+    public static void main(String[] args) {
+        CircleQueue<String> q = new CircleQueue<String>(11);
+        q.enQueue("a1");
+        q.enQueue("a2");
+        q.enQueue("a3");
+        q.enQueue("a4");
+        q.enQueue("a5");
+        q.enQueue("a6");
+        q.enQueue("a7");
+        q.enQueue("a8");
+        q.enQueue("a9");
+        q.enQueue("a10");
+        System.out.println("current size is : " + q.size());
+
+        System.out.println("dequeue : " + q.deQueue());
+        System.out.println("after deQueue , current size is : " + q.size());
+
+        q.enQueue("new1");
+        System.out.println("after enQueue , current size is : " + q.size());
+
+        /*while(!q.isEmpty()){
+            System.out.println(q.deQueue());
+            System.out.println("current size is : " + q.size());
+        }*/
+
+
+
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/code08/Josephus.java b/students/769232552/season_one/main/java/season_1/code08/Josephus.java
new file mode 100644
index 0000000000..4c964631e2
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code08/Josephus.java
@@ -0,0 +1,55 @@
+package code08;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用Queue来实现Josephus问题
+ * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
+ * 该方法返回一个List， 包含了被杀死人的次序
+
+ 	0 1 2 3  4 5 6 7 8 9    m=3, n=10
+
+ 	第一个人(2)出列后的序列为：
+    3 4 5 6 7 8 9 0 1 (0,1,2 出队列，0,1　再入队列)
+
+ 	第二个人(5)出列后的序列为：
+ 　　6 7 8 9 0 1　3 4  (3,4,5 出队列，3,4　再入队列)
+
+ 	...
+
+    如果剩余队列长度小于等于m则依次出队列
+
+ */
+public class Josephus {
+	
+	public static List<Integer> execute(int n, int m){
+		List<Integer> kList = new ArrayList<Integer>();
+		CircleQueue<Integer> circleQueue = new CircleQueue<Integer>(n);
+
+		for (int i = 0; i < n ; i++) {
+			circleQueue.enQueue(i);
+		}
+
+		Queue<Integer> tmpQueue = new Queue<Integer>();
+		while(!circleQueue.isEmpty()){
+
+			if(m > circleQueue.size()) {
+				m = m % circleQueue.size();
+			}
+
+			for (int j = 0; j < m-1; j++) {
+				tmpQueue.enQueue(circleQueue.deQueue());
+			}
+
+			Integer kill = circleQueue.deQueue();
+			kList.add(kill);
+
+			for (int j = 0; j < m-1; j++) {
+				circleQueue.enQueue(tmpQueue.deQueue());
+			}
+		}
+		return kList;
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/code08/Queue.java b/students/769232552/season_one/main/java/season_1/code08/Queue.java
new file mode 100644
index 0000000000..f4e1977b73
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code08/Queue.java
@@ -0,0 +1,61 @@
+package code08;
+
+import java.util.NoSuchElementException;
+
+public class Queue<E> {
+    private Node<E> first;    
+    private Node<E> last;     
+    private int size;               
+
+    
+    private static class Node<E> {
+        private E item;
+        private Node<E> next;
+    }
+
+    
+    public Queue() {
+        first = null;
+        last  = null;
+        size = 0;
+    }
+
+    
+    public boolean isEmpty() {
+        return first == null;
+    }
+
+    public int size() {
+        return size;
+    }
+
+    
+
+    public void enQueue(E data) {
+        Node<E> oldlast = last;
+        last = new Node<E>();
+        last.item = data;
+        last.next = null;
+        if (isEmpty()) {
+        	first = last;
+        }
+        else{
+        	oldlast.next = last;
+        }
+        size++;
+    }
+
+    public E deQueue() {
+        if (isEmpty()) {
+        	throw new NoSuchElementException("Queue underflow");
+        }
+        E item = first.item;
+        first = first.next;
+        size--;
+        if (isEmpty()) {
+        	last = null;  
+        }
+        return item;
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java b/students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java
new file mode 100644
index 0000000000..7f9700f573
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java
@@ -0,0 +1,66 @@
+package code08;
+
+import java.util.Stack;
+
+/**
+ * 用两个栈来实现一个队列
+ * @param <E>
+ */
+public class QueueWithTwoStacks<E> {
+	private Stack<E> stack1;    
+    private Stack<E> stack2;    
+
+    
+    public QueueWithTwoStacks() {
+        stack1 = new Stack<E>();
+        stack2 = new Stack<E>();
+    }
+
+    
+
+    public boolean isEmpty() {
+        return stack1.isEmpty() && stack2.isEmpty();
+    }
+
+    
+    public int size() {
+        return stack1.size() + stack2.size();
+    }
+
+
+    public void enQueue(E item) {
+        stack1.push(item);
+    }
+
+    public E deQueue() {
+        if(!stack2.isEmpty()){
+            return stack2.pop();
+        }
+        if(!stack1.isEmpty()){
+            while (!stack1.isEmpty()){
+                E e = stack1.pop();
+                stack2.push(e);
+            }
+            return stack2.pop();
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+        QueueWithTwoStacks q = new QueueWithTwoStacks();
+        q.enQueue("a");
+        q.enQueue("b");
+        q.enQueue("c");
+        while (!q.isEmpty()){
+            System.out.println(q.deQueue());
+        }
+        q.enQueue("d");
+        q.enQueue("e");
+        while (!q.isEmpty()){
+            System.out.println(q.deQueue());
+        }
+    }
+
+ }
+
diff --git a/students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java b/students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java
new file mode 100644
index 0000000000..7951a2bde1
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java
@@ -0,0 +1,40 @@
+package code09;
+
+import code05.Stack;
+
+/**
+ * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
+ * finMin操作最坏的情形下时间复杂度应该是O(1)，简单来讲，操作一次就可以得到最小值
+ *
+ * 构造一个辅助栈，每次压入当前主栈中最小的元素
+ */
+public class QuickMinStack {
+
+    Stack mainStack = new Stack();
+    Stack subStack = new Stack(); //辅助栈
+
+    public void push(int data){
+        mainStack.push(data);
+
+        //每次压入当前主栈中最小的元素
+        if(subStack.isEmpty()){
+            subStack.push(data);
+        }
+        else if(data >= (Integer)subStack.peek()){
+            subStack.push(subStack.peek());
+        }
+        else {
+            subStack.push(data);
+        }
+
+    }
+
+    public int pop(){
+        subStack.pop();
+        return (Integer) mainStack.pop();
+    }
+
+    public int findMin(){
+        return (Integer) subStack.peek();
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java b/students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java
new file mode 100644
index 0000000000..926977502e
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java
@@ -0,0 +1,42 @@
+package code09;
+
+import code08.Queue;
+
+/**
+ * 思路和2个栈实现一个队列是一致的，入的时候简单，出的时候麻烦
+ */
+
+public class StackWithTwoQueues {
+
+
+    Queue q1 = new Queue();
+    Queue q2 = new Queue();
+
+    public void push(int data) {
+        q1.enQueue(data);
+    }
+
+    public int pop() {
+        if(q1.isEmpty()){
+            return -1;
+        }
+
+        if(q1.size() == 1){
+            return (Integer) q1.deQueue();
+        }
+
+        while (q1.size()>1){
+            q2.enQueue(q1.deQueue());
+        }
+
+        int result = (Integer) q1.deQueue();
+
+        while (!q2.isEmpty()){
+            q1.enQueue(q2.deQueue());
+        }
+
+        return result;
+    }
+
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java b/students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java
new file mode 100644
index 0000000000..9390e16246
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java
@@ -0,0 +1,152 @@
+package code09;
+
+import code01.ArrayList;
+
+/**
+ * 用一个数组实现两个栈
+ * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
+ */
+public class TwoStackInOneArray {
+
+    Object[] data = new Object[10];
+    int top1 = -1, end1 = 0;
+    int top2 = data.length, end2 = data.length - 1;
+
+    /**
+     * 向第一个栈中压入元素
+     * @param o
+     */
+    public void push1(Object o){
+        if(top1+1 < top2){
+            data[++top1] = o;
+            return;
+        }
+        resize();
+        data[++top1] = o;
+    }
+
+    /**
+     * 从第一个栈中弹出元素
+     * @return
+     */
+    public Object pop1(){
+        if(top1 < 0){
+            return null;
+        }
+        return data[top1--];
+    }
+
+    /**
+     * 获取第一个栈的栈顶元素
+     * @return
+     */
+
+    public Object peek1(){
+        if(top1 < 0){
+            return null;
+        }
+        return data[top1];
+    }
+
+    /**
+     * 向第二个栈压入元素
+     */
+    public void push2(Object o){
+
+        if(top2 - 1 > top1){
+            data[--top2] = o;
+            return;
+        }
+        resize();
+        data[--top2] = o;
+    }
+
+    /**
+     * 从第二个栈弹出元素
+     * @return
+     */
+    public Object pop2(){
+        if(top2 > data.length - 1){
+            return null;
+        }
+        return data[top2++];
+    }
+    /**
+     * 获取第二个栈的栈顶元素
+     * @return
+     */
+
+    public Object peek2(){
+        if(top2 > data.length - 1){
+            return null;
+        }
+        return data[top2];
+    }
+
+    /**
+     * 重新分配空间
+     */
+    private void resize() {
+        System.out.println("resize data array ...");
+        Object[] newData = new Object[20];
+        //copy stack 1
+        for (int i = end1; i <= top1; i++) {
+            newData[i] = this.data[i];
+        }
+        //copy stack 2
+        int newDataTop = newData.length;
+        for (int j = end2; j >= top2 ; j--) {
+            newData[--newDataTop] = this.data[j];
+        }
+        this.top2 = newDataTop;
+        this.end2 = newData.length -1;
+        this.data = newData;
+        System.out.println("data array resize to " + this.data.length);
+    }
+
+    @Override
+    public String toString(){
+        StringBuilder sb = new StringBuilder();
+        int i = this.end1;
+        sb.append("stack 1 : ");
+        for(; i <= this.top1; i++){
+            sb.append(data[i].toString()+" ");
+        }
+        sb.append(", stack 2 : ");
+        int j = this.end2;
+        for(; j >= this.top2; j--){
+            sb.append(data[j].toString()+" ");
+        }
+        return sb.toString();
+    }
+
+    public static void main(String[] args) {
+        TwoStackInOneArray s = new TwoStackInOneArray();
+        s.push1(10);
+        s.push1(11);
+        s.push1(12);
+        s.push1(13);
+        s.push1(14);
+
+        s.push2(20);
+        s.push2(21);
+        s.push2(22);
+        s.push2(23);
+        s.push2(24);
+
+        System.out.println(s);
+
+        s.push2(25);
+
+        System.out.println(s);
+
+        s.pop2();
+        s.pop2();
+        s.pop1();
+        s.pop1();
+
+        System.out.println(s);
+
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java b/students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java
new file mode 100644
index 0000000000..a7f242c984
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java
@@ -0,0 +1,39 @@
+package code10;
+
+/**
+ * Created by on 2017/5/9.
+ */
+
+public class BinaryTreeNode<T> {
+
+    public T data;
+    public BinaryTreeNode<T> left;
+    public BinaryTreeNode<T> right;
+
+    public BinaryTreeNode(T data){
+        this.data=data;
+    }
+    public T getData() {
+        return data;
+    }
+    public void setData(T data) {
+        this.data = data;
+    }
+    public BinaryTreeNode<T> getLeft() {
+        return left;
+    }
+    public void setLeft(BinaryTreeNode<T> left) {
+        this.left = left;
+    }
+    public BinaryTreeNode<T> getRight() {
+        return right;
+    }
+    public void setRight(BinaryTreeNode<T> right) {
+        this.right = right;
+    }
+
+    public BinaryTreeNode<T> insert(Object o){
+        return  null;
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java b/students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java
new file mode 100644
index 0000000000..144758651c
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java
@@ -0,0 +1,125 @@
+package code10;
+
+import code01.BinaryTree;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+/**
+ * Created by on 2017/5/9.
+ */
+public class BinaryTreeUtil {
+    /**
+     * 用递归的方式实现对二叉树的前序遍历
+     *
+     * @param root
+     * @return
+     */
+    public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
+        List<T> result = new ArrayList<T>();
+        preOrder(root,result);
+        return result;
+    }
+
+    public static <T> void preOrder(BinaryTreeNode<T> root, List<T> result){
+        if(root == null){
+            return;
+        }
+        result.add(root.getData());
+        preOrder(root.getLeft(),result);
+        preOrder(root.getRight(),result);
+    }
+
+    /**
+     * 用递归的方式实现对二叉树的中遍历
+     *
+     * @param root
+     * @return
+     */
+    public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
+        List<T> result = new ArrayList<T>();
+        inOrder(root,result);
+        return result;
+    }
+
+    public static <T> void inOrder(BinaryTreeNode<T> root, List<T> result){
+        if(root == null){
+            return;
+        }
+        inOrder(root.getLeft(),result);
+        result.add(root.getData());
+        inOrder(root.getRight(),result);
+    }
+
+    /**
+     * 用递归的方式实现对二叉树的后遍历
+     *
+     * @param root
+     * @return
+     */
+    public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
+        List<T> result = new ArrayList<T>();
+        postOrder(root,result);
+        return result;
+    }
+
+    public static <T> void postOrder(BinaryTreeNode<T> root, List<T> result){
+        if(root == null){
+            return;
+        }
+        postOrder(root.getLeft(),result);
+        postOrder(root.getRight(),result);
+        result.add(root.getData());
+    }
+
+    /**
+     * 用非递归的方式实现对二叉树的前序遍历（后序便历类似）
+     * @param root
+     * @return
+     */
+    public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
+
+        List<T> result = new ArrayList<T>();
+        Stack visitStack = new Stack();
+
+        visitStack.push(root);
+
+        while(!visitStack.isEmpty()){
+            BinaryTreeNode node = (BinaryTreeNode) visitStack.pop();
+            result.add((T) node.getData());
+            if(node.getRight() != null){
+                visitStack.push(node.getRight());
+            }
+            if(node.getLeft() != null){
+                visitStack.push(node.getLeft());
+            }
+
+        }
+
+        return result;
+    }
+    /**
+     * 用非递归的方式实现对二叉树的中序遍历
+     */
+    public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
+
+        List<T> result = new ArrayList<T>();
+
+        Stack visitStack = new Stack();
+
+        BinaryTreeNode node = root;
+
+        while(node != null ||!visitStack.isEmpty()){
+            while (node != null){
+                visitStack.push(node);
+                node = node.left;
+            }
+            BinaryTreeNode pNode = (BinaryTreeNode) visitStack.pop();
+            result.add((T) pNode.getData());
+            node = pNode.right;
+        }
+        return result;
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code10/FileList.java b/students/769232552/season_one/main/java/season_1/code10/FileList.java
new file mode 100644
index 0000000000..669d8e32e3
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code10/FileList.java
@@ -0,0 +1,38 @@
+package code10;
+
+import java.io.File;
+
+/**
+ * Created by on 2017/5/9.
+ */
+public class FileList {
+
+    public void list(File file){
+        list(file,0);
+    }
+
+    public void list(File file,int layer){
+        showFileName(file,layer);
+        if(file.isDirectory()){
+            File[] files = file.listFiles();
+            for(File f : files){
+                list(f,layer+1);
+            }
+        }
+    }
+
+    public void showFileName(File file,int i){
+        for (int j = 0; j < i; j++) {
+            System.out.print(" - ");
+        }
+        System.out.println(file.getName());
+    }
+
+    public static void main(String[] args) {
+        FileList fileList = new FileList();
+        String path = "D:\\dir1";
+        File file = new File(path);
+        fileList.list(file);
+    }
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java b/students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java
new file mode 100644
index 0000000000..6b97488945
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java
@@ -0,0 +1,305 @@
+package code11;
+
+import code10.BinaryTreeNode;
+
+import java.util.*;
+
+/**
+ * Created by yyglider on 2017/5/16.
+ */
+public class BinarySearchTree<T extends Comparable> {
+
+    BinaryTreeNode<T> root;
+
+    public BinarySearchTree(BinaryTreeNode<T> root) {
+        this.root = root;
+    }
+
+    public BinaryTreeNode<T> getRoot() {
+        return root;
+    }
+
+    public T findMin() {
+        if (this.root == null) {
+            return null;
+        }
+
+        BinaryTreeNode pNode = this.root;
+        while (pNode != null && pNode.left != null) {
+            pNode = pNode.left;
+        }
+        return (T) pNode.getData();
+    }
+
+    public T findMax() {
+        if (this.root == null) {
+            return null;
+        }
+
+        BinaryTreeNode pNode = this.root;
+        while (pNode != null && pNode.right != null) {
+            pNode = pNode.right;
+        }
+        return (T) pNode.getData();
+    }
+
+    public int height() {
+        if (this.root == null) {
+            return 0;
+        }
+        return getHeight(this.root);
+    }
+
+    private int getHeight(BinaryTreeNode<T> node) {
+        if (node == null) {
+            return 0;
+        }
+        int left = getHeight(node.left);
+        int right = getHeight(node.right);
+        return 1 + Math.max(left, right);
+    }
+
+    public int size() {
+        if (this.root == null) {
+            return 0;
+        }
+        return getSize(this.root);
+    }
+
+    private int getSize(BinaryTreeNode node) {
+        if (node == null) {
+            return 0;
+        }
+        int left = getSize(node.left);
+        int right = getSize(node.right);
+        return 1 + left + right;
+    }
+
+
+    public void remove(T e) {
+        if (this.root == null || e == null) {
+            return;
+        }
+
+        if (e.equals(this.root.getData())) {
+            this.root = null;
+            return;
+        }
+
+        BinaryTreeNode pNode = this.root; //记录待删除的元素位置
+        BinaryTreeNode pPreNode = this.root; //记录待删除的元素的前一个位置
+
+        //find e
+        while (pNode != null) {
+            if (e.compareTo(pNode.getData()) > 0) {
+                pPreNode = pNode;
+                pNode = pNode.right;
+            } else if (e.compareTo(pNode.getData()) < 0) {
+                pPreNode = pNode;
+                pNode = pNode.left;
+            } else {
+                break;
+            }
+
+        }
+
+        //delete e
+        if (pNode != null && e.equals(pNode.getData())) {
+            BinaryTreeNode node;
+            BinaryTreeNode preNode;
+
+            //如果其结点只包含左子树，或者右子树的话，此时直接删除该结点
+            boolean hasOneChild = ((pNode.right != null && pNode.left == null) && (pNode.right == null && pNode.left != null));
+            if (hasOneChild) {
+                if (pNode.left != null) {
+                    node = pNode.left;
+                    pNode.setData(node.getData());
+                    pNode.left = null;
+                    return;
+                }
+                node = pNode.right;
+                pNode.setData(node.getData());
+                pNode.right = null;
+
+            }
+
+            //如果其结点既包含左子树，也包含右子树
+            //找到其右子树的的最小元素（实际上用左子树最大元素代替也是可以的）
+            if (pNode.right != null && pNode.left != null) {
+                preNode = pNode;
+                node = pNode.right;
+                while (node != null && node.left != null) {
+                    preNode = node;
+                    node = node.left;
+                }
+                //如果是叶子节点
+                if (node.right == null) {
+                    pNode.setData(node.getData());
+
+                    preNode.right = null;
+                    return;
+                }
+
+                pNode.setData(node.getData());
+
+                //非叶子结点，用其右孩子的元素来替代
+                preNode = node;
+                node = node.right;
+                preNode.setData(node.getData());
+                preNode.right = null;
+                return;
+            }
+
+            //其本身就是叶子节点
+            pPreNode = null;
+
+        }
+    }
+
+    //层序遍历,使用队列的方式
+    public List<T> levelVisit() {
+        if (this.root == null) {
+            return null;
+        }
+        List<T> results = new ArrayList<T>();
+        Queue<BinaryTreeNode> queue = new ArrayDeque<BinaryTreeNode>();
+
+        queue.add(this.root);
+
+        while (!queue.isEmpty()) {
+            BinaryTreeNode node = queue.poll();
+            results.add((T) node.getData());
+
+            if (node.left != null) {
+                queue.add(node.left);
+            }
+            if (node.right != null) {
+                queue.add(node.right);
+            }
+        }
+        return results;
+    }
+
+
+    /**
+     * 验证是否是二叉查找树
+     */
+    public boolean isValid() {
+        if (this.root == null) {
+            return true;
+        }
+        return checkValid(this.root);
+    }
+
+    public boolean checkValid(BinaryTreeNode node) {
+
+        if (node == null) {
+            return true;
+        }
+        T nodeData = (T) node.getData();
+        boolean currentFlag = (((node.left != null && nodeData.compareTo(node.left.getData()) > 0)
+                        || node.left == null)
+                && ((node.right != null && nodeData.compareTo(node.right.getData()) < 0
+                        || node.right == null)));
+        boolean leftFlag = checkValid(node.left);
+        boolean rightFlag = checkValid(node.right);
+        return currentFlag && leftFlag && rightFlag;
+    }
+
+
+
+    /**
+     * 最近公共祖先（LCA）问题
+     * 基本思想为：从树根开始，该节点的值为t，
+     * 如果t大于t1和t2，说明t1和t2都位于t的左侧，所以它们的共同祖先必定在t的左子树中，从t.left开始搜索；
+     * 如果t小于t1和t2，说明t1和t2都位于t的右侧，那么从t.right开始搜索；
+     * 如果t1<=t<= t2，说明t1和t2位于t的两侧（或t=t1，或t=t2），那么该节点t为公共祖先。
+     */
+    public T getLowestCommonAncestor(T n1, T n2) {
+        if (this.root == null || n1 == null || n2 == null) {
+            return null;
+        }
+
+        BinaryTreeNode pNode = this.root;
+
+        while (pNode != null) {
+            if (n1.compareTo(pNode.getData()) > 0 && n2.compareTo(pNode.getData()) > 0) {
+                pNode = pNode.right;
+            } else if (n1.compareTo(pNode.getData()) < 0 && n2.compareTo(pNode.getData()) < 0) {
+                pNode = pNode.left;
+            } else {
+                return (T) pNode.getData();
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 两个节点之间的最短路径
+     */
+    public List<T> getNodesBetween(T n1, T n2) {
+
+        if (this.root == null || n1 == null || n2 == null) {
+            return null;
+        }
+
+        final List<T> list1 = new ArrayList<T>();
+        List<T> list2 = new ArrayList<T>();
+        BinaryTreeNode pNode1 = this.root;
+        BinaryTreeNode pNode2 = this.root;
+
+        //find n1 path
+        while (pNode1 != null) {
+            list1.add((T) pNode1.getData());
+
+            if (n1.compareTo(pNode1.getData()) > 0) {
+                pNode1 = pNode1.right;
+            } else if (n1.compareTo(pNode1.getData()) < 0) {
+                pNode1 = pNode1.left;
+            } else {
+                break;
+            }
+        }
+        //find n2 path
+        while (pNode2 != null) {
+            list2.add((T) pNode2.getData());
+
+            if (n2.compareTo(pNode2.getData()) > 0) {
+                pNode2 = pNode2.right;
+            } else if (n2.compareTo(pNode2.getData()) < 0) {
+                pNode2 = pNode2.left;
+            } else {
+                break;
+            }
+        }
+
+        //join path1 and path2
+        int i = 0, j = 0;
+        T first = null;
+        List<T> results = new ArrayList<T>();
+
+        while (i < list1.size() && i < list2.size()) {
+            if (list1.get(i) != list2.get(i)) {
+                break;
+            }
+            i++;
+        }
+        if (i > 0) {
+            i--;
+        }
+        int resultsLen = list1.size() + list2.size() - 2 * i - 1;
+        for (int k = list1.size() - 1; k > i; k--) {
+            results.add(list1.get(k));
+        }
+        for (int k = i; k < list2.size(); k++) {
+            results.add(list2.get(k));
+        }
+
+        Collections.reverse(list1);
+
+        return results;
+    }
+
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java
new file mode 100644
index 0000000000..386305bbda
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java
@@ -0,0 +1,19 @@
+package mini_jvm.attr;
+
+public abstract class AttributeInfo {
+	public static final String CODE = "Code";
+	public static final String CONST_VALUE = "ConstantValue";
+	public static final String EXCEPTIONS = "Exceptions";
+	public static final String LINE_NUM_TABLE = "LineNumberTable";
+	public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
+	public static final String STACK_MAP_TABLE = "StackMapTable";
+	int attrNameIndex;				
+	int attrLen ;
+	public AttributeInfo(int attrNameIndex, int attrLen) {
+		
+		this.attrNameIndex = attrNameIndex;
+		this.attrLen = attrLen;
+	}
+	
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java
new file mode 100644
index 0000000000..4817c1eee8
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java
@@ -0,0 +1,119 @@
+package mini_jvm.attr;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.cmd.ByteCodeCommand;
+import mini_jvm.cmd.CommandParser;
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.loader.ByteCodeIterator;
+
+public class CodeAttr extends AttributeInfo {
+	private int maxStack ;
+	private int maxLocals ;
+	private int codeLen ;
+	private String code;
+	public String getCode() {
+		return code;
+	}
+
+	private ByteCodeCommand[] cmds ;
+	public ByteCodeCommand[] getCmds() {		
+		return cmds;
+	}
+
+	private LineNumberTable lineNumTable;
+	private LocalVariableTable localVarTable;
+	private StackMapTable stackMapTable;
+	
+	public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) {
+		super(attrNameIndex, attrLen);
+		this.maxStack = maxStack;
+		this.maxLocals = maxLocals;
+		this.codeLen = codeLen;
+		this.code = code;
+		this.cmds = cmds;
+	}
+
+	public void setLineNumberTable(LineNumberTable t) {
+		this.lineNumTable = t;
+	}
+
+	public void setLocalVariableTable(LocalVariableTable t) {
+		this.localVarTable = t;		
+	}
+	
+
+	public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){
+		
+		int attrNameIndex = iter.nextU2ToInt();
+		int attrLen = iter.nextU4ToInt();
+		int maxStack = iter.nextU2ToInt();
+		int maxLocals = iter.nextU2ToInt();
+		int codeLen = iter.nextU4ToInt();
+		
+		String code = iter.nextUxToHexString(codeLen);
+		
+		ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code);
+		CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds);
+		
+		int exceptionTableLen = iter.nextU2ToInt();
+		//TODO 处理exception
+		if(exceptionTableLen>0){
+			String exTable = iter.nextUxToHexString(exceptionTableLen);
+			System.out.println("Encountered exception table , just ignore it :" + exTable);
+			
+		}
+		
+		
+		int subAttrCount = iter.nextU2ToInt();
+		
+		for(int x=1; x<=subAttrCount; x++){
+			int subAttrIndex = iter.nextU2ToInt();
+			String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex);
+		
+			//已经向前移动了U2, 现在退回去。
+			iter.back(2);
+			//line item table
+			if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){
+				LineNumberTable t = LineNumberTable.parse(iter);
+				codeAttr.setLineNumberTable(t);
+			}
+			else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){
+				LocalVariableTable t = LocalVariableTable.parse(iter);
+				codeAttr.setLocalVariableTable(t);
+			} 
+			else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){
+				StackMapTable t = StackMapTable.parse(iter);
+				codeAttr.setStackMapTable(t);
+			}
+			else{
+				throw new RuntimeException("Need code to process " + subAttrName);
+			}
+			
+			
+		}
+		return codeAttr;
+	}
+	
+
+	public String toString(ConstantPool pool){
+		StringBuilder buffer = new StringBuilder();
+		//buffer.append("Code:").append(code).append("\n");
+		/*for(int i=0;i<cmds.length;i++){
+			buffer.append(cmds[i].toString(pool)).append("\n");
+		}*/
+		buffer.append("\n");
+		buffer.append(this.lineNumTable.toString());
+		buffer.append(this.localVarTable.toString(pool));
+		return buffer.toString();
+	}
+	private void setStackMapTable(StackMapTable t) {
+		this.stackMapTable = t;
+		
+	}
+
+	
+	
+	
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java
new file mode 100644
index 0000000000..2b3ceea06a
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java
@@ -0,0 +1,21 @@
+package mini_jvm.attr;
+
+public class ConstantValue extends AttributeInfo {
+
+	private int constValueIndex;
+	
+	public ConstantValue(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);		
+	}
+	
+	
+	public int getConstValueIndex() {
+		return constValueIndex;
+	}
+	public void setConstValueIndex(int constValueIndex) {
+		this.constValueIndex = constValueIndex;
+	}
+	
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java
new file mode 100644
index 0000000000..2d0002c347
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java
@@ -0,0 +1,69 @@
+package mini_jvm.attr;
+
+
+import mini_jvm.loader.ByteCodeIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LineNumberTable extends AttributeInfo {
+	List<LineNumberItem> items = new ArrayList<LineNumberItem>();
+
+	public void addLineNumberItem(LineNumberItem item){
+		this.items.add(item);
+	}
+
+	public LineNumberTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+	}
+	
+	public static LineNumberTable parse(ByteCodeIterator iter){
+		
+		int index = iter.nextU2ToInt();
+		int len = iter.nextU4ToInt();
+		
+		LineNumberTable table = new LineNumberTable(index,len);
+		
+		int itemLen = iter.nextU2ToInt();
+		
+		for(int i=1; i<=itemLen; i++){
+			LineNumberItem item = new LineNumberItem();
+			item.setStartPC(iter.nextU2ToInt());
+			item.setLineNum(iter.nextU2ToInt());
+			table.addLineNumberItem(item);
+		}
+		return table;
+	}
+	
+	public String toString(){
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("Line Number Table:\n");
+		for(LineNumberItem item : items){
+			buffer.append("startPC:"+item.getStartPC()).append(",");
+			buffer.append("lineNum:"+item.getLineNum()).append("\n");
+		}
+		buffer.append("\n");
+		return buffer.toString();
+		
+	}
+
+	private static class LineNumberItem{
+		int startPC;
+		int lineNum;
+		public int getStartPC() {
+			return startPC;
+		}
+		public void setStartPC(int startPC) {
+			this.startPC = startPC;
+		}
+		public int getLineNum() {
+			return lineNum;
+		}
+		public void setLineNum(int lineNum) {
+			this.lineNum = lineNum;
+		}
+	}
+	
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java
new file mode 100644
index 0000000000..946ef5fa5d
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java
@@ -0,0 +1,98 @@
+package mini_jvm.attr;
+
+
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.loader.ByteCodeIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+public class LocalVariableTable extends AttributeInfo{
+
+	List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();
+	
+	public LocalVariableTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);		
+	}
+	
+	
+	private void addLocalVariableItem(LocalVariableItem item) {
+		this.items.add(item);		
+	}
+	
+	public static LocalVariableTable parse(ByteCodeIterator iter){
+		
+		int index = iter.nextU2ToInt();
+		int len = iter.nextU4ToInt();
+		
+		LocalVariableTable table = new LocalVariableTable(index,len);
+		
+		int itemLen = iter.nextU2ToInt();
+		
+		for(int i=1; i<=itemLen; i++){
+			LocalVariableItem item = new LocalVariableItem();
+			item.setStartPC(iter.nextU2ToInt());
+			item.setLength(iter.nextU2ToInt());
+			item.setNameIndex(iter.nextU2ToInt());
+			item.setDescIndex(iter.nextU2ToInt());
+			item.setIndex(iter.nextU2ToInt());
+			table.addLocalVariableItem(item);
+		}
+		return table;
+	}
+	
+	
+	public String toString(ConstantPool pool){
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("Local Variable Table:\n");
+		for(LocalVariableItem item : items){
+			buffer.append("startPC:"+item.getStartPC()).append(",");
+			buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(",");
+			buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(",");
+			buffer.append("slotIndex:"+ item.getIndex()).append("\n");
+		}
+		buffer.append("\n");
+		return buffer.toString();
+	}
+
+	private static class LocalVariableItem {
+		private int startPC;
+		private int length;
+		private int nameIndex;
+		private int descIndex;
+		private int index;
+		public int getStartPC() {
+			return startPC;
+		}
+		public void setStartPC(int startPC) {
+			this.startPC = startPC;
+		}
+		public int getLength() {
+			return length;
+		}
+		public void setLength(int length) {
+			this.length = length;
+		}
+		public int getNameIndex() {
+			return nameIndex;
+		}
+		public void setNameIndex(int nameIndex) {
+			this.nameIndex = nameIndex;
+		}
+		public int getDescIndex() {
+			return descIndex;
+		}
+		public void setDescIndex(int descIndex) {
+			this.descIndex = descIndex;
+		}
+		public int getIndex() {
+			return index;
+		}
+		public void setIndex(int index) {
+			this.index = index;
+		}
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java
new file mode 100644
index 0000000000..65b3b24c82
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java
@@ -0,0 +1,30 @@
+package mini_jvm.attr;
+
+
+import mini_jvm.loader.ByteCodeIterator;
+
+public class StackMapTable extends AttributeInfo{
+	
+	private String originalCode;
+
+	public StackMapTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);		
+	}
+
+	public static StackMapTable parse(ByteCodeIterator iter){
+		int index = iter.nextU2ToInt();
+		int len = iter.nextU4ToInt();
+		StackMapTable t = new StackMapTable(index,len);
+		
+		//后面的StackMapTable太过复杂， 不再处理， 只把原始的代码读进来保存
+		String code = iter.nextUxToHexString(len);
+		t.setOriginalCode(code);
+		
+		return t;
+	}
+
+	private void setOriginalCode(String code) {
+		this.originalCode = code;
+		
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..b6717402da
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java
@@ -0,0 +1,25 @@
+package mini_jvm.clz;
+
+public class AccessFlag {
+	private int flagValue;
+
+	public AccessFlag(int value) {
+		this.flagValue = value;
+	}
+
+	public int getFlagValue() {
+		return flagValue;
+	}
+
+	public void setFlagValue(int flag) {
+		this.flagValue = flag;
+	}
+	
+	public boolean isPublicClass(){
+		return (this.flagValue & 0x0001) != 0;
+	}
+	public boolean isFinalClass(){
+		return (this.flagValue & 0x0010) != 0;
+	}
+	
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..d0884893aa
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java
@@ -0,0 +1,121 @@
+package mini_jvm.clz;
+
+import mini_jvm.constant.ClassInfo;
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.field.Field;
+import mini_jvm.method.Method;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ClassFile {
+
+	private int minorVersion;
+	private int majorVersion;
+
+	private AccessFlag accessFlag;
+	private ClassIndex clzIndex;
+	private ConstantPool pool;
+	private List<Field> fields = new ArrayList<Field>();
+	private List<Method> methods = new ArrayList<Method>();
+
+	public ClassIndex getClzIndex() {
+		return clzIndex;
+	}
+	public AccessFlag getAccessFlag() {
+		return accessFlag;
+	}
+	public void setAccessFlag(AccessFlag accessFlag) {
+		this.accessFlag = accessFlag;
+	}
+
+
+
+	public ConstantPool getConstantPool() {
+		return pool;
+	}
+	public int getMinorVersion() {
+		return minorVersion;
+	}
+	public void setMinorVersion(int minorVersion) {
+		this.minorVersion = minorVersion;
+	}
+	public int getMajorVersion() {
+		return majorVersion;
+	}
+	public void setMajorVersion(int majorVersion) {
+		this.majorVersion = majorVersion;
+	}
+	public void setConstPool(ConstantPool pool) {
+		this.pool = pool;
+
+	}
+	public void setClassIndex(ClassIndex clzIndex) {
+		this.clzIndex = clzIndex;
+	}
+
+	public void setFields(List<Field> f){
+		this.fields = f;
+	}
+	public List<Field> getFields(){
+		return this.fields;
+	}
+	public void addField(Field f){this.fields.add(f);}
+
+
+	public void setMethods(List<Method> m){
+		this.methods = m;
+	}
+	public List<Method> getMethods() {
+		return methods;
+	}
+	public void addMethod(Method m){this.methods.add(m);}
+
+
+
+	public void print(){
+		if(this.accessFlag.isPublicClass()){
+			System.out.println("Access flag : public  ");
+		}
+		System.out.println("Class Name:"+ getClassName());
+		System.out.println("Super Class Name:"+ getSuperClassName());
+	}
+
+	private String getClassName(){
+		int thisClassIndex = this.clzIndex.getThisClassIndex();
+		ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
+		return thisClass.getClassName();
+	}
+	public String getSuperClassName(){
+		ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+		return superClass.getClassName();
+	}
+
+	public Method getMethod(String methodName, String paramAndReturnType){
+
+		for(Method m :methods){
+
+			int nameIndex = m.getNameIndex();
+			int descriptionIndex = m.getDescriptorIndex();
+
+			String name = this.getConstantPool().getUTF8String(nameIndex);
+			String desc = this.getConstantPool().getUTF8String(descriptionIndex);
+			if(name.equals(methodName) && desc.equals(paramAndReturnType)){
+				return m;
+			}
+		}
+		return null;
+	}
+	public Method getMainMethod(){
+		for(Method m :methods){
+			int nameIndex = m.getNameIndex();
+			int descIndex = m.getDescriptorIndex();
+			String name = this.getConstantPool().getUTF8String(nameIndex);
+			String desc = this.getConstantPool().getUTF8String(descIndex);
+			if(name.equals("main")  && desc.equals("([Ljava/lang/String;)V")){
+				return m;
+			}
+		}
+		return null;
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..dcc59908f0
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java
@@ -0,0 +1,19 @@
+package mini_jvm.clz;
+
+public class ClassIndex {
+	private int thisClassIndex;
+	private int superClassIndex;
+	
+	public int getThisClassIndex() {
+		return thisClassIndex;
+	}
+	public void setThisClassIndex(int thisClassIndex) {
+		this.thisClassIndex = thisClassIndex;
+	}
+	public int getSuperClassIndex() {
+		return superClassIndex;
+	}
+	public void setSuperClassIndex(int superClassIndex) {
+		this.superClassIndex = superClassIndex;
+	}
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java
new file mode 100644
index 0000000000..bc2be8f9f8
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java
@@ -0,0 +1,29 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.Heap;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class BiPushCmd extends OneOperandCmd {
+
+	public BiPushCmd(ClassFile clzFile, String opCode) {
+		super(clzFile,opCode);
+	}
+
+	@Override
+	public String toString() {
+	
+		return this.getOffset()+":"+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand();
+	}
+	public void execute(StackFrame frame, ExecutionResult result){
+		int value = this.getOperand();
+		JavaObject jo = Heap.getInstance().newInt(value);
+		frame.getOprandStack().push(jo);
+		
+	}
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java
new file mode 100644
index 0000000000..cc877430c0
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java
@@ -0,0 +1,158 @@
+package mini_jvm.cmd;
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.ConstantInfo;
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.StackFrame;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+public abstract class ByteCodeCommand {	
+	
+	String opCode;
+	ClassFile clzFile;
+	private int offset;
+	
+	public static final String aconst_null = "01";
+	public static final String new_object = "BB";
+	public static final String lstore = "37";
+	public static final String invokespecial = "B7";
+	public static final String invokevirtual = "B6";
+	public static final String getfield = "B4";
+	public static final String putfield = "B5";
+	public static final String getstatic = "B2";
+	public static final String ldc = "12";
+	public static final String dup = "59";
+	public static final String bipush = "10";
+	public static final String aload_0 = "2A";
+	public static final String aload_1 = "2B";
+	public static final String aload_2 = "2C";
+	public static final String iload = "15";
+	public static final String iload_1 = "1B";
+	public static final String iload_2 = "1C";
+	public static final String iload_3 = "1D";
+	public static final String fload_3 = "25";
+
+	public static final String voidreturn = "B1";
+	public static final String ireturn = "AC";
+	public static final String freturn = "AE";
+
+	public static final String astore_1 = "4C";
+	public static final String if_icmp_ge = "A2";
+	public static final String if_icmple = "A4";
+	public static final String goto_no_condition = "A7";
+	public static final String iconst_0 = "03";
+	public static final String iconst_1 = "04";
+	public static final String istore_1 = "3C";
+	public static final String istore_2 = "3D";
+	public static final String iadd = "60";
+	public static final String iinc = "84";
+	private static Map<String,String> codeMap = new HashMap<String,String>();
+	
+	static{
+		codeMap.put("01", "aconst_null");
+		
+		codeMap.put("A2", "if_icmp_ge");
+		codeMap.put("A4", "if_icmple");
+		codeMap.put("A7", "goto");
+		
+		codeMap.put("BB", "new");
+		codeMap.put("37", "lstore");
+		codeMap.put("B7", "invokespecial");
+		codeMap.put("B6", "invokevirtual");
+		codeMap.put("B4", "getfield");
+		codeMap.put("B5", "putfield");
+		codeMap.put("B2", "getstatic");
+		
+		codeMap.put("2A", "aload_0");
+		codeMap.put("2B", "aload_1");
+		codeMap.put("2C", "aload_2");
+		
+		codeMap.put("10", "bipush");
+		codeMap.put("15", "iload");
+		codeMap.put("1A", "iload_0");
+		codeMap.put("1B", "iload_1");
+		codeMap.put("1C", "iload_2");
+		codeMap.put("1D", "iload_3");
+		
+		codeMap.put("25", "fload_3");
+		
+		codeMap.put("1E", "lload_0");
+		
+		codeMap.put("24", "fload_2");
+		codeMap.put("4C", "astore_1");
+		
+		codeMap.put("A2", "if_icmp_ge");
+		codeMap.put("A4", "if_icmple");
+		
+		codeMap.put("A7", "goto");
+		
+		codeMap.put("B1", "return");
+		codeMap.put("AC", "ireturn");
+		codeMap.put("AE", "freturn");
+		
+		codeMap.put("03", "iconst_0");
+		codeMap.put("04", "iconst_1");
+		
+		codeMap.put("3C", "istore_1");
+		codeMap.put("3D", "istore_2");
+		
+		codeMap.put("59", "dup");
+		
+		codeMap.put("60", "iadd");
+		codeMap.put("84", "iinc");
+		
+		codeMap.put("12", "ldc");
+	}
+	
+	
+
+	
+
+	protected ByteCodeCommand(ClassFile clzFile, String opCode){
+		this.clzFile = clzFile;
+		this.opCode = opCode;
+	}
+	
+	protected ClassFile getClassFile() {
+		return clzFile;
+	}
+	
+	public int getOffset() {
+		return offset;
+	}
+
+	public void setOffset(int offset) {
+		this.offset = offset;
+	}
+	protected ConstantInfo getConstantInfo(int index){
+		return this.getClassFile().getConstantPool().getConstantInfo(index);
+	}
+	
+	protected ConstantPool getConstantPool(){
+		return this.getClassFile().getConstantPool();
+	}
+	
+	
+	
+	public String getOpCode() {
+		return opCode;
+	}
+
+	public abstract int getLength();
+	
+	public String getReadableCodeText(){
+		String txt = codeMap.get(opCode);
+		if(txt == null){
+			return opCode;
+		}
+		return txt;
+	}
+	
+	public abstract void execute(StackFrame frame, ExecutionResult result);
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java
new file mode 100644
index 0000000000..3effa7ae5d
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java
@@ -0,0 +1,149 @@
+package mini_jvm.cmd;
+
+import mini_jvm.clz.ClassFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CommandParser {
+	
+	
+
+	public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) {
+
+		if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) {
+			throw new RuntimeException("the orignal code is not correct");
+
+		}
+
+		codes = codes.toUpperCase();
+
+		CommandIterator iter = new CommandIterator(codes);
+		List<ByteCodeCommand> cmds = new ArrayList<ByteCodeCommand>();
+
+		while (iter.hasNext()) {
+			String opCode = iter.next2CharAsString();
+
+			if (ByteCodeCommand.new_object.equals(opCode)) {
+				NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode);
+
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.invokespecial.equals(opCode)) {
+				InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+				// System.out.println( cmd.toString(clzFile.getConstPool()));
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.invokevirtual.equals(opCode)) {
+				InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.getfield.equals(opCode)) {
+				GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.getstatic.equals(opCode)) {
+				GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.putfield.equals(opCode)) {
+				PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.ldc.equals(opCode)) {
+				LdcCmd cmd = new LdcCmd(clzFile, opCode);
+				cmd.setOperand(iter.next2CharAsInt());
+				cmds.add(cmd);
+			} else if (ByteCodeCommand.bipush.equals(opCode)) {
+				BiPushCmd cmd = new BiPushCmd(clzFile, opCode);
+				cmd.setOperand(iter.next2CharAsInt());
+				cmds.add(cmd);
+			}else if(ByteCodeCommand.if_icmp_ge.equals(opCode) 
+					|| ByteCodeCommand.if_icmple.equals(opCode) 
+					|| ByteCodeCommand.goto_no_condition.equals(opCode)){
+				ComparisonCmd cmd = new ComparisonCmd(clzFile,opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+				cmds.add(cmd);
+			} else if(ByteCodeCommand.iinc.equals(opCode)){
+				IncrementCmd cmd = new IncrementCmd(clzFile,opCode);
+				cmd.setOprand1(iter.next2CharAsInt());
+				cmd.setOprand2(iter.next2CharAsInt());
+				cmds.add(cmd);
+			}
+			else if (ByteCodeCommand.dup.equals(opCode) 
+					|| ByteCodeCommand.aload_0.equals(opCode) 
+					|| ByteCodeCommand.aload_1.equals(opCode) 
+					|| ByteCodeCommand.aload_2.equals(opCode)
+					|| ByteCodeCommand.iload_1.equals(opCode) 
+					|| ByteCodeCommand.iload_2.equals(opCode) 
+					|| ByteCodeCommand.iload_3.equals(opCode)
+					|| ByteCodeCommand.fload_3.equals(opCode) 
+					|| ByteCodeCommand.iconst_0.equals(opCode)
+					|| ByteCodeCommand.iconst_1.equals(opCode)
+					|| ByteCodeCommand.istore_1.equals(opCode)
+					|| ByteCodeCommand.istore_2.equals(opCode)
+					|| ByteCodeCommand.voidreturn.equals(opCode) 
+					|| ByteCodeCommand.iadd.equals(opCode)
+					|| ByteCodeCommand.astore_1.equals(opCode)
+					|| ByteCodeCommand.ireturn.equals(opCode)) {
+
+				NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode);
+				cmds.add(cmd);
+			} else {
+				throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented");
+			}
+
+		}
+
+		calcuateOffset(cmds);
+
+		ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()];
+		cmds.toArray(result);
+		return result;
+	}
+
+	private static void calcuateOffset(List<ByteCodeCommand> cmds) {
+
+		int offset = 0;
+		for (ByteCodeCommand cmd : cmds) {
+			cmd.setOffset(offset);
+			offset += cmd.getLength();
+		}
+
+	}
+
+	private static class CommandIterator {
+		String codes = null;
+		int pos = 0;
+
+		CommandIterator(String codes) {
+			this.codes = codes;
+		}
+
+		public boolean hasNext() {
+			return pos < this.codes.length();
+		}
+
+		public String next2CharAsString() {
+			String result = codes.substring(pos, pos + 2);
+			pos += 2;
+			return result;
+		}
+
+		public int next2CharAsInt() {
+			String s = this.next2CharAsString();
+			return Integer.valueOf(s, 16).intValue();
+		}
+
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java
new file mode 100644
index 0000000000..e195966a83
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java
@@ -0,0 +1,79 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class ComparisonCmd extends TwoOperandCmd {
+
+	protected ComparisonCmd(ClassFile clzFile, String opCode) {
+		super(clzFile, opCode);
+		
+	}
+
+	
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+		if(ByteCodeCommand.if_icmp_ge.equals(this.getOpCode())){
+			//注意次序
+			JavaObject jo2 = frame.getOprandStack().pop();
+			JavaObject jo1 = frame.getOprandStack().pop();
+			
+			if(jo1.getIntValue() >= jo2.getIntValue()){
+				
+				this.setJumpResult(result);
+				
+			}
+			
+		} else if(ByteCodeCommand.if_icmple.equals(this.getOpCode())){
+			//注意次序
+			JavaObject jo2 = frame.getOprandStack().pop();
+			JavaObject jo1 = frame.getOprandStack().pop();
+			
+			if(jo1.getIntValue() <= jo2.getIntValue()){
+				this.setJumpResult(result);
+			}
+			
+		} else if(ByteCodeCommand.goto_no_condition.equals(this.getOpCode())){
+			this.setJumpResult(result);
+			
+		} else{
+			throw new RuntimeException(this.getOpCode() + "has not been implemented");
+		}
+		
+		
+		
+		
+	}
+
+	private int getOffsetFromStartCmd(){
+		//If the comparison succeeds, the unsigned branchbyte1 and branchbyte2
+		//are used to construct a signed 16-bit offset, where the offset is calculated
+		//to be (branchbyte1 << 8) | branchbyte2. Execution then proceeds at that
+		//offset from the address of the opcode of this if_icmp<cond> instruction
+		
+	
+		int index1 = this.getOprand1();
+		int index2 = this.getOprand2();
+		short offsetFromCurrent = (short)(index1 << 8 | index2);				
+		return this.getOffset() + offsetFromCurrent ;
+	}
+	private void setJumpResult(ExecutionResult result){
+		
+		int offsetFromStartCmd = this.getOffsetFromStartCmd();		
+		
+		result.setNextAction(ExecutionResult.JUMP);
+		result.setNextCmdOffset(offsetFromStartCmd);
+	}
+
+	@Override
+	public String toString() {
+		int index = this.getIndex();
+		String text = this.getReadableCodeText();
+		return this.getOffset()+":"+ this.getOpCode() + " "+text + " " + this.getOffsetFromStartCmd();
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java
new file mode 100644
index 0000000000..b84aa9e15e
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java
@@ -0,0 +1,37 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.FieldRefInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class GetFieldCmd extends TwoOperandCmd {
+
+	public GetFieldCmd(ClassFile clzFile, String opCode) {
+		super(clzFile,opCode);		
+	}
+
+	@Override
+	public String toString() {
+		
+		return super.getOperandAsField();
+	}
+
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+		FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex());
+		String fieldName = fieldRef.getFieldName();
+		JavaObject jo = frame.getOprandStack().pop();
+		JavaObject fieldValue = jo.getFieldValue(fieldName);
+		
+		frame.getOprandStack().push(fieldValue);
+		
+		
+		
+	}
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java
new file mode 100644
index 0000000000..a1696b7ffd
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java
@@ -0,0 +1,39 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.FieldRefInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.Heap;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class GetStaticFieldCmd extends TwoOperandCmd {
+
+	public GetStaticFieldCmd(ClassFile clzFile, String opCode) {
+		super(clzFile,opCode);
+		
+	}
+
+	@Override
+	public String toString() {
+		
+		return super.getOperandAsField();
+	}
+	
+	@Override	
+	public void execute(StackFrame frame, ExecutionResult result) {
+		FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex());
+		String className = info.getClassName();
+		String fieldName = info.getFieldName();
+		String fieldType = info.getFieldType();
+		
+		if("java/lang/System".equals(className) 
+				&& "out".equals(fieldName) 
+				&& "Ljava/io/PrintStream;".equals(fieldType)){
+			JavaObject jo = Heap.getInstance().newObject(className);
+			frame.getOprandStack().push(jo);
+		}
+		//TODO 处理非System.out的情况
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java
new file mode 100644
index 0000000000..3afe4df883
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java
@@ -0,0 +1,39 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.Heap;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class IncrementCmd extends TwoOperandCmd {
+
+	public IncrementCmd(ClassFile clzFile, String opCode) {
+		super(clzFile, opCode);
+		
+	}
+
+	@Override
+	public String toString() {
+		
+		return this.getOffset()+":"+this.getOpCode()+ " " +this.getReadableCodeText();
+	}
+
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+		int index = this.getOprand1();
+		
+		int constValue = this.getOprand2();
+		
+		int currentValue = frame.getLocalVariableValue(index).getIntValue();
+		
+		JavaObject jo = Heap.getInstance().newInt(constValue+currentValue);
+		
+		frame.setLocalVariableValue(index, jo);
+		
+
+	}
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java
new file mode 100644
index 0000000000..ae0cd08d9b
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java
@@ -0,0 +1,46 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.MethodRefInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.MethodArea;
+import mini_jvm.engine.StackFrame;
+import mini_jvm.method.Method;
+
+public class InvokeSpecialCmd extends TwoOperandCmd {
+
+	public InvokeSpecialCmd(ClassFile clzFile, String opCode) {
+		super(clzFile,opCode);
+		
+	}
+
+	@Override
+	public String toString() {
+		
+		return super.getOperandAsMethod();
+	}
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+				
+		MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex());
+		
+		// 我们不用实现jang.lang.Object 的init方法
+		if(methodRefInfo.getClassName().equals("java/lang/Object") 
+				&& methodRefInfo.getMethodName().equals("<init>")){
+			return ;
+			
+		}
+		Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo);
+		
+		
+		result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
+		result.setNextMethod(nextMethod);
+		
+		
+		
+	}
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java
new file mode 100644
index 0000000000..0414b98f18
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java
@@ -0,0 +1,85 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.MethodRefInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.MethodArea;
+import mini_jvm.engine.StackFrame;
+import mini_jvm.method.Method;
+
+public class InvokeVirtualCmd extends TwoOperandCmd {
+
+	public InvokeVirtualCmd(ClassFile clzFile,String opCode) {
+		super(clzFile,opCode);
+	}
+
+	@Override
+	public String toString() {
+		
+		return super.getOperandAsMethod();
+	}
+
+	private boolean isSystemOutPrintlnMethod(String className, String methodName){
+		return "java/io/PrintStream".equals(className) 
+				&& "println".equals(methodName);
+	}
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+		//先得到对该方法的描述
+		MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex());
+		
+		String className = methodRefInfo.getClassName();
+		String methodName = methodRefInfo.getMethodName();
+		
+		// 我们没有实现System.out.println方法，  所以也不用建立新的栈帧， 直接调用Java的方法， 打印出来即可。 
+		if(isSystemOutPrintlnMethod(className,methodName)){
+			JavaObject jo = (JavaObject)frame.getOprandStack().pop();
+			String value = jo.toString();
+			System.err.println("-------------------"+value+"----------------");
+			
+			// 这里就是那个out对象， 因为是个假的，直接pop出来
+			frame.getOprandStack().pop();
+			
+			return;
+		}
+		
+		//注意：多态， 这才是真正的对象, 先从该对象的class 中去找对应的方法，找不到的话再去找父类的方法
+		JavaObject jo = frame.getOprandStack().peek();
+		
+		MethodArea ma = MethodArea.getInstance();
+		
+		Method m = null;
+		
+		String currentClassName = jo.getClassName();
+		
+		while(currentClassName != null){
+			
+			ClassFile currentClassFile = ma.findClassFile(currentClassName);
+			
+			m = currentClassFile.getMethod(methodRefInfo.getMethodName(), 
+					methodRefInfo.getParamAndReturnType());
+			if(m != null){
+				
+				break;
+				
+			} else{
+				//查找父类
+				currentClassName = currentClassFile.getSuperClassName();
+			}
+		}	
+		
+		if(m == null){
+			throw new RuntimeException("Can't find method for :" + methodRefInfo.toString());
+		}
+		
+		
+		result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
+		
+		result.setNextMethod(m);
+	}
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java
new file mode 100644
index 0000000000..2ada87ca6d
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java
@@ -0,0 +1,51 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.ConstantInfo;
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.constant.StringInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.Heap;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class LdcCmd extends OneOperandCmd {
+
+	public LdcCmd(ClassFile clzFile, String opCode) {
+		super(clzFile,opCode);		
+	}
+	
+	@Override
+	public String toString() {
+		
+		ConstantInfo info = getConstantInfo(this.getOperand());
+		
+		String value = "TBD";
+		if(info instanceof StringInfo){
+			StringInfo strInfo = (StringInfo)info;
+			value = strInfo.toString();
+		}
+		
+		return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+  value;
+		
+	}
+	public void  execute(StackFrame frame, ExecutionResult result){
+		
+		ConstantPool pool = this.getConstantPool();
+		ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand());
+		
+		if(info instanceof StringInfo){
+			StringInfo strInfo = (StringInfo)info;
+			String value = strInfo.toString();
+			JavaObject jo = Heap.getInstance().newString(value);
+			frame.getOprandStack().push(jo);
+		}
+		else{
+			//TBD 处理其他类型
+			throw new RuntimeException("Only support StringInfo constant");
+		}
+		
+		
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java
new file mode 100644
index 0000000000..ef07cb7dcb
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java
@@ -0,0 +1,39 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.ClassInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.Heap;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class NewObjectCmd extends TwoOperandCmd{
+	
+	public NewObjectCmd(ClassFile clzFile, String opCode){
+		super(clzFile,opCode);
+	}
+
+	@Override
+	public String toString() {
+		
+		return super.getOperandAsClassInfo();
+	}
+	public void execute(StackFrame frame, ExecutionResult result){
+		
+		int index = this.getIndex();
+		
+		ClassInfo info = (ClassInfo)this.getConstantInfo(index);
+		
+		String clzName = info.getClassName();
+		
+		//在Java堆上创建一个实例
+		JavaObject jo = Heap.getInstance().newObject(clzName);
+		
+		frame.getOprandStack().push(jo);
+		
+		
+		
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java
new file mode 100644
index 0000000000..da490b7931
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java
@@ -0,0 +1,146 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.Heap;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class NoOperandCmd extends ByteCodeCommand{
+
+	public NoOperandCmd(ClassFile clzFile, String opCode) {
+		super(clzFile, opCode);
+	}
+
+	@Override
+	public String toString() {
+		return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText();
+	}
+
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+		String opCode = this.getOpCode();
+		
+		if(ByteCodeCommand.aload_0.equals(opCode)){
+		
+			JavaObject jo = frame.getLocalVariableValue(0);
+			
+			frame.getOprandStack().push(jo);
+			
+		} else if(ByteCodeCommand.aload_1.equals(opCode)){
+			
+			JavaObject jo = frame.getLocalVariableValue(1);
+			
+			frame.getOprandStack().push(jo);
+			
+		} else if(ByteCodeCommand.aload_2.equals(opCode)){
+			
+			JavaObject jo = frame.getLocalVariableValue(2);
+			
+			frame.getOprandStack().push(jo);
+			
+		}else if(ByteCodeCommand.iload_1.equals(opCode)){
+			
+			JavaObject jo = frame.getLocalVariableValue(1);
+			
+			frame.getOprandStack().push(jo);
+			
+		} else if (ByteCodeCommand.iload_2.equals(opCode)){
+			
+			JavaObject jo = frame.getLocalVariableValue(2);
+			
+			frame.getOprandStack().push(jo);
+			
+		}  else if (ByteCodeCommand.iload_3.equals(opCode)){
+			
+			JavaObject jo = frame.getLocalVariableValue(3);
+			
+			frame.getOprandStack().push(jo);
+			
+		}else if (ByteCodeCommand.fload_3.equals(opCode)){
+			
+			JavaObject jo = frame.getLocalVariableValue(3);
+			
+			frame.getOprandStack().push(jo);
+			
+		}
+		else if (ByteCodeCommand.voidreturn.equals(opCode)){
+			
+			result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME);
+			
+		} else if(ByteCodeCommand.ireturn.equals(opCode)){
+			StackFrame callerFrame = frame.getCallerFrame();
+			JavaObject jo = frame.getOprandStack().pop();
+			callerFrame.getOprandStack().push(jo);
+			
+		} else if(ByteCodeCommand.freturn.equals(opCode)){
+			
+			StackFrame callerFrame = frame.getCallerFrame();
+			JavaObject jo = frame.getOprandStack().pop();
+			callerFrame.getOprandStack().push(jo);
+		}
+		
+		else if(ByteCodeCommand.astore_1.equals(opCode)){
+			
+			JavaObject jo = frame.getOprandStack().pop();
+			
+		    frame.setLocalVariableValue(1, jo);
+		    
+		} else if(ByteCodeCommand.dup.equals(opCode)){
+			
+			JavaObject jo = frame.getOprandStack().peek();
+			frame.getOprandStack().push(jo);
+			
+		} else if(ByteCodeCommand.iconst_0.equals(opCode)){
+			
+			JavaObject jo = Heap.getInstance().newInt(0);
+			
+			frame.getOprandStack().push(jo);
+			
+		} else if(ByteCodeCommand.iconst_1.equals(opCode)){
+			
+			JavaObject jo = Heap.getInstance().newInt(1);
+			
+			frame.getOprandStack().push(jo);
+			
+		} else if(ByteCodeCommand.istore_1.equals(opCode)){
+			
+			JavaObject jo = frame.getOprandStack().pop();
+			
+			frame.setLocalVariableValue(1, jo);
+			
+		}  else if(ByteCodeCommand.istore_2.equals(opCode)){
+			
+			JavaObject jo = frame.getOprandStack().pop();
+			
+			frame.setLocalVariableValue(2, jo);
+			
+		} else if(ByteCodeCommand.iadd.equals(opCode)){
+			
+			JavaObject jo1 = frame.getOprandStack().pop();
+			JavaObject jo2 = frame.getOprandStack().pop();
+			
+			JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue());
+			
+			frame.getOprandStack().push(sum);
+			
+		} else if (ByteCodeCommand.aconst_null.equals(opCode)){
+			
+			frame.getOprandStack().push(null);
+			
+		} 
+		else{
+			throw new RuntimeException("you must forget to implement the operation :" + opCode);
+		}
+		
+		
+	}
+	
+	
+	public  int getLength(){
+		return 1;
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java
new file mode 100644
index 0000000000..0ffadfbd2b
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java
@@ -0,0 +1,29 @@
+package mini_jvm.cmd;
+
+import mini_jvm.clz.ClassFile;
+
+
+
+public abstract class OneOperandCmd extends ByteCodeCommand {
+
+	private int operand;
+	
+	public OneOperandCmd(ClassFile clzFile, String opCode) {
+		super(clzFile, opCode);
+		
+	}
+	public  int getOperand() {
+		
+		return this.operand;
+	}
+
+	public void setOperand(int oprand1) {
+		this.operand = oprand1;
+		
+	}
+	public  int getLength(){
+		return 2;
+	}
+
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java
new file mode 100644
index 0000000000..94652375fd
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java
@@ -0,0 +1,44 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.ClassInfo;
+import mini_jvm.constant.FieldRefInfo;
+import mini_jvm.constant.NameAndTypeInfo;
+import mini_jvm.engine.ExecutionResult;
+import mini_jvm.engine.JavaObject;
+import mini_jvm.engine.StackFrame;
+
+public class PutFieldCmd extends TwoOperandCmd {
+
+	public PutFieldCmd(ClassFile clzFile, String opCode) {
+		super(clzFile,opCode);
+	}
+
+	@Override
+	public String toString() {
+		
+		return super.getOperandAsField();
+	}
+	@Override
+	public void execute(StackFrame frame, ExecutionResult result) {
+		
+		FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex());
+		
+		ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex());
+		NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex());
+		// for example : name
+		String fieldName = nameTypeInfo.getName();
+		// for example : Ljava/lang/String : 注意：我们不再检查类型
+		String fieldType = nameTypeInfo.getTypeInfo();
+		
+		JavaObject fieldValue = frame.getOprandStack().pop();
+		JavaObject objectRef = frame.getOprandStack().pop();
+		
+		objectRef.setFieldValue(fieldName, fieldValue);
+		
+	}
+
+
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java
new file mode 100644
index 0000000000..93ea4b02bf
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java
@@ -0,0 +1,67 @@
+package mini_jvm.cmd;
+
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.ClassInfo;
+import mini_jvm.constant.ConstantInfo;
+import mini_jvm.constant.FieldRefInfo;
+import mini_jvm.constant.MethodRefInfo;
+
+public abstract class TwoOperandCmd extends ByteCodeCommand{
+	
+	int oprand1 = -1;
+	int oprand2 = -1;
+	
+	public int getOprand1() {
+		return oprand1;
+	}
+
+	public void setOprand1(int oprand1) {
+		this.oprand1 = oprand1;
+	}
+
+	public void setOprand2(int oprand2) {
+		this.oprand2 = oprand2;
+	}
+
+	public int getOprand2() {
+		return oprand2;
+	}
+	
+	public TwoOperandCmd(ClassFile clzFile, String opCode) {
+		super(clzFile, opCode);
+	}
+
+	public int getIndex(){
+		int oprand1 = this.getOprand1();
+		int oprand2 = this.getOprand2();
+		int index = oprand1 << 8 | oprand2;
+		return index;
+	}
+	
+	protected String getOperandAsClassInfo(){
+		int index = getIndex();
+		String codeTxt = getReadableCodeText();
+		ClassInfo info = (ClassInfo)getConstantInfo(index);
+		return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +"  "+ info.getClassName();
+	}
+	
+	protected String getOperandAsMethod(){
+		int index = getIndex();
+		String codeTxt = getReadableCodeText();
+		ConstantInfo constInfo = this.getConstantInfo(index);
+		MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index);
+		return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +"  "+ info.toString();
+	}
+
+	protected String getOperandAsField(){
+		int index = getIndex();
+		
+		String codeTxt = getReadableCodeText();
+		FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index);
+		return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +"  "+ info.toString();
+	}
+	public  int getLength(){
+		return 3;
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..8b974772fe
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java
@@ -0,0 +1,26 @@
+package mini_jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+	private final int type = ConstantInfo.CLASS_INFO;
+
+	private int utf8Index ;
+	public ClassInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getUtf8Index() {
+		return utf8Index;
+	}
+	public void setUtf8Index(int utf8Index) {
+		this.utf8Index = utf8Index;
+	}
+	public int getType() {
+		return type;
+	}
+	
+	public String getClassName() {		
+		int index = getUtf8Index();
+		UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
+		return utf8Info.getValue();		
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..54f89aacd8
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java
@@ -0,0 +1,28 @@
+package mini_jvm.constant;
+
+public abstract class ConstantInfo {
+	public static final int UTF8_INFO = 1;
+	public static final int FLOAT_INFO = 4;
+	public static final int CLASS_INFO = 7;
+	public static final int STRING_INFO = 8;
+	public static final int FIELD_INFO = 9;
+	public static final int METHOD_INFO = 10;
+	public static final int NAME_AND_TYPE_INFO = 12;
+
+	protected ConstantPool constantPool;
+	
+	public ConstantInfo(){}
+	
+	public ConstantInfo(ConstantPool pool) {
+		this.constantPool = pool;
+	}
+	public abstract int getType();
+	
+	public ConstantPool getConstantPool() {
+		return constantPool;
+	}
+	public ConstantInfo getConstantInfo(int index){
+		return this.constantPool.getConstantInfo(index);
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..c5d8348d89
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java
@@ -0,0 +1,25 @@
+package mini_jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+	
+	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
+	
+	public ConstantPool(){}
+
+	public void addConstantInfo(ConstantInfo info){
+		this.constantInfos.add(info);
+	}
+	
+	public ConstantInfo getConstantInfo(int index){
+		return this.constantInfos.get(index);
+	}
+	public String getUTF8String(int index){
+		return ((UTF8Info)this.constantInfos.get(index)).getValue();
+	}
+	public Object getSize() {		
+		return this.constantInfos.size() -1;
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..be474180d8
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java
@@ -0,0 +1,49 @@
+package mini_jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo{
+	private final int type = ConstantInfo.FIELD_INFO;
+
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+	
+	public FieldRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+	public int getType() {
+		return type;
+	}
+	
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+	
+	public String toString(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return getClassName() +" : "+  typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
+	}
+	
+	public String getClassName(){
+		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+		UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
+		return utf8Info.getValue();
+	}
+	
+	public String getFieldName(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();		
+	}
+	
+	public String getFieldType(){
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();	
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..8e3789e1b4
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java
@@ -0,0 +1,52 @@
+package mini_jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+	
+	private final int type = ConstantInfo.METHOD_INFO;
+	
+	private int classInfoIndex;	
+	private int nameAndTypeIndex;
+	
+	public MethodRefInfo(ConstantPool pool) {
+		 super(pool);
+	}
+
+	public int getType() {
+		return type;
+	}
+	
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+	
+	public String toString(){
+		return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
+	}
+
+	public String getClassName(){
+		ConstantPool pool = this.getConstantPool();
+		ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
+		return clzInfo.getClassName();
+	}
+	
+	public String getMethodName(){
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+	
+	public String getParamAndReturnType(){
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..142787ce16
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,45 @@
+package mini_jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo{
+	public final int type = ConstantInfo.NAME_AND_TYPE_INFO;
+	
+	private int index1;
+	private int index2;
+	
+	public NameAndTypeInfo(ConstantPool pool) {
+		super(pool);
+	}
+	
+	public int getIndex1() {
+		return index1;
+	}
+	public void setIndex1(int index1) {
+		this.index1 = index1;
+	}
+	public int getIndex2() {
+		return index2;
+	}
+	public void setIndex2(int index2) {
+		this.index2 = index2;
+	}
+	public int getType() {
+		return type;
+	}
+	
+	
+	public String getName(){
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
+		return utf8Info1.getValue();
+	}
+	
+	public String getTypeInfo(){
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
+		return utf8Info2.getValue();
+	}
+	
+	public String toString(){
+		return "(" + getName() + "," + getTypeInfo()+")";
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..6c3bcad2df
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java
@@ -0,0 +1,12 @@
+package mini_jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+
+	public NullConstantInfo(){}
+
+	@Override
+	public int getType() {		
+		return -1;
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..8b432cffb7
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java
@@ -0,0 +1,25 @@
+package mini_jvm.constant;
+
+public class StringInfo extends ConstantInfo{
+	private final int type = ConstantInfo.STRING_INFO;
+	private int index;
+
+	public StringInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getType() {
+		return type;
+	}
+	public int getIndex() {
+		return index;
+	}
+	public void setIndex(int index) {
+		this.index = index;
+	}
+
+	public String toString(){
+		return this.getConstantPool().getUTF8String(index);
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..2c2253e622
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java
@@ -0,0 +1,33 @@
+package mini_jvm.constant;
+
+public class UTF8Info extends ConstantInfo{
+	private final int type = ConstantInfo.UTF8_INFO;
+
+	private int length ;
+	private String value;
+
+	public UTF8Info(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getLength() {
+		return length;
+	}
+	public void setLength(int length) {
+		this.length = length;
+	}
+	public String getValue() {
+		return value;
+	}
+	public void setValue(String value) {
+		this.value = value;
+	}
+	public int getType() {
+		return type;
+	}
+
+	@Override
+	public String toString() {
+		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java
new file mode 100644
index 0000000000..58c9d26dca
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java
@@ -0,0 +1,57 @@
+package mini_jvm.engine;
+
+
+import mini_jvm.method.Method;
+
+public class ExecutionResult {
+	public static final int RUN_NEXT_CMD = 1;
+	public static final int JUMP = 2;
+	public static final int EXIT_CURRENT_FRAME = 3;
+	public static final int PAUSE_AND_RUN_NEW_FRAME = 4;
+	
+	private int nextAction = RUN_NEXT_CMD; 
+	
+	private int nextCmdOffset = 0;
+	
+	private Method nextMethod;
+	
+	public Method getNextMethod() {
+		return nextMethod;
+	}
+	public void setNextMethod(Method nextMethod) {
+		this.nextMethod = nextMethod;
+	}
+
+	
+	
+	public void setNextAction(int action){
+		this.nextAction = action;
+	}
+	public boolean isPauseAndRunNewFrame(){
+		return this.nextAction == PAUSE_AND_RUN_NEW_FRAME;
+	}
+	public boolean isExitCurrentFrame(){
+		return this.nextAction == EXIT_CURRENT_FRAME;
+	}
+	
+	public boolean isRunNextCmd(){
+		return this.nextAction == RUN_NEXT_CMD;
+	}
+	
+	public boolean isJump(){
+		return this.nextAction == JUMP;
+	}
+	
+	public int getNextCmdOffset() {
+		return nextCmdOffset;
+	}
+
+	public void setNextCmdOffset(int nextCmdOffset) {
+		this.nextCmdOffset = nextCmdOffset;
+	}
+	
+	
+	
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java
new file mode 100644
index 0000000000..d7ef541eb8
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java
@@ -0,0 +1,77 @@
+package mini_jvm.engine;
+
+import mini_jvm.method.Method;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+public class ExecutorEngine {
+
+	private Stack<StackFrame> stack = new Stack<StackFrame>();
+	
+	public ExecutorEngine() {
+		
+	}
+	
+	public void execute(Method mainMethod){
+		
+		StackFrame mainFrame = StackFrame.create(mainMethod);
+		stack.push(mainFrame);
+		
+		while(!stack.empty()){
+			
+			StackFrame frame = stack.peek();			
+			
+			ExecutionResult result = frame.execute();
+			
+			if(result.isPauseAndRunNewFrame()){
+				
+				Method nextMethod = result.getNextMethod();
+				StackFrame nextFrame = StackFrame.create(nextMethod);
+				nextFrame.setCallerFrame(frame);				
+				setupFunctionCallParams(frame,nextFrame);
+				
+				stack.push(nextFrame);
+				
+			} else {
+				stack.pop();
+			}
+		}
+		
+	}
+	
+	
+	
+	private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) {
+		
+		Method nextMethod = nextFrame.getMethod();
+		
+		
+		List<String> paramList = nextMethod.getParameterList();
+		
+		//加上1 是因为要把this也传递过去
+		
+		int paramNum = paramList.size() + 1;
+		
+		
+		List<JavaObject> values = new ArrayList<JavaObject>();
+		
+		//数据结构知识：  从栈中取出栈顶的x个元素
+		while(paramNum>0){			
+			values.add(currentFrame.getOprandStack().pop());
+			paramNum --;
+		}
+		//数据结构知识：  把一个列表倒序排列
+		List<JavaObject> params = new ArrayList<JavaObject>();
+		
+		for(int i=values.size()-1; i>=0 ;i--){
+			params.add(values.get(i));
+		}
+		
+		
+		nextFrame.setLocalVariableTable(params);
+		
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java
new file mode 100644
index 0000000000..4a197b98f6
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java
@@ -0,0 +1,39 @@
+package mini_jvm.engine;
+
+public class Heap {
+	
+	/**
+	 * 没有实现垃圾回收， 所以对于下面新创建的对象， 并没有记录到一个数据结构当中
+	 */
+	
+	private static Heap instance = new Heap();
+	private Heap() {		
+	}
+	public static Heap getInstance(){
+		return instance;
+	}
+	public JavaObject newObject(String clzName){
+		
+		JavaObject jo = new JavaObject(JavaObject.OBJECT);
+		jo.setClassName(clzName);
+		return jo;
+	}
+	
+	public JavaObject newString(String value){
+		JavaObject jo = new JavaObject(JavaObject.STRING);
+		jo.setStringValue(value);
+		return jo;
+	}
+	
+	public JavaObject newFloat(float value){
+		JavaObject jo = new JavaObject(JavaObject.FLOAT);
+		jo.setFloatValue(value);
+		return jo;
+	}
+	public JavaObject newInt(int value){
+		JavaObject jo = new JavaObject(JavaObject.INT);
+		jo.setIntValue(value);
+		return jo;
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java
new file mode 100644
index 0000000000..51185b1056
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java
@@ -0,0 +1,71 @@
+package mini_jvm.engine;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class JavaObject {
+	public static final int OBJECT = 1;
+	public static final int STRING = 2;
+	public static final int INT = 3;
+	public static final int FLOAT = 4;
+	
+	int type;
+	private String className;
+	
+	private Map<String, JavaObject> fieldValues = new HashMap<String,JavaObject>();
+	
+	private String stringValue;
+	
+	private int intValue;
+	
+	private float floatValue;
+	
+	public void setFieldValue(String fieldName, JavaObject fieldValue){
+		fieldValues.put(fieldName, fieldValue);
+	}
+	public JavaObject(int type){
+		this.type = type;
+	}
+	public void setClassName(String className){
+		this.className = className;
+	}
+	public void setStringValue(String value){
+		stringValue = value;
+	}
+	public String getStringValue(){
+		return this.stringValue;
+	}
+	public void setIntValue(int value) {
+		this.intValue = value;		
+	}
+	public int getIntValue(){
+		return this.intValue;
+	}
+	public int getType(){
+		return type;
+	}
+	public JavaObject getFieldValue(String fieldName){
+		return this.fieldValues.get(fieldName);
+	}
+	public String toString(){
+		switch(this.getType()){
+		case INT: 
+			return String.valueOf(this.intValue);
+		case STRING:
+			return this.stringValue;
+		case OBJECT:
+			return this.className +":"+ this.fieldValues;
+		case FLOAT :
+			return String.valueOf(this.floatValue);
+		default:
+			return null;
+		}
+	}
+	public String getClassName(){
+		return this.className;
+	}
+	public void setFloatValue(float value) {
+		this.floatValue = value;		
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java
new file mode 100644
index 0000000000..29e7c5a380
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java
@@ -0,0 +1,90 @@
+package mini_jvm.engine;
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.constant.MethodRefInfo;
+import mini_jvm.loader.ClassFileLoader;
+import mini_jvm.method.Method;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class MethodArea {
+	
+	public static final MethodArea instance = new MethodArea();
+	
+	/**
+	 * 注意：我们做了极大的简化， ClassLoader 只有一个， 实际JVM中的ClassLoader,是一个双亲委托的模型
+	 */
+	
+	private ClassFileLoader clzLoader = null;
+	
+	Map<String,ClassFile> map = new HashMap<String,ClassFile>();
+	
+	private MethodArea(){		
+	}
+	
+	public static MethodArea getInstance(){
+		return instance;
+	}
+	
+	public void setClassFileLoader(ClassFileLoader clzLoader){
+		this.clzLoader = clzLoader;
+	}
+	
+	public Method getMainMethod(String className){
+		
+		ClassFile clzFile = this.findClassFile(className);
+		
+		return clzFile.getMainMethod();
+	}
+	
+	
+	public  ClassFile findClassFile(String className){
+		
+		if(map.get(className) != null){
+			return map.get(className);
+		}
+		// 看来该class 文件还没有load过
+		ClassFile clzFile = this.clzLoader.loadClass(className);
+		
+		map.put(className, clzFile);
+		
+		return clzFile;
+		
+	}
+	
+	
+	public Method getMethod(String className, String methodName, String paramAndReturnType){
+		
+		ClassFile clz = this.findClassFile(className);
+		
+		Method m = clz.getMethod(methodName, paramAndReturnType);
+		
+		if(m == null){
+			
+			throw new RuntimeException("method can't be found : \n" 
+					+ "class: " + className
+					+ "method: " + methodName
+					+ "paramAndReturnType: " + paramAndReturnType);
+		}
+		
+		return m;
+	}
+	
+	
+	public Method getMethod(MethodRefInfo methodRef){
+		
+		ClassFile clz = this.findClassFile(methodRef.getClassName());
+		
+		Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType());
+		
+		if(m == null){
+			throw new RuntimeException("method can't be found : " + methodRef.toString());
+		}
+		
+		return m;
+			
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java
new file mode 100644
index 0000000000..6781fed5ad
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java
@@ -0,0 +1,30 @@
+package mini_jvm.engine;
+
+import mini_jvm.loader.ClassFileLoader;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+
+
+public class MiniJVM {
+	
+	public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		for(int i=0;i<classPaths.length ; i++){
+			loader.addClassPath(classPaths[i]);
+		}
+		
+		MethodArea methodArea= MethodArea.getInstance();
+		
+		methodArea.setClassFileLoader(loader);
+		
+		ExecutorEngine engine = new ExecutorEngine();
+		
+		className = className.replace(".", "/");
+		
+		engine.execute(methodArea.getMainMethod(className));
+	}
+	
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java
new file mode 100644
index 0000000000..6bfd165f3b
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java
@@ -0,0 +1,26 @@
+package mini_jvm.engine;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class OperandStack {
+	private List<JavaObject> operands = new ArrayList<JavaObject>();
+	
+	public void push(JavaObject jo){
+		operands.add(jo);
+	}
+	public JavaObject pop(){
+		int index = size()-1;
+		JavaObject jo = (JavaObject)operands.get(index);
+		operands.remove(index);
+		return jo;
+		
+	}
+	public JavaObject top(){
+		int index = size()-1;
+		return (JavaObject)operands.get(index);
+	}
+	public int size(){
+		return operands.size();		
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java
new file mode 100644
index 0000000000..65b4bc119d
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java
@@ -0,0 +1,126 @@
+package mini_jvm.engine;
+
+import mini_jvm.cmd.ByteCodeCommand;
+import mini_jvm.method.Method;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+
+public class StackFrame {
+	
+	private List<JavaObject> localVariableTable = new ArrayList<JavaObject>();
+	private Stack<JavaObject> oprandStack = new Stack<JavaObject>();
+	
+	int index = 0;
+	
+	private Method m = null;
+	
+	private StackFrame callerFrame = null;
+	
+	public StackFrame getCallerFrame() {
+		return callerFrame;
+	}
+
+	public void setCallerFrame(StackFrame callerFrame) {
+		this.callerFrame = callerFrame;
+	}
+
+	public static  StackFrame create(Method m){
+		StackFrame frame = new StackFrame(m);
+		return frame;
+	}
+
+	
+	private StackFrame(Method m) {		
+		this.m = m;
+	}
+	
+	
+	
+	public JavaObject getLocalVariableValue(int index){
+		return this.localVariableTable.get(index);
+	}
+	
+	public Stack<JavaObject> getOprandStack(){
+		return this.oprandStack;
+	}
+	
+	public int getNextCommandIndex(int offset){
+		
+		ByteCodeCommand[] cmds = m.getCodeAttr().getCmds();
+		for(int i=0;i<cmds.length; i++){
+			if(cmds[i].getOffset() == offset){
+				return i;
+			}
+		}
+		throw new RuntimeException("Can't find next command");
+	}
+	
+	public ExecutionResult execute(){
+		
+				
+		ByteCodeCommand [] cmds = m.getCmds();
+		
+		while(index<cmds.length){
+			
+			ExecutionResult result = new ExecutionResult();	
+			//缺省值是执行下一条命令
+			result.setNextAction(ExecutionResult.RUN_NEXT_CMD);
+			
+			System.out.println(cmds[index].toString());
+			
+			cmds[index].execute(this,result);
+			
+			if(result.isRunNextCmd()){
+				index++;
+			}
+			else if(result.isExitCurrentFrame()){
+				return result;
+			}
+			else if(result.isPauseAndRunNewFrame()){
+				index++;
+				return result;
+			}					
+			else if(result.isJump()){
+				int offset = result.getNextCmdOffset();
+				this.index = getNextCommandIndex(offset);
+			} else{
+				index++;
+			}
+			
+		}
+		
+		//当前StackFrmae的指令全部执行完毕，可以退出了
+		ExecutionResult result = new ExecutionResult();
+		result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME);
+		return result;
+		
+	}
+
+	
+	
+	
+	public void setLocalVariableTable(List<JavaObject> values){
+		this.localVariableTable = values;	
+	}
+	
+	public void setLocalVariableValue(int index, JavaObject jo){
+		//问题： 为什么要这么做？？
+		if(this.localVariableTable.size()-1 < index){
+			for(int i=this.localVariableTable.size(); i<=index; i++){
+				this.localVariableTable.add(null);
+			}
+		}
+		this.localVariableTable.set(index, jo);
+		
+		
+	}
+	
+	public Method getMethod(){
+		return m;
+	}
+	
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java b/students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java
new file mode 100644
index 0000000000..1379bd3715
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java
@@ -0,0 +1,64 @@
+package mini_jvm.field;
+
+
+import mini_jvm.attr.AttributeInfo;
+import mini_jvm.attr.ConstantValue;
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.constant.UTF8Info;
+import mini_jvm.loader.ByteCodeIterator;
+
+public class Field {
+	private int accessFlag;
+	private int nameIndex;
+	private int descriptorIndex;
+
+	private ConstantPool pool;
+	private ConstantValue constValue;
+
+	public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) {
+
+		this.accessFlag = accessFlag;
+		this.nameIndex = nameIndex;
+		this.descriptorIndex = descriptorIndex;
+		this.pool = pool;
+	}
+
+	public String toString() {
+		String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue();
+
+		String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue();
+		return name +":"+ desc;
+	}
+
+
+	public static Field parse(ConstantPool pool,ByteCodeIterator iter){
+
+		int accessFlag = iter.nextU2ToInt();
+		int nameIndex = iter.nextU2ToInt();
+		int descIndex = iter.nextU2ToInt();
+		int attribCount = iter.nextU2ToInt();
+		//System.out.println("field attribute count:"+ attribCount);
+
+		Field f = new Field(accessFlag, nameIndex, descIndex,pool);
+
+		for( int i=1; i<= attribCount; i++){
+			int attrNameIndex = iter.nextU2ToInt();
+			String attrName = pool.getUTF8String(attrNameIndex);
+
+			if(AttributeInfo.CONST_VALUE.equals(attrName)){
+				int attrLen = iter.nextU4ToInt();
+				ConstantValue constValue = new ConstantValue(attrNameIndex, attrLen);
+				constValue.setConstValueIndex(iter.nextU2ToInt());
+				f.setConstantValue(constValue);
+			} else{
+				throw new RuntimeException("the attribute " + attrName + " has not been implemented yet.");
+			}
+		}
+
+		return f;
+	}
+	public void setConstantValue(ConstantValue constValue) {
+		this.constValue = constValue;
+	}
+
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..318c48cf5b
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,63 @@
+package mini_jvm.loader;
+
+import mini_jvm.util.Util;
+
+public class ByteCodeIterator {
+
+    private byte[] byteCodes;
+    private int currentIndex = -1;
+    private int byteSize = 0;
+
+    ByteCodeIterator(byte[] byteCodes){
+        this.byteCodes = byteCodes;
+        this.byteSize = byteCodes.length;
+    }
+
+    public boolean hasNext(){
+        return currentIndex < byteSize;
+    }
+
+
+    public int nextU1ToInt(){
+        return Util.byteToInt(new byte[]{byteCodes[++currentIndex]});
+    }
+
+    public int nextU2ToInt(){
+        return Util.byteToInt(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex]});
+    }
+
+    public int nextU4ToInt(){
+        return Util.byteToInt(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex],
+                byteCodes[++currentIndex],byteCodes[++currentIndex]});
+    }
+
+    public String nextU2ToHexString(){
+        return Util.byteToHexString(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex]});
+    }
+
+    public String nextU4ToHexString(){
+        return Util.byteToHexString(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex],
+                byteCodes[++currentIndex],byteCodes[++currentIndex]});
+    }
+
+    public String nextBytesLenAsString(int BytesLen) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < BytesLen; i++) {
+            char c = (char) byteCodes[++currentIndex];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    public String nextUxToHexString(int len) {
+        byte[] tmp = new byte[len];
+        for (int i = 0; i < len; i++) {
+            tmp[i] = byteCodes[++currentIndex];
+        }
+        return Util.byteToHexString(tmp).toLowerCase();
+    }
+
+    public void back(int n) {
+        this.currentIndex -= n;
+    }
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..974914032e
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java
@@ -0,0 +1,144 @@
+package mini_jvm.loader;
+
+import mini_jvm.clz.ClassFile;
+import org.apache.commons.io.IOUtils;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ClassFileLoader {
+
+	private List<String> clzPaths = new ArrayList<String>();
+
+	public ClassFile loadClass(String className){
+		byte[] byteCodes = readBinaryCode(className);
+		ClassFileParser classFileParser = new ClassFileParser();
+		ClassFile clzFile = classFileParser.parse(byteCodes);
+		return clzFile;
+	}
+
+
+	/**
+	 * 读取class文件的二进制代码
+	 * @param className
+	 * @return
+     */
+	public byte[] readBinaryCodeV1(String className) {
+		String clazzPath = getClassPath(className);
+		BufferedInputStream bins = null;
+		ByteArrayOutputStream  bouts = new ByteArrayOutputStream();
+		try {
+			bins = new BufferedInputStream(new FileInputStream(new File(clazzPath)));
+			byte[] buffer = new byte[1024];
+			int length = -1;
+			while((length = bins.read(buffer)) != -1){
+				bouts.write(buffer, 0, length);
+			}
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		byte[] codes = bouts.toByteArray();
+		//关闭流
+		try {
+			if(bins != null){
+				//调用外层流的close方法就关闭其装饰的内层流
+				bins.close();
+			}
+			if(bouts != null){
+				bouts.close();
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return codes;
+	}
+
+	/**
+	 * 使用IOUtils.toByteArray()读取流文件
+	 */
+	public byte[] readBinaryCode(String className){
+		String clzPath = getClassPath(className);
+		File f = new File(clzPath);
+		try{
+			return IOUtils.toByteArray(new FileInputStream(f));
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+			return null;
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+
+	/**
+	 * 从扫描根目录，获取指定类的绝对路径
+	 * @param className
+	 * @return
+	 */
+	private String getClassPath(String className){
+		String clazzPath = null;
+		//遍历clzPaths中所有路径
+		for (String path : this.clzPaths){
+			File file = new File(path);
+			clazzPath = getClassPath(className,file);
+			if(clazzPath!=null) break;
+		}
+		return clazzPath;
+	}
+
+	private String getClassPath(String className, File file){
+		String clazzPath = null;
+		if(file.exists()){
+			//如果是目录，则遍历所有目录下的文件
+			if(file.isDirectory()){
+				File[] fs = file.listFiles();
+				for (File f : fs){
+					clazzPath = getClassPath(className,f);
+				}
+			}else {
+				//检查是否是该类对应的class文件
+				if(isClazzFile(file.getName(),className)){
+					clazzPath = file.getAbsolutePath();
+				}
+			}
+		}
+		return clazzPath;
+	}
+
+	private boolean isClazzFile(String filename , String className){
+		String fileClazzName = null;
+		String [] names = filename.split("\\.");
+		if(names.length > 0){
+			fileClazzName = names[0];
+		}
+		return className.endsWith(fileClazzName);
+	}
+	
+	public void addClassPath(String path) {
+		clzPaths.add(path);
+	}
+
+	public String getClassPath(){
+		StringBuilder sb = new StringBuilder();
+		int i = 0;
+		for (; i < clzPaths.size() - 1; i++) {
+			sb.append(clzPaths.get(i));
+			sb.append(";");
+		}
+		sb.append(clzPaths.get(i));
+		return sb.toString();
+	}
+
+	public static void main(String[] args) {
+		String FULL_QUALIFIED_CLASS_NAME = "mini_jvm/test/EmployeeV1";
+		String path1 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\test-classes\\mini_jvm";
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "mini_jvm.test.EmployeeV1";
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..6ea12db446
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java
@@ -0,0 +1,159 @@
+package mini_jvm.loader;
+
+
+import mini_jvm.clz.AccessFlag;
+import mini_jvm.clz.ClassFile;
+import mini_jvm.clz.ClassIndex;
+import mini_jvm.constant.*;
+import mini_jvm.field.Field;
+import mini_jvm.method.Method;
+
+public class ClassFileParser {
+
+	public ClassFile parse(byte[] byteCodes) {
+		ByteCodeIterator iterator = new ByteCodeIterator(byteCodes);
+		ClassFile clzFile = new ClassFile();
+
+		//magic number
+		String magicNumber = iterator.nextU4ToHexString();
+		if (!"cafebabe".equals(magicNumber)) {
+			throw new RuntimeException("not java .class file!");
+		}
+		int minorVersion = iterator.nextU2ToInt();		//次版本号
+		int majorVersion = iterator.nextU2ToInt();		//主版本号
+		clzFile.setMajorVersion(majorVersion);
+		clzFile.setMinorVersion(minorVersion);
+
+		ConstantPool constantPool = parseConstantPool(iterator); //常量池
+		clzFile.setConstPool(constantPool);
+
+		AccessFlag accessFlag = parseAccessFlag(iterator);		 //解析访问标识
+		clzFile.setAccessFlag(accessFlag);
+
+		ClassIndex clzIndex = parseClassIndex(iterator);		 //解析类索引
+		clzFile.setClassIndex(clzIndex);
+
+		//解析接口，此处暂不支持
+		parseInterfaces(iterator);
+
+		//解析字段
+		parseField(clzFile,iterator);
+
+		//解析方法
+		parseMethod(clzFile,iterator);
+
+		return clzFile;
+	}
+
+	private void parseMethod(ClassFile clzFile, ByteCodeIterator iterator) {
+		//方法个数
+		int methodCount = iterator.nextU2ToInt();
+		for (int i = 0; i < methodCount; i++) {
+			Method m = Method.parse(clzFile,iterator);
+			clzFile.addMethod(m);
+		}
+	}
+
+	//解析字段
+	private void parseField(ClassFile clzFile, ByteCodeIterator iterator) {
+		//字段个数
+		int fieldsCount = iterator.nextU2ToInt();
+		for (int i = 0; i < fieldsCount; i++) {
+			Field f = Field.parse(clzFile.getConstantPool(),iterator);
+			clzFile.addField(f);
+		}
+	}
+
+
+	private AccessFlag parseAccessFlag(ByteCodeIterator iterator) {
+		int accessValue = iterator.nextU2ToInt();
+		AccessFlag accessFlag = new AccessFlag(accessValue);
+
+		return accessFlag;
+	}
+
+	private ClassIndex parseClassIndex(ByteCodeIterator iterator) {
+		ClassIndex clzIndex = new ClassIndex();
+
+		int thisClzIndex = iterator.nextU2ToInt();
+		int superClzIndex = iterator.nextU2ToInt();
+		clzIndex.setThisClassIndex(thisClzIndex);
+		clzIndex.setSuperClassIndex(superClzIndex);
+
+		return clzIndex;
+	}
+
+	private ConstantPool parseConstantPool(ByteCodeIterator iterator) {
+		//常量池
+		ConstantPool constantPool = new ConstantPool();
+		//常量池成员数
+		int constantPoolLength = iterator.nextU2ToInt();
+		//第0位补上一个占位符
+		NullConstantInfo nullConstantInfo = new NullConstantInfo();
+		constantPool.addConstantInfo(nullConstantInfo);
+		for (int i = 1; i < constantPoolLength; i++) {
+			int tag = iterator.nextU1ToInt();
+			// tag = 1, UTF8_INFO
+			if (tag == 1) {
+				UTF8Info utf8Info = new UTF8Info(constantPool);
+				int length = iterator.nextU2ToInt();
+				String value = iterator.nextBytesLenAsString(length);
+				utf8Info.setLength(length);
+				utf8Info.setValue(value);
+				constantPool.addConstantInfo(utf8Info);
+			}
+			// tag = 7, CLASS_INFO
+			else if (tag == 7) {
+				ClassInfo classInfo = new ClassInfo(constantPool);
+				int nameIndex = iterator.nextU2ToInt();
+				classInfo.setUtf8Index(nameIndex);
+				constantPool.addConstantInfo(classInfo);
+			}
+			// tag = 8, STRING_INFO
+			else if (tag == 8) {
+				StringInfo stringInfo = new StringInfo(constantPool);
+				int stringIndex = iterator.nextU2ToInt();
+				stringInfo.setIndex(stringIndex);
+				constantPool.addConstantInfo(stringInfo);
+			}
+			// tag = 9, Fieldref
+			else if (tag == 9) {
+				FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool);
+				int classInfoIndex = iterator.nextU2ToInt();
+				int nameAndTypeIndex = iterator.nextU2ToInt();
+				fieldRefInfo.setClassInfoIndex(classInfoIndex);
+				fieldRefInfo.setNameAndTypeIndex(nameAndTypeIndex);
+				constantPool.addConstantInfo(fieldRefInfo);
+			}
+			// tag = 10, MethodRef
+			else if (tag == 10) {
+				MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool);
+				int classInfoIndex = iterator.nextU2ToInt();
+				int nameAndTypeIndex = iterator.nextU2ToInt();
+				methodRefInfo.setClassInfoIndex(classInfoIndex);
+				methodRefInfo.setNameAndTypeIndex(nameAndTypeIndex);
+				constantPool.addConstantInfo(methodRefInfo);
+			}
+			// tag = 12, NameAndType
+			else if (tag == 12) {
+				NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool);
+				int nameAndTypeIndex = iterator.nextU2ToInt();
+				int descriptorIndex = iterator.nextU2ToInt();
+				nameAndTypeInfo.setIndex1(nameAndTypeIndex);
+				nameAndTypeInfo.setIndex2(descriptorIndex);
+				constantPool.addConstantInfo(nameAndTypeInfo);
+			} else {
+				throw new RuntimeException("not realized tag " + tag);
+			}
+		}
+
+		return constantPool;
+	}
+
+	private void parseInterfaces(ByteCodeIterator iterator) {
+		int interfaceCount = iterator.nextU2ToInt();
+		// TODO : 如果实现了interface, 这里需要解析
+		System.out.println("interfaceCount:" + interfaceCount);
+	}
+}
+
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java b/students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java
new file mode 100644
index 0000000000..6c026d3eb1
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java
@@ -0,0 +1,151 @@
+package mini_jvm.method;
+
+
+import mini_jvm.attr.AttributeInfo;
+import mini_jvm.attr.CodeAttr;
+import mini_jvm.clz.ClassFile;
+import mini_jvm.cmd.ByteCodeCommand;
+import mini_jvm.constant.ConstantPool;
+import mini_jvm.constant.UTF8Info;
+import mini_jvm.loader.ByteCodeIterator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Method {
+	
+	private int accessFlag;
+	private int nameIndex;
+	private int descriptorIndex;
+	
+	private CodeAttr codeAttr;
+	private ClassFile clzFile;
+	
+	
+	public ClassFile getClzFile() {
+		return clzFile;
+	}
+
+	public int getNameIndex() {
+		return nameIndex;
+	}
+	public int getDescriptorIndex() {
+		return descriptorIndex;
+	}
+	
+	public CodeAttr getCodeAttr() {
+		return codeAttr;
+	}
+
+	public void setCodeAttr(CodeAttr code) {
+		this.codeAttr = code;
+	}
+
+	public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) {
+		this.clzFile = clzFile;
+		this.accessFlag = accessFlag;
+		this.nameIndex = nameIndex;
+		this.descriptorIndex = descriptorIndex;
+	}
+
+	public static Method parse(ClassFile clzFile, ByteCodeIterator iterator){
+		int accessFlag = iterator.nextU2ToInt();
+		int nameIndex = iterator.nextU2ToInt();
+		int descIndex = iterator.nextU2ToInt();
+		int attrCount = iterator.nextU2ToInt();
+
+		Method m = new Method(clzFile,accessFlag,nameIndex,descIndex);
+
+		for (int i = 0; i < attrCount; i++) {
+			int attrNameIndex = iterator.nextU2ToInt();
+			String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex);
+			iterator.back(2);
+
+			if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){
+				CodeAttr codeAttr = CodeAttr.parse(clzFile,iterator);
+				m.setCodeAttr(codeAttr);
+			}else {
+				throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName);
+			}
+		}
+		return m;
+	}
+
+
+	public String toString() {
+
+		ConstantPool pool = this.clzFile.getConstantPool();
+		StringBuilder buffer = new StringBuilder();
+		String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue();
+		String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue();
+		buffer.append(name).append(":").append(desc).append("\n");
+		buffer.append(this.codeAttr.toString(pool));
+		return buffer.toString();
+	}
+
+
+	public ByteCodeCommand[] getCmds() {
+		return this.getCodeAttr().getCmds();
+	}
+
+
+	private String getParamAndReturnType(){
+		UTF8Info  nameAndTypeInfo = (UTF8Info)this.getClzFile()
+				.getConstantPool().getConstantInfo(this.getDescriptorIndex());
+		return nameAndTypeInfo.getValue();
+	}
+
+	public List<String> getParameterList(){
+
+		// e.g. (Ljava/util/List;Ljava/lang/String;II)V
+		String paramAndType = getParamAndReturnType();
+
+		int first = paramAndType.indexOf("(");
+		int last = paramAndType.lastIndexOf(")");
+		// e.g. Ljava/util/List;Ljava/lang/String;II
+		String param = paramAndType.substring(first+1, last);
+
+		List<String> paramList = new ArrayList<String>();
+
+		if((null == param) || "".equals(param)){
+			return paramList;
+		}
+
+		while(!param.equals("")){
+
+			int pos = 0;
+			// 这是一个对象类型
+			if(param.charAt(pos) == 'L'){
+
+				int end = param.indexOf(";");
+
+				if(end == -1){
+					throw new RuntimeException("can't find the ; for a object type");
+				}
+				paramList.add(param.substring(pos+1,end));
+
+				pos = end + 1;
+
+			}
+			else if(param.charAt(pos) == 'I'){
+				// int
+				paramList.add("I");
+				pos ++;
+
+			}
+			else if(param.charAt(pos) == 'F'){
+				// float
+				paramList.add("F");
+				pos ++;
+
+			} else{
+				throw new RuntimeException("the param has unsupported type:" + param);
+			}
+
+			param = param.substring(pos);
+
+		}
+		return paramList;
+
+	}
+}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java b/students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java
new file mode 100644
index 0000000000..49f6bc0e39
--- /dev/null
+++ b/students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java
@@ -0,0 +1,22 @@
+package mini_jvm.util;
+
+public class Util {
+	public static int byteToInt(byte[] codes){
+    	String s1 = byteToHexString(codes);
+    	return Integer.valueOf(s1, 16).intValue();
+    }
+
+	public static String byteToHexString(byte[] codes){
+		StringBuffer buffer = new StringBuffer();
+		for(int i=0;i<codes.length;i++){
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if(strHex.length()< 2){
+				strHex = "0" + strHex;
+			}		
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}
+}
diff --git a/students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java b/students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java
new file mode 100644
index 0000000000..2bfd7f52e1
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java
@@ -0,0 +1,67 @@
+package code01;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Created by yaoyuan on 2017/3/8.
+ */
+public class ArrayListTest {
+    ArrayList arrayList;
+    @Before
+    public void setUp(){
+        arrayList = new ArrayList();
+    }
+
+    @Test
+    public void testAdd() throws Exception {
+
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            arrayList.add(str);
+        }
+
+        // size()
+        Assert.assertEquals(array.length,arrayList.size());
+
+        //add(),get()
+        for (int i = 0; i < arrayList.size(); i++){
+            Assert.assertEquals(array[i],arrayList.get(i));
+        }
+    }
+
+    @Test
+    public void testAddWithIndex() throws Exception {
+        ArrayList arrayList2 = new ArrayList(3);//自动扩容
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (int i = 0; i < array.length; i++){
+            arrayList2.add(i,array[i]);
+        }
+        //add(),get()
+        for (int i = 0; i < arrayList2.size(); i++){
+            Assert.assertEquals(array[i],arrayList2.get(i));
+        }
+        arrayList2.add(3,"new");
+        Assert.assertEquals("new",arrayList2.get(3));
+
+
+    }
+
+    @Test
+    public void testRemove() throws Exception {
+
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            arrayList.add(str);
+        }
+        arrayList.remove(0);
+        arrayList.remove(0);
+
+
+        for (int i = 0; i < arrayList.size(); i++) {
+            Assert.assertEquals(array[i+2],arrayList.get(i));
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java b/students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java
new file mode 100644
index 0000000000..8c1f4e8e09
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java
@@ -0,0 +1,27 @@
+package code01;
+
+import org.junit.Test;
+
+/**
+ * Created by yaoyuan on 2017/3/10.
+ */
+public class BinaryTreeTest {
+
+    @Test
+    public void testCreateBinaryTree(){
+
+        BinaryTree<Integer> binaryTree1 = new BinaryTree<Integer>();
+        BinaryTree<Integer> binaryTree2 = new BinaryTree<Integer>();
+        Integer[] array1 = new Integer[]{3,4,1,2,5};
+        Integer[] array2 = new Integer[]{3,1,4,5,2};
+        binaryTree1.createBinaryTree(array1);
+        binaryTree2.createBinaryTree(array2);
+        binaryTree1.leftOrderScan(binaryTree1.getRoot());
+        binaryTree2.leftOrderScan(binaryTree2.getRoot());
+    }
+
+    @Test
+    public void testInsert(){
+        BinaryTree<Integer> binaryTree3 = new BinaryTree<Integer>();
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java b/students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java
new file mode 100644
index 0000000000..5481783932
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java
@@ -0,0 +1,174 @@
+package code01;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by yaoyuan on 2017/3/8.
+ */
+public class LinkedListTest {
+
+    @Test
+    public void testAdd() throws Exception {
+
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+
+        // size()
+        Assert.assertEquals(array.length,linklist.size());
+
+        //add(),get()
+        for (int i = 0; i < linklist.size(); i++){
+            Assert.assertEquals(array[i],linklist.get(i));
+        }
+
+    }
+
+    @Test
+    public void testAddWithIndex() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+
+        //add(),get()
+        for (int i = 0; i < linklist.size(); i++){
+            Assert.assertEquals(array[i],linklist.get(i));
+        }
+
+        String str = "new";
+        linklist.add(0,str);
+        Assert.assertEquals(str,linklist.get(0));
+
+        linklist.add(3,str);
+        Assert.assertEquals(str,linklist.get(3));
+
+        linklist.add(linklist.size() ,str);
+        Assert.assertEquals(str,linklist.get(linklist.size()-1));
+    }
+
+    @Test
+    public void testRemove() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+
+        //remove(),get()
+        Assert.assertEquals(linklist.remove(0),array[0]);
+        Assert.assertEquals(linklist.size(),array.length - 1);
+
+        Assert.assertEquals(linklist.remove(linklist.size() - 1),array[array.length-1]);
+        Assert.assertEquals(linklist.size(),array.length - 2);
+
+    }
+
+    @Test
+    public void testAddFirst() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        //addFirst(),get()
+        String str = "new";
+        linklist.addFirst(str);
+        Assert.assertEquals(str,linklist.get(0));
+        Assert.assertEquals(linklist.size(),array.length + 1);
+    }
+
+    @Test
+    public void testAddLast() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        //addLast(),get()
+        String str = "new";
+        linklist.addLast(str);
+        Assert.assertEquals(str,linklist.get(linklist.size()-1));
+        Assert.assertEquals(linklist.size(),array.length + 1);
+    }
+
+    @Test
+    public void testRemoveFirst() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        //removeFirst(),get()
+        Assert.assertEquals(linklist.removeFirst(),array[0]);
+        Assert.assertEquals(linklist.size(),array.length - 1);
+    }
+
+    @Test
+    public void testRemoveLast() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        //removeLast(),get()
+        Assert.assertEquals(linklist.removeLast(),array[array.length-1]);
+        Assert.assertEquals(linklist.size(),array.length - 1);
+
+    }
+
+    @Test
+    public void testReverse(){
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        linklist.reverse();
+        for(int i=0; i<array.length; i++){
+            Assert.assertEquals(array[array.length - i-1], linklist.get(i));
+        }
+    }
+
+    @Test
+    public void testremoveFirstHalf(){
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        linklist.removeFirstHalf();
+        for(int i=0; i<array.length/2; i++){
+            Assert.assertEquals(array[i+array.length/2], linklist.get(i));
+        }
+    }
+
+    @Test
+    public void testRemoveDuplicateValues() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","b","b","d","d","d"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        linklist.printList();
+        linklist.removeDuplicateValues();
+        linklist.printList();
+
+    }
+
+    @Test
+    public void testRemove1() throws Exception {
+        LinkedList linklist = new LinkedList();
+        String[] array = new String[]{"a","b","c","d","e","f","g"};
+        for (String str : array){
+            linklist.add(str);
+        }
+        linklist.printList();
+        linklist.remove(0,4);
+        linklist.printList();
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/QueueTest.java b/students/769232552/season_one/test/java/season_1/code01/QueueTest.java
new file mode 100644
index 0000000000..1390e3d3be
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code01/QueueTest.java
@@ -0,0 +1,24 @@
+package code01;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Created by yaoyuan on 2017/3/8.
+ */
+public class QueueTest {
+
+    @Test
+    public void testQueue() throws Exception {
+        Queue queue = new Queue();
+        String[] array = new String[]{"a","b","c"};
+        for (String str : array){
+            queue.enQueue(str);
+        }
+        int i = 0;
+        while (!queue.isEmpty()){
+            Assert.assertEquals(array[i],queue.deQueue());
+            i ++;
+        }
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/StackTest.java b/students/769232552/season_one/test/java/season_1/code01/StackTest.java
new file mode 100644
index 0000000000..e4c9878d50
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code01/StackTest.java
@@ -0,0 +1,27 @@
+package code01;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+
+/**
+ * Created by yaoyuan on 2017/3/8.
+ */
+public class StackTest {
+
+    @Test
+    public void testStack() throws Exception {
+        Stack stack = new Stack();
+        String[] array = new String[]{"a","b","c"};
+        for (String str : array){
+            stack.push(str);
+        }
+        int i = 2;
+        while (!stack.isEmpty()){
+            Assert.assertEquals(array[i],stack.peek());
+            Assert.assertEquals(array[i],stack.pop());
+            i --;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java b/students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java
new file mode 100644
index 0000000000..1277e3dab6
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java
@@ -0,0 +1,73 @@
+package code02;
+
+import org.junit.Test;
+
+/**
+ * Created by yaoyuan on 2017/3/13.
+ */
+public class ArrayUtilTest {
+
+    @Test
+    public void testReverseArray() throws Exception {
+        int[] arr1 = new int[]{1,2,3,4,5,6,7};
+        ArrayUtil arrayUtil = new ArrayUtil();
+        arrayUtil.reverseArray(arr1);
+        arrayUtil.printArr(arr1);
+
+
+    }
+
+    @Test
+    public void testRemoveZero() throws Exception {
+        int[] arr1 = new int[]{1,0,2,3,0,0,4,5,6,0};
+        ArrayUtil arrayUtil = new ArrayUtil();
+        int[] arr2 = arrayUtil.removeZero(arr1);
+        arrayUtil.printArr(arr2);
+    }
+
+    @Test
+    public void testMerge() throws Exception {
+        int[] arr1 = new int[]{3, 5, 7, 8};
+        int[] arr2 = new int[]{4, 5, 6, 7};
+        ArrayUtil arrayUtil = new ArrayUtil();
+        int[] arr3 = arrayUtil.merge(arr1,arr2);
+        arrayUtil.printArr(arr3);
+    }
+
+    @Test
+    public void testGrow() throws Exception {
+        int[] arr1 = new int[]{1,2,3,4,5,6,7};
+        ArrayUtil arrayUtil = new ArrayUtil();
+        int[] arr2 = arrayUtil.grow(arr1,3);
+        arrayUtil.printArr(arr2);
+    }
+
+    @Test
+    public void testFibonacci() throws Exception {
+        ArrayUtil arrayUtil = new ArrayUtil();
+        int[] arr1 = arrayUtil.fibonacci(4);
+        arrayUtil.printArr(arr1);
+
+        int[] arr2 = arrayUtil.fibonacci(20);
+        arrayUtil.printArr(arr2);
+    }
+
+    @Test
+    public void testGetPrimes() throws Exception {
+        ArrayUtil arrayUtil = new ArrayUtil();
+        arrayUtil.printArr(arrayUtil.getPrimes(30));
+    }
+
+    @Test
+    public void testGetPerfectNumbers() throws Exception {
+        ArrayUtil arrayUtil = new ArrayUtil();
+        arrayUtil.printArr(arrayUtil.getPerfectNumbers(1000));
+    }
+
+    @Test
+    public void testJoin() throws Exception {
+        int[] arr1 = new int[]{1,2,3,4,5,6,7};
+        ArrayUtil arrayUtil = new ArrayUtil();
+        System.out.println(arrayUtil.join(arr1,"-"));
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java b/students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..9213702251
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java
@@ -0,0 +1,43 @@
+package code02.litestruts;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+		
+		String actionName = "login";
+        
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","1234");
+        
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+        Assert.assertEquals("login successful", view.getParameters().get("Message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String,String> params = new HashMap<String,String>();
+        params.put("name","test");
+        params.put("password","123456"); //密码和预设的不一致
+        
+        View view  = Struts.runAction(actionName,params);        
+        
+        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("Message"));
+	}
+}
diff --git a/students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java b/students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java
new file mode 100644
index 0000000000..64d2d93c99
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java
@@ -0,0 +1,60 @@
+package code03;
+
+import code03.v1.FileDownloader;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import code03.v1.api.ConnectionManager;
+import code03.v1.api.DownloadListener;
+import code03.v1.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		
+		String url = "http://litten.me/assets/blogImg/litten.png";
+
+		FileDownloader downloader = new FileDownloader(url);
+
+	
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+		
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		
+		downloader.execute();
+		
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				//休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {				
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+		
+		
+
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java b/students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java
new file mode 100644
index 0000000000..7448e3ee56
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java
@@ -0,0 +1,38 @@
+package code04;
+
+import  org.junit.Assert;
+
+import org.junit.Test;
+
+
+public class LRUPageFrameTest {
+
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+        //1，0，7
+		Assert.assertEquals("1,0,7", frame.toString());
+        frame.access(2);
+        //2，1，0
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		//0，2，1
+        Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+        //0，2，1
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+        //3，0，2
+        Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+        //0，3，2
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		//4，0，3
+        Assert.assertEquals("4,0,3", frame.toString());
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java b/students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java
new file mode 100644
index 0000000000..e745e60fbc
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java
@@ -0,0 +1,79 @@
+package code05;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+/**
+ * Created by yaoyuan on 2017/4/6.
+ */
+public class StackUtilTest {
+
+    @Before
+    public void setUp() throws Exception {
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testAddToBottom() {
+        Stack s = new Stack();
+        s.push(1);
+        s.push(2);
+        s.push(3);
+
+        StackUtil.addToBottom(s, 0);
+        Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+
+    }
+
+    @Test
+    public void testReverse() {
+        Stack s = new Stack();
+        s.push(1);
+        s.push(2);
+        s.push(3);
+        s.push(4);
+        s.push(5);
+        Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+        StackUtil.reverse(s);
+        Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+    }
+
+    @Test
+    public void testRemove() {
+        Stack s = new Stack();
+        s.push(1);
+        s.push(2);
+        s.push(3);
+        StackUtil.remove(s, 2);
+        Assert.assertEquals("[1, 3]", s.toString());
+    }
+
+    @Test
+    public void testGetTop() throws Exception {
+        Stack s = new Stack();
+        s.push(1);
+        s.push(2);
+        s.push(3);
+        s.push(4);
+        s.push(5);
+        {
+            Object[] values = StackUtil.getTop(s, 3);
+            Assert.assertEquals(5, values[0]);
+            Assert.assertEquals(4, values[1]);
+            Assert.assertEquals(3, values[2]);
+        }
+    }
+
+    @Test
+    public void testIsValidPairs() {
+        Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+        Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java b/students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java
new file mode 100644
index 0000000000..af0ea63370
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java
@@ -0,0 +1,49 @@
+package code06;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			expr.evaluate();
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+		
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java b/students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java
new file mode 100644
index 0000000000..ace42b0db2
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java
@@ -0,0 +1,42 @@
+package code07;
+
+
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class PostfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
+			Assert.assertEquals(288, expr.evaluate(),0.0f);
+		}
+
+		{
+			//9+(3-1)*3+10/2
+			PostfixExpr expr = new PostfixExpr("9 3 1 - 3 * + 10 2 / +");
+			Assert.assertEquals(20, expr.evaluate(),0.0f);
+		}
+		
+		{
+			//10-2*3+50
+			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
+			Assert.assertEquals(54, expr.evaluate(),0.0f);
+		}
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java b/students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java
new file mode 100644
index 0000000000..6626b3ba01
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java
@@ -0,0 +1,45 @@
+package code07;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class PrefixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		{
+			// 2*3+4*5 
+			PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5");
+			Assert.assertEquals(26, expr.evaluate(),0.001f);
+		}
+		{
+			// 4*2 + 6+9*2/3 -8
+			PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8");
+			Assert.assertEquals(12, expr.evaluate(),0.001f);
+		}
+		{
+			//(3+4)*5-6
+			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
+			Assert.assertEquals(29, expr.evaluate(),0.001f);
+		}
+		{
+			//1+((2+3)*4)-5
+			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
+			Assert.assertEquals(16, expr.evaluate(),0.001f);
+		}
+		
+		
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/code08/JosephusTest.java b/students/769232552/season_one/test/java/season_1/code08/JosephusTest.java
new file mode 100644
index 0000000000..2212b059c1
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code08/JosephusTest.java
@@ -0,0 +1,32 @@
+package code08;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+
+public class JosephusTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testExecute() {
+		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
+	}
+
+	@Test
+	public void testExecute2() {
+
+		Assert.assertEquals("[2, 5, 1, 6, 4, 0, 3]", Josephus.execute(7, 3).toString());
+
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java b/students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java
new file mode 100644
index 0000000000..8eac5ec714
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java
@@ -0,0 +1,34 @@
+package code09;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by yyglider on 2017/5/4.
+ */
+public class QuickMinStackTest {
+    QuickMinStack stack = new QuickMinStack();
+
+    @Before
+    public void before(){
+        stack.push(3);
+        stack.push(4);
+        stack.push(2);
+        stack.push(1);
+    }
+
+    @Test
+    public void findMin() throws Exception {
+        Assert.assertEquals(1,stack.findMin());
+        stack.pop();
+        Assert.assertEquals(2,stack.findMin());
+        stack.pop();
+        Assert.assertEquals(3,stack.findMin());
+        stack.push(0);
+        Assert.assertEquals(0,stack.findMin());
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java b/students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java
new file mode 100644
index 0000000000..a01b6a5a07
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java
@@ -0,0 +1,27 @@
+package code09;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by yyglider on 2017/5/4.
+ */
+public class StackWithTwoQueuesTest {
+    @Test
+    public void pop() throws Exception {
+        StackWithTwoQueues stack = new StackWithTwoQueues();
+        stack.push(1);
+        stack.push(2);
+        stack.push(3);
+        stack.push(4);
+
+        Assert.assertEquals(4,stack.pop());
+        Assert.assertEquals(3,stack.pop());
+        Assert.assertEquals(2,stack.pop());
+        Assert.assertEquals(1,stack.pop());
+
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java b/students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java
new file mode 100644
index 0000000000..827ff1794b
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java
@@ -0,0 +1,79 @@
+package code10;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by yyglider on 2017/5/9.
+ */
+public class BinaryTreeUtilTest {
+
+    BinaryTreeNode<Integer> root = null;
+    @Before
+    public void setUp() throws Exception {
+        root = new BinaryTreeNode<Integer>(1);
+        root.setLeft(new BinaryTreeNode<Integer>(2));
+        root.setRight(new BinaryTreeNode<Integer>(5));
+        root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
+        root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testPreOrderVisit() {
+
+        List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
+        Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
+
+
+    }
+    @Test
+    public void testInOrderVisit() {
+
+
+        List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
+        Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());
+
+    }
+
+    @Test
+    public void testPostOrderVisit() {
+
+
+        List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
+        Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());
+
+    }
+
+
+    @Test
+    public void testInOrderVisitWithoutRecursion() {
+        BinaryTreeNode<Integer> node = root.getLeft().getRight();
+        node.setLeft(new BinaryTreeNode<Integer>(6));
+        node.setRight(new BinaryTreeNode<Integer>(7));
+
+        List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
+        Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());
+
+    }
+    @Test
+    public void testPreOrderVisitWithoutRecursion() {
+        BinaryTreeNode<Integer> node = root.getLeft().getRight();
+        node.setLeft(new BinaryTreeNode<Integer>(6));
+        node.setRight(new BinaryTreeNode<Integer>(7));
+
+        List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
+        Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());
+
+    }
+
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java b/students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java
new file mode 100644
index 0000000000..e2f3d6a05d
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java
@@ -0,0 +1,93 @@
+package code11;
+
+import static org.junit.Assert.fail;
+
+import code10.BinaryTreeNode;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+
+public class BinarySearchTreeTest {
+
+    BinarySearchTree<Integer> tree = null;
+
+    @Before
+    public void setUp() throws Exception {
+        BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
+        root.left = new BinaryTreeNode<Integer>(2);
+        root.right = new BinaryTreeNode<Integer>(8);
+        root.left.left = new BinaryTreeNode<Integer>(1);
+        root.left.right = new BinaryTreeNode<Integer>(4);
+        root.left.right.left = new BinaryTreeNode<Integer>(3);
+        tree = new BinarySearchTree<Integer>(root);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tree = null;
+    }
+
+    @Test
+    public void testFindMin() {
+        Assert.assertEquals(1, tree.findMin().intValue());
+
+    }
+
+    @Test
+    public void testFindMax() {
+        Assert.assertEquals(8, tree.findMax().intValue());
+    }
+
+    @Test
+    public void testHeight() {
+        Assert.assertEquals(4, tree.height());
+    }
+
+    @Test
+    public void testSize() {
+        Assert.assertEquals(6, tree.size());
+    }
+
+    @Test
+    public void testRemoveLeaf() {
+        tree.remove(3);
+        BinaryTreeNode<Integer> root= tree.getRoot();
+        Assert.assertEquals(4, root.left.right.data.intValue());
+
+    }
+
+    @Test
+    public void testRemoveMiddleNode() {
+        tree.remove(2);
+        BinaryTreeNode<Integer> root= tree.getRoot();
+        Assert.assertEquals(3, root.left.data.intValue());
+        Assert.assertEquals(4, root.left.right.data.intValue());
+    }
+
+    @Test
+    public void testLevelVisit(){
+        Assert.assertEquals(Arrays.asList(6, 2, 8, 1, 4, 3), tree.levelVisit());
+    }
+
+    @Test
+    public void testGetLowestCommonAncestor(){
+        Assert.assertEquals(new Integer(6),tree.getLowestCommonAncestor(2,8));
+        Assert.assertEquals(new Integer(2),tree.getLowestCommonAncestor(1,4));
+    }
+
+    @Test
+    public void testGetNodesBetween(){
+        Assert.assertEquals(Arrays.asList(1,2,4), tree.getNodesBetween(1,4));
+    }
+
+    @Test
+    public void testIsValid(){
+        Assert.assertTrue(tree.isValid());
+        tree.root.left = new BinaryTreeNode<Integer>(12);
+        Assert.assertFalse(tree.isValid());
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java b/students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java
new file mode 100644
index 0000000000..dca7123987
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java
@@ -0,0 +1,335 @@
+package mini_jvm;
+
+import mini_jvm.clz.ClassFile;
+import mini_jvm.clz.ClassIndex;
+import mini_jvm.cmd.BiPushCmd;
+import mini_jvm.cmd.ByteCodeCommand;
+import mini_jvm.cmd.OneOperandCmd;
+import mini_jvm.cmd.TwoOperandCmd;
+import mini_jvm.constant.*;
+import mini_jvm.field.Field;
+import mini_jvm.loader.ClassFileLoader;
+import mini_jvm.method.Method;
+import mini_jvm.util.Util;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+
+public class ClassFileloaderTest {
+
+	
+	private static final String FULL_QUALIFIED_CLASS_NAME = "mini_jvm/test/EmployeeV1";
+	static String path1 = "D:\\worksapce\\gitRepo\\coding2017\\group23\\769232552\\coding\\src\\test\\resources";
+
+	static String path2 = "C:\\temp";
+
+	static ClassFile clzFile = null;
+	static {
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "mini_jvm.test.EmployeeV1";
+		
+		clzFile = loader.loadClass(className);
+		clzFile.print();
+	}
+	
+	
+	@Before
+	public void setUp() throws Exception {		 
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+	
+	@Test
+	public void testClassPath(){		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+		
+		String clzPath = loader.getClassPath();
+		
+		Assert.assertEquals(path1+";"+path2,clzPath);
+		
+	}
+	
+	@Test
+	public void testClassFileLength() {		
+		
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		
+		byte[] byteCodes = loader.readBinaryCode(className);
+		
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1056, byteCodes.length);
+		
+	}
+	
+	
+    @Test	
+	public void testMagicNumber(){
+    	ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
+		
+		
+		String acctualValue = Util.byteToHexString(codes);
+		
+		Assert.assertEquals("cafebabe", acctualValue);
+	}
+    
+    
+    
+
+    
+    /**
+     * ----------------------------------------------------------------------
+     */
+    
+    
+    @Test
+    public void testVersion(){    			
+		
+		Assert.assertEquals(0, clzFile.getMinorVersion());
+		Assert.assertEquals(52, clzFile.getMajorVersion());
+		
+    }
+    
+    @Test
+    public void testConstantPool(){
+    	
+
+		ConstantPool pool = clzFile.getConstantPool();
+		
+		Assert.assertEquals(53, pool.getSize());
+	
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+			Assert.assertEquals(2, clzInfo.getUtf8Index());
+			
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+			Assert.assertEquals("com/coderising/jvm/test/EmployeeV1", utf8Info.getValue());
+		}
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+			Assert.assertEquals(4, clzInfo.getUtf8Index());
+			
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+		}
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+			Assert.assertEquals("name", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+			Assert.assertEquals("age", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+			Assert.assertEquals("I", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+			Assert.assertEquals("<init>", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+			
+			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+			Assert.assertEquals("Code", utf8Info.getValue());
+		}
+		
+		{
+			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
+			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+		}
+		
+		{
+			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+			Assert.assertEquals(9, nameAndType.getIndex1());
+			Assert.assertEquals(14, nameAndType.getIndex2());
+		}
+		//抽查几个吧
+		{
+			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
+			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+		}
+		
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+		}
+    }
+    @Test
+    public void testClassIndex(){
+    	
+    	ClassIndex clzIndex = clzFile.getClzIndex();
+    	ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+    	ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+    	
+    	
+    	Assert.assertEquals("com/coderising/jvm/test/EmployeeV1", thisClassInfo.getClassName());
+    	Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+    }
+
+	/**
+	 * 下面是第三次JVM课应实现的测试用例
+	 */
+	@Test
+	public void testReadFields(){
+
+		List<Field> fields = clzFile.getFields();
+		Assert.assertEquals(2, fields.size());
+		{
+			Field f = fields.get(0);
+			Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+		}
+		{
+			Field f = fields.get(1);
+			Assert.assertEquals("age:I", f.toString());
+		}
+	}
+	@Test
+	public void testMethods(){
+
+		List<Method> methods = clzFile.getMethods();
+		ConstantPool pool = clzFile.getConstantPool();
+
+		{
+			Method m = methods.get(0);
+			assertMethodEquals(pool,m,
+					"<init>",
+					"(Ljava/lang/String;I)V",
+					"2ab7000c2a2bb5000f2a1cb50011b1");
+
+		}
+		{
+			Method m = methods.get(1);
+			assertMethodEquals(pool,m,
+					"setName",
+					"(Ljava/lang/String;)V",
+					"2a2bb5000fb1");
+
+		}
+		{
+			Method m = methods.get(2);
+			assertMethodEquals(pool,m,
+					"setAge",
+					"(I)V",
+					"2a1bb50011b1");
+		}
+		{
+			Method m = methods.get(3);
+			assertMethodEquals(pool,m,
+					"sayHello",
+					"()V",
+					"b2001c1222b60024b1");
+
+		}
+		{
+			Method m = methods.get(4);
+			assertMethodEquals(pool,m,
+					"main",
+					"([Ljava/lang/String;)V",
+					"bb000159122b101db7002d4c2bb6002fb1");
+		}
+	}
+
+	private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){
+		String methodName = pool.getUTF8String(m.getNameIndex());
+		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+		String code = m.getCodeAttr().getCode();
+		Assert.assertEquals(expectedName, methodName);
+		Assert.assertEquals(expectedDesc, methodDesc);
+		Assert.assertEquals(expectedCode, code);
+	}
+
+	@Test
+	public void testByteCodeCommand(){
+		{
+			Method initMethod = this.clzFile.getMethod("<init>", "(Ljava/lang/String;I)V");
+			ByteCodeCommand [] cmds = initMethod.getCmds();
+
+			assertOpCodeEquals("0: aload_0", cmds[0]);
+			assertOpCodeEquals("1: invokespecial #12", cmds[1]);
+			assertOpCodeEquals("4: aload_0", cmds[2]);
+			assertOpCodeEquals("5: aload_1", cmds[3]);
+			assertOpCodeEquals("6: putfield #15", cmds[4]);
+			assertOpCodeEquals("9: aload_0", cmds[5]);
+			assertOpCodeEquals("10: iload_2", cmds[6]);
+			assertOpCodeEquals("11: putfield #17", cmds[7]);
+			assertOpCodeEquals("14: return", cmds[8]);
+		}
+
+		{
+			Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V");
+			ByteCodeCommand [] cmds = setNameMethod.getCmds();
+
+			assertOpCodeEquals("0: aload_0", cmds[0]);
+			assertOpCodeEquals("1: aload_1", cmds[1]);
+			assertOpCodeEquals("2: putfield #15", cmds[2]);
+			assertOpCodeEquals("5: return", cmds[3]);
+
+		}
+
+		{
+			Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V");
+			ByteCodeCommand [] cmds = sayHelloMethod.getCmds();
+
+			assertOpCodeEquals("0: getstatic #28", cmds[0]);
+			assertOpCodeEquals("3: ldc #34", cmds[1]);
+			assertOpCodeEquals("5: invokevirtual #36", cmds[2]);
+			assertOpCodeEquals("8: return", cmds[3]);
+
+		}
+
+		{
+			Method mainMethod = this.clzFile.getMainMethod();
+
+			ByteCodeCommand [] cmds = mainMethod.getCmds();
+
+			assertOpCodeEquals("0: new #1", cmds[0]);
+			assertOpCodeEquals("3: dup", cmds[1]);
+			assertOpCodeEquals("4: ldc #43", cmds[2]);
+			assertOpCodeEquals("6: bipush 29", cmds[3]);
+			assertOpCodeEquals("8: invokespecial #45", cmds[4]);
+			assertOpCodeEquals("11: astore_1", cmds[5]);
+			assertOpCodeEquals("12: aload_1", cmds[6]);
+			assertOpCodeEquals("13: invokevirtual #47", cmds[7]);
+			assertOpCodeEquals("16: return", cmds[8]);
+		}
+
+	}
+
+	private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){
+
+		String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText();
+
+		if(cmd instanceof OneOperandCmd){
+			if(cmd instanceof BiPushCmd){
+				acctual += " " + ((OneOperandCmd)cmd).getOperand();
+			} else{
+				acctual += " #" + ((OneOperandCmd)cmd).getOperand();
+			}
+		}
+		if(cmd instanceof TwoOperandCmd){
+			acctual += " #" + ((TwoOperandCmd)cmd).getIndex();
+		}
+		Assert.assertEquals(expected, acctual);
+	}
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java b/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java
new file mode 100644
index 0000000000..b06f72b9e2
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java
@@ -0,0 +1,28 @@
+package mini_jvm;
+
+public class EmployeeV1 {
+	
+	
+	private String name;
+    private int age;
+    
+    public EmployeeV1(String name, int age) {
+        this.name = name;
+        this.age = age;        
+    }    
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    public void setAge(int age){
+    	this.age = age;
+    }
+    public void sayHello() {        
+    	System.out.println("Hello , this is class Employee ");    	
+    }
+    public static void main(String[] args){
+    	EmployeeV1 p = new EmployeeV1("Andy",29);
+    	p.sayHello();    
+    	
+    }
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java b/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java
new file mode 100644
index 0000000000..54a7ce4713
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java
@@ -0,0 +1,54 @@
+package mini_jvm;
+
+public class EmployeeV2 {
+
+	public final static String TEAM_NAME = "Dev Team";
+	private String name;
+	private int age;
+	public EmployeeV2(String name, int age) {
+        this.name = name;
+        this.age = age;        
+    }
+
+	public void sayHello() {
+		System.out.println("Hello , this is class Employee ");
+		System.out.println(TEAM_NAME);
+		System.out.println(this.name);
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+	
+
+	public void isYouth() {
+		if (age < 40) {
+			System.out.println("You're still young");
+		} else {
+			System.out.println("You're old");
+		}
+	}
+	
+	
+
+	public void testAdd() {
+		int sum = 0;
+		for (int i = 1; i <= 100; i++) {
+			sum += i;
+		}
+		System.out.println(sum);
+	}
+
+	
+	public static void main(String[] args) {
+		EmployeeV2 p = new EmployeeV2("Andy", 35);
+		p.sayHello();
+		p.isYouth();
+		p.testAdd();
+	}
+}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/Example.java b/students/769232552/season_one/test/java/season_1/mini_jvm/Example.java
new file mode 100644
index 0000000000..01526633b6
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/mini_jvm/Example.java
@@ -0,0 +1,16 @@
+package mini_jvm;
+
+public class Example{
+    public void disp(char c){
+        System.out.println(c);
+    }
+    public void disp(int c){
+       System.out.println(c );
+    }
+    public static void main(String args[]){
+        Example obj = new Example();
+        obj.disp('a');
+        obj.disp(5);
+    }
+}
+
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java b/students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java
new file mode 100644
index 0000000000..289ece0647
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java
@@ -0,0 +1,27 @@
+package mini_jvm;
+
+public class HourlyEmployee extends EmployeeV2 {
+
+	int hourlySalary;
+	
+	public HourlyEmployee(String name, 
+			int age, int hourlySalary) {
+		super(name, age);
+		this.hourlySalary = hourlySalary;
+	}
+	
+	public void sayHello(){		
+		System.out.println("Hello , this is Hourly Employee");		
+	}
+	public static void main(String[] args){
+		EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40);	
+		e.sayHello();		
+	}
+	
+	public int getHourlySalary(){
+		return this.hourlySalary;
+	}
+	
+
+
+}
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java b/students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java
new file mode 100644
index 0000000000..2ecc54f150
--- /dev/null
+++ b/students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java
@@ -0,0 +1,28 @@
+package mini_jvm;
+
+
+import mini_jvm.engine.MiniJVM;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MiniJVMTest {
+	
+	static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin";
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testMain() throws Exception{
+		String[] classPaths = {PATH};
+		MiniJVM jvm = new MiniJVM();
+		jvm.run(classPaths, "com.coderising.jvm.test.HourlyEmployee");
+		
+	}
+
+}
diff --git a/students/769232552/season_two/pom.xml b/students/769232552/season_two/pom.xml
new file mode 100644
index 0000000000..e71b8c044d
--- /dev/null
+++ b/students/769232552/season_two/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com</groupId>
+    <artifactId>season_two</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+</project>
\ No newline at end of file
diff --git a/students/769232552/season_two/src/main/java/work01/srp/DBUtil.java b/students/769232552/season_two/src/main/java/work01/srp/DBUtil.java
new file mode 100644
index 0000000000..89801f6621
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package work01.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/769232552/season_two/src/main/java/work01/srp/Mail.java b/students/769232552/season_two/src/main/java/work01/srp/Mail.java
new file mode 100644
index 0000000000..79ddb9c94a
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/Mail.java
@@ -0,0 +1,73 @@
+package work01.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+public class Mail {
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+
+    private Product product;
+    private String toAddress;
+    private String subject;
+    private String message;
+    private String sendMailQuery;
+
+
+    public Mail(Product product){
+        this.product = product;
+    }
+
+    public List loadMailingList() throws Exception {
+        return DBUtil.query(this.sendMailQuery);
+    }
+
+    public void generateMail(HashMap userInfo) throws IOException {
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0){
+            setMessage(userInfo);
+            setLoadQuery();
+            setToAddress(toAddress);
+        }
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(HashMap userInfo) throws IOException {
+        String name = (String) userInfo.get(NAME_KEY);
+        this.message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+        this.subject = "您关注的产品降价了";
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setLoadQuery()  {
+        this.sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() +"' "
+                + "and send_mail=1 ";
+    }
+
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work01/srp/MailBox.java b/students/769232552/season_two/src/main/java/work01/srp/MailBox.java
new file mode 100644
index 0000000000..a7fccfaae9
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/MailBox.java
@@ -0,0 +1,43 @@
+package work01.srp;
+
+public class MailBox {
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+
+    public void setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+    }
+
+    public void setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public void sendEmail(Mail mail, String smtpHost, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(fromAddress).append("\n");
+        buffer.append("To:").append(mail.getToAddress()).append("\n");
+        buffer.append("Subject:").append(mail.getSubject()).append("\n");
+        buffer.append("Content:").append(mail.getMessage()).append("\n");
+        buffer.append("SMTPHost:").append(smtpHost).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java b/students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java
new file mode 100644
index 0000000000..024119cd18
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/MailBoxConfiguration.java
@@ -0,0 +1,62 @@
+package work01.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MailBoxConfiguration {
+
+	static Map<String,String> configurations = new HashMap<String, String>();
+	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");
+
+	}
+
+	private MailBox mailBox;
+
+	public MailBoxConfiguration(){}
+
+	public void config(){
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+
+	public void setMailBox(MailBox mailBox) {
+		this.mailBox = mailBox;
+	}
+
+	private void setSMTPHost() {
+		this.mailBox.setSmtpHost(getProperty(ConfigurationKeys.SMTP_SERVER));
+	}
+
+
+	private void setAltSMTPHost() {
+		this.mailBox.setAltSmtpHost(getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+	}
+
+
+	private void setFromAddress() {
+		this.mailBox.setFromAddress(getProperty(ConfigurationKeys.EMAIL_ADMIN));
+	}
+
+
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	private String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+	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/769232552/season_two/src/main/java/work01/srp/Product.java b/students/769232552/season_two/src/main/java/work01/srp/Product.java
new file mode 100644
index 0000000000..2eff922d22
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/Product.java
@@ -0,0 +1,28 @@
+package work01.srp;
+
+
+public class Product {
+
+    protected String productID = null;
+
+
+    protected String productDesc = null;
+
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java b/students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java
new file mode 100644
index 0000000000..52222aea0d
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work01/srp/PromotionMail.java
@@ -0,0 +1,92 @@
+package work01.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("D:\\worksapce\\gitRepo\\coding2017\\students\\769232552\\season_two\\src\\main\\resources\\work01\\srp\\product_promotion.txt");
+		boolean emailDebug = false;
+
+		//配置邮箱
+		MailBox mailBox = new MailBox();
+		MailBoxConfiguration mailBoxConfiguration = new MailBoxConfiguration();
+		mailBoxConfiguration.setMailBox(mailBox);
+		mailBoxConfiguration.config();
+
+		//将促销信息发送邮件
+		List<Product> products = readProductFile(f);//获取促销产品信息
+		for (Product product : products){
+			Mail mail = new Mail(product);		//生成邮件（邮件内容，收发人信息）
+			sendPromotionMails(emailDebug,mail,mailBox);
+		}
+
+	}
+
+
+
+	public static void sendPromotionMails(boolean debug, Mail mail, MailBox mailBox) throws Exception {
+
+		System.out.println("开始发送邮件");
+
+		List mailingList = mail.loadMailingList(); //获取收件人列表
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				mail.generateMail((HashMap) iter.next()); //生成邮件内容
+				try {
+					if (mail.getToAddress().length() > 0)
+						mailBox.sendEmail(mail, mailBox.getSmtpHost(), debug);
+				} catch (Exception e) {
+					try {
+						mailBox.sendEmail(mail, mailBox.getAltSmtpHost(), debug);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		} else {
+			System.out.println("没有邮件发送");
+
+		}
+	}
+
+
+	public static List<Product> readProductFile(File file) throws IOException
+	{
+		List<Product> list = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp;
+			while ((temp = br.readLine()) != null){
+				String[] data = temp.split(" ");
+
+				Product product = new Product();
+				product.setProductID(data[0]);
+				product.setProductDesc(data[1]);
+				list.add(product);
+
+				System.out.println("产品ID = " + product.getProductID() + "\n");
+				System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+			}
+
+			return list;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+}
diff --git a/students/769232552/season_two/src/main/resources/work01/srp/product_promotion.txt b/students/769232552/season_two/src/main/resources/work01/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/769232552/season_two/src/main/resources/work01/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 1ef7aaf4deb42061fa405a3d6396e01bd435d623 Mon Sep 17 00:00:00 2001
From: lanyuanxiaoyao <mingland87!@#>
Date: Thu, 15 Jun 2017 11:20:08 +0800
Subject: [PATCH 096/332] =?UTF-8?q?2017.6.15=20=E7=AC=AC=E4=B8=80=E6=AC=A1?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81=E7=A8=8B?=
 =?UTF-8?q?=E5=BA=8FSRP=E9=87=8D=E6=9E=84=20=E7=AC=AC=E4=B8=80=E6=AC=A1?=
 =?UTF-8?q?=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../SRP\346\265\201\347\250\213.png"          | Bin 0 -> 22058 bytes
 .../srp_restructure_1/PromotionMail.java"     |  67 ++++++++++++++++++
 .../pojo/Configuration.java"                  |  26 +++++++
 .../pojo/ConfigurationKeys.java"              |   9 +++
 .../srp_restructure_1/pojo/Mail.java"         |  38 ++++++++++
 .../pojo/MailServiceConfiguration.java"       |  35 +++++++++
 .../srp_restructure_1/pojo/Product.java"      |  23 ++++++
 .../srp_restructure_1/pojo/User.java"         |  23 ++++++
 .../srp_restructure_1/product_promotion.txt"  |   4 ++
 .../service/ProductService.java"              |  39 ++++++++++
 .../service/UserService.java"                 |  18 +++++
 .../srp_restructure_1/util/DBUtil.java"       |  36 ++++++++++
 .../srp_restructure_1/util/MailUtil.java"     |  34 +++++++++
 ...7\345\247\213\346\265\201\347\250\213.png" | Bin 0 -> 36208 bytes
 14 files changed, 352 insertions(+)
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/SRP\346\265\201\347\250\213.png"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/product_promotion.txt"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java"
 create mode 100644 "students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/\345\216\237\345\247\213\346\265\201\347\250\213.png"

diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/SRP\346\265\201\347\250\213.png" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/SRP\346\265\201\347\250\213.png"
new file mode 100644
index 0000000000000000000000000000000000000000..638b75e7ebfdd9d9b4fa37a4825a11011de67e84
GIT binary patch
literal 22058
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
SKSS&)a$3*$WTDQr+y4d|6&;lT

literal 0
HcmV?d00001

diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java"
new file mode 100644
index 0000000000..7e1c102f25
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/PromotionMail.java"
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp_restructure_1;
+
+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;
+
+import com.coderising.ood.srp_restructure_1.pojo.Configuration;
+import com.coderising.ood.srp_restructure_1.pojo.ConfigurationKeys;
+import com.coderising.ood.srp_restructure_1.pojo.Mail;
+import com.coderising.ood.srp_restructure_1.pojo.MailServiceConfiguration;
+import com.coderising.ood.srp_restructure_1.pojo.Product;
+import com.coderising.ood.srp_restructure_1.pojo.User;
+import com.coderising.ood.srp_restructure_1.service.ProductService;
+import com.coderising.ood.srp_restructure_1.service.UserService;
+import com.coderising.ood.srp_restructure_1.util.DBUtil;
+import com.coderising.ood.srp_restructure_1.util.MailUtil;
+
+public class PromotionMail {
+
+	UserService userService = new UserService();
+	ProductService productService = new ProductService();
+
+	public static void main(String[] args) throws Exception {
+		File file = new File("src/main/java/com/coderising/ood/srp_restructure_1/product_promotion.txt");
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(file, emailDebug);
+	}
+
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+		MailServiceConfiguration configuration = new MailServiceConfiguration()
+				.setAltSMTPHost(ConfigurationKeys.SMTP_SERVER).setSMTPHost(ConfigurationKeys.ALT_SMTP_SERVER)
+				.setFromAddress(ConfigurationKeys.SMTP_SERVER);
+		List<Product> plist = productService.getProductDescList(file);
+		sendEMails(mailDebug, configuration, plist);
+	}
+
+	protected void sendEMails(boolean debug, MailServiceConfiguration configuration, List<Product> plist)
+			throws IOException {
+		System.out.println("开始发送邮件");
+		if (plist != null) {
+			Iterator<Product> piterator = plist.iterator();
+			while (piterator.hasNext()) {
+				Product product = piterator.next();
+				List<User> ulist = userService.getSendMailUser(product);
+				if (ulist != null) {
+					Iterator<User> uiterator = ulist.iterator();
+					while (uiterator.hasNext()) {
+						User user = uiterator.next();
+						Mail mail = new Mail("您关注的产品降价了",
+								"尊敬的 " + user.getName() + ", 您关注的产品 " + plist.get(0).getProductDesc() + " 降价了，欢迎购买!",
+								user.getEmail());
+						MailUtil.sendEmail(debug, configuration, mail);
+					}
+				} else {
+					System.out.println("没有邮件发送");
+				}
+			}
+		} else {
+			System.out.println("没有降价商品");
+		}
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java"
new file mode 100644
index 0000000000..56182957fa
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Configuration.java"
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String, String> 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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java"
new file mode 100644
index 0000000000..6a5cdb35fc
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/ConfigurationKeys.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java"
new file mode 100644
index 0000000000..560809a8cb
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Mail.java"
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class Mail {
+
+	private String subject;
+	private String message;
+	private String toAddress;
+
+	public Mail(String subject, String message, String toAddress) {
+		this.subject = subject;
+		this.message = message;
+		this.toAddress = toAddress;
+	}
+
+	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 getToAddress() {
+		return toAddress;
+	}
+
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java"
new file mode 100644
index 0000000000..cbdaaec27b
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/MailServiceConfiguration.java"
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class MailServiceConfiguration {
+
+	private String SMTPHost;
+	private String AltSMTPHost;
+	private String FromAddress;
+
+	public String getSMTPHost() {
+		return SMTPHost;
+	}
+
+	public MailServiceConfiguration setSMTPHost(String sMTPHost) {
+		SMTPHost = sMTPHost;
+		return this;
+	}
+
+	public String getAltSMTPHost() {
+		return AltSMTPHost;
+	}
+
+	public MailServiceConfiguration setAltSMTPHost(String altSMTPHost) {
+		AltSMTPHost = altSMTPHost;
+		return this;
+	}
+
+	public String getFromAddress() {
+		return FromAddress;
+	}
+
+	public MailServiceConfiguration setFromAddress(String fromAddress) {
+		FromAddress = fromAddress;
+		return this;
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java"
new file mode 100644
index 0000000000..38de6f12e0
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/Product.java"
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class Product {
+
+	private String productID;
+	private String 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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java"
new file mode 100644
index 0000000000..ebe5d134f3
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/pojo/User.java"
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp_restructure_1.pojo;
+
+public class User {
+
+	private String name;
+	private String 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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/product_promotion.txt" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/product_promotion.txt"
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/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/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java"
new file mode 100644
index 0000000000..d1353bc72b
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/ProductService.java"
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp_restructure_1.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp_restructure_1.pojo.Product;
+
+public class ProductService {
+
+	public List<Product> getProductDescList(File file) throws IOException {
+		List<Product> plist = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+
+			Product p = new Product();
+			p.setProductID(data[0]);
+			p.setProductDesc(data[1]);
+
+			System.out.println("产品ID = " + p.getProductID() + "\n");
+			System.out.println("产品描述 = " + p.getProductDesc() + "\n");
+
+			plist.add(p);
+			return plist;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+
+	}
+
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java"
new file mode 100644
index 0000000000..799f713ccf
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/service/UserService.java"
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp_restructure_1.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp_restructure_1.pojo.Product;
+import com.coderising.ood.srp_restructure_1.pojo.User;
+import com.coderising.ood.srp_restructure_1.util.DBUtil;
+
+public class UserService {
+
+	public List<User> getSendMailUser(Product product) {
+		String sql = "Select name from subscriptions " + "where product_id= '" + product.getProductID() + "' "
+				+ "and send_mail=1 ";
+		return DBUtil.query(sql);
+	}
+
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java"
new file mode 100644
index 0000000000..086893ec60
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/DBUtil.java"
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp_restructure_1.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import com.coderising.ood.srp_restructure_1.pojo.User;
+
+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);
+			 */
+			/*
+			 * 因为在重构的时候使用了bean，所以为了方便直接改为返回beanlist
+			 */
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java"
new file mode 100644
index 0000000000..ca44417827
--- /dev/null
+++ "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/srp_restructure_1/util/MailUtil.java"
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp_restructure_1.util;
+
+import com.coderising.ood.srp_restructure_1.pojo.Mail;
+import com.coderising.ood.srp_restructure_1.pojo.MailServiceConfiguration;
+
+public class MailUtil {
+
+	private 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());
+	}
+
+	public static void sendEmail(boolean debug, MailServiceConfiguration configuration, Mail mail) {
+		try {
+			if (mail.getToAddress().length() > 0)
+				sendEmail(mail.getToAddress(), configuration.getFromAddress(), mail.getSubject(), mail.getMessage(),
+						configuration.getSMTPHost(), debug);
+		} catch (Exception e) {
+			try {
+				sendEmail(mail.getToAddress(), configuration.getFromAddress(), mail.getSubject(), mail.getMessage(),
+						configuration.getAltSMTPHost(), debug);
+
+			} catch (Exception e2) {
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git "a/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/\345\216\237\345\247\213\346\265\201\347\250\213.png" "b/students/949603184/homework01-\351\207\215\346\236\204\351\202\256\344\273\266\345\217\221\351\200\201/\345\216\237\345\247\213\346\265\201\347\250\213.png"
new file mode 100644
index 0000000000000000000000000000000000000000..c2d8aceb83073568160503fe84291c5c820ea6f2
GIT binary patch
literal 36208
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

literal 0
HcmV?d00001


From aa10e1759512191e51db3d21334b85e0e36955df Mon Sep 17 00:00:00 2001
From: 506359831 <506359831@qq.com>
Date: Thu, 15 Jun 2017 12:28:03 +0800
Subject: [PATCH 097/332] github test

---
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../src/com/coderising/ood/srp/DBUtil.java    |  25 +++
 .../src/com/coderising/ood/srp/MailUtil.java  |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 6 files changed, 278 insertions(+)
 create mode 100644 students/506359831/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/506359831/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/506359831/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/506359831/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/506359831/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/506359831/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/506359831/src/com/coderising/ood/srp/Configuration.java b/students/506359831/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/506359831/src/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<String,String> 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/506359831/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/506359831/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/DBUtil.java b/students/506359831/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/MailUtil.java b/students/506359831/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/PromotionMail.java b/students/506359831/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/506359831/src/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/506359831/src/com/coderising/ood/srp/product_promotion.txt b/students/506359831/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/506359831/src/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

From c86742705512d195711a481fc797e8a8ae866b11 Mon Sep 17 00:00:00 2001
From: Mori <1363044717@qq.com>
Date: Thu, 15 Jun 2017 15:48:21 +0800
Subject: [PATCH 098/332] first commit

---
 students/1363044717/ood-assignment/pom.xml    | 32 ++++++
 .../com/coderising/ood/srp/Configuration.java | 23 +++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   | 23 +++++
 .../java/com/coderising/ood/srp/FileUtil.java | 23 +++++
 .../java/com/coderising/ood/srp/Mail.java     | 28 ++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 16 +++
 .../java/com/coderising/ood/srp/Product.java  | 34 +++++++
 .../com/coderising/ood/srp/PromotionMail.java | 97 +++++++++++++++++++
 .../java/com/coderising/ood/srp/User.java     | 34 +++++++
 .../com/coderising/ood/srp/UserService.java   | 17 ++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 12 files changed, 340 insertions(+)
 create mode 100644 students/1363044717/ood-assignment/pom.xml
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
 create mode 100644 students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1363044717/ood-assignment/pom.xml b/students/1363044717/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/1363044717/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/1363044717/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<String,String> 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/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/1363044717/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/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..dbf48911d3
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,23 @@
+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<User> query(String sql) {
+        List<User> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            User userInfo = new User("User" + i, "aa@bb.com");
+            userList.add(userInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..e7b12edd30
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class FileUtil {
+
+    public static String readFile(File file) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            return temp;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..c18227852c
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class Mail {
+    private String subject;
+    private String message;
+    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;
+    }
+    protected void setPromotionMessage(String userName, String productDesc) {
+        this.setSubject("您关注的产品降价了");
+        this.setMessage("尊敬的 " + userName + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!");
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..129ffdd207
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(String toAddress, String fromAddress,Mail mail, 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(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+	}
+
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..5ff6a9665f
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class Product {
+
+    private String productID;
+    private String productDesc;
+
+    public Product() {
+    }
+
+    public Product(String productID, String productDesc) {
+        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/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..43d0b264bc
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,97 @@
+﻿package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class PromotionMail {
+
+    protected String smtpHost = null;
+    protected String altSmtpHost = null;
+    protected String fromAddress = null;
+    protected String toAddress = null;
+    protected Mail mail = new Mail();
+    protected Product product = null;
+    protected boolean debug = false;
+    protected List<User> mailingList = null;
+
+    private static Configuration config;
+
+    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);
+        pe.sendEMails();
+    }
+
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+        debug = mailDebug;
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        loadProduct(file);
+        loadConfig();
+        loadMailingList();
+    }
+
+    protected void loadProduct(File file) throws Exception {
+        String fileStr = FileUtil.readFile(file);
+        String data[] = fileStr.split(" ");
+        product = new Product(data[0], data[1]);
+    }
+
+    protected void loadMailingList() {
+        mailingList = UserService.loadMailingListByProductId(product.getProductID());
+    }
+
+    protected void loadConfig() {
+        config = new Configuration();
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+    }
+
+    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 boolean validateToAddress() {
+        return toAddress.length() > 0;
+    }
+
+    protected void setToAddress(String address) {
+        toAddress = address;
+    }
+
+    protected void sendEMails() throws IOException {
+        System.out.println("开始发送邮件");
+        if (mailingList == null) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+        for (User user : mailingList) {
+            this.setToAddress(user.getEmail());
+            if (!this.validateToAddress()) {
+                continue;
+            }
+            //设置促销消息
+            mail.setPromotionMessage(user.getName(), product.getProductDesc());
+            try {
+                MailUtil.sendEmail(toAddress, fromAddress, mail, smtpHost, debug);
+            } catch (Exception e) {
+                try {
+                    MailUtil.sendEmail(toAddress, fromAddress, mail, altSmtpHost, debug);
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        }
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..71fcd1ea85
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class User {
+
+    private String email;
+    private String name;
+
+    public User() {
+    }
+
+    public User(String email, String name) {
+        this.email = email;
+        this.name = name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
new file mode 100644
index 0000000000..3b2bd5aac5
--- /dev/null
+++ b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Mori on 2017/6/15.
+ */
+public class UserService {
+
+    public static List<User> loadMailingListByProductId(String productID) {
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+}
diff --git a/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1363044717/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1363044717/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

From 430e3a51e2bdcdcdbe4bbe99842ea4974343878d Mon Sep 17 00:00:00 2001
From: chunyan123b <115615290@qq.com>
Date: Thu, 15 Jun 2017 15:51:59 +0800
Subject: [PATCH 099/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

第一次提交
---
 .../config/product_promotion.txt              |  4 +
 students/115615290/ood-assignment/pom.xml     | 32 ++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 27 +++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 21 ++++++
 .../java/com/coderising/ood/srp/Product.java  | 48 ++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 74 +++++++++++++++++++
 .../java/com/coderising/ood/srp/User.java     | 23 ++++++
 9 files changed, 261 insertions(+)
 create mode 100644 students/115615290/ood-assignment/config/product_promotion.txt
 create mode 100644 students/115615290/ood-assignment/pom.xml
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java

diff --git a/students/115615290/ood-assignment/config/product_promotion.txt b/students/115615290/ood-assignment/config/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/115615290/ood-assignment/config/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/115615290/ood-assignment/pom.xml b/students/115615290/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/115615290/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..d11d29787e
--- /dev/null
+++ b/students/115615290/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<String,String> configurations = new HashMap<String,String>();
+	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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/115615290/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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..9f7cd5433f
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<User>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..22584f3d95
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
+			boolean debug) {
+		if(toAddress==null||toAddress.equals("")){
+			throw new RuntimeException("发送地址不能为空！");
+		}
+		//假装发了一封邮件
+		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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..4208ee6d34
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class Product {
+	
+	private String productID;
+	private String productDesc;
+	
+	public Product (File file) throws IOException{
+		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();
+		}
+	}
+	
+	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/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..e14524f666
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+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 subject = null;
+	protected String message = null;
+	
+
+	private static Configuration config; 
+	
+	
+	
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("config/product_promotion.txt");
+		PromotionMail pe = new PromotionMail();
+		List<User> users = DBUtil.query(pe.sendMailQuery);
+		Product product = new Product(f);
+		pe.sendEMails(users, product);
+		
+	}
+
+	
+	public PromotionMail() throws Exception {
+		config = new Configuration();
+		setSMTPHost();
+		setAltSMTPHost(); 
+		setFromAddress();
+	}
+	
+	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); 
+	}
+
+	public void setMessage(User user,Product product){
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;		
+	}
+
+	public void sendEMails(User user,Product product){
+		setMessage(user,product);
+		System.out.println("开始发送邮件");
+		MailUtil.sendEmail(user.getEmail(), fromAddress, subject, message, smtpHost, true);
+		System.out.println("邮件发送完毕");
+	}
+	
+	public void sendEMails(List<User> users,Product product){
+		System.out.println("开始发送邮件");
+		for(User user:users){
+			setMessage(user,product);
+			MailUtil.sendEmail(user.getEmail(), fromAddress, subject, message, smtpHost, true);
+		}
+		System.out.println("邮件发送完毕");
+	}
+}
diff --git a/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..42e4c81f89
--- /dev/null
+++ b/students/115615290/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+public class User {
+	
+	private String name;
+	private String 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;
+	}
+	
+	
+
+}

From 4e65eca89df94ba5affda6f78b9807b8404a2154 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 16:15:46 +0800
Subject: [PATCH 100/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BD=9C=E4=B8=9A?=
 =?UTF-8?q?=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../test/java/tree/BinaryTreeNodeTest.java    |   2 +-
 .../srp/{ => original}/PromotionMail.java     |  11 +-
 .../main/java/srp/refactor/PromotionMail.java |  96 +++++++++++++++++
 .../configuration}/Configuration.java         |   2 +-
 .../configuration}/ConfigurationKeys.java     |   2 +-
 .../src/main/java/srp/refactor/mail/Mail.java | 100 ++++++++++++++++++
 .../java/srp/{ => refactor/util}/DBUtil.java  |   4 +-
 .../main/java/srp/refactor/util/FileUtil.java |  39 +++++++
 .../srp/{ => refactor/util}/MailUtil.java     |   9 +-
 .../ood_demo_file}/product_promotion.txt      |   0
 .../ood/src/test/java/srp/SrpTest.java        |  15 ++-
 11 files changed, 268 insertions(+), 12 deletions(-)
 rename students/75939388/ood/src/main/java/srp/{ => original}/PromotionMail.java (92%)
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
 rename students/75939388/ood/src/main/java/srp/{ => refactor/configuration}/Configuration.java (94%)
 rename students/75939388/ood/src/main/java/srp/{ => refactor/configuration}/ConfigurationKeys.java (85%)
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
 rename students/75939388/ood/src/main/java/srp/{ => refactor/util}/DBUtil.java (86%)
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java
 rename students/75939388/ood/src/main/java/srp/{ => refactor/util}/MailUtil.java (73%)
 rename students/75939388/ood/src/main/{java/srp => resources/ood_demo_file}/product_promotion.txt (100%)

diff --git a/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java b/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
index 8de899c994..90705ddca2 100644
--- a/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
+++ b/students/75939388/datastrure/src/test/java/tree/BinaryTreeNodeTest.java
@@ -17,6 +17,6 @@ public void init(){
 
     @Test
     public void test1(){
-        
+
     }
 }
diff --git a/students/75939388/ood/src/main/java/srp/PromotionMail.java b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
similarity index 92%
rename from students/75939388/ood/src/main/java/srp/PromotionMail.java
rename to students/75939388/ood/src/main/java/srp/original/PromotionMail.java
index 446f82e9ad..4ef4df0f7a 100644
--- a/students/75939388/ood/src/main/java/srp/PromotionMail.java
+++ b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
@@ -1,4 +1,9 @@
-package srp;
+package srp.original;
+
+import srp.refactor.configuration.Configuration;
+import srp.refactor.configuration.ConfigurationKeys;
+import srp.refactor.util.DBUtil;
+import srp.refactor.util.MailUtil;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -24,7 +29,7 @@ public class PromotionMail {
 	protected String productID = null;
 	protected String productDesc = null;
 
-	private static Configuration config; 
+	private static Configuration config;
 	
 	
 	
@@ -91,7 +96,7 @@ protected void setLoadQuery() throws Exception {
 	
 	protected void setSMTPHost() 
 	{
-		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
 	}
 
 	
diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
new file mode 100644
index 0000000000..ea14d1c94a
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
@@ -0,0 +1,96 @@
+package srp.refactor;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.configuration.Configuration;
+import srp.refactor.configuration.ConfigurationKeys;
+import srp.refactor.mail.Mail;
+import srp.refactor.util.DBUtil;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 在原有的Mail邮件功能的基础上修改而来的促销邮件发送端
+ *
+ * Created by Tee on 2017/6/15.
+ */
+public class PromotionMail extends Mail {
+
+    protected String productID = null;
+    protected String productDesc = null;
+    protected String sendMailQuery = null;
+
+    private static Configuration config = new Configuration();
+
+    private final static String NAME_KEY = "NAME";
+    private final static String EMAIL_KEY = "EMAIL";
+
+    private void init(){
+        super.initMailSettings(
+                config.getProperty(ConfigurationKeys.SMTP_SERVER),
+                config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER),
+                config.getProperty(ConfigurationKeys.EMAIL_ADMIN)
+        );
+    }
+
+    public PromotionMail(){
+        init();
+    }
+
+    @Override
+    public void createMail(String toAddress, String subject, String message){
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+        super.write();
+    }
+
+    public void setProductPromotion(String productID, String productDesc) throws Exception{
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    /**
+     * 模拟数据库查询
+     */
+    protected void setLoadQuery() throws Exception {
+        if(StringUtils.isBlank(productID)){
+            throw new RuntimeException("没有获取到productID");
+        }
+
+        sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set, productID -> " + productID);
+    }
+
+    public void batchSetMails(List<String> data) throws Exception{
+        if(data.isEmpty()){
+            throw new RuntimeException("data不能为空");
+        }
+        for(int i = 0; i < data.size(); i+=2){
+            String productId = data.get(i);
+            String productName = data.get(i+1);
+            setProductPromotion(productId, productName);
+            setLoadQuery();
+
+            List<HashMap> userList = DBUtil.query(sendMailQuery);
+            for(HashMap userInfo : userList){
+                createMail(
+                        (String)userInfo.get(EMAIL_KEY),
+                        "您关注的" + productName + "已降价",
+                        "尊敬的 "+ userInfo.get(NAME_KEY) +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!"
+                );
+            }
+        }
+    }
+
+    /**
+     * 暂时这么实现
+     */
+    @Override
+    public void send(){
+        super.batchSend(false);
+    }
+}
\ No newline at end of file
diff --git a/students/75939388/ood/src/main/java/srp/Configuration.java b/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java
similarity index 94%
rename from students/75939388/ood/src/main/java/srp/Configuration.java
rename to students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java
index 3a17cdd457..b3b24944d2 100644
--- a/students/75939388/ood/src/main/java/srp/Configuration.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java
@@ -1,4 +1,4 @@
-package srp;
+package srp.refactor.configuration;
 import java.util.HashMap;
 import java.util.Map;
 
diff --git a/students/75939388/ood/src/main/java/srp/ConfigurationKeys.java b/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java
similarity index 85%
rename from students/75939388/ood/src/main/java/srp/ConfigurationKeys.java
rename to students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java
index ef3a07a354..9b1cfe8dcc 100644
--- a/students/75939388/ood/src/main/java/srp/ConfigurationKeys.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java
@@ -1,4 +1,4 @@
-package srp;
+package srp.refactor.configuration;
 
 public class ConfigurationKeys {
 
diff --git a/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
new file mode 100644
index 0000000000..01e1ecbbf3
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
@@ -0,0 +1,100 @@
+package srp.refactor.mail;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.util.MailUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public abstract class Mail {
+    protected String smtpHost = null;
+    protected String altSmtpHost = null;
+    protected String fromAddress = null;
+    protected String toAddress = null;
+    protected String subject = null;
+    protected String message = null;
+
+    private static final String TO_ADDRESS_KEY = "toAddress";
+    private static final String SUBJECT_KEY = "subject";
+    private static final String MESSAGE_KEY = "message";
+
+    protected List<HashMap> mailList;
+
+    /**
+     * 初始化邮件设置
+     *
+     * @param smtpHost smtp主机
+     * @param altSmtpHost 备用smtp主机
+     * @param fromAddress 发件人地址
+     */
+    protected void initMailSettings(String smtpHost, String altSmtpHost, String fromAddress){
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+        this.mailList = new ArrayList<>();
+    }
+
+    public abstract void createMail(String toAddress, String subject, String message);
+
+    /**
+     * 撰写邮件
+     */
+    protected void write(){
+        HashMap<String, Object> mailToSend = new HashMap<>();
+        mailToSend.put(TO_ADDRESS_KEY, this.toAddress);
+        mailToSend.put(SUBJECT_KEY, this.subject);
+        mailToSend.put(MESSAGE_KEY, this.message);
+        this.mailList.add(mailToSend);
+    }
+
+    private boolean isInit(){
+        return StringUtils.isNotBlank(this.smtpHost) &&
+                StringUtils.isNotBlank(this.altSmtpHost) &&
+                StringUtils.isNotBlank(this.fromAddress);
+    }
+
+    /**
+     * 供子类实现的send方法
+     */
+    public abstract void send();
+
+    /**
+     * 批量发送
+     */
+    public void batchSend(boolean debug){
+        if(!isInit()){
+            throw new RuntimeException("邮件客户端还未做配置");
+        }
+
+        if(mailList.isEmpty()){
+            System.out.println("没有邮件要发送");
+            return;
+        }
+        int size = mailList.size();
+        System.out.println("开始发送邮件, 总邮件数=" + size);
+        int i = 0;
+        for(HashMap mail : mailList){
+            i++;
+            String toAddress = (String)mail.get(TO_ADDRESS_KEY);
+            if(StringUtils.isBlank(toAddress)){
+                System.out.println("收件人地址为空，此邮件发送中止");
+                continue;
+            }
+
+            String subject = (String)mail.get(SUBJECT_KEY);
+            String message = (String)mail.get(MESSAGE_KEY);
+
+            System.out.println("\n正在发送第[" + i + "]封邮件");
+            try{
+                MailUtil.sendEmail(toAddress, this.fromAddress, subject, message, this.smtpHost, debug);
+            }catch(Exception e){
+                MailUtil.sendEmail(toAddress, this.fromAddress, subject, message, this.altSmtpHost, debug);
+            }
+            System.out.println("第[" + i + "]封邮件发送完成");
+        }
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/DBUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java
similarity index 86%
rename from students/75939388/ood/src/main/java/srp/DBUtil.java
rename to students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java
index 912bebf080..00aa263606 100644
--- a/students/75939388/ood/src/main/java/srp/DBUtil.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java
@@ -1,4 +1,4 @@
-package srp;
+package srp.refactor.util;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -12,7 +12,7 @@ public class DBUtil {
 	 */
 	public static List query(String sql){
 		
-		List userList = new ArrayList();
+		List<HashMap> userList = new ArrayList();
 		for (int i = 1; i <= 3; i++) {
 			HashMap userInfo = new HashMap();
 			userInfo.put("NAME", "User" + i);			
diff --git a/students/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java
new file mode 100644
index 0000000000..a1fbdca905
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/FileUtil.java
@@ -0,0 +1,39 @@
+package srp.refactor.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/15.
+ */
+public class FileUtil {
+
+    public static List<String> readFile(File file)throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String tmp = null;
+            List<String> data = new ArrayList<>();
+            while((tmp = br.readLine()) != null){
+                String[] temp = tmp.split(" ");
+                data.add(temp[0]);
+                data.add(temp[1]);
+            }
+
+            return data;
+        } catch (IOException e) {
+            throw new IOException(e);
+        } finally {
+            try{
+                br.close();
+            }catch(Exception e){
+                e.printStackTrace();
+            }
+
+        }
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/MailUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java
similarity index 73%
rename from students/75939388/ood/src/main/java/srp/MailUtil.java
rename to students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java
index 556976f5c9..b6c267b8b6 100644
--- a/students/75939388/ood/src/main/java/srp/MailUtil.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java
@@ -1,7 +1,10 @@
-package srp;
+package srp.refactor.util;
 
 public class MailUtil {
 
+	private static final String TO_ADDRESS_KEY = "toAddress";
+	private static final String MAIL_KEY = "mail";
+
 	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
 			boolean debug) {
 		//假装发了一封邮件
@@ -10,9 +13,9 @@ public static void sendEmail(String toAddress, String fromAddress, String subjec
 		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());
+		System.out.print(buffer.toString());
 		
 	}
 
-	
+
 }
diff --git a/students/75939388/ood/src/main/java/srp/product_promotion.txt b/students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt
similarity index 100%
rename from students/75939388/ood/src/main/java/srp/product_promotion.txt
rename to students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt
diff --git a/students/75939388/ood/src/test/java/srp/SrpTest.java b/students/75939388/ood/src/test/java/srp/SrpTest.java
index 7882177794..843d0b03f3 100644
--- a/students/75939388/ood/src/test/java/srp/SrpTest.java
+++ b/students/75939388/ood/src/test/java/srp/SrpTest.java
@@ -2,12 +2,19 @@
 
 import org.junit.Before;
 import org.junit.Test;
+import srp.refactor.PromotionMail;
+import srp.refactor.util.FileUtil;
+
+import java.io.File;
+import java.util.List;
 
 /**
  * Created by Tee on 2017/6/15.
  */
 public class SrpTest {
 
+    PromotionMail promotionMail = null;
+
     @Before
     public void init(){
 
@@ -17,7 +24,13 @@ public void init(){
      * 重构后的代码尝试运行
      */
     @Test
-    public void runTrial(){
+    public void runTrial() throws Exception{
+        File file = new File("/Users/Tee/Code/learning2017/season2/coding2017/" +
+                "students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt");
+        List<String> data = FileUtil.readFile(file);
 
+        PromotionMail promotionMail = new PromotionMail();
+        promotionMail.batchSetMails(data);
+        promotionMail.send();
     }
 }

From 88ae9f8b58a7cda3a8b8a61c419571a8d8465d9e Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 16:31:35 +0800
Subject: [PATCH 101/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BD=9C=E4=B8=9A?=
 =?UTF-8?q?=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ood/src/main/java/srp/refactor/PromotionMail.java       | 2 +-
 .../75939388/ood/src/main/java/srp/refactor/mail/Mail.java  | 6 +++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
index ea14d1c94a..01da6b3516 100644
--- a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
@@ -42,7 +42,7 @@ public void createMail(String toAddress, String subject, String message){
         this.toAddress = toAddress;
         this.subject = subject;
         this.message = message;
-        super.write();
+        super.addToMailList();
     }
 
     public void setProductPromotion(String productID, String productDesc) throws Exception{
diff --git a/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
index 01e1ecbbf3..af5600ae21 100644
--- a/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
@@ -8,6 +8,8 @@
 import java.util.List;
 
 /**
+ * 具有初始化设置、可以批量发送邮件的邮件客户端
+ *
  * Created by Tee on 2017/6/15.
  */
 public abstract class Mail {
@@ -43,7 +45,7 @@ protected void initMailSettings(String smtpHost, String altSmtpHost, String from
     /**
      * 撰写邮件
      */
-    protected void write(){
+    protected void addToMailList(){
         HashMap<String, Object> mailToSend = new HashMap<>();
         mailToSend.put(TO_ADDRESS_KEY, this.toAddress);
         mailToSend.put(SUBJECT_KEY, this.subject);
@@ -89,11 +91,13 @@ public void batchSend(boolean debug){
             String message = (String)mail.get(MESSAGE_KEY);
 
             System.out.println("\n正在发送第[" + i + "]封邮件");
+            System.out.println("==========================================================");
             try{
                 MailUtil.sendEmail(toAddress, this.fromAddress, subject, message, this.smtpHost, debug);
             }catch(Exception e){
                 MailUtil.sendEmail(toAddress, this.fromAddress, subject, message, this.altSmtpHost, debug);
             }
+            System.out.println("==========================================================");
             System.out.println("第[" + i + "]封邮件发送完成");
         }
     }

From 733005ff0a8edd06fbfb4efe9ff28ee4516160b1 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Thu, 15 Jun 2017 16:54:39 +0800
Subject: [PATCH 102/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BD=9C=E4=B8=9A?=
 =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A=E9=83=A8=E5=88=86=E5=AE=8C?=
 =?UTF-8?q?=E5=96=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/srp/original/PromotionMail.java |  7 +++---
 .../main/java/srp/refactor/PromotionMail.java | 15 ++++++++-----
 .../src/main/java/srp/refactor/mail/Mail.java | 22 +++++++++++++++----
 .../main/java/srp/refactor/util/MailUtil.java | 21 ------------------
 4 files changed, 31 insertions(+), 34 deletions(-)
 delete mode 100644 students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java

diff --git a/students/75939388/ood/src/main/java/srp/original/PromotionMail.java b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
index 4ef4df0f7a..8deec60166 100644
--- a/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
+++ b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java
@@ -3,7 +3,6 @@
 import srp.refactor.configuration.Configuration;
 import srp.refactor.configuration.ConfigurationKeys;
 import srp.refactor.util.DBUtil;
-import srp.refactor.util.MailUtil;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -175,14 +174,14 @@ protected void sendEMails(boolean debug, List mailingList) throws IOException
 				configureEMail((HashMap) iter.next());  
 				try 
 				{
-					if (toAddress.length() > 0)
-						MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+					if (toAddress.length() > 0){}
+//						MailContentUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
 				} 
 				catch (Exception e) 
 				{
 					
 					try {
-						MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
+//						MailContentUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
 						
 					} catch (Exception e2) 
 					{
diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
index 01da6b3516..4234a0ac6b 100644
--- a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
@@ -77,15 +77,20 @@ public void batchSetMails(List<String> data) throws Exception{
 
             List<HashMap> userList = DBUtil.query(sendMailQuery);
             for(HashMap userInfo : userList){
-                createMail(
-                        (String)userInfo.get(EMAIL_KEY),
-                        "您关注的" + productName + "已降价",
-                        "尊敬的 "+ userInfo.get(NAME_KEY) +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!"
-                );
+                createMail((String)userInfo.get(EMAIL_KEY),
+                        generateSubject(productName), generateMessage(userInfo, productDesc));
             }
         }
     }
 
+    private String generateSubject(String productName){
+        return "您关注的" + productName + "已降价";
+    }
+
+    private String generateMessage(HashMap userInfo, String productDesc){
+        return "尊敬的 "+ userInfo.get(NAME_KEY) +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+    }
+
     /**
      * 暂时这么实现
      */
diff --git a/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
index af5600ae21..755fe6c18d 100644
--- a/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
@@ -1,7 +1,6 @@
 package srp.refactor.mail;
 
 import org.apache.commons.lang3.StringUtils;
-import srp.refactor.util.MailUtil;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -67,7 +66,7 @@ private boolean isInit(){
     /**
      * 批量发送
      */
-    public void batchSend(boolean debug){
+    protected void batchSend(boolean debug){
         if(!isInit()){
             throw new RuntimeException("邮件客户端还未做配置");
         }
@@ -93,12 +92,27 @@ public void batchSend(boolean debug){
             System.out.println("\n正在发送第[" + i + "]封邮件");
             System.out.println("==========================================================");
             try{
-                MailUtil.sendEmail(toAddress, this.fromAddress, subject, message, this.smtpHost, debug);
+                sendEmail(toAddress, this.fromAddress, subject, message, this.smtpHost, debug);
             }catch(Exception e){
-                MailUtil.sendEmail(toAddress, this.fromAddress, subject, message, this.altSmtpHost, debug);
+                sendEmail(toAddress, this.fromAddress, subject, message, this.altSmtpHost, debug);
             }
             System.out.println("==========================================================");
             System.out.println("第[" + i + "]封邮件发送完成");
         }
     }
+
+    /**
+     * 发送邮件客户端的功能和责任，所以移入邮件客户端，但是只能被基础客户端调用
+     * 子类只能通过batchSend来发送邮件
+     */
+    private 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.print(buffer.toString());
+    }
 }
diff --git a/students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java
deleted file mode 100644
index b6c267b8b6..0000000000
--- a/students/75939388/ood/src/main/java/srp/refactor/util/MailUtil.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package srp.refactor.util;
-
-public class MailUtil {
-
-	private static final String TO_ADDRESS_KEY = "toAddress";
-	private static final String MAIL_KEY = "mail";
-
-	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.print(buffer.toString());
-		
-	}
-
-
-}

From ff755b0b070bf92ec46400cef231a17a14500bc1 Mon Sep 17 00:00:00 2001
From: '1299310140' <'13437282785@163.com'>
Date: Thu, 15 Jun 2017 17:13:35 +0800
Subject: [PATCH 103/332] test

---
 students/1299310140/src/com/Test.java | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 students/1299310140/src/com/Test.java

diff --git a/students/1299310140/src/com/Test.java b/students/1299310140/src/com/Test.java
new file mode 100644
index 0000000000..1599b83b36
--- /dev/null
+++ b/students/1299310140/src/com/Test.java
@@ -0,0 +1,5 @@
+package com;
+
+public class Test {
+
+}

From 7e796db089ea0bde77080fa62a0bc501ecd7f307 Mon Sep 17 00:00:00 2001
From: '1299310140' <'13437282785@163.com'>
Date: Thu, 15 Jun 2017 17:27:09 +0800
Subject: [PATCH 104/332] test

---
 students/1299310140/src/com/Test.java | 1 -
 1 file changed, 1 deletion(-)

diff --git a/students/1299310140/src/com/Test.java b/students/1299310140/src/com/Test.java
index 1599b83b36..2900598832 100644
--- a/students/1299310140/src/com/Test.java
+++ b/students/1299310140/src/com/Test.java
@@ -1,5 +1,4 @@
 package com;
 
 public class Test {
-
 }

From eb557b9afffbe366fcb694a96d11b0b5fcfc45bb Mon Sep 17 00:00:00 2001
From: '1299310140' <'13437282785@163.com'>
Date: Thu, 15 Jun 2017 17:34:56 +0800
Subject: [PATCH 105/332] test

---
 students/1299310140/src/com/Test.java         |   4 -
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../src/com/coderising/ood/srp/DBUtil.java    |  25 +++
 .../src/com/coderising/ood/srp/MailUtil.java  |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 278 insertions(+), 4 deletions(-)
 delete mode 100644 students/1299310140/src/com/Test.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1299310140/src/com/Test.java b/students/1299310140/src/com/Test.java
deleted file mode 100644
index 2900598832..0000000000
--- a/students/1299310140/src/com/Test.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com;
-
-public class Test {
-}
diff --git a/students/1299310140/src/com/coderising/ood/srp/Configuration.java b/students/1299310140/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..927c7155cc
--- /dev/null
+++ b/students/1299310140/src/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<String,String> 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/1299310140/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/1299310140/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..868a03ff83
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/DBUtil.java b/students/1299310140/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..65383e4dba
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/MailUtil.java b/students/1299310140/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..373f3ee306
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/PromotionMail.java b/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..94bfcbaf54
--- /dev/null
+++ b/students/1299310140/src/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/1299310140/src/com/coderising/ood/srp/product_promotion.txt b/students/1299310140/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/1299310140/src/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

From f94b7faa3329e65e9145b8761dbee6fd8ce877d7 Mon Sep 17 00:00:00 2001
From: zhangqing <13161040988@163.com>
Date: Thu, 15 Jun 2017 19:31:27 +0800
Subject: [PATCH 106/332] first

---
 students/1753179526/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/1753179526/readme.md

diff --git a/students/1753179526/readme.md b/students/1753179526/readme.md
new file mode 100644
index 0000000000..765ea98ff3
--- /dev/null
+++ b/students/1753179526/readme.md
@@ -0,0 +1 @@
+Test git commit. push-wary
\ No newline at end of file

From 3d1db9dfe7871990ba7ab6bf256dbe9f5903a00d Mon Sep 17 00:00:00 2001
From: zhangqing <13161040988@163.com>
Date: Thu, 15 Jun 2017 20:22:35 +0800
Subject: [PATCH 107/332] sdfsf

---
 students/1753179526/readme.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/students/1753179526/readme.md b/students/1753179526/readme.md
index 765ea98ff3..8bd27805d5 100644
--- a/students/1753179526/readme.md
+++ b/students/1753179526/readme.md
@@ -1 +1,3 @@
-Test git commit. push-wary
\ No newline at end of file
+﻿Test git commit. push-wary
+
+第二次提交内容，更改编码问题。
\ No newline at end of file

From 7219fef06724936ccdc3add25a8d94456f3ea564 Mon Sep 17 00:00:00 2001
From: xiaoyj <346154295@qq.com>
Date: Thu, 15 Jun 2017 20:39:13 +0800
Subject: [PATCH 108/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/346154295/ood-assignment/pom.xml     | 46 ++++++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 28 +++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 40 ++++++++++
 .../com/coderising/ood/srp/ProductInfo.java   | 25 +++++++
 .../com/coderising/ood/srp/PromotionMail.java | 73 +++++++++++++++++++
 .../src/main/resource/product_promotion.txt   |  4 +
 8 files changed, 248 insertions(+)
 create mode 100644 students/346154295/ood-assignment/pom.xml
 create mode 100644 students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
 create mode 100644 students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/346154295/ood-assignment/src/main/resource/product_promotion.txt

diff --git a/students/346154295/ood-assignment/pom.xml b/students/346154295/ood-assignment/pom.xml
new file mode 100644
index 0000000000..0853e4c187
--- /dev/null
+++ b/students/346154295/ood-assignment/pom.xml
@@ -0,0 +1,46 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/346154295/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<String,String> 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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/346154295/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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..ad72a12c22
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param productID
+	 * @return
+	 */
+	public static List<HashMap<String,String>> loadMailingList(String productID){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+		List<HashMap<String,String>> 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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..f9627d307e
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+	private static String smtpHost;
+	private static String altSmtpHost;
+	private static String fromAddress;
+
+	public static void init() {
+		Configuration config = new Configuration();
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	private static void sendEmail(String toAddress, 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());
+		
+	}
+	public static void sendEmail(String toAddress, String subject, String message, boolean debug) {
+		if(toAddress == null || toAddress.length() == 0) {
+			return;
+		}
+		try {
+			sendEmail(toAddress,subject,message,smtpHost,debug);
+		} catch (Exception e) {
+			try {
+				sendEmail(toAddress, subject, message, altSmtpHost, debug);
+			} catch (Exception e2){
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+	}
+}
diff --git a/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..e3719a503d
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by xiaoyj on 2017/6/15.
+ */
+public class ProductInfo {
+    private String productID;
+    private String 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/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..e7530dbc55
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,73 @@
+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;
+
+public class PromotionMail {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+
+	public static void main(String[] args) throws Exception {
+		boolean emailDebug = false;
+        File file = new File("src/main/resource/product_promotion.txt");
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        ProductInfo productInfo = getProductInfo(file);
+        List<HashMap<String, String>> mailingList = DBUtil.loadMailingList(productInfo.getProductID());
+        sendEMails(emailDebug, mailingList, productInfo);
+
+	}
+
+	private static String getMessage(HashMap<String,String> userInfo, ProductInfo productInfo) throws IOException
+	{
+		String name = userInfo.get(NAME_KEY);
+		return "尊敬的 "+name+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!" ;
+	}
+	private static String getSubject() {
+	    return "您关注的产品降价了";
+    }
+
+	protected static void sendEMails(boolean debug, List<HashMap<String,String>> mailingList, ProductInfo productInfo) throws IOException {
+		System.out.println("开始发送邮件");
+        MailUtil.init();
+		if (mailingList != null) {
+            for (HashMap<String, String> userInfo : mailingList) {
+                String toAddress = userInfo.get(EMAIL_KEY);
+                if (toAddress == null || toAddress.length() == 0) {
+                    continue;
+                }
+                String subject = getSubject();
+                String message =getMessage(userInfo, productInfo);
+                MailUtil.sendEmail(toAddress, subject, message, debug);
+            }
+
+		} else {
+			System.out.println("没有邮件发送");
+			
+		}
+	}
+    private static ProductInfo getProductInfo(File file) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            ProductInfo productInfo = new ProductInfo();
+            productInfo.setProductID(data[0]);
+            productInfo.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + productInfo.getProductID() + "\n");
+            System.out.println("产品描述 = " + productInfo.getProductDesc() + "\n");
+            return productInfo;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/346154295/ood-assignment/src/main/resource/product_promotion.txt b/students/346154295/ood-assignment/src/main/resource/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/346154295/ood-assignment/src/main/resource/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 46f1d05a4289fbec35c57d89acf5f793ca41083f Mon Sep 17 00:00:00 2001
From: zhangqing <13161040988@163.com>
Date: Thu, 15 Jun 2017 21:30:43 +0800
Subject: [PATCH 109/332] Test command line

---
 students/1753179526/readme.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/students/1753179526/readme.md b/students/1753179526/readme.md
index 8bd27805d5..0eb59149a8 100644
--- a/students/1753179526/readme.md
+++ b/students/1753179526/readme.md
@@ -1,3 +1,5 @@
 ﻿Test git commit. push-wary
 
-第二次提交内容，更改编码问题。
\ No newline at end of file
+第二次提交内容，更改编码问题。
+
+增加new line 测试命令行
\ No newline at end of file

From fa6d4c16e5eec61654e54b39398aec0620fae22b Mon Sep 17 00:00:00 2001
From: penglei <leipengzj@163.com>
Date: Thu, 15 Jun 2017 22:41:17 +0800
Subject: [PATCH 110/332] my first git with IDEA

---
 .../799298900/src/com/leipengzj/myfirstGitFork.java    | 10 ++++++++++
 1 file changed, 10 insertions(+)
 create mode 100644 students/799298900/src/com/leipengzj/myfirstGitFork.java

diff --git a/students/799298900/src/com/leipengzj/myfirstGitFork.java b/students/799298900/src/com/leipengzj/myfirstGitFork.java
new file mode 100644
index 0000000000..a87099c226
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/myfirstGitFork.java
@@ -0,0 +1,10 @@
+package com.leipengzj;
+
+/**
+ * Created by tyrion on 2017/6/15.
+ */
+public class myfirstGitFork {
+    public static void main(String[] args) {
+        System.out.println("myfirst git");
+    }
+}

From a0569f57ae17ea2633270f782e75f16c7cdff22a Mon Sep 17 00:00:00 2001
From: lx520 <740707954@qq,com>
Date: Thu, 15 Jun 2017 23:28:08 +0800
Subject: [PATCH 111/332] =?UTF-8?q?update=202017=E5=B9=B46=E6=9C=8815?=
 =?UTF-8?q?=E6=97=A5=2023:28:01?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/ood/newSrp/Configuration.java         |  25 +++
 students/740707954/src/ood/newSrp/DBUtil.java |  25 +++
 .../740707954/src/ood/newSrp/MailUtil.java    |  18 ++
 .../src/ood/newSrp/PromotionMail.java         | 181 ++++++++++++++++++
 .../src/ood/newSrp/product_promotion.txt      |   4 +
 .../src/ood/oldSrp/Configuration.java         |  23 +++
 .../src/ood/oldSrp/ConfigurationKeys.java     |   9 +
 students/740707954/src/ood/oldSrp/DBUtil.java |  25 +++
 .../740707954/src/ood/oldSrp/MailUtil.java    |  18 ++
 .../src/ood/oldSrp/PromotionMail.java         | 180 +++++++++++++++++
 .../src/ood/oldSrp/product_promotion.txt      |   4 +
 11 files changed, 512 insertions(+)
 create mode 100644 students/740707954/src/ood/newSrp/Configuration.java
 create mode 100644 students/740707954/src/ood/newSrp/DBUtil.java
 create mode 100644 students/740707954/src/ood/newSrp/MailUtil.java
 create mode 100644 students/740707954/src/ood/newSrp/PromotionMail.java
 create mode 100644 students/740707954/src/ood/newSrp/product_promotion.txt
 create mode 100644 students/740707954/src/ood/oldSrp/Configuration.java
 create mode 100644 students/740707954/src/ood/oldSrp/ConfigurationKeys.java
 create mode 100644 students/740707954/src/ood/oldSrp/DBUtil.java
 create mode 100644 students/740707954/src/ood/oldSrp/MailUtil.java
 create mode 100644 students/740707954/src/ood/oldSrp/PromotionMail.java
 create mode 100644 students/740707954/src/ood/oldSrp/product_promotion.txt

diff --git a/students/740707954/src/ood/newSrp/Configuration.java b/students/740707954/src/ood/newSrp/Configuration.java
new file mode 100644
index 0000000000..c2721b9a29
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/Configuration.java
@@ -0,0 +1,25 @@
+package ood.newSrp;
+import ood.oldSrp.ConfigurationKeys;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/740707954/src/ood/newSrp/DBUtil.java b/students/740707954/src/ood/newSrp/DBUtil.java
new file mode 100644
index 0000000000..0022cb74b0
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/DBUtil.java
@@ -0,0 +1,25 @@
+package ood.newSrp;
+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/740707954/src/ood/newSrp/MailUtil.java b/students/740707954/src/ood/newSrp/MailUtil.java
new file mode 100644
index 0000000000..a6ec476715
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/MailUtil.java
@@ -0,0 +1,18 @@
+package ood.newSrp;
+
+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/740707954/src/ood/newSrp/PromotionMail.java b/students/740707954/src/ood/newSrp/PromotionMail.java
new file mode 100644
index 0000000000..9ca48b6db6
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/PromotionMail.java
@@ -0,0 +1,181 @@
+package ood.newSrp;
+
+import ood.oldSrp.ConfigurationKeys;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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(System.getProperty("user.dir") + "/src/ood/oldSrp/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 {
+        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/740707954/src/ood/newSrp/product_promotion.txt b/students/740707954/src/ood/newSrp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/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/740707954/src/ood/oldSrp/Configuration.java b/students/740707954/src/ood/oldSrp/Configuration.java
new file mode 100644
index 0000000000..9a1a4d075c
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/Configuration.java
@@ -0,0 +1,23 @@
+package ood.oldSrp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/740707954/src/ood/oldSrp/ConfigurationKeys.java b/students/740707954/src/ood/oldSrp/ConfigurationKeys.java
new file mode 100644
index 0000000000..154ea2c77c
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package ood.oldSrp;
+
+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/740707954/src/ood/oldSrp/DBUtil.java b/students/740707954/src/ood/oldSrp/DBUtil.java
new file mode 100644
index 0000000000..2397e15ad1
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/DBUtil.java
@@ -0,0 +1,25 @@
+package ood.oldSrp;
+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/740707954/src/ood/oldSrp/MailUtil.java b/students/740707954/src/ood/oldSrp/MailUtil.java
new file mode 100644
index 0000000000..71c229b37d
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/MailUtil.java
@@ -0,0 +1,18 @@
+package ood.oldSrp;
+
+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/740707954/src/ood/oldSrp/PromotionMail.java b/students/740707954/src/ood/oldSrp/PromotionMail.java
new file mode 100644
index 0000000000..2edbd5bf46
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/PromotionMail.java
@@ -0,0 +1,180 @@
+package ood.oldSrp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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(System.getProperty("user.dir") + "/src/ood/oldSrp/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/740707954/src/ood/oldSrp/product_promotion.txt b/students/740707954/src/ood/oldSrp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/740707954/src/ood/oldSrp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From b0b1e977ade3e955e81d8e570cbf7a52d2c4f3fc Mon Sep 17 00:00:00 2001
From: lx520 <740707954@qq,com>
Date: Fri, 16 Jun 2017 00:02:26 +0800
Subject: [PATCH 112/332] =?UTF-8?q?update=202017=E5=B9=B46=E6=9C=8816?=
 =?UTF-8?q?=E6=97=A5=2000:02:20?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/740707954/src/ood/newSrp/FileUtil.java    | 13 +++++++++++++
 .../740707954/src/ood/newSrp/PromotionMail.java    |  3 +++
 .../src/ood/newSrp/entity/MainSmtpServer.java      |  8 ++++++++
 .../740707954/src/ood/newSrp/entity/Notify.java    | 14 ++++++++++++++
 .../740707954/src/ood/newSrp/entity/Product.java   | 10 ++++++++++
 .../src/ood/newSrp/entity/SmtpServer.java          |  8 ++++++++
 .../src/ood/newSrp/entity/TempSmtpServer.java      |  8 ++++++++
 7 files changed, 64 insertions(+)
 create mode 100644 students/740707954/src/ood/newSrp/FileUtil.java
 create mode 100644 students/740707954/src/ood/newSrp/entity/MainSmtpServer.java
 create mode 100644 students/740707954/src/ood/newSrp/entity/Notify.java
 create mode 100644 students/740707954/src/ood/newSrp/entity/Product.java
 create mode 100644 students/740707954/src/ood/newSrp/entity/SmtpServer.java
 create mode 100644 students/740707954/src/ood/newSrp/entity/TempSmtpServer.java

diff --git a/students/740707954/src/ood/newSrp/FileUtil.java b/students/740707954/src/ood/newSrp/FileUtil.java
new file mode 100644
index 0000000000..57508724a6
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/FileUtil.java
@@ -0,0 +1,13 @@
+package ood.newSrp;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Created by Administrator on 2017/6/16 0016.
+ */
+public class FileUtil {
+    protected void readFile(File file) throws IOException {
+
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/PromotionMail.java b/students/740707954/src/ood/newSrp/PromotionMail.java
index 9ca48b6db6..018f1aa8b9 100644
--- a/students/740707954/src/ood/newSrp/PromotionMail.java
+++ b/students/740707954/src/ood/newSrp/PromotionMail.java
@@ -10,6 +10,9 @@
 import java.util.Iterator;
 import java.util.List;
 
+/**
+ *  promotion 提升
+ */
 public class PromotionMail {
 
 
diff --git a/students/740707954/src/ood/newSrp/entity/MainSmtpServer.java b/students/740707954/src/ood/newSrp/entity/MainSmtpServer.java
new file mode 100644
index 0000000000..0e4cfa40bc
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/MainSmtpServer.java
@@ -0,0 +1,8 @@
+package ood.newSrp.entity;
+
+/**
+ * 主要服务器
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class MainSmtpServer implements SmtpServer {
+}
diff --git a/students/740707954/src/ood/newSrp/entity/Notify.java b/students/740707954/src/ood/newSrp/entity/Notify.java
new file mode 100644
index 0000000000..aa2caa1049
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/Notify.java
@@ -0,0 +1,14 @@
+package ood.newSrp.entity;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+/**
+ * 通知表
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class Notify {
+    protected void setMessage(HashMap userInfo) throws IOException {
+
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/entity/Product.java b/students/740707954/src/ood/newSrp/entity/Product.java
new file mode 100644
index 0000000000..e1851c1526
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/Product.java
@@ -0,0 +1,10 @@
+package ood.newSrp.entity;
+
+/**
+ * 产品
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class Product {
+    protected String productID = null;
+    protected String productDesc = null;
+}
diff --git a/students/740707954/src/ood/newSrp/entity/SmtpServer.java b/students/740707954/src/ood/newSrp/entity/SmtpServer.java
new file mode 100644
index 0000000000..0e1ede3dda
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/SmtpServer.java
@@ -0,0 +1,8 @@
+package ood.newSrp.entity;
+
+/**
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public interface SmtpServer {
+    String address = "";
+}
diff --git a/students/740707954/src/ood/newSrp/entity/TempSmtpServer.java b/students/740707954/src/ood/newSrp/entity/TempSmtpServer.java
new file mode 100644
index 0000000000..01321fbf7a
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/TempSmtpServer.java
@@ -0,0 +1,8 @@
+package ood.newSrp.entity;
+
+/**
+ * 备用服务器
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class TempSmtpServer implements SmtpServer {
+}

From ade018b6ec8dc72807404b446c995bc4ef4e3863 Mon Sep 17 00:00:00 2001
From: Ken-W-P-Huang <hwp0415229@sina.cn>
Date: Fri, 16 Jun 2017 09:29:44 +0800
Subject: [PATCH 113/332] Create src

---
 students/395860968/ood-assignment/src | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/395860968/ood-assignment/src

diff --git a/students/395860968/ood-assignment/src b/students/395860968/ood-assignment/src
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/students/395860968/ood-assignment/src
@@ -0,0 +1 @@
+

From ed59f2dc11fbfc1b16e158792e0aec914cbef278 Mon Sep 17 00:00:00 2001
From: Ken-W-P-Huang <hwp0415229@sina.cn>
Date: Fri, 16 Jun 2017 09:30:44 +0800
Subject: [PATCH 114/332] Add files via upload

---
 .../ood-assignment/Configuration.java         | 24 +++++++++
 .../ood-assignment/ConfigurationKeys.java     |  9 ++++
 students/395860968/ood-assignment/DBUtil.java | 25 +++++++++
 .../395860968/ood-assignment/FileUtil.java    | 33 ++++++++++++
 .../395860968/ood-assignment/MailUtil.java    | 52 +++++++++++++++++++
 .../395860968/ood-assignment/Product.java     | 21 ++++++++
 .../ood-assignment/PromotionMail.java         | 44 ++++++++++++++++
 .../ood-assignment/product_promotion.txt      |  4 ++
 8 files changed, 212 insertions(+)
 create mode 100644 students/395860968/ood-assignment/Configuration.java
 create mode 100644 students/395860968/ood-assignment/ConfigurationKeys.java
 create mode 100644 students/395860968/ood-assignment/DBUtil.java
 create mode 100644 students/395860968/ood-assignment/FileUtil.java
 create mode 100644 students/395860968/ood-assignment/MailUtil.java
 create mode 100644 students/395860968/ood-assignment/Product.java
 create mode 100644 students/395860968/ood-assignment/PromotionMail.java
 create mode 100644 students/395860968/ood-assignment/product_promotion.txt

diff --git a/students/395860968/ood-assignment/Configuration.java b/students/395860968/ood-assignment/Configuration.java
new file mode 100644
index 0000000000..44c566fcaa
--- /dev/null
+++ b/students/395860968/ood-assignment/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/395860968/ood-assignment/ConfigurationKeys.java b/students/395860968/ood-assignment/ConfigurationKeys.java
new file mode 100644
index 0000000000..868a03ff83
--- /dev/null
+++ b/students/395860968/ood-assignment/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/395860968/ood-assignment/DBUtil.java b/students/395860968/ood-assignment/DBUtil.java
new file mode 100644
index 0000000000..65383e4dba
--- /dev/null
+++ b/students/395860968/ood-assignment/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/395860968/ood-assignment/FileUtil.java b/students/395860968/ood-assignment/FileUtil.java
new file mode 100644
index 0000000000..9a1a468c10
--- /dev/null
+++ b/students/395860968/ood-assignment/FileUtil.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by kenhuang on 2017/6/15.
+ */
+public class FileUtil {
+    private static final String FILE_PATH="/Users/kenhuang/Desktop/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt";
+    private static File f = new File(FileUtil.FILE_PATH);
+    protected static Product readFile() throws IOException // @02C
+    {
+        BufferedReader br = null;
+        Product resultProduct;
+        try {
+            br = new BufferedReader(new FileReader(f));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            resultProduct = new Product(data[0],data[1]);
+            System.out.println("产品ID = " + resultProduct.productID + "\n");
+            System.out.println("产品描述 = " + resultProduct.productDesc + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return resultProduct;
+    }
+}
diff --git a/students/395860968/ood-assignment/MailUtil.java b/students/395860968/ood-assignment/MailUtil.java
new file mode 100644
index 0000000000..e62f40ead8
--- /dev/null
+++ b/students/395860968/ood-assignment/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+
+
+public class MailUtil {
+	protected String smtpHost = null;
+	protected String altSmtpHost = null;
+	public MailUtil(String smtpHost, String altSmtpHost) {
+		this.smtpHost = smtpHost;
+		this.altSmtpHost = altSmtpHost;
+	}
+	private 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());
+
+	}
+	public  void sendPromotionMail(boolean debug, PromotionMail mail) throws IOException {
+		System.out.println("开始发送邮件");
+		String toAddress;
+		String message;
+		if (mail.toAddressList != null) {
+			while (mail.hasNextToAddress()) {
+				toAddress = mail.getNextToAddress();
+				if (toAddress.length() > 0){
+					message = mail.generateMessageToCurrentToAddress();
+					try {
+							MailUtil.sendEmail(toAddress, mail.fromAddress, mail.subject, message, this.smtpHost, debug);
+					}
+					catch (Exception e) {
+						try {
+							MailUtil.sendEmail(toAddress, mail.fromAddress, mail.subject, message, this.altSmtpHost, debug);
+
+						} catch (Exception e2) {
+							System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+						}
+					}
+				}else {
+					System.out.println("目标地址为空");
+				}
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/395860968/ood-assignment/Product.java b/students/395860968/ood-assignment/Product.java
new file mode 100644
index 0000000000..27ce7b0ef1
--- /dev/null
+++ b/students/395860968/ood-assignment/Product.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by kenhuang on 2017/6/15.
+ */
+public class Product {
+    protected String productID = null;
+    protected String productDesc = null;
+   // protected String sendMailQuery = null;
+    public Product(String productID, String productDesc) {
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+    protected String generateLoadQuery() {
+        System.out.println("loadQuery set");
+        return  "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+    }
+}
diff --git a/students/395860968/ood-assignment/PromotionMail.java b/students/395860968/ood-assignment/PromotionMail.java
new file mode 100644
index 0000000000..f62a56c295
--- /dev/null
+++ b/students/395860968/ood-assignment/PromotionMail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+public class PromotionMail {
+	protected String fromAddress = null;
+	protected List toAddressList = null;
+	protected String subject = "您关注的产品降价了";
+	protected String message = null;
+	private Product product;
+	private int toAddressListIndex = -1 ;
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	public static void main(String[] args) throws Exception {
+		Product product = FileUtil.readFile();
+		if (product != null) {
+			boolean emailDebug = false;
+			Configuration config = new Configuration();
+			MailUtil mailUtil = new MailUtil(config.getProperty(ConfigurationKeys.SMTP_SERVER),
+					config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+			PromotionMail mail = new PromotionMail(config.getProperty(ConfigurationKeys.EMAIL_ADMIN),product);
+			mailUtil.sendPromotionMail(emailDebug,mail);
+		}
+	}
+	public PromotionMail(String fromAddress,Product product) throws Exception {
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		this.fromAddress = fromAddress;
+		this.product = product;
+		this.toAddressList = DBUtil.query(this.product.generateLoadQuery());
+	}
+	public boolean hasNextToAddress(){
+		return this.toAddressListIndex < this.toAddressList.size() - 1;
+	}
+	public String getNextToAddress(){
+		HashMap map = (HashMap)this.toAddressList.get(++this.toAddressListIndex);
+		return (String)map.get(EMAIL_KEY);
+	}
+	protected String generateMessageToCurrentToAddress() throws IOException {
+		HashMap map = (HashMap)this.toAddressList.get(this.toAddressListIndex);
+		String name = (String) map.get(NAME_KEY);
+		return  "尊敬的 "+name+", 您关注的产品 " + this.product.productDesc + " 降价了，欢迎购买!" ;
+	}
+}
diff --git a/students/395860968/ood-assignment/product_promotion.txt b/students/395860968/ood-assignment/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/395860968/ood-assignment/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 1aa32156840c66d4e3358815cbf5ecc278ed0189 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Fri, 16 Jun 2017 09:40:52 +0800
Subject: [PATCH 115/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BD=9C=E4=B8=9A?=
 =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/srp/refactor/PromotionMail.java | 22 +++++++++----------
 .../ood/src/test/java/srp/SrpTest.java        |  4 +++-
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
index 4234a0ac6b..c4eb49c1e7 100644
--- a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
+++ b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
@@ -65,7 +65,12 @@ protected void setLoadQuery() throws Exception {
         System.out.println("loadQuery set, productID -> " + productID);
     }
 
-    public void batchSetMails(List<String> data) throws Exception{
+    /**
+     * 批量编写邮件
+     * @param data 从文件中获取的产品促销信息的list
+     * @throws Exception 查询sql时报的异常，这里选择不处理
+     */
+    public void batchWrite(List<String> data) throws Exception{
         if(data.isEmpty()){
             throw new RuntimeException("data不能为空");
         }
@@ -77,20 +82,15 @@ public void batchSetMails(List<String> data) throws Exception{
 
             List<HashMap> userList = DBUtil.query(sendMailQuery);
             for(HashMap userInfo : userList){
-                createMail((String)userInfo.get(EMAIL_KEY),
-                        generateSubject(productName), generateMessage(userInfo, productDesc));
+                String add = (String)userInfo.get(EMAIL_KEY);
+                String subj = "您关注的" + productName + "已降价";
+                String msg = "尊敬的 "+ userInfo.get(NAME_KEY) +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+
+                createMail(add, subj, msg);
             }
         }
     }
 
-    private String generateSubject(String productName){
-        return "您关注的" + productName + "已降价";
-    }
-
-    private String generateMessage(HashMap userInfo, String productDesc){
-        return "尊敬的 "+ userInfo.get(NAME_KEY) +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
-    }
-
     /**
      * 暂时这么实现
      */
diff --git a/students/75939388/ood/src/test/java/srp/SrpTest.java b/students/75939388/ood/src/test/java/srp/SrpTest.java
index 843d0b03f3..19d5387df6 100644
--- a/students/75939388/ood/src/test/java/srp/SrpTest.java
+++ b/students/75939388/ood/src/test/java/srp/SrpTest.java
@@ -15,6 +15,8 @@ public class SrpTest {
 
     PromotionMail promotionMail = null;
 
+    private static int in = 0;
+
     @Before
     public void init(){
 
@@ -30,7 +32,7 @@ public void runTrial() throws Exception{
         List<String> data = FileUtil.readFile(file);
 
         PromotionMail promotionMail = new PromotionMail();
-        promotionMail.batchSetMails(data);
+        promotionMail.batchWrite(data);
         promotionMail.send();
     }
 }

From fc0dd13723414db4a60d415e6ccd6a5d7ac1bb05 Mon Sep 17 00:00:00 2001
From: GordenChow <513274874@qq.com>
Date: Fri, 16 Jun 2017 10:34:33 +0800
Subject: [PATCH 116/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=AD=A3=E7=AC=AC?=
 =?UTF-8?q?=E4=B8=80=E6=AC=A1=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/513274874/ood/ood-assignment/pom.xml | 32 +++++++
 .../com/coderising/ood/srp/Configuration.java | 74 +++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 89 +++++++++++++++++++
 .../ood/srp/constants/ConfigurationKeys.java  |  9 ++
 .../java/com/coderising/ood/srp/dto/Mail.java | 43 +++++++++
 .../com/coderising/ood/srp/dto/Product.java   | 29 ++++++
 .../java/com/coderising/ood/srp/dto/User.java | 30 +++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 .../com/coderising/ood/srp/util/DBUtil.java   | 39 ++++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 37 ++++++++
 10 files changed, 386 insertions(+)
 create mode 100644 students/513274874/ood/ood-assignment/pom.xml
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java

diff --git a/students/513274874/ood/ood-assignment/pom.xml b/students/513274874/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..b4cacc1958
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.constants.ConfigurationKeys;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	protected String smtpHost = null;
+	protected String altSmtpHost = null;
+	protected String fromAddress = null;
+
+	private static Configuration configuration = null;
+	static Map<String,String> configurations = new HashMap<String,String>();
+	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");
+	}
+
+
+	public static Configuration getInstance(){
+
+		if(configuration == null) {
+			return new Configuration();
+		}
+		return configuration;
+	}
+
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+	private Configuration() {
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+
+	protected void setSMTPHost()
+	{
+		smtpHost = getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+
+	protected void setAltSMTPHost()
+	{
+		altSmtpHost = getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+	}
+
+	protected void setFromAddress() {
+		fromAddress = getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	public String getSmtpHost() {
+		return smtpHost;
+	}
+
+	public String getAltSmtpHost() {
+		return altSmtpHost;
+	}
+
+	public String getFromAddress() {
+		return fromAddress;
+	}
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..3f7d7bbee9
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,89 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.dto.Mail;
+import com.coderising.ood.srp.dto.Product;
+import com.coderising.ood.srp.dto.User;
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+    protected Product product = new Product();
+
+    private static Configuration config;
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File("/Users/guodongchow/Desktop/coding2017/projects/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 = Configuration.getInstance();
+
+        sendEMails(mailDebug, loadMailingList());
+    }
+
+    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(" ");
+
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID());
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+    protected Mail configureEMail(User user, Product product) throws IOException {
+        return new Mail(user, product);
+    }
+
+    protected List loadMailingList() throws Exception {
+        return DBUtil.query();
+    }
+
+
+    protected void sendEMails(boolean debug, List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件"+ ":\n");
+
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                Mail mail = configureEMail((User) iter.next(), product);
+                if (mail.getToAddress().length() > 0)
+                    MailUtil.sendEmail(mail, config, debug);
+            }
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java
new file mode 100644
index 0000000000..9932bf60f4
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constants/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.constants;
+
+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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java
new file mode 100644
index 0000000000..e160e39038
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Mail.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.dto;
+
+import java.io.IOException;
+
+/**
+ * Created by guodongchow on 2017/6/15.
+ */
+public class Mail {
+    protected String toAddress = null;
+    protected String subject = null;
+    protected String message = null;
+
+    protected void setMessage(User userInfo,Product product) throws IOException
+    {
+
+        String name = userInfo.getName();
+
+        subject = "您关注的产品降价了";
+        message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+        
+    }
+
+    public Mail(User userInfo,Product product){
+        try {
+            setMessage(userInfo,product);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        toAddress = userInfo.getMailAddress();
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java
new file mode 100644
index 0000000000..0684794a72
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/Product.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.dto;
+
+/**
+ * Created by guodongchow on 2017/6/15.
+ */
+public class Product {
+
+    String productID;
+    String productDesc;
+
+    public void setProductID(String productID)
+    {
+        this.productID = productID;
+
+    }
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java
new file mode 100644
index 0000000000..89b98d226d
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dto/User.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp.dto;
+
+/**
+ * Created by guodongchow on 2017/6/15.
+ */
+public class User {
+    String name;
+    String mailAddress;
+
+    public User(String name, String mailAddress) {
+        this.name = name;
+        this.mailAddress = mailAddress;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMailAddress() {
+        return mailAddress;
+    }
+
+    public void setMailAddress(String mailAddress) {
+        this.mailAddress = mailAddress;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/513274874/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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..d2848fe5b1
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.dto.Product;
+import com.coderising.ood.srp.dto.User;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	protected String sendMailQuery = null;
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @return
+	 */
+	public static List query(){
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			HashMap userInfo = new HashMap();
+
+			userList.add(new User("User"+i,"aa@bb.com"));
+		}
+
+		return userList;
+	}
+
+	protected void setLoadQuery( Product product) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() + "' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set"+ "\n");
+	}
+
+
+
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..5d6ec25bbb
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.Configuration;
+import com.coderising.ood.srp.dto.Mail;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail,Configuration config,
+			boolean debug) {
+
+		StringBuilder buffer = new StringBuilder();
+		try {
+			//假装发了一封邮件
+			buffer.append("With SmtpHost:").append(config.getSmtpHost()).append("\n");
+
+		}catch (Exception e){
+			try {
+				//假装发了一封邮件
+				buffer.append("With AltSmtpHost:").append(config.getAltSmtpHost()).append(":\n");
+
+			} catch (Exception e2)
+			{
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+
+		buffer.append("From:").append(config.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}

From 68cba4bd0fd062920aa7af0e8696ca0a90291752 Mon Sep 17 00:00:00 2001
From: macvis <macvis@126.com>
Date: Fri, 16 Jun 2017 11:01:09 +0800
Subject: [PATCH 117/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E9=87=8D?=
 =?UTF-8?q?=E6=9E=84,=20=E8=81=8C=E8=B4=A3=E6=9E=84=E5=BB=BA=E6=9B=B4?=
 =?UTF-8?q?=E6=98=8E=E7=A1=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/srp/refactor/PromotionMail.java | 101 ---------------
 .../srp/refactor/PromotionMailClient.java     |  72 +++++++++++
 .../java/srp/refactor/domain/Product.java     |  30 +++++
 .../main/java/srp/refactor/domain/User.java   |  30 +++++
 .../src/main/java/srp/refactor/mail/Mail.java | 118 ------------------
 .../java/srp/refactor/mail/MailClient.java    |  95 ++++++++++++++
 .../srp/refactor/services/MailService.java    |  66 ++++++++++
 .../srp/refactor/services/ProductService.java |  38 ++++++
 .../srp/refactor/services/UserService.java    |  31 +++++
 .../java/srp/refactor/util/Constants.java     |  21 ++++
 .../ood/src/test/java/srp/SrpTest.java        |  13 +-
 11 files changed, 391 insertions(+), 224 deletions(-)
 delete mode 100644 students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/domain/Product.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/domain/User.java
 delete mode 100644 students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/services/MailService.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/services/UserService.java
 create mode 100644 students/75939388/ood/src/main/java/srp/refactor/util/Constants.java

diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
deleted file mode 100644
index c4eb49c1e7..0000000000
--- a/students/75939388/ood/src/main/java/srp/refactor/PromotionMail.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package srp.refactor;
-
-import org.apache.commons.lang3.StringUtils;
-import srp.refactor.configuration.Configuration;
-import srp.refactor.configuration.ConfigurationKeys;
-import srp.refactor.mail.Mail;
-import srp.refactor.util.DBUtil;
-
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * 在原有的Mail邮件功能的基础上修改而来的促销邮件发送端
- *
- * Created by Tee on 2017/6/15.
- */
-public class PromotionMail extends Mail {
-
-    protected String productID = null;
-    protected String productDesc = null;
-    protected String sendMailQuery = null;
-
-    private static Configuration config = new Configuration();
-
-    private final static String NAME_KEY = "NAME";
-    private final static String EMAIL_KEY = "EMAIL";
-
-    private void init(){
-        super.initMailSettings(
-                config.getProperty(ConfigurationKeys.SMTP_SERVER),
-                config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER),
-                config.getProperty(ConfigurationKeys.EMAIL_ADMIN)
-        );
-    }
-
-    public PromotionMail(){
-        init();
-    }
-
-    @Override
-    public void createMail(String toAddress, String subject, String message){
-        this.toAddress = toAddress;
-        this.subject = subject;
-        this.message = message;
-        super.addToMailList();
-    }
-
-    public void setProductPromotion(String productID, String productDesc) throws Exception{
-        this.productID = productID;
-        this.productDesc = productDesc;
-    }
-
-    /**
-     * 模拟数据库查询
-     */
-    protected void setLoadQuery() throws Exception {
-        if(StringUtils.isBlank(productID)){
-            throw new RuntimeException("没有获取到productID");
-        }
-
-        sendMailQuery = "Select name from subscriptions "
-                + "where product_id= '" + productID +"' "
-                + "and send_mail=1 ";
-
-        System.out.println("loadQuery set, productID -> " + productID);
-    }
-
-    /**
-     * 批量编写邮件
-     * @param data 从文件中获取的产品促销信息的list
-     * @throws Exception 查询sql时报的异常，这里选择不处理
-     */
-    public void batchWrite(List<String> data) throws Exception{
-        if(data.isEmpty()){
-            throw new RuntimeException("data不能为空");
-        }
-        for(int i = 0; i < data.size(); i+=2){
-            String productId = data.get(i);
-            String productName = data.get(i+1);
-            setProductPromotion(productId, productName);
-            setLoadQuery();
-
-            List<HashMap> userList = DBUtil.query(sendMailQuery);
-            for(HashMap userInfo : userList){
-                String add = (String)userInfo.get(EMAIL_KEY);
-                String subj = "您关注的" + productName + "已降价";
-                String msg = "尊敬的 "+ userInfo.get(NAME_KEY) +", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
-
-                createMail(add, subj, msg);
-            }
-        }
-    }
-
-    /**
-     * 暂时这么实现
-     */
-    @Override
-    public void send(){
-        super.batchSend(false);
-    }
-}
\ No newline at end of file
diff --git a/students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java b/students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java
new file mode 100644
index 0000000000..6335f4f86e
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/PromotionMailClient.java
@@ -0,0 +1,72 @@
+package srp.refactor;
+
+import srp.refactor.configuration.Configuration;
+import srp.refactor.configuration.ConfigurationKeys;
+import srp.refactor.domain.Product;
+import srp.refactor.domain.User;
+import srp.refactor.mail.MailClient;
+import srp.refactor.services.ProductService;
+import srp.refactor.services.UserService;
+
+import java.util.List;
+
+/**
+ * 在原有的MailClient邮件功能的基础上修改而来的促销邮件发送端
+ *
+ * 根据SRP原则，这个邮件客户端只有两个职责：
+ *     解析传进来的List<Product>，然后批量保存至超类的待发送邮件列表中
+ *     全部解析完成(数据量较大时需要设置阈值)后
+ *     由用户发起发送请求
+ *
+ * Created by Tee on 2017/6/15.
+ */
+public class PromotionMailClient extends MailClient {
+
+    private static Configuration config = new Configuration();
+
+    private UserService userService = new UserService();
+    private ProductService productService = new ProductService();
+
+    private void init(){
+        super.initMailSettings(
+                config.getProperty(ConfigurationKeys.SMTP_SERVER),
+                config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER),
+                config.getProperty(ConfigurationKeys.EMAIL_ADMIN)
+        );
+    }
+
+    public PromotionMailClient(){
+        init();
+    }
+
+    @Override
+    public void createMail(String toAddress, String subject, String message){
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+        super.addToMailList();
+    }
+
+    /**
+     * 批量编写邮件
+     * @param promotionProducts 促销中的所有产品
+     * @throws Exception 查询sql时报的异常，这里选择不处理
+     */
+    public void batchWrite(List<Product> promotionProducts) throws Exception{
+        if(promotionProducts.isEmpty()){
+            throw new RuntimeException("没有商品待促销不能为空");
+        }
+        for(Product product : promotionProducts){
+            String querySql = productService.getLoadQuerySql(product.getProductId());
+            List<User> userList = userService.getUserList(querySql);
+            for(User user : userList){
+                String add = user.getEmail();
+                String subj = "您关注的" + product.getProductDesc() + "已降价";
+                String msg = "尊敬的 "+ user.getName() +", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+                createMail(add, subj, msg);
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/students/75939388/ood/src/main/java/srp/refactor/domain/Product.java b/students/75939388/ood/src/main/java/srp/refactor/domain/Product.java
new file mode 100644
index 0000000000..955ab28490
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/domain/Product.java
@@ -0,0 +1,30 @@
+package srp.refactor.domain;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class Product {
+    private String productId;
+    private String productDesc;
+
+    public Product(String productId, String productDesc){
+        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/75939388/ood/src/main/java/srp/refactor/domain/User.java b/students/75939388/ood/src/main/java/srp/refactor/domain/User.java
new file mode 100644
index 0000000000..4167396f89
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/domain/User.java
@@ -0,0 +1,30 @@
+package srp.refactor.domain;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class User {
+    private String name;
+    private String email;
+
+    public User(String name, String email){
+        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/75939388/ood/src/main/java/srp/refactor/mail/Mail.java b/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
deleted file mode 100644
index 755fe6c18d..0000000000
--- a/students/75939388/ood/src/main/java/srp/refactor/mail/Mail.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package srp.refactor.mail;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * 具有初始化设置、可以批量发送邮件的邮件客户端
- *
- * Created by Tee on 2017/6/15.
- */
-public abstract class Mail {
-    protected String smtpHost = null;
-    protected String altSmtpHost = null;
-    protected String fromAddress = null;
-    protected String toAddress = null;
-    protected String subject = null;
-    protected String message = null;
-
-    private static final String TO_ADDRESS_KEY = "toAddress";
-    private static final String SUBJECT_KEY = "subject";
-    private static final String MESSAGE_KEY = "message";
-
-    protected List<HashMap> mailList;
-
-    /**
-     * 初始化邮件设置
-     *
-     * @param smtpHost smtp主机
-     * @param altSmtpHost 备用smtp主机
-     * @param fromAddress 发件人地址
-     */
-    protected void initMailSettings(String smtpHost, String altSmtpHost, String fromAddress){
-        this.smtpHost = smtpHost;
-        this.altSmtpHost = altSmtpHost;
-        this.fromAddress = fromAddress;
-        this.mailList = new ArrayList<>();
-    }
-
-    public abstract void createMail(String toAddress, String subject, String message);
-
-    /**
-     * 撰写邮件
-     */
-    protected void addToMailList(){
-        HashMap<String, Object> mailToSend = new HashMap<>();
-        mailToSend.put(TO_ADDRESS_KEY, this.toAddress);
-        mailToSend.put(SUBJECT_KEY, this.subject);
-        mailToSend.put(MESSAGE_KEY, this.message);
-        this.mailList.add(mailToSend);
-    }
-
-    private boolean isInit(){
-        return StringUtils.isNotBlank(this.smtpHost) &&
-                StringUtils.isNotBlank(this.altSmtpHost) &&
-                StringUtils.isNotBlank(this.fromAddress);
-    }
-
-    /**
-     * 供子类实现的send方法
-     */
-    public abstract void send();
-
-    /**
-     * 批量发送
-     */
-    protected void batchSend(boolean debug){
-        if(!isInit()){
-            throw new RuntimeException("邮件客户端还未做配置");
-        }
-
-        if(mailList.isEmpty()){
-            System.out.println("没有邮件要发送");
-            return;
-        }
-        int size = mailList.size();
-        System.out.println("开始发送邮件, 总邮件数=" + size);
-        int i = 0;
-        for(HashMap mail : mailList){
-            i++;
-            String toAddress = (String)mail.get(TO_ADDRESS_KEY);
-            if(StringUtils.isBlank(toAddress)){
-                System.out.println("收件人地址为空，此邮件发送中止");
-                continue;
-            }
-
-            String subject = (String)mail.get(SUBJECT_KEY);
-            String message = (String)mail.get(MESSAGE_KEY);
-
-            System.out.println("\n正在发送第[" + i + "]封邮件");
-            System.out.println("==========================================================");
-            try{
-                sendEmail(toAddress, this.fromAddress, subject, message, this.smtpHost, debug);
-            }catch(Exception e){
-                sendEmail(toAddress, this.fromAddress, subject, message, this.altSmtpHost, debug);
-            }
-            System.out.println("==========================================================");
-            System.out.println("第[" + i + "]封邮件发送完成");
-        }
-    }
-
-    /**
-     * 发送邮件客户端的功能和责任，所以移入邮件客户端，但是只能被基础客户端调用
-     * 子类只能通过batchSend来发送邮件
-     */
-    private 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.print(buffer.toString());
-    }
-}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java b/students/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java
new file mode 100644
index 0000000000..3ca783fe0d
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/mail/MailClient.java
@@ -0,0 +1,95 @@
+package srp.refactor.mail;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.services.MailService;
+import srp.refactor.util.Constants;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 具有初始化设置、可以批量发送邮件的邮件客户端
+ *
+ * Created by Tee on 2017/6/15.
+ */
+public abstract class MailClient {
+    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 List<HashMap> mailList;
+
+    private MailService mailService = new MailService();
+    /**
+     * 初始化邮件设置
+     *
+     * @param smtpHost smtp主机
+     * @param altSmtpHost 备用smtp主机
+     * @param fromAddress 发件人地址
+     */
+    protected void initMailSettings(String smtpHost, String altSmtpHost, String fromAddress){
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+        this.mailList = new ArrayList<>();
+    }
+
+    public abstract void createMail(String toAddress, String subject, String message);
+
+    /**
+     * 撰写邮件
+     */
+    protected void addToMailList(){
+        HashMap<String, Object> mailToSend = new HashMap<>();
+        mailToSend.put(Constants.EmailInfo.TO_ADDRESS_KEY.getKey(), this.toAddress);
+        mailToSend.put(Constants.EmailInfo.SUBJECT_KEY.getKey(), this.subject);
+        mailToSend.put(Constants.EmailInfo.MESSAGE_KEY.getKey(), this.message);
+        this.mailList.add(mailToSend);
+    }
+
+    private boolean isInit(){
+        return StringUtils.isNotBlank(this.smtpHost) &&
+                StringUtils.isNotBlank(this.altSmtpHost) &&
+                StringUtils.isNotBlank(this.fromAddress);
+    }
+
+    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 fromAddress;
+    }
+
+    public void setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+    }
+
+    /**
+     * 调用邮件邮件服务器来收发邮件
+     * @param debug
+     */
+    public void batchSend(boolean debug){
+        if(!isInit()){
+            throw new RuntimeException("邮件客户端还未做配置");
+        }
+
+        mailService.batchSend(debug, this, this.mailList);
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/services/MailService.java b/students/75939388/ood/src/main/java/srp/refactor/services/MailService.java
new file mode 100644
index 0000000000..27bcb38389
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/services/MailService.java
@@ -0,0 +1,66 @@
+package srp.refactor.services;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.mail.MailClient;
+import srp.refactor.util.Constants;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 邮件收发服务
+ *
+ * Created by Tee on 2017/6/16.
+ */
+public class MailService {
+
+
+    /**
+     * 批量发送
+     */
+    public void batchSend(boolean debug, MailClient mailClient, List<HashMap> mailList){
+        if(mailList.isEmpty()){
+            System.out.println("没有邮件要发送");
+            return;
+        }
+        int size = mailList.size();
+        System.out.println("开始发送邮件, 总邮件数=" + size);
+        int i = 0;
+        for(HashMap mail : mailList){
+            i++;
+            String toAddress = (String)mail.get(Constants.EmailInfo.TO_ADDRESS_KEY.getKey());
+            if(StringUtils.isBlank(toAddress)){
+                System.out.println("收件人地址为空，此邮件发送中止");
+                continue;
+            }
+
+            String subject = (String)mail.get(Constants.EmailInfo.SUBJECT_KEY.getKey());
+            String message = (String)mail.get(Constants.EmailInfo.MESSAGE_KEY.getKey());
+
+            System.out.println("\n正在发送第[" + i + "]封邮件");
+            System.out.println("==========================================================");
+            try{
+                sendEmail(toAddress, mailClient.getFromAddress(), subject, message, mailClient.getSmtpHost(), debug);
+            }catch(Exception e){
+                sendEmail(toAddress, mailClient.getFromAddress(), subject, message, mailClient.getAltSmtpHost(), debug);
+            }
+            System.out.println("==========================================================");
+            System.out.println("第[" + i + "]封邮件发送完成");
+        }
+    }
+
+    /**
+     * 发送邮件客户端的功能和责任，所以移入邮件客户端，但是只能被基础客户端调用
+     * 子类只能通过batchSend来发送邮件
+     */
+    public 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.print(buffer.toString());
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java b/students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java
new file mode 100644
index 0000000000..a1484520d1
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/services/ProductService.java
@@ -0,0 +1,38 @@
+package srp.refactor.services;
+
+import org.apache.commons.lang3.StringUtils;
+import srp.refactor.domain.Product;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class ProductService {
+
+    public Product setPromotionInfo(String productId, String productDesc){
+        return new Product(productId, productDesc);
+    }
+
+    public String getLoadQuerySql(String productID){
+        if(StringUtils.isBlank(productID)){
+            throw new RuntimeException("没有获取到productID");
+        }
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set, productID -> " + productID);
+        return sendMailQuery;
+    }
+
+    public List<Product> getPromotionInfoList(List<String> data){
+        List<Product> list = new ArrayList<>();
+        for(int i = 0; i < data.size(); i += 2){
+            list.add(setPromotionInfo(data.get(i), data.get(i + 1)));
+        }
+        return list;
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/services/UserService.java b/students/75939388/ood/src/main/java/srp/refactor/services/UserService.java
new file mode 100644
index 0000000000..403c9d8a95
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/services/UserService.java
@@ -0,0 +1,31 @@
+package srp.refactor.services;
+
+import srp.refactor.domain.User;
+import srp.refactor.util.DBUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class UserService {
+
+    public User setUser(String userName, String email){
+        return new User(userName, email);
+    }
+
+    public List<User> getUserList(String sql){
+        List<HashMap> userMapList = DBUtil.query(sql);
+        List<User> userList = new ArrayList<>();
+        for(HashMap map : userMapList){
+            userList.add(setUser(
+                    (String)map.get("NAME"),
+                    (String)map.get("EMAIL"))
+            );
+        }
+
+        return userList;
+    }
+}
diff --git a/students/75939388/ood/src/main/java/srp/refactor/util/Constants.java b/students/75939388/ood/src/main/java/srp/refactor/util/Constants.java
new file mode 100644
index 0000000000..88633b1faf
--- /dev/null
+++ b/students/75939388/ood/src/main/java/srp/refactor/util/Constants.java
@@ -0,0 +1,21 @@
+package srp.refactor.util;
+
+/**
+ * Created by Tee on 2017/6/16.
+ */
+public class Constants {
+    public enum EmailInfo{
+        TO_ADDRESS_KEY("toAddress"),
+        SUBJECT_KEY("subject"),
+        MESSAGE_KEY("message");
+
+        private String key;
+        EmailInfo(String key){
+            this.key = key;
+        }
+
+        public String getKey(){
+            return this.key;
+        }
+    }
+}
diff --git a/students/75939388/ood/src/test/java/srp/SrpTest.java b/students/75939388/ood/src/test/java/srp/SrpTest.java
index 19d5387df6..c55f54b1d0 100644
--- a/students/75939388/ood/src/test/java/srp/SrpTest.java
+++ b/students/75939388/ood/src/test/java/srp/SrpTest.java
@@ -2,7 +2,9 @@
 
 import org.junit.Before;
 import org.junit.Test;
-import srp.refactor.PromotionMail;
+import srp.refactor.PromotionMailClient;
+import srp.refactor.domain.Product;
+import srp.refactor.services.ProductService;
 import srp.refactor.util.FileUtil;
 
 import java.io.File;
@@ -13,7 +15,7 @@
  */
 public class SrpTest {
 
-    PromotionMail promotionMail = null;
+    PromotionMailClient promotionMail = null;
 
     private static int in = 0;
 
@@ -31,8 +33,9 @@ public void runTrial() throws Exception{
                 "students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt");
         List<String> data = FileUtil.readFile(file);
 
-        PromotionMail promotionMail = new PromotionMail();
-        promotionMail.batchWrite(data);
-        promotionMail.send();
+        PromotionMailClient promotionMail = new PromotionMailClient();
+        List<Product> promotionProducts = new ProductService().getPromotionInfoList(data);
+        promotionMail.batchWrite(promotionProducts);
+        promotionMail.batchSend(false);
     }
 }

From 52d458713db3cecb20abfaafb509902f0da521dd Mon Sep 17 00:00:00 2001
From: doudou <coderlmm@gmail.com>
Date: Fri, 16 Jun 2017 17:08:59 +0800
Subject: [PATCH 118/332] first

---
 students/759412759/pom.xml                    | 32 ++++++++
 .../com/coderising/ood/srp/Configuration.java | 24 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 ++++++
 .../java/com/coderising/ood/srp/FileUtil.java | 32 ++++++++
 .../java/com/coderising/ood/srp/Mail.java     | 81 +++++++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 22 +++++
 .../java/com/coderising/ood/srp/Product.java  | 31 +++++++
 .../com/coderising/ood/srp/PromotionMail.java | 63 +++++++++++++++
 .../com/coderising/ood/srp/UserService.java   | 18 +++++
 .../coderising/ood/srp/product_promotion.txt  |  1 +
 11 files changed, 338 insertions(+)
 create mode 100644 students/759412759/pom.xml
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/UserService.java
 create mode 100644 students/759412759/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/759412759/pom.xml b/students/759412759/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/759412759/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/Configuration.java b/students/759412759/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..7616041c05
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String,String>();
+
+	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/759412759/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/759412759/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/759412759/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/759412759/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/759412759/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..0bef2d57c9
--- /dev/null
+++ b/students/759412759/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<HashMap<String,String>> query(String sql){
+		List<HashMap<String,String>> userList = new ArrayList<HashMap<String,String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String,String> userInfo = new HashMap<String,String>();
+			userInfo.put("NAME", "User" + i);			
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+
+
+}
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..6a7eeba44c
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+import java.io.*;
+
+/**
+ * Created by Tudou on 2017/6/16.
+ */
+public class FileUtil {
+
+    public static Product loadProductFromFile(String filePath) throws IOException {
+        Product product = new Product();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(new File(filePath)));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            product.setProductID(data[0]);
+            product.setProductDesc(data[1]);
+
+            System.out.println("产品ID = " + product.getProductID() + "\n");
+            System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return product;
+    }
+
+}
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/Mail.java b/students/759412759/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..49f0db842d
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,81 @@
+package com.coderising.ood.srp;
+
+
+public class Mail {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String fromAddress;
+
+    private String toAddress;
+    private String subject;
+    private String message;
+    private boolean debug;
+
+
+    public Mail() {
+
+    }
+
+    public void init() {
+        smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    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 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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public boolean getDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+}
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/759412759/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..2820127c4b
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+
+
+public class MailUtil {
+
+    public static boolean sendEmail(Mail mail) {
+        //假装发了一封邮件
+        if(mail.getToAddress().length() < 0){
+            return Boolean.FALSE;
+        }
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(mail.getFromAddress()).append("\n");
+        buffer.append("To:").append(mail.getToAddress()).append("\n");
+        buffer.append("Subject:").append(mail.getSmtpHost()).append("\n");
+        buffer.append("Content:").append(mail.getMessage()).append("\n");
+        buffer.append("smtpHost:").append(mail.getSmtpHost()).append("\n");
+        buffer.append("isDebug:").append(mail.getDebug() ? "1" : "0").append("\n");
+        System.out.println(buffer.toString());
+        return Boolean.TRUE;
+    }
+
+}
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/Product.java b/students/759412759/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..860f584faf
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Tudou on 2017/6/16.
+ */
+public class Product {
+
+    private String productID;
+    private String productDesc;
+
+
+    public Product() {
+
+    }
+
+    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/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..5dfa3853c8
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.srp;
+
+import java.io.*;
+import java.util.*;
+
+public class PromotionMail {
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+
+    public static void main(String[] args) throws Exception {
+
+        UserService userService = new UserService();
+        PromotionMail pe = new PromotionMail();
+
+        String path = "F:\\IDEA_PRO_01\\coderrising\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+        Product product = FileUtil.loadProductFromFile(path);
+        List<HashMap<String, String>> list = userService.loadMailingList(product.getProductID());
+
+        pe.sendEMails(list,product,Boolean.FALSE);
+    }
+
+    private void sendEMails(List<HashMap<String, String>> mailingList, Product product, boolean debug) throws IOException {
+        System.out.println("开始发送邮件");
+        if (mailingList != null) {
+            Iterator<HashMap<String, String>> iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                HashMap<String, String> userInfo = iter.next();
+                Mail mail = getMail(product, debug, userInfo);
+                try {
+                    boolean flag = MailUtil.sendEmail(mail);
+                    if (!flag) {
+                        mail.setSmtpHost(mail.getAltSmtpHost());
+                        MailUtil.sendEmail(mail);
+                    }
+                } catch (Exception e) {
+                    try {
+                        mail.setSmtpHost(mail.getAltSmtpHost());
+                        MailUtil.sendEmail(mail);
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP 服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+    private Mail getMail(Product product, boolean debug, HashMap<String, String> userInfo) {
+        Mail mail = new Mail();
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 " + userInfo.get(NAME_KEY) + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+        mail.init();
+        mail.setToAddress(userInfo.get(EMAIL_KEY));
+        mail.setSubject(subject);
+        mail.setMessage(message);
+        mail.setDebug(debug);
+        return mail;
+    }
+}
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/UserService.java b/students/759412759/src/main/java/com/coderising/ood/srp/UserService.java
new file mode 100644
index 0000000000..80dc46eda8
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by Tudou on 2017/6/16.
+ */
+public class UserService {
+
+    public List<HashMap<String, String>> loadMailingList(String productId) throws Exception {
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + productId + "' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+
+}
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/759412759/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..46c64c6e64
--- /dev/null
+++ b/students/759412759/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -0,0 +1 @@
+P8756 iPhone8
\ No newline at end of file

From e1e0a17e968e2e836a3b44fc6bb68db968c17894 Mon Sep 17 00:00:00 2001
From: Ginkee <jinkie@vip.qq.com>
Date: Fri, 16 Jun 2017 22:27:03 +0800
Subject: [PATCH 119/332] =?UTF-8?q?SRP=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/466199956/ood/ood-assignment/pom.xml |  32 +++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ++++
 .../java/com/coderising/ood/srp/FileUtil.java |  25 ++++
 .../java/com/coderising/ood/srp/Mail.java     | 124 ++++++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  17 +++
 .../java/com/coderising/ood/srp/Product.java  |  32 +++++
 .../com/coderising/ood/srp/PromotionMail.java |  85 ++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 10 files changed, 376 insertions(+)
 create mode 100644 students/466199956/ood/ood-assignment/pom.xml
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/466199956/ood/ood-assignment/pom.xml b/students/466199956/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..af199815a4
--- /dev/null
+++ b/students/466199956/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<String,String> configurations = new HashMap<String, String>();
+	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/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/466199956/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/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/466199956/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/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..5d59ae261b
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by Dell on 2017/6/15.
+ */
+public class FileUtil {
+    public static String readFile (File file)  throws IOException{
+
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            return br.readLine();
+
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..cd2bb049dc
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,124 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Dell on 2017/6/15.
+ */
+public class Mail {
+
+    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 sendMailQuery = null;
+
+
+    protected static final String NAME_KEY = "NAME";
+    protected static final String EMAIL_KEY = "EMAIL";
+
+    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 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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+
+
+    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(this, debug);
+                }
+                catch (Exception e)
+                {
+
+                    try {
+                        MailUtil.sendEmail(this, debug);
+
+                    } catch (Exception e2)
+                    {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        }
+
+        else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+    protected void configureEMail(HashMap userInfo) throws IOException
+    {
+    }
+
+    protected List loadMailingList() throws Exception {
+        return DBUtil.query(this.sendMailQuery);
+    }
+
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..c2d46495a0
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail, boolean debug) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(mail.getFromAddress()).append("\n");
+		buffer.append("To:").append(mail.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..6587491c3b
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by Dell on 2017/6/15.
+ */
+public class Product {
+
+    private String productID = null;
+    private String productDesc = null;
+
+
+
+    public void setProductID(String productID)
+    {
+        this.productID = productID;
+
+    }
+
+    public String getproductID()
+    {
+        return productID;
+    }
+
+
+    public void setProductDesc(String desc) {
+        this.productDesc = desc;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..1d054470eb
--- /dev/null
+++ b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,85 @@
+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 extends Mail {
+    protected Product product;
+    private static Configuration config;
+
+    public static void main(String[] args) throws Exception {
+        File f = new File("E:\\LandWolf\\coding2017\\students\\466199956\\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 {
+        product = new Product();
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        readFile(file);
+        config = new Configuration();
+
+        setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+
+
+        setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+        setLoadQuery();
+
+        sendEMails(mailDebug, loadMailingList());
+
+
+    }
+
+
+    protected void setLoadQuery() throws Exception {
+
+        sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getproductID() + "' "
+                + "and send_mail=1 ";
+
+
+        System.out.println("loadQuery set");
+    }
+
+
+    protected void setMessage(HashMap userInfo) throws IOException {
+
+        String name = (String) userInfo.get(NAME_KEY);
+
+        subject = "您关注的产品降价了";
+        message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+
+    }
+
+
+    protected void readFile(File file) throws IOException // @02C
+    {
+        String temp = FileUtil.readFile(file);
+        String[] data = temp.split(" ");
+
+        product.setProductID(data[0]);
+        product.setProductDesc(data[1]);
+
+        System.out.println("产品ID = " + product.getproductID() + "\n");
+        System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+    }
+
+
+    @Override
+    protected void configureEMail(HashMap userInfo) throws IOException {
+
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0)
+            this.setMessage(userInfo);
+    }
+}
diff --git a/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/466199956/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/466199956/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

From 659ff51973951ec1223a90ac22240dad2a7b5eca Mon Sep 17 00:00:00 2001
From: zizifn <515868058@qq.com>
Date: Fri, 16 Jun 2017 23:44:38 +0800
Subject: [PATCH 120/332] ood-assignment first assignment.

---
 students/515868058/.gitignore                 |  16 +++
 students/515868058/ood-assignment/pom.xml     |  44 ++++++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  22 ++++
 .../java/com/coderising/ood/srp/Mail.java     |  45 ++++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 +++
 .../java/com/coderising/ood/srp/Product.java  |  54 +++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 105 ++++++++++++++++++
 .../java/com/coderising/ood/srp/UserInfo.java |  31 ++++++
 .../src/main/resources/product_promotion.txt  |   4 +
 11 files changed, 371 insertions(+)
 create mode 100644 students/515868058/.gitignore
 create mode 100644 students/515868058/ood-assignment/pom.xml
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
 create mode 100644 students/515868058/ood-assignment/src/main/resources/product_promotion.txt

diff --git a/students/515868058/.gitignore b/students/515868058/.gitignore
new file mode 100644
index 0000000000..d1651ea2f6
--- /dev/null
+++ b/students/515868058/.gitignore
@@ -0,0 +1,16 @@
+/target/
+/bin/
+.classpath
+.project
+/.project
+.idea/libraries/Maven__junit_junit_4_12.xml
+.idea/libraries/Maven__org_apache_ant_ant_1_9_6.xml
+.idea/libraries/Maven__org_apache_ant_ant_launcher_1_9_6.xml
+.idea/libraries/Maven__org_apache_commons_commons_lang3_3_5.xml
+.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
+.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_24.xml
+.idea/sonarlint/
+.idea/workspace.xml
+logfile.log
+logfile1.log
+/.idea/
diff --git a/students/515868058/ood-assignment/pom.xml b/students/515868058/ood-assignment/pom.xml
new file mode 100644
index 0000000000..1a0471dccc
--- /dev/null
+++ b/students/515868058/ood-assignment/pom.xml
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/515868058/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<String,String> 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/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/515868058/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/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..fcaa1dd3e2
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<UserInfo> query(String sql){
+		
+		List<UserInfo> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+
+			userList.add(new UserInfo("User" + i, "aa@bb.com"));
+		}
+
+		return userList;
+	}
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..32571d3505
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,45 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by James on 6/15/2017.
+ */
+public class Mail {
+
+    private Configuration config;
+
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private String fromAddress = null;
+
+    public Mail(Configuration config) {
+        this.config =config;
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+
+    }
+
+    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);
+    }
+
+    public void sendEmail(String toAddress, String subject, String message, boolean debug) throws Exception {
+        MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+
+
+    }
+
+    public void sendAltEmail(String toAddress, String subject, String message, boolean debug) throws Exception{
+        MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+    }
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/515868058/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/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..820f63cacd
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,54 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by James on 6/16/2017.
+ */
+public class Product {
+
+
+    private String productID = null;
+    private String productDesc = null;
+
+    public Product(String id, String desc) {
+        this.productID = id;
+        this.productDesc = desc;
+    }
+
+    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;
+    }
+
+    public static Product buildProduct(File file) throws IOException {
+
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            return new Product(data[0], data[1]);
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+
+    }
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..c61f0afdbc
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,105 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class PromotionMail {
+    private Product product;
+    private Mail mail = null;
+    private List<UserInfo> mailList;
+
+
+    public static void main(String[] args) throws Exception {
+
+        File f = new File(PromotionMail.class.getClassLoader().getResource("product_promotion.txt").getPath());
+
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(f, emailDebug);
+        pe.sendEMails(emailDebug);
+
+    }
+
+
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        mail = new Mail(new Configuration());
+        product = Product.buildProduct(file);
+
+    }
+
+
+    public void sendEMails(boolean debug) throws IOException {
+
+        System.out.println("开始发送邮件");
+        if (getMailList() != null) {
+            getMailList().forEach(
+                    userInfo -> {
+                        if (userInfo.getEmail().length() > 0) {
+                            try {
+                                mail.sendEmail(userInfo.getEmail(), getSubject(), getMessage(userInfo.getName(), getProduct().getProductDesc()), debug);
+                            } catch (Exception e) {
+                                try {
+                                    mail.sendAltEmail(userInfo.getEmail(), getSubject(), getMessage(userInfo.getName(), getProduct().getProductDesc()), debug);
+                                } catch (Exception e1) {
+                                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e1.getMessage());
+                                }
+                            }
+                        }
+                    }
+            );
+        } else {
+            System.out.println("没有邮件发送");
+        }
+
+
+    }
+
+    private String getSubject() {
+        return "您关注的产品降价了";
+    }
+
+    private String getMessage(String username, String productDesc) {
+        return "尊敬的 " + username + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+
+    }
+
+    public List<UserInfo> getMailList() {
+        if (mailList == null) {
+            try {
+                return loadMailingList(loadQuery(getProduct().getProductID()));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            return null;
+        } else {
+            return this.mailList;
+        }
+    }
+
+    public Product getProduct() {
+        return product;
+    }
+
+    public void setProduct(Product product) {
+        this.product = product;
+    }
+
+    private String loadQuery(String productID) throws Exception {
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+
+
+        System.out.println("loadQuery set");
+        return sendMailQuery;
+    }
+
+
+    private List<UserInfo> loadMailingList(String queryString) throws Exception {
+        return DBUtil.query(queryString);
+    }
+
+}
diff --git a/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..8bbd72f035
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by James on 6/15/2017.
+ */
+public class UserInfo {
+
+    private String name;
+    private String email;
+
+    public UserInfo(String name, String email){
+        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/515868058/ood-assignment/src/main/resources/product_promotion.txt b/students/515868058/ood-assignment/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/515868058/ood-assignment/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 8e96cc1b5d73fae9eafcd794e291c09a09ebc087 Mon Sep 17 00:00:00 2001
From: dtwj03 <l>
Date: Tue, 13 Jun 2017 00:56:49 +0800
Subject: [PATCH 121/332] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=B4=E6=98=8E?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/469880403/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/469880403/readme.md

diff --git a/students/469880403/readme.md b/students/469880403/readme.md
new file mode 100644
index 0000000000..8fc153b34f
--- /dev/null
+++ b/students/469880403/readme.md
@@ -0,0 +1 @@
+说明文件
\ No newline at end of file

From 37aed5857805f4ec2b391585512b468eb74e94da Mon Sep 17 00:00:00 2001
From: dtwj03 <l>
Date: Sat, 17 Jun 2017 00:04:16 +0800
Subject: [PATCH 122/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=82=AE=E4=BB=B6?=
 =?UTF-8?q?=E5=8F=91=E9=80=81=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/469880403/ood-assignment/pom.xml     |  32 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 104 ++++++++++++++++++
 .../ood/srp/dao/SubscriptionDao.java          |  22 ++++
 .../ood/srp/entity/MailSetting.java           |  36 ++++++
 .../ood/srp/entity/ProductInfo.java           |  19 ++++
 .../ood/srp/properties/Configuration.java     |  23 ++++
 .../ood/srp/properties/ConfigurationKeys.java |   9 ++
 .../ood/srp/properties/product_promotion.txt  |   4 +
 .../com/coderising/ood/srp/util/DBUtil.java   |  25 +++++
 .../com/coderising/ood/srp/util/FileUtil.java |  34 ++++++
 .../com/coderising/ood/srp/util/MailUtil.java |  18 +++
 11 files changed, 326 insertions(+)
 create mode 100644 students/469880403/ood-assignment/pom.xml
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/product_promotion.txt
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 create mode 100644 students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java

diff --git a/students/469880403/ood-assignment/pom.xml b/students/469880403/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/469880403/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..a6791a7cfa
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,104 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.ood.srp.dao.SubscriptionDao;
+import com.coderising.ood.srp.entity.MailSetting;
+import com.coderising.ood.srp.entity.ProductInfo;
+import com.coderising.ood.srp.properties.Configuration;
+import com.coderising.ood.srp.properties.ConfigurationKeys;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+public class PromotionMail {
+
+	private boolean mailDebug;
+
+
+	private static SubscriptionDao subscriptionDao = new SubscriptionDao();
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	public static void main(String[] args) throws Exception {
+		// 1 读取配置文件，加载产品信息
+		File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		boolean emailDebug = false;
+		ProductInfo productInfo = new ProductInfo();
+		FileUtil.readFileAndSetProductInfo(file, productInfo);
+
+		// 2 设置邮箱服务信息
+		Configuration config = new Configuration();
+		MailSetting mailSetting = new MailSetting();
+		loadMailSetting(config, mailSetting);
+
+		// 3 查询意向用户信息
+		subscriptionDao.setLoadQuery(productInfo.getProductID());
+		List sendMailList = subscriptionDao.loadMailingList();
+
+		// 4 发送邮件
+		PromotionMail pe = new PromotionMail(emailDebug);
+		pe.sendEMails(mailSetting, sendMailList, productInfo);
+
+	}
+
+	public PromotionMail( boolean mailDebug) throws Exception {
+
+		this.mailDebug = mailDebug;
+	}
+
+	private static void loadMailSetting(Configuration config, MailSetting mailSetting) {
+
+		mailSetting.setAltSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mailSetting.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mailSetting.setFromAddress(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+	}
+
+
+
+	protected void sendEMails(MailSetting mailSetting, List mailingList, ProductInfo productInfo) throws IOException {
+
+		System.out.println("开始发送邮件");
+		String subject = "您关注的产品降价了";
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				Map userInfo = (HashMap) iter.next();
+				String userName = (String) userInfo.get(NAME_KEY);
+				String toAddress = (String) userInfo.get(EMAIL_KEY);
+				String productDesc = productInfo.getProductDesc();
+				String message = "尊敬的 " + userName + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+
+				try {
+					if (toAddress.length() > 0)
+						MailUtil.sendEmail(toAddress, mailSetting.getFromAddress(), subject, message,
+								mailSetting.getSmtpHost(), this.mailDebug);
+				} catch (Exception e) {
+
+					try {
+						MailUtil.sendEmail(toAddress, mailSetting.getFromAddress(), subject, message,
+								mailSetting.getAltSmtpHost(), this.mailDebug);
+
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+
+
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java
new file mode 100644
index 0000000000..f5360f0373
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/dao/SubscriptionDao.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.List;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+public class SubscriptionDao {
+	
+	protected static String sendMailQuery = null;
+	public  List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+	public  void setLoadQuery(String productID) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+	
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java
new file mode 100644
index 0000000000..c3db877aa4
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/MailSetting.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp.entity;
+
+public class MailSetting {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	
+	
+	public String getToAddress() {
+		return toAddress;
+	}
+	public void setToAddress(String toAddress) {
+		this.toAddress = toAddress;
+	}
+	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 fromAddress;
+	}
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+	
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java
new file mode 100644
index 0000000000..0a6a569f27
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/entity/ProductInfo.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp.entity;
+
+public class ProductInfo {
+	private  String productID = null;
+	private  String productDesc = null;
+	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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java
new file mode 100644
index 0000000000..73aaa9166e
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.properties;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String, String>();
+	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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java
new file mode 100644
index 0000000000..8b09c99124
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.properties;
+
+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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/product_promotion.txt b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/properties/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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..a23198fcea
--- /dev/null
+++ b/students/469880403/ood-assignment/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.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/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..a0bb0f3a85
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.entity.ProductInfo;
+
+public class FileUtil {
+	
+	public static void readFileAndSetProductInfo(File file,ProductInfo productInfo) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			productInfo.setProductID( data[0]);
+			productInfo.setProductDesc( 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();
+		}
+	}
+
+}
diff --git a/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..bb028c690c
--- /dev/null
+++ b/students/469880403/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.util;
+
+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());
+		
+	}
+
+	
+}

From 8177baf71b6f66d5ba78201bd4ada97c2f18a00e Mon Sep 17 00:00:00 2001
From: Yangming Xie <yangmingxiework@gmail.com>
Date: Fri, 16 Jun 2017 22:55:16 -0400
Subject: [PATCH 123/332] first commit

---
 students/702282822/ood-assignment/pom.xml     |  32 +++++
 .../com/coderising/ood/srp/Configuration.java |  26 ++++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  29 ++++
 .../java/com/coderising/ood/srp/Mail.java     | 129 ++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  |  30 ++++
 .../com/coderising/ood/srp/PromotionMail.java |  77 +++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 8 files changed, 336 insertions(+)
 create mode 100644 students/702282822/ood-assignment/pom.xml
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/702282822/ood-assignment/pom.xml b/students/702282822/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/702282822/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..44e38129c8
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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");
+	}
+	static final String NAME_KEY = "NAME";
+	static final String EMAIL_KEY = "EMAIL";
+	
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public static String getProperty(String key) 
+	{		   
+		return configurations.get(key); 
+	}
+
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..d131ff0c73
--- /dev/null
+++ b/students/702282822/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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..97909cf560
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,29 @@
+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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..9773a990ba
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,129 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public abstract class Mail {
+	
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	protected String subject = null;
+	protected String message = null;
+	protected String sendMailQuery = null;
+
+	
+	public Mail(File file, Boolean mailDebug) throws Exception
+	{
+		readFile(file);	
+		setSMTPHost();
+		setAltSMTPHost(); 
+		setFromAddress();
+							
+		setSendMailQuery();			
+		List mailingList = loadMailingList();					
+		sendEMails(mailDebug, mailingList); 
+		
+	}
+	protected abstract void readFile(File fie) throws IOException;	
+		
+	protected void setSMTPHost() 
+	{
+		smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+	
+	
+	protected void setAltSMTPHost() 
+	{
+		altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+	}
+	
+	
+	protected void setFromAddress() 
+	{
+		fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+	
+	protected abstract void setSendMailQuery() throws Exception;
+	
+			
+	protected List loadMailingList() throws Exception {			//user information, name and email address
+		return DBUtil.query(this.sendMailQuery);
+	}
+		
+		
+	protected abstract void setMessage(String name) throws IOException;
+	
+	
+			
+	
+	
+	protected void setToAddress(HashMap userInfo){
+		toAddress = (String) userInfo.get(Configuration.EMAIL_KEY); 		
+	}
+	
+	protected void configureEMail(HashMap userInfo) throws IOException 
+	{
+		if (toAddress.length() > 0) 
+			setMessage((String)userInfo.get(Configuration.NAME_KEY)); 
+	}
+	
+	
+	protected void sendEMails(boolean debug, List mailingList) throws IOException 
+	{
+
+		System.out.println("开始发送邮件");
+	
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();				
+				setToAddress(userInfo);				
+				configureEMail(userInfo);  
+				try 
+				{
+					if (toAddress.length() > 0)
+						sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	
+	public 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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..5d4fb8dce4
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private static String productID; 
+	private static String productDesc;
+	
+	
+	protected static void setProductID(String ID) 
+	{ 
+		productID = ID; 
+		
+	} 
+
+	protected static String getProductID() 
+	{
+		return productID; 
+	}
+	
+	protected static void setProductDesc(String desc) {
+		productDesc = desc;		
+	}
+	
+	protected static String getProductDesc(){
+		return productDesc;		
+	}
+
+	
+
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..e126809ad6
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,77 @@
+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 extends Mail {			//inheritance from mail	
+	
+
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("\\product_promotion.txt");
+		boolean emailDebug = false;
+
+		PromotionMail pe = new PromotionMail(f, emailDebug);
+
+	}
+	
+	public PromotionMail(File file, boolean mailDebug) throws Exception {				
+		super(file, mailDebug);
+	}
+	
+	
+	
+	protected void setSendMailQuery() throws Exception {		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + Product.getProductID() +"' "
+				+ "and send_mail=1 ";
+				
+		System.out.println("loadQuery set");
+	}
+
+	protected void setMessage(String name) throws IOException 
+	{				
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+ name +", 您关注的产品 " + Product.getProductDesc() + " 降价了，欢迎购买!" ;						
+	}
+
+
+	@Override
+	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(" ");
+			
+			Product.setProductID(data[0]); 
+			Product.setProductDesc(data[1]); 
+			
+			System.out.println("产品ID = " + Product.getProductID() + "\n");
+			System.out.println("产品描述 = " + Product.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+		
+		
+		
+	
+	
+	
+	
+	
+	
+	
+	
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/702282822/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

From 86b2580d202350d56445c26589e8fb19e91ec762 Mon Sep 17 00:00:00 2001
From: liubin <932235900@qq.com>
Date: Sat, 17 Jun 2017 11:11:15 +0800
Subject: [PATCH 124/332] =?UTF-8?q?srp=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/srp/PromotaionTest.java    | 34 +++++++++++
 .../ood/srp/common/Configuration.java         | 23 ++++++++
 .../ood/srp/common/ConfigurationKeys.java     |  9 +++
 .../com/coderising/ood/srp/common/DBUtil.java | 26 ++++++++
 .../ood/srp/common/product_promotion.txt      |  4 ++
 .../com/coderising/ood/srp/entity/Email.java  | 46 +++++++++++++++
 .../coderising/ood/srp/entity/Product.java    | 31 ++++++++++
 .../com/coderising/ood/srp/entity/User.java   | 29 +++++++++
 .../ood/srp/service/EmailService.java         | 43 ++++++++++++++
 .../ood/srp/service/ProductService.java       | 59 +++++++++++++++++++
 .../ood/srp/service/UserService.java          | 17 ++++++
 11 files changed, 321 insertions(+)
 create mode 100644 students/932235900/src/com/coderising/ood/srp/PromotaionTest.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/common/Configuration.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/common/DBUtil.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/common/product_promotion.txt
 create mode 100644 students/932235900/src/com/coderising/ood/srp/entity/Email.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/entity/Product.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/entity/User.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/service/EmailService.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/service/ProductService.java
 create mode 100644 students/932235900/src/com/coderising/ood/srp/service/UserService.java

diff --git a/students/932235900/src/com/coderising/ood/srp/PromotaionTest.java b/students/932235900/src/com/coderising/ood/srp/PromotaionTest.java
new file mode 100644
index 0000000000..04bc17a433
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/PromotaionTest.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+import com.coderising.ood.srp.common.Configuration;
+import com.coderising.ood.srp.entity.Email;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.EmailService;
+import com.coderising.ood.srp.service.ProductService;
+import com.coderising.ood.srp.service.UserService;
+
+public class PromotaionTest {
+
+	public static void main(String[] args) {
+		//1.获得客户集合
+		List<User> users = new UserService().getUsers();
+		//2.获得促销商品
+		List<Product> products = new ProductService().getPromotionProducts("src\\com\\coderising\\ood\\srp\\common\\product_promotion.txt");
+		//3.配置
+		Configuration conf = new Configuration();
+		//给每个用户发邮件
+		EmailService emailService = new EmailService();
+		for(User user:users ){
+				
+				Email email = emailService.generateEmail(user, products, conf );
+				
+				emailService.sendEmail(email);
+				
+			
+		}
+		
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/common/Configuration.java b/students/932235900/src/com/coderising/ood/srp/common/Configuration.java
new file mode 100644
index 0000000000..4565927da1
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.common;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java b/students/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java
new file mode 100644
index 0000000000..a0064e0e4d
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.common;
+
+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/932235900/src/com/coderising/ood/srp/common/DBUtil.java b/students/932235900/src/com/coderising/ood/srp/common/DBUtil.java
new file mode 100644
index 0000000000..6e333a508c
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/DBUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.common;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import com.coderising.ood.srp.entity.User;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<User>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setUserName("User" + i);
+			user.setEmailAddress("aa"+i+"@bb.com");
+			userList.add(user);
+		}
+		return userList;
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/common/product_promotion.txt b/students/932235900/src/com/coderising/ood/srp/common/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/common/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/932235900/src/com/coderising/ood/srp/entity/Email.java b/students/932235900/src/com/coderising/ood/srp/entity/Email.java
new file mode 100644
index 0000000000..dd13c4fab1
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/entity/Email.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp.entity;
+/**
+ * 
+ * @author liubin
+ *电子邮件实体类
+ */
+public class Email {
+	
+	private String toAddress;
+	private String fromAddress; 
+	private String subject; 
+	private String message; 
+	private String smtpHost;
+	
+	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;
+	}
+	
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/entity/Product.java b/students/932235900/src/com/coderising/ood/srp/entity/Product.java
new file mode 100644
index 0000000000..dffa593397
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/entity/Product.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp.entity;
+/**
+ * 
+ * @author liubin
+ * 产品实体类
+ *
+ */
+public class Product {
+	
+	private String productId;
+	private String 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;
+	}
+	@Override
+	public String toString() {
+		return "Product [产品ID = " + productId + ", 产品描述 = " + productDesc + "]";
+	}
+	
+	
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/entity/User.java b/students/932235900/src/com/coderising/ood/srp/entity/User.java
new file mode 100644
index 0000000000..bd85ceac8f
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/entity/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.entity;
+
+public class User {
+	private String userId;
+	private String userName;
+	private String emailAddress;
+	
+	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 getEmailAddress() {
+		return emailAddress;
+	}
+	public void setEmailAddress(String emailAddress) {
+		this.emailAddress = emailAddress;
+	}
+	
+	
+
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/service/EmailService.java b/students/932235900/src/com/coderising/ood/srp/service/EmailService.java
new file mode 100644
index 0000000000..9455ba57a5
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/service/EmailService.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.common.Configuration;
+import com.coderising.ood.srp.common.ConfigurationKeys;
+import com.coderising.ood.srp.entity.Email;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+
+public class EmailService {
+	
+	public Email generateEmail(User user,List<Product> products,Configuration configuration){
+		Email email = new Email();
+		email.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		email.setToAddress(user.getEmailAddress());
+		email.setSubject("您关注的产品降价了");
+		StringBuffer message=new StringBuffer("尊敬的 "+user.getUserName()+", 您关注的产品:");
+		for(Product product:products){
+			message.append(product.getProductDesc()+" ");
+		}
+		message.append("降价了，欢迎购买!");
+		email.setMessage(message.toString());
+		return email;
+	}
+	/**
+	 * 发送一封Email
+	 * @param email
+	 */
+	public void sendEmail(Email email){
+		if(email != null ){
+			//假装发了一封邮件
+			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());
+		}else{
+			System.out.println("email 为空，发送邮件失败！");
+		}
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/service/ProductService.java b/students/932235900/src/com/coderising/ood/srp/service/ProductService.java
new file mode 100644
index 0000000000..1762527fa6
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/service/ProductService.java
@@ -0,0 +1,59 @@
+package com.coderising.ood.srp.service;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.entity.Product;
+
+public class ProductService {
+	
+	/**
+	 * 从给定的路径文件获取打折商品信息
+	 * @param path
+	 * @return
+	 */
+	public List<Product> getPromotionProducts(String path){
+		List<Product> products = new ArrayList<Product>();
+		if(path != null && !"".equals(path)){
+			File file = new File(path);
+			try {
+				products = readFile(file);
+			} catch (IOException e) {
+				System.out.println("获取打折商品信息出错："+ e.getMessage());
+			}
+		}
+		return products;
+	}
+	
+	private List<Product> readFile(File file) throws IOException // @02C
+	{
+		List<Product> products = new ArrayList<Product>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = null;
+			while((temp = br.readLine()) !=  null){
+				
+				String[] data = temp.split(" ");
+				
+				Product product = new Product();
+				product.setProductId(data[0]);
+				product.setProductDesc(data[1]);
+				System.out.println(product);
+				
+				products.add(product);
+			}
+			return products;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			if(br != null){
+				br.close();
+			}
+		}
+	}
+}
diff --git a/students/932235900/src/com/coderising/ood/srp/service/UserService.java b/students/932235900/src/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 0000000000..d8bc1b67d6
--- /dev/null
+++ b/students/932235900/src/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.common.DBUtil;
+import com.coderising.ood.srp.entity.User;
+
+public class UserService {
+	/**
+	 * 获取客户列表
+	 */
+	public List<User> getUsers(){
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where send_mail=1 ";
+		return DBUtil.query(sendMailQuery);
+	}
+}

From 6dcfb02aa5887f3312520d581173bbf3e238b7c9 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 11:38:53 +0800
Subject: [PATCH 125/332] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/srp/DBUtil.java   |   9 +-
 .../com/coderising/ood/srp/FileUtils.java     |  41 ++++
 .../java/com/coderising/ood/srp/MailUtil.java |  43 +++-
 .../com/coderising/ood/srp/ProductInfo.java   |  30 +++
 .../com/coderising/ood/srp/PromotionMail.java | 222 +++++-------------
 .../java/com/coderising/ood/srp/MainTest.java |  24 ++
 .../src/test/resources/product_promotion.txt  |   4 +
 7 files changed, 202 insertions(+), 171 deletions(-)
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java
 create mode 100644 students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
 create mode 100644 students/1395844061/course-pro-1/src/test/resources/product_promotion.txt

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
index 437a74cb40..01fb57505e 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * DBUtil
@@ -17,11 +18,11 @@ public class DBUtil {
      * @param sql
      * @return
      */
-    public static List query(String sql){
-
-        List userList = new ArrayList();
+    public static List<Map<String, String>> query(String sql){
+        System.out.println("sql: "+sql);
+        List<Map<String, String>> userList = new ArrayList<>();
         for (int i = 1; i <= 3; i++) {
-            HashMap userInfo = new HashMap();
+            Map<String, String> userInfo = new HashMap<>();
             userInfo.put("NAME", "User" + i);
             userInfo.put("EMAIL", "aa@bb.com");
             userList.add(userInfo);
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java
new file mode 100644
index 0000000000..74bd9c128d
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * FileUtils
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/14/22:43
+ */
+public final class FileUtils {
+
+
+    public static List<ProductInfo> readProductInfoFromFile(String filePath) throws IOException{
+
+        File file = new File(filePath);
+        BufferedReader br = null;
+        List<ProductInfo> productInfoList = new ArrayList<>();
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp;
+            while((temp = br.readLine()) != null){
+                String[] data = temp.split(" ");
+                productInfoList.add(new ProductInfo(data[0], data[1]));
+            }
+            return productInfoList;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if (br != null)
+                br.close();
+        }
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
index 83b3ef844b..c81b972a0d 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -9,14 +9,38 @@
  */
 public final class MailUtil {
 
+    private static String smtpHost      = null;
+    private static String altSmtpHost   = null;
+    private static String fromAddress   = null;
+    private static Configuration config;
+
+
+    static{
+        config = new Configuration();
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
 
     private MailUtil(){
         throw new RuntimeException("illegal called!");
     }
 
-    public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
-                                 boolean debug) {
+    public static void sendEmail(String toAddress, String subject, String message, boolean debug) {
+
         //假装发了一封邮件
+        System.out.println("debug: " + debug);
+        try {
+            System.out.println("使用默认host发送邮件");
+            sendDefaultMail(toAddress, subject, message);
+        }catch (Exception e){
+            System.out.println("使用备用host发送邮件");
+            sendAltMail(toAddress,subject, message);
+        }
+    }
+
+    private static void sendDefaultMail(String toAddress, String subject, String message){
+        System.out.println("smtpHost: " + smtpHost);
         StringBuilder buffer = new StringBuilder();
         buffer.append("From:").append(fromAddress).append("\n");
         buffer.append("To:").append(toAddress).append("\n");
@@ -24,4 +48,19 @@ public static void sendEmail(String toAddress, String fromAddress, String subjec
         buffer.append("Content:").append(message).append("\n");
         System.out.println(buffer.toString());
     }
+
+    private static void sendAltMail(String toAddress, String subject, String message){
+        System.out.println("altSmtpHost: " + altSmtpHost);
+        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/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..1ba8cf2db7
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+
+/**
+ * ProductInfo
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/14/22:41
+ */
+public class ProductInfo {
+
+    private String productID = null;
+    private String productDesc = null;
+
+    public ProductInfo(){}
+
+    public ProductInfo(String productID, String productDesc){
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 331537f5d9..a805239bef 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,12 +1,7 @@
 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.Iterator;
-import java.util.List;
+import java.util.*;
 
 /**
  * PromotionMail
@@ -16,188 +11,85 @@
  * @date 2017/6/12/23:33
  */
 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 String productID = null;
+    private String productDesc = null;
+    private List<MailInfo> mailInfoList = new ArrayList<>();
 
     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 {
-
+    public PromotionMail(){}
+    public PromotionMail(String productID, String productDesc) 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");
+        this.productDesc = productDesc;
+        initMailInfoList(loadMailingList());
     }
 
-
-    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 + " 降价了，欢迎购买!" ;
-
-
-
+    /**
+     * 获取每个型号的手机关注的人员信息列表
+     * @return
+     * @throws Exception
+     */
+    private List<Map<String, String>> loadMailingList() throws Exception {
+        String sql = "select name from subscriptions "
+                        + "where product_id= '" + productID +"' "
+                        + "and send_mail=1 ";
+        return DBUtil.query(sql);
     }
 
-
-    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();
+    /**
+     * 组装促销邮件的内容信息
+     * @param mailingList
+     */
+    private void initMailInfoList(List<Map<String, String>> mailingList) {
+        if (mailingList!=null && !mailingList.isEmpty()){
+            for (Map<String, String> map : mailingList){
+                // 初始化 mailInfoList
+                mailInfoList.add(buildMailInfo(map));
+            }
         }
     }
 
-    private void setProductDesc(String desc) {
-        this.productDesc = desc;
+    /**
+     * 发送促销邮件
+     * @param debug
+     * @throws IOException
+     */
+    public void sendEMails(boolean debug) throws IOException {
+        System.out.println("开始发送邮件... ...");
+        if (mailInfoList!=null && !mailInfoList.isEmpty()) {
+            for (MailInfo mailInfo : mailInfoList){
+                MailUtil.sendEmail(mailInfo.toAddress, mailInfo.subject, mailInfo.message, debug);
+            }
+        }else {
+            System.out.println("没有邮件发送... ...");
+        }
     }
 
 
-    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);
+    private MailInfo buildMailInfo(Map<String, String> userInfo){
+        String name = userInfo.get(NAME_KEY);
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
+        String toAddress = userInfo.get(EMAIL_KEY);
+        return new MailInfo(toAddress, subject, message);
     }
 
+    class MailInfo{
 
-    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("没有邮件发送");
+        private String toAddress = null;
+        private String subject = null;
+        private String message = null;
 
+        MailInfo(String toAddress, String subject, String message){
+            this.toAddress = toAddress;
+            this.subject = subject;
+            this.message = message;
         }
-
     }
+
 }
diff --git a/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
new file mode 100644
index 0000000000..9780778d36
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * MainTest
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp
+ * @date 2017/6/14/22:45
+ */
+public class MainTest {
+
+    public static void main(String[] args) throws Exception{
+        String filePath = MainTest.class.getClassLoader().getResource("product_promotion.txt").getFile();
+        List<ProductInfo> productInfoList = FileUtils.readProductInfoFromFile(filePath);
+        if (productInfoList != null && !productInfoList.isEmpty()){
+            for (ProductInfo productInfo: productInfoList){
+                new PromotionMail(productInfo.getProductID(), productInfo.getProductDesc())
+                        .sendEMails(false);
+            }
+        }
+    }
+}
diff --git a/students/1395844061/course-pro-1/src/test/resources/product_promotion.txt b/students/1395844061/course-pro-1/src/test/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/test/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 8cb6450b1654785b610be5f84c0c8e8130d78542 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 11:49:01 +0800
Subject: [PATCH 126/332] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?=
 =?UTF-8?q?=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/PromotionMail.java | 37 ++++++++++---------
 .../ood/srp/{ => config}/Configuration.java   |  2 +-
 .../srp/{ => config}/ConfigurationKeys.java   |  2 +-
 .../ood/srp/{ => utils}/DBUtil.java           |  2 +-
 .../{FileUtils.java => utils/FileUtil.java}   |  6 ++-
 .../ood/srp/{ => utils}/MailUtil.java         |  5 ++-
 .../java/com/coderising/ood/srp/MainTest.java |  6 ++-
 7 files changed, 35 insertions(+), 25 deletions(-)
 rename students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/{ => config}/Configuration.java (94%)
 rename students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/{ => config}/ConfigurationKeys.java (89%)
 rename students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/{ => utils}/DBUtil.java (95%)
 rename students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/{FileUtils.java => utils/FileUtil.java} (89%)
 rename students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/{ => utils}/MailUtil.java (93%)

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
index a805239bef..ec54c4ce8d 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,5 +1,8 @@
 package com.coderising.ood.srp;
 
+import com.coderising.ood.srp.utils.DBUtil;
+import com.coderising.ood.srp.utils.MailUtil;
+
 import java.io.IOException;
 import java.util.*;
 
@@ -12,19 +15,16 @@
  */
 public class PromotionMail {
 
-
-    private String productID = null;
-    private String productDesc = null;
+    private ProductInfo productInfo;
     private List<MailInfo> mailInfoList = new ArrayList<>();
 
     private static final String NAME_KEY = "NAME";
     private static final String EMAIL_KEY = "EMAIL";
 
     public PromotionMail(){}
-    public PromotionMail(String productID, String productDesc) throws Exception {
+    public PromotionMail(ProductInfo productInfo) throws Exception {
         //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
-        this.productID = productID;
-        this.productDesc = productDesc;
+        this.productInfo = productInfo;
         initMailInfoList(loadMailingList());
     }
 
@@ -35,7 +35,7 @@ public PromotionMail(String productID, String productDesc) throws Exception {
      */
     private List<Map<String, String>> loadMailingList() throws Exception {
         String sql = "select name from subscriptions "
-                        + "where product_id= '" + productID +"' "
+                        + "where product_id= '" + productInfo.getProductID() +"' "
                         + "and send_mail=1 ";
         return DBUtil.query(sql);
     }
@@ -53,6 +53,19 @@ private void initMailInfoList(List<Map<String, String>> mailingList) {
         }
     }
 
+    /**
+     * 组装邮件内容信息
+     * @param userInfo
+     * @return
+     */
+    private MailInfo buildMailInfo(Map<String, String> userInfo){
+        String name = userInfo.get(NAME_KEY);
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 "+name+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!" ;
+        String toAddress = userInfo.get(EMAIL_KEY);
+        return new MailInfo(toAddress, subject, message);
+    }
+
     /**
      * 发送促销邮件
      * @param debug
@@ -69,16 +82,6 @@ public void sendEMails(boolean debug) throws IOException {
         }
     }
 
-
-
-    private MailInfo buildMailInfo(Map<String, String> userInfo){
-        String name = userInfo.get(NAME_KEY);
-        String subject = "您关注的产品降价了";
-        String message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
-        String toAddress = userInfo.get(EMAIL_KEY);
-        return new MailInfo(toAddress, subject, message);
-    }
-
     class MailInfo{
 
         private String toAddress = null;
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
similarity index 94%
rename from students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
index cd447ad225..7d2169eff8 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.config;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
similarity index 89%
rename from students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
index 7c3aa420b9..702c8cce32 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.config;
 
 /**
  * ConfigurationKeys
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
similarity index 95%
rename from students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
index 01fb57505e..734590b4cf 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.utils;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
similarity index 89%
rename from students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java
rename to students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
index 74bd9c128d..807bc48727 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/FileUtils.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -1,4 +1,6 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.utils;
+
+import com.coderising.ood.srp.ProductInfo;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -14,7 +16,7 @@
  * @package com.coderising.ood.srp
  * @date 2017/6/14/22:43
  */
-public final class FileUtils {
+public final class FileUtil {
 
 
     public static List<ProductInfo> readProductInfoFromFile(String filePath) throws IOException{
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
similarity index 93%
rename from students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
rename to students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
index c81b972a0d..06b0606fc0 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -1,4 +1,7 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.utils;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
 
 /**
  * MailUtil
diff --git a/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
index 9780778d36..9c80f94619 100644
--- a/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
+++ b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
@@ -1,5 +1,7 @@
 package com.coderising.ood.srp;
 
+import com.coderising.ood.srp.utils.FileUtil;
+
 import java.util.List;
 
 /**
@@ -13,10 +15,10 @@ public class MainTest {
 
     public static void main(String[] args) throws Exception{
         String filePath = MainTest.class.getClassLoader().getResource("product_promotion.txt").getFile();
-        List<ProductInfo> productInfoList = FileUtils.readProductInfoFromFile(filePath);
+        List<ProductInfo> productInfoList = FileUtil.readProductInfoFromFile(filePath);
         if (productInfoList != null && !productInfoList.isEmpty()){
             for (ProductInfo productInfo: productInfoList){
-                new PromotionMail(productInfo.getProductID(), productInfo.getProductDesc())
+                new PromotionMail(productInfo)
                         .sendEMails(false);
             }
         }

From b54ac89a37ec9649f1d77e7cb6bb457eb3c2f3d6 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 11:50:34 +0800
Subject: [PATCH 127/332] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/com/coderising/ood/srp/PromotionMail.java   | 6 +++---
 .../java/com/coderising/ood/srp/config/Configuration.java | 8 +++-----
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
index ec54c4ce8d..6e3d09fcb3 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -18,12 +18,12 @@ public class PromotionMail {
     private ProductInfo productInfo;
     private List<MailInfo> mailInfoList = new ArrayList<>();
 
-    private static final String NAME_KEY = "NAME";
-    private static final String EMAIL_KEY = "EMAIL";
+    private static final String NAME_KEY    = "NAME";
+    private static final String EMAIL_KEY   = "EMAIL";
 
     public PromotionMail(){}
+
     public PromotionMail(ProductInfo productInfo) throws Exception {
-        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
         this.productInfo = productInfo;
         initMailInfoList(loadMailingList());
     }
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
index 7d2169eff8..931e93ab3b 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -15,19 +15,17 @@ public class Configuration {
     static Map<String,String> 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");
+        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);
     }
 }

From 6dd917cccf012c8f1c618a571b16df8dd6959bad Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 11:52:18 +0800
Subject: [PATCH 128/332] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/java/com/coderising/ood/srp/utils/DBUtil.java | 7 ++++++-
 .../main/java/com/coderising/ood/srp/utils/FileUtil.java   | 3 +++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
index 734590b4cf..2b4e0410ac 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -12,7 +12,12 @@
  * @package com.coderising.ood.srp
  * @date 2017/6/12/23:32
  */
-public class DBUtil {
+public final class DBUtil {
+
+    private DBUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
     /**
      * 应该从数据库读， 但是简化为直接生成。
      * @param sql
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
index 807bc48727..e833bf786d 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -18,6 +18,9 @@
  */
 public final class FileUtil {
 
+    private FileUtil(){
+        throw new RuntimeException("illegal called!");
+    }
 
     public static List<ProductInfo> readProductInfoFromFile(String filePath) throws IOException{
 

From 9ecc0e678e8891d6a848c5495baebcd75ce3fe1f Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 11:53:33 +0800
Subject: [PATCH 129/332] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/java/com/coderising/ood/srp/utils/FileUtil.java  | 1 -
 .../src/main/java/com/coderising/ood/srp/utils/MailUtil.java  | 4 +---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
index e833bf786d..83b10391e2 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -23,7 +23,6 @@ private FileUtil(){
     }
 
     public static List<ProductInfo> readProductInfoFromFile(String filePath) throws IOException{
-
         File file = new File(filePath);
         BufferedReader br = null;
         List<ProductInfo> productInfoList = new ArrayList<>();
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
index 06b0606fc0..cff76d7bf0 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -15,11 +15,9 @@ public final class MailUtil {
     private static String smtpHost      = null;
     private static String altSmtpHost   = null;
     private static String fromAddress   = null;
-    private static Configuration config;
-
 
     static{
-        config = new Configuration();
+        Configuration config = new Configuration();
         smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
         altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
         fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);

From 9f2285ef1c34f32a90492692881a95f09a50d4d7 Mon Sep 17 00:00:00 2001
From: lorcx <740707954@qq.com>
Date: Sat, 17 Jun 2017 12:01:45 +0800
Subject: [PATCH 130/332] =?UTF-8?q?2017=E5=B9=B46=E6=9C=8817=E6=97=A5=2012?=
 =?UTF-8?q?:01:42?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/740707954/readMe | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/students/740707954/readMe b/students/740707954/readMe
index a930ed0c81..f831579269 100644
--- a/students/740707954/readMe
+++ b/students/740707954/readMe
@@ -1 +1,2 @@
-TEST1
\ No newline at end of file
+TEST1
+2017.06.17
\ No newline at end of file

From 0f2dcc52965bbec38fb94e0c3386987374361151 Mon Sep 17 00:00:00 2001
From: Wen <john.wzhao@gmail.com>
Date: Fri, 16 Jun 2017 21:04:27 -0700
Subject: [PATCH 131/332] =?UTF-8?q?1417442485=20Wen=20Zhao=20=E7=AC=AC?=
 =?UTF-8?q?=E4=B8=80=E6=AC=A1=E4=BD=9C=E4=B8=9A=20=E8=87=AA=E8=8D=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 students/1417442485/pom.xml                   | 32 ++++++++++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++++
 .../java/com/coderising/ood/srp/DBUtil.java   | 20 ++++++++++
 .../java/com/coderising/ood/srp/FileUtil.java | 25 +++++++++++++
 .../com/coderising/ood/srp/MailMessage.java   |  9 +++++
 .../com/coderising/ood/srp/MailService.java   | 19 ++++++++++
 .../com/coderising/ood/srp/MailSetting.java   | 11 ++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 18 +++++++++
 .../java/com/coderising/ood/srp/Product.java  | 11 ++++++
 .../coderising/ood/srp/ProductDataStore.java  | 30 +++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 32 ++++++++++++++++
 .../ood/srp/PromotionMailMessage.java         | 37 +++++++++++++++++++
 .../com/coderising/ood/srp/UserDataStore.java | 15 ++++++++
 .../java/com/coderising/ood/srp/UserInfo.java | 11 ++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 17 files changed, 310 insertions(+)
 create mode 100644 students/1417442485/out/production/1417442485/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/1417442485/pom.xml
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java
 create mode 100644 students/1417442485/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1417442485/out/production/1417442485/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1417442485/out/production/1417442485/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/1417442485/out/production/1417442485/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/1417442485/pom.xml b/students/1417442485/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/1417442485/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..70b861717d
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package main.java.com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static Map<String,String> 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/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..e63eb922a4
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package main.java.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/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..c34751d344
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,20 @@
+package main.java.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<UserInfo> query(final String sql){
+		final List<UserInfo> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			userList.add(new UserInfo("User" + i, "aa@bb.com"));
+		}
+		return userList;
+	}
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..aa288e2795
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,25 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+    public static String[] readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        String[] data;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            data = temp.split(" ");
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+        return data;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java
new file mode 100644
index 0000000000..7e499b7d64
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailMessage.java
@@ -0,0 +1,9 @@
+package main.java.com.coderising.ood.srp;
+
+public interface MailMessage {
+
+    String getFromAddress();
+    String getToAddress();
+    String getSubject();
+    String getMessageBody();
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java
new file mode 100644
index 0000000000..2b8bdf73ef
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailService.java
@@ -0,0 +1,19 @@
+package main.java.com.coderising.ood.srp;
+
+public class MailService {
+
+    public static void send(final MailMessage message, final MailSetting mailSetting) {
+        if(message.getToAddress().length() == 0) return;
+        try {
+            MailUtil.sendEmail(message.getToAddress(), message.getFromAddress(), message.getSubject(),
+                    message.getMessageBody(), MailSetting.smtpHost, mailSetting.emailDebug);
+        } catch (Exception e) {
+            try {
+                MailUtil.sendEmail(message.getToAddress(), message.getFromAddress(), message.getSubject(),
+                        message.getMessageBody(), MailSetting.altSmtpHost, mailSetting.emailDebug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java
new file mode 100644
index 0000000000..0991bbae02
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailSetting.java
@@ -0,0 +1,11 @@
+package main.java.com.coderising.ood.srp;
+
+public class MailSetting {
+    static String smtpHost = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    static String altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    final boolean emailDebug;
+
+    public MailSetting(boolean emailDebug) {
+        this.emailDebug = emailDebug;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..59cc73476e
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package main.java.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/1417442485/src/main/java/com/coderising/ood/srp/Product.java b/students/1417442485/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..2e807c9d50
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,11 @@
+package main.java.com.coderising.ood.srp;
+
+public class Product {
+    final String productId;
+    final String productDesc;
+
+    public Product(String productId, String productDesc) {
+        this.productId = productId;
+        this.productDesc = productDesc;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java b/students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java
new file mode 100644
index 0000000000..770baa7aff
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/ProductDataStore.java
@@ -0,0 +1,30 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ProductDataStore {
+
+    private final File mFileDataSource;
+
+    public ProductDataStore(final File file) {
+        mFileDataSource = file;
+    }
+
+    public Product getProduct() {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] data = null;
+        try {
+            data = FileUtil.readFile(mFileDataSource);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        Product product = null;
+        if(data != null && data.length >= 2) {
+            product = new Product(data[0], data[1]);
+            System.out.println("产品ID = " + product.productId + "\n");
+            System.out.println("产品描述 = " + product.productDesc + "\n");
+        }
+        return product;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..881bdb0f7c
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,32 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class PromotionMail {
+
+	private static final String PRODUCT_FILE = "src/main/java/com/coderising/ood/srp/product_promotion.txt";
+	
+	public static void main(String[] args) throws Exception {
+
+		final Product product = new ProductDataStore(new File(PRODUCT_FILE)).getProduct();
+        final List<UserInfo> userList = UserDataStore.getMailingList(product.productId);
+        final MailSetting mailSetting = new MailSetting(false);
+
+		PromotionMail.sendEmails(product, userList, mailSetting);
+	}
+
+	protected static void sendEmails(final Product product, final List<UserInfo> userList, final MailSetting mailSetting) throws IOException
+	{
+        if(userList == null || userList.isEmpty()) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+        System.out.println("开始发送邮件");
+        for (UserInfo userInfo : userList) {
+            final PromotionMailMessage message = new PromotionMailMessage(userInfo.email, userInfo.name, product.productDesc);
+            MailService.send(message, mailSetting);
+        }
+	}
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java
new file mode 100644
index 0000000000..e6f1548559
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/PromotionMailMessage.java
@@ -0,0 +1,37 @@
+package main.java.com.coderising.ood.srp;
+
+public class PromotionMailMessage implements MailMessage {
+    private final static String FROM_ADDRESS = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    private final static String SUBJECT = "您关注的产品降价了";
+    private final String toAddress;
+    private final String message;
+
+    public PromotionMailMessage(final String toAddress, final String userName, final String productDesc){
+        this.toAddress = toAddress;
+        if (toAddress.length() > 0) {
+            message = "尊敬的 "+userName+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
+        } else {
+            message = null;
+        }
+    }
+
+    @Override
+    public String getFromAddress() {
+        return FROM_ADDRESS;
+    }
+
+    @Override
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    @Override
+    public String getSubject() {
+        return SUBJECT;
+    }
+
+    @Override
+    public String getMessageBody() {
+        return message;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java b/students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java
new file mode 100644
index 0000000000..b62d9b0072
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/UserDataStore.java
@@ -0,0 +1,15 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.List;
+
+public class UserDataStore {
+
+    public static List<UserInfo> getMailingList(String productId) throws Exception {
+        final String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productId +"' "
+                + "and send_mail=1 ";
+
+        return DBUtil.query(sendMailQuery);
+    }
+
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..26272ef017
--- /dev/null
+++ b/students/1417442485/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,11 @@
+package main.java.com.coderising.ood.srp;
+
+public class UserInfo {
+    final String name;
+    final String email;
+
+    public UserInfo(final String name, final String email) {
+        this.name = name;
+        this.email = email;
+    }
+}
diff --git a/students/1417442485/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1417442485/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/1417442485/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

From 68bbd3da94f3d1f325eea28543cbb8142ce42ca3 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 12:09:44 +0800
Subject: [PATCH 132/332] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/PromotionMail.java |  5 ++--
 .../coderising/ood/srp/utils/ArgsUtil.java    | 28 +++++++++++++++++++
 .../coderising/ood/srp/utils/FileUtil.java    |  9 +++---
 3 files changed, 36 insertions(+), 6 deletions(-)
 create mode 100644 students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java

diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 6e3d09fcb3..0be9b165c9 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -2,6 +2,7 @@
 
 import com.coderising.ood.srp.utils.DBUtil;
 import com.coderising.ood.srp.utils.MailUtil;
+import com.coderising.ood.srp.utils.ArgsUtil;
 
 import java.io.IOException;
 import java.util.*;
@@ -45,7 +46,7 @@ private List<Map<String, String>> loadMailingList() throws Exception {
      * @param mailingList
      */
     private void initMailInfoList(List<Map<String, String>> mailingList) {
-        if (mailingList!=null && !mailingList.isEmpty()){
+        if (ArgsUtil.isNotEmpty(mailingList)){
             for (Map<String, String> map : mailingList){
                 // 初始化 mailInfoList
                 mailInfoList.add(buildMailInfo(map));
@@ -73,7 +74,7 @@ private MailInfo buildMailInfo(Map<String, String> userInfo){
      */
     public void sendEMails(boolean debug) throws IOException {
         System.out.println("开始发送邮件... ...");
-        if (mailInfoList!=null && !mailInfoList.isEmpty()) {
+        if (ArgsUtil.isNotEmpty(mailInfoList)) {
             for (MailInfo mailInfo : mailInfoList){
                 MailUtil.sendEmail(mailInfo.toAddress, mailInfo.subject, mailInfo.message, debug);
             }
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java
new file mode 100644
index 0000000000..b329a9ade4
--- /dev/null
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/ArgsUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.utils;
+
+import java.util.List;
+
+/**
+ * ArgsUtil
+ *
+ * @author Chenpz
+ * @package com.coderising.ood.srp.utils
+ * @date 2017/6/17/11:56
+ */
+public final class ArgsUtil {
+
+    private ArgsUtil(){
+        throw new RuntimeException("illegal called!");
+    }
+
+    public static boolean isNotNull(Object object){
+
+        return object != null;
+    }
+
+    public static boolean isNotEmpty(List list){
+
+        return isNotNull(list) && !list.isEmpty();
+    }
+
+}
diff --git a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
index 83b10391e2..43af9df5e4 100644
--- a/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
+++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -2,10 +2,7 @@
 
 import com.coderising.ood.srp.ProductInfo;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -23,6 +20,10 @@ private FileUtil(){
     }
 
     public static List<ProductInfo> readProductInfoFromFile(String filePath) throws IOException{
+
+        if (!ArgsUtil.isNotNull(filePath))
+            throw new IllegalArgumentException("illegal arguments");
+
         File file = new File(filePath);
         BufferedReader br = null;
         List<ProductInfo> productInfoList = new ArrayList<>();

From efa38578b9b4aa98375624204b4df57b2c1d6170 Mon Sep 17 00:00:00 2001
From: peng <pzsoftchen@gmail.com>
Date: Sat, 17 Jun 2017 12:17:39 +0800
Subject: [PATCH 133/332] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B7=A5=E7=A8=8B?=
 =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E5=92=8C=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1395844061/README.md                                  | 3 ++-
 .../src/test/java/com/coderising/ood/srp/MainTest.java         | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/students/1395844061/README.md b/students/1395844061/README.md
index 8b13789179..32243de0c9 100644
--- a/students/1395844061/README.md
+++ b/students/1395844061/README.md
@@ -1 +1,2 @@
-
+### 1395844061 ood 
+1. ood代码优化
diff --git a/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
index 9c80f94619..2bf0df1070 100644
--- a/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
+++ b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java
@@ -1,5 +1,6 @@
 package com.coderising.ood.srp;
 
+import com.coderising.ood.srp.utils.ArgsUtil;
 import com.coderising.ood.srp.utils.FileUtil;
 
 import java.util.List;
@@ -16,7 +17,7 @@ public class MainTest {
     public static void main(String[] args) throws Exception{
         String filePath = MainTest.class.getClassLoader().getResource("product_promotion.txt").getFile();
         List<ProductInfo> productInfoList = FileUtil.readProductInfoFromFile(filePath);
-        if (productInfoList != null && !productInfoList.isEmpty()){
+        if (ArgsUtil.isNotEmpty(productInfoList)){
             for (ProductInfo productInfo: productInfoList){
                 new PromotionMail(productInfo)
                         .sendEMails(false);

From 8ad22887a209da5df8e1d4c7d382e362c4c72da1 Mon Sep 17 00:00:00 2001
From: Yangming Xie <yangmingxiework@gmail.com>
Date: Sat, 17 Jun 2017 01:50:40 -0400
Subject: [PATCH 134/332] optimize

---
 .../ood-assignment/product_promotion.txt      |   4 +
 .../java/com/coderising/ood/srp/Mail.java     |  74 ++++---------
 .../java/com/coderising/ood/srp/Product.java  |  12 +--
 .../com/coderising/ood/srp/PromotionMail.java | 101 +++++++++++++-----
 4 files changed, 101 insertions(+), 90 deletions(-)
 create mode 100644 students/702282822/ood-assignment/product_promotion.txt

diff --git a/students/702282822/ood-assignment/product_promotion.txt b/students/702282822/ood-assignment/product_promotion.txt
new file mode 100644
index 0000000000..a98917f829
--- /dev/null
+++ b/students/702282822/ood-assignment/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/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
index 9773a990ba..c7c6bc3ba3 100644
--- a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -8,25 +8,22 @@
 
 public abstract class Mail {
 	
-	private String smtpHost = null;
-	private String altSmtpHost = null; 
-	private String fromAddress = null;
-	private String toAddress = 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 sendMailQuery = null;
 
 	
-	public Mail(File file, Boolean mailDebug) throws Exception
+	public Mail(File file) throws Exception
 	{
 		readFile(file);	
 		setSMTPHost();
 		setAltSMTPHost(); 
-		setFromAddress();
-							
-		setSendMailQuery();			
-		List mailingList = loadMailingList();					
-		sendEMails(mailDebug, mailingList); 
+		setFromAddress();						
+		 
 		
 	}
 	protected abstract void readFile(File fie) throws IOException;	
@@ -48,7 +45,7 @@ protected void setFromAddress()
 		fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
 	}
 	
-	protected abstract void setSendMailQuery() throws Exception;
+	
 	
 			
 	protected List loadMailingList() throws Exception {			//user information, name and email address
@@ -56,65 +53,30 @@ protected List loadMailingList() throws Exception {			//user information, name a
 	}
 		
 		
-	protected abstract void setMessage(String name) throws IOException;
-	
-	
-			
+	//protected abstract void setMessage(String name) throws IOException;			
 	
 	
 	protected void setToAddress(HashMap userInfo){
 		toAddress = (String) userInfo.get(Configuration.EMAIL_KEY); 		
 	}
 	
-	protected void configureEMail(HashMap userInfo) throws IOException 
-	{
-		if (toAddress.length() > 0) 
-			setMessage((String)userInfo.get(Configuration.NAME_KEY)); 
-	}
+	
+	protected abstract void emailProcessing(List mailingList, boolean debug) throws IOException, Exception;
 	
 	
-	protected void sendEMails(boolean debug, List mailingList) throws IOException 
+	protected void sendEMails(boolean debug) throws Exception 
 	{
-
+		
+		List mailingList = loadMailingList();	//persons
+		
 		System.out.println("开始发送邮件");
-	
-
-		if (mailingList != null) {
-			Iterator iter = mailingList.iterator();
-			while (iter.hasNext()) {
-				HashMap userInfo = (HashMap) iter.next();				
-				setToAddress(userInfo);				
-				configureEMail(userInfo);  
-				try 
-				{
-					if (toAddress.length() > 0)
-						sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
-				} 
-				catch (Exception e) 
-				{
-					
-					try {
-						sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
-						
-					} catch (Exception e2) 
-					{
-						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
-					}
-				}
-			}
-			
-
-		}
-
-		else {
-			System.out.println("没有邮件发送");
-			
-		}
+		emailProcessing(mailingList, debug);
 
 	}
 	
 	public void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
-			boolean debug) {
+			boolean debug) {	
+		
 		//假装发了一封邮件
 		StringBuilder buffer = new StringBuilder();
 		buffer.append("From:").append(fromAddress).append("\n");
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
index 5d4fb8dce4..d12c24ddba 100644
--- a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -2,26 +2,26 @@
 
 public class Product {
 	
-	private static String productID; 
-	private static String productDesc;
+	private String productID; 
+	private String productDesc;
 	
 	
-	protected static void setProductID(String ID) 
+	protected void setProductID(String ID) 
 	{ 
 		productID = ID; 
 		
 	} 
 
-	protected static String getProductID() 
+	protected String getProductID() 
 	{
 		return productID; 
 	}
 	
-	protected static void setProductDesc(String desc) {
+	protected void setProductDesc(String desc) {
 		productDesc = desc;		
 	}
 	
-	protected static String getProductDesc(){
+	protected String getProductDesc(){
 		return productDesc;		
 	}
 
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index e126809ad6..22783ba987 100644
--- a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -4,42 +4,92 @@
 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.LinkedList;
 import java.util.List;
 
 public class PromotionMail extends Mail {			//inheritance from mail	
 	
+	private LinkedList<Product> products;
 
 	public static void main(String[] args) throws Exception {
 
-		File f = new File("\\product_promotion.txt");
+		File f = new File("./product_promotion.txt");		
 		boolean emailDebug = false;
-
 		PromotionMail pe = new PromotionMail(f, emailDebug);
-
+		
 	}
 	
-	public PromotionMail(File file, boolean mailDebug) throws Exception {				
-		super(file, mailDebug);
+	public PromotionMail(File file, boolean mailDebug) throws Exception 
+	{				
+		super(file);
+		products = new LinkedList<>();
+		sendEMails(mailDebug);
 	}
 	
 	
 	
-	protected void setSendMailQuery() throws Exception {		
+	protected void setSendMailQuery(Product pro) throws Exception {		
 		sendMailQuery = "Select name from subscriptions "
-				+ "where product_id= '" + Product.getProductID() +"' "
+				+ "where product_id= '" + pro.getProductID() +"' "
 				+ "and send_mail=1 ";
 				
 		System.out.println("loadQuery set");
 	}
 
-	protected void setMessage(String name) throws IOException 
+	protected void setMessage(String name, Product pro) throws IOException 
 	{				
 		subject = "您关注的产品降价了";
-		message = "尊敬的 "+ name +", 您关注的产品 " + Product.getProductDesc() + " 降价了，欢迎购买!" ;						
+		message = "尊敬的 "+ name +", 您关注的产品 " + pro.getProductDesc() + " 降价了，欢迎购买!" ;						
+	}
+	
+	protected void emailProcessing(List mailingList, boolean debug) throws Exception	
+	{
+		
+		for(Product pro : products){
+		
+			setSendMailQuery(pro);		
+			
+			if (mailingList != null) 
+			{
+				Iterator iter = mailingList.iterator();
+				while (iter.hasNext()) 
+				{
+					HashMap userInfo = (HashMap) iter.next();				
+					setToAddress(userInfo);				
+					if (toAddress.length() > 0) 
+						setMessage((String)userInfo.get(Configuration.NAME_KEY), pro); 
+					
+					try 
+					{
+						if (toAddress.length() > 0)
+							sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+					} 
+					catch (Exception e) 
+					{
+						
+						try {
+							sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
+							
+						} catch (Exception e2) 
+						{
+							System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+						}
+					}
+				}
+			
+			}
+			else {
+				System.out.println("没有邮件发送");			
+			}
+			
+		}
+		
+		
 	}
+	
+	
 
 
 	@Override
@@ -48,15 +98,20 @@ 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(" ");
-			
-			Product.setProductID(data[0]); 
-			Product.setProductDesc(data[1]); 
-			
-			System.out.println("产品ID = " + Product.getProductID() + "\n");
-			System.out.println("产品描述 = " + Product.getProductDesc() + "\n");
+			String sCurrentLine = "";
 
+			while ((sCurrentLine = br.readLine()) != null) 
+			{
+				Product prod = new Product();
+				String[] data = sCurrentLine.split(" ");			
+				prod.setProductID(data[0]); 
+				prod.setProductDesc(data[1]); 
+				
+				System.out.println("产品ID = " + prod.getProductID() + "\n");
+				System.out.println("产品描述 = " + prod.getProductDesc() + "\n");			
+				products.add(prod);
+			}
+			
 		} catch (IOException e) {
 			throw new IOException(e.getMessage());
 		} finally {
@@ -64,14 +119,4 @@ protected void readFile(File file) throws IOException // @02C
 		}
 	}
 		
-		
-		
-	
-	
-	
-	
-	
-	
-	
-	
 }

From c7e82030836c9f6a40876ac6cd525b9a6b1de579 Mon Sep 17 00:00:00 2001
From: ThomasChant <xgct0505@163.com>
Date: Sat, 17 Jun 2017 14:14:46 +0800
Subject: [PATCH 135/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=91=A8=E5=AE=8C?=
 =?UTF-8?q?=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/494800949/pom.xml                    |  12 ++
 .../ood/assignment/srp/Configuration.java     |  24 +++
 .../ood/assignment/srp/ConfigurationKeys.java |   9 +
 .../main/java/ood/assignment/srp/DBUtil.java  |  25 +++
 .../java/ood/assignment/srp/MailUtil.java     |  19 ++
 .../ood/assignment/srp/PromotionMail.java     | 198 ++++++++++++++++++
 .../ood/assignment/srp/product_promotion.txt  |   4 +
 .../main/java/ood/work/srp/Configuration.java |  24 +++
 .../java/ood/work/srp/ConfigurationKeys.java  |   9 +
 .../src/main/java/ood/work/srp/DBUtil.java    |  24 +++
 .../src/main/java/ood/work/srp/Email.java     |  41 ++++
 .../src/main/java/ood/work/srp/Emails.java    |  38 ++++
 .../src/main/java/ood/work/srp/MailUtil.java  |  24 +++
 .../src/main/java/ood/work/srp/Product.java   |  26 +++
 .../java/ood/work/srp/ProductInfoLoader.java  |  35 ++++
 .../main/java/ood/work/srp/PromotionMail.java |  32 +++
 .../main/java/ood/work/srp/SMTPClient.java    |  71 +++++++
 .../src/main/java/ood/work/srp/User.java      |  25 +++
 18 files changed, 640 insertions(+)
 create mode 100644 students/494800949/pom.xml
 create mode 100644 students/494800949/src/main/java/ood/assignment/srp/Configuration.java
 create mode 100644 students/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java
 create mode 100644 students/494800949/src/main/java/ood/assignment/srp/DBUtil.java
 create mode 100644 students/494800949/src/main/java/ood/assignment/srp/MailUtil.java
 create mode 100644 students/494800949/src/main/java/ood/assignment/srp/PromotionMail.java
 create mode 100644 students/494800949/src/main/java/ood/assignment/srp/product_promotion.txt
 create mode 100644 students/494800949/src/main/java/ood/work/srp/Configuration.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/DBUtil.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/Email.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/Emails.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/MailUtil.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/Product.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/PromotionMail.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/SMTPClient.java
 create mode 100644 students/494800949/src/main/java/ood/work/srp/User.java

diff --git a/students/494800949/pom.xml b/students/494800949/pom.xml
new file mode 100644
index 0000000000..521e154bc6
--- /dev/null
+++ b/students/494800949/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>season2</groupId>
+    <artifactId>season2</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+
+</project>
\ No newline at end of file
diff --git a/students/494800949/src/main/java/ood/assignment/srp/Configuration.java b/students/494800949/src/main/java/ood/assignment/srp/Configuration.java
new file mode 100644
index 0000000000..858e860697
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/Configuration.java
@@ -0,0 +1,24 @@
+package ood.assignment.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java b/students/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..c41514a2fb
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package ood.assignment.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/494800949/src/main/java/ood/assignment/srp/DBUtil.java b/students/494800949/src/main/java/ood/assignment/srp/DBUtil.java
new file mode 100644
index 0000000000..26ba6bb524
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package ood.assignment.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/494800949/src/main/java/ood/assignment/srp/MailUtil.java b/students/494800949/src/main/java/ood/assignment/srp/MailUtil.java
new file mode 100644
index 0000000000..03aca56c16
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/MailUtil.java
@@ -0,0 +1,19 @@
+package ood.assignment.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/494800949/src/main/java/ood/assignment/srp/PromotionMail.java b/students/494800949/src/main/java/ood/assignment/srp/PromotionMail.java
new file mode 100644
index 0000000000..326f56a3d5
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/srp/PromotionMail.java
@@ -0,0 +1,198 @@
+package ood.assignment.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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("I:\\sourceCode\\coding2017_2\\students\\494800949\\src\\main\\java\\ood\\assignment\\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/494800949/src/main/java/ood/assignment/srp/product_promotion.txt b/students/494800949/src/main/java/ood/assignment/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/494800949/src/main/java/ood/assignment/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/494800949/src/main/java/ood/work/srp/Configuration.java b/students/494800949/src/main/java/ood/work/srp/Configuration.java
new file mode 100644
index 0000000000..878ae499c2
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Configuration.java
@@ -0,0 +1,24 @@
+package ood.work.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java b/students/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..6127d61f88
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package ood.work.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/494800949/src/main/java/ood/work/srp/DBUtil.java b/students/494800949/src/main/java/ood/work/srp/DBUtil.java
new file mode 100644
index 0000000000..48f108e054
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/DBUtil.java
@@ -0,0 +1,24 @@
+package ood.work.srp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List<User> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User userInfo = new User();
+			userInfo.setName("User" + i);
+			userInfo.setEmail("aa"+ i +"@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/Email.java b/students/494800949/src/main/java/ood/work/srp/Email.java
new file mode 100644
index 0000000000..2d3c4a4995
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Email.java
@@ -0,0 +1,41 @@
+package ood.work.srp;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class Email {
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Email(String toAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/Emails.java b/students/494800949/src/main/java/ood/work/srp/Emails.java
new file mode 100644
index 0000000000..768e513c88
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Emails.java
@@ -0,0 +1,38 @@
+package ood.work.srp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class Emails {
+
+    public static Email newEmail(User user, Product product) {
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+        return new Email(user.getEmail(), subject, message);
+    }
+
+    public static List<Email> createEmails(String path) throws IOException {
+        List<Product> products = ProductInfoLoader.readFile(path);
+        List<Email> mails = new ArrayList<>();
+        for (Product product : products) {
+            String sql = getSql(product.getProductId());
+            List<User> users = DBUtil.query(sql);
+            for (User user : users) {
+                Email mail = Emails.newEmail(user, product);
+                mails.add(mail);
+            }
+        }
+        return mails;
+    }
+
+    private static String getSql(String productId) {
+        System.out.println("loadQuery set");
+        return "Select name from subscriptions "
+                + "where product_id= '" + productId +"' "
+                + "and send_mail=1 ";
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/MailUtil.java b/students/494800949/src/main/java/ood/work/srp/MailUtil.java
new file mode 100644
index 0000000000..43ab9a4339
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/MailUtil.java
@@ -0,0 +1,24 @@
+package ood.work.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());
+		
+	}
+
+	public static void sendEmail(Email mailInfo, String fromAddress, String smtphost, boolean debug) {
+		String toAddress = mailInfo.getToAddress();
+		String subject = mailInfo.getSubject();
+		String message = mailInfo.getMessage();
+		sendEmail(toAddress, fromAddress, subject, message, smtphost, debug);
+	}
+
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/Product.java b/students/494800949/src/main/java/ood/work/srp/Product.java
new file mode 100644
index 0000000000..b3b4400014
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/Product.java
@@ -0,0 +1,26 @@
+package ood.work.srp;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ * 商品类
+ */
+public class Product {
+    private String productId;
+    private String 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/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java b/students/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java
new file mode 100644
index 0000000000..8a484e9524
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/ProductInfoLoader.java
@@ -0,0 +1,35 @@
+package ood.work.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class ProductInfoLoader {
+
+    public static List<Product> readFile(String path) throws IOException // @02C
+    {
+        File file = new File(path);
+        List<Product> products = new ArrayList<>();
+        try(BufferedReader br = new BufferedReader(new FileReader(file))) {
+            String line;
+            while ((line = br.readLine()) != null) {
+                String[] data = line.split(" ");
+                Product product = new Product();
+                product.setProductId(data[0]);
+                product.setProductDesc(data[1]);
+                products.add(product);
+                System.out.println("产品ID = " + product.getProductId() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+            }
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        }
+        return products;
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/PromotionMail.java b/students/494800949/src/main/java/ood/work/srp/PromotionMail.java
new file mode 100644
index 0000000000..fb9e5e0774
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/PromotionMail.java
@@ -0,0 +1,32 @@
+package ood.work.srp;
+
+import java.io.IOException;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class PromotionMail {
+
+    private String path;
+
+    public PromotionMail(String path) {
+        this.path = path;
+    }
+
+    public void execute() throws IOException {
+        SMTPClient client = new SMTPClient();
+        client.sendEmails(false, Emails.createEmails(path));
+    }
+
+
+
+    public static void main(String[] args) {
+        String path = "I:\\sourceCode\\coding2017_2\\students\\494800949\\src\\main\\java\\ood\\assignment\\srp\\product_promotion.txt";
+        PromotionMail mail = new PromotionMail(path);
+        try {
+            mail.execute();
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+    }
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/SMTPClient.java b/students/494800949/src/main/java/ood/work/srp/SMTPClient.java
new file mode 100644
index 0000000000..dda491e029
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/SMTPClient.java
@@ -0,0 +1,71 @@
+package ood.work.srp;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ *
+ */
+public class SMTPClient {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String emailAdmin;
+
+    public void config() {
+        Configuration configuration = new Configuration();
+        this.smtpHost = configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+        this.altSmtpHost = configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        this.emailAdmin = configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public SMTPClient() {
+        config();
+    }
+
+    /**
+     * 发送一封邮件
+     * @param debug
+     * @param mailInfo
+     */
+    public void sendEmail(boolean debug, Email mailInfo) {
+        try
+        {
+            if (mailInfo.getToAddress().length() > 0)
+                MailUtil.sendEmail(mailInfo, emailAdmin, smtpHost, debug);
+        }
+        catch (Exception e)
+        {
+
+            try {
+                MailUtil.sendEmail(mailInfo, emailAdmin, altSmtpHost, debug);
+
+            } catch (Exception e2)
+            {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+
+
+    /**
+     * 发送多封邮件
+     */
+
+    public void sendEmails(boolean debug, List<Email> mailingList){
+        if (mailingList != null) {
+            Iterator<Email> iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                sendEmail(debug, iter.next());
+            }
+        }
+        else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+
+
+}
diff --git a/students/494800949/src/main/java/ood/work/srp/User.java b/students/494800949/src/main/java/ood/work/srp/User.java
new file mode 100644
index 0000000000..091f594199
--- /dev/null
+++ b/students/494800949/src/main/java/ood/work/srp/User.java
@@ -0,0 +1,25 @@
+package ood.work.srp;
+
+/**
+ * Created by Administrator on 2017/6/17 0017.
+ */
+public class User {
+    private String name;
+    private String 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;
+    }
+}

From 5168c5602703b08a1dc7c4f7a8df4ec4d57feddd Mon Sep 17 00:00:00 2001
From: MIMIEYES <haolllllllll@qq.com>
Date: Sat, 17 Jun 2017 14:16:18 +0800
Subject: [PATCH 136/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E5=91=A8=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/402246209/learning/pom.xml           |  12 ++
 .../mimieye/odd/srp/config/Configuration.java |  27 +++++
 .../odd/srp/config/ConfigurationKeys.java     |  11 ++
 .../srp/controller/PromotionAbstractMail.java | 108 ++++++++++++++++++
 .../odd/srp/controller/PromotionMail.java     |  19 +++
 .../com/mimieye/odd/srp/dao/UserInfoDAO.java  |  13 +++
 .../odd/srp/dao/impl/UserInfoDAOImpl.java     |  20 ++++
 .../odd/srp/main/PromotionEmailMain.java      |  17 +++
 .../odd/srp/service/PromotionInfoService.java |  13 +++
 .../odd/srp/service/UserInfoService.java      |  12 ++
 .../impl/PromotionInfoServiceImpl.java        |  41 +++++++
 .../srp/service/impl/UserInfoServiceImpl.java |  24 ++++
 .../java/com/mimieye/odd/srp/util/DBUtil.java |  25 ++++
 .../mimieye/odd/srp/util/FileReadUtil.java    |  42 +++++++
 .../com/mimieye/odd/srp/util/MailUtil.java    |  18 +++
 .../mimieye/odd/srp/util/PropertiesUtil.java  |  18 +++
 .../src/main/resources/config.properties      |   5 +
 .../src/main/resources/product_promotion.txt  |   4 +
 18 files changed, 429 insertions(+)
 create mode 100644 students/402246209/learning/pom.xml
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java
 create mode 100644 students/402246209/learning/src/main/resources/config.properties
 create mode 100644 students/402246209/learning/src/main/resources/product_promotion.txt

diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml
new file mode 100644
index 0000000000..23830a6621
--- /dev/null
+++ b/students/402246209/learning/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.mimieye</groupId>
+    <artifactId>learning</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+
+</project>
\ No newline at end of file
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java
new file mode 100644
index 0000000000..d4e3c6fe16
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/Configuration.java
@@ -0,0 +1,27 @@
+package com.mimieye.odd.srp.config;
+import com.mimieye.odd.srp.util.PropertiesUtil;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class Configuration {
+	private static final String CONFIG_FILENAME = "config.properties";
+	static Properties configurations = null;
+	static{
+        try {
+            configurations = PropertiesUtil.getInstance(CONFIG_FILENAME);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+	/**
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+		return configurations.getProperty(key);
+	}
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..7f1a264d0a
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/config/ConfigurationKeys.java
@@ -0,0 +1,11 @@
+package com.mimieye.odd.srp.config;
+
+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";
+	public static final String PROMOTION_FILEPATH = "promotion.filepath";
+	public static final String EMAIL_DEBUG = "emailDebug";
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java
new file mode 100644
index 0000000000..eb7544b4f1
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionAbstractMail.java
@@ -0,0 +1,108 @@
+package com.mimieye.odd.srp.controller;
+
+import com.mimieye.odd.srp.config.Configuration;
+import com.mimieye.odd.srp.config.ConfigurationKeys;
+import com.mimieye.odd.srp.dao.impl.UserInfoDAOImpl;
+import com.mimieye.odd.srp.service.PromotionInfoService;
+import com.mimieye.odd.srp.service.UserInfoService;
+import com.mimieye.odd.srp.service.impl.PromotionInfoServiceImpl;
+import com.mimieye.odd.srp.service.impl.UserInfoServiceImpl;
+import com.mimieye.odd.srp.util.MailUtil;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public abstract class PromotionAbstractMail {
+
+    protected static Configuration config;
+    protected static final String NAME_KEY = "NAME";
+    protected static final String EMAIL_KEY = "EMAIL";
+    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 filePath;
+    protected boolean mailDebug;
+    protected List userInfos;
+    protected String productID;
+    protected String productDesc;
+
+    public void init() throws Exception{
+        config = new Configuration();
+        setFilePath(config.getProperty(ConfigurationKeys.PROMOTION_FILEPATH));
+        setMailDebug(Boolean.parseBoolean(ConfigurationKeys.EMAIL_DEBUG));
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+        // 降价商品service
+        PromotionInfoService promotionInfoService = new PromotionInfoServiceImpl();
+        // 邮件接收人service
+        UserInfoService userInfoService = new UserInfoServiceImpl(new UserInfoDAOImpl());
+        // 获取第一条降价商品
+        Map<String,String> promotion = promotionInfoService.listPromotions(filePath).get(0);
+        setProductID(promotion.get("productID"));
+        setProductDesc(promotion.get("productDesc"));
+        // 获取邮件接收人
+        setUserInfos(userInfoService.loadMailingList(productID));
+    }
+
+
+    protected void configureEMail(HashMap userInfo) throws IOException {
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0)
+            setMessage(userInfo);
+    }
+
+    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("没有邮件发送");
+        }
+
+    }
+
+    public void send() throws IOException { sendEMails(mailDebug, userInfos); }
+
+    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 setFilePath(String filePath) { this.filePath = filePath; }
+
+    protected void setMailDebug(boolean mailDebug) { this.mailDebug = mailDebug; }
+
+    protected void setUserInfos(List userInfos) { this.userInfos = userInfos; }
+
+    protected void setProductID(String productID) { this.productID = productID; }
+
+    protected void setProductDesc(String productDesc) { this.productDesc = productDesc; }
+
+    protected abstract void setMessage(HashMap userInfo) throws IOException ;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java
new file mode 100644
index 0000000000..983126e4db
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/controller/PromotionMail.java
@@ -0,0 +1,19 @@
+package com.mimieye.odd.srp.controller;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class PromotionMail extends PromotionAbstractMail{
+
+    /**
+     * 自定义邮件内容
+     * @param userInfo
+     * @throws IOException
+     */
+    protected void setMessage(HashMap userInfo) throws IOException {
+        String name = (String) userInfo.get(NAME_KEY);
+        subject = "您关注的产品降价了";
+        message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+    }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java
new file mode 100644
index 0000000000..00ef1860b2
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/UserInfoDAO.java
@@ -0,0 +1,13 @@
+package com.mimieye.odd.srp.dao;
+
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public interface UserInfoDAO {
+
+    List loadMailingList(String productID) throws Exception;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java
new file mode 100644
index 0000000000..c59b4bde9e
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/dao/impl/UserInfoDAOImpl.java
@@ -0,0 +1,20 @@
+package com.mimieye.odd.srp.dao.impl;
+
+import com.mimieye.odd.srp.dao.UserInfoDAO;
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public class UserInfoDAOImpl implements UserInfoDAO {
+
+    public List loadMailingList(String productID) throws Exception {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return DBUtil.query(sendMailQuery);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java
new file mode 100644
index 0000000000..4a6c4366b2
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/main/PromotionEmailMain.java
@@ -0,0 +1,17 @@
+package com.mimieye.odd.srp.main;
+
+import com.mimieye.odd.srp.controller.PromotionAbstractMail;
+import com.mimieye.odd.srp.controller.PromotionMail;
+
+/**
+ * Created by Pierreluo on 2017/6/17.
+ */
+public class PromotionEmailMain {
+    public static void main(String[] args) throws Exception {
+        PromotionAbstractMail mail = new PromotionMail();
+        // 初始化数据
+        mail.init();
+        // 发送邮件
+        mail.send();
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java
new file mode 100644
index 0000000000..bfcb508100
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/PromotionInfoService.java
@@ -0,0 +1,13 @@
+package com.mimieye.odd.srp.service;
+
+import com.mimieye.odd.srp.util.FileReadUtil;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public interface PromotionInfoService {
+    List<Map<String, String>> listPromotions(String filePath) throws Exception;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java
new file mode 100644
index 0000000000..57747f298a
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/UserInfoService.java
@@ -0,0 +1,12 @@
+package com.mimieye.odd.srp.service;
+
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public interface UserInfoService {
+    List loadMailingList(String productID) throws Exception;
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java
new file mode 100644
index 0000000000..20aa392ea2
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/PromotionInfoServiceImpl.java
@@ -0,0 +1,41 @@
+package com.mimieye.odd.srp.service.impl;
+
+import com.mimieye.odd.srp.service.PromotionInfoService;
+import com.mimieye.odd.srp.util.FileReadUtil;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public class PromotionInfoServiceImpl implements PromotionInfoService {
+
+    @Override
+    public List<Map<String, String>> listPromotions(String filePath) throws Exception {
+        List<Map<String,String>> list = null;
+        List<String> results = FileReadUtil.readFile(filePath);
+        if(results != null && results.size()>0){
+            list = new ArrayList<>();
+            String temp = null;
+            String[] data = null;
+            Map<String,String> map = null;
+            Iterator<String> iterator = results.iterator();
+            int i=1;
+            while(iterator.hasNext()){
+                temp = iterator.next();
+                data = temp.split(" ");
+                map = new HashMap<>();
+                map.put("productID",data[0]);
+                map.put("productDesc",data[1]);
+                list.add(map);
+                System.out.println("产品"+(i)+"ID = " + data[0] );
+                System.out.println("产品"+(i++)+"描述 = " + data[1] + "\n");
+            }
+        }else{
+            throw new IOException("No Records.");
+        }
+        return list;
+    }
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java
new file mode 100644
index 0000000000..39d7613a61
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/service/impl/UserInfoServiceImpl.java
@@ -0,0 +1,24 @@
+package com.mimieye.odd.srp.service.impl;
+
+import com.mimieye.odd.srp.dao.UserInfoDAO;
+import com.mimieye.odd.srp.service.UserInfoService;
+import com.mimieye.odd.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/15.
+ */
+public class UserInfoServiceImpl implements UserInfoService {
+
+    private UserInfoDAO dao;
+
+    public UserInfoServiceImpl(){}
+    public UserInfoServiceImpl(UserInfoDAO dao){
+        this.dao = dao;
+    }
+
+    public List loadMailingList(String productID) throws Exception {
+        return dao.loadMailingList(productID);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java
new file mode 100644
index 0000000000..c3e16050f4
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/DBUtil.java
@@ -0,0 +1,25 @@
+package com.mimieye.odd.srp.util;
+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/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java
new file mode 100644
index 0000000000..0c0a8f58cf
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/FileReadUtil.java
@@ -0,0 +1,42 @@
+package com.mimieye.odd.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Pierreluo on 2017/6/13.
+ */
+public class FileReadUtil {
+
+    public static List<String> readFile(String fileName) throws IOException {
+        File file = new File(fileName);
+        BufferedReader reader = null;
+        List<String> results = null;
+        try {
+            reader = new BufferedReader(new FileReader(file));
+            String tempString = null;
+            while ((tempString = reader.readLine()) != null) {
+                if(results == null){
+                    results = new ArrayList<>();
+                }
+                results.add(tempString);
+            }
+            reader.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw e;
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e1) {
+                }
+            }
+        }
+        return results;
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java
new file mode 100644
index 0000000000..b576aac1ed
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.mimieye.odd.srp.util;
+
+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/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java
new file mode 100644
index 0000000000..b40c49447c
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/srp/util/PropertiesUtil.java
@@ -0,0 +1,18 @@
+package com.mimieye.odd.srp.util;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * Created by Pierreluo on 2017/6/17.
+ */
+public class PropertiesUtil {
+
+    public static Properties getInstance(String fileName) throws Exception {
+        InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
+        Properties properties = new Properties();
+        properties.load(in);
+        return properties;
+    }
+}
diff --git a/students/402246209/learning/src/main/resources/config.properties b/students/402246209/learning/src/main/resources/config.properties
new file mode 100644
index 0000000000..290d819f1e
--- /dev/null
+++ b/students/402246209/learning/src/main/resources/config.properties
@@ -0,0 +1,5 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
+promotion.filepath=F:/projectL/coding2017/students/402246209/learning/src/main/resources/product_promotion.txt
+emailDebug=false
diff --git a/students/402246209/learning/src/main/resources/product_promotion.txt b/students/402246209/learning/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/402246209/learning/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From fd7b984a703f6178dbae0b8ef8d9f35a3d019062 Mon Sep 17 00:00:00 2001
From: XiaodanL <lxd1991_happy@163.com>
Date: Sat, 17 Jun 2017 14:18:08 +0800
Subject: [PATCH 137/332] =?UTF-8?q?[lixiaodan]=E7=AC=AC=E4=B8=80=E6=AC=A1?=
 =?UTF-8?q?=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/861924479/src/com/learning/test/Test.java | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 students/861924479/src/com/learning/test/Test.java

diff --git a/students/861924479/src/com/learning/test/Test.java b/students/861924479/src/com/learning/test/Test.java
new file mode 100644
index 0000000000..df9a26ef20
--- /dev/null
+++ b/students/861924479/src/com/learning/test/Test.java
@@ -0,0 +1,5 @@
+package com.learning.test;
+
+public class Test {
+
+}

From 21b17e0d76d3331f7b4e31bd6a00301bd77d6fef Mon Sep 17 00:00:00 2001
From: MIMIEYES <haolllllllll@qq.com>
Date: Sat, 17 Jun 2017 14:29:49 +0800
Subject: [PATCH 138/332] =?UTF-8?q?=E6=9B=B4=E6=94=B9pom.xml?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/402246209/learning/pom.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml
index 23830a6621..129bccd496 100644
--- a/students/402246209/learning/pom.xml
+++ b/students/402246209/learning/pom.xml
@@ -6,7 +6,8 @@
 
     <groupId>com.mimieye</groupId>
     <artifactId>learning</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>RELEASE</version>
+    <packaging>jar</packaging>
 
 
 </project>
\ No newline at end of file

From e5e176879e59389515697c4b2534ad41c022ee56 Mon Sep 17 00:00:00 2001
From: lorcx <740707954@qq.com>
Date: Sat, 17 Jun 2017 15:40:34 +0800
Subject: [PATCH 139/332] =?UTF-8?q?2017=E5=B9=B46=E6=9C=8817=E6=97=A5=2015?=
 =?UTF-8?q?:40:28?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../740707954/src/ood/newSrp/FileUtil.java    |  13 --
 .../740707954/src/ood/newSrp/MailSender.java  |  73 +++++++
 .../740707954/src/ood/newSrp/MailUtil.java    |  18 --
 .../src/ood/newSrp/PromotionMail.java         | 186 ++----------------
 .../ood/newSrp/{ => conf}/Configuration.java  |   9 +-
 .../src/ood/newSrp/entity/Email.java          |  57 ++++++
 .../src/ood/newSrp/entity/MainSmtpServer.java |   8 -
 .../src/ood/newSrp/entity/Notify.java         |  14 --
 .../src/ood/newSrp/entity/Product.java        |  31 ++-
 .../src/ood/newSrp/entity/SmtpServer.java     |   8 -
 .../src/ood/newSrp/entity/TempSmtpServer.java |   8 -
 .../ood/newSrp/server/MainSmtpFactory.java    |  11 ++
 .../src/ood/newSrp/server/MainSmtpServer.java |  30 +++
 .../src/ood/newSrp/server/ProductServer.java  |  55 ++++++
 .../src/ood/newSrp/server/SmtpFactory.java    |   8 +
 .../src/ood/newSrp/server/SmtpServer.java     |  19 ++
 .../ood/newSrp/server/TempSmtpFactory.java    |  11 ++
 .../src/ood/newSrp/server/TempSmtpServer.java |  29 +++
 .../src/ood/newSrp/server/UserServer.java     |  19 ++
 .../src/ood/newSrp/{ => util}/DBUtil.java     |   2 +-
 20 files changed, 363 insertions(+), 246 deletions(-)
 delete mode 100644 students/740707954/src/ood/newSrp/FileUtil.java
 create mode 100644 students/740707954/src/ood/newSrp/MailSender.java
 delete mode 100644 students/740707954/src/ood/newSrp/MailUtil.java
 rename students/740707954/src/ood/newSrp/{ => conf}/Configuration.java (88%)
 create mode 100644 students/740707954/src/ood/newSrp/entity/Email.java
 delete mode 100644 students/740707954/src/ood/newSrp/entity/MainSmtpServer.java
 delete mode 100644 students/740707954/src/ood/newSrp/entity/Notify.java
 delete mode 100644 students/740707954/src/ood/newSrp/entity/SmtpServer.java
 delete mode 100644 students/740707954/src/ood/newSrp/entity/TempSmtpServer.java
 create mode 100644 students/740707954/src/ood/newSrp/server/MainSmtpFactory.java
 create mode 100644 students/740707954/src/ood/newSrp/server/MainSmtpServer.java
 create mode 100644 students/740707954/src/ood/newSrp/server/ProductServer.java
 create mode 100644 students/740707954/src/ood/newSrp/server/SmtpFactory.java
 create mode 100644 students/740707954/src/ood/newSrp/server/SmtpServer.java
 create mode 100644 students/740707954/src/ood/newSrp/server/TempSmtpFactory.java
 create mode 100644 students/740707954/src/ood/newSrp/server/TempSmtpServer.java
 create mode 100644 students/740707954/src/ood/newSrp/server/UserServer.java
 rename students/740707954/src/ood/newSrp/{ => util}/DBUtil.java (95%)

diff --git a/students/740707954/src/ood/newSrp/FileUtil.java b/students/740707954/src/ood/newSrp/FileUtil.java
deleted file mode 100644
index 57508724a6..0000000000
--- a/students/740707954/src/ood/newSrp/FileUtil.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package ood.newSrp;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Created by Administrator on 2017/6/16 0016.
- */
-public class FileUtil {
-    protected void readFile(File file) throws IOException {
-
-    }
-}
diff --git a/students/740707954/src/ood/newSrp/MailSender.java b/students/740707954/src/ood/newSrp/MailSender.java
new file mode 100644
index 0000000000..14604b2c14
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/MailSender.java
@@ -0,0 +1,73 @@
+package ood.newSrp;
+
+import ood.newSrp.entity.Email;
+import ood.newSrp.entity.Product;
+import ood.newSrp.server.MainSmtpFactory;
+import ood.newSrp.server.SmtpServer;
+import ood.newSrp.server.TempSmtpFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 邮件发送器
+ * Created by lx on 2017/6/17.
+ */
+public class MailSender {
+
+    protected SmtpServer mainServer = new MainSmtpFactory().createSmtp();
+    protected SmtpServer tempServer = new TempSmtpFactory().createSmtp();
+    public static final String NAME_KEY = "NAME";
+
+    /**
+     * 批量发送邮件
+     * @param p 产品信息
+     * @param sendUserList 用户信息
+     * @param d
+     * @throws IOException
+     */
+    public void batchSendEMail(Product p, List<Map> sendUserList, boolean d) throws IOException {
+        System.out.println("--------开始发送邮件-------");
+        if (null == sendUserList || sendUserList.size() == 0) {
+            System.out.println("没有邮件发送");
+            return;
+        }
+
+        for (Map userInfo : sendUserList) {
+            Email email = new Email();
+            String toAddr = userInfo.get("EMAIL").toString();
+            email.setToAddress(toAddr);
+            email.setFromAddress(mainServer.address);
+            email.setSubject("您关注的产品降价了");
+            email.setMessage("尊敬的 " + userInfo.get(NAME_KEY).toString() + ", 您关注的产品 " + p.getProductDesc() + " 降价了，欢迎购买!");
+            try {
+                sendEmail(email, d);
+            } catch (Exception e) {
+                try {
+                    email.setFromAddress(tempServer.address);
+                    sendEmail(email, d);
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 发送邮件
+     * @param n
+     * @param debug
+     */
+    public static void sendEmail(Email n, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(n.getFromAddress()).append("\n");
+        buffer.append("To:").append(n.getToAddress()).append("\n");
+        buffer.append("Subject:").append(n.getSubject()).append("\n");
+        buffer.append("Content:").append(n.getMessage()).append("\n");
+        System.out.println(buffer.toString());
+
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/MailUtil.java b/students/740707954/src/ood/newSrp/MailUtil.java
deleted file mode 100644
index a6ec476715..0000000000
--- a/students/740707954/src/ood/newSrp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package ood.newSrp;
-
-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/740707954/src/ood/newSrp/PromotionMail.java b/students/740707954/src/ood/newSrp/PromotionMail.java
index 018f1aa8b9..74cb9741da 100644
--- a/students/740707954/src/ood/newSrp/PromotionMail.java
+++ b/students/740707954/src/ood/newSrp/PromotionMail.java
@@ -1,183 +1,31 @@
 package ood.newSrp;
 
-import ood.oldSrp.ConfigurationKeys;
+import ood.newSrp.entity.Product;
+import ood.newSrp.server.UserServer;
+import ood.newSrp.server.ProductServer;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  *  promotion 提升
  */
 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";
-
+    // 用户信息
+    private static UserServer ms = new UserServer();
+    // 邮件发送器
+    private static MailSender mSend = new MailSender();
 
     public static void main(String[] args) throws Exception {
-
-        File f = new File(System.getProperty("user.dir") + "/src/ood/oldSrp/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 {
-        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("没有邮件发送");
-
+        // 获取产品信息
+        List<Product> pList = ProductServer.getUserProduct();
+
+        for (Product p : pList) {
+            System.out.println("产品ID： " + p.getProductId() + "\n" + "产品描述：" + p.getProductDesc());
+            // 获取接收产品用户列表
+            List<Map> sendUserList = ms.querySendUser(p.getProductId());
+            // 发送邮件
+            mSend.batchSendEMail(p, sendUserList, false);
         }
 
     }
diff --git a/students/740707954/src/ood/newSrp/Configuration.java b/students/740707954/src/ood/newSrp/conf/Configuration.java
similarity index 88%
rename from students/740707954/src/ood/newSrp/Configuration.java
rename to students/740707954/src/ood/newSrp/conf/Configuration.java
index c2721b9a29..37bf3f3a58 100644
--- a/students/740707954/src/ood/newSrp/Configuration.java
+++ b/students/740707954/src/ood/newSrp/conf/Configuration.java
@@ -1,24 +1,25 @@
-package ood.newSrp;
-import ood.oldSrp.ConfigurationKeys;
+package ood.newSrp.conf;
 
+import ood.oldSrp.ConfigurationKeys;
 import java.util.HashMap;
 import java.util.Map;
 
 public class Configuration {
 
 	static Map<String,String> 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) {
-		
+	public static String getProperty(String key) {
 		return configurations.get(key);
 	}
 
diff --git a/students/740707954/src/ood/newSrp/entity/Email.java b/students/740707954/src/ood/newSrp/entity/Email.java
new file mode 100644
index 0000000000..17159b916b
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/entity/Email.java
@@ -0,0 +1,57 @@
+package ood.newSrp.entity;
+
+/**
+ * 邮件
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class Email {
+    private String subject;
+    private String message;
+    private String toAddress;
+    private String fromAddress;
+    private String smtpHost;
+
+    public Email() {
+
+    }
+
+    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 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 getSmtpHost() {
+        return smtpHost;
+    }
+
+    public void setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/entity/MainSmtpServer.java b/students/740707954/src/ood/newSrp/entity/MainSmtpServer.java
deleted file mode 100644
index 0e4cfa40bc..0000000000
--- a/students/740707954/src/ood/newSrp/entity/MainSmtpServer.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ood.newSrp.entity;
-
-/**
- * 主要服务器
- * Created by Administrator on 2017/6/15 0015.
- */
-public class MainSmtpServer implements SmtpServer {
-}
diff --git a/students/740707954/src/ood/newSrp/entity/Notify.java b/students/740707954/src/ood/newSrp/entity/Notify.java
deleted file mode 100644
index aa2caa1049..0000000000
--- a/students/740707954/src/ood/newSrp/entity/Notify.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package ood.newSrp.entity;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-/**
- * 通知表
- * Created by Administrator on 2017/6/15 0015.
- */
-public class Notify {
-    protected void setMessage(HashMap userInfo) throws IOException {
-
-    }
-}
diff --git a/students/740707954/src/ood/newSrp/entity/Product.java b/students/740707954/src/ood/newSrp/entity/Product.java
index e1851c1526..4fc38aacb4 100644
--- a/students/740707954/src/ood/newSrp/entity/Product.java
+++ b/students/740707954/src/ood/newSrp/entity/Product.java
@@ -1,10 +1,35 @@
 package ood.newSrp.entity;
 
 /**
- * 产品
+ * 产品信息
  * Created by Administrator on 2017/6/15 0015.
  */
 public class Product {
-    protected String productID = null;
-    protected String productDesc = null;
+    private String productId = null;
+    private String productDesc = null;
+
+    public Product() {
+
+    }
+
+    public Product(String productId, String productDesc) {
+        this.productId = productId;
+        this.productDesc = productDesc;
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
+    public String getProductId() {
+        return productId;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
 }
diff --git a/students/740707954/src/ood/newSrp/entity/SmtpServer.java b/students/740707954/src/ood/newSrp/entity/SmtpServer.java
deleted file mode 100644
index 0e1ede3dda..0000000000
--- a/students/740707954/src/ood/newSrp/entity/SmtpServer.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ood.newSrp.entity;
-
-/**
- * Created by Administrator on 2017/6/15 0015.
- */
-public interface SmtpServer {
-    String address = "";
-}
diff --git a/students/740707954/src/ood/newSrp/entity/TempSmtpServer.java b/students/740707954/src/ood/newSrp/entity/TempSmtpServer.java
deleted file mode 100644
index 01321fbf7a..0000000000
--- a/students/740707954/src/ood/newSrp/entity/TempSmtpServer.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package ood.newSrp.entity;
-
-/**
- * 备用服务器
- * Created by Administrator on 2017/6/15 0015.
- */
-public class TempSmtpServer implements SmtpServer {
-}
diff --git a/students/740707954/src/ood/newSrp/server/MainSmtpFactory.java b/students/740707954/src/ood/newSrp/server/MainSmtpFactory.java
new file mode 100644
index 0000000000..5dcfdc5a5b
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/MainSmtpFactory.java
@@ -0,0 +1,11 @@
+package ood.newSrp.server;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public class MainSmtpFactory implements SmtpFactory {
+    @Override
+    public SmtpServer createSmtp() {
+        return new MainSmtpServer();
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/MainSmtpServer.java b/students/740707954/src/ood/newSrp/server/MainSmtpServer.java
new file mode 100644
index 0000000000..6e9be0a9ab
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/MainSmtpServer.java
@@ -0,0 +1,30 @@
+package ood.newSrp.server;
+
+import ood.newSrp.conf.Configuration;
+import ood.oldSrp.ConfigurationKeys;
+
+/**
+ * 主要服务器
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class MainSmtpServer extends SmtpServer {
+
+    public MainSmtpServer() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        host = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+
+    /**
+     * 设置服务器地址
+     */
+    public void setServerAddr() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    /**
+     * 设置服务器host
+     */
+    public void setServerHost() {
+        host = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/ProductServer.java b/students/740707954/src/ood/newSrp/server/ProductServer.java
new file mode 100644
index 0000000000..db8efa8bc3
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/ProductServer.java
@@ -0,0 +1,55 @@
+package ood.newSrp.server;
+
+import ood.newSrp.entity.Product;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *产品服务
+ * Created by lx on 2017/6/17.
+ */
+public class ProductServer {
+    private static List<Product> pList = new ArrayList<>();
+    static {
+        try {
+            initSpecialProductList();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 生成优惠产品信息
+     * @return
+     * @throws IOException
+     */
+    private static void initSpecialProductList() throws IOException {
+        String filePath = System.getProperty("user.dir") + "/src/ood/oldSrp/product_promotion.txt";
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(filePath));
+            String pInfo;
+            while ((pInfo  = br.readLine()) != null) {
+                String[] data = pInfo.split(" ");
+                pList.add(new Product(data[0], data[1]));
+            }
+        } catch (IOException e) {
+            throw new IOException( "读取文件内容失败 " + e.getMessage());
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+    }
+
+    /**
+     * 获取用户的产品
+     * @return
+     */
+    public static List<Product> getUserProduct() {
+        return pList;
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/SmtpFactory.java b/students/740707954/src/ood/newSrp/server/SmtpFactory.java
new file mode 100644
index 0000000000..efdf3ec25b
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/SmtpFactory.java
@@ -0,0 +1,8 @@
+package ood.newSrp.server;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public interface SmtpFactory {
+    public SmtpServer createSmtp();
+}
\ No newline at end of file
diff --git a/students/740707954/src/ood/newSrp/server/SmtpServer.java b/students/740707954/src/ood/newSrp/server/SmtpServer.java
new file mode 100644
index 0000000000..ff35288d1f
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/SmtpServer.java
@@ -0,0 +1,19 @@
+package ood.newSrp.server;
+
+/**
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public abstract class SmtpServer {
+    public String address = "";
+    public String host = "";
+
+    /**
+     * 设置服务器地址
+     */
+    abstract void setServerAddr();
+
+    /**
+     * 设置服务器host
+     */
+    abstract void setServerHost();
+}
diff --git a/students/740707954/src/ood/newSrp/server/TempSmtpFactory.java b/students/740707954/src/ood/newSrp/server/TempSmtpFactory.java
new file mode 100644
index 0000000000..ae16252fd0
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/TempSmtpFactory.java
@@ -0,0 +1,11 @@
+package ood.newSrp.server;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public class TempSmtpFactory implements SmtpFactory {
+    @Override
+    public SmtpServer createSmtp() {
+        return new TempSmtpServer();
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/TempSmtpServer.java b/students/740707954/src/ood/newSrp/server/TempSmtpServer.java
new file mode 100644
index 0000000000..417cd8acd0
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/TempSmtpServer.java
@@ -0,0 +1,29 @@
+package ood.newSrp.server;
+
+import ood.newSrp.conf.Configuration;
+import ood.oldSrp.ConfigurationKeys;
+
+/**
+ * 备用服务器
+ * Created by Administrator on 2017/6/15 0015.
+ */
+public class TempSmtpServer extends SmtpServer {
+
+    public TempSmtpServer() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        host = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+    /**
+     * 设置服务器地址
+     */
+    public void setServerAddr() {
+        address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    /**
+     * 设置服务器host
+     */
+    public void setServerHost() {
+        host = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/server/UserServer.java b/students/740707954/src/ood/newSrp/server/UserServer.java
new file mode 100644
index 0000000000..0c9864eab7
--- /dev/null
+++ b/students/740707954/src/ood/newSrp/server/UserServer.java
@@ -0,0 +1,19 @@
+package ood.newSrp.server;
+
+import ood.newSrp.util.DBUtil;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by lx on 2017/6/17.
+ */
+public class UserServer {
+
+    /**
+     * 查询发送人
+     * @return
+     */
+    public List<Map> querySendUser(String productId){
+        return DBUtil.query("Select name from subscriptions where product_id= '" + productId + "' and send_mail=1 ");
+    }
+}
diff --git a/students/740707954/src/ood/newSrp/DBUtil.java b/students/740707954/src/ood/newSrp/util/DBUtil.java
similarity index 95%
rename from students/740707954/src/ood/newSrp/DBUtil.java
rename to students/740707954/src/ood/newSrp/util/DBUtil.java
index 0022cb74b0..c1866fd925 100644
--- a/students/740707954/src/ood/newSrp/DBUtil.java
+++ b/students/740707954/src/ood/newSrp/util/DBUtil.java
@@ -1,4 +1,4 @@
-package ood.newSrp;
+package ood.newSrp.util;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;

From 1c703675344f03eb8ef548da444b7c8f5f2b2779 Mon Sep 17 00:00:00 2001
From: Arthur <465034663@qq.com>
Date: Sat, 17 Jun 2017 16:52:21 +0800
Subject: [PATCH 140/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=AC=AC=E4=B8=80?=
 =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/mytest/AltSMTPHost.java    |  13 ++
 .../coderising/ood/mytest/Configuration.java  |  24 +++
 .../ood/mytest/ConfigurationKeys.java         |   9 +
 .../com/coderising/ood/mytest/DBUtil.java     |  36 ++++
 .../java/com/coderising/ood/mytest/Email.java |  64 +++++++
 .../java/com/coderising/ood/mytest/Host.java  |  12 ++
 .../com/coderising/ood/mytest/IOUtils.java    |  30 +++
 .../com/coderising/ood/mytest/MailUtil.java   |  18 ++
 .../coderising/ood/mytest/PromotionMail.java  | 128 +++++++++++++
 .../com/coderising/ood/mytest/SMTPHost.java   |  14 ++
 .../com/coderising/ood/srp/Configuration.java |  23 +++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 181 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 16 files changed, 608 insertions(+)
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/Email.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/Host.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/465034663/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java b/students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java
new file mode 100644
index 0000000000..cc492d23be
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/AltSMTPHost.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.mytest;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class AltSMTPHost implements Host {
+
+    @Override
+    public String setHost() {
+        return this.configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java b/students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java
new file mode 100644
index 0000000000..ae74eda7be
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/Configuration.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.mytest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java b/students/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java
new file mode 100644
index 0000000000..ae9234e569
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.mytest;
+
+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/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java b/students/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java
new file mode 100644
index 0000000000..cb8b8d4927
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/DBUtil.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.mytest;
+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;
+	}
+
+	public static String loadQuery(String productID) throws Exception {
+
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+		return sendMailQuery;
+	}
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/Email.java b/students/465034663/src/main/java/com/coderising/ood/mytest/Email.java
new file mode 100644
index 0000000000..208fb59b21
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/Email.java
@@ -0,0 +1,64 @@
+package com.coderising.ood.mytest;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class Email {
+
+    String toAddress;
+    String fromAddress;
+    String subject;
+    String message;
+    String smtpHost;
+
+    public Email() {}
+
+    public Email(String toAddress, String fromAddress, String subject, String message, String smtpHost) {
+        this.toAddress = toAddress;
+        this.fromAddress = fromAddress;
+        this.subject = subject;
+        this.message = message;
+        this.smtpHost = smtpHost;
+    }
+
+    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;
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/Host.java b/students/465034663/src/main/java/com/coderising/ood/mytest/Host.java
new file mode 100644
index 0000000000..3c87232aba
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/Host.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.mytest;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public interface Host {
+
+    Configuration configuration = new Configuration();
+
+    String setHost();
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java b/students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java
new file mode 100644
index 0000000000..2d44ca482e
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/IOUtils.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.mytest;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class IOUtils {
+
+    protected static String[] readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+
+        try {
+
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            return data;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java b/students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java
new file mode 100644
index 0000000000..b29261e059
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.mytest;
+
+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/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java b/students/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java
new file mode 100644
index 0000000000..19f8e66222
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/PromotionMail.java
@@ -0,0 +1,128 @@
+package com.coderising.ood.mytest;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+
+    protected String sendMailQuery;
+
+
+    protected String smtpHost;
+    protected String altSmtpHost;
+    protected String fromAddress;
+    protected String toAddress;
+    protected String subject;
+    protected String message;
+
+    protected String productID;
+    protected String productDesc;
+
+    private Email email;
+
+    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:\\IdeaWorspace\\works\\coding2017\\students\\465034663\\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
+        IOUtils.readFile(file);
+
+
+        config = new Configuration();
+
+        /*setSMTPHost();
+        setAltSMTPHost();*/
+        this.smtpHost = new SMTPHost().setHost();
+        this.altSmtpHost = new AltSMTPHost().setHost();
+
+        setFromAddress();
+
+
+        //setLoadQuery();
+
+        DBUtil.loadQuery(this.productID);
+        sendEMails(mailDebug, loadMailingList());
+
+
+    }
+
+    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 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());
+                setEmail();
+                try {
+                    if (toAddress.length() > 0)
+                        MailUtil.sendEmail(this.email, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(this.email, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+    private void setEmail(){
+        this.email = new Email(this.toAddress, this.fromAddress, this.subject, this.message, this.altSmtpHost);
+    }
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java b/students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java
new file mode 100644
index 0000000000..3d2ab58ace
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/mytest/SMTPHost.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.mytest;
+
+
+/**
+ * Created by Arthur on 2017/6/17.
+ */
+public class SMTPHost implements Host {
+
+    @Override
+    public String setHost() {
+        return this.configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+
+}
diff --git a/students/465034663/src/main/java/com/coderising/ood/srp/Configuration.java b/students/465034663/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/465034663/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<String,String> 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/465034663/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/465034663/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/465034663/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/465034663/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/465034663/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/465034663/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/465034663/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/465034663/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/465034663/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/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..d29c2d3dc0
--- /dev/null
+++ b/students/465034663/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,181 @@
+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:\\IdeaWorspace\\works\\coding2017\\students\\465034663\\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/465034663/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/465034663/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/465034663/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

From 52c5d6ff591b359bd64808d82fc38c88480ee1ef Mon Sep 17 00:00:00 2001
From: cmhello88 <cm_20094020@163.com>
Date: Sat, 17 Jun 2017 18:16:41 +0800
Subject: [PATCH 141/332] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/Configuration.java |  23 --
 .../coderising/ood/srp/ConfigurationKeys.java |   9 -
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ---
 .../java/com/coderising/ood/srp/MailUtil.java |  18 --
 .../com/coderising/ood/srp/PromotionMail.java | 199 ------------------
 .../coderising/ood/srp/product_promotion.txt  |   4 -
 6 files changed, 278 deletions(-)
 delete mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 delete mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 delete mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 delete mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 delete mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 delete mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
deleted file mode 100644
index f328c1816a..0000000000
--- a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.srp;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> 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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
deleted file mode 100644
index 8695aed644..0000000000
--- a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
deleted file mode 100644
index 82e9261d18..0000000000
--- a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ /dev/null
@@ -1,25 +0,0 @@
-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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 9f9e749af7..0000000000
--- a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index 781587a846..0000000000
--- a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,199 +0,0 @@
-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/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
deleted file mode 100644
index b7a974adb3..0000000000
--- a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-P8756 iPhone8
-P3946 XiaoMi10
-P8904 Oppo_R15
-P4955 Vivo_X20
\ No newline at end of file

From 78497a0f05bcbe5a81460e43a8cd40694c70bc45 Mon Sep 17 00:00:00 2001
From: cmhello88 <cm_20094020@163.com>
Date: Sat, 17 Jun 2017 18:20:48 +0800
Subject: [PATCH 142/332] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../34594980/data-structure/answer/pom.xml    |  32 ---
 .../coderising/download/DownloadThread.java   |  20 --
 .../coderising/download/FileDownloader.java   |  73 -------
 .../download/FileDownloaderTest.java          |  59 ------
 .../coderising/download/api/Connection.java   |  23 --
 .../download/api/ConnectionException.java     |   5 -
 .../download/api/ConnectionManager.java       |  10 -
 .../download/api/DownloadListener.java        |   5 -
 .../download/impl/ConnectionImpl.java         |  27 ---
 .../download/impl/ConnectionManagerImpl.java  |  15 --
 .../coderising/litestruts/LoginAction.java    |  39 ----
 .../com/coderising/litestruts/Struts.java     |  34 ---
 .../com/coderising/litestruts/StrutsTest.java |  43 ----
 .../java/com/coderising/litestruts/View.java  |  23 --
 .../java/com/coderising/litestruts/struts.xml |  11 -
 .../main/java/com/coding/basic/Iterator.java  |   7 -
 .../src/main/java/com/coding/basic/List.java  |   9 -
 .../com/coding/basic/array/ArrayList.java     |  35 ---
 .../com/coding/basic/array/ArrayUtil.java     |  96 ---------
 .../coding/basic/linklist/LRUPageFrame.java   | 164 ---------------
 .../basic/linklist/LRUPageFrameTest.java      |  34 ---
 .../com/coding/basic/linklist/LinkedList.java | 125 -----------
 .../com/coding/basic/queue/CircleQueue.java   |  47 -----
 .../coding/basic/queue/CircleQueueTest.java   |  44 ----
 .../java/com/coding/basic/queue/Josephus.java |  39 ----
 .../com/coding/basic/queue/JosephusTest.java  |  27 ---
 .../java/com/coding/basic/queue/Queue.java    |  61 ------
 .../basic/queue/QueueWithTwoStacks.java       |  55 -----
 .../com/coding/basic/stack/QuickMinStack.java |  44 ----
 .../coding/basic/stack/QuickMinStackTest.java |  39 ----
 .../java/com/coding/basic/stack/Stack.java    |  24 ---
 .../com/coding/basic/stack/StackUtil.java     | 168 ---------------
 .../com/coding/basic/stack/StackUtilTest.java |  86 --------
 .../basic/stack/StackWithTwoQueues.java       |  53 -----
 .../basic/stack/StackWithTwoQueuesTest.java   |  36 ----
 .../java/com/coding/basic/stack/Tail.java     |   5 -
 .../basic/stack/TwoStackInOneArray.java       | 117 ----------
 .../basic/stack/TwoStackInOneArrayTest.java   |  65 ------
 .../coding/basic/stack/expr/InfixExpr.java    |  72 -------
 .../basic/stack/expr/InfixExprTest.java       |  52 -----
 .../basic/stack/expr/InfixToPostfix.java      |  43 ----
 .../basic/stack/expr/InfixToPostfixTest.java  |  41 ----
 .../coding/basic/stack/expr/PostfixExpr.java  |  46 ----
 .../basic/stack/expr/PostfixExprTest.java     |  41 ----
 .../coding/basic/stack/expr/PrefixExpr.java   |  52 -----
 .../basic/stack/expr/PrefixExprTest.java      |  45 ----
 .../com/coding/basic/stack/expr/Token.java    |  50 -----
 .../coding/basic/stack/expr/TokenParser.java  |  57 -----
 .../basic/stack/expr/TokenParserTest.java     |  41 ----
 .../coding/basic/tree/BinarySearchTree.java   | 189 -----------------
 .../basic/tree/BinarySearchTreeTest.java      | 108 ----------
 .../com/coding/basic/tree/BinaryTreeNode.java |  36 ----
 .../com/coding/basic/tree/BinaryTreeUtil.java | 116 ----------
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 -------
 .../java/com/coding/basic/tree/FileList.java  |  34 ---
 .../data-structure/assignment/pom.xml         |  32 ---
 .../coderising/download/DownloadThread.java   |  20 --
 .../coderising/download/FileDownloader.java   |  73 -------
 .../download/FileDownloaderTest.java          |  59 ------
 .../coderising/download/api/Connection.java   |  23 --
 .../download/api/ConnectionException.java     |   5 -
 .../download/api/ConnectionManager.java       |  10 -
 .../download/api/DownloadListener.java        |   5 -
 .../download/impl/ConnectionImpl.java         |  27 ---
 .../download/impl/ConnectionManagerImpl.java  |  15 --
 .../coderising/litestruts/LoginAction.java    |  39 ----
 .../com/coderising/litestruts/Struts.java     |  34 ---
 .../com/coderising/litestruts/StrutsTest.java |  43 ----
 .../java/com/coderising/litestruts/View.java  |  23 --
 .../java/com/coderising/litestruts/struts.xml |  11 -
 .../com/coderising/ood/course/bad/Course.java |  24 ---
 .../ood/course/bad/CourseOffering.java        |  26 ---
 .../ood/course/bad/CourseService.java         |  16 --
 .../coderising/ood/course/bad/Student.java    |  14 --
 .../coderising/ood/course/good/Course.java    |  18 --
 .../ood/course/good/CourseOffering.java       |  34 ---
 .../ood/course/good/CourseService.java        |  14 --
 .../coderising/ood/course/good/Student.java   |  21 --
 .../java/com/coderising/ood/ocp/DateUtil.java |  10 -
 .../java/com/coderising/ood/ocp/Logger.java   |  38 ----
 .../java/com/coderising/ood/ocp/MailUtil.java |  10 -
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  10 -
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ---
 .../java/com/coderising/ood/srp/MailUtil.java |  18 --
 .../com/coderising/ood/srp/PromotionMail.java | 199 ------------------
 .../main/java/com/coding/basic/Iterator.java  |   7 -
 .../src/main/java/com/coding/basic/List.java  |   9 -
 .../com/coding/basic/array/ArrayList.java     |  35 ---
 .../com/coding/basic/array/ArrayUtil.java     |  96 ---------
 .../coding/basic/linklist/LRUPageFrame.java   |  57 -----
 .../basic/linklist/LRUPageFrameTest.java      |  34 ---
 .../com/coding/basic/linklist/LinkedList.java | 125 -----------
 .../com/coding/basic/queue/CircleQueue.java   |  39 ----
 .../java/com/coding/basic/queue/Josephus.java |  18 --
 .../com/coding/basic/queue/JosephusTest.java  |  27 ---
 .../java/com/coding/basic/queue/Queue.java    |  61 ------
 .../basic/queue/QueueWithTwoStacks.java       |  47 -----
 .../com/coding/basic/stack/QuickMinStack.java |  19 --
 .../java/com/coding/basic/stack/Stack.java    |  24 ---
 .../com/coding/basic/stack/StackUtil.java     |  48 -----
 .../com/coding/basic/stack/StackUtilTest.java |  65 ------
 .../basic/stack/StackWithTwoQueues.java       |  16 --
 .../basic/stack/TwoStackInOneArray.java       |  57 -----
 .../coding/basic/stack/expr/InfixExpr.java    |  15 --
 .../basic/stack/expr/InfixExprTest.java       |  52 -----
 .../basic/stack/expr/InfixToPostfix.java      |  14 --
 .../coding/basic/stack/expr/PostfixExpr.java  |  18 --
 .../basic/stack/expr/PostfixExprTest.java     |  41 ----
 .../coding/basic/stack/expr/PrefixExpr.java   |  18 --
 .../basic/stack/expr/PrefixExprTest.java      |  45 ----
 .../com/coding/basic/stack/expr/Token.java    |  50 -----
 .../coding/basic/stack/expr/TokenParser.java  |  57 -----
 .../basic/stack/expr/TokenParserTest.java     |  41 ----
 .../coding/basic/tree/BinarySearchTree.java   |  55 -----
 .../basic/tree/BinarySearchTreeTest.java      | 109 ----------
 .../com/coding/basic/tree/BinaryTreeNode.java |  35 ---
 .../com/coding/basic/tree/BinaryTreeUtil.java |  66 ------
 .../coding/basic/tree/BinaryTreeUtilTest.java |  75 -------
 .../java/com/coding/basic/tree/FileList.java  |  10 -
 .../com/coderising/ood/srp/Configuration.java |   0
 .../coderising/ood/srp/ConfigurationKeys.java |   0
 .../java/com/coderising/ood/srp/DBUtil.java   |  34 +++
 .../java/com/coderising/ood/srp/Email.java    |  49 +++++
 .../java/com/coderising/ood/srp/FileUtil.java |  36 ++++
 .../java/com/coderising/ood/srp/MailUtil.java |  77 +++++++
 .../java/com/coderising/ood/srp/Product.java  |  32 +++
 .../com/coderising/ood/srp/PromotionMail.java |  16 ++
 .../coderising/ood/srp/product_promotion.txt  |   4 +-
 128 files changed, 246 insertions(+), 5280 deletions(-)
 delete mode 100644 students/34594980/data-structure/answer/pom.xml
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 delete mode 100644 students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
 delete mode 100644 students/34594980/data-structure/assignment/pom.xml
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
 delete mode 100644 students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
 rename students/34594980/{data-structure/assignment => ood/ood-assignment}/src/main/java/com/coderising/ood/srp/Configuration.java (100%)
 rename students/34594980/{data-structure/assignment => ood/ood-assignment}/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java (100%)
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 rename students/34594980/{data-structure/assignment => ood/ood-assignment}/src/main/java/com/coderising/ood/srp/product_promotion.txt (50%)

diff --git a/students/34594980/data-structure/answer/pom.xml b/students/34594980/data-structure/answer/pom.xml
deleted file mode 100644
index ac6ba882df..0000000000
--- a/students/34594980/data-structure/answer/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>com.coderising</groupId>
-  <artifactId>ds-answer</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  <packaging>jar</packaging>
-
-  <name>ds-answer</name>
-  <url>http://maven.apache.org</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <dependencies>
-    
-    <dependency>
-    	<groupId>junit</groupId>
-    	<artifactId>junit</artifactId>
-    	<version>4.12</version>
-    </dependency>
-    
-  </dependencies>
-  <repositories>
-        <repository>
-            <id>aliyunmaven</id>
-            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
-        </repository>
-    </repositories>
-</project>
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
deleted file mode 100644
index 900a3ad358..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/DownloadThread.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.coderising.download;
-
-import com.coderising.download.api.Connection;
-
-public class DownloadThread extends Thread{
-
-	Connection conn;
-	int startPos;
-	int endPos;
-
-	public DownloadThread( Connection conn, int startPos, int endPos){
-		
-		this.conn = conn;		
-		this.startPos = startPos;
-		this.endPos = endPos;
-	}
-	public void run(){	
-		
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
deleted file mode 100644
index c3c8a3f27d..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.coderising.download;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-
-
-public class FileDownloader {
-	
-	String url;
-	
-	DownloadListener listener;
-	
-	ConnectionManager cm;
-	
-
-	public FileDownloader(String _url) {
-		this.url = _url;
-		
-	}
-	
-	public void execute(){
-		// 在这里实现你的代码， 注意： 需要用多线程实现下载
-		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
-		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
-		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
-		// 具体的实现思路：
-		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
-		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
-		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
-		// 3. 把byte数组写入到文件中
-		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
-		
-		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
-		Connection conn = null;
-		try {
-			
-			conn = cm.open(this.url);
-			
-			int length = conn.getContentLength();	
-			
-			new DownloadThread(conn,0,length-1).start();
-			
-		} catch (ConnectionException e) {			
-			e.printStackTrace();
-		}finally{
-			if(conn != null){
-				conn.close();
-			}
-		}
-		
-		
-		
-		
-	}
-	
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	
-	
-	public void setConnectionManager(ConnectionManager ucm){
-		this.cm = ucm;
-	}
-	
-	public DownloadListener getListener(){
-		return this.listener;
-	}
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
deleted file mode 100644
index 4ff7f46ae0..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/FileDownloaderTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.coderising.download;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-import com.coderising.download.impl.ConnectionManagerImpl;
-
-public class FileDownloaderTest {
-	boolean downloadFinished = false;
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testDownload() {
-		
-		String url = "http://localhost:8080/test.jpg";
-		
-		FileDownloader downloader = new FileDownloader(url);
-
-	
-		ConnectionManager cm = new ConnectionManagerImpl();
-		downloader.setConnectionManager(cm);
-		
-		downloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-
-		});
-
-		
-		downloader.execute();
-		
-		// 等待多线程下载程序执行完毕
-		while (!downloadFinished) {
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				//休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {				
-				e.printStackTrace();
-			}
-		}
-		System.out.println("下载完成！");
-		
-		
-
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
deleted file mode 100644
index 0957eaf7f4..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/Connection.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.download.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * @param startPos 开始位置， 从0开始
-	 * @param endPos 结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos,int endPos) throws IOException;
-	/**
-	 * 得到数据内容的长度
-	 * @return
-	 */
-	public int getContentLength();
-	
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
deleted file mode 100644
index 1551a80b3d..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public class ConnectionException extends Exception {
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
deleted file mode 100644
index ce045393b1..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/ConnectionManager.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.download.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
deleted file mode 100644
index bf9807b307..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
deleted file mode 100644
index 36a9d2ce15..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coderising.download.impl;
-
-import java.io.IOException;
-
-import com.coderising.download.api.Connection;
-
-public class ConnectionImpl implements Connection{
-
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {
-		
-		return null;
-	}
-
-	@Override
-	public int getContentLength() {
-		
-		return 0;
-	}
-
-	@Override
-	public void close() {
-		
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
deleted file mode 100644
index 172371dd55..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coderising.download.impl;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-
-public class ConnectionManagerImpl implements ConnectionManager {
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-		
-		return null;
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
deleted file mode 100644
index dcdbe226ed..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/LoginAction.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.coderising.litestruts;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * @author liuxin
- *
- */
-public class LoginAction{
-    private String name ;
-    private String password;
-    private String message;
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String execute(){
-            if("test".equals(name) && "1234".equals(password)){
-                this.message = "login successful";
-                return "success";
-            }
-            this.message = "login failed,please check your user/pwd";
-            return "fail";
-    }
-
-    public void setName(String name){
-        this.name = name;
-    }
-    public void setPassword(String password){
-        this.password = password;
-    }
-    public String getMessage(){
-        return this.message;
-    }
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
deleted file mode 100644
index 85e2e22de3..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/Struts.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-
-
-public class Struts {
-
-    public static View runAction(String actionName, Map<String,String> parameters) {
-
-        /*
-         
-		0. 读取配置文件struts.xml
- 		
- 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
-		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
-		("name"="test" ,  "password"="1234") ,     	
-		那就应该调用 setName和setPassword方法
-		
-		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
-		
-		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
-		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
-		放到View对象的parameters
-		
-		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
-		放到View对象的jsp字段中。
-        
-        */
-    	
-    	return null;
-    }    
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
deleted file mode 100644
index b8c81faf3c..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/StrutsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-
-
-
-
-public class StrutsTest {
-
-	@Test
-	public void testLoginActionSuccess() {
-		
-		String actionName = "login";
-        
-		Map<String,String> params = new HashMap<String,String>();
-        params.put("name","test");
-        params.put("password","1234");
-        
-        
-        View view  = Struts.runAction(actionName,params);        
-        
-        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
-        Assert.assertEquals("login successful", view.getParameters().get("message"));
-	}
-
-	@Test
-	public void testLoginActionFailed() {
-		String actionName = "login";
-		Map<String,String> params = new HashMap<String,String>();
-        params.put("name","test");
-        params.put("password","123456"); //密码和预设的不一致
-        
-        View view  = Struts.runAction(actionName,params);        
-        
-        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
-        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
deleted file mode 100644
index 07df2a5dab..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/View.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-public class View {
-	private String jsp;
-	private Map parameters;
-	
-	public String getJsp() {
-		return jsp;
-	}
-	public View setJsp(String jsp) {
-		this.jsp = jsp;
-		return this;
-	}
-	public Map getParameters() {
-		return parameters;
-	}
-	public View setParameters(Map parameters) {
-		this.parameters = parameters;
-		return this;
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml b/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
deleted file mode 100644
index e5d9aebba8..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coderising/litestruts/struts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<struts>
-    <action name="login" class="com.coderising.litestruts.LoginAction">
-        <result name="success">/jsp/homepage.jsp</result>
-        <result name="fail">/jsp/showLogin.jsp</result>
-    </action>
-    <action name="logout" class="com.coderising.litestruts.LogoutAction">
-    	<result name="success">/jsp/welcome.jsp</result>
-    	<result name="error">/jsp/error.jsp</result>
-    </action>
-</struts>
\ No newline at end of file
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
deleted file mode 100644
index 06ef6311b2..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.coding.basic;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java
deleted file mode 100644
index 10d13b5832..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.coding.basic;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
deleted file mode 100644
index 4576c016af..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayList.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.coding.basic.array;
-
-import com.coding.basic.Iterator;
-import com.coding.basic.List;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData = new Object[100];
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index, Object o){
-		
-	}
-	
-	public Object get(int index){
-		return null;
-	}
-	
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public Iterator iterator(){
-		return null;
-	}
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
deleted file mode 100644
index 45740e6d57..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/array/ArrayUtil.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.coding.basic.array;
-
-public class ArrayUtil {
-	
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换
-		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
-		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * @param origin
-	 * @return
-	 */
-	public void reverseArray(int[] origin){
-		
-	}
-	
-	/**
-	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
-	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
-	 * @param oldArray
-	 * @return
-	 */
-	
-	public int[] removeZero(int[] oldArray){
-		return null;
-	}
-	
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
-	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-	
-	public int[] merge(int[] array1, int[] array2){
-		return  null;
-	}
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持
-	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * @param oldArray
-	 * @param size
-	 * @return
-	 */
-	public int[] grow(int [] oldArray,  int size){
-		return null;
-	}
-	
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
-	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
-	 * max = 1, 则返回空数组 []
-	 * @param max
-	 * @return
-	 */
-	public int[] fibonacci(int max){
-		return null;
-	}
-	
-	/**
-	 * 返回小于给定最大值max的所有素数数组
-	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * @param max
-	 * @return
-	 */
-	public int[] getPrimes(int max){
-		return null;
-	}
-	
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
-	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * @param max
-	 * @return
-	 */
-	public int[] getPerfectNumbers(int max){
-		return null;
-	}
-	
-	/**
-	 * 用seperator 把数组 array给连接起来
-	 * 例如array= [3,8,9], seperator = "-"
-	 * 则返回值为"3-8-9"
-	 * @param array
-	 * @param s
-	 * @return
-	 */
-	public String join(int[] array, String seperator){
-		return null;
-	}
-	
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
deleted file mode 100644
index 24b9d8b155..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package com.coding.basic.linklist;
-
-
-public class LRUPageFrame {
-	
-	private static class Node {
-		
-		Node prev;
-		Node next;
-		int pageNum;
-
-		Node() {
-		}
-	}
-
-	private int capacity;
-	
-	private int currentSize;
-	private Node first;// 链表头
-	private Node last;// 链表尾
-
-	
-	public LRUPageFrame(int capacity) {
-		this.currentSize = 0;
-		this.capacity = capacity;
-		
-	}
-
-	/**
-	 * 获取缓存中对象
-	 * 
-	 * @param key
-	 * @return
-	 */
-	public void access(int pageNum) {
-		
-		Node node = find(pageNum);
-		//在该队列中存在， 则提到队列头
-		if (node != null) {
-			
-			moveExistingNodeToHead(node);		
-			
-		} else{
-			
-			node = new Node();
-			node.pageNum = pageNum;
-			
-			// 缓存容器是否已经超过大小.
-			if (currentSize >= capacity) {			
-				removeLast();
-							
-			} 
-			
-			addNewNodetoHead(node);
-			
-			
-			
-						
-		}
-	}
-	
-	private void addNewNodetoHead(Node node) {
-		
-		if(isEmpty()){
-			
-			node.prev = null;
-			node.next = null;
-			first = node;
-			last = node;
-			
-		} else{
-			node.prev = null;
-			node.next = first;
-			first.prev = node;
-			first = node;
-		}
-		this.currentSize ++;
-	}
-
-	private Node find(int data){
-		
-		Node node = first;
-		while(node != null){
-			if(node.pageNum == data){
-				return node;
-			}
-			node = node.next;
-		}
-		return null;
-		
-	}
-
-	
-
-	
-	
-
-	/**
-	 * 删除链表尾部节点 表示 删除最少使用的缓存对象
-	 */
-	private void removeLast() {
-		Node prev = last.prev;
-		prev.next = null;
-		last.prev = null;
-		last = prev;
-		this.currentSize --;
-	}
-
-	/**
-	 * 移动到链表头，表示这个节点是最新使用过的
-	 * 
-	 * @param node
-	 */
-	private void moveExistingNodeToHead(Node node) {
-		
-		if (node == first) {
-			
-			return;
-		}
-		else if(node == last){
-			//当前节点是链表尾， 需要放到链表头
-			Node prevNode = node.prev;
-			prevNode.next = null;	
-			last.prev = null;
-			last  = prevNode;				
-			
-		} else{
-			//node 在链表的中间， 把node 的前后节点连接起来
-			Node prevNode = node.prev;
-			prevNode.next = node.next;
-			
-			Node nextNode = node.next;
-			nextNode.prev = prevNode;
-			
-			
-		}
-		
-		node.prev = null;
-		node.next = first;
-		first.prev = node;
-		first = node;	
-		
-	}
-	private boolean isEmpty(){		
-		return (first == null) && (last == null);
-	}
-
-	public String toString(){
-		StringBuilder buffer = new StringBuilder();
-		Node node = first;
-		while(node != null){
-			buffer.append(node.pageNum);			
-			
-			node = node.next;
-			if(node != null){
-				buffer.append(",");
-			}
-		}
-		return buffer.toString();
-	}
-	
-	
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
deleted file mode 100644
index 7fd72fc2b4..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coding.basic.linklist;
-
-import  org.junit.Assert;
-
-import org.junit.Test;
-
-
-public class LRUPageFrameTest {
-	
-	@Test
-	public void testAccess() {
-		LRUPageFrame frame = new LRUPageFrame(3);
-		frame.access(7);
-		frame.access(0);
-		frame.access(1);
-		Assert.assertEquals("1,0,7", frame.toString());
-		frame.access(2);
-		Assert.assertEquals("2,1,0", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(3);
-		Assert.assertEquals("3,0,2", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,3,2", frame.toString());
-		frame.access(4);
-		Assert.assertEquals("4,0,3", frame.toString());
-		frame.access(5);
-		Assert.assertEquals("5,4,0", frame.toString());
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
deleted file mode 100644
index f4c7556a2e..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/linklist/LinkedList.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.coding.basic.linklist;
-
-import com.coding.basic.Iterator;
-import com.coding.basic.List;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index , Object o){
-		
-	}
-	public Object get(int index){
-		return null;
-	}
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public void addFirst(Object o){
-		
-	}
-	public void addLast(Object o){
-		
-	}
-	public Object removeFirst(){
-		return null;
-	}
-	public Object removeLast(){
-		return null;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-		
-	}
-	
-	/**
-	 * 把该链表逆置
-	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
-	 */
-	public  void reverse(){		
-		
-	}
-	
-	/**
-	 * 删除一个单链表的前半部分
-	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
-	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
-
-	 */
-	public  void removeFirstHalf(){
-		
-	}
-	
-	/**
-	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
-	 * @param i
-	 * @param length
-	 */
-	public  void remove(int i, int length){
-		
-	}
-	/**
-	 * 假定当前链表和listB均包含已升序排列的整数
-	 * 从当前链表中取出那些listB所指定的元素
-	 * 例如当前链表 = 11->101->201->301->401->501->601->701
-	 * listB = 1->3->4->6
-	 * 返回的结果应该是[101,301,401,601]  
-	 * @param list
-	 */
-	public  int[] getElements(LinkedList list){
-		return null;
-	}
-	
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 从当前链表中中删除在listB中出现的元素 
-
-	 * @param list
-	 */
-	
-	public  void subtract(LinkedList list){
-		
-	}
-	
-	/**
-	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
-	 */
-	public  void removeDuplicateValues(){
-		
-	}
-	
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
-	 * @param min
-	 * @param max
-	 */
-	public  void removeRange(int min, int max){
-		
-	}
-	
-	/**
-	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
-	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
-	 * @param list
-	 */
-	public  LinkedList intersection( LinkedList list){
-		return null;
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
deleted file mode 100644
index f169d5f8e4..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.coding.basic.queue;
-
-public class CircleQueue <E> {
-
-	//用数组来保存循环队列的元素
-	private Object[] elementData ;
-	int size = 0;
-	//队头
-	private int front = 0;  
-	//队尾  
-	private int rear = 0;
-	
-	public CircleQueue(int capacity){
-		elementData = new Object[capacity];
-	}
-	public boolean isEmpty() {
-		return (front == rear) && !isFull();
-        
-    }
-	
-	public boolean isFull(){
-		return  size == elementData.length;
-	}
-    public int size() {
-        return size;
-    }
-
-    public void enQueue(E data) {
-        if(isFull()){
-        	throw new RuntimeException("The queue is full");
-        }
-        rear = (rear+1) % elementData.length;
-        elementData[rear++] = data;
-        size++;
-    }
-
-    public E deQueue() {
-        if(isEmpty()){
-        	throw new RuntimeException("The queue is empty");
-        }
-        E data = (E)elementData[front];
-        elementData[front] = null;
-        front = (front+1) % elementData.length;
-        size --;
-        return data;
-    }
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
deleted file mode 100644
index 7307eb77d4..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/CircleQueueTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.coding.basic.queue;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class CircleQueueTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test() {
-		CircleQueue<String> queue = new CircleQueue<String>(5);		
-		Assert.assertTrue(queue.isEmpty());
-		Assert.assertFalse(queue.isFull());
-		
-		queue.enQueue("a");
-		queue.enQueue("b");
-		queue.enQueue("c");
-		queue.enQueue("d");
-		queue.enQueue("e");
-		
-		Assert.assertTrue(queue.isFull());
-		Assert.assertFalse(queue.isEmpty());
-		Assert.assertEquals(5, queue.size());
-		
-		Assert.assertEquals("a", queue.deQueue());
-		Assert.assertEquals("b", queue.deQueue());
-		Assert.assertEquals("c", queue.deQueue());
-		Assert.assertEquals("d", queue.deQueue());
-		Assert.assertEquals("e", queue.deQueue());
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
deleted file mode 100644
index 36ec615d36..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Josephus.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.coding.basic.queue;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 用Queue来实现Josephus问题
- * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
- * @author liuxin
- *
- */
-public class Josephus {
-	
-	public static List<Integer> execute(int n, int m){
-		
-		Queue<Integer> queue = new Queue<Integer>();
-        for (int i = 0; i < n; i++){
-        	queue.enQueue(i);
-        }
-        
-        List<Integer> result = new ArrayList<Integer>();
-        int i = 0;
-
-        while (!queue.isEmpty()) {
-
-            int x = queue.deQueue();            
-
-            if (++i % m == 0){
-            	result.add(x);
-            } else{
-            	queue.enQueue(x);
-            }
-        }
-
-        
-        return result;
-	}
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
deleted file mode 100644
index 7d90318b51..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/JosephusTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coding.basic.queue;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class JosephusTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testExecute() {
-		
-		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
deleted file mode 100644
index c4c4b7325e..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/Queue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.coding.basic.queue;
-
-import java.util.NoSuchElementException;
-
-public class Queue<E> {
-    private Node<E> first;    
-    private Node<E> last;     
-    private int size;               
-
-    
-    private static class Node<E> {
-        private E item;
-        private Node<E> next;
-    }
-
-    
-    public Queue() {
-        first = null;
-        last  = null;
-        size = 0;
-    }
-
-    
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public int size() {
-        return size;
-    }
-
-    
-
-    public void enQueue(E data) {
-        Node<E> oldlast = last;
-        last = new Node<E>();
-        last.item = data;
-        last.next = null;
-        if (isEmpty()) {
-        	first = last;
-        }
-        else{
-        	oldlast.next = last;
-        }
-        size++;
-    }
-
-    public E deQueue() {
-        if (isEmpty()) {
-        	throw new NoSuchElementException("Queue underflow");
-        }
-        E item = first.item;
-        first = first.next;
-        size--;
-        if (isEmpty()) {
-        	last = null;  
-        }
-        return item;
-    }
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
deleted file mode 100644
index bc97df0800..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.coding.basic.queue;
-
-import java.util.NoSuchElementException;
-import java.util.Stack;
-
-public class QueueWithTwoStacks<E> {
-	private Stack<E> stack1;    
-    private Stack<E> stack2;    
-
-    
-    public QueueWithTwoStacks() {
-        stack1 = new Stack<E>();
-        stack2 = new Stack<E>();
-    }
-
-   
-    private void moveStack1ToStack2() {
-        while (!stack1.isEmpty()){
-        	stack2.push(stack1.pop());
-        }
-            
-    }
-
-
-    public boolean isEmpty() {
-        return stack1.isEmpty() && stack2.isEmpty();
-    }
-
-
-    
-    public int size() {
-        return stack1.size() + stack2.size();     
-    }
-
-
-
-    public void enQueue(E item) {
-        stack1.push(item);
-    }
-
-    public E deQueue() {
-        if (isEmpty()) {
-        	throw new NoSuchElementException("Queue is empty");
-        }
-        if (stack2.isEmpty()) {
-        	moveStack1ToStack2();
-        }
-        
-        return stack2.pop();
-    }
-
-
-
- }
-
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
deleted file mode 100644
index faf2644ab1..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStack.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-/**
- * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
- * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
- * @author liuxin
- *
- */
-public class QuickMinStack {
-	
-	private Stack<Integer> normalStack = new Stack<Integer>();
-	private Stack<Integer> minNumStack = new Stack<Integer>();
-	
-	public void push(int data){
-		
-		normalStack.push(data);
-		
-		if(minNumStack.isEmpty()){
-			minNumStack.push(data);
-		} else{
-			if(minNumStack.peek() >= data) {
-				minNumStack.push(data);
-	        }
-		}
-		
-	}
-	public int pop(){
-		if(normalStack.isEmpty()){
-			throw new RuntimeException("the stack is empty");
-		}
-		int value = normalStack.pop();
-		if(value == minNumStack.peek()){
-			minNumStack.pop();
-		}
-		return value;
-	}
-	public int findMin(){
-		if(minNumStack.isEmpty()){
-			throw new RuntimeException("the stack is empty");
-		}
-		return minNumStack.peek();
-	}
-}
\ No newline at end of file
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
deleted file mode 100644
index efe41a9f8f..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/QuickMinStackTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.coding.basic.stack;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class QuickMinStackTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test() {
-		QuickMinStack stack = new QuickMinStack();
-		stack.push(5);
-		Assert.assertEquals(5, stack.findMin());
-		stack.push(6);
-		Assert.assertEquals(5, stack.findMin());
-		stack.push(4);
-		Assert.assertEquals(4, stack.findMin());
-		stack.push(4);
-		Assert.assertEquals(4, stack.findMin());
-		
-		stack.pop();
-		Assert.assertEquals(4, stack.findMin());
-		stack.pop();
-		Assert.assertEquals(5, stack.findMin());
-		stack.pop();
-		Assert.assertEquals(5, stack.findMin());
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
deleted file mode 100644
index fedb243604..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Stack.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.coding.basic.stack;
-
-import com.coding.basic.array.ArrayList;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){		
-	}
-	
-	public Object pop(){
-		return null;
-	}
-	
-	public Object peek(){
-		return null;
-	}
-	public boolean isEmpty(){
-		return false;
-	}
-	public int size(){
-		return -1;
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
deleted file mode 100644
index 7c86d22fe7..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtil.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package com.coding.basic.stack;
-import java.util.Stack;
-public class StackUtil {
-	
-	public static void bad_reverse(Stack<Integer> s) {
-		if(s == null || s.isEmpty()){
-			return;
-		}
-		Stack<Integer> tmpStack = new Stack();
-		while(!s.isEmpty()){
-			tmpStack.push(s.pop());
-		}
-		
-		s = tmpStack;
-		
-	}
-	
-	
-	
-	public static void reverse_247565311(Stack<Integer> s){
-        if(s == null || s.isEmpty()) {
-        	return;
-        }
-        
-        int size = s.size();
-        Stack<Integer> tmpStack = new Stack<Integer>();        
-        
-        for(int i=0;i<size;i++){
-            Integer top = s.pop();
-            while(s.size()>i){
-                tmpStack.push(s.pop());
-            }
-            s.push(top);
-            while(tmpStack.size()>0){
-                s.push(tmpStack.pop());
-            }
-        }
-    }
-
-
-	
-	/**
-	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 */
-	public static void reverse(Stack<Integer> s) {
-		if(s == null || s.isEmpty()){
-			return;
-		}
-		
-		Stack<Integer> tmp = new Stack<Integer>();
-		while(!s.isEmpty()){
-			tmp.push(s.pop());
-		}
-		while(!tmp.isEmpty()){
-			Integer top = tmp.pop();
-			addToBottom(s,top);
-		}	
-		
-		
-	}
-	public static void addToBottom(Stack<Integer> s,  Integer value){
-		if(s.isEmpty()){
-			s.push(value);
-		} else{
-			Integer top = s.pop();
-			addToBottom(s,value);
-			s.push(top);
-		}
-		
-	}
-	/**
-	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * 
-	 * @param o
-	 */
-	public static void remove(Stack s,Object o) {
-		if(s == null || s.isEmpty()){
-			return;
-		}
-		Stack tmpStack = new Stack();
-		
-		while(!s.isEmpty()){
-			Object value = s.pop();
-			if(!value.equals(o)){
-				tmpStack.push(value);
-			} 			
-		}
-		
-		while(!tmpStack.isEmpty()){
-			s.push(tmpStack.pop());
-		}
-	}
-
-	/**
-	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * @param len
-	 * @return
-	 */
-	public static Object[] getTop(Stack s,int len) {
-		
-		if(s == null || s.isEmpty() || s.size()<len || len <=0 ){
-			return null;
-		}
-		
-		Stack tmpStack = new Stack();
-		int i = 0;
-		Object[] result = new Object[len];
-		while(!s.isEmpty()){
-			Object value = s.pop();			
-			tmpStack.push(value);
-			result[i++] = value;
-			if(i == len){
-				break;
-			}
-		}
-		while(!tmpStack.isEmpty()){
-			s.push(tmpStack.pop());
-		}
-		return result;
-	}
-	/**
-	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
-	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
-	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
-	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
-	 * @param s
-	 * @return
-	 */
-	public static boolean isValidPairs(String s){
-		
-		Stack<Character> stack = new Stack();
-		for(int i=0;i<s.length();i++){
-			char c = s.charAt(i);
-			
-			if(c == '(' || c =='[' || c == '{'){
-				
-				stack.push(c);
-				
-			} else if( c == ')'){
-				
-				char topChar = stack.pop();
-				if(topChar != '('){
-					return false;
-				}
-				
-			} else if( c == ']'){
-				
-				char topChar = stack.pop();
-				if(topChar != '['){
-					return false;
-				}
-					
-			} else if( c == '}'){
-				
-				char topChar = stack.pop();
-				if(topChar != '{'){
-					return false;
-				}
-				
-			}
-		}
-		return stack.size() == 0;
-	}
-	
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
deleted file mode 100644
index ae0210ff47..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackUtilTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-public class StackUtilTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testAddToBottom() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		
-		StackUtil.addToBottom(s, 0);
-		
-		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
-		
-	}
-	@Test
-	public void testReverse() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
-		StackUtil.reverse(s);
-		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
-	}
-	@Test
-	public void testReverse_247565311() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		
-		Assert.assertEquals("[1, 2, 3]", s.toString());
-		StackUtil.reverse_247565311(s);
-		Assert.assertEquals("[3, 2, 1]", s.toString());
-	}
-	@Test
-	public void testRemove() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		StackUtil.remove(s, 2);
-		Assert.assertEquals("[1, 3]", s.toString());
-	}
-
-	@Test
-	public void testGetTop() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		{
-			Object[] values = StackUtil.getTop(s, 3);
-			Assert.assertEquals(5, values[0]);
-			Assert.assertEquals(4, values[1]);
-			Assert.assertEquals(3, values[2]);
-		}
-	}
-
-	@Test
-	public void testIsValidPairs() {
-		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
-		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
deleted file mode 100644
index 7a58fbff56..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.ArrayDeque;
-import java.util.Queue;
-
-public class StackWithTwoQueues {
-	Queue<Integer> queue1 = new ArrayDeque<>();
-    Queue<Integer> queue2 = new ArrayDeque<>();
-
-    public void push(int data) {
-        //两个栈都为空时，优先考虑queue1
-        if (queue1.isEmpty()&&queue2.isEmpty()) {
-            queue1.add(data);
-            return;
-        }
-       
-        if (queue1.isEmpty()) {
-            queue2.add(data);
-            return;
-        }
-
-        if (queue2.isEmpty()) {
-            queue1.add(data);
-            return;
-        }
-
-    }
-
-    public int pop() {
-        
-        if (queue1.isEmpty()&&queue2.isEmpty()) {
-        	throw new RuntimeException("stack is empty");
-        } 
-        
-        if (queue1.isEmpty()) {
-            while (queue2.size()>1) {
-                queue1.add(queue2.poll());
-            }
-            return queue2.poll();
-        } 
-        
-        if (queue2.isEmpty()) {
-            while (queue1.size()>1) {
-                queue2.add(queue1.poll());
-            }
-            return queue1.poll();
-        }
-        
-        throw new RuntimeException("no queue is empty, this is not allowed");
-        
-
-    }
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
deleted file mode 100644
index 4541b1f040..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/StackWithTwoQueuesTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.coding.basic.stack;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class StackWithTwoQueuesTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test() {
-		StackWithTwoQueues stack = new StackWithTwoQueues();
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-        stack.push(4);
-        Assert.assertEquals(4, stack.pop());
-        Assert.assertEquals(3, stack.pop());
-      
-        stack.push(5);
-        Assert.assertEquals(5, stack.pop());
-        Assert.assertEquals(2, stack.pop());
-        Assert.assertEquals(1, stack.pop());
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
deleted file mode 100644
index 7f30ce55c8..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/Tail.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coding.basic.stack;
-
-public class Tail {
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
deleted file mode 100644
index a532fd6e6c..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Arrays;
-
-/**
- * 用一个数组实现两个栈
- * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
- * @author liuxin
- *
- */
-public class TwoStackInOneArray {
-	private Object[] data = new Object[10];
-	private int size;
-    private int top1, top2;
-    
-    public TwoStackInOneArray(int n){
-    	data = new Object[n];
-    	size = n;
-    	top1 = -1;
-        top2 = data.length;
-    }
-	/**
-	 * 向第一个栈中压入元素
-	 * @param o
-	 */
-	public void push1(Object o){
-		ensureCapacity();
-		data[++top1] = o;
-	}
-	/*
-	 * 向第二个栈压入元素
-	 */
-	public void push2(Object o){
-		ensureCapacity();
-		data[--top2] = o;
-	}
-	public void ensureCapacity(){
-		if(top2-top1>1){
-			return;
-		} else{
-			
-			Object[] newArray = new Object[data.length*2];
-			System.arraycopy(data, 0, newArray, 0, top1+1);
-			
-			int stack2Size = data.length-top2;
-			int newTop2 = newArray.length-stack2Size;
-			System.arraycopy(data, top2, newArray, newTop2, stack2Size);
-			
-			top2 = newTop2;
-			data = newArray;
-		}
-	}
-	/**
-	 * 从第一个栈中弹出元素
-	 * @return
-	 */
-	public Object pop1(){
-		if(top1 == -1){
-			throw new RuntimeException("Stack1 is empty");
-		}
-		Object o = data[top1];
-		data[top1] = null;
-		top1--;
-		return o;
-		
-	}
-	/**
-	 * 从第二个栈弹出元素
-	 * @return
-	 */
-	public Object pop2(){
-		if(top2 == data.length){
-			throw new RuntimeException("Stack2 is empty");
-		}
-		Object o = data[top2];
-		data[top2] = null;
-		top2++;
-		return o;
-	}
-	/**
-	 * 获取第一个栈的栈顶元素
-	 * @return
-	 */
-	
-	public Object peek1(){
-		if(top1 == -1){
-			throw new RuntimeException("Stack1 is empty");
-		}
-		return data[top1];
-	}
-	
-	
-	/**
-	 * 获取第二个栈的栈顶元素
-	 * @return
-	 */
-	
-	public Object peek2(){
-		if(top2 == data.length){
-			throw new RuntimeException("Stack2 is empty");
-		}
-		return data[top2];
-	}
-	
-	public Object[] stack1ToArray(){
-		return Arrays.copyOf(data, top1+1);
-	}
-	public Object[] stack2ToArray(){
-		int size = data.length-top2;
-		Object [] stack2Data = new Object[size];
-		int j=0;
-		for(int i=data.length-1; i>=top2 ;i--){
-			stack2Data[j++] = data[i];
-		}
-		return stack2Data;	
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
deleted file mode 100644
index b743d422c6..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/TwoStackInOneArrayTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Arrays;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class TwoStackInOneArrayTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test1() {
-		TwoStackInOneArray stack = new TwoStackInOneArray(10);
-		stack.push1(1);
-		stack.push1(2);
-		stack.push1(3);
-		stack.push1(4);
-		stack.push1(5);
-		
-		stack.push2(1);
-		stack.push2(2);
-		stack.push2(3);
-		stack.push2(4);
-		stack.push2(5);
-		
-		for(int i=1;i<=5;i++){
-			Assert.assertEquals(stack.peek1(), stack.peek2());
-			Assert.assertEquals(stack.pop1(), stack.pop2());
-		}
-		
-		
-	}
-	@Test
-	public void test2() {
-		TwoStackInOneArray stack = new TwoStackInOneArray(5);
-		stack.push1(1);
-		stack.push1(2);
-		stack.push1(3);
-		stack.push1(4);
-		stack.push1(5);
-		stack.push1(6);
-		stack.push1(7);	
-		
-		stack.push2(1);
-		stack.push2(2);
-		stack.push2(3);
-		stack.push2(4);
-		
-		
-		Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]",Arrays.toString(stack.stack1ToArray()));
-		Assert.assertEquals("[1, 2, 3, 4]",Arrays.toString(stack.stack2ToArray()));
-	}
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
deleted file mode 100644
index cebef21fa3..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-import java.util.Stack;
-
-
-public class InfixExpr {
-	String expr = null;
-	
-	public InfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		
-		
-		TokenParser parser = new TokenParser();
-		List<Token> tokens = parser.parse(this.expr);
-		
-		
-		Stack<Token> opStack = new Stack<>();
-		Stack<Float> numStack = new Stack<>();
-		
-		for(Token token : tokens){
-			
-			if (token.isOperator()){
-				
-				while(!opStack.isEmpty() 
-						&& !token.hasHigherPriority(opStack.peek())){
-					Token prevOperator = opStack.pop();
-					Float f2 = numStack.pop();
-					Float f1 = numStack.pop();
-					Float result = calculate(prevOperator.toString(), f1,f2);
-					numStack.push(result);						
-					
-				}
-				opStack.push(token);
-			} 
-			if(token.isNumber()){
-				numStack.push(new Float(token.getIntValue()));
-			}
-		}
-		
-		while(!opStack.isEmpty()){
-			Token token = opStack.pop();
-			Float f2 = numStack.pop();
-			Float f1 = numStack.pop();
-			numStack.push(calculate(token.toString(), f1,f2));
-		}
-		
-		
-		return numStack.pop().floatValue();
-	}
-	private Float calculate(String op, Float f1, Float f2){
-		if(op.equals("+")){
-			return f1+f2;
-		}
-		if(op.equals("-")){
-			return f1-f2;
-		}
-		if(op.equals("*")){
-			return f1*f2;
-		}
-		if(op.equals("/")){
-			return f1/f2;
-		}
-		throw new RuntimeException(op + " is not supported");
-	}
-
-	
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
deleted file mode 100644
index 20e34e8852..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class InfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
-		{
-			InfixExpr expr = new InfixExpr("2+3*4+5");
-			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
-			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("3*20/2");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("20/2*3");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("10-30+50");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("10-2*3+50");
-			Assert.assertEquals(54, expr.evaluate(), 0.001f);
-		}
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
deleted file mode 100644
index 9e501eda20..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-public class InfixToPostfix {
-
-	public static List<Token> convert(String expr) {
-		List<Token> inFixTokens = new TokenParser().parse(expr);
-		
-		List<Token> postFixTokens = new ArrayList<>();
-		
-		Stack<Token> opStack = new Stack<Token>();
-		for(Token token : inFixTokens){
-			
-			if(token.isOperator()){
-				
-				while(!opStack.isEmpty() 
-						&& !token.hasHigherPriority(opStack.peek())){
-					postFixTokens.add(opStack.pop());					
-					
-				}
-				opStack.push(token);		
-				
-			}
-			if(token.isNumber()){
-				
-				postFixTokens.add(token);
-				
-			}
-		}
-		
-		while(!opStack.isEmpty()){
-			postFixTokens.add(opStack.pop());	
-		}
-		
-		return postFixTokens;
-	}
-
-	
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
deleted file mode 100644
index f879f55f14..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/InfixToPostfixTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class InfixToPostfixTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testConvert() {
-		{
-			List<Token> tokens = InfixToPostfix.convert("2+3");
-			Assert.assertEquals("[2, 3, +]", tokens.toString());
-		}
-		{
-		
-			List<Token> tokens = InfixToPostfix.convert("2+3*4");
-			Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString());
-		}
-		
-		{
-			
-			List<Token> tokens = InfixToPostfix.convert("2-3*4+5");
-			Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString());
-		}
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
deleted file mode 100644
index c54eb69e2a..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-import java.util.Stack;
-
-public class PostfixExpr {
-String expr = null;
-	
-	public PostfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		TokenParser parser = new TokenParser();
-		List<Token> tokens = parser.parse(this.expr);
-		
-		
-		Stack<Float> numStack = new Stack<>();
-		for(Token token : tokens){
-			if(token.isNumber()){
-				numStack.push(new Float(token.getIntValue()));
-			} else{
-				Float f2 = numStack.pop();
-				Float f1 = numStack.pop();
-				numStack.push(calculate(token.toString(),f1,f2));
-			}
-		}
-		return numStack.pop().floatValue();
-	}
-	
-	private Float calculate(String op, Float f1, Float f2){
-		if(op.equals("+")){
-			return f1+f2;
-		}
-		if(op.equals("-")){
-			return f1-f2;
-		}
-		if(op.equals("*")){
-			return f1*f2;
-		}
-		if(op.equals("/")){
-			return f1/f2;
-		}
-		throw new RuntimeException(op + " is not supported");
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
deleted file mode 100644
index c0435a2db5..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.coding.basic.stack.expr;
-
-
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class PostfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		{
-			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
-			Assert.assertEquals(288, expr.evaluate(),0.0f);
-		}
-		{
-			//9+(3-1)*3+10/2
-			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
-			Assert.assertEquals(20, expr.evaluate(),0.0f);
-		}
-		
-		{
-			//10-2*3+50
-			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
-			Assert.assertEquals(54, expr.evaluate(),0.0f);
-		}
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
deleted file mode 100644
index f811fd6d9a..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-import java.util.Stack;
-
-public class PrefixExpr {
-	String expr = null;
-	
-	public PrefixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		TokenParser parser = new TokenParser();
-		List<Token> tokens = parser.parse(this.expr);
-		
-		Stack<Token> exprStack = new Stack<>();
-		Stack<Float> numStack = new Stack<>();
-		for(Token token : tokens){
-			exprStack.push(token);
-		}
-		
-		while(!exprStack.isEmpty()){
-			Token t = exprStack.pop();
-			if(t.isNumber()){
-				numStack.push(new Float(t.getIntValue()));
-			}else{
-				Float f1 = numStack.pop();
-				Float f2 = numStack.pop();
-				numStack.push(calculate(t.toString(),f1,f2));
-				
-			}		
-		}
-		return numStack.pop().floatValue();
-	}
-	
-	private Float calculate(String op, Float f1, Float f2){
-		if(op.equals("+")){
-			return f1+f2;
-		}
-		if(op.equals("-")){
-			return f1-f2;
-		}
-		if(op.equals("*")){
-			return f1*f2;
-		}
-		if(op.equals("/")){
-			return f1/f2;
-		}
-		throw new RuntimeException(op + " is not supported");
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
deleted file mode 100644
index 5cec210e75..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class PrefixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		{
-			// 2*3+4*5 
-			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
-			Assert.assertEquals(26, expr.evaluate(),0.001f);
-		}
-		{
-			// 4*2 + 6+9*2/3 -8
-			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
-			Assert.assertEquals(12, expr.evaluate(),0.001f);
-		}
-		{
-			//(3+4)*5-6
-			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
-			Assert.assertEquals(29, expr.evaluate(),0.001f);
-		}
-		{
-			//1+((2+3)*4)-5
-			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
-			Assert.assertEquals(16, expr.evaluate(),0.001f);
-		}
-		
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
deleted file mode 100644
index 8579743fe9..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/Token.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-class Token {
-	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
-	private static final Map<String,Integer> priorities = new HashMap<>();
-	static {
-		priorities.put("+", 1);
-		priorities.put("-", 1);
-		priorities.put("*", 2);
-		priorities.put("/", 2);
-	}
-	static final int OPERATOR = 1;
-	static final int NUMBER = 2;
-	String value;
-	int type;
-	public Token(int type, String value){
-		this.type = type;
-		this.value = value;
-	}		
-
-	public boolean isNumber() {
-		return type == NUMBER;
-	}
-
-	public boolean isOperator() {
-		return type == OPERATOR;
-	}
-
-	public int getIntValue() {
-		return Integer.valueOf(value).intValue();
-	}
-	public String toString(){
-		return value;
-	}
-	
-	public boolean hasHigherPriority(Token t){
-		if(!this.isOperator() && !t.isOperator()){
-			throw new RuntimeException("numbers can't compare priority");
-		}
-		return priorities.get(this.value) - priorities.get(t.value) > 0;
-	}
-	
-	
-
-}
\ No newline at end of file
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
deleted file mode 100644
index d3b0f167e1..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParser.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TokenParser {
-	
-	
-	public  List<Token> parse(String expr) {
-		List<Token> tokens = new ArrayList<>();
-
-		int i = 0;
-
-		while (i < expr.length()) {
-
-			char c = expr.charAt(i);
-
-			if (isOperator(c)) {
-
-				Token t = new Token(Token.OPERATOR, String.valueOf(c));
-				tokens.add(t);
-				i++;
-
-			} else if (Character.isDigit(c)) {
-
-				int nextOperatorIndex = indexOfNextOperator(i, expr);
-				String value = expr.substring(i, nextOperatorIndex);
-				Token t = new Token(Token.NUMBER, value);
-				tokens.add(t);
-				i = nextOperatorIndex;
-
-			} else{
-				System.out.println("char :["+c+"] is not number or operator,ignore");
-				i++;
-			}
-
-		}
-		return tokens;
-	}
-
-	private  int indexOfNextOperator(int i, String expr) {
-
-		while (Character.isDigit(expr.charAt(i))) {
-			i++;
-			if (i == expr.length()) {
-				break;
-			}
-		}
-		return i;
-
-	}
-
-	private  boolean isOperator(char c) {
-		String sc = String.valueOf(c);
-		return Token.OPERATORS.contains(sc);
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
deleted file mode 100644
index 399d3e857e..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import static org.junit.Assert.*;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TokenParserTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test() {
-		
-		TokenParser parser = new TokenParser();
-		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
-		
-		Assert.assertEquals(300, tokens.get(0).getIntValue());
-		Assert.assertEquals("*", tokens.get(1).toString());
-		Assert.assertEquals(20, tokens.get(2).getIntValue());
-		Assert.assertEquals("+", tokens.get(3).toString());
-		Assert.assertEquals(12, tokens.get(4).getIntValue());
-		Assert.assertEquals("*", tokens.get(5).toString());
-		Assert.assertEquals(5, tokens.get(6).getIntValue());
-		Assert.assertEquals("-", tokens.get(7).toString());
-		Assert.assertEquals(20, tokens.get(8).getIntValue());
-		Assert.assertEquals("/", tokens.get(9).toString());
-		Assert.assertEquals(4, tokens.get(10).getIntValue());
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
deleted file mode 100644
index 284e5b0011..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTree.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.coding.basic.queue.Queue;
-
-
-public class BinarySearchTree<T extends Comparable> {
-	
-	BinaryTreeNode<T> root;
-	public BinarySearchTree(BinaryTreeNode<T> root){
-		this.root = root;
-	}
-	public BinaryTreeNode<T> getRoot(){
-		return root;
-	}
-	public T findMin(){
-		if(root == null){
-			return null;
-		}
-		return findMin(root).data;
-	}
-	public T findMax(){
-		if(root == null){
-			return null;
-		}
-		return findMax(root).data;
-	}
-	public int height() {
-	    return height(root);
-	}
-	public int size() {
-		return size(root);
-	}
-	public void remove(T e){
-		remove(e, root);
-	}
-	
-	private BinaryTreeNode<T> remove(T x, BinaryTreeNode<T> t){
-		if(t == null){
-			return t;
-		}
-		int compareResult = x.compareTo(t.data);
-		
-		if(compareResult< 0 ){			
-			t.left = remove(x,t.left);			
-			
-		} else if(compareResult > 0){			
-			t.right = remove(x, t.right);
-			
-		} else {
-			if(t.left != null && t.right != null){
-			
-				t.data = findMin(t.right).data;
-				t.right = remove(t.data,t.right);
-				
-			} else{
-				t = (t.left != null) ? t.left : t.right;
-			}
-		}
-		return t;
-	}
-	
-	private BinaryTreeNode<T> findMin(BinaryTreeNode<T> p){
-		if (p==null){
-			return null;
-		} else if (p.left == null){
-			return p;
-		} else{
-			return findMin(p.left);
-		}
-	}
-	private BinaryTreeNode<T> findMax(BinaryTreeNode<T> p){
-		if (p==null){
-			return null;
-		}else if (p.right==null){
-			return p;
-		} else{
-			return findMax(p.right);
-		}
-	}
-	private int height(BinaryTreeNode<T> t){
-	    if (t==null){
-	        return 0;
-	    }else {
-	        int leftChildHeight=height(t.left);
-	        int rightChildHeight=height(t.right);
-	        if(leftChildHeight > rightChildHeight){
-	        	return leftChildHeight+1;
-	        } else{
-	        	return rightChildHeight+1;
-	        }
-	    }
-	}
-	private int size(BinaryTreeNode<T> t){
-		if (t == null){
-			return 0;
-		}
-		return size(t.left) + 1 + size(t.right);
-       
-   }
-	
-	public List<T> levelVisit(){		
-		List<T> result = new ArrayList<T>();
-		if(root == null){
-			return result;
-		}
-		Queue<BinaryTreeNode<T>> queue = new Queue<BinaryTreeNode<T>>();  
-		BinaryTreeNode<T> node = root;		
-		queue.enQueue(node); 
-        while (!queue.isEmpty()) {  
-            node = queue.deQueue(); 
-            result.add(node.data); 
-            if (node.left != null){
-                queue.enQueue(node.left);  
-            }
-            if (node.right != null){
-                queue.enQueue(node.right);  
-            }
-        }   
-		return result;
-	}
-	public boolean isValid(){
-		return isValid(root);
-	}
-	public T getLowestCommonAncestor(T n1, T n2){
-		if (root == null){
-            return null;
-		}
-		return lowestCommonAncestor(root,n1,n2);
-        
-	}
-	public List<T> getNodesBetween(T n1, T n2){
-		List<T> elements = new ArrayList<>();
-		getNodesBetween(elements,root,n1,n2);
-		return elements;
-	}
-	
-	public void  getNodesBetween(List<T> elements ,BinaryTreeNode<T> node, T n1, T n2){
-		
-        if (node == null) {
-            return;
-        } 
-  
-        if (n1.compareTo(node.data) < 0) {
-        	getNodesBetween(elements,node.left, n1, n2);
-        } 
-       
-        if ((n1.compareTo(node.data) <= 0 )
-        		&& (n2.compareTo(node.data) >= 0  )) {
-        	elements.add(node.data);            
-        } 
-        if (n2.compareTo(node.data)>0) {
-        	getNodesBetween(elements,node.right, n1, n2);
-        }
-	}
-	private T lowestCommonAncestor(BinaryTreeNode<T> node,T n1, T n2){
-		if(node == null){
-			return null;
-		}
-		// 如果n1和n2都比 node的值小， LCA在左孩子
-        if (node.data.compareTo(n1) > 0 && node.data.compareTo(n2) >0){
-            return lowestCommonAncestor(node.left, n1, n2);
-        }
-  
-        // 如果n1和n2都比 node的值小， LCA在右孩子
-        if (node.data.compareTo(n1) < 0 && node.data.compareTo(n2) <0) 
-            return lowestCommonAncestor(node.right, n1, n2);
-  
-        return node.data;
-	}
-	private boolean isValid(BinaryTreeNode<T> t){
-		if(t == null){
-			return true;
-		}
-		if(t.left != null && findMax(t.left).data.compareTo(t.data) >0){
-			return false;
-		}
-		if(t.right !=null && findMin(t.right).data.compareTo(t.data) <0){
-			return false;
-		}
-		if(!isValid(t.left) || !isValid(t.right)){
-			return false;
-		}
-		return true;
-	}
-}
-
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
deleted file mode 100644
index 590e60306c..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class BinarySearchTreeTest {
-	
-	BinarySearchTree<Integer> tree = null;
-	
-	@Before
-	public void setUp() throws Exception {
-		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
-		root.left = new BinaryTreeNode<Integer>(2);
-		root.right = new BinaryTreeNode<Integer>(8);
-		root.left.left = new BinaryTreeNode<Integer>(1);
-		root.left.right = new BinaryTreeNode<Integer>(4);
-		root.left.right.left = new BinaryTreeNode<Integer>(3);
-		root.left.right.right = new BinaryTreeNode<Integer>(5);
-		tree = new BinarySearchTree<Integer>(root);
-	}
-
-	@After
-	public void tearDown() throws Exception {
-		tree = null;
-	}
-
-	@Test
-	public void testFindMin() {
-		Assert.assertEquals(1, tree.findMin().intValue());
-		
-	}
-
-	@Test
-	public void testFindMax() {
-		Assert.assertEquals(8, tree.findMax().intValue());
-	}
-
-	@Test
-	public void testHeight() {
-		Assert.assertEquals(4, tree.height());
-	}
-
-	@Test
-	public void testSize() {
-		Assert.assertEquals(7, tree.size());
-	}
-
-	@Test
-	public void testRemoveLeaf() {
-		tree.remove(3);
-		BinaryTreeNode<Integer> root= tree.getRoot();
-		Assert.assertEquals(4, root.left.right.data.intValue());
-		
-	}
-	@Test
-	public void testRemoveMiddleNode1() {
-		tree.remove(4);
-		BinaryTreeNode<Integer> root= tree.getRoot();
-		Assert.assertEquals(5, root.left.right.data.intValue());
-		Assert.assertEquals(3, root.left.right.left.data.intValue());
-	}
-	@Test
-	public void testRemoveMiddleNode2() {
-		tree.remove(2);
-		BinaryTreeNode<Integer> root= tree.getRoot();
-		Assert.assertEquals(3, root.left.data.intValue());
-		Assert.assertEquals(4, root.left.right.data.intValue());
-	}
-	
-	@Test
-	public void testLevelVisit() {
-		List<Integer> values = tree.levelVisit();
-		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
-		
-	}
-	@Test
-	public void testLCA(){
-		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
-		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
-		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
-	}
-	@Test
-	public void testIsValid() {
-		
-		Assert.assertTrue(tree.isValid());
-		
-		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
-		root.left = new BinaryTreeNode<Integer>(2);
-		root.right = new BinaryTreeNode<Integer>(8);
-		root.left.left = new BinaryTreeNode<Integer>(4);
-		root.left.right = new BinaryTreeNode<Integer>(1);
-		root.left.right.left = new BinaryTreeNode<Integer>(3);
-		tree = new BinarySearchTree<Integer>(root);
-		
-		Assert.assertFalse(tree.isValid());
-	}
-	@Test
-	public void testGetNodesBetween(){
-		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
-		Assert.assertEquals("[3, 4, 5, 6, 8]",numbers.toString());
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
deleted file mode 100644
index 3f6f4d2b44..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.coding.basic.tree;
-
-public class BinaryTreeNode<T> {
-	
-	public T data;
-	public BinaryTreeNode<T> left;
-	public BinaryTreeNode<T> right;
-	
-	public BinaryTreeNode(T data){
-		this.data=data;
-	}
-	public T getData() {
-		return data;
-	}
-	public void setData(T data) {
-		this.data = data;
-	}
-	public BinaryTreeNode<T> getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode<T> left) {
-		this.left = left;
-	}
-	public BinaryTreeNode<T> getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode<T> right) {
-		this.right = right;
-	}
-	
-	public BinaryTreeNode<T> insert(Object o){
-		return  null;
-	}
-	
-	
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
deleted file mode 100644
index f2a6515fa6..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-public class BinaryTreeUtil {
-	/**
-	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
-	 * 
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
-		List<T> result = new ArrayList<T>();
-		preOrderVisit(root, result);
-		return result;
-	}
-
-	/**
-	 * 用递归的方式实现对二叉树的中遍历
-	 * 
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
-		List<T> result = new ArrayList<T>();
-		inOrderVisit(root, result);
-		return result;
-	}
-
-	/**
-	 * 用递归的方式实现对二叉树的后遍历
-	 * 
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
-		List<T> result = new ArrayList<T>();
-		postOrderVisit(root, result);
-		return result;
-	}
-
-	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
-		
-		List<T> result = new ArrayList<T>();		
-		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
-		
-		BinaryTreeNode<T> node = root;
-		
-		if(node != null){
-			stack.push(node);
-		}
-		
-		while(!stack.isEmpty()){
-			node = stack.pop();
-			result.add(node.data);
-			
-			if(node.right != null){
-				stack.push(node.right);
-			}
-			
-			if(node.left != null){
-				stack.push(node.right);
-			}			
-		}
-		return result;
-	}
-
-	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
-		
-		List<T> result = new ArrayList<T>();
-		BinaryTreeNode<T> node = root;
-		Stack<BinaryTreeNode<T>> stack = new Stack<BinaryTreeNode<T>>();
-
-		while (node != null || !stack.isEmpty()) {
-
-			while (node != null) {
-				stack.push(node);
-				node = node.left;
-			}
-			BinaryTreeNode<T> currentNode = stack.pop();
-			result.add(currentNode.data);			
-			node = currentNode.right;
-		}
-		return result;
-	}
-	
-	private static <T> void preOrderVisit(BinaryTreeNode<T> node, List<T> result) {
-		if (node == null) {
-			return;
-		}
-		result.add(node.getData());
-		preOrderVisit(node.getLeft(), result);
-		preOrderVisit(node.getRight(), result);
-	}
-
-	private static <T> void inOrderVisit(BinaryTreeNode<T> node, List<T> result) {
-		if (node == null) {
-			return;
-		}
-		inOrderVisit(node.getLeft(), result);
-		result.add(node.getData());
-		inOrderVisit(node.getRight(), result);
-	}
-
-	private static <T> void postOrderVisit(BinaryTreeNode<T> node, List<T> result) {
-		if (node == null) {
-			return;
-		}
-		postOrderVisit(node.getLeft(), result);
-		postOrderVisit(node.getRight(), result);
-		result.add(node.getData());
-	}
-
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
deleted file mode 100644
index 41857e137d..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class BinaryTreeUtilTest {
-
-	BinaryTreeNode<Integer> root = null;
-	@Before
-	public void setUp() throws Exception {
-		root = new BinaryTreeNode<Integer>(1);
-		root.setLeft(new BinaryTreeNode<Integer>(2));
-		root.setRight(new BinaryTreeNode<Integer>(5));
-		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
-		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testPreOrderVisit() {
-		
-		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
-		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
-		
-		
-	}
-	@Test
-	public void testInOrderVisit() {
-		
-		
-		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
-		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
-		
-	}
-	
-	@Test
-	public void testPostOrderVisit() {
-		
-		
-		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
-		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
-		
-	}
-	
-	
-	@Test
-	public void testInOrderVisitWithoutRecursion() {
-		BinaryTreeNode<Integer> node = root.getLeft().getRight();
-		node.setLeft(new BinaryTreeNode<Integer>(6));
-		node.setRight(new BinaryTreeNode<Integer>(7));
-		
-		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
-		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
-		
-	}
-	@Test
-	public void testPreOrderVisitWithoutRecursion() {
-		BinaryTreeNode<Integer> node = root.getLeft().getRight();
-		node.setLeft(new BinaryTreeNode<Integer>(6));
-		node.setRight(new BinaryTreeNode<Integer>(7));
-		
-		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
-		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
-		
-	}
-}
diff --git a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java b/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
deleted file mode 100644
index 85fb8ab2a4..0000000000
--- a/students/34594980/data-structure/answer/src/main/java/com/coding/basic/tree/FileList.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coding.basic.tree;
-
-import java.io.File;
-
-public class FileList {
-	public void list(File f) {
-		list(f, 0);
-	}
-
-	public void list(File f, int depth) {
-		printName(f, depth);
-		if (f.isDirectory()) {
-			File[] files = f.listFiles();
-			for (File i : files)
-				list(i, depth + 1);
-		}
-	}
-
-	void printName(File f, int depth) {
-		String name = f.getName();
-		for (int i = 0; i < depth; i++)
-			System.out.print("+");
-		if (f.isDirectory())
-			System.out.println("Dir: " + name);
-		else
-			System.out.println(f.getName() + " " + f.length());
-	}
-
-	public static void main(String args[]) {
-		FileList L = new FileList();
-		File f = new File("C:\\coderising\\tmp");
-		L.list(f);
-	}
-}
diff --git a/students/34594980/data-structure/assignment/pom.xml b/students/34594980/data-structure/assignment/pom.xml
deleted file mode 100644
index 5024466d17..0000000000
--- a/students/34594980/data-structure/assignment/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>com.coderising</groupId>
-  <artifactId>ds-assignment</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  <packaging>jar</packaging>
-
-  <name>ds-assignment</name>
-  <url>http://maven.apache.org</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <dependencies>
-    
-    <dependency>
-    	<groupId>junit</groupId>
-    	<artifactId>junit</artifactId>
-    	<version>4.12</version>
-    </dependency>
-    
-  </dependencies>
-  <repositories>
-        <repository>
-            <id>aliyunmaven</id>
-            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
-        </repository>
-    </repositories>
-</project>
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
deleted file mode 100644
index 900a3ad358..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.coderising.download;
-
-import com.coderising.download.api.Connection;
-
-public class DownloadThread extends Thread{
-
-	Connection conn;
-	int startPos;
-	int endPos;
-
-	public DownloadThread( Connection conn, int startPos, int endPos){
-		
-		this.conn = conn;		
-		this.startPos = startPos;
-		this.endPos = endPos;
-	}
-	public void run(){	
-		
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
deleted file mode 100644
index c3c8a3f27d..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.coderising.download;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-
-
-public class FileDownloader {
-	
-	String url;
-	
-	DownloadListener listener;
-	
-	ConnectionManager cm;
-	
-
-	public FileDownloader(String _url) {
-		this.url = _url;
-		
-	}
-	
-	public void execute(){
-		// 在这里实现你的代码， 注意： 需要用多线程实现下载
-		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
-		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
-		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
-		// 具体的实现思路：
-		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
-		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
-		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
-		// 3. 把byte数组写入到文件中
-		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
-		
-		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
-		Connection conn = null;
-		try {
-			
-			conn = cm.open(this.url);
-			
-			int length = conn.getContentLength();	
-			
-			new DownloadThread(conn,0,length-1).start();
-			
-		} catch (ConnectionException e) {			
-			e.printStackTrace();
-		}finally{
-			if(conn != null){
-				conn.close();
-			}
-		}
-		
-		
-		
-		
-	}
-	
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	
-	
-	public void setConnectionManager(ConnectionManager ucm){
-		this.cm = ucm;
-	}
-	
-	public DownloadListener getListener(){
-		return this.listener;
-	}
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
deleted file mode 100644
index 4ff7f46ae0..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.coderising.download;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-import com.coderising.download.impl.ConnectionManagerImpl;
-
-public class FileDownloaderTest {
-	boolean downloadFinished = false;
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testDownload() {
-		
-		String url = "http://localhost:8080/test.jpg";
-		
-		FileDownloader downloader = new FileDownloader(url);
-
-	
-		ConnectionManager cm = new ConnectionManagerImpl();
-		downloader.setConnectionManager(cm);
-		
-		downloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-
-		});
-
-		
-		downloader.execute();
-		
-		// 等待多线程下载程序执行完毕
-		while (!downloadFinished) {
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				//休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {				
-				e.printStackTrace();
-			}
-		}
-		System.out.println("下载完成！");
-		
-		
-
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
deleted file mode 100644
index 0957eaf7f4..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.download.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * @param startPos 开始位置， 从0开始
-	 * @param endPos 结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos,int endPos) throws IOException;
-	/**
-	 * 得到数据内容的长度
-	 * @return
-	 */
-	public int getContentLength();
-	
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
deleted file mode 100644
index 1551a80b3d..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public class ConnectionException extends Exception {
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
deleted file mode 100644
index ce045393b1..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.download.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
deleted file mode 100644
index bf9807b307..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
deleted file mode 100644
index 36a9d2ce15..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coderising.download.impl;
-
-import java.io.IOException;
-
-import com.coderising.download.api.Connection;
-
-public class ConnectionImpl implements Connection{
-
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {
-		
-		return null;
-	}
-
-	@Override
-	public int getContentLength() {
-		
-		return 0;
-	}
-
-	@Override
-	public void close() {
-		
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
deleted file mode 100644
index 172371dd55..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coderising.download.impl;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-
-public class ConnectionManagerImpl implements ConnectionManager {
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-		
-		return null;
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
deleted file mode 100644
index dcdbe226ed..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.coderising.litestruts;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * @author liuxin
- *
- */
-public class LoginAction{
-    private String name ;
-    private String password;
-    private String message;
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String execute(){
-            if("test".equals(name) && "1234".equals(password)){
-                this.message = "login successful";
-                return "success";
-            }
-            this.message = "login failed,please check your user/pwd";
-            return "fail";
-    }
-
-    public void setName(String name){
-        this.name = name;
-    }
-    public void setPassword(String password){
-        this.password = password;
-    }
-    public String getMessage(){
-        return this.message;
-    }
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
deleted file mode 100644
index 85e2e22de3..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-
-
-public class Struts {
-
-    public static View runAction(String actionName, Map<String,String> parameters) {
-
-        /*
-         
-		0. 读取配置文件struts.xml
- 		
- 		1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
-		据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 
-		("name"="test" ,  "password"="1234") ,     	
-		那就应该调用 setName和setPassword方法
-		
-		2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
-		
-		3. 通过反射找到对象的所有getter方法（例如 getMessage）,  
-		通过反射来调用， 把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,  
-		放到View对象的parameters
-		
-		4. 根据struts.xml中的 <result> 配置,以及execute的返回值，  确定哪一个jsp，  
-		放到View对象的jsp字段中。
-        
-        */
-    	
-    	return null;
-    }    
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
deleted file mode 100644
index b8c81faf3c..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-
-
-
-
-public class StrutsTest {
-
-	@Test
-	public void testLoginActionSuccess() {
-		
-		String actionName = "login";
-        
-		Map<String,String> params = new HashMap<String,String>();
-        params.put("name","test");
-        params.put("password","1234");
-        
-        
-        View view  = Struts.runAction(actionName,params);        
-        
-        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
-        Assert.assertEquals("login successful", view.getParameters().get("message"));
-	}
-
-	@Test
-	public void testLoginActionFailed() {
-		String actionName = "login";
-		Map<String,String> params = new HashMap<String,String>();
-        params.put("name","test");
-        params.put("password","123456"); //密码和预设的不一致
-        
-        View view  = Struts.runAction(actionName,params);        
-        
-        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
-        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
deleted file mode 100644
index 07df2a5dab..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-public class View {
-	private String jsp;
-	private Map parameters;
-	
-	public String getJsp() {
-		return jsp;
-	}
-	public View setJsp(String jsp) {
-		this.jsp = jsp;
-		return this;
-	}
-	public Map getParameters() {
-		return parameters;
-	}
-	public View setParameters(Map parameters) {
-		this.parameters = parameters;
-		return this;
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml b/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
deleted file mode 100644
index e5d9aebba8..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<struts>
-    <action name="login" class="com.coderising.litestruts.LoginAction">
-        <result name="success">/jsp/homepage.jsp</result>
-        <result name="fail">/jsp/showLogin.jsp</result>
-    </action>
-    <action name="logout" class="com.coderising.litestruts.LogoutAction">
-    	<result name="success">/jsp/welcome.jsp</result>
-    	<result name="error">/jsp/error.jsp</result>
-    </action>
-</struts>
\ No newline at end of file
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
deleted file mode 100644
index 436d092f58..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.coderising.ood.course.bad;
-
-import java.util.List;
-
-public class Course {
-	private String id;
-	private String desc;
-	private int duration ;
-	
-	List<Course> prerequisites;
-	
-	public List<Course> getPrerequisites() {
-		return prerequisites;
-	}
-	
-	
-	public boolean equals(Object o){
-		if(o == null || !(o instanceof Course)){
-			return false;
-		}
-		Course c = (Course)o;
-		return (c != null) && c.id.equals(id);
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
deleted file mode 100644
index ab8c764584..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.ood.course.bad;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class CourseOffering {
-	private Course course;
-	private String location;
-	private String teacher;
-	private int maxStudents;
-	
-	List<Student> students = new ArrayList<Student>();
-	
-	public int getMaxStudents() {
-		return maxStudents;
-	}
-	
-	public List<Student> getStudents() {
-		return students;
-	}
-
-	public Course getCourse() {
-		return course;
-	}	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
deleted file mode 100644
index 8c34bad0c3..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.coderising.ood.course.bad;
-
-
-
-public class CourseService {
-	
-	public void chooseCourse(Student student, CourseOffering sc){		
-		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
-		if(student.getCoursesAlreadyTaken().containsAll(
-				sc.getCourse().getPrerequisites())
-				&& sc.getMaxStudents() > sc.getStudents().size()){
-			sc.getStudents().add(student);
-		}
-		
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
deleted file mode 100644
index a651923ef5..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.coderising.ood.course.bad;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Student {
-	private String id;
-	private String name;
-	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
-	
-	public List<Course> getCoursesAlreadyTaken() {
-		return coursesAlreadyTaken;
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
deleted file mode 100644
index aefc9692bb..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.coderising.ood.course.good;
-
-import java.util.List;
-
-public class Course {
-	private String id;
-	private String desc;
-	private int duration ;
-	
-	List<Course> prerequisites;
-	
-	public List<Course> getPrerequisites() {
-		return prerequisites;
-	}
-	
-}
-
-
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
deleted file mode 100644
index 8660ec8109..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.ood.course.good;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CourseOffering {
-	private Course course;
-	private String location;
-	private String teacher;
-	private int maxStudents;
-	
-	List<Student> students = new ArrayList<Student>();
-	
-	public List<Student> getStudents() {
-		return students;
-	}
-	public int getMaxStudents() {
-		return maxStudents;
-	}
-	public Course getCourse() {
-		return course;
-	}
-	
-	
-	// 第二步：　把主要逻辑移动到CourseOffering 中
-	public void addStudent(Student student){
-		
-		if(student.canAttend(course) 
-				&& this.maxStudents > students.size()){
-			students.add(student);
-		}
-	}
-	// 第三步： 重构CourseService
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
deleted file mode 100644
index 22ba4a5450..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.coderising.ood.course.good;
-
-
-
-public class CourseService {
-	
-	public void chooseCourse(Student student, CourseOffering sc){		
-		//第一步：重构： canAttend ， 但是还有问题
-		if(student.canAttend(sc.getCourse())
-				&& sc.getMaxStudents() > sc.getStudents().size()){
-			sc.getStudents().add(student);
-		}
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
deleted file mode 100644
index 2c7e128b2a..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.coderising.ood.course.good;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Student {
-	private String id;
-	private String name;
-	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
-	
-	public List<Course> getCoursesAlreadyTaken() {
-		return coursesAlreadyTaken;
-	}	
-	
-	public boolean canAttend(Course course){
-		return this.coursesAlreadyTaken.containsAll(
-				course.getPrerequisites());
-	}
-}
-
-
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
deleted file mode 100644
index b6cf28c096..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp;
-
-public class DateUtil {
-
-	public static String getCurrentDateAsString() {
-		
-		return null;
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
deleted file mode 100644
index 0357c4d912..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java
+++ /dev/null
@@ -1,38 +0,0 @@
-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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
deleted file mode 100644
index ec54b839c5..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp;
-
-public class MailUtil {
-
-	public static void send(String logMsg) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
deleted file mode 100644
index 13cf802418..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp;
-
-public class SMSUtil {
-
-	public static void send(String logMsg) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
deleted file mode 100644
index 82e9261d18..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ /dev/null
@@ -1,25 +0,0 @@
-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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 9f9e749af7..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-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/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index 781587a846..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,199 +0,0 @@
-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/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
deleted file mode 100644
index 06ef6311b2..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.coding.basic;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java
deleted file mode 100644
index 10d13b5832..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.coding.basic;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
deleted file mode 100644
index 4576c016af..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.coding.basic.array;
-
-import com.coding.basic.Iterator;
-import com.coding.basic.List;
-
-public class ArrayList implements List {
-	
-	private int size = 0;
-	
-	private Object[] elementData = new Object[100];
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index, Object o){
-		
-	}
-	
-	public Object get(int index){
-		return null;
-	}
-	
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public Iterator iterator(){
-		return null;
-	}
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
deleted file mode 100644
index 45740e6d57..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.coding.basic.array;
-
-public class ArrayUtil {
-	
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换
-		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
-		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * @param origin
-	 * @return
-	 */
-	public void reverseArray(int[] origin){
-		
-	}
-	
-	/**
-	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
-	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
-	 * @param oldArray
-	 * @return
-	 */
-	
-	public int[] removeZero(int[] oldArray){
-		return null;
-	}
-	
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
-	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-	
-	public int[] merge(int[] array1, int[] array2){
-		return  null;
-	}
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持
-	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * @param oldArray
-	 * @param size
-	 * @return
-	 */
-	public int[] grow(int [] oldArray,  int size){
-		return null;
-	}
-	
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
-	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
-	 * max = 1, 则返回空数组 []
-	 * @param max
-	 * @return
-	 */
-	public int[] fibonacci(int max){
-		return null;
-	}
-	
-	/**
-	 * 返回小于给定最大值max的所有素数数组
-	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * @param max
-	 * @return
-	 */
-	public int[] getPrimes(int max){
-		return null;
-	}
-	
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
-	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * @param max
-	 * @return
-	 */
-	public int[] getPerfectNumbers(int max){
-		return null;
-	}
-	
-	/**
-	 * 用seperator 把数组 array给连接起来
-	 * 例如array= [3,8,9], seperator = "-"
-	 * 则返回值为"3-8-9"
-	 * @param array
-	 * @param s
-	 * @return
-	 */
-	public String join(int[] array, String seperator){
-		return null;
-	}
-	
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
deleted file mode 100644
index 994a241a3d..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.coding.basic.linklist;
-
-
-public class LRUPageFrame {
-	
-	private static class Node {
-		
-		Node prev;
-		Node next;
-		int pageNum;
-
-		Node() {
-		}
-	}
-
-	private int capacity;
-	
-	private int currentSize;
-	private Node first;// 链表头
-	private Node last;// 链表尾
-
-	
-	public LRUPageFrame(int capacity) {
-		this.currentSize = 0;
-		this.capacity = capacity;
-		
-	}
-
-	/**
-	 * 获取缓存中对象
-	 * 
-	 * @param key
-	 * @return
-	 */
-	public void access(int pageNum) {
-		
-		
-	}
-	
-	
-	public String toString(){
-		StringBuilder buffer = new StringBuilder();
-		Node node = first;
-		while(node != null){
-			buffer.append(node.pageNum);			
-			
-			node = node.next;
-			if(node != null){
-				buffer.append(",");
-			}
-		}
-		return buffer.toString();
-	}
-	
-	
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
deleted file mode 100644
index 7fd72fc2b4..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coding.basic.linklist;
-
-import  org.junit.Assert;
-
-import org.junit.Test;
-
-
-public class LRUPageFrameTest {
-	
-	@Test
-	public void testAccess() {
-		LRUPageFrame frame = new LRUPageFrame(3);
-		frame.access(7);
-		frame.access(0);
-		frame.access(1);
-		Assert.assertEquals("1,0,7", frame.toString());
-		frame.access(2);
-		Assert.assertEquals("2,1,0", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(3);
-		Assert.assertEquals("3,0,2", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,3,2", frame.toString());
-		frame.access(4);
-		Assert.assertEquals("4,0,3", frame.toString());
-		frame.access(5);
-		Assert.assertEquals("5,4,0", frame.toString());
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
deleted file mode 100644
index f4c7556a2e..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.coding.basic.linklist;
-
-import com.coding.basic.Iterator;
-import com.coding.basic.List;
-
-public class LinkedList implements List {
-	
-	private Node head;
-	
-	public void add(Object o){
-		
-	}
-	public void add(int index , Object o){
-		
-	}
-	public Object get(int index){
-		return null;
-	}
-	public Object remove(int index){
-		return null;
-	}
-	
-	public int size(){
-		return -1;
-	}
-	
-	public void addFirst(Object o){
-		
-	}
-	public void addLast(Object o){
-		
-	}
-	public Object removeFirst(){
-		return null;
-	}
-	public Object removeLast(){
-		return null;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-	
-	
-	private static  class Node{
-		Object data;
-		Node next;
-		
-	}
-	
-	/**
-	 * 把该链表逆置
-	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
-	 */
-	public  void reverse(){		
-		
-	}
-	
-	/**
-	 * 删除一个单链表的前半部分
-	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
-	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
-
-	 */
-	public  void removeFirstHalf(){
-		
-	}
-	
-	/**
-	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
-	 * @param i
-	 * @param length
-	 */
-	public  void remove(int i, int length){
-		
-	}
-	/**
-	 * 假定当前链表和listB均包含已升序排列的整数
-	 * 从当前链表中取出那些listB所指定的元素
-	 * 例如当前链表 = 11->101->201->301->401->501->601->701
-	 * listB = 1->3->4->6
-	 * 返回的结果应该是[101,301,401,601]  
-	 * @param list
-	 */
-	public  int[] getElements(LinkedList list){
-		return null;
-	}
-	
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 从当前链表中中删除在listB中出现的元素 
-
-	 * @param list
-	 */
-	
-	public  void subtract(LinkedList list){
-		
-	}
-	
-	/**
-	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
-	 */
-	public  void removeDuplicateValues(){
-		
-	}
-	
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
-	 * @param min
-	 * @param max
-	 */
-	public  void removeRange(int min, int max){
-		
-	}
-	
-	/**
-	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
-	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
-	 * @param list
-	 */
-	public  LinkedList intersection( LinkedList list){
-		return null;
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
deleted file mode 100644
index 2e0550c67e..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.coding.basic.queue;
-
-/**
- * 用数组实现循环队列
- * @author liuxin
- *
- * @param <E>
- */
-public class CircleQueue <E> {
-	
-	private final static int DEFAULT_SIZE = 10;
-	
-	//用数组来保存循环队列的元素
-	private Object[] elementData = new Object[DEFAULT_SIZE] ;
-	
-	//队头
-	private int front = 0;  
-	//队尾  
-	private int rear = 0;
-	
-	public boolean isEmpty() {
-		return false;
-        
-    }
-
-    public int size() {
-        return -1;
-    }
-
-    
-
-    public void enQueue(E data) {
-        
-    }
-
-    public E deQueue() {
-        return null;
-    }
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
deleted file mode 100644
index 6a3ea639b9..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.coding.basic.queue;
-
-import java.util.List;
-
-/**
- * 用Queue来实现Josephus问题
- * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
- * 该方法返回一个List， 包含了被杀死人的次序
- * @author liuxin
- *
- */
-public class Josephus {
-	
-	public static List<Integer> execute(int n, int m){		
-		return null;
-	}
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
deleted file mode 100644
index 7d90318b51..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coding.basic.queue;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class JosephusTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testExecute() {
-		
-		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
deleted file mode 100644
index c4c4b7325e..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.coding.basic.queue;
-
-import java.util.NoSuchElementException;
-
-public class Queue<E> {
-    private Node<E> first;    
-    private Node<E> last;     
-    private int size;               
-
-    
-    private static class Node<E> {
-        private E item;
-        private Node<E> next;
-    }
-
-    
-    public Queue() {
-        first = null;
-        last  = null;
-        size = 0;
-    }
-
-    
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public int size() {
-        return size;
-    }
-
-    
-
-    public void enQueue(E data) {
-        Node<E> oldlast = last;
-        last = new Node<E>();
-        last.item = data;
-        last.next = null;
-        if (isEmpty()) {
-        	first = last;
-        }
-        else{
-        	oldlast.next = last;
-        }
-        size++;
-    }
-
-    public E deQueue() {
-        if (isEmpty()) {
-        	throw new NoSuchElementException("Queue underflow");
-        }
-        E item = first.item;
-        first = first.next;
-        size--;
-        if (isEmpty()) {
-        	last = null;  
-        }
-        return item;
-    }
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
deleted file mode 100644
index cef19a8b59..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.coding.basic.queue;
-
-import java.util.Stack;
-
-/**
- * 用两个栈来实现一个队列
- * @author liuxin
- *
- * @param <E>
- */
-public class QueueWithTwoStacks<E> {
-	private Stack<E> stack1;    
-    private Stack<E> stack2;    
-
-    
-    public QueueWithTwoStacks() {
-        stack1 = new Stack<E>();
-        stack2 = new Stack<E>();
-    }
-
-   
-    
-
-    public boolean isEmpty() {
-        return false;
-    }
-
-
-    
-    public int size() {
-        return -1;   
-    }
-
-
-
-    public void enQueue(E item) {
-        
-    }
-
-    public E deQueue() {
-        return null;
-    }
-
-
-
- }
-
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
deleted file mode 100644
index f391d92b8f..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.coding.basic.stack;
-
-/**
- * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
- * finMin操作最坏的情形下时间复杂度应该是O(1) ， 简单来讲，操作一次就可以得到最小值
- * @author liuxin
- *
- */
-public class QuickMinStack {
-	public void push(int data){
-		
-	}
-	public int pop(){
-		return -1;
-	}
-	public int findMin(){
-		return -1;
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
deleted file mode 100644
index fedb243604..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.coding.basic.stack;
-
-import com.coding.basic.array.ArrayList;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){		
-	}
-	
-	public Object pop(){
-		return null;
-	}
-	
-	public Object peek(){
-		return null;
-	}
-	public boolean isEmpty(){
-		return false;
-	}
-	public int size(){
-		return -1;
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
deleted file mode 100644
index b0ec38161d..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.coding.basic.stack;
-import java.util.Stack;
-public class StackUtil {
-	
-	
-	
-	/**
-	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 */
-	public static void reverse(Stack<Integer> s) {
-		
-		
-		
-	}
-	
-	/**
-	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * 
-	 * @param o
-	 */
-	public static void remove(Stack s,Object o) {
-		
-	}
-
-	/**
-	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * @param len
-	 * @return
-	 */
-	public static Object[] getTop(Stack s,int len) {
-		return null;
-	}
-	/**
-	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
-	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
-	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
-	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
-	 * @param s
-	 * @return
-	 */
-	public static boolean isValidPairs(String s){
-		return false;
-	}
-	
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
deleted file mode 100644
index 76f2cb7668..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-public class StackUtilTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	
-	@Test
-	public void testReverse() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
-		StackUtil.reverse(s);
-		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
-	}
-	
-	@Test
-	public void testRemove() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		StackUtil.remove(s, 2);
-		Assert.assertEquals("[1, 3]", s.toString());
-	}
-
-	@Test
-	public void testGetTop() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		{
-			Object[] values = StackUtil.getTop(s, 3);
-			Assert.assertEquals(5, values[0]);
-			Assert.assertEquals(4, values[1]);
-			Assert.assertEquals(3, values[2]);
-		}
-	}
-
-	@Test
-	public void testIsValidPairs() {
-		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
-		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
deleted file mode 100644
index d0ab4387d2..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.coding.basic.stack;
-
-
-public class StackWithTwoQueues {
-	
-
-    public void push(int data) {       
-
-    }
-
-    public int pop() {
-       return -1;
-    }
-
-    
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
deleted file mode 100644
index e86d056a24..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.coding.basic.stack;
-
-/**
- * 用一个数组实现两个栈
- * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
- * @author liuxin
- *
- */
-public class TwoStackInOneArray {
-	Object[] data = new Object[10];
-	
-	/**
-	 * 向第一个栈中压入元素
-	 * @param o
-	 */
-	public void push1(Object o){
-		
-	}
-	/**
-	 * 从第一个栈中弹出元素
-	 * @return
-	 */
-	public Object pop1(){
-		return null;
-	}
-	
-	/**
-	 * 获取第一个栈的栈顶元素
-	 * @return
-	 */
-	
-	public Object peek1(){
-		return null;
-	}
-	/*
-	 * 向第二个栈压入元素
-	 */
-	public void push2(Object o){
-		
-	}
-	/**
-	 * 从第二个栈弹出元素
-	 * @return
-	 */
-	public Object pop2(){
-		return null;
-	}
-	/**
-	 * 获取第二个栈的栈顶元素
-	 * @return
-	 */
-	
-	public Object peek2(){
-		return null;
-	}
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
deleted file mode 100644
index ef85ff007f..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coding.basic.stack.expr;
-
-public class InfixExpr {
-	String expr = null;
-	
-	public InfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		return 0.0f;
-	}
-	
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
deleted file mode 100644
index 20e34e8852..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class InfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
-		{
-			InfixExpr expr = new InfixExpr("2+3*4+5");
-			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
-			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("3*20/2");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("20/2*3");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("10-30+50");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("10-2*3+50");
-			Assert.assertEquals(54, expr.evaluate(), 0.001f);
-		}
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
deleted file mode 100644
index 96a2194a67..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-
-public class InfixToPostfix {
-	
-	public static List<Token> convert(String expr) {
-		
-		return null;
-	}
-	
-	
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
deleted file mode 100644
index dcbb18be4b..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-import java.util.Stack;
-
-public class PostfixExpr {
-String expr = null;
-	
-	public PostfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		return 0.0f;
-	}
-	
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
deleted file mode 100644
index c0435a2db5..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.coding.basic.stack.expr;
-
-
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class PostfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		{
-			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
-			Assert.assertEquals(288, expr.evaluate(),0.0f);
-		}
-		{
-			//9+(3-1)*3+10/2
-			PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+");
-			Assert.assertEquals(20, expr.evaluate(),0.0f);
-		}
-		
-		{
-			//10-2*3+50
-			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
-			Assert.assertEquals(54, expr.evaluate(),0.0f);
-		}
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
deleted file mode 100644
index 956927e2df..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.List;
-import java.util.Stack;
-
-public class PrefixExpr {
-	String expr = null;
-	
-	public PrefixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		return 0.0f;
-	}
-	
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
deleted file mode 100644
index 5cec210e75..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class PrefixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		{
-			// 2*3+4*5 
-			PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5");
-			Assert.assertEquals(26, expr.evaluate(),0.001f);
-		}
-		{
-			// 4*2 + 6+9*2/3 -8
-			PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");
-			Assert.assertEquals(12, expr.evaluate(),0.001f);
-		}
-		{
-			//(3+4)*5-6
-			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
-			Assert.assertEquals(29, expr.evaluate(),0.001f);
-		}
-		{
-			//1+((2+3)*4)-5
-			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
-			Assert.assertEquals(16, expr.evaluate(),0.001f);
-		}
-		
-		
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
deleted file mode 100644
index 8579743fe9..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-class Token {
-	public static final List<String> OPERATORS = Arrays.asList("+", "-", "*", "/");
-	private static final Map<String,Integer> priorities = new HashMap<>();
-	static {
-		priorities.put("+", 1);
-		priorities.put("-", 1);
-		priorities.put("*", 2);
-		priorities.put("/", 2);
-	}
-	static final int OPERATOR = 1;
-	static final int NUMBER = 2;
-	String value;
-	int type;
-	public Token(int type, String value){
-		this.type = type;
-		this.value = value;
-	}		
-
-	public boolean isNumber() {
-		return type == NUMBER;
-	}
-
-	public boolean isOperator() {
-		return type == OPERATOR;
-	}
-
-	public int getIntValue() {
-		return Integer.valueOf(value).intValue();
-	}
-	public String toString(){
-		return value;
-	}
-	
-	public boolean hasHigherPriority(Token t){
-		if(!this.isOperator() && !t.isOperator()){
-			throw new RuntimeException("numbers can't compare priority");
-		}
-		return priorities.get(this.value) - priorities.get(t.value) > 0;
-	}
-	
-	
-
-}
\ No newline at end of file
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
deleted file mode 100644
index d3b0f167e1..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TokenParser {
-	
-	
-	public  List<Token> parse(String expr) {
-		List<Token> tokens = new ArrayList<>();
-
-		int i = 0;
-
-		while (i < expr.length()) {
-
-			char c = expr.charAt(i);
-
-			if (isOperator(c)) {
-
-				Token t = new Token(Token.OPERATOR, String.valueOf(c));
-				tokens.add(t);
-				i++;
-
-			} else if (Character.isDigit(c)) {
-
-				int nextOperatorIndex = indexOfNextOperator(i, expr);
-				String value = expr.substring(i, nextOperatorIndex);
-				Token t = new Token(Token.NUMBER, value);
-				tokens.add(t);
-				i = nextOperatorIndex;
-
-			} else{
-				System.out.println("char :["+c+"] is not number or operator,ignore");
-				i++;
-			}
-
-		}
-		return tokens;
-	}
-
-	private  int indexOfNextOperator(int i, String expr) {
-
-		while (Character.isDigit(expr.charAt(i))) {
-			i++;
-			if (i == expr.length()) {
-				break;
-			}
-		}
-		return i;
-
-	}
-
-	private  boolean isOperator(char c) {
-		String sc = String.valueOf(c);
-		return Token.OPERATORS.contains(sc);
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
deleted file mode 100644
index 399d3e857e..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import static org.junit.Assert.*;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class TokenParserTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test() {
-		
-		TokenParser parser = new TokenParser();
-		List<Token> tokens  = parser.parse("300*20+12*5-20/4");
-		
-		Assert.assertEquals(300, tokens.get(0).getIntValue());
-		Assert.assertEquals("*", tokens.get(1).toString());
-		Assert.assertEquals(20, tokens.get(2).getIntValue());
-		Assert.assertEquals("+", tokens.get(3).toString());
-		Assert.assertEquals(12, tokens.get(4).getIntValue());
-		Assert.assertEquals("*", tokens.get(5).toString());
-		Assert.assertEquals(5, tokens.get(6).getIntValue());
-		Assert.assertEquals("-", tokens.get(7).toString());
-		Assert.assertEquals(20, tokens.get(8).getIntValue());
-		Assert.assertEquals("/", tokens.get(9).toString());
-		Assert.assertEquals(4, tokens.get(10).getIntValue());
-	}
-
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
deleted file mode 100644
index 4536ee7a2b..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.coding.basic.queue.Queue;
-
-public class BinarySearchTree<T extends Comparable> {
-	
-	BinaryTreeNode<T> root;
-	public BinarySearchTree(BinaryTreeNode<T> root){
-		this.root = root;
-	}
-	public BinaryTreeNode<T> getRoot(){
-		return root;
-	}
-	public T findMin(){
-		return null;
-	}
-	public T findMax(){
-		return null;
-	}
-	public int height() {
-	    return -1;
-	}
-	public int size() {
-		return -1;
-	}
-	public void remove(T e){
-		
-	}
-	public List<T> levelVisit(){
-		
-		return null;
-	}
-	public boolean isValid(){
-		return false;
-	}
-	public T getLowestCommonAncestor(T n1, T n2){
-		return null;
-        
-	}
-	/**
-	 * 返回所有满足下列条件的节点的值：  n1 <= n <= n2 , n 为
-	 * 该二叉查找树中的某一节点
-	 * @param n1
-	 * @param n2
-	 * @return
-	 */
-	public List<T> getNodesBetween(T n1, T n2){
-		return null;
-	}
-	
-}
-
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
deleted file mode 100644
index 4a53dbe2f1..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class BinarySearchTreeTest {
-	
-	BinarySearchTree<Integer> tree = null;
-	
-	@Before
-	public void setUp() throws Exception {
-		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
-		root.left = new BinaryTreeNode<Integer>(2);
-		root.right = new BinaryTreeNode<Integer>(8);
-		root.left.left = new BinaryTreeNode<Integer>(1);
-		root.left.right = new BinaryTreeNode<Integer>(4);
-		root.left.right.left = new BinaryTreeNode<Integer>(3);
-		root.left.right.right = new BinaryTreeNode<Integer>(5);
-		tree = new BinarySearchTree<Integer>(root);
-	}
-
-	@After
-	public void tearDown() throws Exception {
-		tree = null;
-	}
-
-	@Test
-	public void testFindMin() {
-		Assert.assertEquals(1, tree.findMin().intValue());
-		
-	}
-
-	@Test
-	public void testFindMax() {
-		Assert.assertEquals(8, tree.findMax().intValue());
-	}
-
-	@Test
-	public void testHeight() {
-		Assert.assertEquals(4, tree.height());
-	}
-
-	@Test
-	public void testSize() {
-		Assert.assertEquals(7, tree.size());
-	}
-
-	@Test
-	public void testRemoveLeaf() {
-		tree.remove(3);
-		BinaryTreeNode<Integer> root= tree.getRoot();
-		Assert.assertEquals(4, root.left.right.data.intValue());
-		
-	}
-	@Test
-	public void testRemoveMiddleNode1() {
-		tree.remove(4);
-		BinaryTreeNode<Integer> root= tree.getRoot();
-		Assert.assertEquals(5, root.left.right.data.intValue());
-		Assert.assertEquals(3, root.left.right.left.data.intValue());
-	}
-	@Test
-	public void testRemoveMiddleNode2() {
-		tree.remove(2);
-		BinaryTreeNode<Integer> root= tree.getRoot();
-		Assert.assertEquals(3, root.left.data.intValue());
-		Assert.assertEquals(4, root.left.right.data.intValue());
-	}
-	
-	@Test
-	public void testLevelVisit() {
-		List<Integer> values = tree.levelVisit();
-		Assert.assertEquals("[6, 2, 8, 1, 4, 3, 5]", values.toString());
-		
-	}
-	@Test
-	public void testLCA(){
-		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 5).intValue());
-		Assert.assertEquals(2,tree.getLowestCommonAncestor(1, 4).intValue());
-		Assert.assertEquals(6,tree.getLowestCommonAncestor(3, 8).intValue());
-	}
-	@Test
-	public void testIsValid() {
-		
-		Assert.assertTrue(tree.isValid());
-		
-		BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
-		root.left = new BinaryTreeNode<Integer>(2);
-		root.right = new BinaryTreeNode<Integer>(8);
-		root.left.left = new BinaryTreeNode<Integer>(4);
-		root.left.right = new BinaryTreeNode<Integer>(1);
-		root.left.right.left = new BinaryTreeNode<Integer>(3);
-		tree = new BinarySearchTree<Integer>(root);
-		
-		Assert.assertFalse(tree.isValid());
-	}
-	@Test
-	public void testGetNodesBetween(){
-		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
-		System.out.println(numbers.toString());
-		
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
deleted file mode 100644
index c1421cd398..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.coding.basic.tree;
-
-public class BinaryTreeNode<T> {
-	
-	public T data;
-	public BinaryTreeNode<T> left;
-	public BinaryTreeNode<T> right;
-	
-	public BinaryTreeNode(T data){
-		this.data=data;
-	}
-	public T getData() {
-		return data;
-	}
-	public void setData(T data) {
-		this.data = data;
-	}
-	public BinaryTreeNode<T> getLeft() {
-		return left;
-	}
-	public void setLeft(BinaryTreeNode<T> left) {
-		this.left = left;
-	}
-	public BinaryTreeNode<T> getRight() {
-		return right;
-	}
-	public void setRight(BinaryTreeNode<T> right) {
-		this.right = right;
-	}
-	
-	public BinaryTreeNode<T> insert(Object o){
-		return  null;
-	}
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
deleted file mode 100644
index b033cbe1d5..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-public class BinaryTreeUtil {
-	/**
-	 * 用递归的方式实现对二叉树的前序遍历， 需要通过BinaryTreeUtilTest测试
-	 * 
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
-		List<T> result = new ArrayList<T>();
-		
-		return result;
-	}
-
-	/**
-	 * 用递归的方式实现对二叉树的中遍历
-	 * 
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
-		List<T> result = new ArrayList<T>();
-		
-		return result;
-	}
-
-	/**
-	 * 用递归的方式实现对二叉树的后遍历
-	 * 
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
-		List<T> result = new ArrayList<T>();
-		
-		return result;
-	}
-	/**
-	 * 用非递归的方式实现对二叉树的前序遍历
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
-		
-		List<T> result = new ArrayList<T>();		
-		
-		return result;
-	}
-	/**
-	 * 用非递归的方式实现对二叉树的中序遍历
-	 * @param root
-	 * @return
-	 */
-	public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
-		
-		List<T> result = new ArrayList<T>();
-		
-		return result;
-	}
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
deleted file mode 100644
index 41857e137d..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.coding.basic.tree;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class BinaryTreeUtilTest {
-
-	BinaryTreeNode<Integer> root = null;
-	@Before
-	public void setUp() throws Exception {
-		root = new BinaryTreeNode<Integer>(1);
-		root.setLeft(new BinaryTreeNode<Integer>(2));
-		root.setRight(new BinaryTreeNode<Integer>(5));
-		root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
-		root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testPreOrderVisit() {
-		
-		List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
-		Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
-		
-		
-	}
-	@Test
-	public void testInOrderVisit() {
-		
-		
-		List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
-		Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());		
-		
-	}
-	
-	@Test
-	public void testPostOrderVisit() {
-		
-		
-		List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
-		Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());		
-		
-	}
-	
-	
-	@Test
-	public void testInOrderVisitWithoutRecursion() {
-		BinaryTreeNode<Integer> node = root.getLeft().getRight();
-		node.setLeft(new BinaryTreeNode<Integer>(6));
-		node.setRight(new BinaryTreeNode<Integer>(7));
-		
-		List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
-		Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());		
-		
-	}
-	@Test
-	public void testPreOrderVisitWithoutRecursion() {
-		BinaryTreeNode<Integer> node = root.getLeft().getRight();
-		node.setLeft(new BinaryTreeNode<Integer>(6));
-		node.setRight(new BinaryTreeNode<Integer>(7));
-		
-		List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
-		Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());		
-		
-	}
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java b/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
deleted file mode 100644
index 6e65192e4a..0000000000
--- a/students/34594980/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coding.basic.tree;
-
-import java.io.File;
-
-public class FileList {
-	public void list(File f) {		
-	}
-
-	
-}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
similarity index 100%
rename from students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
similarity index 100%
rename from students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..b40eb53476
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,34 @@
+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<HashMap<String, String>> query(String sql) {
+
+		List<HashMap<String, String>> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String, String> userInfo = new HashMap<>();
+			userInfo.put("NAME", "User" + i);
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+
+	public static List<HashMap<String, String>> loadMailingList(Product product) {
+		
+		String sendMailQuery = "Select name from subscriptions " + "where product_id= '"
+				+ product.getId() + "' " + "and send_mail=1 ";
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 0000000000..e5e6a29076
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+public class Email {
+
+	private String smtpHost ;
+	private String altSmtpHost ; 
+	private String fromAddress ;
+	private String toAddress ;
+	private String subject ;
+	private String message ;
+	
+	
+	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 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 getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..6abdc05ebd
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+	private static final String FILENAME="product_promotion.txt";
+	
+	//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+	public static Product readFile()// @02C
+	{
+		Product product = null;
+		BufferedReader br = null;
+		try {
+			String filePath = FileUtil.class.getResource(FILENAME).getPath();
+			File file = new File(filePath);
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product = new Product(data[0], data[1]);
+
+		} catch (IOException e) {
+				e.printStackTrace();
+		} finally {
+			try {
+				br.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return product;
+	}
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..ef1eb60c5b
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,77 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class MailUtil {
+
+	
+	private static Configuration config; 
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
+
+	public static void sendEMails(boolean debug)
+	{
+
+		Product product = FileUtil.readFile();
+		System.out.println(product.toString());
+		
+		System.out.println("开始发送邮件");
+
+		List<HashMap<String, String>> mailingList = DBUtil.loadMailingList(product);
+		
+		if (mailingList == null){
+			System.out.println("没有邮件发送");
+			return ;
+		}
+
+		Iterator<HashMap<String, String>> iter = mailingList.iterator();
+		while (iter.hasNext()) {
+			HashMap<String, String> userInfo = iter.next();
+			Email email = MailUtil.configureEMail(userInfo,product);
+			try {
+				sendEmail(email.getToAddress(),email.getFromAddress(),email.getSubject(),email.getMessage(),email.getSmtpHost(),debug);
+			} catch (Exception e1) {
+				try {
+					sendEmail(email.getToAddress(),email.getFromAddress(),email.getSubject(),email.getMessage(),email.getAltSmtpHost(),debug);
+				} catch (Exception e2) {
+					System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+				}
+			}
+		}
+
+	}
+	
+	
+	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());
+
+	}
+	
+	public static Email configureEMail(HashMap<String, String> userInfo,Product product){
+				
+		Email email = new Email();
+		config = new Configuration();
+		email.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		email.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		email.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+		email.setSubject("您关注的产品降价了");
+		String toAddress = (String) userInfo.get(EMAIL_KEY); 
+		email.setToAddress(toAddress);
+		String name = (String) userInfo.get(NAME_KEY);
+		email.setMessage("尊敬的 "+name+", 您关注的产品 " + product.getDesc() + " 降价了，欢迎购买!");
+		
+		return email;
+		
+	}	
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..e96809d498
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String id;  //产品ID
+	private String 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;
+	}
+	
+	
+	public Product() {
+	}
+	public Product(String id, String desc) {
+		this.id = id;
+		this.desc = desc;
+	}
+	@Override
+	public String toString() {
+		return "产品ID=" + id + "\n产品描述 = " + desc;
+	}
+
+}
diff --git a/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..cf5b0879a0
--- /dev/null
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) {
+		
+		boolean emailDebug = false;
+		
+		MailUtil.sendEMails(emailDebug);
+
+	}	
+	
+	
+}
diff --git a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
similarity index 50%
rename from students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
index a98917f829..b7a974adb3 100644
--- a/students/34594980/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
+++ b/students/34594980/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -1,4 +1,4 @@
 P8756 iPhone8
 P3946 XiaoMi10
-P8904 Oppo R15
-P4955 Vivo X20
\ No newline at end of file
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From a2fa5a922ec2759d59a29ae297c08b6d60df0522 Mon Sep 17 00:00:00 2001
From: vvivey <kobako@qq.com>
Date: Sat, 17 Jun 2017 18:41:44 +0800
Subject: [PATCH 143/332] first

---
 students/1398524980/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/1398524980/README.md

diff --git a/students/1398524980/README.md b/students/1398524980/README.md
new file mode 100644
index 0000000000..6af04c97b1
--- /dev/null
+++ b/students/1398524980/README.md
@@ -0,0 +1 @@
+#第一次作业
\ No newline at end of file

From 0d46d49344f03c453cc98148606cd1d490cfce34 Mon Sep 17 00:00:00 2001
From: vvivey <kobako@qq.com>
Date: Sat, 17 Jun 2017 18:52:32 +0800
Subject: [PATCH 144/332] second

---
 students/1398524980/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/1398524980/README.md b/students/1398524980/README.md
index 6af04c97b1..4e91a7ce31 100644
--- a/students/1398524980/README.md
+++ b/students/1398524980/README.md
@@ -1 +1 @@
-#第一次作业
\ No newline at end of file
+第一次作业
\ No newline at end of file

From ffc58bcdbbd4eaeee1a0c0d563810a9a12474cee Mon Sep 17 00:00:00 2001
From: vvivey <kobako@qq.com>
Date: Sat, 17 Jun 2017 19:25:05 +0800
Subject: [PATCH 145/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1398524980/README.md                 |  2 +-
 .../1398524980/second phase/once/README.md    |  1 +
 .../com/coderising/ood/srp/Configuration.java | 34 ++++++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++++
 .../java/com/coderising/ood/srp/DBUtil.java   | 24 +++++++++
 .../com/coderising/ood/srp/FromAddress.java   | 15 ++++++
 .../coderising/ood/srp/LoadInformation.java   | 22 ++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 16 ++++++
 .../com/coderising/ood/srp/ProductInfo.java   | 52 +++++++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 36 +++++++++++++
 .../com/coderising/ood/srp/SendEMails.java    | 51 ++++++++++++++++++
 .../com/coderising/ood/srp/SetProtocol.java   | 32 ++++++++++++
 .../ood/srp/ToAddressAndMessage.java          | 52 +++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 14 files changed, 349 insertions(+), 1 deletion(-)
 create mode 100644 students/1398524980/second phase/once/README.md
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java
 create mode 100644 students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1398524980/README.md b/students/1398524980/README.md
index 4e91a7ce31..a652ad5ecf 100644
--- a/students/1398524980/README.md
+++ b/students/1398524980/README.md
@@ -1 +1 @@
-第一次作业
\ No newline at end of file
+作业
\ No newline at end of file
diff --git a/students/1398524980/second phase/once/README.md b/students/1398524980/second phase/once/README.md
new file mode 100644
index 0000000000..4a2bb84fe9
--- /dev/null
+++ b/students/1398524980/second phase/once/README.md	
@@ -0,0 +1 @@
+面向对象设计
\ No newline at end of file
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..0fb3dcfa77
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/Configuration.java	
@@ -0,0 +1,34 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static Configuration config;
+
+	static Map<String, String> 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");
+	}
+
+	private Configuration() {
+	}
+
+	protected static Configuration getConfig() {
+		return config;
+	}
+
+	/**
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public String getProperty(String key) {
+
+		return configurations.get(key);
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..e63eb922a4
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java	
@@ -0,0 +1,9 @@
+package main.java.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/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..1a88f401f1
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/DBUtil.java	
@@ -0,0 +1,24 @@
+package main.java.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<HashMap<String, String>> query(String sql){
+		
+		List<HashMap<String, String>> userList = new ArrayList<HashMap<String, String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String, String> userInfo = new HashMap<String, String>();
+			userInfo.put("NAME", "User" + i);			
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java
new file mode 100644
index 0000000000..1a71da260d
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/FromAddress.java	
@@ -0,0 +1,15 @@
+package main.java.com.coderising.ood.srp;
+
+public class FromAddress {
+
+	private String fromAddress = null;
+	
+	protected void setFromAddress() {
+		fromAddress = Configuration.getConfig().getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	public String getFromAddress() {
+		return fromAddress;
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java
new file mode 100644
index 0000000000..1eac48983f
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/LoadInformation.java	
@@ -0,0 +1,22 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.List;
+
+public class LoadInformation {
+
+	private String productID = new ProductInfo().getproductID();
+	
+	private String sendMailQuery = null;
+	
+	protected List<?> loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+
+	protected void setLoadQuery() throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..84dbffa75d
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/MailUtil.java	
@@ -0,0 +1,16 @@
+package main.java.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/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..a678d2987e
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java	
@@ -0,0 +1,52 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductInfo {
+
+	private String productID = null;
+	private String productDesc = null;
+
+	/**
+	 * 
+	 * @throws IOException
+	 */
+	public void readProductInfo(String pomotionInfoAddress) throws IOException {
+
+		File f = new File(pomotionInfoAddress);
+		
+		readFile(f);
+	}
+
+	private void readFile(File file) throws IOException {
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+
+			productID = data[0];
+			productDesc = data[1];
+
+			System.out.println("ƷID = " + productID + "\n");
+			System.out.println("Ʒ = " + productDesc + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	protected String getproductID() {
+		return productID;
+	}
+
+	protected String getProductDesc() {
+		return productDesc;
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..c94ac5a088
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java	
@@ -0,0 +1,36 @@
+package main.java.com.coderising.ood.srp;
+
+public class PromotionMail {
+
+	private static ProductInfo productInfo = new ProductInfo();
+	private static SetProtocol setprotocol = new SetProtocol();
+	private static LoadInformation loadInformation = new LoadInformation();
+	private static FromAddress fromAddress = new FromAddress();
+	private static SendEMails sendEmails = new SendEMails();
+
+	public static void main(String[] args) throws Exception {
+
+		boolean emailDebug = false;
+		new PromotionMail(emailDebug,
+				"C:\\Users\\123\\Documents\\workspace\\ood_assignment\\src\\com\\coderising\\ood\\srp\\product_promotion.txt");
+	}
+
+	PromotionMail(boolean emailDebug, String pomotionInfoAddress) throws Exception {
+
+		// ȡƷϢ
+		productInfo.readProductInfo(pomotionInfoAddress);
+
+		// ÷ͷЭ
+		setprotocol.setProtocol();
+
+		// öȡϢ
+		loadInformation.setLoadQuery();
+
+		// ÷͵ַ
+		fromAddress.setFromAddress();
+
+		// ʼ  ʼ
+		sendEmails.sendEMails(emailDebug);
+	}
+
+}
\ No newline at end of file
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java
new file mode 100644
index 0000000000..29bb0f1363
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SendEMails.java	
@@ -0,0 +1,51 @@
+package main.java.com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+public class SendEMails {
+
+	private ToAddressAndMessage message = new ToAddressAndMessage();
+	
+	private String smtpHost = new SetProtocol().getSMTPHost();
+	private String altSmtpHost = new SetProtocol().getAltSMTPHost();
+	
+	private LoadInformation load = new LoadInformation();
+
+	/**
+	 * 
+	 * @param debug
+	 * @param mailingList
+	 * @throws Exception
+	 */
+	protected void sendEMails(boolean debug) throws Exception {
+
+		System.out.println("开始发送邮件");
+
+		if (load.loadMailingList() != null) {
+			Iterator<?> iter = load.loadMailingList().iterator();
+			while (iter.hasNext()) {
+				message.configureEMail((HashMap<?, ?>) iter.next());
+				try {
+					if (message.toAddress.length() > 0) {
+						message.sendSMTPHostWay(smtpHost, debug);
+					}
+				} catch (Exception e) {
+					try {
+						message.sendAltSMTPHostWay(altSmtpHost, debug);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+	
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java
new file mode 100644
index 0000000000..98e0151fb6
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/SetProtocol.java	
@@ -0,0 +1,32 @@
+package main.java.com.coderising.ood.srp;
+
+public class SetProtocol {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+
+	private Configuration config;
+
+	protected void setProtocol() {
+		config = Configuration.getConfig();
+		setSMTPHost();
+		setAltSMTPHost();
+	}
+
+	private void setSMTPHost() {
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+	private void setAltSMTPHost() {
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	}
+
+	protected String getSMTPHost() {
+		return smtpHost;
+	}
+
+	protected String getAltSMTPHost() {
+		return altSmtpHost;
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java
new file mode 100644
index 0000000000..c99bbc683b
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/ToAddressAndMessage.java	
@@ -0,0 +1,52 @@
+package main.java.com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class ToAddressAndMessage {
+
+	private String productDesc = new ProductInfo().getProductDesc();
+
+	protected String toAddress = null;
+	private	String fromAddress = new FromAddress().getFromAddress();
+
+	private String subject = null;
+	private String message = null;
+
+	private static final String EMAIL_KEY = "EMAIL";
+	private static final String NAME_KEY = "NAME";
+
+	/**
+	 * 
+	 * @param userInfo
+	 * @throws IOException
+	 */
+	protected void addressAndMessage(HashMap<?, ?> userInfo) throws IOException {
+		configureEMail(userInfo);
+		setMessage(userInfo);
+	}
+
+	protected void configureEMail(HashMap<?, ?> userInfo) throws IOException {
+
+		toAddress = (String) userInfo.get(EMAIL_KEY);
+		if (toAddress.length() > 0)
+			setMessage(userInfo);
+	}
+
+	protected void setMessage(HashMap<?, ?> userInfo) throws IOException {
+
+		String name = (String) userInfo.get(NAME_KEY);
+
+		subject = "您关注的产品降价了";
+		message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+	}
+
+	protected void sendSMTPHostWay(String smtpHost, boolean debug) {
+		MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+	}
+
+	protected void sendAltSMTPHostWay(String altSmtpHost, boolean debug) {
+		MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug);
+	}
+
+}
diff --git a/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1398524980/second phase/once/ood_assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1398524980/second phase/once/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

From 7d44bbb30bc627f96207c685eaaf42159bceff1c Mon Sep 17 00:00:00 2001
From: vvivey <kobako@qq.com>
Date: Sat, 17 Jun 2017 19:35:11 +0800
Subject: [PATCH 146/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../second phase/once/ood_assignment/pom.xml  | 32 +++++++++++++++++++
 1 file changed, 32 insertions(+)
 create mode 100644 students/1398524980/second phase/once/ood_assignment/pom.xml

diff --git a/students/1398524980/second phase/once/ood_assignment/pom.xml b/students/1398524980/second phase/once/ood_assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/1398524980/second phase/once/ood_assignment/pom.xml	
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>

From 43837188dff4aadc1506e1d0365d4d3ced3077bf Mon Sep 17 00:00:00 2001
From: fredel <136427763@qq.com>
Date: Sat, 17 Jun 2017 20:52:51 +0800
Subject: [PATCH 147/332] new project

---
 students/136427763/ood/ood-assignment/pom.xml |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/136427763/ood/ood-assignment/pom.xml
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/136427763/ood/ood-assignment/pom.xml b/students/136427763/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..1be81576cc
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..927c7155cc
--- /dev/null
+++ b/students/136427763/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<String,String> 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/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..868a03ff83
--- /dev/null
+++ b/students/136427763/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/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..65383e4dba
--- /dev/null
+++ b/students/136427763/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/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..373f3ee306
--- /dev/null
+++ b/students/136427763/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/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..94bfcbaf54
--- /dev/null
+++ b/students/136427763/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/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/136427763/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

From 988a0c79020702af67cbec4f2179d5a5b35d8d7f Mon Sep 17 00:00:00 2001
From: gongxun <gongxun@wesai.com>
Date: Sat, 17 Jun 2017 21:53:58 +0800
Subject: [PATCH 148/332] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1=E5=B0=8F?=
 =?UTF-8?q?=E7=BB=86=E8=8A=82=E6=94=B9=E5=8A=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../785396327/first/ood/srp/BeanUtils.java    | 12 --------
 .../785396327/first/ood/srp/ConfigParser.java |  2 +-
 .../785396327/first/ood/srp/DBParser.java     | 16 +++++-----
 students/785396327/first/ood/srp/Email.java   |  2 +-
 .../785396327/first/ood/srp/EmailParser.java  |  2 +-
 .../785396327/first/ood/srp/MailSender.java   | 23 +++++++++++----
 .../first/ood/srp/PromotionFileParser.java    |  2 +-
 .../ood/srp/PromotionMailConfigParser.java    |  2 +-
 .../first/ood/srp/PromotionMailDBParser.java  | 29 ++++++++++++-------
 .../785396327/first/ood/srp/SendMailTest.java |  6 ++--
 .../785396327/first/ood/srp/StringUtils.java  | 10 +++----
 11 files changed, 58 insertions(+), 48 deletions(-)
 delete mode 100644 students/785396327/first/ood/srp/BeanUtils.java

diff --git a/students/785396327/first/ood/srp/BeanUtils.java b/students/785396327/first/ood/srp/BeanUtils.java
deleted file mode 100644
index 617c96666e..0000000000
--- a/students/785396327/first/ood/srp/BeanUtils.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package first.ood.srp;
-
-/**
- * Created by IBM on 2017/6/12.
- */
-public class BeanUtils {
-
-    public static void copyProperties(Object dst, Object src) {
-        //拷贝方法暂不实现
-    }
-
-}
diff --git a/students/785396327/first/ood/srp/ConfigParser.java b/students/785396327/first/ood/srp/ConfigParser.java
index 21ab317bc9..87e00e707e 100644
--- a/students/785396327/first/ood/srp/ConfigParser.java
+++ b/students/785396327/first/ood/srp/ConfigParser.java
@@ -1,7 +1,7 @@
 package first.ood.srp;
 
 /**
- * Created by gongxun on 2017/6/14.
+ * Created by william on 2017/6/14.
  */
 public abstract class ConfigParser {
 
diff --git a/students/785396327/first/ood/srp/DBParser.java b/students/785396327/first/ood/srp/DBParser.java
index d85f602528..3e49e6abd7 100644
--- a/students/785396327/first/ood/srp/DBParser.java
+++ b/students/785396327/first/ood/srp/DBParser.java
@@ -4,19 +4,21 @@
 import java.util.List;
 
 /**
- * Created by gongxun on 2017/6/14.
+ * Created by william on 2017/6/14.
  */
-public abstract class DBParser<T> {
-    private String sql;
+public abstract class DBParser<T extends Email> {
+    protected String sql;
+    protected Object[] params;
 
-    protected DBParser(String sql) {
+    protected DBParser(String sql, Object[] params) {
         this.sql = sql;
+        this.params = params;
     }
 
-    protected List<T> parseInfoFromDB(Email email) {
-        List<HashMap<String, String>> data = DBUtil.query(sql, null);
+    protected List<T> parseInfoFromDB(T email) {
+        List<HashMap<String, String>> data = DBUtil.query(sql, params);
         return convertData(email, data);
     }
 
-    abstract List<T> convertData(Email email, List<HashMap<String, String>> data);
+    abstract List<T> convertData(T email, List<HashMap<String, String>> data);
 }
diff --git a/students/785396327/first/ood/srp/Email.java b/students/785396327/first/ood/srp/Email.java
index 11a2c408ae..ebca19e579 100644
--- a/students/785396327/first/ood/srp/Email.java
+++ b/students/785396327/first/ood/srp/Email.java
@@ -1,7 +1,7 @@
 package first.ood.srp;
 
 /**
- * Created by gongxun on 2017/6/12.
+ * Created by william on 2017/6/12.
  */
 public class Email {
     protected String smtpHost;
diff --git a/students/785396327/first/ood/srp/EmailParser.java b/students/785396327/first/ood/srp/EmailParser.java
index 74341ad610..e6f422b52f 100644
--- a/students/785396327/first/ood/srp/EmailParser.java
+++ b/students/785396327/first/ood/srp/EmailParser.java
@@ -3,7 +3,7 @@
 import java.util.List;
 
 /**
- * Created by gongxun on 2017/6/12.
+ * Created by william on 2017/6/12.
  */
 public class EmailParser {
     private ConfigParser configParser;
diff --git a/students/785396327/first/ood/srp/MailSender.java b/students/785396327/first/ood/srp/MailSender.java
index 90d7f42bdb..a2ed82db46 100644
--- a/students/785396327/first/ood/srp/MailSender.java
+++ b/students/785396327/first/ood/srp/MailSender.java
@@ -4,17 +4,28 @@
 import java.util.List;
 
 /**
- * Created by gongxun on 2017/6/12.
+ * Created by william on 2017/6/12.
  */
-public class MailSender {
+public class MailSender<T extends Email> {
 
-    private void sendMail(PromotionMail mail, boolean isDebug) {
-        MailUtil.sendEmail(mail.toAddress, mail.fromAddress, mail.subject, mail.message, StringUtils.isEmpty(mail.smtpHost) == true ? mail.smtpHost : mail.altSmtpHost, isDebug);
+    private void sendMail(Email mail, boolean isDebug) {
+        if (!StringUtils.isEmpty(mail.toAddress))
+            try {
+                MailUtil.sendEmail(
+                        mail.toAddress,
+                        mail.fromAddress,
+                        mail.subject,
+                        mail.message,
+                        StringUtils.isEmpty(mail.smtpHost) == true ? mail.smtpHost : mail.altSmtpHost,
+                        isDebug);
+            } catch (Exception e) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e.getMessage());
+            }
     }
 
-    public void sendMailList(List<PromotionMail> mailList, boolean isDebug) {
+    public void sendMailList(List<T> mailList, boolean isDebug) {
         if (mailList != null) {
-            for (Iterator<PromotionMail> iterator = mailList.iterator(); iterator.hasNext(); ) {
+            for (Iterator<T> iterator = mailList.iterator(); iterator.hasNext(); ) {
                 sendMail(iterator.next(), isDebug);
             }
         }
diff --git a/students/785396327/first/ood/srp/PromotionFileParser.java b/students/785396327/first/ood/srp/PromotionFileParser.java
index 78a8dfaa66..1d57b8de2e 100644
--- a/students/785396327/first/ood/srp/PromotionFileParser.java
+++ b/students/785396327/first/ood/srp/PromotionFileParser.java
@@ -1,7 +1,7 @@
 package first.ood.srp;
 
 /**
- * Created by gongxun on 2017/6/14.
+ * Created by william on 2017/6/14.
  */
 public class PromotionFileParser extends FileParser {
 
diff --git a/students/785396327/first/ood/srp/PromotionMailConfigParser.java b/students/785396327/first/ood/srp/PromotionMailConfigParser.java
index dd6ce2e89f..6fd8feb08c 100644
--- a/students/785396327/first/ood/srp/PromotionMailConfigParser.java
+++ b/students/785396327/first/ood/srp/PromotionMailConfigParser.java
@@ -1,7 +1,7 @@
 package first.ood.srp;
 
 /**
- * Created by gongxun on 2017/6/14.
+ * Created by william on 2017/6/14.
  */
 public class PromotionMailConfigParser extends ConfigParser {
 
diff --git a/students/785396327/first/ood/srp/PromotionMailDBParser.java b/students/785396327/first/ood/srp/PromotionMailDBParser.java
index 68878c02d4..55e740474f 100644
--- a/students/785396327/first/ood/srp/PromotionMailDBParser.java
+++ b/students/785396327/first/ood/srp/PromotionMailDBParser.java
@@ -5,24 +5,33 @@
 import java.util.List;
 
 /**
- * Created by gongxun on 2017/6/14.
+ * Created by william on 2017/6/14.
  */
 public class PromotionMailDBParser extends DBParser<PromotionMail> {
 
-    protected PromotionMailDBParser(String sql) {
-        super(sql);
+    protected PromotionMailDBParser(String sql, Object[] params) {
+        super(sql, params);
     }
 
+    /**
+     * 由于sql参数需要运行时提供所以重写parseInfoFromDB方法
+     * @param email
+     * @return
+     */
     @Override
-    List<PromotionMail> convertData(Email email, List<HashMap<String, String>> data) {
+    protected List<PromotionMail> parseInfoFromDB(PromotionMail email) {
+        List<HashMap<String, String>> data = DBUtil.query(super.sql, new Object[]{email.getproductID()});
+        return convertData(email, data);
+    }
+
+    @Override
+    List<PromotionMail> convertData(PromotionMail email, List<HashMap<String, String>> data) {
         List<PromotionMail> mailList = new ArrayList<PromotionMail>();
         for (HashMap<String, String> map : data) {
-            PromotionMail completeMail = new PromotionMail();
-            BeanUtils.copyProperties(completeMail, email);
-            completeMail.setToAddress(parseToAddress(map));
-            completeMail.setMessage(parseMessage(map, completeMail));
-            completeMail.setSubject("您关注的产品降价了");
-            mailList.add(completeMail);
+            email.setToAddress(parseToAddress(map));
+            email.setMessage(parseMessage(map, email));
+            email.setSubject("您关注的产品降价了");
+            mailList.add(email);
         }
         return mailList;
     }
diff --git a/students/785396327/first/ood/srp/SendMailTest.java b/students/785396327/first/ood/srp/SendMailTest.java
index ef917aa593..2b54947c05 100644
--- a/students/785396327/first/ood/srp/SendMailTest.java
+++ b/students/785396327/first/ood/srp/SendMailTest.java
@@ -3,7 +3,7 @@
 import java.util.List;
 
 /**
- * Created by gongxun on 2017/6/12.
+ * Created by william on 2017/6/12.
  */
 public class SendMailTest {
 
@@ -14,11 +14,11 @@ public static void main(String[] args) {
 
         ConfigParser configParser = new PromotionMailConfigParser();
         FileParser fileParser = new PromotionFileParser(filepath);
-        DBParser<PromotionMail> DBParser = new PromotionMailDBParser(sql);
+        DBParser<PromotionMail> DBParser = new PromotionMailDBParser(sql, null);
 
         EmailParser emailParser = new EmailParser(configParser, fileParser, DBParser);
         List promotionMails = emailParser.parseEmailList();
-        MailSender mailSender = new MailSender();
+        MailSender<PromotionMail> mailSender = new MailSender();
         mailSender.sendMailList(promotionMails, isDebug);
     }
 }
diff --git a/students/785396327/first/ood/srp/StringUtils.java b/students/785396327/first/ood/srp/StringUtils.java
index f5321161bb..ec0483fa8b 100644
--- a/students/785396327/first/ood/srp/StringUtils.java
+++ b/students/785396327/first/ood/srp/StringUtils.java
@@ -1,17 +1,17 @@
 package first.ood.srp;
 
 /**
- * Created by gongxun on 2017/6/12.
+ * Created by william on 2017/6/12.
  */
 public class StringUtils {
 
     /**
-     * 判断文件路径是否为空
+     * 判断字符串是否为空
      *
-     * @param filePath
+     * @param str
      * @return
      */
-    public static boolean isEmpty(String filePath) {
-        return filePath == null || filePath.trim().isEmpty();
+    public static boolean isEmpty(String str) {
+        return str == null || str.trim().isEmpty();
     }
 }

From 44e471c739322408ee5b08aefb8ac50a5dd1cb93 Mon Sep 17 00:00:00 2001
From: fredel <136427763@qq.com>
Date: Sat, 17 Jun 2017 23:45:09 +0800
Subject: [PATCH 149/332] modify ood

---
 .../ood/{srp => config}/Configuration.java    |   4 +-
 .../{srp => config}/ConfigurationKeys.java    |   6 +-
 .../ood/{srp => config}/product_promotion.txt |   0
 .../coderising/ood/mail/PromotionMail.java    |  23 ++
 .../com/coderising/ood/model/MailMessage.java |  38 ++++
 .../com/coderising/ood/model/MailSender.java  |  51 +++++
 .../com/coderising/ood/model/MailSetting.java |  68 ++++++
 .../com/coderising/ood/model/Product.java     |  39 ++++
 .../ood/model/SubcribeMailReciver.java        |  27 +++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ------------------
 .../coderising/ood/{srp => util}/DBUtil.java  |   2 +-
 .../com/coderising/ood/util/FileUtil.java     |  39 ++++
 .../ood/{srp => util}/MailUtil.java           |   2 +-
 13 files changed, 295 insertions(+), 203 deletions(-)
 rename students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/{srp => config}/Configuration.java (90%)
 rename students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/{srp => config}/ConfigurationKeys.java (59%)
 rename students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/{srp => config}/product_promotion.txt (100%)
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/mail/PromotionMail.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailMessage.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSender.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSetting.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/Product.java
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/SubcribeMailReciver.java
 delete mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 rename students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/{srp => util}/DBUtil.java (89%)
 create mode 100644 students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/FileUtil.java
 rename students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/{srp => util}/MailUtil.java (91%)

diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
similarity index 90%
rename from students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
index 927c7155cc..7787c10665 100644
--- a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
@@ -1,9 +1,11 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.config;
 import java.util.HashMap;
 import java.util.Map;
 
 public class Configuration {
 
+
+	
 	static Map<String,String> configurations = new HashMap<>();
 	static{
 		configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
similarity index 59%
rename from students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
index 868a03ff83..a3595d3252 100644
--- a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
@@ -1,6 +1,10 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.config;
 
 public class ConfigurationKeys {
+	
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+	
 
 	public static final String SMTP_SERVER = "smtp.server";
 	public static final String ALT_SMTP_SERVER = "alt.smtp.server";
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/product_promotion.txt
similarity index 100%
rename from students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/config/product_promotion.txt
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/mail/PromotionMail.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/mail/PromotionMail.java
new file mode 100644
index 0000000000..df9965be08
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/mail/PromotionMail.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.mail;
+
+import java.io.File;
+import java.util.List;
+
+import com.coderising.ood.model.MailSender;
+import com.coderising.ood.model.MailSetting;
+import com.coderising.ood.model.Product;
+import com.coderising.ood.model.SubcribeMailReciver;
+import com.coderising.ood.util.FileUtil;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		File file = new File("D:\\homework\\coding2017\\students\\136427763\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\config\\product_promotion.txt");
+		Product product=FileUtil.readProductFile(file);
+		SubcribeMailReciver subcribeMailReciver=new SubcribeMailReciver();
+		List UserList=subcribeMailReciver.getMailReciverList(product);
+		boolean emailDebug = false;
+		MailSender mailSender=new MailSender();
+		mailSender.sendEMails(emailDebug, UserList, product);
+	}
+}
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailMessage.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailMessage.java
new file mode 100644
index 0000000000..23bbd87935
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailMessage.java
@@ -0,0 +1,38 @@
+
+package com.coderising.ood.model; 
+
+import java.util.HashMap;
+
+/** 
+ * @author 作者 E-mail: 
+ * @version 创建时间：2017年6月17日 下午9:13:21 
+ * 类说明 
+ */
+public class MailMessage  {
+	
+	private String subject;
+	
+	private String message;
+	 
+	private String toAddress;
+
+	
+	public void createProductMessage(Product product,HashMap userInfo) {
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+userInfo.get("NAME")+", 您关注的产品 " + product.getmProductDesc() + " 降价了，欢迎购买!" ;
+		toAddress=(String) userInfo.get("EMAIL");
+	}
+
+	public String getSubject() {
+		return subject;
+	}
+
+	public String getToAddress() {
+		return toAddress;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+}
+ 
\ No newline at end of file
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSender.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSender.java
new file mode 100644
index 0000000000..0c51fa5ce3
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSender.java
@@ -0,0 +1,51 @@
+package com.coderising.ood.model;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.util.DBUtil;
+import com.coderising.ood.util.MailUtil;
+import com.sun.jndi.cosnaming.IiopUrl.Address;
+
+/**
+ * @author 作者 E-mail:
+ * @version 创建时间：2017年6月17日 下午9:11:59 类说明
+ */
+public class MailSender {
+	
+	public void sendEMails(boolean debug, List mailingList, Product product)throws IOException {
+		MailMessage mailMessage = new MailMessage();
+		System.out.println("开始发送邮件");
+		HashMap hashMap;
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				hashMap = (HashMap) iter.next();
+				mailMessage.createProductMessage(product, hashMap);
+				try {
+					if (mailMessage.getToAddress().length() > 0)
+						MailUtil.sendEmail(mailMessage.getToAddress(), MailSetting
+								.getInstannce().getmFromAddress(), mailMessage
+								.getSubject(), mailMessage.getMessage(), MailSetting
+								.getInstannce().getmSmtpHost(), debug);
+				} catch (Exception e) {
+					try {
+						MailUtil.sendEmail(mailMessage.getToAddress(), MailSetting
+								.getInstannce().getmFromAddress(), mailMessage
+								.getSubject(), mailMessage.getMessage(), MailSetting
+								.getInstannce().getmSmtpHost(), debug);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2
+								.getMessage());
+					}
+				}
+			}
+		}
+		else {
+			System.out.println("没有邮件发送");
+		}
+	}
+
+}
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSetting.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSetting.java
new file mode 100644
index 0000000000..57d33d6c91
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/MailSetting.java
@@ -0,0 +1,68 @@
+package com.coderising.ood.model;
+
+import com.coderising.ood.config.Configuration;
+import com.coderising.ood.config.ConfigurationKeys;
+
+/**
+ * @author 作者 E-mail:
+ * @version 创建时间：2017年6月17日 下午9:50:47 类说明
+ */
+public class MailSetting {
+	private String mSmtpHost;
+
+	private String mAltmSmtpHost;
+
+	private Configuration mConfig;
+
+	private String mFromAddress;
+	
+	public String getmFromAddress() {
+		return mFromAddress;
+	}
+
+	private static MailSetting mailSetting=null;
+	
+	private static final Object mObject=new Object();
+
+	public static MailSetting getInstannce(){
+		synchronized (mObject) {
+			if(null==mailSetting){
+				mailSetting =new MailSetting();
+				return mailSetting;
+			}
+			return mailSetting;
+		}
+	}
+	
+	public MailSetting() {
+		mConfig=new Configuration();
+		init();
+	}
+
+	private void init() {
+		setmAltmSmtpHost();
+		setmFromAddress();
+		setmSmtpHost();
+	}
+
+	public String getmSmtpHost() {
+		return mSmtpHost;
+	}
+
+	public String getmAltmSmtpHost() {
+		return mAltmSmtpHost;
+	}
+
+	protected void setmAltmSmtpHost() {
+		mAltmSmtpHost = mConfig.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+	}
+
+	protected void setmFromAddress() {
+		mFromAddress = mConfig.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	protected void setmSmtpHost() {
+		mSmtpHost = mConfig.getProperty(ConfigurationKeys.SMTP_SERVER);
+	}
+
+}
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/Product.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/Product.java
new file mode 100644
index 0000000000..c2d2a5887d
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/Product.java
@@ -0,0 +1,39 @@
+
+package com.coderising.ood.model; 
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/** 
+ * @author 作者 E-mail: 
+ * @version 创建时间：2017年6月17日 下午9:13:21 
+ * 类说明 
+ */
+public class Product {
+	
+	private String mProductId;
+	
+	private String mProductDesc;
+
+	public String getmProductId() {
+		return mProductId;
+	}
+
+	public void setmProductId(String mProductId) {
+		this.mProductId = mProductId;
+	}
+
+	public String getmProductDesc() {
+		return mProductDesc;
+	}
+
+	public void setmProductDesc(String mProductDesc) {
+		this.mProductDesc = mProductDesc;
+	}
+	
+	
+
+}
+ 
\ No newline at end of file
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/SubcribeMailReciver.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/SubcribeMailReciver.java
new file mode 100644
index 0000000000..913e9164e2
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/model/SubcribeMailReciver.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.model;
+
+import java.util.List;
+
+import com.coderising.ood.util.DBUtil;
+
+/**
+ * @author 作者 E-mail:
+ * @version 创建时间：2017年6月17日 下午10:51:43 类说明
+ */
+public class SubcribeMailReciver {
+
+	private String sendMailQuery;
+	
+	private void setLoadQuery(Product product) throws Exception {
+
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + product
+				.getmProductId() + "' " + "and send_mail=1 ";
+		System.out.println("loadQuery set");
+	}
+
+	public List getMailReciverList(Product product) throws Exception {
+		setLoadQuery(product);
+		return DBUtil.query(this.sendMailQuery);
+	}
+	
+}
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index 94bfcbaf54..0000000000
--- a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,199 +0,0 @@
-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/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/DBUtil.java
similarity index 89%
rename from students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/DBUtil.java
index 65383e4dba..9d33edbd40 100644
--- a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/DBUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.util;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/FileUtil.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/FileUtil.java
new file mode 100644
index 0000000000..c57721fa6e
--- /dev/null
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/FileUtil.java
@@ -0,0 +1,39 @@
+
+package com.coderising.ood.util; 
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.model.Product;
+
+/** 
+ * @author 作者 E-mail: 
+ * @version 创建时间：2017年6月17日 下午9:39:03 
+ * 类说明 
+ */
+public class FileUtil {
+	
+	public static Product readProductFile(File file) throws IOException 
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product=new Product();
+			product.setmProductId(data[0]); 
+			product.setmProductDesc(data[1]); 
+			return product;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			if(br!=null){
+			br.close();
+			}
+		}
+	}
+
+}
+ 
\ No newline at end of file
diff --git a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/MailUtil.java
similarity index 91%
rename from students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
rename to students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/MailUtil.java
index 373f3ee306..913f83aba9 100644
--- a/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/136427763/ood/ood-assignment/src/main/java/com/coderising/ood/util/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.ood.util;
 
 public class MailUtil {
 

From 7c42e240352f367450c09b70e27fb874df163c36 Mon Sep 17 00:00:00 2001
From: renfuyi <605159467@qq.com>
Date: Sun, 18 Jun 2017 10:41:20 +0800
Subject: [PATCH 150/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/605159467/ood-assignment/pom.xml     | 32 ++++++
 .../com/coderising/ood/srp/bean/Email.java    | 98 +++++++++++++++++++
 .../com/coderising/ood/srp/bean/Person.java   | 43 ++++++++
 .../com/coderising/ood/srp/bean/Product.java  | 43 ++++++++
 .../ood/srp/dao/PromotionMailDao.java         | 22 +++++
 .../ood/srp/dao/PromotionMailDaoImpl.java     | 29 ++++++
 .../ood/srp/main/PromotionMail.java           | 55 +++++++++++
 .../ood/srp/resource/ConfigurationKeys.java   | 10 ++
 .../ood/srp/resource/product_promotion.txt    |  4 +
 .../ood/srp/service/PromotionMailService.java | 30 ++++++
 .../srp/service/PromotionMailServiceImpl.java | 67 +++++++++++++
 .../com/coderising/ood/srp/utils/DBUtil.java  | 23 +++++
 .../coderising/ood/srp/utils/FileUtil.java    | 55 +++++++++++
 .../coderising/ood/srp/utils/MailUtil.java    | 18 ++++
 .../ood/srp/utils/PropertiesUtil.java         | 79 +++++++++++++++
 15 files changed, 608 insertions(+)
 create mode 100644 students/605159467/ood-assignment/pom.xml
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/product_promotion.txt
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
 create mode 100644 students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java

diff --git a/students/605159467/ood-assignment/pom.xml b/students/605159467/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/605159467/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
new file mode 100644
index 0000000000..b8c16c5091
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Email.java
@@ -0,0 +1,98 @@
+package com.coderising.ood.srp.bean;
+
+import com.coderising.ood.srp.resource.ConfigurationKeys;
+import com.coderising.ood.srp.utils.MailUtil;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  22:04
+ * Description:
+ */
+public class Email
+{
+
+
+
+
+
+
+    private String toAddress;
+    private String fromAddress;
+    private String subject;
+    private String message;
+    private String smtpHost;
+
+    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 getMessage()
+    {
+         return  message;
+    }
+
+    public void setMessage(String message)
+    {
+        this.message = message;
+    }
+
+    public String getSmtpHost()
+    {
+        return smtpHost;
+    }
+
+    public void setSmtpHost(String smtpHost)
+    {
+        this.smtpHost = smtpHost;
+    }
+
+    /**
+     *  具有发送的行为
+     */
+    public  void sendMessage(){
+        MailUtil.sendEmail(this.toAddress,
+                ConfigurationKeys.EMAIL_ADMIN,
+                this.subject,
+                this.message,
+                ConfigurationKeys.ALT_SMTP_SERVER,
+                true);
+    }
+
+    /**
+     *  备用发送
+     */
+    public  void  standbySendMessage(){
+        MailUtil.sendEmail(this.toAddress,
+                ConfigurationKeys.EMAIL_ADMIN,
+                this.subject,
+                this.message,
+                ConfigurationKeys.SMTP_SERVER,
+                true);
+    }
+
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java
new file mode 100644
index 0000000000..942b246154
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Person.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  15:21
+ * Description:
+ */
+public class Person
+{
+    private Long id;
+    private String name;
+    private String email;
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
new file mode 100644
index 0000000000..1fe6c40ef7
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/bean/Product.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  11:19
+ * Description: 产品实体
+ */
+public class Product
+{
+    private String productID ;
+    private String productDesc;
+
+    public Product()
+    {
+    }
+
+    public Product(String productID, String productDesc)
+    {
+        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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
new file mode 100644
index 0000000000..8b79dfac51
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDao.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  14:07
+ * Description:
+ */
+public interface PromotionMailDao
+{
+
+    /**
+     *  从数据库中读取信息，人员信息
+     */
+    public  List loadMailingList() throws Exception;
+
+
+
+
+}
+
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java
new file mode 100644
index 0000000000..a730c3c188
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/dao/PromotionMailDaoImpl.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.utils.DBUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  14:48
+ * Description:
+ */
+public class PromotionMailDaoImpl implements PromotionMailDao
+{
+    public List loadMailingList() throws Exception
+    {
+        List userList = new ArrayList<Person>();
+        for (int i = 1; i <= 3; i++) {
+            Person person=new Person();
+            person.setId(Long.valueOf(i));
+            person.setName("User" + i);
+            person.setEmail("aa@bb.com");
+            userList.add(person);
+        }
+        return userList;
+    }
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
new file mode 100644
index 0000000000..e946ece828
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.main;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.resource.ConfigurationKeys;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.service.PromotionMailServiceImpl;
+
+import javax.xml.ws.Service;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail
+{
+
+   public  static 	PromotionMailService mailService = new PromotionMailServiceImpl();
+	public static void main(String[] args) throws Exception
+	{
+
+		String src = mailService.getClass().getResource("../resource") + "/product_promotion.txt";
+		List<Product> productList = mailService.readFile(src);
+		List<Person> personList = mailService.querySendPerons();
+
+        List<Email>  emailList=getEmailList(productList,personList);
+
+        mailService.sendMessage(emailList);
+	}
+
+	private static List getEmailList( List<Product> productList, List<Person> personList) throws Exception
+	{
+		List  emailList=new ArrayList<Email>();
+		for (Person person : personList)
+		{
+			for (Product product : productList)
+			{
+				Email email = new Email();
+				String message=mailService.jointMessage(person, product);
+				email.setToAddress(person.getEmail());
+				email.setMessage(message);
+				emailList.add(email);
+			}
+		}
+		return  emailList;
+	}
+
+
+}
\ No newline at end of file
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java
new file mode 100644
index 0000000000..c6fac0201c
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp.resource;
+
+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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/product_promotion.txt b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/resource/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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
new file mode 100644
index 0000000000..f520e17439
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.bean.Product;
+
+import java.io.IOException;
+import java.util.List;
+
+
+public interface PromotionMailService
+{
+
+
+
+
+
+
+
+     public  List readFile(String src)  throws IOException;
+
+
+
+    public  List querySendPerons() throws Exception;
+
+
+    public String jointMessage(Person person, Product product)throws Exception;
+
+    public void sendMessage(List<Email> emailList) throws IOException;
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java
new file mode 100644
index 0000000000..ed57cb2e90
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailServiceImpl.java
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.bean.Email;
+import com.coderising.ood.srp.bean.Person;
+import com.coderising.ood.srp.bean.Product;
+import com.coderising.ood.srp.dao.PromotionMailDao;
+import com.coderising.ood.srp.dao.PromotionMailDaoImpl;
+import com.coderising.ood.srp.utils.FileUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  15:04
+ * Description:
+ */
+public class PromotionMailServiceImpl implements PromotionMailService
+{
+     private  static  PromotionMailDao promotionMailDao=new PromotionMailDaoImpl();
+     private  List<Person> persons;
+     private  List<Product> products;
+
+
+
+    public void sendMessage(List<Email> emailList) throws IOException
+    {
+        for (Email email:emailList){
+            try
+            {
+                email.sendMessage();
+            }catch (Exception e){
+
+                try {
+                    email.standbySendMessage();
+                } catch (Exception e2){
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+
+            }
+        }
+    }
+
+
+    public List readFile(String src) throws IOException
+    {
+        File file=new File(src);
+       return  FileUtil.readFile(file);  // 获得 产品
+    }
+
+    public List querySendPerons() throws Exception
+    {
+        return  promotionMailDao.loadMailingList(); //获得人员
+    }
+
+
+    public String jointMessage(Person person, Product product)
+    {
+        StringBuffer  message=new StringBuffer();
+        String personName=person.getName();
+        String productDesc=product.getProductDesc();
+        message.append("您关注的产品降价了").append(" 尊敬的 ").append(personName)
+                .append(" 您关注的产品").append(productDesc).append("降价了，欢迎购买!");
+        return  message.toString();
+    }
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
new file mode 100644
index 0000000000..2449bf2029
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/DBUtil.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.utils;
+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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
new file mode 100644
index 0000000000..9ee29078b8
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/FileUtil.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.utils;
+
+import com.coderising.ood.srp.bean.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  11:08
+ * Description:
+ */
+public class FileUtil
+{
+
+    /**
+     *  读取文件内容，返回List<Product>
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static List  readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        List list = null;
+        try
+        {
+            br = new BufferedReader(new FileReader(file));
+            String line = null;
+            Product product = null;
+            list = new ArrayList<Product>();
+            while ((line = br.readLine()) != null)
+            {
+                String[] data = line.split(" ");
+                product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+
+                list.add(product);
+            }
+            return  list;
+        } catch (IOException e)
+        {
+            throw new IOException(e.getMessage());
+        } finally
+        {
+            br.close();
+        }
+    }
+
+}
diff --git a/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
new file mode 100644
index 0000000000..557234d95c
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.utils;
+
+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/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java
new file mode 100644
index 0000000000..3c1226ffbb
--- /dev/null
+++ b/students/605159467/ood-assignment/src/main/java/com/coderising/ood/srp/utils/PropertiesUtil.java
@@ -0,0 +1,79 @@
+package com.coderising.ood.srp.utils;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Created with IDEA
+ * Created by fuyi.ren on 2017/6/17  16:27
+ * Description:
+ */
+public class PropertiesUtil
+{
+    private Properties props;
+    private URI uri;
+
+    public PropertiesUtil(String fileName){
+        readProperties(fileName);
+    }
+    private void readProperties(String fileName) {
+        try {
+            props = new Properties();
+            InputStream fis =getClass().getResourceAsStream(fileName);
+            props.load(fis);
+            uri = this.getClass().getResource("/dbConfig.properties").toURI();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    /**
+     * 获取某个属性
+     */
+    public String getProperty(String key){
+        return props.getProperty(key);
+    }
+    /**
+     * 获取所有属性，返回一个map,不常用
+     * 可以试试props.putAll(t)
+     */
+    public Map getAllProperty(){
+        Map map=new HashMap();
+        Enumeration enu = props.propertyNames();
+        while (enu.hasMoreElements()) {
+            String key = (String) enu.nextElement();
+            String value = props.getProperty(key);
+            map.put(key, value);
+        }
+        return map;
+    }
+    /**
+     * 在控制台上打印出所有属性，调试时用。
+     */
+    public void printProperties(){
+        props.list(System.out);
+    }
+    /**
+     * 写入properties信息
+     */
+    public void writeProperties(String key, String value) {
+        try {
+            OutputStream fos = new FileOutputStream(new File(uri));
+            props.setProperty(key, value);
+            // 将此 Properties 表中的属性列表（键和元素对）写入输出流
+            props.store(fos, "『comments』Update key：" + key);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+}

From 8e78357f38c0593e6c6f9a64fc127e9ac0a432ca Mon Sep 17 00:00:00 2001
From: Yangming Xie <yangmingxiework@gmail.com>
Date: Sun, 18 Jun 2017 00:26:04 -0400
Subject: [PATCH 151/332] first assignment

---
 .../com/coderising/ood/srp/FileProdUtil.java  | 36 +++++++
 .../java/com/coderising/ood/srp/Mail.java     | 77 +++++++++++----
 .../java/com/coderising/ood/srp/Product.java  | 24 +----
 .../com/coderising/ood/srp/PromotionMail.java | 99 ++-----------------
 .../java/com/coderising/ood/srp/Theme.java    | 31 ++++++
 5 files changed, 132 insertions(+), 135 deletions(-)
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java
 create mode 100644 students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java

diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java
new file mode 100644
index 0000000000..4e3a7d2373
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/FileProdUtil.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.LinkedList;
+
+public class FileProdUtil {
+	//if other files, need polymorphically present file reading
+	public static void readFile(File file, LinkedList<Theme> themes) throws IOException // @02C
+	{	
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String sCurrentLine = "";
+
+			while ((sCurrentLine = br.readLine()) != null) 
+			{
+				Theme prod = new Product();
+				String[] data = sCurrentLine.split(" ");			
+				prod.setID(data[0]); 
+				prod.setDesc(data[1]); 
+				
+				System.out.println("产品ID = " + prod.getID() + "\n");
+				System.out.println("产品描述 = " + prod.getDesc() + "\n");			
+				themes.add(prod);
+			}			
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+}
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
index c7c6bc3ba3..4820d10a12 100644
--- a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
 public abstract class Mail {
@@ -15,18 +16,17 @@ public abstract class Mail {
 	protected String subject = null;
 	protected String message = null;
 	protected String sendMailQuery = null;
-
-	
-	public Mail(File file) throws Exception
+	protected LinkedList<Theme> theme;
+	public Mail(File file, boolean emailDebug) throws Exception
 	{
-		readFile(file);	
+		theme = new LinkedList<>();
+		FileProdUtil.readFile(file, theme);	
 		setSMTPHost();
 		setAltSMTPHost(); 
 		setFromAddress();						
-		 
-		
+		sendEMails(emailDebug, theme);
 	}
-	protected abstract void readFile(File fie) throws IOException;	
+	//protected abstract void readFile(File fie, LinkedList<Theme> theme) throws IOException;	
 		
 	protected void setSMTPHost() 
 	{
@@ -45,8 +45,9 @@ protected void setFromAddress()
 		fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
 	}
 	
-	
-	
+	protected void setToAddress(HashMap userInfo){
+		toAddress = (String) userInfo.get(Configuration.EMAIL_KEY); 		
+	}	
 			
 	protected List loadMailingList() throws Exception {			//user information, name and email address
 		return DBUtil.query(this.sendMailQuery);
@@ -55,23 +56,59 @@ protected List loadMailingList() throws Exception {			//user information, name a
 		
 	//protected abstract void setMessage(String name) throws IOException;			
 	
+	abstract protected void setSendMailQuery(Theme theme) throws Exception;
 	
-	protected void setToAddress(HashMap userInfo){
-		toAddress = (String) userInfo.get(Configuration.EMAIL_KEY); 		
+
+	abstract protected void setMessage(String name, Theme theme) throws IOException;
+	
+	
+	protected void emailProcessing(List mailingList, boolean debug, Theme theme) throws Exception	
+	{			
+		if (mailingList != null) 
+		{
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) 
+			{
+				HashMap userInfo = (HashMap) iter.next();				
+				setToAddress(userInfo);				
+				if (toAddress.length() > 0) 
+					setMessage((String)userInfo.get(Configuration.NAME_KEY), theme); 
+				
+				try 
+				{
+					if (toAddress.length() > 0)
+						sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}		
+		}
+		else {
+			System.out.println("没有邮件发送");			
+		}		
 	}
 	
 	
-	protected abstract void emailProcessing(List mailingList, boolean debug) throws IOException, Exception;
 	
-	
-	protected void sendEMails(boolean debug) throws Exception 
+	protected void sendEMails(boolean debug, LinkedList<Theme> theme) throws Exception 
 	{
-		
-		List mailingList = loadMailingList();	//persons
-		
-		System.out.println("开始发送邮件");
-		emailProcessing(mailingList, debug);
-
+		for(Theme topic : theme)
+		{		
+			setSendMailQuery(topic);	
+			List mailingList = loadMailingList();	//persons
+			
+			System.out.println("开始发送邮件");
+			emailProcessing(mailingList, debug, topic);
+		}
 	}
 	
 	public void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
index d12c24ddba..1f84e2f087 100644
--- a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -1,30 +1,8 @@
 package com.coderising.ood.srp;
 
-public class Product {
-	
-	private String productID; 
-	private String productDesc;
-	
-	
-	protected void setProductID(String ID) 
-	{ 
-		productID = ID; 
-		
-	} 
+public class Product extends Theme {
 
-	protected String getProductID() 
-	{
-		return productID; 
-	}
 	
-	protected void setProductDesc(String desc) {
-		productDesc = desc;		
-	}
-	
-	protected String getProductDesc(){
-		return productDesc;		
-	}
-
 	
 
 }
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 22783ba987..d6ef4b8c26 100644
--- a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,17 +1,11 @@
 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.Iterator;
-import java.util.LinkedList;
-import java.util.List;
 
 public class PromotionMail extends Mail {			//inheritance from mail	
 	
-	private LinkedList<Product> products;
+	
 
 	public static void main(String[] args) throws Exception {
 
@@ -23,100 +17,21 @@ public static void main(String[] args) throws Exception {
 	
 	public PromotionMail(File file, boolean mailDebug) throws Exception 
 	{				
-		super(file);
-		products = new LinkedList<>();
-		sendEMails(mailDebug);
+		super(file, mailDebug);		
 	}
 	
-	
-	
-	protected void setSendMailQuery(Product pro) throws Exception {		
+	protected void setSendMailQuery(Theme theme) throws Exception {		
 		sendMailQuery = "Select name from subscriptions "
-				+ "where product_id= '" + pro.getProductID() +"' "
+				+ "where product_id= '" + theme.getID() +"' "
 				+ "and send_mail=1 ";
 				
 		System.out.println("loadQuery set");
 	}
+	
 
-	protected void setMessage(String name, Product pro) throws IOException 
+	protected void setMessage(String name, Theme theme) throws IOException 
 	{				
 		subject = "您关注的产品降价了";
-		message = "尊敬的 "+ name +", 您关注的产品 " + pro.getProductDesc() + " 降价了，欢迎购买!" ;						
-	}
-	
-	protected void emailProcessing(List mailingList, boolean debug) throws Exception	
-	{
-		
-		for(Product pro : products){
-		
-			setSendMailQuery(pro);		
-			
-			if (mailingList != null) 
-			{
-				Iterator iter = mailingList.iterator();
-				while (iter.hasNext()) 
-				{
-					HashMap userInfo = (HashMap) iter.next();				
-					setToAddress(userInfo);				
-					if (toAddress.length() > 0) 
-						setMessage((String)userInfo.get(Configuration.NAME_KEY), pro); 
-					
-					try 
-					{
-						if (toAddress.length() > 0)
-							sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
-					} 
-					catch (Exception e) 
-					{
-						
-						try {
-							sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
-							
-						} catch (Exception e2) 
-						{
-							System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
-						}
-					}
-				}
-			
-			}
-			else {
-				System.out.println("没有邮件发送");			
-			}
-			
-		}
-		
-		
+		message = "尊敬的 "+ name +", 您关注的产品 " + theme.getDesc() + " 降价了，欢迎购买!" ;						
 	}
-	
-	
-
-
-	@Override
-	protected void readFile(File file) throws IOException // @02C
-	{
-		BufferedReader br = null;
-		try {
-			br = new BufferedReader(new FileReader(file));
-			String sCurrentLine = "";
-
-			while ((sCurrentLine = br.readLine()) != null) 
-			{
-				Product prod = new Product();
-				String[] data = sCurrentLine.split(" ");			
-				prod.setProductID(data[0]); 
-				prod.setProductDesc(data[1]); 
-				
-				System.out.println("产品ID = " + prod.getProductID() + "\n");
-				System.out.println("产品描述 = " + prod.getProductDesc() + "\n");			
-				products.add(prod);
-			}
-			
-		} catch (IOException e) {
-			throw new IOException(e.getMessage());
-		} finally {
-			br.close();
-		}
-	}
-		
 }
diff --git a/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java
new file mode 100644
index 0000000000..e2bf2f5e00
--- /dev/null
+++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Theme.java
@@ -0,0 +1,31 @@
+/**
+ * 
+ */
+package com.coderising.ood.srp;
+
+/**
+ * @author funkyxym
+ *
+ */
+public abstract class Theme {
+	private String ID = ""; 
+	private String Desc = "";
+		
+	protected void setID(String ID) 
+	{ 
+		this.ID = ID; 		
+	} 
+	
+	protected String getID() 
+	{
+		return ID; 
+	}
+		
+	protected void setDesc(String desc) {
+		this.Desc = desc;		
+	}
+	
+	protected String getDesc(){
+		return Desc;		
+	}
+}

From 2e84fcb4f0d9da2b2300c9359aefad1f2db6a9a6 Mon Sep 17 00:00:00 2001
From: 'mldn' <'yunshicheng@gmail.com'>
Date: Sun, 18 Jun 2017 13:51:26 +0800
Subject: [PATCH 152/332] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81?=
 =?UTF-8?q?=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/com/coderising/ood/bean/MailBean.java |  57 +++++++++
 .../com/coderising/ood/bean/ProductBean.java  |  56 +++++++++
 .../src/com/coderising/ood/bean/UserBean.java |  85 ++++++++++++++
 .../com/coderising/ood/srp/Configuration.java |  30 +++++
 .../coderising/ood/srp/ConfigurationKeys.java |  16 +++
 .../src/com/coderising/ood/srp/DBUtil.java    |  60 ++++++++++
 .../src/com/coderising/ood/srp/MailUtil.java  | 108 ++++++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java |  60 ++++++++++
 students/254647832/src/pom.xml                |  32 ++++++
 9 files changed, 504 insertions(+)
 create mode 100644 students/254647832/src/com/coderising/ood/bean/MailBean.java
 create mode 100644 students/254647832/src/com/coderising/ood/bean/ProductBean.java
 create mode 100644 students/254647832/src/com/coderising/ood/bean/UserBean.java
 create mode 100644 students/254647832/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/254647832/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/254647832/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/254647832/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/254647832/src/pom.xml

diff --git a/students/254647832/src/com/coderising/ood/bean/MailBean.java b/students/254647832/src/com/coderising/ood/bean/MailBean.java
new file mode 100644
index 0000000000..2befb197fe
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/bean/MailBean.java
@@ -0,0 +1,57 @@
+package com.coderising.ood.bean;
+
+/**
+ * <p>Title: MailBean</p>
+ * <p>Description: 邮件信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class MailBean {
+	
+	/**
+	 * 收件箱地址
+	 */
+	private String toAddress;
+	
+	/**
+	 * 邮件主题
+	 */
+	private String subject;
+	
+	/**
+	 * 邮件内容
+	 */
+	private String message;
+
+	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 getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	@Override
+	public String toString() {
+		return "MailBean [toAddress=" + toAddress + ", subject=" + subject
+				+ ", message=" + message + "]";
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/bean/ProductBean.java b/students/254647832/src/com/coderising/ood/bean/ProductBean.java
new file mode 100644
index 0000000000..f8ae0bfb00
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/bean/ProductBean.java
@@ -0,0 +1,56 @@
+package com.coderising.ood.bean;
+
+import java.util.List;
+
+/**
+ * <p>Title: ProductBean</p>
+ * <p>Description: 产品信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class ProductBean {
+	
+	/**
+	 * 产品编号
+	 */
+	private String productID;
+	
+	/**
+	 * 产品描述
+	 */
+	private String productDesc;
+
+	private List<UserBean> users;
+	
+	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;
+	}
+
+	public List<UserBean> getUsers() {
+		return users;
+	}
+
+	public void setUsers(List<UserBean> users) {
+		this.users = users;
+	}
+
+	@Override
+	public String toString() {
+		return "ProductBean [productID=" + productID + ", productDesc="
+				+ productDesc + ", users=" + users + "]";
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/bean/UserBean.java b/students/254647832/src/com/coderising/ood/bean/UserBean.java
new file mode 100644
index 0000000000..c1f36a3ef7
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/bean/UserBean.java
@@ -0,0 +1,85 @@
+package com.coderising.ood.bean;
+
+import java.util.List;
+
+/**
+ * <p>Title: UserBean</p>
+ * <p>Description: 用户信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class UserBean {
+	
+	/**
+	 * 用户ID
+	 */
+	private String userid;
+	
+	/**
+	 * 用户姓名
+	 */
+	private String name;
+	
+	/**
+	 * 邮箱
+	 */
+	private String email;
+	
+	/**
+	 * 邮件推送标识 0-不推送;1-推送
+	 */
+	private String sendFlag;
+	
+	/**
+	 * 关注的产品
+	 */
+	private List<ProductBean> pros;
+
+	public String getUserid() {
+		return userid;
+	}
+
+	public void setUserid(String userid) {
+		this.userid = userid;
+	}
+
+	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 String getSendFlag() {
+		return sendFlag;
+	}
+
+	public void setSendFlag(String sendFlag) {
+		this.sendFlag = sendFlag;
+	}
+
+	public List<ProductBean> getPros() {
+		return pros;
+	}
+
+	public void setPros(List<ProductBean> pros) {
+		this.pros = pros;
+	}
+
+	@Override
+	public String toString() {
+		return "UserBean [userid=" + userid + ", name=" + name + ", email="
+				+ email + ", sendFlag=" + sendFlag + ", pros=" + pros + "]";
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/srp/Configuration.java b/students/254647832/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..5e384821d0
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>Title: Configuration</p>
+ * <p>Description: 获取配置信息</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class Configuration {
+	//封装成私有变量
+	private static Map<String,String> 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/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..70606dda99
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+/**
+ * <p>Title: ConfigurationKeys</p>
+ * <p>Description: 邮件服务器配置参数</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+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/254647832/src/com/coderising/ood/srp/DBUtil.java b/students/254647832/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..4cb4d8ac30
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,60 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import com.coderising.ood.bean.ProductBean;
+import com.coderising.ood.bean.UserBean;
+
+/**
+ * <p>Title: DBUtil</p>
+ * <p>Description: 数据库操作</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 用户和关注的产品，应该是多对多的关系，应该有张多对多的表[用户id + 产品id]
+	 * 先根据产品id查询出用户id，再根据用户id查询出用户信息。此处省略这部分的处理
+	 * @param sql
+	 * @return
+	 */
+	public static List<UserBean> query(Set<String> proIds){
+		
+		/**
+		 *  SELECT name, email FROM user WHERE userid IN(
+		 *  	SELECT userid FROM user_pro WHERE proId in(proIds))
+		 */
+		StringBuilder sendMailQuery = new StringBuilder();
+		sendMailQuery.append("Select name from subscriptions where send_mail=1 and product_id in(");
+		
+		Iterator<String> iter = proIds.iterator();
+		while(iter.hasNext()){
+			sendMailQuery.append("'" + iter.next() + "',");
+		}
+		sendMailQuery.delete(sendMailQuery.length()-1, sendMailQuery.length()).append(")");
+		
+		List<ProductBean> proList = new ArrayList<ProductBean>();
+		ProductBean proBean = null;
+		List<UserBean> userList = new ArrayList<UserBean>();
+		UserBean userInfo = null;
+		for (int i = 1; i <= 3; i++) {
+			userInfo = new UserBean();
+			userInfo.setName("User_" + i);			
+			userInfo.setEmail("aa@bb.com_" + i);
+			proBean = new ProductBean();
+			proBean.setProductID("pro_" + i);
+			proBean.setProductDesc("proDesc_" + i);
+			proList.add(proBean);
+			userInfo.setPros(proList);
+			userList.add(userInfo);
+		}
+		
+		return userList;
+	}
+	
+}
diff --git a/students/254647832/src/com/coderising/ood/srp/MailUtil.java b/students/254647832/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9763abc625
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,108 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.bean.MailBean;
+import com.coderising.ood.bean.ProductBean;
+import com.coderising.ood.bean.UserBean;
+
+/**
+ * <p>Title: MailUtil</p>
+ * <p>Description: 邮件工具类</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class MailUtil {
+
+	/**
+	 * 获取邮件正文信息
+	 * @param user 用户信息
+	 * @return 邮件正文
+	 */
+	private static String getMassege(UserBean user){
+		List<ProductBean> list = user.getPros();
+		StringBuilder s = new StringBuilder();
+		s.append("尊敬的 ");
+		s.append(user.getName());
+		s.append(", 您关注的产品 ");
+		for(ProductBean pro : list){
+			s.append(pro.getProductDesc()).append("、");
+		}
+		s.delete(s.length()-1, s.length());
+		s.append(" 降价了，欢迎购买!");
+		return s.toString();
+	}
+	
+	/**
+	 * 获取待发送的邮件信息列表
+	 * @param users 用户信息
+	 * @return 待发送邮件列表
+	 */
+	private static List<MailBean> getMailInf(List<UserBean> users){
+		List<MailBean> retList = new ArrayList<MailBean>();
+		MailBean mailInf;
+		//获取邮件服务器配置信息
+		if (!users.isEmpty()) {
+			for(UserBean bean : users){
+				mailInf = new MailBean();
+				mailInf.setToAddress(bean.getEmail());
+				mailInf.setSubject("您关注的产品降价了");
+				mailInf.setMessage(getMassege(bean));
+				retList.add(mailInf);
+			}
+		}
+		return retList;
+	}
+	
+	/**
+	 * 发送邮件
+	 * @param users 待发送的用户
+	 */
+	public static void sendEmail(List<UserBean> users) {
+		List<MailBean> mailList = getMailInf(users);
+		if(!mailList.isEmpty()){
+			//获取邮件服务器信息
+			Configuration config = new Configuration();
+			String server = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+			String altServer = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+			
+			System.out.println("开始发送邮件...");
+			System.out.println("发件箱：" + config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+			
+			for(MailBean mailInf : mailList){
+				try{
+					send(server, mailInf);
+				}catch (Exception e){
+					try {
+						send(altServer, mailInf);
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			System.out.println("邮件发送结束...");
+		}else{
+			System.out.println("没有邮件发送");
+		}
+		
+	}
+	
+	/**
+	 * 邮件发送主方法
+	 * @param server 发送服务器
+	 */
+	public static void send(String server, MailBean mailInf){
+		
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		
+		buffer.append("To:").append(mailInf.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mailInf.getSubject()).append("\n");
+		buffer.append("Content:").append(mailInf.getMessage()).append("\n");
+		
+		System.out.println(buffer.toString());
+	}
+
+}
diff --git a/students/254647832/src/com/coderising/ood/srp/PromotionMail.java b/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..2e0cd8793f
--- /dev/null
+++ b/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,60 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.coderising.ood.bean.UserBean;
+
+/**
+ * <p>Title: PromotionMail</p>
+ * <p>Description: 邮件发送处理</p>
+ * <p>Company: smartisan</p>
+ * @author Administrator
+ * @date 2017年6月18日
+ */
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		
+		//1、获取降价产品信息
+		File f = new File("E:\\gitpro\\liuxin\\coding2017\\liuxin\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		Set<String> proIds = readFile(f);
+		
+		//2、根据降价产品的ID获取关注该产品的用户信息
+		List<UserBean> users = DBUtil.query(proIds);
+		
+		//3、向这些用户发送邮件
+		MailUtil.sendEmail(users);
+	}
+
+	/**
+	 * 读取文件，获取降价产品信息
+	 * @param file
+	 * @return 产品信息的ID
+	 * @throws IOException
+	 */
+	private static Set<String> readFile(File file) throws IOException{
+		Set<String> proIds = new HashSet<String>();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			while(temp != null && "".equals(temp)){
+				String[] data = temp.split(" ");
+				proIds.add(data[0]);
+				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 proIds;
+	}
+}
diff --git a/students/254647832/src/pom.xml b/students/254647832/src/pom.xml
new file mode 100644
index 0000000000..1be81576cc
--- /dev/null
+++ b/students/254647832/src/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>

From 91353f677343f5426dd7815412ae44b0d4ad40b1 Mon Sep 17 00:00:00 2001
From: 'mldn' <'yunshicheng@gmail.com'>
Date: Sun, 18 Jun 2017 14:02:57 +0800
Subject: [PATCH 153/332] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=BB=E5=8F=96?=
 =?UTF-8?q?=E9=99=8D=E4=BB=B7=E5=95=86=E5=93=81=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/PromotionMail.java   | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/students/254647832/src/com/coderising/ood/srp/PromotionMail.java b/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
index 2e0cd8793f..9af969c773 100644
--- a/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
+++ b/students/254647832/src/com/coderising/ood/srp/PromotionMail.java
@@ -41,14 +41,19 @@ public static void main(String[] args) throws Exception {
 	private static Set<String> readFile(File file) throws IOException{
 		Set<String> proIds = new HashSet<String>();
 		BufferedReader br = null;
+		boolean flag = true;
 		try {
 			br = new BufferedReader(new FileReader(file));
-			String temp = br.readLine();
-			while(temp != null && "".equals(temp)){
-				String[] data = temp.split(" ");
-				proIds.add(data[0]);
-				System.out.println("产品ID = " + data[0] + "\n");
-				System.out.println("产品描述 = " + data[1] + "\n");
+			while(flag){
+				String temp = br.readLine();
+				if(temp != null && !"".equals(temp)){
+					String[] data = temp.split(" ");
+					proIds.add(data[0]);
+					System.out.println("产品ID = " + data[0]);
+					System.out.println("产品描述 = " + data[1] + "\n");
+				}else{
+					flag = false;
+				}
 			}
 		} catch (IOException e) {
 			throw new IOException(e.getMessage());

From a8fb018a4793956319ce33ce33b57122effcd17a Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 14:39:55 +0800
Subject: [PATCH 154/332] init homework of myself

---
 students/511134962/ood-assignment/pom.xml     |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/511134962/ood-assignment/pom.xml
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/511134962/ood-assignment/pom.xml b/students/511134962/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/511134962/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/511134962/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<String,String> 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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/511134962/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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/511134962/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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/511134962/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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/511134962/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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/511134962/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

From c072a337ea5281ac3d22916b6dbd3942fc3689e0 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 14:49:51 +0800
Subject: [PATCH 155/332] Updated file path to myself's.

---
 .../java/com/coderising/ood/srp/PromotionMail.java    | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 781587a846..74adfbc63c 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,10 +1,17 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
 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;
@@ -35,7 +42,7 @@ public class PromotionMail {
 
 	public static void main(String[] args) throws Exception {
 
-		File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		File f = new File("D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
 		boolean emailDebug = false;
 
 		PromotionMail pe = new PromotionMail(f, emailDebug);

From 5668592725a4678d1e0b0dbe4b34d07f3142d784 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 14:55:40 +0800
Subject: [PATCH 156/332] Added pom.xml signature.

---
 students/511134962/ood-assignment/pom.xml | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/students/511134962/ood-assignment/pom.xml b/students/511134962/ood-assignment/pom.xml
index cac49a5328..542d8e08ef 100644
--- a/students/511134962/ood-assignment/pom.xml
+++ b/students/511134962/ood-assignment/pom.xml
@@ -1,3 +1,11 @@
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~ Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                      ~
+  ~ Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                       ~
+  ~ Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                  ~
+  ~ Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                    ~
+  ~ Vestibulum commodo. Ut rhoncus gravida arcu.                                                                      ~
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

From 3c6d5caf01bda49078d729ffa08eeef8cbde66ac Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 14:56:13 +0800
Subject: [PATCH 157/332] Added *.java signature.

---
 .../java/com/coderising/ood/srp/ConfigurationKeys.java    | 8 ++++++++
 .../src/main/java/com/coderising/ood/srp/DBUtil.java      | 8 ++++++++
 .../src/main/java/com/coderising/ood/srp/MailUtil.java    | 8 ++++++++
 3 files changed, 24 insertions(+)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
index 8695aed644..20c6321972 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -1,3 +1,11 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
 package com.coderising.ood.srp;
 
 public class ConfigurationKeys {
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
index 82e9261d18..e1854a3bdc 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -1,3 +1,11 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
 package com.coderising.ood.srp;
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
index 9f9e749af7..3d417b3c6a 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -1,3 +1,11 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
 package com.coderising.ood.srp;
 
 public class MailUtil {

From 32da00666376844f97b818ab1a441f16dea11836 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 14:59:43 +0800
Subject: [PATCH 158/332] Formatted code

---
 .../com/coderising/ood/srp/PromotionMail.java | 346 ++++++++----------
 1 file changed, 159 insertions(+), 187 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 74adfbc63c..d4cf4203d2 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -16,191 +16,163 @@
 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:\\02_workspace\\myproject\\coding2017\\students\\511134962\\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("没有邮件发送");
-			
-		}
-
-	}
+public class PromotionMail
+{
+    private static final String NAME_KEY  = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+    private static Configuration config;
+    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;
+
+    public PromotionMail( File file, boolean mailDebug ) throws Exception
+    {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        readFile( file );
+        config = new Configuration();
+
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+        setLoadQuery();
+        sendEMails( mailDebug, loadMailingList() );
+    }
+
+    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();
+        }
+    }
+
+    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 setLoadQuery() throws Exception
+    {
+
+        sendMailQuery
+                = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+        System.out.println( "loadQuery set" );
+    }
+
+    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( "没有邮件发送" );
+        }
+
+    }
+
+    protected List loadMailingList() throws Exception
+    {
+        return DBUtil.query( this.sendMailQuery );
+    }
+
+    protected void setProductID( String productID )
+    {
+        this.productID = productID;
+
+    }
+
+    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 void setMessage( HashMap userInfo ) throws IOException
+    {
+        String name = ( String ) userInfo.get( NAME_KEY );
+        subject = "您关注的产品降价了";
+        message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+    }
+
+    public static void main( String[] args ) throws Exception
+    {
+        File f = new File(
+                "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt" );
+        boolean       emailDebug = false;
+        PromotionMail pe         = new PromotionMail( f, emailDebug );
+    }
+
+    protected String getproductID()
+    {
+        return productID;
+    }
 }

From e1f3128bd455e5432bbc3bb4ce7696167830f154 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:01:13 +0800
Subject: [PATCH 159/332] Formatted code

---
 .../src/main/java/com/coderising/ood/srp/Configuration.java    | 1 -
 .../main/java/com/coderising/ood/srp/ConfigurationKeys.java    | 2 --
 .../src/main/java/com/coderising/ood/srp/DBUtil.java           | 2 --
 .../src/main/java/com/coderising/ood/srp/MailUtil.java         | 3 ---
 4 files changed, 8 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
index f328c1816a..3985daf8b5 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -16,7 +16,6 @@ public class Configuration {
 	 * @return
 	 */
 	public String getProperty(String key) {
-		
 		return configurations.get(key);
 	}
 
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
index 20c6321972..16eda31c95 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -9,9 +9,7 @@
 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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
index e1854a3bdc..c145b7440b 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -19,7 +19,6 @@ public class DBUtil {
 	 * @return
 	 */
 	public static List query(String sql){
-		
 		List userList = new ArrayList();
 		for (int i = 1; i <= 3; i++) {
 			HashMap userInfo = new HashMap();
@@ -27,7 +26,6 @@ public static List query(String sql){
 			userInfo.put("EMAIL", "aa@bb.com");
 			userList.add(userInfo);
 		}
-
 		return userList;
 	}
 }
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
index 3d417b3c6a..a8939d2f01 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -19,8 +19,5 @@ public static void sendEmail(String toAddress, String fromAddress, String subjec
 		buffer.append("Subject:").append(subject).append("\n");
 		buffer.append("Content:").append(message).append("\n");
 		System.out.println(buffer.toString());
-		
 	}
-
-	
 }

From 65063507f17eddbc5ccf725f984fa59ed5830de4 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:03:22 +0800
Subject: [PATCH 160/332] Formatted code

---
 .../com/coderising/ood/srp/Configuration.java | 36 +++++++++++--------
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
index 3985daf8b5..af99642b9d 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -1,22 +1,28 @@
 package com.coderising.ood.srp;
+
 import java.util.HashMap;
 import java.util.Map;
 
-public class Configuration {
+public class Configuration
+{
+    static Map< String, String > 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" );
+    }
 
-	static Map<String,String> 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);
-	}
+    /**
+     * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+     *
+     * @param key
+     *
+     * @return
+     */
+    public String getProperty( String key )
+    {
+        return configurations.get( key );
+    }
 
 }

From 2460a89b10b2310a0ab1132344c0a2aedd4b4935 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:10:10 +0800
Subject: [PATCH 161/332] Formatted codes

---
 .../src/main/java/com/coderising/ood/srp/PromotionMail.java  | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index d4cf4203d2..0ea4c534b7 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -139,7 +139,6 @@ protected List loadMailingList() throws Exception
     protected void setProductID( String productID )
     {
         this.productID = productID;
-
     }
 
     private void setProductDesc( String desc )
@@ -165,10 +164,10 @@ protected void setMessage( HashMap userInfo ) throws IOException
 
     public static void main( String[] args ) throws Exception
     {
-        File f = new File(
+        File productPromotionFile = new File(
                 "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt" );
         boolean       emailDebug = false;
-        PromotionMail pe         = new PromotionMail( f, emailDebug );
+        PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
     }
 
     protected String getproductID()

From 9e2474a6598baad18e6f12246adac15cd4341339 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:21:38 +0800
Subject: [PATCH 162/332] Delegated read file code to FileUtil.java

---
 .../java/com/coderising/ood/srp/FileUtil.java | 43 +++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 62 +++++++------------
 2 files changed, 64 insertions(+), 41 deletions(-)
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..7e6d1ba355
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,43 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil
+{
+    public FileUtil() { }
+
+    public String[] readFile( File file ) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        try
+        {
+            br = new BufferedReader( new FileReader( file ) );
+            String   temp = br.readLine();
+            String[] data = temp.split( " " );
+            br.close();
+            return data;
+        }
+        catch ( IOException e )
+        {
+            throw new IOException( e.getMessage() );
+        }
+        finally
+        {
+            if ( null != br )
+            {
+                br.close();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 0ea4c534b7..705258e063 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -8,9 +8,7 @@
 
 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.Iterator;
@@ -21,22 +19,21 @@ public class PromotionMail
     private static final String NAME_KEY  = "NAME";
     private static final String EMAIL_KEY = "EMAIL";
     private static Configuration config;
-    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 final FileUtil fileUtil      = new FileUtil();
+    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;
 
     public PromotionMail( File file, boolean mailDebug ) throws Exception
     {
-        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
-        readFile( file );
+        readProductInfos( file );
         config = new Configuration();
-
         setSMTPHost();
         setAltSMTPHost();
         setFromAddress();
@@ -44,30 +41,13 @@ public PromotionMail( File file, boolean mailDebug ) throws Exception
         sendEMails( mailDebug, loadMailingList() );
     }
 
-    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 readProductInfos( File file ) throws IOException
+    {//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] productInfos = fileUtil.readFile( file );
+        setProductID( productInfos[ 0 ] );
+        setProductDesc( productInfos[ 1 ] );
+        System.out.println( "产品ID = " + productID + "\n" );
+        System.out.println( "产品描述 = " + productDesc + "\n" );
     }
 
     protected void setSMTPHost()
@@ -136,14 +116,14 @@ protected List loadMailingList() throws Exception
         return DBUtil.query( this.sendMailQuery );
     }
 
-    protected void setProductID( String productID )
+    private void setProductID( String productID )
     {
         this.productID = productID;
     }
 
-    private void setProductDesc( String desc )
+    private void setProductDesc( String productDesc )
     {
-        this.productDesc = desc;
+        this.productDesc = productDesc;
     }
 
     protected void configureEMail( HashMap userInfo ) throws IOException

From 2f4d56ec40a062fade6a843ecd1acd9d88515712 Mon Sep 17 00:00:00 2001
From: yangdd1205 <yangdd1205@126.com>
Date: Sun, 18 Jun 2017 15:26:31 +0800
Subject: [PATCH 163/332] ood srp

---
 .../java/com/coderising/ood/srp/DBUtil.java   |  57 ++++--
 .../java/com/coderising/ood/srp/MailData.java |  73 +++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  53 +++--
 .../com/coderising/ood/srp/ProductInfo.java   |  33 ++++
 .../ood/srp/ProductInfoService.java           |  38 ++++
 .../com/coderising/ood/srp/PromotionMail.java | 182 +++---------------
 .../java/com/coderising/ood/srp/UserInfo.java |  29 +++
 .../coderising/ood/srp/UserInfoService.java   |  13 ++
 8 files changed, 295 insertions(+), 183 deletions(-)
 create mode 100644 students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java
 create mode 100644 students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java
 create mode 100644 students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java
 create mode 100644 students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java
 create mode 100644 students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java

diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
index 4b8452ded2..27b3f180a7 100644
--- a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -1,25 +1,46 @@
 package com.coderising.ood.srp;
+
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Random;
 
 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;
-	}
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     *
+     * @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;
+    }
+
+
+    public static List<UserInfo> querySubscriber(String productId) {
+
+        List<UserInfo> list = new ArrayList<>();
+
+        Random random = new Random();
+        int number = random.nextInt(3);
+
+        for (int i = 1; i <= number; i++) {
+            UserInfo userInfo = new UserInfo();
+            userInfo.setName("User" + productId + i);
+            userInfo.setMail(userInfo.getName() + "@" + productId + ".com");
+            list.add(userInfo);
+        }
+        return list;
+    }
 }
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java
new file mode 100644
index 0000000000..6bcf25cc99
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailData.java
@@ -0,0 +1,73 @@
+package com.coderising.ood.srp;
+
+/**
+ * 邮件数据
+ *
+ * @author yangdd
+ */
+public class MailData {
+
+    protected String smtpHost;
+    protected String altSmtpHost;
+    protected String fromAddress;
+    protected String toAddress;
+    protected String subject;
+    protected String message;
+    private boolean debug;
+
+    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 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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public boolean isDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
index 9e77ef1968..9948734ff5 100644
--- a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -2,17 +2,44 @@
 
 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());
-		
-	}
-
-	
+    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());
+
+    }
+
+
+    public static void sendEmail(MailData mailData) {
+        //假装发了一封邮件
+        try {
+            StringBuilder buffer = new StringBuilder();
+            buffer.append("Smtp:").append(mailData.getSmtpHost()).append("\n");
+            buffer.append("From:").append(mailData.getFromAddress()).append("\n");
+            buffer.append("To:").append(mailData.getToAddress()).append("\n");
+            buffer.append("Subject:").append(mailData.getSubject()).append("\n");
+            buffer.append("Content:").append(mailData.getMessage()).append("\n");
+            System.out.println(buffer.toString());
+        } catch (Exception e) {
+            try {
+                StringBuilder buffer = new StringBuilder();
+                buffer.append("Smtp:").append(mailData.getAltSmtpHost()).append("\n");
+                buffer.append("From:").append(mailData.getFromAddress()).append("\n");
+                buffer.append("To:").append(mailData.getToAddress()).append("\n");
+                buffer.append("Subject:").append(mailData.getSubject()).append("\n");
+                buffer.append("Content:").append(mailData.getMessage()).append("\n");
+                System.out.println(buffer.toString());
+            } catch (Exception e1) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e1.getMessage());
+            }
+        }
+
+
+    }
+
 }
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..c699da54a1
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * 产品信息
+ *
+ * @author yangdd
+ */
+public class ProductInfo {
+
+    private String id;
+
+    private String description;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java
new file mode 100644
index 0000000000..5f91b05c36
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ProductInfoService.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yangdd
+ */
+public class ProductInfoService {
+
+    public List<ProductInfo> getPromotionProducts() {
+        List<ProductInfo> list = new ArrayList<>();
+        //可以抽取出一个读取文件的Util
+        BufferedReader br = null;
+        try {
+            String path = "/Users/yangdd/Documents/code/GitHub/coding2017-Q2/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt";
+            File file = new File(path);
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            String[] data = null;
+            while ((temp = br.readLine()) != null) {
+                data = temp.split(" ");
+                ProductInfo productInfo = new ProductInfo();
+                productInfo.setId(data[0]);
+                productInfo.setDescription(data[1]);
+                list.add(productInfo);
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return list;
+    }
+
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 55c1f2558c..d8accbd797 100644
--- a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,180 +1,58 @@
 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.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("E:\\git\\coding2017-Q2\\students\\1049843090\\ood\\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());
-
+        new PromotionMail().sendEMails();
 
     }
 
 
-    protected void setProductID(String productID) {
-        this.productID = productID;
+    private void setMessage(ProductInfo productInfo, UserInfo userInfo, MailData mailData) {
 
-    }
-
-    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");
-    }
 
+        mailData.setSubject("您关注的产品降价了");
+        String message = "尊敬的 " + userInfo.getName() + ", 您关注的产品 " + productInfo.getDescription() + " 降价了，欢迎购买!";
+        mailData.setMessage(message);
 
-    protected void setSMTPHost() {
-        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
     }
 
 
-    protected void setAltSMTPHost() {
-        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    private void sendEMails() throws Exception {
+        ProductInfoService productInfoService = new ProductInfoService();
+        UserInfoService userInfoService = new UserInfoService();
+        List<ProductInfo> productInfos = productInfoService.getPromotionProducts();
 
-    }
-
-
-    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("开始发送邮件");
+        MailData mailData = getMailData();
+        productInfos.forEach(e -> {
+            List<UserInfo> userInfos = userInfoService.getuserInfoByProduceId(e.getId());
+            userInfos.forEach(userInfo -> {
+                if (userInfo.getMail().length() > 0) {
+                    mailData.setToAddress(userInfo.getMail());
+                    setMessage(e, userInfo, mailData);
+                    MailUtil.sendEmail(mailData);
+                } else {
+                    System.out.println(userInfo.getName() + "邮件格式不正确");
+                }
 
-            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);
+    private MailData getMailData() {
+        Configuration config = new Configuration();
+        MailData mailData = new MailData();
+        mailData.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+        mailData.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+        mailData.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        return mailData;
     }
 
-    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("没有邮件发送");
-
-        }
-
-    }
 }
\ No newline at end of file
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..98b04b338e
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp;
+
+/**
+ * 用户信息
+ *
+ * @author yangdd
+ */
+public class UserInfo {
+
+    private String name;
+
+    private String mail;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMail() {
+        return mail;
+    }
+
+    public void setMail(String mail) {
+        this.mail = mail;
+    }
+}
diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java
new file mode 100644
index 0000000000..d320d41491
--- /dev/null
+++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/UserInfoService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * @author yangdd
+ */
+public class UserInfoService {
+
+    public List<UserInfo> getuserInfoByProduceId(String productId) {
+        return DBUtil.querySubscriber(productId);
+    }
+}

From 7462969744039e1b3ca55666477cc8fd5526fca3 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:31:25 +0800
Subject: [PATCH 164/332] Refactored configuring email setting

---
 .../java/com/coderising/ood/srp/PromotionMail.java  | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 705258e063..406c7e164e 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -33,12 +33,18 @@ public class PromotionMail
     public PromotionMail( File file, boolean mailDebug ) throws Exception
     {
         readProductInfos( file );
+        configuringEMAILSetting();
+        setLoadQuery();
+        List mailingList = loadMailingList();
+        sendEMails( mailDebug, mailingList );
+    }
+
+    private void configuringEMAILSetting()
+    {
         config = new Configuration();
         setSMTPHost();
         setAltSMTPHost();
         setFromAddress();
-        setLoadQuery();
-        sendEMails( mailDebug, loadMailingList() );
     }
 
     private void readProductInfos( File file ) throws IOException
@@ -67,7 +73,6 @@ protected void setFromAddress()
 
     protected void setLoadQuery() throws Exception
     {
-
         sendMailQuery
                 = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
         System.out.println( "loadQuery set" );
@@ -94,7 +99,6 @@ protected void sendEMails( boolean debug, List mailingList ) throws IOException
                     try
                     {
                         MailUtil.sendEmail( toAddress, fromAddress, subject, message, altSmtpHost, debug );
-
                     }
                     catch ( Exception e2 )
                     {
@@ -103,7 +107,6 @@ protected void sendEMails( boolean debug, List mailingList ) throws IOException
                 }
             }
         }
-
         else
         {
             System.out.println( "没有邮件发送" );

From 3b54f4fde6b88d1e79a90ee46989330933448148 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:47:31 +0800
Subject: [PATCH 165/332] Extracted emailDebug property

---
 .../com/coderising/ood/srp/PromotionMail.java | 52 ++++++++++---------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 406c7e164e..4f3211d113 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -29,9 +29,11 @@ public class PromotionMail
     protected     String   message       = null;
     protected     String   productID     = null;
     protected     String   productDesc   = null;
+    private boolean emailDebug;
 
     public PromotionMail( File file, boolean mailDebug ) throws Exception
     {
+        this.emailDebug = mailDebug;
         readProductInfos( file );
         configuringEMAILSetting();
         setLoadQuery();
@@ -39,14 +41,6 @@ public PromotionMail( File file, boolean mailDebug ) throws Exception
         sendEMails( mailDebug, mailingList );
     }
 
-    private void configuringEMAILSetting()
-    {
-        config = new Configuration();
-        setSMTPHost();
-        setAltSMTPHost();
-        setFromAddress();
-    }
-
     private void readProductInfos( File file ) throws IOException
     {//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
         String[] productInfos = fileUtil.readFile( file );
@@ -56,19 +50,12 @@ private void readProductInfos( File file ) throws IOException
         System.out.println( "产品描述 = " + productDesc + "\n" );
     }
 
-    protected void setSMTPHost()
-    {
-        smtpHost = config.getProperty( ConfigurationKeys.SMTP_SERVER );
-    }
-
-    protected void setAltSMTPHost()
-    {
-        altSmtpHost = config.getProperty( ConfigurationKeys.ALT_SMTP_SERVER );
-    }
-
-    protected void setFromAddress()
+    private void configuringEMAILSetting()
     {
-        fromAddress = config.getProperty( ConfigurationKeys.EMAIL_ADMIN );
+        config = new Configuration();
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
     }
 
     protected void setLoadQuery() throws Exception
@@ -78,6 +65,11 @@ protected void setLoadQuery() throws Exception
         System.out.println( "loadQuery set" );
     }
 
+    protected List loadMailingList() throws Exception
+    {
+        return DBUtil.query( this.sendMailQuery );
+    }
+
     protected void sendEMails( boolean debug, List mailingList ) throws IOException
     {
         System.out.println( "开始发送邮件" );
@@ -114,11 +106,6 @@ protected void sendEMails( boolean debug, List mailingList ) throws IOException
 
     }
 
-    protected List loadMailingList() throws Exception
-    {
-        return DBUtil.query( this.sendMailQuery );
-    }
-
     private void setProductID( String productID )
     {
         this.productID = productID;
@@ -129,6 +116,21 @@ private void setProductDesc( String productDesc )
         this.productDesc = productDesc;
     }
 
+    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 configureEMail( HashMap userInfo ) throws IOException
     {
         toAddress = ( String ) userInfo.get( EMAIL_KEY );

From 73889792294814f08733a54b4be31b0873c5ac29 Mon Sep 17 00:00:00 2001
From: Heveinyu <Heveinyu>
Date: Sun, 18 Jun 2017 15:50:21 +0800
Subject: [PATCH 166/332] first

---
 students/1418243288/readme.md | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 students/1418243288/readme.md

diff --git a/students/1418243288/readme.md b/students/1418243288/readme.md
new file mode 100644
index 0000000000..6f447ec300
--- /dev/null
+++ b/students/1418243288/readme.md
@@ -0,0 +1,2 @@
+﻿测试下心上传的值
+

From b6dbae57e3f846f5609e16ceabd9be8a3d33bb36 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 15:51:46 +0800
Subject: [PATCH 167/332] Extracted ProductInfo.java

---
 .../com/coderising/ood/srp/ProductInfo.java   | 72 +++++++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 55 +++++++-------
 2 files changed, 99 insertions(+), 28 deletions(-)
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..9e3caa1f57
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,72 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp;
+
+import java.util.Objects;
+
+public class ProductInfo
+{
+    public String productID = null;
+    public String productDesc = null;
+
+    public ProductInfo() { }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash( getProductID(), getProductDesc() );
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if ( this == o )
+        {
+            return true;
+        }
+        if ( !( o instanceof ProductInfo ) )
+        {
+            return false;
+        }
+        ProductInfo that = ( ProductInfo ) o;
+        return Objects.equals( getProductID(), that.getProductID() ) && Objects.equals( getProductDesc(),
+                                                                                        that.getProductDesc() );
+    }
+
+    public String getProductID()
+    {
+        return productID;
+    }
+
+    public String getProductDesc()
+    {
+
+        return productDesc;
+    }
+
+    public void setProductDesc( String productDesc )
+    {
+        this.productDesc = productDesc;
+    }
+
+    public void setProductID( String productID )
+    {
+        this.productID = productID;
+    }
+
+    @Override
+    public String toString()
+    {
+        final StringBuilder sb = new StringBuilder( "ProductInfo{" );
+        sb.append( "                productDesc='" ).append( productDesc ).append( '\'' );
+        sb.append( ",                 productID='" ).append( productID ).append( '\'' );
+        sb.append( '}' );
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 4f3211d113..065c6d0980 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -18,17 +18,16 @@ public class PromotionMail
 {
     private static final String NAME_KEY  = "NAME";
     private static final String EMAIL_KEY = "EMAIL";
-    private static Configuration config;
-    private final FileUtil fileUtil      = new FileUtil();
-    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 Configuration config;
+    private FileUtil    fileUtil      = new FileUtil();
+    private String      sendMailQuery = null;
+    private String      smtpHost      = null;
+    private String      altSmtpHost   = null;
+    private String      fromAddress   = null;
+    private String      toAddress     = null;
+    private String      subject       = null;
+    private String      message       = null;
+    private ProductInfo productInfo   = new ProductInfo();
     private boolean emailDebug;
 
     public PromotionMail( File file, boolean mailDebug ) throws Exception
@@ -44,10 +43,10 @@ public PromotionMail( File file, boolean mailDebug ) throws Exception
     private void readProductInfos( File file ) throws IOException
     {//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
         String[] productInfos = fileUtil.readFile( file );
-        setProductID( productInfos[ 0 ] );
-        setProductDesc( productInfos[ 1 ] );
-        System.out.println( "产品ID = " + productID + "\n" );
-        System.out.println( "产品描述 = " + productDesc + "\n" );
+        productInfo.setProductID( productInfos[ 0 ] );
+        productInfo.setProductDesc( productInfos[ 1 ] );
+        System.out.println( "产品ID = " + productInfo.productID + "\n" );
+        System.out.println( "产品描述 = " + productInfo.productDesc + "\n" );
     }
 
     private void configuringEMAILSetting()
@@ -61,7 +60,7 @@ private void configuringEMAILSetting()
     protected void setLoadQuery() throws Exception
     {
         sendMailQuery
-                = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+                = "Select name from subscriptions " + "where product_id= '" + productInfo.productID + "' " + "and send_mail=1 ";
         System.out.println( "loadQuery set" );
     }
 
@@ -106,16 +105,6 @@ protected void sendEMails( boolean debug, List mailingList ) throws IOException
 
     }
 
-    private void setProductID( String productID )
-    {
-        this.productID = productID;
-    }
-
-    private void setProductDesc( String productDesc )
-    {
-        this.productDesc = productDesc;
-    }
-
     protected void setSMTPHost()
     {
         smtpHost = config.getProperty( ConfigurationKeys.SMTP_SERVER );
@@ -144,7 +133,7 @@ protected void setMessage( HashMap userInfo ) throws IOException
     {
         String name = ( String ) userInfo.get( NAME_KEY );
         subject = "您关注的产品降价了";
-        message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+        message = "尊敬的 " + name + ", 您关注的产品 " + productInfo.productDesc + " 降价了，欢迎购买!";
     }
 
     public static void main( String[] args ) throws Exception
@@ -155,8 +144,18 @@ public static void main( String[] args ) throws Exception
         PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
     }
 
+    private void setProductID( String productID )
+    {
+        productInfo.setProductID( productID );
+    }
+
+    private void setProductDesc( String productDesc )
+    {
+        productInfo.setProductDesc( productDesc );
+    }
+
     protected String getproductID()
     {
-        return productID;
+        return productInfo.productID;
     }
 }

From bef7598104abd76a4042da05714fe7e19bf903c0 Mon Sep 17 00:00:00 2001
From: oceanbest <13844090289@163.com>
Date: Sun, 18 Jun 2017 16:03:27 +0800
Subject: [PATCH 168/332] first

---
 students/1418243288/readme.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/students/1418243288/readme.md b/students/1418243288/readme.md
index 6f447ec300..51e5d8cd57 100644
--- a/students/1418243288/readme.md
+++ b/students/1418243288/readme.md
@@ -1,2 +1,2 @@
-﻿测试下心上传的值
-
+﻿测试下新上传的值
+#test

From 9c4a3ca9b1b2e66856cc1814f15de2275bf6526b Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 16:04:03 +0800
Subject: [PATCH 169/332] Extracted ProductInfo.java

---
 .../com/coderising/ood/srp/ProductInfo.java   |  4 +-
 .../com/coderising/ood/srp/PromotionMail.java | 73 ++++++++-----------
 2 files changed, 34 insertions(+), 43 deletions(-)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
index 9e3caa1f57..c210afb014 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -12,8 +12,8 @@
 
 public class ProductInfo
 {
-    public String productID = null;
-    public String productDesc = null;
+    private String productID = null;
+    private String productDesc = null;
 
     public ProductInfo() { }
 
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 065c6d0980..60f0daec06 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -16,27 +16,26 @@
 
 public class PromotionMail
 {
-    private static final String NAME_KEY  = "NAME";
-    private static final String EMAIL_KEY = "EMAIL";
-    private Configuration config;
-    private FileUtil    fileUtil      = new FileUtil();
-    private String      sendMailQuery = null;
-    private String      smtpHost      = null;
-    private String      altSmtpHost   = null;
-    private String      fromAddress   = null;
-    private String      toAddress     = null;
-    private String      subject       = null;
-    private String      message       = null;
-    private ProductInfo productInfo   = new ProductInfo();
-    private boolean emailDebug;
+    private static final String        NAME_KEY      = "NAME";
+    private static final String        EMAIL_KEY     = "EMAIL";
+    private              Configuration config        = new Configuration();
+    private              ProductInfo   productInfo   = new ProductInfo();
+    private              FileUtil      fileUtil      = new FileUtil();
+    private              boolean       emailDebug    = false;
+    private              String        sendMailQuery = null;
+    private              String        smtpHost      = null;
+    private              String        altSmtpHost   = null;
+    private              String        fromAddress   = null;
+    private              String        toAddress     = null;
+    private              String        subject       = null;
+    private              String        message       = null;
 
     public PromotionMail( File file, boolean mailDebug ) throws Exception
     {
         this.emailDebug = mailDebug;
         readProductInfos( file );
         configuringEMAILSetting();
-        setLoadQuery();
-        List mailingList = loadMailingList();
+        List mailingList = queryMailingList();
         sendEMails( mailDebug, mailingList );
     }
 
@@ -45,28 +44,21 @@ private void readProductInfos( File file ) throws IOException
         String[] productInfos = fileUtil.readFile( file );
         productInfo.setProductID( productInfos[ 0 ] );
         productInfo.setProductDesc( productInfos[ 1 ] );
-        System.out.println( "产品ID = " + productInfo.productID + "\n" );
-        System.out.println( "产品描述 = " + productInfo.productDesc + "\n" );
+        System.out.println( "产品ID = " + productInfo.getProductID() + "\n" );
+        System.out.println( "产品描述 = " + productInfo.getProductDesc() + "\n" );
     }
 
     private void configuringEMAILSetting()
     {
-        config = new Configuration();
         setSMTPHost();
         setAltSMTPHost();
         setFromAddress();
     }
 
-    protected void setLoadQuery() throws Exception
-    {
-        sendMailQuery
-                = "Select name from subscriptions " + "where product_id= '" + productInfo.productID + "' " + "and send_mail=1 ";
-        System.out.println( "loadQuery set" );
-    }
-
-    protected List loadMailingList() throws Exception
+    private List queryMailingList() throws Exception
     {
-        return DBUtil.query( this.sendMailQuery );
+        setLoadQuery();
+        return loadMailingList();
     }
 
     protected void sendEMails( boolean debug, List mailingList ) throws IOException
@@ -120,6 +112,18 @@ protected void setFromAddress()
         fromAddress = config.getProperty( ConfigurationKeys.EMAIL_ADMIN );
     }
 
+    protected void setLoadQuery() throws Exception
+    {
+        sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productInfo
+                .getProductID() + "' " + "and send_mail=1 ";
+        System.out.println( "loadQuery set" );
+    }
+
+    protected List loadMailingList() throws Exception
+    {
+        return DBUtil.query( this.sendMailQuery );
+    }
+
     protected void configureEMail( HashMap userInfo ) throws IOException
     {
         toAddress = ( String ) userInfo.get( EMAIL_KEY );
@@ -133,7 +137,7 @@ protected void setMessage( HashMap userInfo ) throws IOException
     {
         String name = ( String ) userInfo.get( NAME_KEY );
         subject = "您关注的产品降价了";
-        message = "尊敬的 " + name + ", 您关注的产品 " + productInfo.productDesc + " 降价了，欢迎购买!";
+        message = "尊敬的 " + name + ", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!";
     }
 
     public static void main( String[] args ) throws Exception
@@ -144,18 +148,5 @@ public static void main( String[] args ) throws Exception
         PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
     }
 
-    private void setProductID( String productID )
-    {
-        productInfo.setProductID( productID );
-    }
-
-    private void setProductDesc( String productDesc )
-    {
-        productInfo.setProductDesc( productDesc );
-    }
 
-    protected String getproductID()
-    {
-        return productInfo.productID;
-    }
 }

From 9bd07941e7a4380e9c402e5ccaa3efb385b803c9 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 16:23:47 +0800
Subject: [PATCH 170/332] Extracted ProductPromotionDAO.java

---
 .../java/com/coderising/ood/srp/DBUtil.java   |  40 ++++---
 .../ood/srp/ProductPromotionDAO.java          |  31 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 103 ++++++++----------
 3 files changed, 100 insertions(+), 74 deletions(-)
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
index c145b7440b..9d2ae5d967 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -7,25 +7,31 @@
  **********************************************************************************************************************/
 
 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;
-	}
+public class DBUtil
+{
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     *
+     * @param sql
+     *
+     * @return
+     */
+    public static List< HashMap > query( String sql )
+    {
+        List< HashMap > userList = new ArrayList();
+        for ( int i = 1; i <= 3; i++ )
+        {
+            HashMap< String, String > userInfo = new HashMap();
+            userInfo.put( "NAME", "User" + i );
+            userInfo.put( "EMAIL", "aa@bb.com" );
+            userList.add( userInfo );
+        }
+        return userList;
+    }
 }
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java
new file mode 100644
index 0000000000..eb7e6c8719
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java
@@ -0,0 +1,31 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class ProductPromotionDAO
+{
+    private String sendMailQuery = null;
+
+    public ProductPromotionDAO() { }
+
+    public void setLoadQuery( String productID ) throws Exception
+    {
+        sendMailQuery
+                = "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+        System.out.println( "loadQuery set" );
+    }
+
+    public List<HashMap > loadMailingList() throws Exception
+    {
+        return DBUtil.query( this.sendMailQuery );
+    }
+}
\ No newline at end of file
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 60f0daec06..5a86b7fedf 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -16,27 +16,28 @@
 
 public class PromotionMail
 {
-    private static final String        NAME_KEY      = "NAME";
-    private static final String        EMAIL_KEY     = "EMAIL";
-    private              Configuration config        = new Configuration();
-    private              ProductInfo   productInfo   = new ProductInfo();
-    private              FileUtil      fileUtil      = new FileUtil();
-    private              boolean       emailDebug    = false;
-    private              String        sendMailQuery = null;
-    private              String        smtpHost      = null;
-    private              String        altSmtpHost   = null;
-    private              String        fromAddress   = null;
-    private              String        toAddress     = null;
-    private              String        subject       = null;
-    private              String        message       = null;
+    private static final String              NAME_KEY            = "NAME";
+    private static final String              EMAIL_KEY           = "EMAIL";
+    private              ProductPromotionDAO productPromotionDAO = new ProductPromotionDAO();
+    private              Configuration       config              = new Configuration();
+    private              ProductInfo         productInfo         = new ProductInfo();
+    private              FileUtil            fileUtil            = new FileUtil();
+    private              boolean             emailDebug          = false;
+    private              String              smtpHost            = null;
+    private              String              altSmtpHost         = null;
+    private              String              fromAddress         = null;
+    private              String              toAddress           = null;
+    private              String              subject             = null;
+    private              String              message             = null;
+    private              List< HashMap >     mailingList         = null;
+
 
     public PromotionMail( File file, boolean mailDebug ) throws Exception
     {
         this.emailDebug = mailDebug;
         readProductInfos( file );
         configuringEMAILSetting();
-        List mailingList = queryMailingList();
-        sendEMails( mailDebug, mailingList );
+        mailingList = queryMailingList();
     }
 
     private void readProductInfos( File file ) throws IOException
@@ -55,13 +56,37 @@ private void configuringEMAILSetting()
         setFromAddress();
     }
 
-    private List queryMailingList() throws Exception
+    private List< HashMap > queryMailingList() throws Exception
+    {
+        productPromotionDAO.setLoadQuery( productInfo.getProductID() );
+        return productPromotionDAO.loadMailingList();
+    }
+
+    protected void setSMTPHost()
+    {
+        smtpHost = config.getProperty( ConfigurationKeys.SMTP_SERVER );
+    }
+
+    protected void setAltSMTPHost()
     {
-        setLoadQuery();
-        return loadMailingList();
+        altSmtpHost = config.getProperty( ConfigurationKeys.ALT_SMTP_SERVER );
     }
 
-    protected void sendEMails( boolean debug, List mailingList ) throws IOException
+    protected void setFromAddress()
+    {
+        fromAddress = config.getProperty( ConfigurationKeys.EMAIL_ADMIN );
+    }
+
+    public static void main( String[] args ) throws Exception
+    {
+        File productPromotionFile = new File(
+                "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt" );
+        boolean       emailDebug = false;
+        PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
+        pe.sendEMails();
+    }
+
+    protected void sendEMails() throws IOException
     {
         System.out.println( "开始发送邮件" );
         if ( mailingList != null )
@@ -74,14 +99,14 @@ protected void sendEMails( boolean debug, List mailingList ) throws IOException
                 {
                     if ( toAddress.length() > 0 )
                     {
-                        MailUtil.sendEmail( toAddress, fromAddress, subject, message, smtpHost, debug );
+                        MailUtil.sendEmail( toAddress, fromAddress, subject, message, smtpHost, emailDebug );
                     }
                 }
                 catch ( Exception e )
                 {
                     try
                     {
-                        MailUtil.sendEmail( toAddress, fromAddress, subject, message, altSmtpHost, debug );
+                        MailUtil.sendEmail( toAddress, fromAddress, subject, message, altSmtpHost, emailDebug );
                     }
                     catch ( Exception e2 )
                     {
@@ -97,33 +122,6 @@ protected void sendEMails( boolean debug, List mailingList ) throws IOException
 
     }
 
-    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 setLoadQuery() throws Exception
-    {
-        sendMailQuery = "Select name from subscriptions " + "where product_id= '" + productInfo
-                .getProductID() + "' " + "and send_mail=1 ";
-        System.out.println( "loadQuery set" );
-    }
-
-    protected List loadMailingList() throws Exception
-    {
-        return DBUtil.query( this.sendMailQuery );
-    }
-
     protected void configureEMail( HashMap userInfo ) throws IOException
     {
         toAddress = ( String ) userInfo.get( EMAIL_KEY );
@@ -140,13 +138,4 @@ protected void setMessage( HashMap userInfo ) throws IOException
         message = "尊敬的 " + name + ", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!";
     }
 
-    public static void main( String[] args ) throws Exception
-    {
-        File productPromotionFile = new File(
-                "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt" );
-        boolean       emailDebug = false;
-        PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
-    }
-
-
 }

From c3de70dd0d47d2e93077a47b023815443d2d5c41 Mon Sep 17 00:00:00 2001
From: "Z_Z.W" <myhongkongzhen@gmail.com>
Date: Sun, 18 Jun 2017 16:28:31 +0800
Subject: [PATCH 171/332] Refactored code structure

---
 .../com/coderising/ood/srp/Configuration.java | 28 ---------------
 .../com/coderising/ood/srp/PromotionMail.java | 10 ++++--
 .../ood/srp/common/Configuration.java         | 36 +++++++++++++++++++
 .../srp/{ => common}/ConfigurationKeys.java   |  2 +-
 .../srp/{ => dao}/ProductPromotionDAO.java    |  4 ++-
 .../coderising/ood/srp/{ => util}/DBUtil.java |  2 +-
 .../ood/srp/{ => util}/FileUtil.java          |  2 +-
 .../ood/srp/{ => util}/MailUtil.java          |  2 +-
 .../ood/srp/{ => vo}/ProductInfo.java         |  2 +-
 .../srp => resources}/product_promotion.txt   |  0
 10 files changed, 52 insertions(+), 36 deletions(-)
 delete mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java
 rename students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/{ => common}/ConfigurationKeys.java (96%)
 rename students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/{ => dao}/ProductPromotionDAO.java (94%)
 rename students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/{ => util}/DBUtil.java (97%)
 rename students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/{ => util}/FileUtil.java (97%)
 rename students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/{ => util}/MailUtil.java (97%)
 rename students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/{ => vo}/ProductInfo.java (98%)
 rename students/511134962/ood-assignment/src/main/{java/com/coderising/ood/srp => resources}/product_promotion.txt (100%)

diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
deleted file mode 100644
index af99642b9d..0000000000
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.ood.srp;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration
-{
-    static Map< String, String > 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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 5a86b7fedf..aae91db287 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -8,6 +8,13 @@
 
 package com.coderising.ood.srp;
 
+import com.coderising.ood.srp.common.Configuration;
+import com.coderising.ood.srp.common.ConfigurationKeys;
+import com.coderising.ood.srp.dao.ProductPromotionDAO;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.vo.ProductInfo;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -79,8 +86,7 @@ protected void setFromAddress()
 
     public static void main( String[] args ) throws Exception
     {
-        File productPromotionFile = new File(
-                "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt" );
+        File productPromotionFile = new File( "D:\\02_workspace\\myproject\\coding2017\\students\\511134962\\ood-assignment\\src\\main\\resources\\product_promotion.txt" );
         boolean       emailDebug = false;
         PromotionMail pe         = new PromotionMail( productPromotionFile, emailDebug );
         pe.sendEMails();
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java
new file mode 100644
index 0000000000..331f204e58
--- /dev/null
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/Configuration.java
@@ -0,0 +1,36 @@
+/**********************************************************************************************************************
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.                                       *
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.                        *
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.                                                   *
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.                     *
+ * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
+ **********************************************************************************************************************/
+
+package com.coderising.ood.srp.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration
+{
+    static Map< String, String > 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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java
similarity index 96%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java
index 16eda31c95..fa6b1ec04a 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java
@@ -6,7 +6,7 @@
  * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
  **********************************************************************************************************************/
 
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.common;
 
 public class ConfigurationKeys {
 	public static final String SMTP_SERVER = "smtp.server";
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java
similarity index 94%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java
rename to students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java
index eb7e6c8719..62b8c05710 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductPromotionDAO.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java
@@ -6,7 +6,9 @@
  * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
  **********************************************************************************************************************/
 
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.util.DBUtil;
 
 import java.util.HashMap;
 import java.util.List;
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
similarity index 97%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
index 9d2ae5d967..832ba0408a 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -6,7 +6,7 @@
  * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
  **********************************************************************************************************************/
 
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.util;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
similarity index 97%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
rename to students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
index 7e6d1ba355..963eb72001 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -6,7 +6,7 @@
  * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
  **********************************************************************************************************************/
 
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.util;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
similarity index 97%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
rename to students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
index a8939d2f01..cac1a23f8d 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -6,7 +6,7 @@
  * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
  **********************************************************************************************************************/
 
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.util;
 
 public class MailUtil {
 
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java
similarity index 98%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
rename to students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java
index c210afb014..3bd52e942d 100644
--- a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
+++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java
@@ -6,7 +6,7 @@
  * Vestibulum commodo. Ut rhoncus gravida arcu.                                                                       *
  **********************************************************************************************************************/
 
-package com.coderising.ood.srp;
+package com.coderising.ood.srp.vo;
 
 import java.util.Objects;
 
diff --git a/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/511134962/ood-assignment/src/main/resources/product_promotion.txt
similarity index 100%
rename from students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/511134962/ood-assignment/src/main/resources/product_promotion.txt

From a4dcbcaa1877fedf354d93ee0b4278a33ce0c84d Mon Sep 17 00:00:00 2001
From: lqhtmc <252705978@qq.com>
Date: Sun, 18 Jun 2017 16:30:37 +0800
Subject: [PATCH 172/332] ood srp homework

---
 students/252705978/ood/srp/pom.xml            | 32 ++++++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++++
 .../coderising/ood/srp/ConfigurationUtil.java | 31 +++++++++++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 +++++++++
 .../java/com/coderising/ood/srp/FileUtil.java | 28 ++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 52 +++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  | 41 +++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 27 ++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 10 files changed, 272 insertions(+)
 create mode 100644 students/252705978/ood/srp/pom.xml
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/252705978/ood/srp/pom.xml b/students/252705978/ood/srp/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/252705978/ood/srp/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Configuration.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/252705978/ood/srp/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<String,String> 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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/252705978/ood/srp/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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java
new file mode 100644
index 0000000000..3f5d95cc50
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/ConfigurationUtil.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+
+/**
+ * 邮件配置工具类
+ * 
+ * @author lin
+ * @since
+ */
+public class ConfigurationUtil {
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+    public static void configure(PromotionMail mail, Configuration config) {
+        mail.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        mail.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        mail.fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+
+    }
+
+    public static void configure2(PromotionMail mail, HashMap userInfo, Product product) {
+        mail.toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (mail.toAddress.length() > 0) {
+            String name = (String) userInfo.get(NAME_KEY);
+
+            mail.subject = "您关注的产品降价了";
+            mail.message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        }
+    }
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/252705978/ood/srp/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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..f9c67fea16
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * 文件工具类
+ * 
+ * @author lin
+ * @since
+ */
+public class FileUtil {
+    public static String[] readFile(File file) throws IOException {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+            return data;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..04bab2b8a9
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+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());
+
+    }
+
+    @SuppressWarnings("rawtypes")
+    public static void sendEMails(PromotionMail mail, Configuration config, boolean debug, Product product, List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件");
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                ConfigurationUtil.configure2(mail, (HashMap) iter.next(), product);
+                try {
+                    if (mail.toAddress.length() > 0)
+                        MailUtil.sendEmail(mail.toAddress, mail.fromAddress, mail.subject, mail.message, mail.smtpHost, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(mail.toAddress, mail.fromAddress, mail.subject, mail.message, mail.altSmtpHost, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+        }
+
+        else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..833b2a98f5
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp;
+
+/**
+ * 产品实体类
+ * 
+ * @author lin
+ * @since
+ */
+public class Product {
+    private String productID;
+    private String productDesc;
+
+    public Product() {
+    }
+
+    public Product(String productID, String productDesc) {
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    public Product(String[] strs) {
+        setProductID(strs[0]);
+        setProductDesc(strs[1]);
+    }
+
+    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/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..83af138d3b
--- /dev/null
+++ b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+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;
+
+    public PromotionMail() {
+    };
+
+    public static void main(String[] args) throws Exception {
+        PromotionMail mail = new PromotionMail();
+        Product product = new Product(FileUtil.readFile(new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt")));
+        Configuration config = new Configuration();
+        ConfigurationUtil.configure(mail, config);
+        MailUtil.sendEMails(mail, config, false, product, DBUtil.query(mail.sendMailQuery));
+    }
+
+}
diff --git a/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/252705978/ood/srp/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/252705978/ood/srp/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

From 3c7f44b792cb9a5e494673229b6c0b7238a8257c Mon Sep 17 00:00:00 2001
From: oceanbest <13844090289@163.com>
Date: Sun, 18 Jun 2017 16:41:03 +0800
Subject: [PATCH 173/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1418243288/readme.md | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/students/1418243288/readme.md b/students/1418243288/readme.md
index 51e5d8cd57..fcb796bdef 100644
--- a/students/1418243288/readme.md
+++ b/students/1418243288/readme.md
@@ -1,2 +1,5 @@
 ﻿测试下新上传的值
-#test
+#test 
+
+#试试对不对#
+public void main

From 03e2ed4a68fa5932dcf9443a84c1a4139a098eb4 Mon Sep 17 00:00:00 2001
From: easonzhang1992 <easonzhang1992@gmail.com>
Date: Sun, 18 Jun 2017 16:52:07 +0800
Subject: [PATCH 174/332] =?UTF-8?q?=E9=87=8D=E6=9E=84sendMail=E6=A8=A1?=
 =?UTF-8?q?=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/Configuration.java | 10 ++++
 .../src/com/coderising/ood/srp/DBUtil.java    | 25 ++++++++++
 .../src/com/coderising/ood/srp/MailUtil.java  | 46 +++++++++++++++++++
 .../src/com/coderising/ood/srp/Product.java   | 25 ++++++++++
 .../com/coderising/ood/srp/ProductUtil.java   | 34 ++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 32 +++++++++++++
 .../src/com/coderising/ood/srp/User.java      | 27 +++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 8 files changed, 203 insertions(+)
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/Product.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/User.java
 create mode 100644 students/1058267830/newMail/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java b/students/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f1fe384d94
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+public class Configuration {
+	
+	public static final String SMTP_SERVER = "smtp.163.com";
+	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
+	public static final String EMAIL_ADMIN = "admin@company.com";
+	public static final String PRODUCTS_FILE_PATH = "D:\\workspace\\design-pattern\\newMail\\src\\com\\coderising\\ood\\srp\\product_promotion.txt";
+	
+}
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/DBUtil.java b/students/1058267830/newMail/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..ec4dd0fddb
--- /dev/null
+++ b/students/1058267830/newMail/src/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;
+
+@SuppressWarnings("all")
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> queryUserList(String sql){
+		
+		List<User> userList = new ArrayList();
+		
+		for (int i = 1; i <= 3; i++) {
+			User user = new User("User" + i, "aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java b/students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..77f7699825
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class MailUtil {
+	
+	public static void sendEmail(List<Product> products, List<User> users){
+		
+		for(Product p : products){
+			for(User u : users){
+				sendEmailToUser(p, u);
+			}
+		}
+		
+	}
+
+	private static void sendEmailToUser(Product product, User user) {
+
+		String message = "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+		
+		String fromAddress = Configuration.EMAIL_ADMIN;
+		String subject = "您关注的产品降价了";
+		String smtpHost = Configuration.SMTP_SERVER;
+		String altSmtpHost = Configuration.ALT_SMTP_SERVER;
+		
+		try{
+			_sendEmailReal(user.getEmail(), fromAddress, subject, message, smtpHost, false);
+		}catch(Exception e){
+			_sendEmailReal(user.getEmail(), fromAddress, subject, message, altSmtpHost, false);
+		}
+		
+	}
+	
+	private static void _sendEmailReal(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/1058267830/newMail/src/com/coderising/ood/srp/Product.java b/students/1058267830/newMail/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..4712c8f0ff
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String productId;
+	private String productDesc;
+	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/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java b/students/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java
new file mode 100644
index 0000000000..d49f51dc51
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/ProductUtil.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+@SuppressWarnings("all")
+public class ProductUtil {
+	/**
+	 * 得到促销产品列表,至于从哪里读取，由该方法内部决定，外部不需要知道
+	 * @throws IOException 
+	 */
+	public static List<Product> getProducts() throws IOException{
+		return readFile(new File(Configuration.PRODUCTS_FILE_PATH));
+	}
+
+	private static List<Product> readFile(File file) throws IOException {
+		List<Product> products = new ArrayList<Product>();
+		FileInputStream fis = new FileInputStream(file);
+		BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
+		for( String line = br.readLine(); line != null; line = br.readLine() ){
+			Product product = new Product(line.split(" ")[0], line.split(" ")[1]);
+			products.add(product);
+		}
+		
+		return products;
+		
+	}
+		
+}	
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java b/students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..0f6baa324e
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PromotionMail {
+
+	public static void main(String[] args) {
+		
+		/**
+		 * 整体步骤大概有3步：
+		 * 1、读取配置文件，得到促销的商品列表
+		 * 2、调用DBUtil读取DB，得到订阅的用户列表
+		 * 3、调用MailUtil发送邮件
+		 */
+		List<Product> products = new ArrayList<Product>();
+		List<User> users = new ArrayList<User>();
+		try {
+			
+			products = ProductUtil.getProducts();
+			users = DBUtil.queryUserList("select *** from t_user");
+			MailUtil.sendEmail(products, users);
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		
+	}
+
+}
diff --git a/students/1058267830/newMail/src/com/coderising/ood/srp/User.java b/students/1058267830/newMail/src/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..6a7bc15952
--- /dev/null
+++ b/students/1058267830/newMail/src/com/coderising/ood/srp/User.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp;
+
+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/1058267830/newMail/src/com/coderising/ood/srp/product_promotion.txt b/students/1058267830/newMail/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1058267830/newMail/src/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

From 57f042ea8e22b017a19b8fcdabbeaa64eee67d37 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Sun, 18 Jun 2017 17:24:22 +0800
Subject: [PATCH 175/332] refector

---
 .../main/java/com/coding/basic/tree/BinarySearchTreeTest.java   | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
index 590e60306c..3da4625faf 100644
--- a/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
+++ b/liuxin/data-structure/answer/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java
@@ -104,5 +104,7 @@ public void testIsValid() {
 	public void testGetNodesBetween(){
 		List<Integer> numbers = this.tree.getNodesBetween(3,  8);
 		Assert.assertEquals("[3, 4, 5, 6, 8]",numbers.toString());
+		numbers = this.tree.getNodesBetween(1,  8);
+		Assert.assertEquals("[1, 2, 3, 4, 5, 6, 8]",numbers.toString());
 	}
 }

From 8071d7dd4a7eefc09f2e585be7cf0e9a8bc0ec5d Mon Sep 17 00:00:00 2001
From: XMT-CN <542194147@qq.com>
Date: Sun, 18 Jun 2017 17:36:33 +0800
Subject: [PATCH 176/332] =?UTF-8?q?ood=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/542194147/pom.xml                    |  6 ++
 .../ood/srp/config/Configuration.java         | 23 +++++
 .../ood/srp/config/ConfigurationKeys.java     |  9 ++
 .../com/coderising/ood/srp/domain/Email.java  | 55 ++++++++++++
 .../coderising/ood/srp/domain/Product.java    | 28 ++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 .../ood/srp/service/NoticeService.java        | 89 +++++++++++++++++++
 .../com/coderising/ood/srp/util/DBUtil.java   | 25 ++++++
 .../com/coderising/ood/srp/util/FileUtil.java | 26 ++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 19 ++++
 10 files changed, 284 insertions(+)
 create mode 100644 students/542194147/pom.xml
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 create mode 100644 students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java

diff --git a/students/542194147/pom.xml b/students/542194147/pom.xml
new file mode 100644
index 0000000000..dfd96c3362
--- /dev/null
+++ b/students/542194147/pom.xml
@@ -0,0 +1,6 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.coding2017</groupId>
+  <artifactId>season2</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+</project>
\ No newline at end of file
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 0000000000..8474097a7e
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.config;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..7fe226d1bd
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.config;
+
+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/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java
new file mode 100644
index 0000000000..85b73ef7a4
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Email.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.srp.domain;
+
+import java.io.Serializable;
+/**
+ * 邮件实体类
+ * @author 小摩托
+ *
+ */
+public class Email implements Serializable {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	private String subject = null;
+	private String message = null;
+	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 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 getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+	
+	
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java
new file mode 100644
index 0000000000..9976f9f09c
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/domain/Product.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.domain;
+
+import java.io.Serializable;
+
+/**
+ * 产品实体类
+ * @author 小摩托
+ *
+ */
+public class Product implements Serializable {
+
+	private String productID = null;
+	private String productDesc = null;
+	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/542194147/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/542194147/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/542194147/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/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java b/students/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java
new file mode 100644
index 0000000000..53aa4b77d5
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/service/NoticeService.java
@@ -0,0 +1,89 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+import com.coderising.ood.srp.domain.Email;
+import com.coderising.ood.srp.domain.Product;
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+/**
+ * 消息发布接口
+ * @author 小摩托
+ *
+ */
+public class NoticeService {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	private static Configuration config = new Configuration();; 
+	
+	public void sendEMails(File file, boolean mailDebug) throws IOException 
+	{
+
+		String[] data=FileUtil.readFile(file);
+		Product product=new Product();
+		product.setProductID(data[0]);
+		product.setProductDesc(data[1]);
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getProductID() +"' "
+				+ "and send_mail=1 ";
+		List list=DBUtil.query(sendMailQuery);
+		System.out.println("开始发送邮件");
+		Email email=new Email();
+		if (list != null) {
+			Iterator iter = list.iterator();
+			while (iter.hasNext()) {
+				Map userInfo=(HashMap) iter.next();
+				String toAddress = (String)userInfo.get(EMAIL_KEY); 
+				email.setToAddress(toAddress);
+				email.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+				email.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+				email.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+				if (toAddress.length() > 0){
+					String name = (String)userInfo.get(NAME_KEY);
+					email.setSubject("您关注的产品降价了");
+					email.setMessage("尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!");	
+				}
+				try 
+				{
+					if (toAddress.length() > 0)
+						MailUtil.sendEmail(email);
+				} 
+				catch (Exception e) 
+				{
+					try {
+						MailUtil.sendEmail(email); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			
+
+		}
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("C:\\Users\\john\\Documents\\GitHub\\coding2017-2ndSeason\\students\\542194147\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+		boolean emailDebug = false;
+		NoticeService ns = new NoticeService();
+		ns.sendEMails(f, emailDebug);
+
+	}
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/542194147/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..886477c678
--- /dev/null
+++ b/students/542194147/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.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"+i+"@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..035ec8749f
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+
+	public static String[] readFile(File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			return data;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git a/students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..817ca96466
--- /dev/null
+++ b/students/542194147/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.domain.Email;
+
+public class MailUtil {
+
+	public static void sendEmail(Email email) {
+		//假装发了一封邮件
+		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());
+		
+	}
+
+	
+}

From d3a9325b6c8293e87b91d10da755909605fd096d Mon Sep 17 00:00:00 2001
From: '1299310140' <'13437282785@163.com'>
Date: Sun, 18 Jun 2017 17:57:44 +0800
Subject: [PATCH 177/332] =?UTF-8?q?SRP=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/com/coderising/ood/srp/CheckUtil.java |  11 +
 .../src/com/coderising/ood/srp/Product.java   |  24 +++
 .../com/coderising/ood/srp/PromotionMail.java | 197 +++++-------------
 .../src/com/coderising/ood/srp/ReadFile.java  |  34 +++
 4 files changed, 116 insertions(+), 150 deletions(-)
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/CheckUtil.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/Product.java
 create mode 100644 students/1299310140/src/com/coderising/ood/srp/ReadFile.java

diff --git a/students/1299310140/src/com/coderising/ood/srp/CheckUtil.java b/students/1299310140/src/com/coderising/ood/srp/CheckUtil.java
new file mode 100644
index 0000000000..657c4c8102
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/CheckUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp;
+
+public class CheckUtil {
+	protected static boolean checkEmail(String emailAddress){
+		if(emailAddress.length() > 0){
+			return true;
+		}else{
+			return false;
+		}
+	}
+}
diff --git a/students/1299310140/src/com/coderising/ood/srp/Product.java b/students/1299310140/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..4d1706b42b
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String id;
+	
+	private String desc;
+
+	public Product(String id, String desc) {
+		super();
+		this.id = id;
+		this.desc = desc;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public String getDesc() {
+		return desc;
+	}
+	
+	
+}
diff --git a/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java b/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
index 94bfcbaf54..aa40bc6251 100644
--- a/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
+++ b/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java
@@ -1,199 +1,96 @@
 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);
-
+		//C:\\my Program Files\\mygit\\second\\coding2017\\students\\1299310140\\src\\com\\coderising\\ood\\srp
+		String productFilePath = "C:\\my Program Files\\mygit\\second\\coding2017\\students\\1299310140\\src\\com\\coderising\\ood\\srp\\product_promotion.txt";
+		Product product = ReadFile.readProductFile(productFilePath);
 		
-		config = new Configuration();
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + product.getId() +"' "
+				+ "and send_mail=1 ";
+		List list = DBUtil.query(sendMailQuery);
 		
-		setSMTPHost();
-		setAltSMTPHost(); 
-	
-
-		setFromAddress();
-
+		if(list == null){
+			System.out.println("没有邮件发送");
+			return;
+		}
 		
-		setLoadQuery();
+		Configuration config = new Configuration();
+		PromotionMail pe = new PromotionMail(config);
+		boolean emailDebug = false;
 		
-		sendEMails(mailDebug, loadMailingList()); 
-
+		Iterator iter = list.iterator();
+		while (iter.hasNext()) {
+			HashMap userInfo = (HashMap) iter.next();
+			if(CheckUtil.checkEmail((String) userInfo.get(EMAIL_KEY))){
+				pe.setMessageAndToAddress(userInfo,product);
+				pe.sendEMails(emailDebug);
+			}
+		}
 		
 	}
 
-
-
-
-	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 ";
+	
+	public PromotionMail(Configuration config){
 		
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
 		
-		System.out.println("loadQuery set");
-	}
-
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
 	
-	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); 
+		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		
 	}
 
-	protected void setMessage(HashMap userInfo) throws IOException 
+	protected void setMessageAndToAddress(HashMap userInfo,Product product)
 	{
+		toAddress = (String) userInfo.get(EMAIL_KEY);
 		
 		String name = (String) userInfo.get(NAME_KEY);
 		
 		subject = "您关注的产品降价了";
-		message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
-				
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getDesc() + " 降价了，欢迎购买!" ;		
 		
-
-	}
-
-	
-	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 
+	protected void sendEMails(boolean debug) 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()); 
-					}
-				}
-			}
+		try 
+		{
 			
-
-		}
-
-		else {
-			System.out.println("没有邮件发送");
+				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()); 
+			}
 		}
-
 	}
 }
diff --git a/students/1299310140/src/com/coderising/ood/srp/ReadFile.java b/students/1299310140/src/com/coderising/ood/srp/ReadFile.java
new file mode 100644
index 0000000000..15aadf91b8
--- /dev/null
+++ b/students/1299310140/src/com/coderising/ood/srp/ReadFile.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ReadFile {
+	
+	protected static Product readProductFile(String productFilePath) throws IOException
+	{
+		File file = new File(productFilePath);
+		
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			Product product = new Product(data[0],data[1]);
+			
+			System.out.println("产品ID = " + product.getId() + "\n");
+			System.out.println("产品描述 = " + product.getDesc() + "\n");
+			
+			return product;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}

From d542b30a544fa8480924129e42fd25a447e669ba Mon Sep 17 00:00:00 2001
From: silencehe09 <silencehe09@gmail.com>
Date: Sun, 18 Jun 2017 18:14:22 +0800
Subject: [PATCH 178/332] initialize project

---
 students/709960951/ood/ood-assignment/pom.xml | 25 +++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 students/709960951/ood/ood-assignment/pom.xml

diff --git a/students/709960951/ood/ood-assignment/pom.xml b/students/709960951/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..837d9eeed1
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/pom.xml
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>

From ae73d968d2700ffb68cbfcc552918b757661b52e Mon Sep 17 00:00:00 2001
From: SYCHS <429301805@qq.com>
Date: Sun, 18 Jun 2017 18:34:02 +0800
Subject: [PATCH 179/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/429301805/ood-assignment/pom.xml     |  32 ++++
 .../com/coderising/ood/srp/Configuration.java |  23 +++
 .../coderising/ood/srp/ConfigurationKeys.java |  13 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../com/coderising/ood/srp/HostService.java   |  33 ++++
 .../java/com/coderising/ood/srp/MailUtil.java |  40 +++++
 .../java/com/coderising/ood/srp/Product.java  |  23 +++
 .../com/coderising/ood/srp/PromotionMail.java | 144 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 9 files changed, 337 insertions(+)
 create mode 100644 students/429301805/ood-assignment/pom.xml
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/429301805/ood-assignment/pom.xml b/students/429301805/ood-assignment/pom.xml
new file mode 100644
index 0000000000..1be81576cc
--- /dev/null
+++ b/students/429301805/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..927c7155cc
--- /dev/null
+++ b/students/429301805/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<String,String> 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/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..33e1d29f7d
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,13 @@
+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";
+	
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+	
+
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..605d196312
--- /dev/null
+++ b/students/429301805/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", "user"+i+"@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java
new file mode 100644
index 0000000000..ccb5041cad
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/HostService.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+public class HostService {
+	
+	private static String smtpHost; 
+	
+	private static String altSmtpHost;
+	
+	public static void setSMTPHost(Configuration config) 
+	{
+		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+
+	
+	public static void setAltSMTPHost(Configuration config) 
+	{
+		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
+
+
+	public static String getSmtpHost() {
+		return smtpHost;
+	}
+
+
+	public static String getAltSmtpHost() {
+		return altSmtpHost;
+	}
+	
+	
+
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..f437e0e651
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+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());
+		
+	}
+	
+	public static boolean configureEMail(HashMap userInfo,String toAddress) //throws IOException 
+	{
+		if (toAddress.length() > 0){ 
+			return true;
+		}else{
+			return false;
+		}
+	}
+	
+	public static String setFromAddress(Configuration config) 
+	{
+			String fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+			return fromAddress;
+	}
+	
+	public static String setToAddress(HashMap userInfo){
+	     String toAddress = (String) userInfo.get(ConfigurationKeys.EMAIL_KEY);
+	     return toAddress;
+	}
+	
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..5881e903ba
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+public class Product {
+	
+	private String productID;
+	private String productDesc;
+	
+	public Product(String productID,String productDesc){
+		this.productID = productID;
+		this.productDesc = productDesc;
+	}
+
+	public String getProductID() {
+		return productID;
+	}
+
+	public String getProductDesc() {
+		return productDesc;
+	}
+	
+	
+
+}
diff --git a/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..54e494a37b
--- /dev/null
+++ b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,144 @@
+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; 
+		
+	public static void main(String[] args) throws Exception {
+
+		File f = new File("C:\\Users\\CHS\\Desktop\\ood-assignment1\\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();
+		
+		initService(config);
+					
+		setLoadQuery();
+		
+		sendEMails(mailDebug, loadMailingList()); 
+
+		
+	}
+
+	protected void initService(Configuration config) {
+		HostService.setSMTPHost(config);
+		HostService.setAltSMTPHost(config);
+		smtpHost = HostService.getSmtpHost();
+		altSmtpHost = HostService.getAltSmtpHost();
+		fromAddress = MailUtil.setFromAddress(config);
+	}
+
+	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 setMessage(HashMap userInfo) throws IOException 
+	{
+		
+		String name = (String) userInfo.get(ConfigurationKeys.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(" ");
+			
+			Product p = new Product(data[0], data[1]);
+			productID = p.getProductID();
+			productDesc = p.getProductDesc();
+			
+			System.out.println("产品ID = " + productID + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	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()) {
+				HashMap userInfo = (HashMap) iter.next();
+				toAddress = MailUtil.setToAddress(userInfo);
+				if(MailUtil.configureEMail(userInfo,toAddress))
+					setMessage(userInfo);
+				else
+					System.out.println("用户信息不正确！");
+				try 
+				{
+						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/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/429301805/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/429301805/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

From 86c532793e1ff379a7ea8f2c7541ca8acffad241 Mon Sep 17 00:00:00 2001
From: gordon <18852861966@163.com>
Date: Sun, 18 Jun 2017 18:51:39 +0800
Subject: [PATCH 180/332] ood_test
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

第一次ood邮件发送重构
---
 .../com/coderising/ood/srp/Configuration.java |  26 +++
 .../coderising/ood/srp/ConfigurationKeys.java |  10 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  28 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  19 ++
 .../com/coderising/ood/srp/PromotionMail.java | 202 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../org/coderising/liteaop/Configuration.java |  55 +++++
 .../coderising/liteaop/ConfigurationKeys.java |  12 ++
 .../java/org/coderising/liteaop/DBUtil.java   |  29 +++
 .../org/coderising/liteaop/EmailUtil.java     |  96 +++++++++
 .../java/org/coderising/liteaop/Mail.java     |  80 +++++++
 .../org/coderising/liteaop/ProductUtil.java   |  33 +++
 .../org/coderising/liteaop/Production.java    |  20 ++
 .../java/org/coderising/liteaop/User.java     |  21 ++
 .../java/org/coderising/liteaop/UserUtil.java |  24 +++
 .../java/org/coderising/liteaop/fileUtil.java |  39 ++++
 .../org/coderising/liteaop/promotionMail.java |  26 +++
 17 files changed, 724 insertions(+)
 create mode 100644 students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/505217361/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/Configuration.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/DBUtil.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/Mail.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/Production.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/User.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java
 create mode 100644 students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java

diff --git a/students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java b/students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..efd3c58820
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package main.java.com.coderising.ood.srp;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+}
+ 
\ No newline at end of file
diff --git a/students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..b927dbac2f
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+package main.java.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/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..3f7760a6e7
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,28 @@
+package main.java.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/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..f422fd9088
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,19 @@
+package main.java.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/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..6796f35858
--- /dev/null
+++ b/students/505217361/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,202 @@
+package main.java.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("E:/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 {
+			System.out.println("进入");
+			br = new BufferedReader(new FileReader(file));
+			System.out.println("br");
+			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/505217361/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/505217361/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/505217361/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/505217361/src/test/java/org/coderising/liteaop/Configuration.java b/students/505217361/src/test/java/org/coderising/liteaop/Configuration.java
new file mode 100644
index 0000000000..06dde10147
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/Configuration.java
@@ -0,0 +1,55 @@
+package test.java.org.coderising.liteaop;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class Configuration {
+
+	
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	static Map<String,String> 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);
+	}
+	
+	protected String setSMTPHost() 
+	{
+		smtpHost =  getProperty(ConfigurationKeys.SMTP_SERVER); 
+		return smtpHost;
+	}
+
+	
+	protected String setAltSMTPHost() 
+	{
+		altSmtpHost = getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+		return altSmtpHost;
+	}
+
+	
+	protected String setFromAddress() 
+	{
+			fromAddress = getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+			return fromAddress;
+	}
+
+
+
+}
+ 
\ No newline at end of file
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java b/students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java
new file mode 100644
index 0000000000..8471dcf4a0
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/ConfigurationKeys.java
@@ -0,0 +1,12 @@
+package test.java.org.coderising.liteaop;
+
+
+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/505217361/src/test/java/org/coderising/liteaop/DBUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/DBUtil.java
new file mode 100644
index 0000000000..23ec85320d
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/DBUtil.java
@@ -0,0 +1,29 @@
+package test.java.org.coderising.liteaop;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	/* 
+	 * 数据库交互类
+	 * */
+	
+	// 假设这个是获取人员的数据库交互
+	public List executeQuery(String sql){
+		System.out.println("execute sql ");
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			
+			User user = new User();
+			user.setUsername("User"+i);
+			user.setEmailadd("aa@bb.com");
+			userList.add(user);
+			
+		}
+
+		return userList;
+		
+	}
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java
new file mode 100644
index 0000000000..0e1d84fa64
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/EmailUtil.java
@@ -0,0 +1,96 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+
+
+public class EmailUtil {
+	
+	private static final String EMAIL_KEY = "EMAIL";
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	protected String subject  = null;
+	protected String message  = null;
+	
+	
+	
+	public void sendEmail(List users,Production product){
+		boolean debugs = false;
+		// 获取配置信息
+		Configuration config = new Configuration(); 	
+		smtpHost = config.setSMTPHost();
+		altSmtpHost = config.setAltSMTPHost();
+		fromAddress = config.setFromAddress();
+		System.out.println("开始发送邮件");
+		if(users != null){
+			Iterator iter = users.iterator();
+			while(iter.hasNext()){
+				User user = (User) iter.next();
+				String userEmail = user.getEmailadd();
+				String userName = user.getUsername();
+				
+				// 获取输入值
+				setMessage(userName,product);
+				
+				try{
+					if(userEmail.length()>0){
+						Mail mail = new Mail();
+						mail.setFromAddress(fromAddress);
+						mail.setUserEmail(userEmail);
+						mail.setSmtpHost(altSmtpHost);
+						mail.setSubject(subject);
+						mail.setMessage(message);
+						
+						mail.sendEmail(debugs);
+						
+					}
+				}catch(Exception e ){
+					try{
+						
+							Mail mail = new Mail();
+							mail.setFromAddress(fromAddress);
+							mail.setUserEmail(userEmail);
+							mail.setSmtpHost(altSmtpHost);
+							mail.setSubject(subject);
+							mail.setMessage(message);
+							
+							System.out.println("使用备用服务器地址发送邮件!");
+							mail.sendEmail(debugs);
+							
+						
+					}catch(Exception e2){
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+				
+				
+			}
+		}else {
+			System.out.println("没有邮件发送");
+			
+		}
+		
+		
+	}
+
+	
+
+	protected void setMessage(String username,Production product) 
+	{
+	
+		String name = username;		
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;		
+		
+	}
+
+
+
+
+
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/Mail.java b/students/505217361/src/test/java/org/coderising/liteaop/Mail.java
new file mode 100644
index 0000000000..ddb5fa8bc1
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/Mail.java
@@ -0,0 +1,80 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+
+public class Mail {
+	String fromAddress;
+	String userEmail;
+	String smtpHost;
+	String subject;
+	String message;
+	
+	
+	public String getFromAddress() {
+		return fromAddress;
+	}
+
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+
+	public String getUserEmail() {
+		return userEmail;
+	}
+
+
+	public void setUserEmail(String userEmail) {
+		this.userEmail = userEmail;
+	}
+
+
+	public String getSmtpHost() {
+		return smtpHost;
+	}
+
+
+	public void setSmtpHost(String smtpHost) {
+		this.smtpHost = smtpHost;
+	}
+
+
+	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  void sendEmail(boolean debug) {
+		
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(fromAddress).append("\n");
+		buffer.append("To:").append(userEmail).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/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java
new file mode 100644
index 0000000000..40434158f4
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/ProductUtil.java
@@ -0,0 +1,33 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.File;
+
+public class ProductUtil {
+	/* 
+	获取促销产品
+	*/
+	
+	// 存放产品信息文本
+	
+	Production product ;
+	
+	public Production getPromotionalProduct(){
+		
+	//	filepath 产品信息路径
+		String filepath = "E:/product_promotion.txt";
+		
+		try{
+			fileUtil fu = new fileUtil();
+			
+			product  = fu.readFile(filepath);
+						
+		}catch(Exception e){
+			
+			e.printStackTrace();
+		}
+		
+		return product;
+		
+	}
+
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/Production.java b/students/505217361/src/test/java/org/coderising/liteaop/Production.java
new file mode 100644
index 0000000000..c148a98fab
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/Production.java
@@ -0,0 +1,20 @@
+package test.java.org.coderising.liteaop;
+
+public class Production {
+	String productID;
+	String ProductDesc;
+	public String getProductID() {
+		return productID;
+	}
+	public void setProductID(String productID) {
+		this.productID = productID;
+	}
+	public String getProductDesc() {
+		return ProductDesc;
+	}
+	public void setProductDesc(String productDesc) {
+		ProductDesc = productDesc;
+	}
+
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/User.java b/students/505217361/src/test/java/org/coderising/liteaop/User.java
new file mode 100644
index 0000000000..683733054b
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/User.java
@@ -0,0 +1,21 @@
+package test.java.org.coderising.liteaop;
+
+public class User {
+	public String username ;
+	public String emailadd;
+	public String getUsername() {
+		return username;
+	}
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	public String getEmailadd() {
+		return emailadd;
+	}
+	public void setEmailadd(String emailadd) {
+		this.emailadd = emailadd;
+	}
+	
+	
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java
new file mode 100644
index 0000000000..66e4f63e29
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/UserUtil.java
@@ -0,0 +1,24 @@
+package test.java.org.coderising.liteaop;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class UserUtil {
+	
+	// 获取有关注相关产品信息的用户
+	public List getSubscriptionUser(String productID){
+		String sql = "Select name from subscriptions "
+			+ "where product_id= '" + productID +"' "
+			+ "and send_mail=1 ";
+		
+		DBUtil dbu = new DBUtil();
+		List users = dbu.executeQuery(sql);
+		
+		System.out.println("loadQuery set");
+		return users;
+		
+	}
+	
+	
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java b/students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java
new file mode 100644
index 0000000000..2bc83a0213
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/fileUtil.java
@@ -0,0 +1,39 @@
+package test.java.org.coderising.liteaop;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class fileUtil {
+	
+	Production product;
+	
+	public Production  readFile (String filepath) throws IOException // @02C
+	{
+		File file_product = new File("E:/product_promotion.txt");
+		
+		BufferedReader br = null;
+		try {
+			
+			br = new BufferedReader(new FileReader(file_product));
+			
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			product = new Production();
+			product.setProductID(data[0]); 
+			product.setProductDesc(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 product;
+		
+	}
+}
diff --git a/students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java b/students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java
new file mode 100644
index 0000000000..87e1438634
--- /dev/null
+++ b/students/505217361/src/test/java/org/coderising/liteaop/promotionMail.java
@@ -0,0 +1,26 @@
+package test.java.org.coderising.liteaop;
+
+import java.util.List;
+
+public class promotionMail {
+	
+		public static void main(String[] args) {
+			// 促销邮件
+			
+			// 促销产品 
+			ProductUtil pp = new ProductUtil();
+			Production product = pp.getPromotionalProduct();
+			
+			// 获得订阅人员		
+			UserUtil uu = new UserUtil();
+			List userlist = uu.getSubscriptionUser(product.getProductID());
+			
+			// 发送邮件
+			EmailUtil eu = new EmailUtil();
+			eu.sendEmail(userlist,product);
+				
+		}	
+		
+		
+	
+}

From e55c2b9e8d209531ec41b0d6547d88c5a2b11a1a Mon Sep 17 00:00:00 2001
From: Kimi <zhoushuiqing05@hotmail.com>
Date: Sun, 18 Jun 2017 20:31:47 +0800
Subject: [PATCH 181/332] [MI] refactor email feature

---
 students/349166103/ood/ood-assignment/pom.xml | 32 +++++++
 .../com/coderising/ood/srp/Configuration.java | 67 +++++++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   | 93 +++++++++++++++++++
 .../com/coderising/ood/srp/MailContent.java   | 54 +++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 52 +++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 33 +++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 8 files changed, 344 insertions(+)
 create mode 100644 students/349166103/ood/ood-assignment/pom.xml
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/349166103/ood/ood-assignment/pom.xml b/students/349166103/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..80d83d3a81
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,67 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+	private String fromAddress = null;
+	
+	static Map<String,String> 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);
+	}
+	
+	public Configuration(){
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+	
+	
+	private void setSMTPHost() 
+	{
+		smtpHost = ConfigurationKeys.SMTP_SERVER; 
+	}
+	
+	private void setAltSMTPHost() 
+	{
+		altSmtpHost = ConfigurationKeys.ALT_SMTP_SERVER; 
+
+	}
+
+	private void setFromAddress()
+	{
+		fromAddress = ConfigurationKeys.EMAIL_ADMIN;
+	}
+	
+	public String getFromAddress() 
+	{
+		return fromAddress;
+	}
+	
+	public String getSMTPHost()
+	{
+		return smtpHost;
+	}
+	
+	public String getAltSMTPHost()
+	{
+		return altSmtpHost;
+	}
+
+	
+
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/349166103/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/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..1c9afcdfb2
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,93 @@
+package com.coderising.ood.srp;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	private String sendMailQuery = null;
+	private String productID = null;
+	private String productDesc = null;
+	private File f = null;
+	
+	DBUtil(File f){
+		try {
+			readFile(f);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @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;
+	}
+	
+	public List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+	
+	private void setLoadQuery() throws Exception {
+		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + getProductID() +"' "
+				+ "and send_mail=1 ";
+		System.out.println("loadQuery set");
+	}
+	
+	
+	private 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 setProductID(String productID) 
+		{ 
+			this.productID = productID; 
+		}
+		
+		public String getProductDesc() {
+			return productDesc;		
+		}
+		
+		public String getProductID() {
+			return productID;
+		}
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
new file mode 100644
index 0000000000..e1abf927f4
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
@@ -0,0 +1,54 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class MailContent {
+
+	private String subject = null;
+	private String message = null;
+	private String toAddress = null;
+	private final String NAME_KEY = "NAME";
+	private final String EMAIL_KEY = "EMAIL";
+	
+	public MailContent(File f, HashMap userInfo, String prodInfo){
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		try {
+			configureEMail(userInfo, prodInfo);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	
+	private void setMessage(HashMap userInfo, String prodInfo) throws IOException 
+	{
+		
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		subject = "您关注的产品降价了";
+		message = "尊敬的 "+name+", 您关注的产品 " + prodInfo + " 降价了，欢迎购买!" ;		
+				
+	}
+	
+	protected void configureEMail(HashMap userInfo, String prodInfo) throws IOException 
+	{
+		toAddress = (String) userInfo.get(EMAIL_KEY); 
+		if (toAddress.length() > 0) 
+			setMessage(userInfo, prodInfo); 
+	}
+	
+	public String getToAddress() {
+		return toAddress;
+	}
+	
+	public String getSubject() {
+		return subject;
+	}
+	
+	public String getMessage() {
+		return message;
+	}
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..f676fd5fdb
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.HashMap;
+
+public class MailUtil {
+
+	private MailContent mc = null;
+	private String toAddress = null;
+	private String fromAddress = null;
+	private String subject = null;
+	private String message = null;
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+	
+	public MailUtil(Configuration config, File f, HashMap userInfo, String prodInfo){
+		mc = new MailContent(f, userInfo, prodInfo);
+		toAddress = mc.getToAddress();
+		subject = mc.getSubject();
+		message = mc.getMessage();
+		fromAddress = config.getFromAddress();
+		smtpHost = config.getSMTPHost();
+		altSmtpHost = config.getAltSMTPHost();
+	}
+	public void sendEmail(boolean debug) {
+		try 
+		{
+			if (toAddress.length() > 0)
+				sendEmail(smtpHost);
+		} 
+		catch (Exception e) 
+		{
+			try {
+				sendEmail(altSmtpHost); 
+				
+			} catch (Exception e2) 
+			{
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+			}
+		}
+	}
+
+	private void sendEmail(String server){
+		//假装发了一封邮件
+		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/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..86e5abaa0d
--- /dev/null
+++ b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		File f = new File(System.getProperty("user.dir")+"/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail(emailDebug, f);
+	}
+		
+	public PromotionMail(boolean debug, File f) throws Exception 
+	{
+		Configuration config = new Configuration(); 
+		DBUtil dbu = new DBUtil(f);
+		List mailingList = dbu.loadMailingList();
+		System.out.println("开始发送邮件");
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) { 
+				MailUtil mu = new MailUtil(config, f, (HashMap)iter.next(), dbu.getProductDesc());
+				mu.sendEmail(debug);
+			}
+		}
+		else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/349166103/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/349166103/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

From a890db40df1182422a0bff56123da7d6501b866c Mon Sep 17 00:00:00 2001
From: Enan <enanznn@163.com>
Date: Sun, 18 Jun 2017 21:00:23 +0800
Subject: [PATCH 182/332] 1241588932

---
 students/1241588932/pom.xml                   | 54 +++++++++++++++
 .../ood/srp/config/Configuration.java         | 27 ++++++++
 .../ood/srp/config/ConfigurationKeys.java     |  9 +++
 .../com/coderising/ood/srp/dao/UserDao.java   | 32 +++++++++
 .../coderising/ood/srp/entity/Product.java    | 15 +++++
 .../com/coderising/ood/srp/entity/User.java   | 13 ++++
 .../java/com/coderising/ood/srp/main.java     | 21 ++++++
 .../ood/srp/service/IPromotionMail.java       | 11 ++++
 .../ood/srp/service/IReadProductConfig.java   | 16 +++++
 .../ood/srp/service/IUserService.java         | 13 ++++
 .../srp/service/impl/PromotionMailImpl.java   | 66 +++++++++++++++++++
 .../service/impl/ReadProductConfigImpl.java   | 40 +++++++++++
 .../ood/srp/service/impl/UserServiceImpl.java | 20 ++++++
 .../com/coderising/ood/srp/util/DBUtil.java   | 26 ++++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 17 +++++
 .../main/resources/email_config.properties    |  3 +
 .../src/main/resources/product_promotion.txt  |  4 ++
 17 files changed, 387 insertions(+)
 create mode 100644 students/1241588932/pom.xml
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/main.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/1241588932/src/main/java/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 students/1241588932/src/main/resources/email_config.properties
 create mode 100644 students/1241588932/src/main/resources/product_promotion.txt

diff --git a/students/1241588932/pom.xml b/students/1241588932/pom.xml
new file mode 100644
index 0000000000..ad245eee9f
--- /dev/null
+++ b/students/1241588932/pom.xml
@@ -0,0 +1,54 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coderising</groupId>
+    <artifactId>ood-assignment-enan</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>ood-assignment-enan</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.16.16</version>
+            <optional>true</optional>
+        </dependency>
+
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
new file mode 100644
index 0000000000..e468795316
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static final String CONFIG_FILE_NAME = "email_config.properties";
+
+	static Map<String,String> configurations = new HashMap<>();
+	static{
+		// TODO 从配置文件中加载配置到 map 中
+		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/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java b/students/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..7fe226d1bd
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.config;
+
+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/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java b/students/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java
new file mode 100644
index 0000000000..fb6970cee5
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/dao/UserDao.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/14.
+ */
+public class UserDao {
+
+    private static UserDao INSTANCE;
+
+    public static UserDao getInstance() {
+        if (INSTANCE == null) {
+            synchronized (UserDao.class) {
+                INSTANCE = new UserDao();
+            }
+        }
+        return INSTANCE;
+    }
+
+    private UserDao() {}
+
+    public List<User> querySubscriptedUsersByProductID(String productID) {
+        String sql = "Select name, email from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sql);
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java
new file mode 100644
index 0000000000..70b2c7870c
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/Product.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * Created by Enan on 17/6/14.
+ */
+@Data
+@Builder
+public class Product {
+
+    private String productID;
+    private String productDesc;
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java
new file mode 100644
index 0000000000..0f79352cf4
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/entity/User.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.entity;
+
+import lombok.Data;
+
+/**
+ * Created by Enan on 17/6/14.
+ */
+@Data
+public class User {
+
+    private String name;
+    private String email;
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/main.java b/students/1241588932/src/main/java/com/coderising/ood/srp/main.java
new file mode 100644
index 0000000000..af2b5ce8f1
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/main.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.service.IPromotionMail;
+import com.coderising.ood.srp.service.impl.PromotionMailImpl;
+import com.coderising.ood.srp.service.impl.ReadProductConfigImpl;
+import com.coderising.ood.srp.service.impl.UserServiceImpl;
+
+import java.io.File;
+import java.net.URL;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class main {
+
+    public static void main(String[] args) {
+        IPromotionMail promotionMail = new PromotionMailImpl(new UserServiceImpl(), new ReadProductConfigImpl());
+        URL base = Thread.currentThread().getContextClassLoader().getResource("");
+        promotionMail.send(new File(base.getFile(), "product_promotion.txt"));
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java
new file mode 100644
index 0000000000..ba940b09d8
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IPromotionMail.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.service;
+
+import java.io.File;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public interface IPromotionMail {
+
+    void send(File file);
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java
new file mode 100644
index 0000000000..1b2c45d1ee
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IReadProductConfig.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.entity.Product;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public interface IReadProductConfig {
+
+    Collection<Product> read(File file) throws IOException;
+
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java
new file mode 100644
index 0000000000..652ba08fbb
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/IUserService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.entity.User;
+
+import java.util.Collection;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public interface IUserService {
+
+    Collection<User> querySubscriptedUsersByProductID(String productID);
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java
new file mode 100644
index 0000000000..497f16ccfd
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/PromotionMailImpl.java
@@ -0,0 +1,66 @@
+package com.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.config.Configuration;
+import com.coderising.ood.srp.config.ConfigurationKeys;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.IPromotionMail;
+import com.coderising.ood.srp.service.IReadProductConfig;
+import com.coderising.ood.srp.service.IUserService;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class PromotionMailImpl implements IPromotionMail {
+
+    private IUserService userService;
+    private IReadProductConfig readProductConfig;
+
+    private static final String SUBJECT = "您关注的产品降价了";
+    private static final String MESSAGE = "尊敬的 %s, 您关注的产品 %s 降价了，欢迎购买!";
+
+    public PromotionMailImpl (IUserService iUserService, IReadProductConfig iReadProductConfig) {
+        this.userService = iUserService;
+        this.readProductConfig = iReadProductConfig;
+    }
+
+    @Override
+    public void send(File file) {
+        Collection<Product> products;
+        try {
+            products = readProductConfig.read(file);
+        } catch (IOException e) {
+            throw new RuntimeException("读取降价商品失败，终止发送降价邮件提醒");
+        }
+        for (Product product : products) {
+            List<User> users = (List<User>) userService.querySubscriptedUsersByProductID(product.getProductID());
+
+            for (User user : users) {
+                try {
+                    if (user.getEmail().length() > 0)
+                        MailUtil.sendEmail(user.getEmail(),
+                                Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN),
+                                SUBJECT,
+                                String.format(MESSAGE, user.getName(), product.getProductDesc()),
+                                Configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+                } catch (Exception e) {
+                    try {
+                        MailUtil.sendEmail(user.getEmail(),
+                                Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN),
+                                SUBJECT,
+                                String.format(MESSAGE, user.getName(), product.getProductDesc()),
+                                Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java
new file mode 100644
index 0000000000..9360be24ad
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/ReadProductConfigImpl.java
@@ -0,0 +1,40 @@
+package com.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.service.IReadProductConfig;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class ReadProductConfigImpl implements IReadProductConfig {
+    @Override
+    public Collection<Product> read(File file) throws IOException {
+        List<Product> products = new ArrayList<>();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+
+                System.out.println("产品ID = " + data[0] + "\n");
+                System.out.println("产品描述 = " + data[1] + "\n");
+
+                products.add(Product.builder().productID(data[0]).productDesc(data[1]).build());
+            }
+            return products;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000000..f38ce0f773
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/service/impl/UserServiceImpl.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp.service.impl;
+
+import com.coderising.ood.srp.dao.UserDao;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.IUserService;
+
+import java.util.List;
+
+/**
+ * Created by Enan on 17/6/18.
+ */
+public class UserServiceImpl implements IUserService {
+
+    private UserDao userDao = UserDao.getInstance();
+
+    @Override
+    public List<User> querySubscriptedUsersByProductID(String productID) {
+        return userDao.querySubscriptedUsersByProductID(productID);
+    }
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..a6e495ab07
--- /dev/null
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.util;
+import com.coderising.ood.srp.entity.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List query(String sql){
+		
+		List<User> userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/1241588932/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..dd640423c9
--- /dev/null
+++ b/students/1241588932/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(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/1241588932/src/main/resources/email_config.properties b/students/1241588932/src/main/resources/email_config.properties
new file mode 100644
index 0000000000..6f5615d18b
--- /dev/null
+++ b/students/1241588932/src/main/resources/email_config.properties
@@ -0,0 +1,3 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
\ No newline at end of file
diff --git a/students/1241588932/src/main/resources/product_promotion.txt b/students/1241588932/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1241588932/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From d70f309e4c60e9e58725e8f9baa72d1748256aae Mon Sep 17 00:00:00 2001
From: eulerlcs <eulerlcs@gmail.com>
Date: Sun, 18 Jun 2017 22:01:26 +0900
Subject: [PATCH 183/332] season 01 commit

---
 students/41689722.eulerlcs/1.article/.gitkeep |   0
 students/41689722.eulerlcs/2.code/.gitignore  |   6 +
 .../2.code/jmr-01-aggregator/pom.xml          |  20 +
 .../jmr-01-aggregator/src/site/.gitkeep       |   0
 .../2.code/jmr-02-parent/pom.xml              | 148 ++++++
 .../2.code/jmr-02-parent/src/site/.gitkeep    |   0
 .../data/shoppingcart/shoppingcart.data       | Bin 0 -> 131 bytes
 .../data/xmlparser/app-config.xml             |  12 +
 .../jmr-11-challenge/data/xmlparser/hello.xml |   5 +
 .../2.code/jmr-11-challenge/pom.xml           |  48 ++
 .../core/FileSystemClassLoader.java           |  58 +++
 .../classloader/core/ICalculator.java         |   5 +
 .../classloader/core/NetworkClassLoader.java  |  46 ++
 .../challenge/classloader/core/Versioned.java |   5 +
 .../classloader/driver/CalculatorTest.java    |  24 +
 .../classloader/driver/ClassIdentity.java     |  36 ++
 .../classloader/driver/ClassLoaderTree.java   |  12 +
 .../challenge/classloader/package-info.java   |   7 +
 .../sampleRename/CalculatorAdvanced.java      |  15 +
 .../sampleRename/CalculatorBasic.java         |  15 +
 .../classloader/sampleRename/Sample.java      |  10 +
 .../challenge/systemrules/AppWithExit.java    |  13 +
 .../challenge/systemrules/package-info.java   |   5 +
 .../digester/core/HelloDigester.java          |  17 +
 .../digester/core/HelloFileRulerSet.java      |  28 ++
 .../xmlparser/digester/driver/Driver.java     |  28 ++
 .../xmlparser/digester/entity/Hello.java      |  19 +
 .../xmlparser/digester/entity/HelloFile.java  |  11 +
 .../challenge/xmlparser/jaxb/AppConfig.java   |  29 ++
 .../jmr/challenge/xmlparser/jaxb/Driver.java  |  20 +
 .../jmr/challenge/xmlparser/jaxb/Hello.java   |  22 +
 .../challenge/xmlparser/jaxb/HelloFile.java   |  14 +
 .../challenge/xmlparser/jaxb/JaxbParser.java  |  22 +
 .../jmr/challenge/xmlparser/package-info.java |  13 +
 .../jmr/challenge/xmlparser/sax/Driver.java   |  19 +
 .../xmlparser/sax/HelloSaxParser.java         |  42 ++
 .../challenge/zzz/master170219/Try170205.java | 132 ++++++
 .../challenge/zzz/master170219/Try170212.java |  34 ++
 .../challenge/zzz/master170219/Try170219.java |  47 ++
 .../com/hoo/download/BatchDownloadFile.java   | 227 +++++++++
 .../java/com/hoo/download/DownloadFile.java   | 176 +++++++
 .../java/com/hoo/download/SaveItemFile.java   |  68 +++
 .../java/com/hoo/entity/DownloadInfo.java     | 125 +++++
 .../main/java/com/hoo/util/DownloadUtils.java |  40 ++
 .../java/com/hoo/util/DownloadUtilsTest.java  |  39 ++
 .../src/main/java/com/hoo/util/LogUtils.java  |  40 ++
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 +
 .../jmr-11-challenge/src/test/java/.gitkeep   |   0
 .../systemrules/AppWithExitTest.java          |  51 ++
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-51-liuxin-question/pom.xml     |  35 ++
 .../coderising/download/api/Connection.java   |  28 ++
 .../download/api/ConnectionException.java     |   5 +
 .../download/api/ConnectionManager.java       |  11 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/core/DownloadThread.java         |  21 +
 .../download/core/FileDownloader.java         |  68 +++
 .../download/impl/ConnectionImpl.java         |  26 ++
 .../download/impl/ConnectionManagerImpl.java  |  15 +
 .../coderising/jvm/attr/AttributeInfo.java    |  19 +
 .../com/coderising/jvm/attr/CodeAttr.java     |  52 +++
 .../coderising/jvm/attr/LineNumberTable.java  |  46 ++
 .../jvm/attr/LocalVariableItem.java           |  49 ++
 .../jvm/attr/LocalVariableTable.java          |  25 +
 .../coderising/jvm/attr/StackMapTable.java    |  29 ++
 .../com/coderising/jvm/clz/AccessFlag.java    |  26 ++
 .../com/coderising/jvm/clz/ClassFile.java     | 100 ++++
 .../com/coderising/jvm/clz/ClassIndex.java    |  22 +
 .../coderising/jvm/constant/ClassInfo.java    |  28 ++
 .../coderising/jvm/constant/ConstantInfo.java |  29 ++
 .../coderising/jvm/constant/ConstantPool.java |  28 ++
 .../coderising/jvm/constant/FieldRefInfo.java |  54 +++
 .../jvm/constant/MethodRefInfo.java           |  56 +++
 .../jvm/constant/NameAndTypeInfo.java         |  48 ++
 .../jvm/constant/NullConstantInfo.java        |  11 +
 .../coderising/jvm/constant/StringInfo.java   |  28 ++
 .../com/coderising/jvm/constant/UTF8Info.java |  37 ++
 .../java/com/coderising/jvm/field/Field.java  |  26 ++
 .../jvm/loader/ByteCodeIterator.java          |  55 +++
 .../jvm/loader/ClassFileLoader.java           | 122 +++++
 .../jvm/loader/ClassFileParser.java           | 146 ++++++
 .../com/coderising/jvm/method/Method.java     |  48 ++
 .../java/com/coderising/jvm/util/Util.java    |  22 +
 .../coderising/litestruts/LoginAction.java    |  42 ++
 .../com/coderising/litestruts/Struts.java     |  30 ++
 .../java/com/coderising/litestruts/View.java  |  26 ++
 .../main/java/com/coding/basic/ArrayList.java |  33 ++
 .../main/java/com/coding/basic/ArrayUtil.java |  96 ++++
 .../java/com/coding/basic/BinaryTreeNode.java |  37 ++
 .../main/java/com/coding/basic/Iterator.java  |   8 +
 .../java/com/coding/basic/LRUPageFrame.java   |  50 ++
 .../java/com/coding/basic/LinkedList.java     | 126 +++++
 .../src/main/java/com/coding/basic/List.java  |  13 +
 .../src/main/java/com/coding/basic/Queue.java |  19 +
 .../java/com/coding/basic/stack/Stack.java    |  26 ++
 .../com/coding/basic/stack/StackUtil.java     |  54 +++
 .../coding/basic/stack/expr/InfixExpr.java    |  13 +
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 +
 .../src/main/resources/struts.xml             |  11 +
 .../download/core/FileDownloaderTest.java     |  56 +++
 .../jvm/loader/ClassFileloaderTest.java       | 248 ++++++++++
 .../com/coderising/jvm/loader/EmployeeV1.java |  30 ++
 .../com/coderising/litestruts/StrutsTest.java |  38 ++
 .../com/coding/basic/LRUPageFrameTest.java    |  27 ++
 .../com/coding/basic/stack/StackUtilTest.java |  78 ++++
 .../basic/stack/expr/InfixExprTest.java       |  45 ++
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-52-liuxin-answer/pom.xml       |  31 ++
 .../coderising/download/api/Connection.java   |  28 ++
 .../download/api/ConnectionException.java     |   8 +
 .../download/api/ConnectionManager.java       |  11 +
 .../download/api/DownloadListener.java        |   5 +
 .../download/core/DownloadThread.java         |  50 ++
 .../download/core/FileDownloader.java         | 126 +++++
 .../download/impl/ConnectionImpl.java         |  84 ++++
 .../download/impl/ConnectionManagerImpl.java  |  15 +
 .../coderising/litestruts/Configuration.java  | 113 +++++
 .../litestruts/ConfigurationException.java    |  21 +
 .../coderising/litestruts/LoginAction.java    |  42 ++
 .../coderising/litestruts/ReflectionUtil.java | 120 +++++
 .../com/coderising/litestruts/Struts.java     |  56 +++
 .../java/com/coderising/litestruts/View.java  |  26 ++
 .../java/com/coding/basic/BinaryTreeNode.java |  37 ++
 .../main/java/com/coding/basic/Iterator.java  |   8 +
 .../src/main/java/com/coding/basic/List.java  |  13 +
 .../src/main/java/com/coding/basic/Queue.java |  19 +
 .../com/coding/basic/array/ArrayList.java     |  36 ++
 .../com/coding/basic/array/ArrayUtil.java     |  96 ++++
 .../coding/basic/linklist/LRUPageFrame.java   | 151 ++++++
 .../com/coding/basic/linklist/LinkedList.java | 129 ++++++
 .../java/com/coding/basic/stack/Stack.java    |  26 ++
 .../com/coding/basic/stack/StackUtil.java     | 140 ++++++
 .../coding/basic/stack/expr/InfixExpr.java    |  15 +
 .../basic/stack/expr/InfixExprTest.java       |  47 ++
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 +
 .../src/main/resources/struts.xml             |  11 +
 .../download/api/ConnectionTest.java          |  42 ++
 .../download/core/FileDownloaderTest.java     |  56 +++
 .../litestruts/ConfigurationTest.java         |  46 ++
 .../litestruts/ReflectionUtilTest.java        | 104 +++++
 .../com/coderising/litestruts/StrutsTest.java |  37 ++
 .../basic/linklist/LRUPageFrameTest.java      |  32 ++
 .../coding/basic/linklist/LinkedListTest.java | 197 ++++++++
 .../com/coding/basic/stack/StackUtilTest.java |  78 ++++
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-61-collection/pom.xml          |  27 ++
 .../eulerlcs/jmr/algorithm/ArrayList.java     | 438 ++++++++++++++++++
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 +
 .../eulerlcs/jmr/algorithm/TestArrayList.java |  44 ++
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-62-litestruts/data/struts.xml  |  11 +
 .../2.code/jmr-62-litestruts/pom.xml          |  39 ++
 .../jmr-62-litestruts/src/main/java/.gitkeep  |   0
 .../eulerlcs/jmr/algorithm/ArrayUtil.java     | 279 +++++++++++
 .../jmr/litestruts/action/LoginAction.java    |  30 ++
 .../jmr/litestruts/action/LogoutAction.java   |  30 ++
 .../eulerlcs/jmr/litestruts/core/Struts.java  | 200 ++++++++
 .../eulerlcs/jmr/litestruts/core/View.java    |  26 ++
 .../jmr/litestruts/degister/StrutsAction.java |  22 +
 .../degister/StrutsActionResult.java          |  13 +
 .../degister/StrutsActionRulerSet.java        |  30 ++
 .../jmr/litestruts/degister/StrutsConfig.java |  15 +
 .../litestruts/degister/StrutsDigester.java   |  13 +
 .../src/main/resources/log4j.xml              |  16 +
 .../jmr-62-litestruts/src/test/java/.gitkeep  |   0
 .../eulerlcs/jmr/algorithm/ArrayUtilTest.java | 266 +++++++++++
 .../jmr/litestruts/core/StrutsTest.java       |  38 ++
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-63-download/data/.gitkeep      |   0
 .../2.code/jmr-63-download/pom.xml            |  39 ++
 .../eulerlcs/jmr/algorithm/Iterator.java      |   8 +
 .../eulerlcs/jmr/algorithm/LinkedList.java    | 126 +++++
 .../github/eulerlcs/jmr/algorithm/List.java   |  13 +
 .../eulerlcs/jmr/download/api/Connection.java |  28 ++
 .../jmr/download/api/ConnectionException.java |   5 +
 .../jmr/download/api/ConnectionManager.java   |  11 +
 .../jmr/download/api/DownloadListener.java    |   5 +
 .../jmr/download/core/DownloadThread.java     |  20 +
 .../jmr/download/core/FileDownloader.java     |  64 +++
 .../jmr/download/impl/ConnectionImpl.java     |  25 +
 .../download/impl/ConnectionManagerImpl.java  |  14 +
 .../src/main/resources/log4j.xml              |  16 +
 .../jmr/download/core/FileDownloaderTest.java |  53 +++
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-64-minijvm/data/.gitkeep       |   0
 .../2.code/jmr-64-minijvm/pom.xml             |  43 ++
 .../eulerlcs/jmr/algorithm/LRUPageFrame.java  | 110 +++++
 .../github/eulerlcs/jmr/algorithm/Stack.java  |  24 +
 .../eulerlcs/jmr/algorithm/StackUtil.java     |  43 ++
 .../eulerlcs/jmr/jvm/attr/AttributeInfo.java  |  19 +
 .../eulerlcs/jmr/jvm/attr/CodeAttr.java       |  52 +++
 .../jmr/jvm/attr/LineNumberTable.java         |  46 ++
 .../jmr/jvm/attr/LocalVariableItem.java       |  49 ++
 .../jmr/jvm/attr/LocalVariableTable.java      |  25 +
 .../eulerlcs/jmr/jvm/attr/StackMapTable.java  |  29 ++
 .../eulerlcs/jmr/jvm/clz/AccessFlag.java      |  26 ++
 .../eulerlcs/jmr/jvm/clz/ClassFile.java       | 100 ++++
 .../eulerlcs/jmr/jvm/clz/ClassIndex.java      |  22 +
 .../eulerlcs/jmr/jvm/constant/ClassInfo.java  |  29 ++
 .../jmr/jvm/constant/ConstantInfo.java        |  29 ++
 .../jmr/jvm/constant/ConstantPool.java        |  28 ++
 .../jmr/jvm/constant/FieldRefInfo.java        |  54 +++
 .../jmr/jvm/constant/MethodRefInfo.java       |  56 +++
 .../jmr/jvm/constant/NameAndTypeInfo.java     |  50 ++
 .../jmr/jvm/constant/NullConstantInfo.java    |  11 +
 .../eulerlcs/jmr/jvm/constant/StringInfo.java |  28 ++
 .../eulerlcs/jmr/jvm/constant/UTF8Info.java   |  37 ++
 .../github/eulerlcs/jmr/jvm/field/Field.java  |  26 ++
 .../jmr/jvm/loader/ByteCodeIterator.java      |  55 +++
 .../jmr/jvm/loader/ClassFileLoader.java       |  74 +++
 .../jmr/jvm/loader/ClassFileParser.java       | 146 ++++++
 .../eulerlcs/jmr/jvm/method/Method.java       |  48 ++
 .../github/eulerlcs/jmr/jvm/util/Util.java    |  22 +
 .../src/main/resources/log4j.xml              |  16 +
 .../jmr/algorithm/LRUPageFrameTest.java       |  27 ++
 .../jmr/jvm/loader/ClassFileloaderTest.java   | 220 +++++++++
 .../eulerlcs/jmr/jvm/loader/EmployeeV1.java   |  28 ++
 .../src/test/resources/.gitkeep               |   0
 .../5.settingfile/eclipsev45.epf              | 186 ++++++++
 .../5.settingfile/git cmd help.txt            |  43 ++
 .../tool.161118.git-source-copy.bat           |  37 ++
 .../tool.170330.java-maven-source-cleaner.bat |  37 ++
 226 files changed, 10138 insertions(+)
 create mode 100644 students/41689722.eulerlcs/1.article/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/.gitignore
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/data/shoppingcart/shoppingcart.data
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/data/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/data/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/5.settingfile/eclipsev45.epf
 create mode 100644 students/41689722.eulerlcs/5.settingfile/git cmd help.txt
 create mode 100644 students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat
 create mode 100644 students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat

diff --git a/students/41689722.eulerlcs/1.article/.gitkeep b/students/41689722.eulerlcs/1.article/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/.gitignore b/students/41689722.eulerlcs/2.code/.gitignore
new file mode 100644
index 0000000000..c2be49c379
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/.gitignore
@@ -0,0 +1,6 @@
+.metadata/
+.recommenders/
+**/.settings/
+**/target/
+**/.classpath
+**/.project
diff --git a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml b/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
new file mode 100644
index 0000000000..3edeb21d2e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
@@ -0,0 +1,20 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.github.eulerlcs</groupId>
+	<artifactId>jmr-01-aggregator</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<description>eulerlcs master java road aggregator</description>
+
+	<modules>
+		<module>../jmr-02-parent</module>
+		<module>../jmr-11-challenge</module>
+		<module>../jmr-51-liuxin-question</module>
+		<module>../jmr-52-liuxin-answer</module>
+		<module>../jmr-61-collection</module>
+		<module>../jmr-62-litestruts</module>
+		<module>../jmr-63-download</module>
+		<module>../jmr-64-minijvm</module>
+	</modules>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml b/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
new file mode 100644
index 0000000000..82b785a432
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
@@ -0,0 +1,148 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.github.eulerlcs</groupId>
+	<artifactId>jmr-02-parent</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<description>eulerlcs master java road parent</description>
+
+
+	<properties>
+		<slf4j.version>1.7.24</slf4j.version>
+		<junit.version>4.12</junit.version>
+		<maven.surefire.plugin.version>2.17</maven.surefire.plugin.version>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
+	</properties>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.commons</groupId>
+				<artifactId>commons-lang3</artifactId>
+				<version>3.5</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.commons</groupId>
+				<artifactId>commons-io</artifactId>
+				<version>1.3.2</version>
+			</dependency>
+			<dependency>
+				<groupId>com.github.eulerlcs</groupId>
+				<artifactId>jmr-61-collection</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-digester</groupId>
+				<artifactId>commons-digester</artifactId>
+				<version>2.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.jdom</groupId>
+				<artifactId>jdom2</artifactId>
+				<version>2.0.6</version>
+			</dependency>
+			<dependency>
+				<groupId>dom4j</groupId>
+				<artifactId>dom4j</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.projectlombok</groupId>
+				<artifactId>lombok</artifactId>
+				<version>1.16.14</version>
+				<scope>provided</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>${slf4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-log4j12</artifactId>
+				<version>${slf4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>${junit.version}</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>com.github.stefanbirkner</groupId>
+				<artifactId>system-rules</artifactId>
+				<version>1.16.1</version>
+				<scope>test</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-source-plugin</artifactId>
+					<version>3.0.1</version>
+					<executions>
+						<execution>
+							<id>attach-source</id>
+							<goals>
+								<goal>jar-no-fork</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<version>3.6.1</version>
+					<configuration>
+						<source>${maven.compiler.source}</source>
+						<target>${maven.compiler.target}</target>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-jar-plugin</artifactId>
+					<version>3.0.2</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<version>2.10.4</version>
+					<configuration>
+						<author>true</author>
+						<source>1.8</source>
+						<show>protected</show>
+						<encoding>UTF-8</encoding>
+						<charset>UTF-8</charset>
+						<docencoding>UTF-8</docencoding>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-plugin</artifactId>
+					<version>2.19.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-report-plugin</artifactId>
+					<version>2.19.1</version>
+					<configuration>
+						<aggregate>true</aggregate>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/shoppingcart/shoppingcart.data b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/shoppingcart/shoppingcart.data
new file mode 100644
index 0000000000000000000000000000000000000000..336fd732b4dcf94a212cb3a8f2718aca7a10584b
GIT binary patch
literal 131
zcmZ=T{#&s4I+ra20|O5Ok5^(@qC$vnaYklQiG%X5hwke{s(~^b3>;t?-_mpkeYhwu
zgRo0!cB+C`X?l82W?s62OMXsHu>=3>R=FL4Z-Cllq1pm6^Bjb~9_o+L_y!a;V&DTC
O=ABxp;GB_|nFj!(-zjkb

literal 0
HcmV?d00001

diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml
new file mode 100644
index 0000000000..e989327e9d
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<app-config>
+	<input-path>a</input-path>
+	<input-look-subfolder>b</input-look-subfolder>
+	<input-encode>c</input-encode>
+	<output-path>d</output-path>
+	<output-by-package-tree>e</output-by-package-tree>
+	<output-prefix>f</output-prefix>
+	<output-subfix>g</output-subfix>
+	<output-encode>h</output-encode>
+	<output-package-name>i</output-package-name>
+</app-config>
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
new file mode 100644
index 0000000000..748019e106
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<files project="demo" value="123">
+	<file dir="d:/dir01">a.txt</file>
+	<file dir="d:/dir02">b.txt</file>
+</files>
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
new file mode 100644
index 0000000000..589a5f69ee
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
@@ -0,0 +1,48 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-11-challenge</artifactId>
+	<description>eulerlcs master java road challenge</description>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>commons-digester</groupId>
+			<artifactId>commons-digester</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>jdom2</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.github.stefanbirkner</groupId>
+			<artifactId>system-rules</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
new file mode 100644
index 0000000000..82c8b60d56
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
@@ -0,0 +1,58 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class FileSystemClassLoader extends ClassLoader {
+
+	private String rootDir;
+
+	public FileSystemClassLoader(String rootDir) {
+		this.rootDir = rootDir;
+	}
+
+	@Override
+	protected Class<?> findClass(String name) throws ClassNotFoundException {
+		byte[] classData = getClassData(name);
+		if (classData == null) {
+			throw new ClassNotFoundException();
+		} else {
+			return defineClass(name, classData, 0, classData.length);
+		}
+	}
+
+	private byte[] getClassData(String className) {
+		String path = classNameToPath(className);
+		InputStream ins = null;
+		try {
+			ins = new FileInputStream(path);
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			int bufferSize = 4096;
+			byte[] buffer = new byte[bufferSize];
+			int bytesNumRead = 0;
+			while ((bytesNumRead = ins.read(buffer)) != -1) {
+				baos.write(buffer, 0, bytesNumRead);
+			}
+			return baos.toByteArray();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			if (ins != null) {
+				try {
+					ins.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return null;
+	}
+
+	private String classNameToPath(String className) {
+		return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
new file mode 100644
index 0000000000..697bf8065f
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
@@ -0,0 +1,5 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+public interface ICalculator extends Versioned {
+	String calculate(String expression);
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
new file mode 100644
index 0000000000..c0f524a1b4
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
@@ -0,0 +1,46 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URL;
+
+public class NetworkClassLoader extends ClassLoader {
+
+	private String rootUrl;
+
+	public NetworkClassLoader(String rootUrl) {
+		this.rootUrl = rootUrl;
+	}
+
+	protected Class<?> findClass(String name) throws ClassNotFoundException {
+		byte[] classData = getClassData(name);
+		if (classData == null) {
+			throw new ClassNotFoundException();
+		} else {
+			return defineClass(name, classData, 0, classData.length);
+		}
+	}
+
+	private byte[] getClassData(String className) {
+		String path = classNameToPath(className);
+		try {
+			URL url = new URL(path);
+			InputStream ins = url.openStream();
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			int bufferSize = 4096;
+			byte[] buffer = new byte[bufferSize];
+			int bytesNumRead = 0;
+			while ((bytesNumRead = ins.read(buffer)) != -1) {
+				baos.write(buffer, 0, bytesNumRead);
+			}
+			return baos.toByteArray();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	private String classNameToPath(String className) {
+		return rootUrl + "/" + className.replace('.', '/') + ".class";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
new file mode 100644
index 0000000000..34dfacbbd1
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
@@ -0,0 +1,5 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+public interface Versioned {
+	String getVersion();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
new file mode 100644
index 0000000000..d19ee1dbe0
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
@@ -0,0 +1,24 @@
+package com.github.eulerlcs.jmr.challenge.classloader.driver;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
+import com.github.eulerlcs.jmr.challenge.classloader.core.NetworkClassLoader;
+
+public class CalculatorTest {
+
+	public static void main(String[] args) {
+		String url = "http://localhost:8080/ClassloaderTest/classes";
+		NetworkClassLoader ncl = new NetworkClassLoader(url);
+		String basicClassName = "com.example.CalculatorBasic";
+		String advancedClassName = "com.example.CalculatorAdvanced";
+		try {
+			Class<?> clazz = ncl.loadClass(basicClassName);
+			ICalculator calculator = (ICalculator) clazz.newInstance();
+			System.out.println(calculator.getVersion());
+			clazz = ncl.loadClass(advancedClassName);
+			calculator = (ICalculator) clazz.newInstance();
+			System.out.println(calculator.getVersion());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
new file mode 100644
index 0000000000..3a9226b8ca
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
@@ -0,0 +1,36 @@
+package com.github.eulerlcs.jmr.challenge.classloader.driver;
+
+import java.io.File;
+import java.lang.reflect.Method;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.FileSystemClassLoader;
+
+public class ClassIdentity {
+
+	public static void main(String[] args) {
+		new ClassIdentity().testClassIdentity();
+	}
+
+	public void testClassIdentity() {
+		String userDir = System.getProperty("user.dir");
+		String classDataRootPath = userDir + File.separator + "data" + File.separator + "classloader";
+
+		FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
+		FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
+		String className = "com.github.eulerlcs.jmr.challenge.classloader.sample.Sample";
+
+		try {
+			Class<?> class1 = fscl1.loadClass(className);
+			Object obj1 = class1.newInstance();
+
+			Class<?> class2 = fscl2.loadClass(className);
+			Object obj2 = class2.newInstance();
+
+			Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class);
+
+			setSampleMethod.invoke(obj1, obj2);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
new file mode 100644
index 0000000000..38916b6db5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
@@ -0,0 +1,12 @@
+package com.github.eulerlcs.jmr.challenge.classloader.driver;
+
+public class ClassLoaderTree {
+
+	public static void main(String[] args) {
+		ClassLoader loader = ClassLoaderTree.class.getClassLoader();
+		while (loader != null) {
+			System.out.println(loader.toString());
+			loader = loader.getParent();
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
new file mode 100644
index 0000000000..d35a4ee992
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * download from ibm developerworks
+ * 
+ * @see <a href=
+ *      "https://www.ibm.com/developerworks/cn/java/j-lo-classloader/">https://www.ibm.com/developerworks/cn/java/j-lo-classloader/</a>
+ */
+package com.github.eulerlcs.jmr.challenge.classloader;
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
new file mode 100644
index 0000000000..9076a4f4c8
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
@@ -0,0 +1,15 @@
+package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
+
+public class CalculatorAdvanced implements ICalculator {
+
+	public String calculate(String expression) {
+		return "Result is " + expression;
+	}
+
+	public String getVersion() {
+		return "2.0";
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
new file mode 100644
index 0000000000..d5f7b054dd
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
@@ -0,0 +1,15 @@
+package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
+
+public class CalculatorBasic implements ICalculator {
+
+	public String calculate(String expression) {
+		return expression;
+	}
+
+	public String getVersion() {
+		return "1.0";
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
new file mode 100644
index 0000000000..c67a7278e8
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
@@ -0,0 +1,10 @@
+package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
+
+public class Sample {
+	@SuppressWarnings("unused")
+	private Sample instance;
+
+	public void setSample(Object instance) {
+		this.instance = (Sample) instance;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
new file mode 100644
index 0000000000..2afd5b2074
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.challenge.systemrules;
+
+public class AppWithExit {
+	public static String message;
+
+	public static void doSomethingAndExit() {
+		message = "exit ...";
+		System.exit(1);
+	}
+
+	public static void doNothing() {
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
new file mode 100644
index 0000000000..1710e69d47
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * copy from http://stefanbirkner.github.io/system-rules/index.html
+ */
+
+package com.github.eulerlcs.jmr.challenge.systemrules;
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
new file mode 100644
index 0000000000..3f58d74c7f
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
@@ -0,0 +1,17 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.core;
+
+import org.apache.commons.digester.Digester;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.Hello;
+
+public class HelloDigester {
+	public static Digester newInstance() {
+		Digester d = new Digester();
+
+		d.addObjectCreate("files", Hello.class);
+		d.addSetProperties("files");
+		d.addRuleSet(new HelloFileRulerSet("files/"));
+
+		return d;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
new file mode 100644
index 0000000000..3d62c8c93e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.core;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.RuleSetBase;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.HelloFile;
+
+final class HelloFileRulerSet extends RuleSetBase {
+	protected String prefix = null;
+
+	public HelloFileRulerSet() {
+		this("");
+	}
+
+	public HelloFileRulerSet(String prefix) {
+		super();
+		this.namespaceURI = null;
+		this.prefix = prefix;
+	}
+
+	@Override
+	public void addRuleInstances(Digester digester) {
+		digester.addObjectCreate(prefix + "file", HelloFile.class);
+		digester.addSetProperties(prefix + "file", "dir", "path");
+		digester.addBeanPropertySetter(prefix + "file", "name");
+		digester.addSetNext(prefix + "file", "addFile");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
new file mode 100644
index 0000000000..59a2987909
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.driver;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.digester.Digester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.core.HelloDigester;
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.Hello;
+
+public class Driver {
+	private final static Logger log = LoggerFactory.getLogger(Driver.class);
+
+	public static void main(String[] args) {
+		Digester d = HelloDigester.newInstance();
+
+		try {
+			File file = new File("data//xmlparser", "hello.xml");
+			Hello helloEntity = (Hello) d.parse(file);
+			log.debug("hello.value=[{}]", helloEntity.getValue());
+		} catch (IOException | SAXException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
new file mode 100644
index 0000000000..415dbef23a
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
@@ -0,0 +1,19 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Hello {
+	private String project;
+	private String value;
+	private List<HelloFile> files = new ArrayList<>();
+
+	public void addFile(HelloFile file) {
+		files.add(file);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
new file mode 100644
index 0000000000..2892a3058e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class HelloFile {
+	private String path;
+	private String name;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java
new file mode 100644
index 0000000000..c50bce4a15
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java
@@ -0,0 +1,29 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import lombok.Getter;
+
+@Getter
+@XmlRootElement(name = "app-config")
+public class AppConfig {
+	@XmlElement(name = "input-path")
+	private String inputPath;
+	@XmlElement(name = "input-look-subfolder")
+	private boolean inputLookSubfolder;
+	@XmlElement(name = "input-encode")
+	private String inputEncode;
+	@XmlElement(name = "output-path")
+	private String outputPath;
+	@XmlElement(name = "output-by-package-tree")
+	private boolean outputByPackageTree;
+	@XmlElement(name = "output-prefix")
+	private String outputPrefix;
+	@XmlElement(name = "output-subfix")
+	private String outputSubfix;
+	@XmlElement(name = "output-encode")
+	private String outputEncode;
+	@XmlElement(name = "output-package-name")
+	private String outputPackageName;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java
new file mode 100644
index 0000000000..15c5686e2e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java
@@ -0,0 +1,20 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
+
+import java.io.File;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Driver {
+	private final static Logger log = LoggerFactory.getLogger(Driver.class);
+
+	public static void main(String[] args) {
+		File xml = new File("data//xmlparser", "hello.xml");
+		Hello hello = JaxbParser.loadAppConfig(xml, Hello.class);
+		log.debug("hello.value=[{}]", hello.getValue());
+
+		xml = new File("data//xmlparser", "app-config.xml");
+		AppConfig appConfig = JaxbParser.loadAppConfig(xml, AppConfig.class);
+		log.debug("process-args.InputPath=[{}] ", appConfig.getInputPath());
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java
new file mode 100644
index 0000000000..5bad90241e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java
@@ -0,0 +1,22 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.HelloFile;
+
+import lombok.Getter;
+
+@Getter
+@XmlRootElement(name = "files")
+public class Hello {
+	@XmlAttribute
+	private String project;
+	@XmlAttribute
+	private String value;
+	@XmlElement(name = "file")
+	private List<HelloFile> files;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java
new file mode 100644
index 0000000000..c5bdd127f1
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java
@@ -0,0 +1,14 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlValue;
+
+import lombok.Getter;
+
+@Getter
+public class HelloFile {
+	@XmlAttribute(name = "dir")
+	private String path;
+	@XmlValue
+	private String name;
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java
new file mode 100644
index 0000000000..720f524426
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java
@@ -0,0 +1,22 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
+
+import java.io.File;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+
+/* jaxb: Java Architecture for XML Binding */
+public class JaxbParser {
+	@SuppressWarnings("unchecked")
+	public static <E> E loadAppConfig(File xml, Class<E> clazz) {
+		E entity = null;
+		try {
+			JAXBContext jc = JAXBContext.newInstance(clazz);
+			Unmarshaller u = jc.createUnmarshaller();
+			entity = (E) u.unmarshal(xml);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return entity;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
new file mode 100644
index 0000000000..4f7a71c4bc
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
@@ -0,0 +1,13 @@
+/**
+ * 各种xml库
+ * <ul>
+ * <li>apache digester
+ * <li>dom
+ * <li>dom4j
+ * <li>ldom
+ * <li>jaxb
+ * <li>sax
+ * </ul>
+ */
+
+package com.github.eulerlcs.jmr.challenge.xmlparser;
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java
new file mode 100644
index 0000000000..d15739c5c9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java
@@ -0,0 +1,19 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.sax;
+
+import java.io.File;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+public class Driver {
+	public static void main(String[] args) {
+		SAXParserFactory factory = SAXParserFactory.newInstance();
+		File xml = new File("data//xmlparser", "hello.xml");
+		try {
+			SAXParser parser = factory.newSAXParser();
+			parser.parse(xml, new HelloSaxParser());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java
new file mode 100644
index 0000000000..26cc926b11
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java
@@ -0,0 +1,42 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.sax;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/* sax: simple api for xml */
+public class HelloSaxParser extends DefaultHandler {
+	protected static Logger log = LoggerFactory.getLogger(HelloSaxParser.class);
+
+	@Override
+	public void startDocument() throws SAXException {
+		super.startDocument();
+		log.debug("sax startDocument");
+	}
+
+	@Override
+	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+		super.startElement(uri, localName, qName, attributes);
+		log.debug("sax startElement qName: [{}]", qName);
+	}
+
+	@Override
+	public void characters(char[] ch, int start, int length) throws SAXException {
+		super.characters(ch, start, length);
+		log.debug("sax characters: [{}]", new String(ch, start, length));
+	}
+
+	@Override
+	public void endElement(String uri, String localName, String qName) throws SAXException {
+		super.endElement(uri, localName, qName);
+		log.debug("sax endElement qName: [{}]", qName);
+	}
+
+	@Override
+	public void endDocument() throws SAXException {
+		super.endDocument();
+		log.debug("sax endDocument");
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java
new file mode 100644
index 0000000000..b18db9d387
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java
@@ -0,0 +1,132 @@
+package com.github.eulerlcs.jmr.challenge.zzz.master170219;
+
+import java.io.DataInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+
+public class Try170205 {
+	public static void main(String[] args) throws Exception {
+		task94();
+		task93();
+		task84();
+		task83();
+		task65();
+		task64();
+
+		ArrayList<Integer> list = new ArrayList<Integer>();
+		show(list);
+	}
+
+	public static void show(ArrayList<? extends Number> list) {
+		// ....
+	}
+
+	public static void task64() {
+		DataInputStream dis = null;
+		double price = 0;
+		int count = 0;
+		double sum = 0;
+		String disp = "";
+
+		try {
+			dis = new DataInputStream(new FileInputStream("data/shoppingcart.data"));
+			while (dis.available() > 0) {
+				price = dis.readDouble();
+				count = dis.readInt();
+				disp = dis.readUTF();
+				System.out.println(disp);
+				sum += price * count;
+			}
+
+			System.out.println("sum=" + sum);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				dis.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+	}
+
+	public static void task65() {
+		DataInputStream dis = null;
+		byte[] magic = { (byte) 0xca, (byte) 0xfe, (byte) 0xba, (byte) 0xbe };
+		boolean ret = true;
+
+		try {
+			dis = new DataInputStream(new FileInputStream("data/sc.class"));
+			for (int i = 0; i < 4; i++) {
+				if (magic[i] != dis.readByte()) {
+					ret = false;
+					break;
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				dis.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+		if (ret) {
+			System.out.println("it is cafebabe");
+		} else {
+			System.out.println("it is not cafebabe");
+		}
+	}
+
+	public static void task83() throws Exception {
+		Class<?> clazz = Class.forName("shoppingcart.Employee");
+		Constructor<?> ct = clazz.getConstructor(String.class, int.class);
+		Object obj = ct.newInstance("ref", 22);
+
+		Method sayHello = clazz.getDeclaredMethod("sayHello");
+		sayHello.invoke(obj);
+
+		Method getID = clazz.getDeclaredMethod("getID");
+		getID.setAccessible(true);
+		String ids = (String) getID.invoke(obj);
+		System.out.println("getID=" + ids);
+
+		Field[] flds = clazz.getDeclaredFields();
+		for (Field fld : flds) {
+			System.out.println(fld);
+		}
+	}
+
+	public static void task84() throws Exception {
+		ArrayList<Integer> list = new ArrayList<>();
+		list.add(3232);
+
+		Class<?> clazz = ArrayList.class;
+
+		Field elementDataField = clazz.getDeclaredField("elementData");
+		elementDataField.setAccessible(true);
+		Object[] elementData = (Object[]) elementDataField.get(list);
+		if (elementData.length > 1) {
+			elementData[1] = "added by reflection";
+		}
+	}
+
+	public static void task93() {
+		ArrayList<String> list1 = new ArrayList<String>();
+		ArrayList<Integer> list2 = new ArrayList<Integer>();
+		System.out.println(list1.getClass().equals(list2.getClass()));
+	}
+
+	public static void task94() {
+		ArrayList<Number> numbers = new ArrayList<Number>();
+		numbers.add(new Integer(10));
+		numbers.add(new Double(10.0d));
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java
new file mode 100644
index 0000000000..5492441572
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java
@@ -0,0 +1,34 @@
+package com.github.eulerlcs.jmr.challenge.zzz.master170219;
+
+public class Try170212 {
+
+	public static void main(String[] args) {
+		t28();
+	}
+
+	public static void changeStr(String str) {
+		str = "welcome";
+	}
+
+	public static void t28() {
+		String str = "1234";
+		changeStr(str);
+		System.out.println(str);
+	}
+
+	public static void t34() {
+		Try170212 x = new Try170212();
+		Try170212.Hello obj = x.new Hello("");
+		obj.msg += ",World!";
+		System.out.println(obj.msg);
+	}
+
+	class Hello {
+		public String msg = "Hello";
+
+		public Hello(String msg) {
+			this.msg = msg;
+		}
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java
new file mode 100644
index 0000000000..559dc44a7c
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java
@@ -0,0 +1,47 @@
+package com.github.eulerlcs.jmr.challenge.zzz.master170219;
+
+import java.util.ArrayList;
+import java.util.Date;
+
+public class Try170219 {
+	public static void main(String[] args) {
+		Integer[] a = new Integer[10];
+		case003(a);
+	}
+
+	public static void case001() {
+		Fruit f = new Apple();
+		f.setDate(new Date());
+	}
+
+	public static void case002() {
+		ArrayList<String> list1 = new ArrayList<String>();
+		ArrayList<Integer> list2 = new ArrayList<Integer>();
+		System.out.println(list1.getClass().equals(list2.getClass()));
+	}
+
+	public static void case003(Number[] n) {
+		// nop
+	}
+
+}
+
+class Fruit {
+	public void setDate(Object d) {
+		System.out.println("Fruit.setDate(Object d)");
+	}
+
+	// public void setDate2(Object d) {
+	// System.out.println("Fruit.setDate(Object d)");
+	// }
+}
+
+class Apple extends Fruit {
+	public void setDate(Date d) {
+		System.out.println("Apple.setDate(Date d)");
+	}
+
+	public void setDate2(Date d) {
+		System.out.println("Apple.setDate(Date d)");
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java
new file mode 100644
index 0000000000..48b4f67670
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java
@@ -0,0 +1,227 @@
+package com.hoo.download;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import com.hoo.entity.DownloadInfo;
+import com.hoo.util.LogUtils;
+
+/**
+ * <b>function:</b> 分批量下载文件
+ * 
+ * @author hoojo
+ * @createDate 2011-9-22 下午05:51:54
+ * @file BatchDownloadFile.java
+ * @package com.hoo.download
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public class BatchDownloadFile implements Runnable {
+	// 下载文件信息
+	private DownloadInfo downloadInfo;
+	// 一组开始下载位置
+	private long[] startPos;
+	// 一组结束下载位置
+	private long[] endPos;
+	// 休眠时间
+	private static final int SLEEP_SECONDS = 500;
+	// 子线程下载
+	private DownloadFile[] fileItem;
+	// 文件长度
+	private int length;
+	// 是否第一个文件
+	private boolean first = true;
+	// 是否停止下载
+	private boolean stop = false;
+	// 临时文件信息
+	private File tempFile;
+
+	public BatchDownloadFile(DownloadInfo downloadInfo) {
+		this.downloadInfo = downloadInfo;
+		String tempPath = this.downloadInfo.getFilePath() + File.separator + downloadInfo.getFileName() + ".position";
+		tempFile = new File(tempPath);
+		// 如果存在读入点位置的文件
+		if (tempFile.exists()) {
+			first = false;
+			// 就直接读取内容
+			try {
+				readPosInfo();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		} else {
+			// 数组的长度就要分成多少段的数量
+			startPos = new long[downloadInfo.getSplitter()];
+			endPos = new long[downloadInfo.getSplitter()];
+		}
+	}
+
+	@Override
+	public void run() {
+		// 首次下载，获取下载文件长度
+		if (first) {
+			length = this.getFileSize();// 获取文件长度
+			if (length == -1) {
+				LogUtils.log("file length is know!");
+				stop = true;
+			} else if (length == -2) {
+				LogUtils.log("read file length is error!");
+				stop = true;
+			} else if (length > 0) {
+				/**
+				 * eg start: 1, 3, 5, 7, 9 end: 3, 5, 7, 9, length
+				 */
+				for (int i = 0, len = startPos.length; i < len; i++) {
+					int size = i * (length / len);
+					startPos[i] = size;
+
+					// 设置最后一个结束点的位置
+					if (i == len - 1) {
+						endPos[i] = length;
+					} else {
+						size = (i + 1) * (length / len);
+						endPos[i] = size;
+					}
+					LogUtils.log("start-end Position[" + i + "]: " + startPos[i] + "-" + endPos[i]);
+				}
+			} else {
+				LogUtils.log("get file length is error, download is stop!");
+				stop = true;
+			}
+		}
+
+		// 子线程开始下载
+		if (!stop) {
+			// 创建单线程下载对象数组
+			fileItem = new DownloadFile[startPos.length];// startPos.length =
+															// downloadInfo.getSplitter()
+			for (int i = 0; i < startPos.length; i++) {
+				try {
+					// 创建指定个数单线程下载对象，每个线程独立完成指定块内容的下载
+					fileItem[i] = new DownloadFile(downloadInfo.getUrl(),
+							this.downloadInfo.getFilePath() + File.separator + downloadInfo.getFileName(), startPos[i],
+							endPos[i], i);
+					fileItem[i].start();// 启动线程，开始下载
+					LogUtils.log("Thread: " + i + ", startPos: " + startPos[i] + ", endPos: " + endPos[i]);
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+
+			// 循环写入下载文件长度信息
+			while (!stop) {
+				try {
+					writePosInfo();
+					LogUtils.log("downloading……");
+					Thread.sleep(SLEEP_SECONDS);
+					stop = true;
+				} catch (IOException e) {
+					e.printStackTrace();
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+				for (int i = 0; i < startPos.length; i++) {
+					if (!fileItem[i].isDownloadOver()) {
+						stop = false;
+						break;
+					}
+				}
+			}
+			LogUtils.info("Download task is finished!");
+		}
+	}
+
+	/**
+	 * 将写入点数据保存在临时文件中
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-23 下午05:25:37
+	 * @throws IOException
+	 */
+	private void writePosInfo() throws IOException {
+		DataOutputStream dos = new DataOutputStream(new FileOutputStream(tempFile));
+		dos.writeInt(startPos.length);
+		for (int i = 0; i < startPos.length; i++) {
+			dos.writeLong(fileItem[i].getStartPos());
+			dos.writeLong(fileItem[i].getEndPos());
+			// LogUtils.info("[" + fileItem[i].getStartPos() + "#" +
+			// fileItem[i].getEndPos() + "]");
+		}
+		dos.close();
+	}
+
+	/**
+	 * <b>function:</b>读取写入点的位置信息
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-23 下午05:30:29
+	 * @throws IOException
+	 */
+	private void readPosInfo() throws IOException {
+		DataInputStream dis = new DataInputStream(new FileInputStream(tempFile));
+		int startPosLength = dis.readInt();
+		startPos = new long[startPosLength];
+		endPos = new long[startPosLength];
+		for (int i = 0; i < startPosLength; i++) {
+			startPos[i] = dis.readLong();
+			endPos[i] = dis.readLong();
+		}
+		dis.close();
+	}
+
+	/**
+	 * <b>function:</b> 获取下载文件的长度
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-26 下午12:15:08
+	 * @return
+	 */
+	private int getFileSize() {
+		int fileLength = -1;
+		try {
+			URL url = new URL(this.downloadInfo.getUrl());
+			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+
+			DownloadFile.setHeader(conn);
+
+			int stateCode = conn.getResponseCode();
+			// 判断http status是否为HTTP/1.1 206 Partial Content或者200 OK
+			if (stateCode != HttpURLConnection.HTTP_OK && stateCode != HttpURLConnection.HTTP_PARTIAL) {
+				LogUtils.log("Error Code: " + stateCode);
+				return -2;
+			} else if (stateCode >= 400) {
+				LogUtils.log("Error Code: " + stateCode);
+				return -2;
+			} else {
+				// 获取长度
+				fileLength = conn.getContentLength();
+				LogUtils.log("FileLength: " + fileLength);
+			}
+
+			// 读取文件长度
+			/*
+			 * for (int i = 1; ; i++) { String header =
+			 * conn.getHeaderFieldKey(i); if (header != null) { if
+			 * ("Content-Length".equals(header)) { fileLength =
+			 * Integer.parseInt(conn.getHeaderField(i)); break; } } else {
+			 * break; } }
+			 */
+
+			DownloadFile.printHeader(conn);
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return fileLength;
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java
new file mode 100644
index 0000000000..784efa1d88
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java
@@ -0,0 +1,176 @@
+package com.hoo.download;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import com.hoo.util.LogUtils;
+
+/**
+ * <b>function:</b> 单线程下载文件
+ * 
+ * @author hoojo
+ * @createDate 2011-9-22 下午02:55:10
+ * @file DownloadFile.java
+ * @package com.hoo.download
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public class DownloadFile extends Thread {
+
+	// 下载文件url
+	private String url;
+	// 下载文件起始位置
+	private long startPos;
+	// 下载文件结束位置
+	private long endPos;
+	// 线程id
+	private int threadId;
+
+	// 下载是否完成
+	private boolean isDownloadOver = false;
+
+	private SaveItemFile itemFile;
+
+	private static final int BUFF_LENGTH = 1024 * 8;
+
+	/**
+	 * @param url
+	 *            下载文件url
+	 * @param name
+	 *            文件名称
+	 * @param startPos
+	 *            下载文件起点
+	 * @param endPos
+	 *            下载文件结束点
+	 * @param threadId
+	 *            线程id
+	 * @throws IOException
+	 */
+	public DownloadFile(String url, String name, long startPos, long endPos, int threadId) throws IOException {
+		super();
+		this.url = url;
+		this.startPos = startPos;
+		this.endPos = endPos;
+		this.threadId = threadId;
+		// 分块下载写入文件内容
+		this.itemFile = new SaveItemFile(name, startPos);
+	}
+
+	@Override
+	public void run() {
+		while (endPos > startPos && !isDownloadOver) {
+			try {
+				URL url = new URL(this.url);
+				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+
+				// 设置连接超时时间为10000ms
+				conn.setConnectTimeout(10000);
+				// 设置读取数据超时时间为10000ms
+				conn.setReadTimeout(10000);
+
+				setHeader(conn);
+
+				String property = "bytes=" + startPos + "-";
+				conn.setRequestProperty("RANGE", property);
+
+				// 输出log信息
+				LogUtils.log("开始 " + threadId + "：" + property + endPos);
+				// printHeader(conn);
+
+				// 获取文件输入流，读取文件内容
+				InputStream is = conn.getInputStream();
+
+				byte[] buff = new byte[BUFF_LENGTH];
+				int length = -1;
+				LogUtils.log("#start#Thread: " + threadId + ", startPos: " + startPos + ", endPos: " + endPos);
+				while ((length = is.read(buff)) > 0 && startPos < endPos && !isDownloadOver) {
+					// 写入文件内容，返回最后写入的长度
+					startPos += itemFile.write(buff, 0, length);
+				}
+				LogUtils.log("#over#Thread: " + threadId + ", startPos: " + startPos + ", endPos: " + endPos);
+				LogUtils.log("Thread " + threadId + " is execute over!");
+				this.isDownloadOver = true;
+			} catch (MalformedURLException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			} finally {
+				try {
+					if (itemFile != null) {
+						itemFile.close();
+					}
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		if (endPos < startPos && !isDownloadOver) {
+			LogUtils.log("Thread " + threadId + " startPos > endPos, not need download file !");
+			this.isDownloadOver = true;
+		}
+		if (endPos == startPos && !isDownloadOver) {
+			LogUtils.log("Thread " + threadId + " startPos = endPos, not need download file !");
+			this.isDownloadOver = true;
+		}
+	}
+
+	/**
+	 * <b>function:</b> 打印下载文件头部信息
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-22 下午05:44:35
+	 * @param conn
+	 *            HttpURLConnection
+	 */
+	public static void printHeader(URLConnection conn) {
+		int i = 1;
+		while (true) {
+			String header = conn.getHeaderFieldKey(i);
+			i++;
+			if (header != null) {
+				LogUtils.info(header + ":" + conn.getHeaderField(i));
+			} else {
+				break;
+			}
+		}
+	}
+
+	/**
+	 * <b>function:</b> 设置URLConnection的头部信息，伪装请求信息
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-28 下午05:29:43
+	 * @param con
+	 */
+	public static void setHeader(URLConnection conn) {
+		conn.setRequestProperty("User-Agent",
+				"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3");
+		conn.setRequestProperty("Accept-Language", "en-us,en;q=0.7,zh-cn;q=0.3");
+		conn.setRequestProperty("Accept-Encoding", "utf-8");
+		conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
+		conn.setRequestProperty("Keep-Alive", "300");
+		conn.setRequestProperty("connnection", "keep-alive");
+		conn.setRequestProperty("If-Modified-Since", "Fri, 02 Jan 2009 17:00:05 GMT");
+		conn.setRequestProperty("If-None-Match", "\"1261d8-4290-df64d224\"");
+		conn.setRequestProperty("Cache-conntrol", "max-age=0");
+		conn.setRequestProperty("Referer", "https://www.github.com");
+	}
+
+	public boolean isDownloadOver() {
+		return isDownloadOver;
+	}
+
+	public long getStartPos() {
+		return startPos;
+	}
+
+	public long getEndPos() {
+		return endPos;
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java
new file mode 100644
index 0000000000..c0dcb62ac3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java
@@ -0,0 +1,68 @@
+package com.hoo.download;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+/**
+ * <b>function:</b> 写入文件、保存文件
+ * 
+ * @author hoojo
+ * @createDate 2011-9-21 下午05:44:02
+ * @file SaveItemFile.java
+ * @package com.hoo.download
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public class SaveItemFile {
+	// 存储文件
+	private RandomAccessFile itemFile;
+
+	public SaveItemFile() throws IOException {
+		this("", 0);
+	}
+
+	/**
+	 * @param name
+	 *            文件路径、名称
+	 * @param pos
+	 *            写入点位置 position
+	 * @throws IOException
+	 */
+	public SaveItemFile(String name, long pos) throws IOException {
+		itemFile = new RandomAccessFile(name, "rw");
+		// 在指定的pos位置开始写入数据
+		itemFile.seek(pos);
+	}
+
+	/**
+	 * <b>function:</b> 同步方法写入文件
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-26 下午12:21:22
+	 * @param buff
+	 *            缓冲数组
+	 * @param start
+	 *            起始位置
+	 * @param length
+	 *            长度
+	 * @return
+	 */
+	public synchronized int write(byte[] buff, int start, int length) {
+		int i = -1;
+		try {
+			itemFile.write(buff, start, length);
+			i = length;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return i;
+	}
+
+	public void close() throws IOException {
+		if (itemFile != null) {
+			itemFile.close();
+		}
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java
new file mode 100644
index 0000000000..7ef4ba5477
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java
@@ -0,0 +1,125 @@
+
+package com.hoo.entity;
+
+/**
+ * <b>function:</b> 下载文件信息类
+ * 
+ * @author hoojo
+ * @createDate 2011-9-21 下午05:14:58
+ * @file DownloadInfo.java
+ * @package com.hoo.entity
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public class DownloadInfo {
+	// 下载文件url
+	private String url;
+	// 下载文件名称
+	private String fileName;
+	// 下载文件路径
+	private String filePath;
+	// 分成多少段下载， 每一段用一个线程完成下载
+	private int splitter;
+
+	// 下载文件默认保存路径
+	private final static String FILE_PATH = "C:/temp";
+	// 默认分块数、线程数
+	private final static int SPLITTER_NUM = 5;
+
+	public DownloadInfo() {
+		super();
+	}
+
+	/**
+	 * @param url
+	 *            下载地址
+	 */
+	public DownloadInfo(String url) {
+		this(url, null, null, SPLITTER_NUM);
+	}
+
+	/**
+	 * @param url
+	 *            下载地址url
+	 * @param splitter
+	 *            分成多少段或是多少个线程下载
+	 */
+	public DownloadInfo(String url, int splitter) {
+		this(url, null, null, splitter);
+	}
+
+	/***
+	 * @param url
+	 *            下载地址
+	 * @param fileName
+	 *            文件名称
+	 * @param filePath
+	 *            文件保存路径
+	 * @param splitter
+	 *            分成多少段或是多少个线程下载
+	 */
+	public DownloadInfo(String url, String fileName, String filePath, int splitter) {
+		super();
+		if (url == null || "".equals(url)) {
+			throw new RuntimeException("url is not null!");
+		}
+		this.url = url;
+		this.fileName = (fileName == null || "".equals(fileName)) ? getFileName(url) : fileName;
+		this.filePath = (filePath == null || "".equals(filePath)) ? FILE_PATH : filePath;
+		this.splitter = (splitter < 1) ? SPLITTER_NUM : splitter;
+	}
+
+	/**
+	 * <b>function:</b> 通过url获得文件名称
+	 * 
+	 * @author hoojo
+	 * @createDate 2011-9-30 下午05:00:00
+	 * @param url
+	 * @return
+	 */
+	private String getFileName(String url) {
+		return url.substring(url.lastIndexOf("/") + 1, url.length());
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		if (url == null || "".equals(url)) {
+			throw new RuntimeException("url is not null!");
+		}
+		this.url = url;
+	}
+
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = (fileName == null || "".equals(fileName)) ? getFileName(url) : fileName;
+	}
+
+	public String getFilePath() {
+		return filePath;
+	}
+
+	public void setFilePath(String filePath) {
+		this.filePath = (filePath == null || "".equals(filePath)) ? FILE_PATH : filePath;
+	}
+
+	public int getSplitter() {
+		return splitter;
+	}
+
+	public void setSplitter(int splitter) {
+		this.splitter = (splitter < 1) ? SPLITTER_NUM : splitter;
+	}
+
+	@Override
+	public String toString() {
+		return this.url + "#" + this.fileName + "#" + this.filePath + "#" + this.splitter;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java
new file mode 100644
index 0000000000..3ca0384319
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java
@@ -0,0 +1,40 @@
+package com.hoo.util;
+
+import com.hoo.download.BatchDownloadFile;
+import com.hoo.entity.DownloadInfo;
+
+/**
+ * <b>function:</b> 分块多线程下载工具类
+ * 
+ * @author hoojo
+ * @createDate 2011-9-28 下午05:22:18
+ * @file DownloadUtils.java
+ * @package com.hoo.util
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public abstract class DownloadUtils {
+
+	public static void download(String url) {
+		DownloadInfo bean = new DownloadInfo(url);
+		LogUtils.info(bean);
+		BatchDownloadFile down = new BatchDownloadFile(bean);
+		new Thread(down).start();
+	}
+
+	public static void download(String url, int threadNum) {
+		DownloadInfo bean = new DownloadInfo(url, threadNum);
+		LogUtils.info(bean);
+		BatchDownloadFile down = new BatchDownloadFile(bean);
+		new Thread(down).start();
+	}
+
+	public static void download(String url, String fileName, String filePath, int threadNum) {
+		DownloadInfo bean = new DownloadInfo(url, fileName, filePath, threadNum);
+		LogUtils.info(bean);
+		BatchDownloadFile down = new BatchDownloadFile(bean);
+		new Thread(down).start();
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java
new file mode 100644
index 0000000000..562a0ec047
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java
@@ -0,0 +1,39 @@
+/**
+ * copy from http://blog.csdn.net/ibm_hoojo/article/details/6838222
+ */
+package com.hoo.util;
+
+/**
+ * <b>function:</b> 下载测试
+ * 
+ * @author hoojo
+ * @createDate 2011-9-23 下午05:49:46
+ * @file TestDownloadMain.java
+ * @package com.hoo.download
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public class DownloadUtilsTest {
+	public static void main(String[] args) {
+		/*
+		 * DownloadInfo bean = new DownloadInfo(
+		 * "http://i7.meishichina.com/Health/UploadFiles/201109/2011092116224363.jpg"
+		 * ); System.out.println(bean); BatchDownloadFile down = new
+		 * BatchDownloadFile(bean); new Thread(down).start();
+		 */
+
+		// DownloadUtils.download("http://i7.meishichina.com/Health/UploadFiles/201109/2011092116224363.jpg");
+		DownloadUtils.download("https://github.com/dracome/coding2017/archive/master.zip", 5);
+
+		try {
+			Thread.sleep(30 * 1000);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		int i = 3;
+		System.out.println(i);
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java
new file mode 100644
index 0000000000..62d48bd0f9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java
@@ -0,0 +1,40 @@
+package com.hoo.util;
+
+/**
+ * <b>function:</b> 日志工具类
+ * 
+ * @author hoojo
+ * @createDate 2011-9-21 下午05:21:27
+ * @file LogUtils.java
+ * @package com.hoo.util
+ * @project MultiThreadDownLoad
+ * @blog http://blog.csdn.net/IBM_hoojo
+ * @email hoojo_@126.com
+ * @version 1.0
+ */
+public abstract class LogUtils {
+
+	public static void log(Object message) {
+		System.err.println(message);
+	}
+
+	public static void log(String message) {
+		System.err.println(message);
+	}
+
+	public static void log(int message) {
+		System.err.println(message);
+	}
+
+	public static void info(Object message) {
+		System.out.println(message);
+	}
+
+	public static void info(String message) {
+		System.out.println(message);
+	}
+
+	public static void info(int message) {
+		System.out.println(message);
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
new file mode 100644
index 0000000000..c849302200
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
@@ -0,0 +1,51 @@
+/* copy from http://stefanbirkner.github.io/system-rules/index.html */
+
+package com.github.eulerlcs.jmr.challenge.systemrules;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.Assertion;
+import org.junit.contrib.java.lang.system.ExpectedSystemExit;
+
+public class AppWithExitTest {
+	@Rule
+	public final ExpectedSystemExit exit = ExpectedSystemExit.none();
+
+	@Test
+	public void exits() {
+		exit.expectSystemExit();
+		AppWithExit.doSomethingAndExit();
+	}
+
+	@Test
+	public void exitsWithStatusCode1() {
+		exit.expectSystemExitWithStatus(1);
+		AppWithExit.doSomethingAndExit();
+	}
+
+	@Test
+	public void writesMessage() {
+		exit.expectSystemExitWithStatus(1);
+		exit.checkAssertionAfterwards(new Assertion() {
+			@Override
+			public void checkAssertion() {
+				assertEquals("exit ...", AppWithExit.message);
+			}
+		});
+		AppWithExit.doSomethingAndExit();
+	}
+
+	@Test
+	public void systemExitWithStatusCode1() {
+		exit.expectSystemExitWithStatus(1);
+		AppWithExit.doSomethingAndExit();
+	}
+
+	@Test
+	public void noSystemExit() {
+		AppWithExit.doNothing();
+		// passes
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml
new file mode 100644
index 0000000000..dc562ded7e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-51-liuxin-question</artifactId>
+	<description>eulerlcs master java road copy from liuxin question</description>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-io</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..76dc0f3a40
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,28 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * 
+	 * @param startPos
+	 *            开始位置， 从0开始
+	 * @param endPos
+	 *            结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos, int endPos) throws IOException;
+
+	/**
+	 * 得到数据内容的长度
+	 * 
+	 * @return
+	 */
+	public int getContentLength();
+
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..1551a80b3d
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..787984f170
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,11 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * 
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java
new file mode 100644
index 0000000000..ba94bee146
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java
@@ -0,0 +1,21 @@
+package com.coderising.download.core;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread {
+
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread(Connection conn, int startPos, int endPos) {
+
+		this.conn = conn;
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+
+	public void run() {
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java
new file mode 100644
index 0000000000..23ee19ab02
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java
@@ -0,0 +1,68 @@
+package com.coderising.download.core;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+public class FileDownloader {
+
+	String url;
+
+	DownloadListener listener;
+
+	ConnectionManager cm;
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+
+	}
+
+	public void execute() {
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos,
+		// endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		// 线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接，
+		// 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载， 注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+
+			conn = cm.open(this.url);
+
+			int length = conn.getContentLength();
+
+			new DownloadThread(conn, 0, length - 1).start();
+
+		} catch (ConnectionException e) {
+			e.printStackTrace();
+		} finally {
+			if (conn != null) {
+				conn.close();
+			}
+		}
+
+	}
+
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	public void setConnectionManager(ConnectionManager ucm) {
+		this.cm = ucm;
+	}
+
+	public DownloadListener getListener() {
+		return this.listener;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..1831118927
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,26 @@
+package com.coderising.download.impl;
+
+import java.io.IOException;
+
+import com.coderising.download.api.Connection;
+
+public class ConnectionImpl implements Connection {
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+
+		return 0;
+	}
+
+	@Override
+	public void close() {
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..6585b835c4
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
new file mode 100644
index 0000000000..3391da9616
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
@@ -0,0 +1,19 @@
+package com.coderising.jvm.attr;
+
+public abstract class AttributeInfo {
+	public static final String CODE = "Code";
+	public static final String CONST_VALUE = "ConstantValue";
+	public static final String EXCEPTIONS = "Exceptions";
+	public static final String LINE_NUM_TABLE = "LineNumberTable";
+	public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
+	public static final String STACK_MAP_TABLE = "StackMapTable";
+	int attrNameIndex;
+	int attrLen;
+
+	public AttributeInfo(int attrNameIndex, int attrLen) {
+
+		this.attrNameIndex = attrNameIndex;
+		this.attrLen = attrLen;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java
new file mode 100644
index 0000000000..f7ed2f1297
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java
@@ -0,0 +1,52 @@
+package com.coderising.jvm.attr;
+
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class CodeAttr extends AttributeInfo {
+	private int maxStack;
+	private int maxLocals;
+	private int codeLen;
+	private String code;
+
+	public String getCode() {
+		return code;
+	}
+
+	// private ByteCodeCommand[] cmds ;
+	// public ByteCodeCommand[] getCmds() {
+	// return cmds;
+	// }
+	private LineNumberTable lineNumTable;
+	private LocalVariableTable localVarTable;
+	private StackMapTable stackMapTable;
+
+	public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,
+			String code /* ByteCodeCommand[] cmds */) {
+		super(attrNameIndex, attrLen);
+		this.maxStack = maxStack;
+		this.maxLocals = maxLocals;
+		this.codeLen = codeLen;
+		this.code = code;
+		// this.cmds = cmds;
+	}
+
+	public void setLineNumberTable(LineNumberTable t) {
+		this.lineNumTable = t;
+	}
+
+	public void setLocalVariableTable(LocalVariableTable t) {
+		this.localVarTable = t;
+	}
+
+	public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) {
+
+		return null;
+	}
+
+	private void setStackMapTable(StackMapTable t) {
+		this.stackMapTable = t;
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java
new file mode 100644
index 0000000000..71553b4fbb
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java
@@ -0,0 +1,46 @@
+package com.coderising.jvm.attr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class LineNumberTable extends AttributeInfo {
+	List<LineNumberItem> items = new ArrayList<LineNumberItem>();
+
+	private static class LineNumberItem {
+		int startPC;
+		int lineNum;
+
+		public int getStartPC() {
+			return startPC;
+		}
+
+		public void setStartPC(int startPC) {
+			this.startPC = startPC;
+		}
+
+		public int getLineNum() {
+			return lineNum;
+		}
+
+		public void setLineNum(int lineNum) {
+			this.lineNum = lineNum;
+		}
+	}
+
+	public void addLineNumberItem(LineNumberItem item) {
+		this.items.add(item);
+	}
+
+	public LineNumberTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+
+	}
+
+	public static LineNumberTable parse(ByteCodeIterator iter) {
+
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java
new file mode 100644
index 0000000000..9561e904a9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java
@@ -0,0 +1,49 @@
+package com.coderising.jvm.attr;
+
+public class LocalVariableItem {
+	private int startPC;
+	private int length;
+	private int nameIndex;
+	private int descIndex;
+	private int index;
+
+	public int getStartPC() {
+		return startPC;
+	}
+
+	public void setStartPC(int startPC) {
+		this.startPC = startPC;
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	public int getNameIndex() {
+		return nameIndex;
+	}
+
+	public void setNameIndex(int nameIndex) {
+		this.nameIndex = nameIndex;
+	}
+
+	public int getDescIndex() {
+		return descIndex;
+	}
+
+	public void setDescIndex(int descIndex) {
+		this.descIndex = descIndex;
+	}
+
+	public int getIndex() {
+		return index;
+	}
+
+	public void setIndex(int index) {
+		this.index = index;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java
new file mode 100644
index 0000000000..b8a3ccfa8f
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java
@@ -0,0 +1,25 @@
+package com.coderising.jvm.attr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class LocalVariableTable extends AttributeInfo {
+
+	List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();
+
+	public LocalVariableTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+	}
+
+	public static LocalVariableTable parse(ByteCodeIterator iter) {
+
+		return null;
+	}
+
+	private void addLocalVariableItem(LocalVariableItem item) {
+		this.items.add(item);
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java
new file mode 100644
index 0000000000..14427e19ee
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java
@@ -0,0 +1,29 @@
+package com.coderising.jvm.attr;
+
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class StackMapTable extends AttributeInfo {
+
+	private String originalCode;
+
+	public StackMapTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+	}
+
+	public static StackMapTable parse(ByteCodeIterator iter) {
+		int index = iter.nextU2ToInt();
+		int len = iter.nextU4ToInt();
+		StackMapTable t = new StackMapTable(index, len);
+
+		// 后面的StackMapTable太过复杂， 不再处理， 只把原始的代码读进来保存
+		String code = iter.nextUxToHexString(len);
+		t.setOriginalCode(code);
+
+		return t;
+	}
+
+	private void setOriginalCode(String code) {
+		this.originalCode = code;
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..2cc6092de0
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java
@@ -0,0 +1,26 @@
+package com.coderising.jvm.clz;
+
+public class AccessFlag {
+	private int flagValue;
+
+	public AccessFlag(int value) {
+		this.flagValue = value;
+	}
+
+	public int getFlagValue() {
+		return flagValue;
+	}
+
+	public void setFlagValue(int flag) {
+		this.flagValue = flag;
+	}
+
+	public boolean isPublicClass() {
+		return (this.flagValue & 0x0001) != 0;
+	}
+
+	public boolean isFinalClass() {
+		return (this.flagValue & 0x0010) != 0;
+	}
+
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..ad5a7d71db
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java
@@ -0,0 +1,100 @@
+package com.coderising.jvm.clz;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.field.Field;
+import com.coderising.jvm.method.Method;
+
+public class ClassFile {
+
+	private int minorVersion;
+	private int majorVersion;
+
+	private AccessFlag accessFlag;
+	private ClassIndex clzIndex;
+	private ConstantPool pool;
+	private List<Field> fields = new ArrayList<Field>();
+	private List<Method> methods = new ArrayList<Method>();
+
+	public ClassIndex getClzIndex() {
+		return clzIndex;
+	}
+
+	public AccessFlag getAccessFlag() {
+		return accessFlag;
+	}
+
+	public void setAccessFlag(AccessFlag accessFlag) {
+		this.accessFlag = accessFlag;
+	}
+
+	public ConstantPool getConstantPool() {
+		return pool;
+	}
+
+	public int getMinorVersion() {
+		return minorVersion;
+	}
+
+	public void setMinorVersion(int minorVersion) {
+		this.minorVersion = minorVersion;
+	}
+
+	public int getMajorVersion() {
+		return majorVersion;
+	}
+
+	public void setMajorVersion(int majorVersion) {
+		this.majorVersion = majorVersion;
+	}
+
+	public void setConstPool(ConstantPool pool) {
+		this.pool = pool;
+
+	}
+
+	public void setClassIndex(ClassIndex clzIndex) {
+		this.clzIndex = clzIndex;
+	}
+
+	public void addField(Field f) {
+		this.fields.add(f);
+	}
+
+	public List<Field> getFields() {
+		return this.fields;
+	}
+
+	public void addMethod(Method m) {
+		this.methods.add(m);
+	}
+
+	public List<Method> getMethods() {
+		return methods;
+	}
+
+	public void print() {
+
+		if (this.accessFlag.isPublicClass()) {
+			System.out.println("Access flag : public  ");
+		}
+		System.out.println("Class Name:" + getClassName());
+
+		System.out.println("Super Class Name:" + getSuperClassName());
+
+	}
+
+	private String getClassName() {
+		int thisClassIndex = this.clzIndex.getThisClassIndex();
+		ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex);
+		return thisClass.getClassName();
+	}
+
+	private String getSuperClassName() {
+		ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+		return superClass.getClassName();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..0212bc9fb3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java
@@ -0,0 +1,22 @@
+package com.coderising.jvm.clz;
+
+public class ClassIndex {
+	private int thisClassIndex;
+	private int superClassIndex;
+
+	public int getThisClassIndex() {
+		return thisClassIndex;
+	}
+
+	public void setThisClassIndex(int thisClassIndex) {
+		this.thisClassIndex = thisClassIndex;
+	}
+
+	public int getSuperClassIndex() {
+		return superClassIndex;
+	}
+
+	public void setSuperClassIndex(int superClassIndex) {
+		this.superClassIndex = superClassIndex;
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..4b593e7347
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+	private int type = ConstantInfo.CLASS_INFO;
+	private int utf8Index;
+
+	public ClassInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getUtf8Index() {
+		return utf8Index;
+	}
+
+	public void setUtf8Index(int utf8Index) {
+		this.utf8Index = utf8Index;
+	}
+
+	public int getType() {
+		return type;
+	}
+
+	public String getClassName() {
+		int index = getUtf8Index();
+		UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index);
+		return utf8Info.getValue();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..5ef8fbfef8
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
@@ -0,0 +1,29 @@
+package com.coderising.jvm.constant;
+
+public abstract class ConstantInfo {
+	public static final int UTF8_INFO = 1;
+	public static final int FLOAT_INFO = 4;
+	public static final int CLASS_INFO = 7;
+	public static final int STRING_INFO = 8;
+	public static final int FIELD_INFO = 9;
+	public static final int METHOD_INFO = 10;
+	public static final int NAME_AND_TYPE_INFO = 12;
+	protected ConstantPool constantPool;
+
+	public ConstantInfo() {
+	}
+
+	public ConstantInfo(ConstantPool pool) {
+		this.constantPool = pool;
+	}
+
+	public abstract int getType();
+
+	public ConstantPool getConstantPool() {
+		return constantPool;
+	}
+
+	public ConstantInfo getConstantInfo(int index) {
+		return this.constantPool.getConstantInfo(index);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..49ece7d089
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+
+	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
+
+	public ConstantPool() {
+	}
+
+	public void addConstantInfo(ConstantInfo info) {
+		this.constantInfos.add(info);
+	}
+
+	public ConstantInfo getConstantInfo(int index) {
+		return this.constantInfos.get(index);
+	}
+
+	public String getUTF8String(int index) {
+		return ((UTF8Info) this.constantInfos.get(index)).getValue();
+	}
+
+	public Object getSize() {
+		return this.constantInfos.size() - 1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..469a30b95e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package com.coderising.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo {
+	private int type = ConstantInfo.FIELD_INFO;
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+
+	public FieldRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+
+	@Override
+	public String toString() {
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+		return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]";
+	}
+
+	public String getClassName() {
+		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+		UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index());
+		return utf8Info.getValue();
+	}
+
+	public String getFieldName() {
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+
+	public String getFieldType() {
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..837e501f9f
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,56 @@
+package com.coderising.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+	private int type = ConstantInfo.METHOD_INFO;
+
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+
+	public MethodRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+
+	@Override
+	public String toString() {
+		return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType();
+	}
+
+	public String getClassName() {
+		ConstantPool pool = this.getConstantPool();
+		ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex());
+		return clzInfo.getClassName();
+	}
+
+	public String getMethodName() {
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+
+	public String getParamAndReturnType() {
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..a792e2dc13
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,48 @@
+package com.coderising.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo {
+	public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+	private int index1;
+	private int index2;
+
+	public NameAndTypeInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getIndex1() {
+		return index1;
+	}
+
+	public void setIndex1(int index1) {
+		this.index1 = index1;
+	}
+
+	public int getIndex2() {
+		return index2;
+	}
+
+	public void setIndex2(int index2) {
+		this.index2 = index2;
+	}
+
+	public int getType() {
+		return type;
+	}
+
+	public String getName() {
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1);
+		return utf8Info1.getValue();
+	}
+
+	public String getTypeInfo() {
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2);
+		return utf8Info2.getValue();
+	}
+
+	public String toString() {
+		return "(" + getName() + "," + getTypeInfo() + ")";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..6e4e3750c7
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,11 @@
+package com.coderising.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+	public NullConstantInfo() {
+	}
+
+	@Override
+	public int getType() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..3282aad968
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java
@@ -0,0 +1,28 @@
+package com.coderising.jvm.constant;
+
+public class StringInfo extends ConstantInfo {
+	private int type = ConstantInfo.STRING_INFO;
+	private int index;
+
+	public StringInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public int getIndex() {
+		return index;
+	}
+
+	public void setIndex(int index) {
+		this.index = index;
+	}
+
+	@Override
+	public String toString() {
+		return this.getConstantPool().getUTF8String(index);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..dc4d0b0b64
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java
@@ -0,0 +1,37 @@
+package com.coderising.jvm.constant;
+
+public class UTF8Info extends ConstantInfo {
+	private int type = ConstantInfo.UTF8_INFO;
+	private int length;
+	private String value;
+
+	public UTF8Info(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	@Override
+	public String toString() {
+		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]";
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java
new file mode 100644
index 0000000000..64742c6596
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java
@@ -0,0 +1,26 @@
+package com.coderising.jvm.field;
+
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class Field {
+	private int accessFlag;
+	private int nameIndex;
+	private int descriptorIndex;
+
+	private ConstantPool pool;
+
+	public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) {
+
+		this.accessFlag = accessFlag;
+		this.nameIndex = nameIndex;
+		this.descriptorIndex = descriptorIndex;
+		this.pool = pool;
+	}
+
+	public static Field parse(ConstantPool pool, ByteCodeIterator iter) {
+
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..3cc8ab6697
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,55 @@
+package com.coderising.jvm.loader;
+
+import java.util.Arrays;
+
+import com.coderising.jvm.util.Util;
+
+public class ByteCodeIterator {
+	byte[] codes;
+	int pos = 0;
+
+	ByteCodeIterator(byte[] codes) {
+		this.codes = codes;
+	}
+
+	public byte[] getBytes(int len) {
+		if (pos + len >= codes.length) {
+			throw new ArrayIndexOutOfBoundsException();
+		}
+
+		byte[] data = Arrays.copyOfRange(codes, pos, pos + len);
+		pos += len;
+		return data;
+	}
+
+	public int nextU1toInt() {
+
+		return Util.byteToInt(new byte[] { codes[pos++] });
+	}
+
+	public int nextU2ToInt() {
+		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] });
+	}
+
+	public int nextU4ToInt() {
+		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] });
+	}
+
+	public String nextU4ToHexString() {
+		return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }));
+	}
+
+	public String nextUxToHexString(int len) {
+		byte[] tmp = new byte[len];
+
+		for (int i = 0; i < len; i++) {
+			tmp[i] = codes[pos++];
+		}
+		return Util.byteToHexString(tmp).toLowerCase();
+
+	}
+
+	public void back(int n) {
+		this.pos -= n;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..1af1946bb3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,122 @@
+package com.coderising.jvm.loader;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.coderising.jvm.clz.ClassFile;
+
+public class ClassFileLoader {
+
+	private List<String> clzPaths = new ArrayList<String>();
+
+	public byte[] readBinaryCode(String className) {
+
+		className = className.replace('.', File.separatorChar) + ".class";
+
+		for (String path : this.clzPaths) {
+
+			String clzFileName = path + File.separatorChar + className;
+			byte[] codes = loadClassFile(clzFileName);
+			if (codes != null) {
+				return codes;
+			}
+		}
+
+		return null;
+
+	}
+
+	private byte[] loadClassFile(String clzFileName) {
+
+		File f = new File(clzFileName);
+
+		try {
+
+			return IOUtils.toByteArray(new FileInputStream(f));
+
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	public void addClassPath(String path) {
+		if (this.clzPaths.contains(path)) {
+			return;
+		}
+
+		this.clzPaths.add(path);
+
+	}
+
+	public String getClassPath() {
+		return StringUtils.join(this.clzPaths, ";");
+	}
+
+	public ClassFile loadClass(String className) {
+		byte[] codes = this.readBinaryCode(className);
+		ClassFileParser parser = new ClassFileParser();
+		return parser.parse(codes);
+
+	}
+
+	// ------------------------------backup------------------------
+	public String getClassPath_V1() {
+
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < this.clzPaths.size(); i++) {
+			buffer.append(this.clzPaths.get(i));
+			if (i < this.clzPaths.size() - 1) {
+				buffer.append(";");
+			}
+		}
+		return buffer.toString();
+	}
+
+	private byte[] loadClassFile_V1(String clzFileName) {
+
+		BufferedInputStream bis = null;
+
+		try {
+
+			File f = new File(clzFileName);
+
+			bis = new BufferedInputStream(new FileInputStream(f));
+
+			ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+			byte[] buffer = new byte[1024];
+			int length = -1;
+
+			while ((length = bis.read(buffer)) != -1) {
+				bos.write(buffer, 0, length);
+			}
+
+			byte[] codes = bos.toByteArray();
+
+			return codes;
+
+		} catch (IOException e) {
+			e.printStackTrace();
+
+		} finally {
+			if (bis != null) {
+				try {
+					bis.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return null;
+
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..b32ca1926b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
@@ -0,0 +1,146 @@
+package com.coderising.jvm.loader;
+
+import java.io.UnsupportedEncodingException;
+
+import com.coderising.jvm.clz.AccessFlag;
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.clz.ClassIndex;
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.constant.FieldRefInfo;
+import com.coderising.jvm.constant.MethodRefInfo;
+import com.coderising.jvm.constant.NameAndTypeInfo;
+import com.coderising.jvm.constant.NullConstantInfo;
+import com.coderising.jvm.constant.StringInfo;
+import com.coderising.jvm.constant.UTF8Info;
+
+public class ClassFileParser {
+
+	public ClassFile parse(byte[] codes) {
+
+		ClassFile clzFile = new ClassFile();
+
+		ByteCodeIterator iter = new ByteCodeIterator(codes);
+
+		String magicNumber = iter.nextU4ToHexString();
+
+		if (!"cafebabe".equals(magicNumber)) {
+			return null;
+		}
+
+		clzFile.setMinorVersion(iter.nextU2ToInt());
+		clzFile.setMajorVersion(iter.nextU2ToInt());
+
+		ConstantPool pool = parseConstantPool(iter);
+		clzFile.setConstPool(pool);
+
+		AccessFlag flag = parseAccessFlag(iter);
+		clzFile.setAccessFlag(flag);
+
+		ClassIndex clzIndex = parseClassInfex(iter);
+		clzFile.setClassIndex(clzIndex);
+
+		parseInterfaces(iter);
+
+		return clzFile;
+	}
+
+	private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
+
+		AccessFlag flag = new AccessFlag(iter.nextU2ToInt());
+		// System.out.println("Is public class: " + flag.isPublicClass());
+		// System.out.println("Is final class : " + flag.isFinalClass());
+
+		return flag;
+	}
+
+	private ClassIndex parseClassInfex(ByteCodeIterator iter) {
+
+		int thisClassIndex = iter.nextU2ToInt();
+		int superClassIndex = iter.nextU2ToInt();
+
+		ClassIndex clzIndex = new ClassIndex();
+
+		clzIndex.setThisClassIndex(thisClassIndex);
+		clzIndex.setSuperClassIndex(superClassIndex);
+
+		return clzIndex;
+
+	}
+
+	private ConstantPool parseConstantPool(ByteCodeIterator iter) {
+
+		int constPoolCount = iter.nextU2ToInt();
+
+		System.out.println("Constant Pool Count :" + constPoolCount);
+
+		ConstantPool pool = new ConstantPool();
+
+		pool.addConstantInfo(new NullConstantInfo());
+
+		for (int i = 1; i <= constPoolCount - 1; i++) {
+
+			int tag = iter.nextU1toInt();
+
+			if (tag == 7) {
+				// Class Info
+				int utf8Index = iter.nextU2ToInt();
+				ClassInfo clzInfo = new ClassInfo(pool);
+				clzInfo.setUtf8Index(utf8Index);
+
+				pool.addConstantInfo(clzInfo);
+			} else if (tag == 1) {
+				// UTF-8 String
+				int len = iter.nextU2ToInt();
+				byte[] data = iter.getBytes(len);
+				String value = null;
+				try {
+					value = new String(data, "UTF-8");
+				} catch (UnsupportedEncodingException e) {
+					e.printStackTrace();
+				}
+
+				UTF8Info utf8Str = new UTF8Info(pool);
+				utf8Str.setLength(len);
+				utf8Str.setValue(value);
+				pool.addConstantInfo(utf8Str);
+			} else if (tag == 8) {
+				StringInfo info = new StringInfo(pool);
+				info.setIndex(iter.nextU2ToInt());
+				pool.addConstantInfo(info);
+			} else if (tag == 9) {
+				FieldRefInfo field = new FieldRefInfo(pool);
+				field.setClassInfoIndex(iter.nextU2ToInt());
+				field.setNameAndTypeIndex(iter.nextU2ToInt());
+				pool.addConstantInfo(field);
+			} else if (tag == 10) {
+				// MethodRef
+				MethodRefInfo method = new MethodRefInfo(pool);
+				method.setClassInfoIndex(iter.nextU2ToInt());
+				method.setNameAndTypeIndex(iter.nextU2ToInt());
+				pool.addConstantInfo(method);
+			} else if (tag == 12) {
+				// Name and Type Info
+				NameAndTypeInfo nameType = new NameAndTypeInfo(pool);
+				nameType.setIndex1(iter.nextU2ToInt());
+				nameType.setIndex2(iter.nextU2ToInt());
+				pool.addConstantInfo(nameType);
+			} else {
+				throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet.");
+			}
+		}
+
+		System.out.println("Finished reading Constant pool ");
+
+		return pool;
+	}
+
+	private void parseInterfaces(ByteCodeIterator iter) {
+		int interfaceCount = iter.nextU2ToInt();
+
+		System.out.println("interfaceCount:" + interfaceCount);
+
+		// TODO : 如果实现了interface, 这里需要解析
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java
new file mode 100644
index 0000000000..690e71a8de
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java
@@ -0,0 +1,48 @@
+package com.coderising.jvm.method;
+
+import com.coderising.jvm.attr.CodeAttr;
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.loader.ByteCodeIterator;
+
+public class Method {
+
+	private int accessFlag;
+	private int nameIndex;
+	private int descriptorIndex;
+
+	private CodeAttr codeAttr;
+
+	private ClassFile clzFile;
+
+	public ClassFile getClzFile() {
+		return clzFile;
+	}
+
+	public int getNameIndex() {
+		return nameIndex;
+	}
+
+	public int getDescriptorIndex() {
+		return descriptorIndex;
+	}
+
+	public CodeAttr getCodeAttr() {
+		return codeAttr;
+	}
+
+	public void setCodeAttr(CodeAttr code) {
+		this.codeAttr = code;
+	}
+
+	public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) {
+		this.clzFile = clzFile;
+		this.accessFlag = accessFlag;
+		this.nameIndex = nameIndex;
+		this.descriptorIndex = descriptorIndex;
+	}
+
+	public static Method parse(ClassFile clzFile, ByteCodeIterator iter) {
+		return null;
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java
new file mode 100644
index 0000000000..1f9e087bb9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java
@@ -0,0 +1,22 @@
+package com.coderising.jvm.util;
+
+public class Util {
+	public static int byteToInt(byte[] codes) {
+		String s1 = byteToHexString(codes);
+		return Integer.valueOf(s1, 16).intValue();
+	}
+
+	public static String byteToHexString(byte[] codes) {
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < codes.length; i++) {
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if (strHex.length() < 2) {
+				strHex = "0" + strHex;
+			}
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..5f41f42c62
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..5ad5ccb352
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,30 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class Struts {
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f1e7fcfa19
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,26 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java
new file mode 100644
index 0000000000..835e0311d1
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java
@@ -0,0 +1,33 @@
+package com.coding.basic;
+
+public class ArrayList implements List {
+
+	private int size = 0;
+
+	private Object[] elementData = new Object[100];
+
+	public void add(Object o) {
+
+	}
+
+	public void add(int index, Object o) {
+
+	}
+
+	public Object get(int index) {
+		return null;
+	}
+
+	public Object remove(int index) {
+		return null;
+	}
+
+	public int size() {
+		return -1;
+	}
+
+	public Iterator iterator() {
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java
new file mode 100644
index 0000000000..ed475b9433
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		return null;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		return null;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		return null;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		return null;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		return null;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		return null;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..2f944d3b91
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,37 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+	public BinaryTreeNode insert(Object o) {
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..f30dfc8edf
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,8 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+
+	public Object next();
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java
new file mode 100644
index 0000000000..28a3314b0d
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java
@@ -0,0 +1,50 @@
+package com.coding.basic;
+
+/**
+ * 用双向链表实现LRU算法
+ * 
+ * @author liuxin
+ */
+public class LRUPageFrame {
+	private static class Node {
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	public LRUPageFrame(int capacity) {
+		this.capacity = capacity;
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while (node != null) {
+			buffer.append(node.pageNum);
+
+			node = node.next;
+			if (node != null) {
+				buffer.append(",");
+			}
+		}
+
+		return buffer.toString();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java
new file mode 100644
index 0000000000..4fe91d2c95
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java
@@ -0,0 +1,126 @@
+package com.coding.basic;
+
+public class LinkedList implements List {
+
+	private Node head;
+
+	public void add(Object o) {
+
+	}
+
+	public void add(int index, Object o) {
+
+	}
+
+	public Object get(int index) {
+		return null;
+	}
+
+	public Object remove(int index) {
+		return null;
+	}
+
+	public int size() {
+		return -1;
+	}
+
+	public void addFirst(Object o) {
+
+	}
+
+	public void addLast(Object o) {
+
+	}
+
+	public Object removeFirst() {
+		return null;
+	}
+
+	public Object removeLast() {
+		return null;
+	}
+
+	public Iterator iterator() {
+		return null;
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+	}
+
+	/**
+	 * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3
+	 */
+	public void reverse() {
+
+	}
+
+	/**
+	 * 删除一个单链表的前半部分 例如：list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10
+	 * ,删除以后的值为7,8,10
+	 * 
+	 */
+	public void removeFirstHalf() {
+
+	}
+
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * 
+	 * @param i
+	 * @param length
+	 */
+	public void remove(int i, int length) {
+
+	}
+
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数 从当前链表中取出那些listB所指定的元素 例如当前链表 =
+	 * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]
+	 * 
+	 * @param list
+	 */
+	public int[] getElements(LinkedList list) {
+		return null;
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 从当前链表中中删除在listB中出现的元素
+	 * 
+	 * @param list
+	 */
+
+	public void subtract(LinkedList list) {
+
+	}
+
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public void removeDuplicateValues() {
+
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * 
+	 * @param min
+	 * @param max
+	 */
+	public void removeRange(int min, int max) {
+
+	}
+
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * 
+	 * @param list
+	 */
+	public LinkedList intersection(LinkedList list) {
+		return null;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..03fa879b2e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,13 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+
+	public void add(int index, Object o);
+
+	public Object get(int index);
+
+	public Object remove(int index);
+
+	public int size();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..b2908512c5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java
@@ -0,0 +1,19 @@
+package com.coding.basic;
+
+public class Queue {
+
+	public void enQueue(Object o) {
+	}
+
+	public Object deQueue() {
+		return null;
+	}
+
+	public boolean isEmpty() {
+		return false;
+	}
+
+	public int size() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..b09c9b3d91
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,26 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+
+	public void push(Object o) {
+	}
+
+	public Object pop() {
+		return null;
+	}
+
+	public Object peek() {
+		return null;
+	}
+
+	public boolean isEmpty() {
+		return false;
+	}
+
+	public int size() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..de35c05449
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,54 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+public class StackUtil {
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack s) {
+	}
+
+	public static void addToBottom(Stack<Integer> s, Integer value) {
+		if (s.isEmpty()) {
+			s.push(value);
+		} else {
+			Integer top = s.pop();
+			addToBottom(s, value);
+			s.push(top);
+		}
+	}
+
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s, Object o) {
+
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty，
+	 * 可以使用另外一个栈来辅助
+	 * 
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s, int len) {
+		return null;
+	}
+
+	/**
+	 * 字符串s 可能包含这些字符： ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s =
+	 * "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true 如果 s = "([b{x]y})",
+	 * 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * 
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s) {
+		return false;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..4f2cf4b03a
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,13 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+		return 0.0f;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml
new file mode 100644
index 0000000000..ff7623e6e1
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+	<action name="login" class="com.coderising.litestruts.LoginAction">
+		<result name="success">/jsp/homepage.jsp</result>
+		<result name="fail">/jsp/showLogin.jsp</result>
+	</action>
+	<action name="logout" class="com.coderising.litestruts.LogoutAction">
+		<result name="success">/jsp/welcome.jsp</result>
+		<result name="error">/jsp/error.jsp</result>
+	</action>
+</struts>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java
new file mode 100644
index 0000000000..8e171cff93
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java
@@ -0,0 +1,56 @@
+package com.coderising.download.core;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+
+		String url = "http://localhost:8080/test.jpg";
+
+		FileDownloader downloader = new FileDownloader(url);
+
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+
+		});
+
+		downloader.execute();
+
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				// 休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		System.out.println("下载完成！");
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java
new file mode 100644
index 0000000000..6b78de3ddc
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java
@@ -0,0 +1,248 @@
+package com.coderising.jvm.loader;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.jvm.clz.ClassFile;
+import com.coderising.jvm.clz.ClassIndex;
+import com.coderising.jvm.constant.ClassInfo;
+import com.coderising.jvm.constant.ConstantPool;
+import com.coderising.jvm.constant.MethodRefInfo;
+import com.coderising.jvm.constant.NameAndTypeInfo;
+import com.coderising.jvm.constant.UTF8Info;
+import com.coderising.jvm.field.Field;
+import com.coderising.jvm.method.Method;
+
+public class ClassFileloaderTest {
+	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
+
+	static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin";
+	static String path2 = "C:\temp";
+
+	static ClassFile clzFile = null;
+	static {
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+
+		clzFile = loader.loadClass(className);
+		clzFile.print();
+	}
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testClassPath() {
+
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+
+		String clzPath = loader.getClassPath();
+
+		Assert.assertEquals(path1 + ";" + path2, clzPath);
+
+	}
+
+	@Test
+	public void testClassFileLength() {
+
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+
+		String className = "com.coderising.jvm.test.EmployeeV1";
+
+		byte[] byteCodes = loader.readBinaryCode(className);
+
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1056, byteCodes.length);
+
+	}
+
+	@Test
+	public void testMagicNumber() {
+		ClassFileLoader loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		String className = "com.coderising.jvm.test.EmployeeV1";
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] };
+
+		String acctualValue = this.byteToHexString(codes);
+
+		Assert.assertEquals("cafebabe", acctualValue);
+	}
+
+	private String byteToHexString(byte[] codes) {
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < codes.length; i++) {
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if (strHex.length() < 2) {
+				strHex = "0" + strHex;
+			}
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * ----------------------------------------------------------------------
+	 */
+
+	@Test
+	public void testVersion() {
+
+		Assert.assertEquals(0, clzFile.getMinorVersion());
+		Assert.assertEquals(52, clzFile.getMajorVersion());
+
+	}
+
+	@Test
+	public void testConstantPool() {
+
+		ConstantPool pool = clzFile.getConstantPool();
+
+		Assert.assertEquals(53, pool.getSize());
+
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+			Assert.assertEquals(2, clzInfo.getUtf8Index());
+
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+		}
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+			Assert.assertEquals(4, clzInfo.getUtf8Index());
+
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+		}
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+			Assert.assertEquals("name", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+			Assert.assertEquals("age", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+			Assert.assertEquals("I", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+			Assert.assertEquals("<init>", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+			Assert.assertEquals("Code", utf8Info.getValue());
+		}
+
+		{
+			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(12);
+			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+		}
+
+		{
+			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+			Assert.assertEquals(9, nameAndType.getIndex1());
+			Assert.assertEquals(14, nameAndType.getIndex2());
+		}
+		// 抽查几个吧
+		{
+			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(45);
+			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+		}
+
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+		}
+	}
+
+	@Test
+	public void testClassIndex() {
+
+		ClassIndex clzIndex = clzFile.getClzIndex();
+		ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+		ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+		Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+		Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+	}
+
+	/**
+	 * 下面是第三次JVM课应实现的测试用例
+	 */
+	@Test
+	public void testReadFields() {
+
+		List<Field> fields = clzFile.getFields();
+		Assert.assertEquals(2, fields.size());
+		{
+			Field f = fields.get(0);
+			Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+		}
+		{
+			Field f = fields.get(1);
+			Assert.assertEquals("age:I", f.toString());
+		}
+	}
+
+	@Test
+	public void testMethods() {
+
+		List<Method> methods = clzFile.getMethods();
+		ConstantPool pool = clzFile.getConstantPool();
+
+		{
+			Method m = methods.get(0);
+			assertMethodEquals(pool, m, "<init>", "(Ljava/lang/String;I)V", "2ab7000c2a2bb5000f2a1cb50011b1");
+
+		}
+		{
+			Method m = methods.get(1);
+			assertMethodEquals(pool, m, "setName", "(Ljava/lang/String;)V", "2a2bb5000fb1");
+
+		}
+		{
+			Method m = methods.get(2);
+			assertMethodEquals(pool, m, "setAge", "(I)V", "2a1bb50011b1");
+		}
+		{
+			Method m = methods.get(3);
+			assertMethodEquals(pool, m, "sayHello", "()V", "b2001c1222b60024b1");
+
+		}
+		{
+			Method m = methods.get(4);
+			assertMethodEquals(pool, m, "main", "([Ljava/lang/String;)V", "bb000159122b101db7002d4c2bb6002fb1");
+		}
+	}
+
+	private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc,
+			String expectedCode) {
+		String methodName = pool.getUTF8String(m.getNameIndex());
+		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+		String code = m.getCodeAttr().getCode();
+		Assert.assertEquals(expectedName, methodName);
+		Assert.assertEquals(expectedDesc, methodDesc);
+		Assert.assertEquals(expectedCode, code);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java
new file mode 100644
index 0000000000..2b80092ecb
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java
@@ -0,0 +1,30 @@
+package com.coderising.jvm.loader;
+
+public class EmployeeV1 {
+
+	private String name;
+	private int age;
+
+	public EmployeeV1(String name, int age) {
+		this.name = name;
+		this.age = age;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+	public void sayHello() {
+		System.out.println("Hello , this is class Employee ");
+	}
+
+	public static void main(String[] args) {
+		EmployeeV1 p = new EmployeeV1("Andy", 29);
+		p.sayHello();
+
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..f2426db6ea
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "1234");
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+		Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java
new file mode 100644
index 0000000000..bc139cbe2d
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java
@@ -0,0 +1,27 @@
+package com.coding.basic;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LRUPageFrameTest {
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..5976823f36
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,78 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testAddToBottom() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+
+		StackUtil.addToBottom(s, 0);
+
+		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+
+	}
+
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..2f03b3ac9a
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,45 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		// InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml
new file mode 100644
index 0000000000..80266b31de
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml
@@ -0,0 +1,31 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-52-liuxin-answer</artifactId>
+	<description>eulerlcs master java road copy from liuxin answer</description>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>jdom2</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java
new file mode 100644
index 0000000000..76dc0f3a40
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java
@@ -0,0 +1,28 @@
+package com.coderising.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * 
+	 * @param startPos
+	 *            开始位置， 从0开始
+	 * @param endPos
+	 *            结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos, int endPos) throws IOException;
+
+	/**
+	 * 得到数据内容的长度
+	 * 
+	 * @return
+	 */
+	public int getContentLength();
+
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java
new file mode 100644
index 0000000000..4666b77756
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java
@@ -0,0 +1,8 @@
+package com.coderising.download.api;
+
+public class ConnectionException extends Exception {
+	public ConnectionException(Exception e) {
+		super(e);
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..787984f170
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java
@@ -0,0 +1,11 @@
+package com.coderising.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * 
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java
new file mode 100644
index 0000000000..bf9807b307
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.coderising.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java
new file mode 100644
index 0000000000..faf849d975
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java
@@ -0,0 +1,50 @@
+package com.coderising.download.core;
+
+import java.io.RandomAccessFile;
+import java.util.concurrent.CyclicBarrier;
+
+import com.coderising.download.api.Connection;
+
+public class DownloadThread extends Thread {
+
+	Connection conn;
+	int startPos;
+	int endPos;
+	CyclicBarrier barrier;
+	String localFile;
+
+	public DownloadThread(Connection conn, int startPos, int endPos, String localFile, CyclicBarrier barrier) {
+
+		this.conn = conn;
+		this.startPos = startPos;
+		this.endPos = endPos;
+		this.localFile = localFile;
+		this.barrier = barrier;
+	}
+
+	public void run() {
+
+		try {
+			System.out.println("Begin to read [" + startPos + "-" + endPos + "]");
+
+			byte[] data = conn.read(startPos, endPos);
+
+			RandomAccessFile file = new RandomAccessFile(localFile, "rw");
+
+			file.seek(startPos);
+
+			file.write(data);
+
+			file.close();
+
+			conn.close();
+
+			barrier.await(); // 等待别的线程完成
+
+		} catch (Exception e) {
+			e.printStackTrace();
+
+		}
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java
new file mode 100644
index 0000000000..b5831a72bd
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java
@@ -0,0 +1,126 @@
+package com.coderising.download.core;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.concurrent.CyclicBarrier;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+
+public class FileDownloader {
+
+	private String url;
+	private String localFile;
+
+	DownloadListener listener;
+
+	ConnectionManager cm;
+
+	private static final int DOWNLOAD_TRHEAD_NUM = 3;
+
+	public FileDownloader(String _url, String localFile) {
+		this.url = _url;
+		this.localFile = localFile;
+
+	}
+
+	public void execute() {
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos,
+		// endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		// 线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接，
+		// 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载， 注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+
+		CyclicBarrier barrier = new CyclicBarrier(DOWNLOAD_TRHEAD_NUM, new Runnable() {
+			public void run() {
+				listener.notifyFinished();
+			}
+		});
+
+		Connection conn = null;
+		try {
+
+			conn = cm.open(this.url);
+
+			int length = conn.getContentLength();
+
+			createPlaceHolderFile(this.localFile, length);
+
+			int[][] ranges = allocateDownloadRange(DOWNLOAD_TRHEAD_NUM, length);
+
+			for (int i = 0; i < DOWNLOAD_TRHEAD_NUM; i++) {
+
+				DownloadThread thread = new DownloadThread(cm.open(url), ranges[i][0], ranges[i][1], localFile,
+						barrier);
+
+				thread.start();
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (conn != null) {
+				conn.close();
+			}
+		}
+
+	}
+
+	private void createPlaceHolderFile(String fileName, int contentLen) throws IOException {
+
+		RandomAccessFile file = new RandomAccessFile(fileName, "rw");
+
+		for (int i = 0; i < contentLen; i++) {
+			file.write(0);
+		}
+
+		file.close();
+	}
+
+	private int[][] allocateDownloadRange(int threadNum, int contentLen) {
+		int[][] ranges = new int[threadNum][2];
+
+		int eachThreadSize = contentLen / threadNum;// 每个线程需要下载的文件大小
+		int left = contentLen % threadNum;// 剩下的归最后一个线程来处理
+
+		for (int i = 0; i < threadNum; i++) {
+
+			int startPos = i * eachThreadSize;
+
+			int endPos = (i + 1) * eachThreadSize - 1;
+
+			if ((i == (threadNum - 1))) {
+				endPos += left;
+			}
+			ranges[i][0] = startPos;
+			ranges[i][1] = endPos;
+
+		}
+
+		return ranges;
+	}
+
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	public void setConnectionManager(ConnectionManager ucm) {
+		this.cm = ucm;
+	}
+
+	public DownloadListener getListener() {
+		return this.listener;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..d1aa121f75
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
@@ -0,0 +1,84 @@
+package com.coderising.download.impl;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Arrays;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+
+class ConnectionImpl implements Connection {
+
+	URL url;
+	static final int BUFFER_SIZE = 1024;
+
+	ConnectionImpl(String _url) throws ConnectionException {
+		try {
+			url = new URL(_url);
+		} catch (MalformedURLException e) {
+			throw new ConnectionException(e);
+		}
+	}
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+
+		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
+
+		httpConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
+
+		InputStream is = httpConn.getInputStream();
+
+		// is.skip(startPos);
+
+		byte[] buff = new byte[BUFFER_SIZE];
+
+		int totalLen = endPos - startPos + 1;
+
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+		while (baos.size() < totalLen) {
+
+			int len = is.read(buff);
+			if (len < 0) {
+				break;
+			}
+			baos.write(buff, 0, len);
+		}
+
+		if (baos.size() > totalLen) {
+			byte[] data = baos.toByteArray();
+			return Arrays.copyOf(data, totalLen);
+		}
+
+		return baos.toByteArray();
+	}
+
+	@Override
+	public int getContentLength() {
+
+		URLConnection con;
+		try {
+			con = url.openConnection();
+
+			return con.getContentLength();
+
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		return -1;
+
+	}
+
+	@Override
+	public void close() {
+
+	}
+
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..5e98063eaa
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,15 @@
+package com.coderising.download.impl;
+
+import com.coderising.download.api.Connection;
+import com.coderising.download.api.ConnectionException;
+import com.coderising.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+
+		return new ConnectionImpl(url);
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java
new file mode 100644
index 0000000000..5b0f60c148
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java
@@ -0,0 +1,113 @@
+package com.coderising.litestruts;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jdom2.Document;
+import org.jdom2.Element;
+import org.jdom2.JDOMException;
+import org.jdom2.input.SAXBuilder;
+
+public class Configuration {
+
+	Map<String, ActionConfig> actions = new HashMap<>();
+
+	public Configuration(String fileName) {
+
+		String packageName = this.getClass().getPackage().getName();
+
+		packageName = packageName.replace('.', '/');
+
+		InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName);
+
+		parseXML(is);
+
+		try {
+			is.close();
+		} catch (IOException e) {
+			throw new ConfigurationException(e);
+		}
+	}
+
+	private void parseXML(InputStream is) {
+
+		SAXBuilder builder = new SAXBuilder();
+
+		try {
+
+			Document doc = builder.build(is);
+
+			Element root = doc.getRootElement();
+
+			for (Element actionElement : root.getChildren("action")) {
+
+				String actionName = actionElement.getAttributeValue("name");
+				String clzName = actionElement.getAttributeValue("class");
+
+				ActionConfig ac = new ActionConfig(actionName, clzName);
+
+				for (Element resultElement : actionElement.getChildren("result")) {
+
+					String resultName = resultElement.getAttributeValue("name");
+					String viewName = resultElement.getText().trim();
+
+					ac.addViewResult(resultName, viewName);
+
+				}
+
+				this.actions.put(actionName, ac);
+			}
+
+		} catch (JDOMException e) {
+			throw new ConfigurationException(e);
+
+		} catch (IOException e) {
+			throw new ConfigurationException(e);
+
+		}
+
+	}
+
+	public String getClassName(String action) {
+		ActionConfig ac = this.actions.get(action);
+		if (ac == null) {
+			return null;
+		}
+		return ac.getClassName();
+	}
+
+	public String getResultView(String action, String resultName) {
+		ActionConfig ac = this.actions.get(action);
+		if (ac == null) {
+			return null;
+		}
+		return ac.getViewName(resultName);
+	}
+
+	private static class ActionConfig {
+
+		String name;
+		String clzName;
+		Map<String, String> viewResult = new HashMap<>();
+
+		public ActionConfig(String actionName, String clzName) {
+			this.name = actionName;
+			this.clzName = clzName;
+		}
+
+		public String getClassName() {
+			return clzName;
+		}
+
+		public void addViewResult(String name, String viewName) {
+			viewResult.put(name, viewName);
+		}
+
+		public String getViewName(String resultName) {
+			return viewResult.get(resultName);
+		}
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java
new file mode 100644
index 0000000000..97e286827f
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java
@@ -0,0 +1,21 @@
+package com.coderising.litestruts;
+
+import java.io.IOException;
+
+import org.jdom2.JDOMException;
+
+public class ConfigurationException extends RuntimeException {
+
+	public ConfigurationException(String msg) {
+		super(msg);
+	}
+
+	public ConfigurationException(JDOMException e) {
+		super(e);
+	}
+
+	public ConfigurationException(IOException e) {
+		super(e);
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..5f41f42c62
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java
@@ -0,0 +1,42 @@
+package com.coderising.litestruts;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	private String name;
+	private String password;
+	private String message;
+
+	public String getName() {
+		return name;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getMessage() {
+		return this.message;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java
new file mode 100644
index 0000000000..1ba13d5245
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java
@@ -0,0 +1,120 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ReflectionUtil {
+
+	public static List<Method> getSetterMethods(Class clz) {
+
+		return getMethods(clz, "set");
+
+	}
+
+	public static void setParameters(Object o, Map<String, String> params) {
+
+		List<Method> methods = getSetterMethods(o.getClass());
+
+		for (String name : params.keySet()) {
+
+			String methodName = "set" + name;
+
+			for (Method m : methods) {
+
+				if (m.getName().equalsIgnoreCase(methodName)) {
+					try {
+						m.invoke(o, params.get(name));
+					} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+
+	}
+
+	public static List<Method> getGetterMethods(Class<?> clz) {
+		return getMethods(clz, "get");
+	}
+
+	private static List<Method> getMethods(Class<?> clz, String startWithName) {
+
+		List<Method> methods = new ArrayList<>();
+
+		for (Method m : clz.getDeclaredMethods()) {
+
+			if (m.getName().startsWith(startWithName)) {
+
+				methods.add(m);
+
+			}
+
+		}
+
+		return methods;
+	}
+
+	public static Map<String, Object> getParamterMap(Object o) {
+
+		Map<String, Object> params = new HashMap<>();
+
+		List<Method> methods = getGetterMethods(o.getClass());
+
+		for (Method m : methods) {
+
+			String methodName = m.getName();
+			String name = methodName.replaceFirst("get", "").toLowerCase();
+			try {
+				Object value = m.invoke(o);
+				params.put(name, value);
+			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+
+				e.printStackTrace();
+			}
+		}
+
+		return params;
+	}
+
+	//////////////////////// Backup ///////////////////////////////////
+
+	public static List<Method> getGetterMethods_V1(Class<?> clz) {
+
+		List<Method> methods = new ArrayList<>();
+
+		for (Method m : clz.getDeclaredMethods()) {
+
+			if (m.getName().startsWith("get")) {
+
+				methods.add(m);
+
+			}
+
+		}
+
+		return methods;
+	}
+
+	public static List<Method> getSetterMethods_V1(Class clz) {
+
+		List<Method> methods = new ArrayList<>();
+
+		for (Method m : clz.getDeclaredMethods()) {
+
+			if (m.getName().startsWith("set")) {
+
+				methods.add(m);
+
+			}
+
+		}
+
+		return methods;
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..b3fe556ebc
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java
@@ -0,0 +1,56 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+public class Struts {
+	private final static Configuration cfg = new Configuration("struts.xml");
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+		/*
+		 * 
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+
+		String clzName = cfg.getClassName(actionName);
+
+		if (clzName == null) {
+			return null;
+		}
+
+		try {
+			Class<?> clz = Class.forName(clzName);
+			Object action = clz.newInstance();
+
+			ReflectionUtil.setParameters(action, parameters);
+
+			Method m = clz.getDeclaredMethod("execute");
+			String resultName = (String) m.invoke(action);
+
+			Map<String, Object> params = ReflectionUtil.getParamterMap(action);
+			String resultView = cfg.getResultView(actionName, resultName);
+			View view = new View();
+			view.setParameters(params);
+			view.setJsp(resultView);
+			return view;
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..f1e7fcfa19
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java
@@ -0,0 +1,26 @@
+package com.coderising.litestruts;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java
new file mode 100644
index 0000000000..2f944d3b91
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java
@@ -0,0 +1,37 @@
+package com.coding.basic;
+
+public class BinaryTreeNode {
+
+	private Object data;
+	private BinaryTreeNode left;
+	private BinaryTreeNode right;
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+
+	public BinaryTreeNode getLeft() {
+		return left;
+	}
+
+	public void setLeft(BinaryTreeNode left) {
+		this.left = left;
+	}
+
+	public BinaryTreeNode getRight() {
+		return right;
+	}
+
+	public void setRight(BinaryTreeNode right) {
+		this.right = right;
+	}
+
+	public BinaryTreeNode insert(Object o) {
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java
new file mode 100644
index 0000000000..f30dfc8edf
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java
@@ -0,0 +1,8 @@
+package com.coding.basic;
+
+public interface Iterator {
+	public boolean hasNext();
+
+	public Object next();
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java
new file mode 100644
index 0000000000..03fa879b2e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java
@@ -0,0 +1,13 @@
+package com.coding.basic;
+
+public interface List {
+	public void add(Object o);
+
+	public void add(int index, Object o);
+
+	public Object get(int index);
+
+	public Object remove(int index);
+
+	public int size();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java
new file mode 100644
index 0000000000..b2908512c5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java
@@ -0,0 +1,19 @@
+package com.coding.basic;
+
+public class Queue {
+
+	public void enQueue(Object o) {
+	}
+
+	public Object deQueue() {
+		return null;
+	}
+
+	public boolean isEmpty() {
+		return false;
+	}
+
+	public int size() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java
new file mode 100644
index 0000000000..81dfe5bdfe
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java
@@ -0,0 +1,36 @@
+package com.coding.basic.array;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class ArrayList implements List {
+
+	private int size = 0;
+
+	private Object[] elementData = new Object[100];
+
+	public void add(Object o) {
+
+	}
+
+	public void add(int index, Object o) {
+
+	}
+
+	public Object get(int index) {
+		return null;
+	}
+
+	public Object remove(int index) {
+		return null;
+	}
+
+	public int size() {
+		return -1;
+	}
+
+	public Iterator iterator() {
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java
new file mode 100644
index 0000000000..0e8e077db7
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -0,0 +1,96 @@
+package com.coding.basic.array;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public void reverseArray(int[] origin) {
+
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public int[] removeZero(int[] oldArray) {
+		return null;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public int[] merge(int[] array1, int[] array2) {
+		return null;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param size
+	 * @return
+	 */
+	public int[] grow(int[] oldArray, int size) {
+		return null;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] fibonacci(int max) {
+		return null;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPrimes(int max) {
+		return null;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public int[] getPerfectNumbers(int max) {
+		return null;
+	}
+
+	/**
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param s
+	 * @return
+	 */
+	public String join(int[] array, String seperator) {
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
new file mode 100644
index 0000000000..305989d5de
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
@@ -0,0 +1,151 @@
+package com.coding.basic.linklist;
+
+public class LRUPageFrame {
+
+	private static class Node {
+
+		Node prev;
+		Node next;
+		int pageNum;
+
+		Node() {
+		}
+	}
+
+	private int capacity;
+
+	private int currentSize;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	public LRUPageFrame(int capacity) {
+		this.currentSize = 0;
+		this.capacity = capacity;
+
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param key
+	 * @return
+	 */
+	public void access(int pageNum) {
+
+		Node node = find(pageNum);
+		// 在该队列中存在， 则提到队列头
+		if (node != null) {
+
+			moveExistingNodeToHead(node);
+
+		} else {
+
+			node = new Node();
+			node.pageNum = pageNum;
+
+			// 缓存容器是否已经超过大小.
+			if (currentSize >= capacity) {
+				removeLast();
+
+			}
+
+			addNewNodetoHead(node);
+
+		}
+	}
+
+	private void addNewNodetoHead(Node node) {
+
+		if (isEmpty()) {
+
+			node.prev = null;
+			node.next = null;
+			first = node;
+			last = node;
+
+		} else {
+			node.prev = null;
+			node.next = first;
+			first.prev = node;
+			first = node;
+		}
+		this.currentSize++;
+	}
+
+	private Node find(int data) {
+
+		Node node = first;
+		while (node != null) {
+			if (node.pageNum == data) {
+				return node;
+			}
+			node = node.next;
+		}
+		return null;
+
+	}
+
+	/**
+	 * 删除链表尾部节点 表示 删除最少使用的缓存对象
+	 */
+	private void removeLast() {
+		Node prev = last.prev;
+		prev.next = null;
+		last.prev = null;
+		last = prev;
+		this.currentSize--;
+	}
+
+	/**
+	 * 移动到链表头，表示这个节点是最新使用过的
+	 * 
+	 * @param node
+	 */
+	private void moveExistingNodeToHead(Node node) {
+
+		if (node == first) {
+
+			return;
+		} else if (node == last) {
+			// 当前节点是链表尾， 需要放到链表头
+			Node prevNode = node.prev;
+			prevNode.next = null;
+			last.prev = null;
+			last = prevNode;
+
+		} else {
+			// node 在链表的中间， 把node 的前后节点连接起来
+			Node prevNode = node.prev;
+			prevNode.next = node.next;
+
+			Node nextNode = node.next;
+			nextNode.prev = prevNode;
+
+		}
+
+		node.prev = null;
+		node.next = first;
+		first.prev = node;
+		first = node;
+
+	}
+
+	private boolean isEmpty() {
+		return (first == null) && (last == null);
+	}
+
+	public String toString() {
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while (node != null) {
+			buffer.append(node.pageNum);
+
+			node = node.next;
+			if (node != null) {
+				buffer.append(",");
+			}
+		}
+		return buffer.toString();
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java
new file mode 100644
index 0000000000..6c8b4a3315
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java
@@ -0,0 +1,129 @@
+package com.coding.basic.linklist;
+
+import com.coding.basic.Iterator;
+import com.coding.basic.List;
+
+public class LinkedList implements List {
+
+	private Node head;
+
+	public void add(Object o) {
+
+	}
+
+	public void add(int index, Object o) {
+
+	}
+
+	public Object get(int index) {
+		return null;
+	}
+
+	public Object remove(int index) {
+		return null;
+	}
+
+	public int size() {
+		return -1;
+	}
+
+	public void addFirst(Object o) {
+
+	}
+
+	public void addLast(Object o) {
+
+	}
+
+	public Object removeFirst() {
+		return null;
+	}
+
+	public Object removeLast() {
+		return null;
+	}
+
+	public Iterator iterator() {
+		return null;
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+	}
+
+	/**
+	 * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3
+	 */
+	public void reverse() {
+
+	}
+
+	/**
+	 * 删除一个单链表的前半部分 例如：list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10
+	 * ,删除以后的值为7,8,10
+	 * 
+	 */
+	public void removeFirstHalf() {
+
+	}
+
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * 
+	 * @param i
+	 * @param length
+	 */
+	public void remove(int i, int length) {
+
+	}
+
+	/**
+	 * 假定当前链表和listB均包含已升序排列的整数 从当前链表中取出那些listB所指定的元素 例如当前链表 =
+	 * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]
+	 * 
+	 * @param list
+	 */
+	public int[] getElements(LinkedList list) {
+		return null;
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 从当前链表中中删除在listB中出现的元素
+	 * 
+	 * @param list
+	 */
+
+	public void subtract(LinkedList list) {
+
+	}
+
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public void removeDuplicateValues() {
+
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * 
+	 * @param min
+	 * @param max
+	 */
+	public void removeRange(int min, int max) {
+
+	}
+
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * 
+	 * @param list
+	 */
+	public LinkedList intersection(LinkedList list) {
+		return null;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java
new file mode 100644
index 0000000000..83b76cb872
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java
@@ -0,0 +1,26 @@
+package com.coding.basic.stack;
+
+import com.coding.basic.array.ArrayList;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+
+	public void push(Object o) {
+	}
+
+	public Object pop() {
+		return null;
+	}
+
+	public Object peek() {
+		return null;
+	}
+
+	public boolean isEmpty() {
+		return false;
+	}
+
+	public int size() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java
new file mode 100644
index 0000000000..100bfc46a9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java
@@ -0,0 +1,140 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+public class StackUtil {
+
+	public static void bad_reverse(Stack<Integer> s) {
+		if (s == null || s.isEmpty()) {
+			return;
+		}
+		Stack<Integer> tmpStack = new Stack();
+		while (!s.isEmpty()) {
+			tmpStack.push(s.pop());
+		}
+
+		s = tmpStack;
+
+	}
+
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack<Integer> s) {
+		if (s == null || s.isEmpty()) {
+			return;
+		}
+		Integer top = s.pop();
+		reverse(s);
+		addToBottom(s, top);
+
+	}
+
+	public static void addToBottom(Stack<Integer> s, Integer value) {
+		if (s.isEmpty()) {
+			s.push(value);
+		} else {
+			Integer top = s.pop();
+			addToBottom(s, value);
+			s.push(top);
+		}
+
+	}
+
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s, Object o) {
+		if (s == null || s.isEmpty()) {
+			return;
+		}
+		Stack tmpStack = new Stack();
+
+		while (!s.isEmpty()) {
+			Object value = s.pop();
+			if (!value.equals(o)) {
+				tmpStack.push(value);
+			}
+		}
+
+		while (!tmpStack.isEmpty()) {
+			s.push(tmpStack.pop());
+		}
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty，
+	 * 可以使用另外一个栈来辅助
+	 * 
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s, int len) {
+
+		if (s == null || s.isEmpty() || s.size() < len || len <= 0) {
+			return null;
+		}
+
+		Stack tmpStack = new Stack();
+		int i = 0;
+		Object[] result = new Object[len];
+		while (!s.isEmpty()) {
+			Object value = s.pop();
+			tmpStack.push(value);
+			result[i++] = value;
+			if (i == len) {
+				break;
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * 字符串s 可能包含这些字符： ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s =
+	 * "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true 如果 s = "([b{x]y})",
+	 * 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * 
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s) {
+
+		Stack<Character> stack = new Stack();
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+
+			if (c == '(' || c == '[' || c == '{') {
+
+				stack.push(c);
+
+			} else if (c == ')') {
+
+				char topChar = stack.pop();
+				if (topChar != '(') {
+					return false;
+				}
+
+			} else if (c == ']') {
+
+				char topChar = stack.pop();
+				if (topChar != '[') {
+					return false;
+				}
+
+			} else if (c == '}') {
+
+				char topChar = stack.pop();
+				if (topChar != '{') {
+					return false;
+				}
+
+			}
+		}
+		return stack.size() == 0;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
new file mode 100644
index 0000000000..1a479c9b97
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
@@ -0,0 +1,15 @@
+package com.coding.basic.stack.expr;
+
+public class InfixExpr {
+	String expr = null;
+
+	public InfixExpr(String expr) {
+		this.expr = expr;
+	}
+
+	public float evaluate() {
+
+		return 0.0f;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
new file mode 100644
index 0000000000..feb20c7d5c
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
@@ -0,0 +1,47 @@
+package com.coding.basic.stack.expr;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class InfixExprTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testEvaluate() {
+		// InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
+		{
+			InfixExpr expr = new InfixExpr("2+3*4+5");
+			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
+		}
+		{
+			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
+			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
+		}
+
+		{
+			InfixExpr expr = new InfixExpr("3*20/2");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+
+		{
+			InfixExpr expr = new InfixExpr("20/2*3");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+
+		{
+			InfixExpr expr = new InfixExpr("10-30+50");
+			Assert.assertEquals(30, expr.evaluate(), 0.001f);
+		}
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml
new file mode 100644
index 0000000000..e5d9aebba8
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.coderising.litestruts.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.coderising.litestruts.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java
new file mode 100644
index 0000000000..5e4259bddf
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java
@@ -0,0 +1,42 @@
+package com.coderising.download.api;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class ConnectionTest {
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testContentLength() throws Exception {
+		ConnectionManager connMan = new ConnectionManagerImpl();
+		Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg");
+		Assert.assertEquals(35470, conn.getContentLength());
+	}
+
+	@Test
+	public void testRead() throws Exception {
+		ConnectionManager connMan = new ConnectionManagerImpl();
+		Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg");
+
+		byte[] data = conn.read(0, 35469);
+		Assert.assertEquals(35470, data.length);
+
+		data = conn.read(0, 1023);
+		Assert.assertEquals(1024, data.length);
+
+		data = conn.read(1024, 2023);
+		Assert.assertEquals(1000, data.length);
+
+		// 测试不充分，没有断言内容是否正确
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java
new file mode 100644
index 0000000000..2631a1f90b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java
@@ -0,0 +1,56 @@
+package com.coderising.download.core;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.coderising.download.api.ConnectionManager;
+import com.coderising.download.api.DownloadListener;
+import com.coderising.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		// String url =
+		// "http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg";
+
+		String url = "http://images2015.cnblogs.com/blog/610238/201604/610238-20160421154632101-286208268.png";
+
+		FileDownloader downloader = new FileDownloader(url, "c:\\coderising\\tmp\\test.jpg");
+
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+		});
+
+		downloader.execute();
+
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				// 休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+
+		System.out.println("下载完成！");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java
new file mode 100644
index 0000000000..b8ab6c04b9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java
@@ -0,0 +1,46 @@
+package com.coderising.litestruts;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ConfigurationTest {
+
+	Configuration cfg = new Configuration("struts.xml");
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testGetClassName() {
+
+		String clzName = cfg.getClassName("login");
+		Assert.assertEquals("com.coderising.litestruts.LoginAction", clzName);
+
+		clzName = cfg.getClassName("logout");
+		Assert.assertEquals("com.coderising.litestruts.LogoutAction", clzName);
+	}
+
+	@Test
+	public void testGetResultView() {
+		String jsp = cfg.getResultView("login", "success");
+		Assert.assertEquals("/jsp/homepage.jsp", jsp);
+
+		jsp = cfg.getResultView("login", "fail");
+		Assert.assertEquals("/jsp/showLogin.jsp", jsp);
+
+		jsp = cfg.getResultView("logout", "success");
+		Assert.assertEquals("/jsp/welcome.jsp", jsp);
+
+		jsp = cfg.getResultView("logout", "error");
+		Assert.assertEquals("/jsp/error.jsp", jsp);
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java
new file mode 100644
index 0000000000..4362ae0ac7
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java
@@ -0,0 +1,104 @@
+package com.coderising.litestruts;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ReflectionUtilTest {
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testGetSetterMethod() throws Exception {
+
+		String name = "com.coderising.litestruts.LoginAction";
+		Class<?> clz = Class.forName(name);
+		List<Method> methods = ReflectionUtil.getSetterMethods(clz);
+
+		Assert.assertEquals(2, methods.size());
+
+		List<String> expectedNames = new ArrayList<>();
+		expectedNames.add("setName");
+		expectedNames.add("setPassword");
+
+		Set<String> acctualNames = new HashSet<>();
+		for (Method m : methods) {
+			acctualNames.add(m.getName());
+		}
+
+		Assert.assertTrue(acctualNames.containsAll(expectedNames));
+	}
+
+	@Test
+	public void testSetParameters() throws Exception {
+		String name = "com.coderising.litestruts.LoginAction";
+		Class<?> clz = Class.forName(name);
+		Object o = clz.newInstance();
+
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "1234");
+
+		ReflectionUtil.setParameters(o, params);
+
+		Field f = clz.getDeclaredField("name");
+		f.setAccessible(true);
+		Assert.assertEquals("test", f.get(o));
+
+		f = clz.getDeclaredField("password");
+		f.setAccessible(true);
+		Assert.assertEquals("1234", f.get(o));
+	}
+
+	@Test
+	public void testGetGetterMethod() throws Exception {
+		String name = "com.coderising.litestruts.LoginAction";
+		Class<?> clz = Class.forName(name);
+		List<Method> methods = ReflectionUtil.getGetterMethods(clz);
+
+		Assert.assertEquals(3, methods.size());
+
+		List<String> expectedNames = new ArrayList<>();
+		expectedNames.add("getMessage");
+		expectedNames.add("getName");
+		expectedNames.add("getPassword");
+
+		Set<String> acctualNames = new HashSet<>();
+		for (Method m : methods) {
+			acctualNames.add(m.getName());
+		}
+
+		Assert.assertTrue(acctualNames.containsAll(expectedNames));
+	}
+
+	@Test
+	public void testGetParamters() throws Exception {
+		String name = "com.coderising.litestruts.LoginAction";
+		Class<?> clz = Class.forName(name);
+		LoginAction action = (LoginAction) clz.newInstance();
+		action.setName("test");
+		action.setPassword("123456");
+
+		Map<String, Object> params = ReflectionUtil.getParamterMap(action);
+
+		Assert.assertEquals(3, params.size());
+		Assert.assertEquals(null, params.get("messaage"));
+		Assert.assertEquals("test", params.get("name"));
+		Assert.assertEquals("123456", params.get("password"));
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..5174fc47f1
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java
@@ -0,0 +1,37 @@
+package com.coderising.litestruts;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "1234");
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+		Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java
new file mode 100644
index 0000000000..47ef10e125
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java
@@ -0,0 +1,32 @@
+package com.coding.basic.linklist;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LRUPageFrameTest {
+
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+		frame.access(5);
+		Assert.assertEquals("5,4,0", frame.toString());
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java
new file mode 100644
index 0000000000..39a1b3f3e0
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java
@@ -0,0 +1,197 @@
+package com.coding.basic.linklist;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LinkedListTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testReverse() {
+		LinkedList l = new LinkedList();
+
+		Assert.assertEquals("[]", l.toString());
+
+		l.add(1);
+		l.reverse();
+		Assert.assertEquals("[1]", l.toString());
+
+		l.add(2);
+		l.add(3);
+		l.add(4);
+
+		l.reverse();
+		Assert.assertEquals("[4,3,2,1]", l.toString());
+	}
+
+	@Test
+	public void testRemoveFirstHalf() {
+		{
+			LinkedList linkedList = new LinkedList();
+			linkedList.add(1);
+			linkedList.add(2);
+			linkedList.add(3);
+			linkedList.add(4);
+			linkedList.removeFirstHalf();
+			Assert.assertEquals("[3,4]", linkedList.toString());
+		}
+		{
+			LinkedList linkedList = new LinkedList();
+			linkedList.add(1);
+			linkedList.add(2);
+			linkedList.add(3);
+			linkedList.add(4);
+			linkedList.add(5);
+			linkedList.removeFirstHalf();
+			Assert.assertEquals("[3,4,5]", linkedList.toString());
+		}
+	}
+
+	@Test
+	public void testRemoveIntInt() {
+		{
+			LinkedList linkedList = new LinkedList();
+			linkedList.add(1);
+			linkedList.add(2);
+			linkedList.add(3);
+			linkedList.add(4);
+			linkedList.remove(0, 2);
+			Assert.assertEquals("[3,4]", linkedList.toString());
+		}
+		{
+			LinkedList linkedList = new LinkedList();
+			linkedList.add(1);
+			linkedList.add(2);
+			linkedList.add(3);
+			linkedList.add(4);
+			linkedList.remove(3, 2);
+			Assert.assertEquals("[1,2,3]", linkedList.toString());
+		}
+		{
+			LinkedList linkedList = new LinkedList();
+			linkedList.add(1);
+			linkedList.add(2);
+			linkedList.add(3);
+			linkedList.add(4);
+			linkedList.remove(2, 2);
+			Assert.assertEquals("[1,2]", linkedList.toString());
+		}
+	}
+
+	@Test
+	public void testGetElements() {
+		LinkedList linkedList = new LinkedList();
+		linkedList.add(11);
+		linkedList.add(101);
+		linkedList.add(201);
+		linkedList.add(301);
+		linkedList.add(401);
+		linkedList.add(501);
+		linkedList.add(601);
+		linkedList.add(701);
+		LinkedList list = new LinkedList();
+		list.add(1);
+		list.add(3);
+		list.add(4);
+		list.add(6);
+		Assert.assertArrayEquals(new int[] { 101, 301, 401, 601 }, linkedList.getElements(list));
+	}
+
+	@Test
+	public void testSubtract() {
+		LinkedList list1 = new LinkedList();
+		list1.add(101);
+		list1.add(201);
+		list1.add(301);
+		list1.add(401);
+		list1.add(501);
+		list1.add(601);
+		list1.add(701);
+
+		LinkedList list2 = new LinkedList();
+
+		list2.add(101);
+		list2.add(201);
+		list2.add(301);
+		list2.add(401);
+		list2.add(501);
+
+		list1.subtract(list2);
+
+		Assert.assertEquals("[601,701]", list1.toString());
+	}
+
+	@Test
+	public void testRemoveDuplicateValues() {
+		LinkedList list = new LinkedList();
+		list.add(1);
+		list.add(1);
+		list.add(2);
+		list.add(2);
+		list.add(3);
+		list.add(5);
+		list.add(5);
+		list.add(6);
+		list.removeDuplicateValues();
+
+		Assert.assertEquals("[1,2,3,5,6]", list.toString());
+	}
+
+	@Test
+	public void testRemoveRange() {
+		{
+			LinkedList linkedList = new LinkedList();
+
+			linkedList.add(11);
+			linkedList.add(12);
+			linkedList.add(13);
+			linkedList.add(14);
+			linkedList.add(16);
+			linkedList.add(16);
+			linkedList.add(19);
+
+			linkedList.removeRange(10, 19);
+			Assert.assertEquals("[19]", linkedList.toString());
+		}
+
+		{
+			LinkedList linkedList = new LinkedList();
+
+			linkedList.add(11);
+			linkedList.add(12);
+			linkedList.add(13);
+			linkedList.add(14);
+			linkedList.add(16);
+			linkedList.add(16);
+			linkedList.add(19);
+
+			linkedList.removeRange(10, 14);
+			Assert.assertEquals("[14,16,16,19]", linkedList.toString());
+		}
+	}
+
+	@Test
+	public void testIntersection() {
+		LinkedList list1 = new LinkedList();
+		list1.add(1);
+		list1.add(6);
+		list1.add(7);
+
+		LinkedList list2 = new LinkedList();
+		list2.add(2);
+		list2.add(5);
+		list2.add(6);
+
+		LinkedList newList = list1.intersection(list2);
+		Assert.assertEquals("[6]", newList.toString());
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java
new file mode 100644
index 0000000000..5976823f36
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java
@@ -0,0 +1,78 @@
+package com.coding.basic.stack;
+
+import java.util.Stack;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StackUtilTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testAddToBottom() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+
+		StackUtil.addToBottom(s, 0);
+
+		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
+
+	}
+
+	@Test
+	public void testReverse() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
+		StackUtil.reverse(s);
+		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
+	}
+
+	@Test
+	public void testRemove() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		StackUtil.remove(s, 2);
+		Assert.assertEquals("[1, 3]", s.toString());
+	}
+
+	@Test
+	public void testGetTop() {
+		Stack<Integer> s = new Stack();
+		s.push(1);
+		s.push(2);
+		s.push(3);
+		s.push(4);
+		s.push(5);
+		{
+			Object[] values = StackUtil.getTop(s, 3);
+			Assert.assertEquals(5, values[0]);
+			Assert.assertEquals(4, values[1]);
+			Assert.assertEquals(3, values[2]);
+		}
+	}
+
+	@Test
+	public void testIsValidPairs() {
+		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
+		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml b/students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml
new file mode 100644
index 0000000000..1da435d5b6
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml
@@ -0,0 +1,27 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-61-collection</artifactId>
+	<description>eulerlcs master java road collection</description>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java
new file mode 100644
index 0000000000..555f5ea954
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java
@@ -0,0 +1,438 @@
+/**
+ * 90% or more copy from jdk
+ */
+package com.github.eulerlcs.jmr.algorithm;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.RandomAccess;
+import java.util.function.Consumer;
+
+public class ArrayList<E> implements List<E>, RandomAccess {
+	private static final int MAX_ARRAY_SIZE = 1 << 10;
+	private transient Object[] elementData = new Object[0];
+	private int size;
+	private transient int modCount = 0;
+
+	@Override
+	public int size() {
+		return size;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	@Override
+	public boolean contains(Object o) {
+		if (o == null) {
+			for (Object obi : elementData) {
+				if (obi == null) {
+					return true;
+				}
+			}
+		} else {
+			for (Object obj : elementData) {
+				if (o.equals(obj)) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	@Override
+	public boolean containsAll(Collection<?> c) {
+		for (Object e : c)
+			if (!contains(e))
+				return false;
+		return true;
+	}
+
+	@Override
+	public Object[] toArray() {
+		return Arrays.copyOf(elementData, size, elementData.getClass());
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public <T> T[] toArray(T[] a) {
+		if (a.length < size) {
+			return (T[]) Arrays.copyOf(elementData, size, a.getClass());
+		} else {
+			System.arraycopy(elementData, 0, a, 0, size);
+			if (a.length > size)
+				a[size] = null;
+			return a;
+		}
+	}
+
+	@Override
+	public boolean add(E e) {
+		ensureExplicitCapacity(size + 1); // Increments modCount!!
+		elementData[size] = e;
+		size++;
+		return true;
+	}
+
+	@Override
+	public void add(int index, E element) {
+		if (index >= size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
+		ensureExplicitCapacity(size + 1); // Increments modCount!!
+		System.arraycopy(elementData, index, elementData, index + 1, size - index);
+		elementData[index] = element;
+		size++;
+	}
+
+	@Override
+	public E remove(int index) {
+		if (index >= size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
+
+		modCount++;
+		@SuppressWarnings("unchecked")
+		E oldValue = (E) elementData[index];
+		int numMoved = size - index - 1;
+		if (numMoved > 0)
+			System.arraycopy(elementData, index + 1, elementData, index, numMoved);
+		elementData[--size] = null;// clear to let GC do its work
+
+		return oldValue;
+	}
+
+	@Override
+	public boolean remove(Object o) {
+		int index = -1;
+
+		if (o == null) {
+			for (int i = 0; i < size; i++)
+				if (elementData[i] == null) {
+					index = i;
+					break;
+				}
+		} else {
+			for (int i = 0; i < size; i++)
+				if (o.equals(elementData[i])) {
+					index = i;
+					break;
+				}
+		}
+
+		if (index > 0) {
+			modCount++;
+			int numMoved = size - index - 1;
+			if (numMoved > 0)
+				System.arraycopy(elementData, index + 1, elementData, index, numMoved);
+			elementData[--size] = null;// clear to let GC do its work
+
+			return true;
+		}
+
+		return false;
+	}
+
+	@Override
+	public boolean removeAll(Collection<?> c) {
+		boolean modified = false;
+		for (Object obj : c) {
+			modified |= remove(obj);
+		}
+
+		return modified;
+	}
+
+	@Override
+	public boolean addAll(Collection<? extends E> c) {
+		Object[] a = c.toArray();
+		int numNew = a.length;
+		ensureExplicitCapacity(size + numNew);// Increments modCount
+		System.arraycopy(a, 0, elementData, size, numNew);
+		size += numNew;
+		return numNew != 0;
+	}
+
+	@Override
+	public boolean addAll(int index, Collection<? extends E> c) {
+		if (index >= size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
+
+		Object[] a = c.toArray();
+		int numNew = a.length;
+		ensureExplicitCapacity(size + numNew);// Increments modCount
+
+		int numMoved = size - index;
+		if (numMoved > 0)
+			System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
+
+		System.arraycopy(a, 0, elementData, index, numNew);
+		size += numNew;
+		return numNew != 0;
+	}
+
+	@Override
+	public boolean retainAll(Collection<?> c) {
+		final Object[] elementData = this.elementData;
+		int r = 0, w = 0;
+		boolean modified = false;
+		for (; r < size; r++)
+			if (c.contains(elementData[r]))
+				elementData[w++] = elementData[r];
+
+		if (w != size) {
+			// clear to let GC do its work
+			for (int i = w; i < size; i++)
+				elementData[i] = null;
+			modCount += size - w;
+			size = w;
+			modified = true;
+		}
+
+		return modified;
+	}
+
+	@Override
+	public void clear() {
+		modCount++;
+		for (int i = 0; i < size; i++)
+			elementData[i] = null;
+
+		size = 0;
+	}
+
+	@Override
+	public List<E> subList(int fromIndex, int toIndex) {
+		throw new UnsupportedOperationException();
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E get(int index) {
+		if (index >= size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
+
+		return (E) elementData[index];
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E set(int index, E element) {
+		if (index >= size)
+			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
+
+		E oldValue = (E) elementData[index];
+		elementData[index] = element;
+		return oldValue;
+	}
+
+	@Override
+	public int indexOf(Object o) {
+		if (o == null) {
+			for (int i = 0; i < size; i++)
+				if (elementData[i] == null)
+					return i;
+		} else {
+			for (int i = 0; i < size; i++)
+				if (o.equals(elementData[i]))
+					return i;
+		}
+
+		return -1;
+	}
+
+	@Override
+	public int lastIndexOf(Object o) {
+		if (o == null) {
+			for (int i = size - 1; i >= 0; i--)
+				if (elementData[i] == null)
+					return i;
+		} else {
+			for (int i = size - 1; i >= 0; i--)
+				if (o.equals(elementData[i]))
+					return i;
+		}
+
+		return -1;
+	}
+
+	private void ensureExplicitCapacity(int minCapacity) {
+		modCount++;
+
+		if (elementData.length > minCapacity) {
+			return;
+		} else if (minCapacity > MAX_ARRAY_SIZE) {
+			throw new OutOfMemoryError();
+		}
+
+		int oldCapacity = elementData.length;
+
+		int newCapacity = oldCapacity == 0 ? 10 : (oldCapacity + (oldCapacity >> 1));
+		if (newCapacity > MAX_ARRAY_SIZE) {
+			newCapacity = MAX_ARRAY_SIZE;
+		}
+
+		elementData = Arrays.copyOf(elementData, newCapacity);
+	}
+
+	@Override
+	public Iterator<E> iterator() {
+		return new Itr();
+	}
+
+	@Override
+	public ListIterator<E> listIterator() {
+		return new ListItr(0);
+	}
+
+	@Override
+	public ListIterator<E> listIterator(int index) {
+		if (index < 0 || index > size)
+			throw new IndexOutOfBoundsException("Index: " + index);
+		return new ListItr(index);
+	}
+
+	/**
+	 * fully copy from jdk ArrayList.Itr
+	 */
+	private class Itr implements Iterator<E> {
+		int cursor; // index of next element to return
+		int lastRet = -1; // index of last element returned; -1 if no such
+		int expectedModCount = modCount;
+
+		@Override
+		public boolean hasNext() {
+			return cursor != size;
+		}
+
+		@Override
+		@SuppressWarnings("unchecked")
+		public E next() {
+			checkForComodification();
+			int i = cursor;
+			if (i >= size)
+				throw new NoSuchElementException();
+			Object[] elementData = ArrayList.this.elementData;
+			if (i >= elementData.length)
+				throw new ConcurrentModificationException();
+			cursor = i + 1;
+			return (E) elementData[lastRet = i];
+		}
+
+		@Override
+		public void remove() {
+			if (lastRet < 0)
+				throw new IllegalStateException();
+			checkForComodification();
+
+			try {
+				ArrayList.this.remove(lastRet);
+				cursor = lastRet;
+				lastRet = -1;
+				expectedModCount = modCount;
+			} catch (IndexOutOfBoundsException ex) {
+				throw new ConcurrentModificationException();
+			}
+		}
+
+		@Override
+		@SuppressWarnings("unchecked")
+		public void forEachRemaining(Consumer<? super E> consumer) {
+			Objects.requireNonNull(consumer);
+			final int size = ArrayList.this.size;
+			int i = cursor;
+			if (i >= size) {
+				return;
+			}
+			final Object[] elementData = ArrayList.this.elementData;
+			if (i >= elementData.length) {
+				throw new ConcurrentModificationException();
+			}
+			while (i != size && modCount == expectedModCount) {
+				consumer.accept((E) elementData[i++]);
+			}
+			// update once at end of iteration to reduce heap write traffic
+			cursor = i;
+			lastRet = i - 1;
+			checkForComodification();
+		}
+
+		final void checkForComodification() {
+			if (modCount != expectedModCount)
+				throw new ConcurrentModificationException();
+		}
+	}
+
+	/**
+	 * fully copy from jdk ArrayList.ListItr
+	 */
+	private class ListItr extends Itr implements ListIterator<E> {
+		ListItr(int index) {
+			super();
+			cursor = index;
+		}
+
+		@Override
+		public boolean hasPrevious() {
+			return cursor != 0;
+		}
+
+		@Override
+		public int nextIndex() {
+			return cursor;
+		}
+
+		@Override
+		public int previousIndex() {
+			return cursor - 1;
+		}
+
+		@Override
+		@SuppressWarnings("unchecked")
+		public E previous() {
+			checkForComodification();
+			int i = cursor - 1;
+			if (i < 0)
+				throw new NoSuchElementException();
+			Object[] elementData = ArrayList.this.elementData;
+			if (i >= elementData.length)
+				throw new ConcurrentModificationException();
+			cursor = i;
+			return (E) elementData[lastRet = i];
+		}
+
+		@Override
+		public void set(E e) {
+			if (lastRet < 0)
+				throw new IllegalStateException();
+			checkForComodification();
+
+			try {
+				ArrayList.this.set(lastRet, e);
+			} catch (IndexOutOfBoundsException ex) {
+				throw new ConcurrentModificationException();
+			}
+		}
+
+		@Override
+		public void add(E e) {
+			checkForComodification();
+
+			try {
+				int i = cursor;
+				ArrayList.this.add(i, e);
+				cursor = i + 1;
+				lastRet = -1;
+				expectedModCount = modCount;
+			} catch (IndexOutOfBoundsException ex) {
+				throw new ConcurrentModificationException();
+			}
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java
new file mode 100644
index 0000000000..47ed2e0bef
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java
@@ -0,0 +1,44 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+import java.util.List;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class TestArrayList {
+
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void test_foreach() {
+		List<Integer> list = new ArrayList<>();
+		list.add(1);
+		list.add(2);
+		list.add(3);
+
+		int sum = 0;
+		for (Integer item : list) {
+			sum += item;
+		}
+
+		Assert.assertEquals(sum, 6);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml
new file mode 100644
index 0000000000..a7a77b73df
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<struts>
+    <action name="login" class="com.github.eulerlcs.jmr.litestruts.action.LoginAction">
+        <result name="success">/jsp/homepage.jsp</result>
+        <result name="fail">/jsp/showLogin.jsp</result>
+    </action>
+    <action name="logout" class="com.github.eulerlcs.jmr.litestruts.action.LogoutAction">
+    	<result name="success">/jsp/welcome.jsp</result>
+    	<result name="error">/jsp/error.jsp</result>
+    </action>
+</struts>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml
new file mode 100644
index 0000000000..353155e346
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml
@@ -0,0 +1,39 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-62-litestruts</artifactId>
+	<description>eulerlcs master java road lite struts</description>
+
+	<dependencies>
+		<dependency>
+			<groupId>commons-digester</groupId>
+			<artifactId>commons-digester</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.github.stefanbirkner</groupId>
+			<artifactId>system-rules</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java
new file mode 100644
index 0000000000..c9cc7522b5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java
@@ -0,0 +1,279 @@
+/**
+ * 问题点： 没写注释，代码比较难读。尤其 merge方法。
+ */
+package com.github.eulerlcs.jmr.algorithm;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+	/**
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
+	 * @param origin
+	 * @return
+	 */
+	public static void reverseArray(int[] origin) {
+		if (origin == null || origin.length < 2) {
+			return;
+		}
+
+		for (int head = 0, tail = origin.length - 1; head < tail; head++, tail--) {
+			origin[head] = origin[head] ^ origin[tail];
+			origin[tail] = origin[head] ^ origin[tail];
+			origin[head] = origin[head] ^ origin[tail];
+		}
+	}
+
+	/**
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
+	 * @param oldArray
+	 * @return
+	 */
+
+	public static int[] removeZero(int[] oldArray) {
+		if (oldArray == null) {
+			return new int[0];
+		}
+
+		int count = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0)
+				count++;
+		}
+
+		int[] newArray = new int[count];
+		int newIndex = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] != 0) {
+				newArray[newIndex] = oldArray[i];
+				newIndex++;
+			}
+		}
+
+		return newArray;
+	}
+
+	/**
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
+	 * @param array1
+	 * @param array2
+	 * @return
+	 */
+
+	public static int[] merge(int[] array1, int[] array2) {
+		if (array1 == null || array1.length == 0) {
+			if (array2 == null || array2.length == 0) {
+				return new int[0];
+			} else {
+				return Arrays.copyOf(array2, array2.length);
+			}
+		} else if (array2 == null || array2.length == 0) {
+			return Arrays.copyOf(array1, array1.length);
+		}
+
+		int[] result = new int[array1.length + array2.length];
+		int idxResult = 0;
+		int idx1 = 0;
+		int idx2 = 0;
+
+		for (; idx1 < array1.length; idx1++) {
+			if (array1[idx1] < array2[idx2]) {
+				result[idxResult] = array1[idx1];
+				idxResult++;
+			} else if (array1[idx1] == array2[idx2]) {
+				result[idxResult] = array1[idx1];
+				idxResult++;
+				idx2++;
+			} else {
+				for (; idx2 < array2.length; idx2++) {
+					if (array2[idx2] < array1[idx1]) {
+						result[idxResult] = array2[idx2];
+						idxResult++;
+					} else {
+						if (array2[idx2] == array1[idx1]) {
+							idx2++;
+						}
+
+						break;
+					}
+				}
+
+				if (idx2 == array2.length) {
+					break;
+				} else {
+					idx1--;
+				}
+			}
+		}
+
+		if (idx1 < array1.length) {
+			System.arraycopy(array1, idx1, result, idxResult, array1.length - idx1);
+			idxResult += array1.length - idx1;
+		}
+
+		if (idx2 < array2.length) {
+			System.arraycopy(array2, idx2, result, idxResult, array2.length - idx2);
+			idxResult += array2.length - idx2;
+		}
+
+		result = removeZero(result);
+		return result;
+	}
+
+	/**
+	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * [2,3,6,0,0,0]
+	 * 
+	 * @param oldArray
+	 * @param increaseCapacity
+	 * @return
+	 */
+	public static int[] grow(int[] oldArray, int increaseCapacity) {
+		if (oldArray == null || increaseCapacity < 0) {
+			return new int[0];
+		}
+
+		int newCapacity = oldArray.length + increaseCapacity;
+
+		int[] newArray = Arrays.copyOf(oldArray, newCapacity);
+
+		return newArray;
+	}
+
+	/**
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] fibonacci(int max) {
+		if (max <= 1) {
+			return new int[0];
+		}
+
+		int[] result = new int[10];
+		result[0] = 1;
+		result[1] = 1;
+		int idx = 2;
+		int sum = 2;
+		while (sum < max) {
+			if (idx >= result.length) {
+				grow(result, result.length * 2);
+			}
+
+			result[idx] = sum;
+			sum = result[idx - 1] + result[idx];
+			idx++;
+		}
+
+		result = removeZero(result);
+		return result;
+	}
+
+	/**
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static int[] getPrimes(int max) {
+		if (max < 2) {
+			return new int[0];
+		}
+
+		int[] all = new int[max];
+		int index = 0;
+		int temp = 0;
+
+		for (int i = 0; i < max; i++) {
+			all[i] = i;
+		}
+
+		all[0] = 0;
+		all[1] = 0;
+		index = 2;
+
+		// 筛法
+		loops: for (; index < max;) {
+			for (int i = 2;; i++) {
+				temp = index * i;
+				if (temp >= max) {
+					break;
+				}
+				all[temp] = 0;
+			}
+
+			for (int i = index + 1; i < max; i++) {
+				if (all[i] != 0) {
+					index = i;
+					continue loops;
+				}
+			}
+
+			break;
+		}
+
+		int[] result = removeZero(all);
+		return result;
+	}
+
+	/**
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
+	 * @param max
+	 * @return
+	 */
+	public static long[] getPerfectNumbers(long max) {
+		long[] perfect = new long[49];// 到2016年1月为止，共发现了49个完全数
+		int idx = 0;
+		long sum = 1;
+		long sqrt = 0;
+
+		for (long n = 2; n < max; n++) {
+			sum = 1;
+			sqrt = (long) Math.sqrt(n);
+			for (long i = 2; i <= sqrt; i++) {
+				if (n % i == 0)
+					sum += i + n / i;
+			}
+
+			if (sum == n) {
+				perfect[idx] = n;
+				idx++;
+			}
+		}
+
+		// return removeZero(perfect);
+		return perfect;
+	}
+
+	/**
+	 * 用separator 把数组 array给连接起来 例如array= [3,8,9], separator = "-" 则返回值为"3-8-9"
+	 * 
+	 * @param array
+	 * @param separator
+	 * @return
+	 */
+	public static String join(int[] array, String separator) {
+		if (array == null || array.length == 0) {
+			return "";
+		}
+
+		StringBuilder sb = new StringBuilder();
+
+		for (int i = 0; i < array.length - 1; i++) {
+			sb.append(array[i] + separator);
+		}
+		sb.append(String.valueOf(array[array.length - 1]));
+
+		return sb.toString();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java
new file mode 100644
index 0000000000..4d9af132ac
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java
@@ -0,0 +1,30 @@
+package com.github.eulerlcs.jmr.litestruts.action;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LoginAction {
+	@Setter
+	@Getter
+	private String name;
+	@Setter
+	@Getter
+	private String password;
+	@Getter
+	private String message;
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "fail";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java
new file mode 100644
index 0000000000..119e74e3e9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java
@@ -0,0 +1,30 @@
+package com.github.eulerlcs.jmr.litestruts.action;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
+ * 
+ * @author liuxin
+ *
+ */
+public class LogoutAction {
+	@Setter
+	@Getter
+	private String name;
+	@Setter
+	@Getter
+	private String password;
+	@Getter
+	private String message;
+
+	public String execute() {
+		if ("test".equals(name) && "1234".equals(password)) {
+			this.message = "login successful";
+			return "success";
+		}
+		this.message = "login failed,please check your user/pwd";
+		return "error";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java
new file mode 100644
index 0000000000..459abaae99
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java
@@ -0,0 +1,200 @@
+package com.github.eulerlcs.jmr.litestruts.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.digester.Digester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+import com.github.eulerlcs.jmr.litestruts.degister.StrutsConfig;
+import com.github.eulerlcs.jmr.litestruts.degister.StrutsDigester;
+
+/**
+ * <ul>
+ * <li>读取配置文件struts.xml</li>
+ * <li>根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+ * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+ * "password"="1234") , 那就应该调用 setName和setPassword方法</li>
+ * <li>通过反射调用对象的exectue 方法， 并获得返回值，例如"success"</li>
+ * <li>通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+ * {"message": "登录成功"} , 放到View对象的parameters</li>
+ * <li>根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。</li>
+ * </ul>
+ */
+public class Struts {
+	private final static Logger log = LoggerFactory.getLogger(Struts.class);
+	private static StrutsConfig config = null;
+
+	public static View runAction(String actionName, Map<String, String> parameters) {
+		/*
+		 * 0. 读取配置文件struts.xml
+		 * 
+		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
+		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
+		 * "password"="1234") , 那就应该调用 setName和setPassword方法
+		 * 
+		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
+		 * 
+		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
+		 * {"message": "登录成功"} , 放到View对象的parameters
+		 * 
+		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
+		 * 放到View对象的jsp字段中。
+		 * 
+		 */
+
+		// 0.
+		getConfig();
+
+		// 1.1.
+		Object object = createInstance(actionName);
+		if (object == null) {
+			return null;
+		}
+		// 1.2.
+		if (!prepareParameters(object, parameters)) {
+			return null;
+		}
+		// 2.
+		String viewId = execute(object);
+		if (viewId == null) {
+			return null;
+		}
+		// 3.
+		View view = biuldView(object);
+		if (view == null) {
+			return null;
+		}
+
+		// 4.
+		String uri = config.getActionMap().get(actionName).getResults().get(viewId).getUrl();
+		view.setJsp(uri);
+
+		return view;
+	}
+
+	private static StrutsConfig getConfig() {
+		if (config != null) {
+			return config;
+		}
+
+		Digester d = StrutsDigester.newInstance();
+		try {
+			File file = new File("data", "struts.xml");
+			config = (StrutsConfig) d.parse(file);
+		} catch (IOException | SAXException e) {
+			log.error("getConfig", e);
+			System.exit(1);
+		}
+
+		return config;
+	}
+
+	private static Object createInstance(String actionName) {
+		if (actionName == null) {
+			return null;
+		}
+
+		String className = config.getActionMap().get(actionName).getClazz();
+		Object object = null;
+		try {
+			Class<?> clazz = Class.forName(className);
+			object = clazz.newInstance();
+		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
+			log.error("createInstance", e);
+		}
+
+		return object;
+	}
+
+	private static boolean prepareParameters(Object object, Map<String, String> parameters) {
+		if (parameters == null || parameters.size() == 0) {
+			return true;
+		}
+
+		Class<?> clazz = object.getClass();
+		Method setter = null;
+
+		try {
+			for (String key : parameters.keySet()) {
+				setter = clazz.getMethod(biuldSetterName(key), String.class);
+				setter.setAccessible(true);
+				setter.invoke(object, parameters.get(key));
+			}
+		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
+				| InvocationTargetException e) {
+			log.error("prepareParameters", e);
+			return false;
+		}
+
+		return true;
+	}
+
+	private static String biuldSetterName(String name) {
+		String setterName = "set";
+		setterName += name.substring(0, 1).toUpperCase() + name.substring(1);
+		return setterName;
+
+	}
+
+	private static String debiuldGetterName(String getterName) {
+		if (getterName == null || getterName.length() <= 3) {
+			return null;
+		}
+		if (!getterName.substring(0, 3).equals("get")) {
+			return null;
+		}
+
+		String name = getterName.substring(3, 4).toLowerCase() + getterName.substring(4);
+		return name;
+	}
+
+	private static String execute(Object object) {
+		final String METHOD_EXECUTE = "execute";
+		String viewId = null;
+
+		Class<?> clazz = object.getClass();
+		try {
+			Method method = clazz.getMethod(METHOD_EXECUTE);
+			viewId = (String) method.invoke(object);
+		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
+				| InvocationTargetException e) {
+			log.error("execute", e);
+			return viewId;
+		}
+
+		return viewId;
+	}
+
+	private static View biuldView(Object object) {
+		View view = new View();
+		Map<String, Object> parameters = new HashMap<>();
+
+		Class<?> clazz = object.getClass();
+		Method[] methods;
+		try {
+			methods = clazz.getMethods();
+			for (Method method : methods) {
+				String name = debiuldGetterName(method.getName());
+				if (name == null) {
+					continue;
+				}
+				Object value = method.invoke(object);
+				parameters.put(name, value);
+			}
+
+			view.setParameters(parameters);
+		} catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+			log.error("biuldResult", e);
+			return null;
+		}
+
+		return view;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java
new file mode 100644
index 0000000000..0aa18d5f54
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java
@@ -0,0 +1,26 @@
+package com.github.eulerlcs.jmr.litestruts.core;
+
+import java.util.Map;
+
+public class View {
+	private String jsp;
+	private Map<String, Object> parameters;
+
+	public String getJsp() {
+		return jsp;
+	}
+
+	public View setJsp(String jsp) {
+		this.jsp = jsp;
+		return this;
+	}
+
+	public Map<String, Object> getParameters() {
+		return parameters;
+	}
+
+	public View setParameters(Map<String, Object> parameters) {
+		this.parameters = parameters;
+		return this;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java
new file mode 100644
index 0000000000..336f594241
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java
@@ -0,0 +1,22 @@
+package com.github.eulerlcs.jmr.litestruts.degister;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class StrutsAction {
+	@Getter
+	@Setter
+	private String name;
+	@Getter
+	@Setter
+	private String clazz;
+	@Getter
+	private Map<String, StrutsActionResult> results = new HashMap<>();
+
+	public void addResult(StrutsActionResult result) {
+		results.put(result.getName(), result);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java
new file mode 100644
index 0000000000..64247d4aba
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.litestruts.degister;
+
+import lombok.Getter;
+import lombok.Setter;
+
+public class StrutsActionResult {
+	@Getter
+	@Setter
+	private String name;
+	@Getter
+	@Setter
+	private String url;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java
new file mode 100644
index 0000000000..567f4c7ef1
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java
@@ -0,0 +1,30 @@
+package com.github.eulerlcs.jmr.litestruts.degister;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.RuleSetBase;
+
+final class StrutsActionRulerSet extends RuleSetBase {
+	protected String prefix = null;
+
+	public StrutsActionRulerSet() {
+		this("");
+	}
+
+	public StrutsActionRulerSet(String prefix) {
+		super();
+		this.namespaceURI = null;
+		this.prefix = prefix;
+	}
+
+	@Override
+	public void addRuleInstances(Digester digester) {
+		digester.addObjectCreate(prefix + "action", StrutsAction.class);
+		digester.addSetProperties(prefix + "action");
+		digester.addSetProperties(prefix + "action", "class", "clazz");
+		digester.addSetNext(prefix + "action", "addAction");
+		digester.addObjectCreate(prefix + "action/result", StrutsActionResult.class);
+		digester.addSetProperties(prefix + "action/result");
+		digester.addBeanPropertySetter(prefix + "action/result", "url");
+		digester.addSetNext(prefix + "action/result", "addResult");
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java
new file mode 100644
index 0000000000..b2005c9700
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java
@@ -0,0 +1,15 @@
+package com.github.eulerlcs.jmr.litestruts.degister;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import lombok.Getter;
+
+public class StrutsConfig {
+	@Getter
+	private Map<String, StrutsAction> actionMap = new HashMap<>();
+
+	public void addAction(StrutsAction action) {
+		actionMap.put(action.getName(), action);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java
new file mode 100644
index 0000000000..f466c8cb10
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.litestruts.degister;
+
+import org.apache.commons.digester.Digester;
+
+public class StrutsDigester {
+	public static Digester newInstance() {
+		Digester d = new Digester();
+		d.addObjectCreate("struts", StrutsConfig.class);
+		d.addSetProperties("struts");
+		d.addRuleSet(new StrutsActionRulerSet("struts/"));
+		return d;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java
new file mode 100644
index 0000000000..7242407f74
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java
@@ -0,0 +1,266 @@
+/**
+ * 问题点： 没有全分支覆盖。只简单的测了关键或者关心的case
+ */
+package com.github.eulerlcs.jmr.algorithm;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	@Test
+	public void reverseArray_null() {
+		int[] actuals = null;
+		int[] expecteds = null;
+
+		ArrayUtil.reverseArray(actuals);
+
+		assertArrayEquals(actuals, expecteds);
+	}
+
+	@Test
+	public void reverseArray_0() {
+		int[] actuals = {};
+		int[] expecteds = {};
+
+		ArrayUtil.reverseArray(actuals);
+
+		assertArrayEquals(actuals, expecteds);
+	}
+
+	@Test
+	public void reverseArray_1() {
+		int[] actuals = { 2 };
+		int[] expecteds = { 2 };
+
+		ArrayUtil.reverseArray(actuals);
+
+		assertArrayEquals(actuals, expecteds);
+	}
+
+	@Test
+	public void reverseArray_2() {
+		int[] actuals = { 7, 9 };
+		int[] expecteds = { 9, 7 };
+
+		ArrayUtil.reverseArray(actuals);
+
+		assertArrayEquals(actuals, expecteds);
+	}
+
+	@Test
+	public void reverseArray_4() {
+		int[] actuals = { 7, 9, 30, 3 };
+		int[] expecteds = { 3, 30, 9, 7 };
+
+		ArrayUtil.reverseArray(actuals);
+
+		assertArrayEquals(actuals, expecteds);
+	}
+
+	@Test
+	public void reverseArray_5() {
+		int[] actuals = { 7, 9, 30, 3, 4 };
+		int[] expecteds = { 4, 3, 30, 9, 7 };
+
+		ArrayUtil.reverseArray(actuals);
+
+		assertArrayEquals(actuals, expecteds);
+	}
+
+	@Test
+	public void removeZero_null() {
+		int oldArr[] = null;
+		int[] expecteds = {};
+
+		int[] newArr = ArrayUtil.removeZero(oldArr);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void removeZero_0() {
+		int oldArr[] = {};
+		int[] expecteds = {};
+
+		int[] newArr = ArrayUtil.removeZero(oldArr);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void removeZero_1() {
+		int oldArr[] = { 0 };
+		int[] expecteds = {};
+
+		int[] newArr = ArrayUtil.removeZero(oldArr);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void removeZero_2() {
+		int oldArr[] = { 3, 5 };
+		int[] expecteds = { 3, 5 };
+
+		int[] newArr = ArrayUtil.removeZero(oldArr);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void removeZero_3() {
+		int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
+		int[] expecteds = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 };
+
+		int[] newArr = ArrayUtil.removeZero(oldArr);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void merge_1() {
+		int[] a1 = { 3, 5, 7, 8 };
+		int[] a2 = { 4, 5, 6, 7 };
+		int[] expecteds = { 3, 4, 5, 6, 7, 8 };
+
+		int[] newArr = ArrayUtil.merge(a1, a2);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void merge_2() {
+		int[] a1 = { 4, 5, 6, 7 };
+		int[] a2 = { 3, 5, 7, 8 };
+		int[] expecteds = { 3, 4, 5, 6, 7, 8 };
+
+		int[] newArr = ArrayUtil.merge(a1, a2);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void grow_1() {
+		int[] oldArray = { 2, 3, 6 };
+		int increaseCapacity = 3;
+		int[] expecteds = { 2, 3, 6, 0, 0, 0 };
+
+		int[] newArr = ArrayUtil.grow(oldArray, increaseCapacity);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void fibonacci_1() {
+		int max = 1;
+		int[] expecteds = {};
+
+		int[] newArr = ArrayUtil.fibonacci(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void fibonacci_2() {
+		int max = 2;
+		int[] expecteds = { 1, 1 };
+
+		int[] newArr = ArrayUtil.fibonacci(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void fibonacci_15() {
+		int max = 15;
+		int[] expecteds = { 1, 1, 2, 3, 5, 8, 13 };
+
+		int[] newArr = ArrayUtil.fibonacci(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPrimes_1() {
+		int max = 1;
+		int[] expecteds = {};
+
+		int[] newArr = ArrayUtil.getPrimes(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPrimes_2() {
+		int max = 2;
+		int[] expecteds = {};
+
+		int[] newArr = ArrayUtil.getPrimes(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPrimes_3() {
+		int max = 3;
+		int[] expecteds = { 2 };
+
+		int[] newArr = ArrayUtil.getPrimes(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPrimes_4() {
+		int max = 4;
+		int[] expecteds = { 2, 3 };
+
+		int[] newArr = ArrayUtil.getPrimes(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPrimes_23() {
+		int max = 23;
+		int[] expecteds = { 2, 3, 5, 7, 11, 13, 17, 19 };
+
+		int[] newArr = ArrayUtil.getPrimes(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPrimes_24() {
+		int max = 24;
+		int[] expecteds = { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
+
+		int[] newArr = ArrayUtil.getPrimes(max);
+
+		assertArrayEquals(newArr, expecteds);
+	}
+
+	@Test
+	public void getPerfectNumbers_max() {
+		long max = Long.MAX_VALUE;
+		max = 10000;
+		long[] expecteds = { 6, 28, 496, 8128, 33550336, 8589869056L, 137438691328L, 2305843008139952128L };
+
+		long[] newArr = ArrayUtil.getPerfectNumbers(max);
+
+		assertEquals(newArr[3], expecteds[3]);
+	}
+
+	@Test
+	public void join_0() {
+		int[] array = { 3, 8, 9 };
+		String separator = "-";
+		String expected = "3-8-9";
+
+		String actual = ArrayUtil.join(array, separator);
+		assertEquals(expected, actual);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java
new file mode 100644
index 0000000000..b2fa989915
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java
@@ -0,0 +1,38 @@
+package com.github.eulerlcs.jmr.litestruts.core;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StrutsTest {
+
+	@Test
+	public void testLoginActionSuccess() {
+
+		String actionName = "login";
+
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "1234");
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
+		Assert.assertEquals("login successful", view.getParameters().get("message"));
+	}
+
+	@Test
+	public void testLoginActionFailed() {
+		String actionName = "login";
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("name", "test");
+		params.put("password", "123456"); // 密码和预设的不一致
+
+		View view = Struts.runAction(actionName, params);
+
+		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
+		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/data/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-63-download/data/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml b/students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml
new file mode 100644
index 0000000000..8656e91371
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml
@@ -0,0 +1,39 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-63-download</artifactId>
+	<description>eulerlcs master java road - download file by multiple thread</description>
+
+	<dependencies>
+		<dependency>
+			<groupId>commons-digester</groupId>
+			<artifactId>commons-digester</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.github.stefanbirkner</groupId>
+			<artifactId>system-rules</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java
new file mode 100644
index 0000000000..78d537e842
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java
@@ -0,0 +1,8 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+public interface Iterator {
+	public boolean hasNext();
+
+	public Object next();
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java
new file mode 100644
index 0000000000..7f42cc502b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java
@@ -0,0 +1,126 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+public class LinkedList implements List {
+
+	private Node head;
+
+	public void add(Object o) {
+
+	}
+
+	public void add(int index, Object o) {
+
+	}
+
+	public Object get(int index) {
+		return null;
+	}
+
+	public Object remove(int index) {
+		return null;
+	}
+
+	public int size() {
+		return -1;
+	}
+
+	public void addFirst(Object o) {
+
+	}
+
+	public void addLast(Object o) {
+
+	}
+
+	public Object removeFirst() {
+		return null;
+	}
+
+	public Object removeLast() {
+		return null;
+	}
+
+	public Iterator iterator() {
+		return null;
+	}
+
+	private static class Node {
+		Object data;
+		Node next;
+
+	}
+
+	/**
+	 * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3
+	 */
+	public void reverse() {
+
+	}
+
+	/**
+	 * 删除一个单链表的前半部分 例如：list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10
+	 * ,删除以后的值为7,8,10
+	 * 
+	 */
+	public void removeFirstHalf() {
+
+	}
+
+	/**
+	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
+	 * 
+	 * @param i
+	 * @param length
+	 */
+	public void remove(int i, int length) {
+
+	}
+
+	/**
+	 * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 =
+	 * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
+	 * 返回的结果应该是[101,301,401,601]
+	 * 
+	 * @param list
+	 */
+	public static int[] getElements(LinkedList list) {
+		return null;
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 从当前链表中中删除在list中出现的元素
+	 * 
+	 * @param list
+	 */
+
+	public void subtract(LinkedList list) {
+
+	}
+
+	/**
+	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
+	 */
+	public void removeDuplicateValues() {
+
+	}
+
+	/**
+	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
+	 * 
+	 * @param min
+	 * @param max
+	 */
+	public void removeRange(int min, int max) {
+
+	}
+
+	/**
+	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
+	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
+	 * 
+	 * @param list
+	 */
+	public LinkedList intersection(LinkedList list) {
+		return null;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java
new file mode 100644
index 0000000000..d693a0895d
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+public interface List {
+	public void add(Object o);
+
+	public void add(int index, Object o);
+
+	public Object get(int index);
+
+	public Object remove(int index);
+
+	public int size();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java
new file mode 100644
index 0000000000..30042c8db0
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.download.api;
+
+import java.io.IOException;
+
+public interface Connection {
+	/**
+	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
+	 * 
+	 * @param startPos
+	 *            开始位置， 从0开始
+	 * @param endPos
+	 *            结束位置
+	 * @return
+	 */
+	public byte[] read(int startPos, int endPos) throws IOException;
+
+	/**
+	 * 得到数据内容的长度
+	 * 
+	 * @return
+	 */
+	public int getContentLength();
+
+	/**
+	 * 关闭连接
+	 */
+	public void close();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java
new file mode 100644
index 0000000000..2ba4d3978c
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java
@@ -0,0 +1,5 @@
+package com.github.eulerlcs.jmr.download.api;
+
+public class ConnectionException extends Exception {
+	private static final long serialVersionUID = 1L;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java
new file mode 100644
index 0000000000..e2faed7df6
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.download.api;
+
+public interface ConnectionManager {
+	/**
+	 * 给定一个url , 打开一个连接
+	 * 
+	 * @param url
+	 * @return
+	 */
+	public Connection open(String url) throws ConnectionException;
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java
new file mode 100644
index 0000000000..80400ab21b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java
@@ -0,0 +1,5 @@
+package com.github.eulerlcs.jmr.download.api;
+
+public interface DownloadListener {
+	public void notifyFinished();
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java
new file mode 100644
index 0000000000..179a037a92
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java
@@ -0,0 +1,20 @@
+package com.github.eulerlcs.jmr.download.core;
+
+import com.github.eulerlcs.jmr.download.api.Connection;
+
+public class DownloadThread extends Thread {
+	Connection conn;
+	int startPos;
+	int endPos;
+
+	public DownloadThread(Connection conn, int startPos, int endPos) {
+		this.conn = conn;
+		this.startPos = startPos;
+		this.endPos = endPos;
+	}
+
+	@Override
+	public void run() {
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java
new file mode 100644
index 0000000000..fa3c193960
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java
@@ -0,0 +1,64 @@
+package com.github.eulerlcs.jmr.download.core;
+
+import com.github.eulerlcs.jmr.download.api.Connection;
+import com.github.eulerlcs.jmr.download.api.ConnectionException;
+import com.github.eulerlcs.jmr.download.api.ConnectionManager;
+import com.github.eulerlcs.jmr.download.api.DownloadListener;
+
+public class FileDownloader {
+
+	String url;
+
+	DownloadListener listener;
+
+	ConnectionManager cm;
+
+	public FileDownloader(String _url) {
+		this.url = _url;
+	}
+
+	public void execute() {
+		// 在这里实现你的代码， 注意： 需要用多线程实现下载
+		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
+		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos,
+		// endPos来指定）
+		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
+		// 线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
+		// 具体的实现思路：
+		// 1. 需要调用ConnectionManager的open方法打开连接，
+		// 然后通过Connection.getContentLength方法获得文件的长度
+		// 2. 至少启动3个线程下载， 注意每个线程需要先调用ConnectionManager的open方法
+		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
+		// 3. 把byte数组写入到文件中
+		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
+
+		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
+		Connection conn = null;
+		try {
+			conn = cm.open(this.url);
+
+			int length = conn.getContentLength();
+
+			new DownloadThread(conn, 0, length - 1).start();
+
+		} catch (ConnectionException e) {
+			e.printStackTrace();
+		} finally {
+			if (conn != null) {
+				conn.close();
+			}
+		}
+	}
+
+	public void setListener(DownloadListener listener) {
+		this.listener = listener;
+	}
+
+	public void setConnectionManager(ConnectionManager ucm) {
+		this.cm = ucm;
+	}
+
+	public DownloadListener getListener() {
+		return this.listener;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..72b679702b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java
@@ -0,0 +1,25 @@
+package com.github.eulerlcs.jmr.download.impl;
+
+import java.io.IOException;
+
+import com.github.eulerlcs.jmr.download.api.Connection;
+
+public class ConnectionImpl implements Connection {
+
+	@Override
+	public byte[] read(int startPos, int endPos) throws IOException {
+
+		return null;
+	}
+
+	@Override
+	public int getContentLength() {
+
+		return 0;
+	}
+
+	@Override
+	public void close() {
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java
new file mode 100644
index 0000000000..b24ae09984
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java
@@ -0,0 +1,14 @@
+package com.github.eulerlcs.jmr.download.impl;
+
+import com.github.eulerlcs.jmr.download.api.Connection;
+import com.github.eulerlcs.jmr.download.api.ConnectionException;
+import com.github.eulerlcs.jmr.download.api.ConnectionManager;
+
+public class ConnectionManagerImpl implements ConnectionManager {
+
+	@Override
+	public Connection open(String url) throws ConnectionException {
+
+		return null;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java
new file mode 100644
index 0000000000..531601606e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java
@@ -0,0 +1,53 @@
+package com.github.eulerlcs.jmr.download.core;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.github.eulerlcs.jmr.download.api.ConnectionManager;
+import com.github.eulerlcs.jmr.download.api.DownloadListener;
+import com.github.eulerlcs.jmr.download.impl.ConnectionManagerImpl;
+
+public class FileDownloaderTest {
+	boolean downloadFinished = false;
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDownload() {
+		String url = "http://localhost:8080/test.jpg";
+
+		FileDownloader downloader = new FileDownloader(url);
+
+		ConnectionManager cm = new ConnectionManagerImpl();
+		downloader.setConnectionManager(cm);
+
+		downloader.setListener(new DownloadListener() {
+			@Override
+			public void notifyFinished() {
+				downloadFinished = true;
+			}
+		});
+
+		downloader.execute();
+
+		// 等待多线程下载程序执行完毕
+		while (!downloadFinished) {
+			try {
+				System.out.println("还没有下载完成，休眠五秒");
+				// 休眠5秒
+				Thread.sleep(5000);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+
+		System.out.println("下载完成！");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/data/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/data/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml
new file mode 100644
index 0000000000..76b2d2e4be
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml
@@ -0,0 +1,43 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>com.github.eulerlcs</groupId>
+		<artifactId>jmr-02-parent</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+		<relativePath>../jmr-02-parent/pom.xml</relativePath>
+	</parent>
+	<artifactId>jmr-64-minijvm</artifactId>
+	<description>eulerlcs master java road - mini jvm</description>
+
+	<dependencies>
+		<dependency>
+			<groupId>com.github.eulerlcs</groupId>
+			<artifactId>jmr-61-collection</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-digester</groupId>
+			<artifactId>commons-digester</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.github.stefanbirkner</groupId>
+			<artifactId>system-rules</artifactId>
+		</dependency>
+	</dependencies>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java
new file mode 100644
index 0000000000..25268be2dc
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java
@@ -0,0 +1,110 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+/**
+ * 用双向链表实现LRU算法
+ * 
+ * @author liuxin, eulerlcs
+ */
+public class LRUPageFrame {
+	private static class Node {
+		Node prev;
+		Node next;
+		int pageNum;
+	}
+
+	private int capacity;
+	private int length = 0;
+	private Node first;// 链表头
+	private Node last;// 链表尾
+
+	public LRUPageFrame(int capacity) {
+		this.capacity = capacity;
+	}
+
+	/**
+	 * 获取缓存中对象
+	 * 
+	 * @param pageNum
+	 */
+	public void access(int pageNum) {
+		Node node = findNode(pageNum);
+
+		if (node != null) {
+			moveToFirst(node);
+		} else {
+			node = new Node();
+			node.pageNum = pageNum;
+			addToFirst(node);
+		}
+	}
+
+	private Node findNode(int pageNum) {
+		Node node = first;
+
+		while (node != null) {
+			if (node.pageNum == pageNum) {
+				return node;
+			} else {
+				node = node.next;
+			}
+		}
+
+		return null;
+	}
+
+	private void moveToFirst(Node node) {
+		if (node == first) {
+			return;
+		} else if (node == last) {
+			last = node.prev;
+		}
+
+		if (node.prev != null) {
+			node.prev.next = node.next;
+		}
+		if (node.next != null) {
+			node.next.prev = node.prev;
+		}
+
+		first.prev = node;
+		node.prev = null;
+		node.next = first;
+
+		first = node;
+	}
+
+	private void addToFirst(Node node) {
+		if (first == null) {
+			first = node;
+			last = first;
+		} else {
+			first.prev = node;
+			node.next = first;
+			first = node;
+		}
+
+		length++;
+		if (length > capacity) {
+			last.prev.next = null;
+			last = last.prev;
+
+			length = capacity;
+		}
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder buffer = new StringBuilder();
+		Node node = first;
+		while (node != null) {
+			buffer.append(node.pageNum);
+
+			node = node.next;
+			if (node != null) {
+				buffer.append(",");
+			}
+		}
+
+		return buffer.toString();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java
new file mode 100644
index 0000000000..6f2c895554
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java
@@ -0,0 +1,24 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+public class Stack {
+	private ArrayList elementData = new ArrayList();
+
+	public void push(Object o) {
+	}
+
+	public Object pop() {
+		return null;
+	}
+
+	public Object peek() {
+		return null;
+	}
+
+	public boolean isEmpty() {
+		return false;
+	}
+
+	public int size() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java
new file mode 100644
index 0000000000..1c0a56be56
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java
@@ -0,0 +1,43 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+public class StackUtil {
+	/**
+	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
+	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 */
+	public static void reverse(Stack s) {
+
+	}
+
+	/**
+	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
+	 * 
+	 * @param o
+	 */
+	public static void remove(Stack s, Object o) {
+
+	}
+
+	/**
+	 * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty，
+	 * 可以使用另外一个栈来辅助
+	 * 
+	 * @param len
+	 * @return
+	 */
+	public static Object[] getTop(Stack s, int len) {
+		return null;
+	}
+
+	/**
+	 * 字符串s 可能包含这些字符： ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s =
+	 * "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true 如果 s = "([b{x]y})",
+	 * 则该字符串中的括号不是成对出现的， 该方法返回false;
+	 * 
+	 * @param s
+	 * @return
+	 */
+	public static boolean isValidPairs(String s) {
+		return false;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java
new file mode 100644
index 0000000000..a74ee2eaaf
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java
@@ -0,0 +1,19 @@
+package com.github.eulerlcs.jmr.jvm.attr;
+
+public abstract class AttributeInfo {
+	public static final String CODE = "Code";
+	public static final String CONST_VALUE = "ConstantValue";
+	public static final String EXCEPTIONS = "Exceptions";
+	public static final String LINE_NUM_TABLE = "LineNumberTable";
+	public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
+	public static final String STACK_MAP_TABLE = "StackMapTable";
+	int attrNameIndex;
+	int attrLen;
+
+	public AttributeInfo(int attrNameIndex, int attrLen) {
+
+		this.attrNameIndex = attrNameIndex;
+		this.attrLen = attrLen;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java
new file mode 100644
index 0000000000..ee99466cad
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java
@@ -0,0 +1,52 @@
+package com.github.eulerlcs.jmr.jvm.attr;
+
+import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
+import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
+
+public class CodeAttr extends AttributeInfo {
+	private int maxStack;
+	private int maxLocals;
+	private int codeLen;
+	private String code;
+
+	public String getCode() {
+		return code;
+	}
+
+	// private ByteCodeCommand[] cmds ;
+	// public ByteCodeCommand[] getCmds() {
+	// return cmds;
+	// }
+	private LineNumberTable lineNumTable;
+	private LocalVariableTable localVarTable;
+	private StackMapTable stackMapTable;
+
+	public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,
+			String code /* ByteCodeCommand[] cmds */) {
+		super(attrNameIndex, attrLen);
+		this.maxStack = maxStack;
+		this.maxLocals = maxLocals;
+		this.codeLen = codeLen;
+		this.code = code;
+		// this.cmds = cmds;
+	}
+
+	public void setLineNumberTable(LineNumberTable t) {
+		this.lineNumTable = t;
+	}
+
+	public void setLocalVariableTable(LocalVariableTable t) {
+		this.localVarTable = t;
+	}
+
+	public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) {
+
+		return null;
+	}
+
+	private void setStackMapTable(StackMapTable t) {
+		this.stackMapTable = t;
+
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java
new file mode 100644
index 0000000000..3c3ee7e256
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java
@@ -0,0 +1,46 @@
+package com.github.eulerlcs.jmr.jvm.attr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
+
+public class LineNumberTable extends AttributeInfo {
+	List<LineNumberItem> items = new ArrayList<LineNumberItem>();
+
+	private static class LineNumberItem {
+		int startPC;
+		int lineNum;
+
+		public int getStartPC() {
+			return startPC;
+		}
+
+		public void setStartPC(int startPC) {
+			this.startPC = startPC;
+		}
+
+		public int getLineNum() {
+			return lineNum;
+		}
+
+		public void setLineNum(int lineNum) {
+			this.lineNum = lineNum;
+		}
+	}
+
+	public void addLineNumberItem(LineNumberItem item) {
+		this.items.add(item);
+	}
+
+	public LineNumberTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+
+	}
+
+	public static LineNumberTable parse(ByteCodeIterator iter) {
+
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java
new file mode 100644
index 0000000000..19483e48d5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java
@@ -0,0 +1,49 @@
+package com.github.eulerlcs.jmr.jvm.attr;
+
+public class LocalVariableItem {
+	private int startPC;
+	private int length;
+	private int nameIndex;
+	private int descIndex;
+	private int index;
+
+	public int getStartPC() {
+		return startPC;
+	}
+
+	public void setStartPC(int startPC) {
+		this.startPC = startPC;
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	public int getNameIndex() {
+		return nameIndex;
+	}
+
+	public void setNameIndex(int nameIndex) {
+		this.nameIndex = nameIndex;
+	}
+
+	public int getDescIndex() {
+		return descIndex;
+	}
+
+	public void setDescIndex(int descIndex) {
+		this.descIndex = descIndex;
+	}
+
+	public int getIndex() {
+		return index;
+	}
+
+	public void setIndex(int index) {
+		this.index = index;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java
new file mode 100644
index 0000000000..a847d9222e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java
@@ -0,0 +1,25 @@
+package com.github.eulerlcs.jmr.jvm.attr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
+
+public class LocalVariableTable extends AttributeInfo {
+
+	List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();
+
+	public LocalVariableTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+	}
+
+	public static LocalVariableTable parse(ByteCodeIterator iter) {
+
+		return null;
+	}
+
+	private void addLocalVariableItem(LocalVariableItem item) {
+		this.items.add(item);
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java
new file mode 100644
index 0000000000..e281ce8616
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java
@@ -0,0 +1,29 @@
+package com.github.eulerlcs.jmr.jvm.attr;
+
+import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
+
+public class StackMapTable extends AttributeInfo {
+
+	private String originalCode;
+
+	public StackMapTable(int attrNameIndex, int attrLen) {
+		super(attrNameIndex, attrLen);
+	}
+
+	public static StackMapTable parse(ByteCodeIterator iter) {
+		int index = iter.nextU2ToInt();
+		int len = iter.nextU4ToInt();
+		StackMapTable t = new StackMapTable(index, len);
+
+		// 后面的StackMapTable太过复杂， 不再处理， 只把原始的代码读进来保存
+		String code = iter.nextUxToHexString(len);
+		t.setOriginalCode(code);
+
+		return t;
+	}
+
+	private void setOriginalCode(String code) {
+		this.originalCode = code;
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java
new file mode 100644
index 0000000000..2e912067fd
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java
@@ -0,0 +1,26 @@
+package com.github.eulerlcs.jmr.jvm.clz;
+
+public class AccessFlag {
+	private int flagValue;
+
+	public AccessFlag(int value) {
+		this.flagValue = value;
+	}
+
+	public int getFlagValue() {
+		return flagValue;
+	}
+
+	public void setFlagValue(int flag) {
+		this.flagValue = flag;
+	}
+
+	public boolean isPublicClass() {
+		return (this.flagValue & 0x0001) != 0;
+	}
+
+	public boolean isFinalClass() {
+		return (this.flagValue & 0x0010) != 0;
+	}
+
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java
new file mode 100644
index 0000000000..7b84ca588e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java
@@ -0,0 +1,100 @@
+package com.github.eulerlcs.jmr.jvm.clz;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.github.eulerlcs.jmr.jvm.constant.ClassInfo;
+import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
+import com.github.eulerlcs.jmr.jvm.field.Field;
+import com.github.eulerlcs.jmr.jvm.method.Method;
+
+public class ClassFile {
+
+	private int minorVersion;
+	private int majorVersion;
+
+	private AccessFlag accessFlag;
+	private ClassIndex clzIndex;
+	private ConstantPool pool;
+	private List<Field> fields = new ArrayList<Field>();
+	private List<Method> methods = new ArrayList<Method>();
+
+	public ClassIndex getClzIndex() {
+		return clzIndex;
+	}
+
+	public AccessFlag getAccessFlag() {
+		return accessFlag;
+	}
+
+	public void setAccessFlag(AccessFlag accessFlag) {
+		this.accessFlag = accessFlag;
+	}
+
+	public ConstantPool getConstantPool() {
+		return pool;
+	}
+
+	public int getMinorVersion() {
+		return minorVersion;
+	}
+
+	public void setMinorVersion(int minorVersion) {
+		this.minorVersion = minorVersion;
+	}
+
+	public int getMajorVersion() {
+		return majorVersion;
+	}
+
+	public void setMajorVersion(int majorVersion) {
+		this.majorVersion = majorVersion;
+	}
+
+	public void setConstPool(ConstantPool pool) {
+		this.pool = pool;
+
+	}
+
+	public void setClassIndex(ClassIndex clzIndex) {
+		this.clzIndex = clzIndex;
+	}
+
+	public void addField(Field f) {
+		this.fields.add(f);
+	}
+
+	public List<Field> getFields() {
+		return this.fields;
+	}
+
+	public void addMethod(Method m) {
+		this.methods.add(m);
+	}
+
+	public List<Method> getMethods() {
+		return methods;
+	}
+
+	public void print() {
+
+		if (this.accessFlag.isPublicClass()) {
+			System.out.println("Access flag : public  ");
+		}
+		System.out.println("Class Name:" + getClassName());
+
+		System.out.println("Super Class Name:" + getSuperClassName());
+
+	}
+
+	private String getClassName() {
+		int thisClassIndex = this.clzIndex.getThisClassIndex();
+		ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex);
+		return thisClass.getClassName();
+	}
+
+	private String getSuperClassName() {
+		ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
+		return superClass.getClassName();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java
new file mode 100644
index 0000000000..819b538406
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java
@@ -0,0 +1,22 @@
+package com.github.eulerlcs.jmr.jvm.clz;
+
+public class ClassIndex {
+	private int thisClassIndex;
+	private int superClassIndex;
+
+	public int getThisClassIndex() {
+		return thisClassIndex;
+	}
+
+	public void setThisClassIndex(int thisClassIndex) {
+		this.thisClassIndex = thisClassIndex;
+	}
+
+	public int getSuperClassIndex() {
+		return superClassIndex;
+	}
+
+	public void setSuperClassIndex(int superClassIndex) {
+		this.superClassIndex = superClassIndex;
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java
new file mode 100644
index 0000000000..d2bc776faf
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java
@@ -0,0 +1,29 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class ClassInfo extends ConstantInfo {
+	private int type = ConstantInfo.CLASS_INFO;
+	private int utf8Index;
+
+	public ClassInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getUtf8Index() {
+		return utf8Index;
+	}
+
+	public void setUtf8Index(int utf8Index) {
+		this.utf8Index = utf8Index;
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public String getClassName() {
+		int index = getUtf8Index();
+		UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index);
+		return utf8Info.getValue();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java
new file mode 100644
index 0000000000..c283fb56a5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java
@@ -0,0 +1,29 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public abstract class ConstantInfo {
+	public static final int UTF8_INFO = 1;
+	public static final int FLOAT_INFO = 4;
+	public static final int CLASS_INFO = 7;
+	public static final int STRING_INFO = 8;
+	public static final int FIELD_INFO = 9;
+	public static final int METHOD_INFO = 10;
+	public static final int NAME_AND_TYPE_INFO = 12;
+	protected ConstantPool constantPool;
+
+	public ConstantInfo() {
+	}
+
+	public ConstantInfo(ConstantPool pool) {
+		this.constantPool = pool;
+	}
+
+	public abstract int getType();
+
+	public ConstantPool getConstantPool() {
+		return constantPool;
+	}
+
+	public ConstantInfo getConstantInfo(int index) {
+		return this.constantPool.getConstantInfo(index);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java
new file mode 100644
index 0000000000..ff1af9d094
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConstantPool {
+
+	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
+
+	public ConstantPool() {
+	}
+
+	public void addConstantInfo(ConstantInfo info) {
+		this.constantInfos.add(info);
+	}
+
+	public ConstantInfo getConstantInfo(int index) {
+		return this.constantInfos.get(index);
+	}
+
+	public String getUTF8String(int index) {
+		return ((UTF8Info) this.constantInfos.get(index)).getValue();
+	}
+
+	public Object getSize() {
+		return this.constantInfos.size() - 1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java
new file mode 100644
index 0000000000..e5220ac5c4
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java
@@ -0,0 +1,54 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class FieldRefInfo extends ConstantInfo {
+	private int type = ConstantInfo.FIELD_INFO;
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+
+	public FieldRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+
+	@Override
+	public String toString() {
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+		return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]";
+	}
+
+	public String getClassName() {
+		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
+		UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index());
+		return utf8Info.getValue();
+	}
+
+	public String getFieldName() {
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+
+	public String getFieldType() {
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java
new file mode 100644
index 0000000000..4dc4ae3d1b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java
@@ -0,0 +1,56 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class MethodRefInfo extends ConstantInfo {
+	private int type = ConstantInfo.METHOD_INFO;
+
+	private int classInfoIndex;
+	private int nameAndTypeIndex;
+
+	public MethodRefInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public int getClassInfoIndex() {
+		return classInfoIndex;
+	}
+
+	public void setClassInfoIndex(int classInfoIndex) {
+		this.classInfoIndex = classInfoIndex;
+	}
+
+	public int getNameAndTypeIndex() {
+		return nameAndTypeIndex;
+	}
+
+	public void setNameAndTypeIndex(int nameAndTypeIndex) {
+		this.nameAndTypeIndex = nameAndTypeIndex;
+	}
+
+	@Override
+	public String toString() {
+		return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType();
+	}
+
+	public String getClassName() {
+		ConstantPool pool = this.getConstantPool();
+		ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex());
+		return clzInfo.getClassName();
+	}
+
+	public String getMethodName() {
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getName();
+	}
+
+	public String getParamAndReturnType() {
+		ConstantPool pool = this.getConstantPool();
+		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
+		return typeInfo.getTypeInfo();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java
new file mode 100644
index 0000000000..6674006efd
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java
@@ -0,0 +1,50 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class NameAndTypeInfo extends ConstantInfo {
+	public int type = ConstantInfo.NAME_AND_TYPE_INFO;
+
+	private int index1;
+	private int index2;
+
+	public NameAndTypeInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getIndex1() {
+		return index1;
+	}
+
+	public void setIndex1(int index1) {
+		this.index1 = index1;
+	}
+
+	public int getIndex2() {
+		return index2;
+	}
+
+	public void setIndex2(int index2) {
+		this.index2 = index2;
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public String getName() {
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1);
+		return utf8Info1.getValue();
+	}
+
+	public String getTypeInfo() {
+		ConstantPool pool = this.getConstantPool();
+		UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2);
+		return utf8Info2.getValue();
+	}
+
+	@Override
+	public String toString() {
+		return "(" + getName() + "," + getTypeInfo() + ")";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java
new file mode 100644
index 0000000000..c4267ca5fc
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class NullConstantInfo extends ConstantInfo {
+	public NullConstantInfo() {
+	}
+
+	@Override
+	public int getType() {
+		return -1;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java
new file mode 100644
index 0000000000..6f3575a5e0
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class StringInfo extends ConstantInfo {
+	private int type = ConstantInfo.STRING_INFO;
+	private int index;
+
+	public StringInfo(ConstantPool pool) {
+		super(pool);
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	public int getIndex() {
+		return index;
+	}
+
+	public void setIndex(int index) {
+		this.index = index;
+	}
+
+	@Override
+	public String toString() {
+		return this.getConstantPool().getUTF8String(index);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java
new file mode 100644
index 0000000000..2435cc554e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java
@@ -0,0 +1,37 @@
+package com.github.eulerlcs.jmr.jvm.constant;
+
+public class UTF8Info extends ConstantInfo {
+	private int type = ConstantInfo.UTF8_INFO;
+	private int length;
+	private String value;
+
+	public UTF8Info(ConstantPool pool) {
+		super(pool);
+	}
+
+	public int getLength() {
+		return length;
+	}
+
+	public void setLength(int length) {
+		this.length = length;
+	}
+
+	@Override
+	public int getType() {
+		return type;
+	}
+
+	@Override
+	public String toString() {
+		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]";
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java
new file mode 100644
index 0000000000..d0f54964ac
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java
@@ -0,0 +1,26 @@
+package com.github.eulerlcs.jmr.jvm.field;
+
+import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
+import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
+
+public class Field {
+	private int accessFlag;
+	private int nameIndex;
+	private int descriptorIndex;
+
+	private ConstantPool pool;
+
+	public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) {
+
+		this.accessFlag = accessFlag;
+		this.nameIndex = nameIndex;
+		this.descriptorIndex = descriptorIndex;
+		this.pool = pool;
+	}
+
+	public static Field parse(ConstantPool pool, ByteCodeIterator iter) {
+
+		return null;
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java
new file mode 100644
index 0000000000..095a81dece
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java
@@ -0,0 +1,55 @@
+package com.github.eulerlcs.jmr.jvm.loader;
+
+import java.util.Arrays;
+
+import com.github.eulerlcs.jmr.jvm.util.Util;
+
+public class ByteCodeIterator {
+	byte[] codes;
+	int pos = 0;
+
+	ByteCodeIterator(byte[] codes) {
+		this.codes = codes;
+	}
+
+	public byte[] getBytes(int len) {
+		if (pos + len >= codes.length) {
+			throw new ArrayIndexOutOfBoundsException();
+		}
+
+		byte[] data = Arrays.copyOfRange(codes, pos, pos + len);
+		pos += len;
+		return data;
+	}
+
+	public int nextU1toInt() {
+
+		return Util.byteToInt(new byte[] { codes[pos++] });
+	}
+
+	public int nextU2ToInt() {
+		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] });
+	}
+
+	public int nextU4ToInt() {
+		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] });
+	}
+
+	public String nextU4ToHexString() {
+		return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }));
+	}
+
+	public String nextUxToHexString(int len) {
+		byte[] tmp = new byte[len];
+
+		for (int i = 0; i < len; i++) {
+			tmp[i] = codes[pos++];
+		}
+		return Util.byteToHexString(tmp).toLowerCase();
+
+	}
+
+	public void back(int n) {
+		this.pos -= n;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java
new file mode 100644
index 0000000000..49018cb0a7
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java
@@ -0,0 +1,74 @@
+package com.github.eulerlcs.jmr.jvm.loader;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
+
+public class ClassFileLoader {
+	private final static Logger log = LoggerFactory.getLogger(ClassFileLoader.class);
+
+	private List<String> clzPaths = new ArrayList<String>();
+
+	public byte[] readBinaryCode(String className) {
+		File file = findClassFile(className);
+		if (file == null) {
+			return new byte[0];
+		}
+
+		byte[] ret = null;
+		byte[] bytes = new byte[(int) file.length()];
+		try (DataInputStream dis = new DataInputStream(new FileInputStream(file))) {
+			dis.readFully(bytes);
+			ret = bytes;
+		} catch (IOException e) {
+			log.error("ClassFileLoader read error!", e);
+		}
+
+		return ret;
+	}
+
+	private File findClassFile(String className) {
+		String sub = className.replace(".", File.separator) + ".class";
+		for (String clzPath : clzPaths) {
+			File file = new File(clzPath, sub);
+			if (file.exists()) {
+				return file;
+			}
+		}
+
+		return null;
+	}
+
+	public void addClassPath(String path) {
+		clzPaths.add(path);
+	}
+
+	public String getClassPath() {
+		if (clzPaths.size() == 0) {
+			return "";
+		}
+
+		StringBuilder sb = new StringBuilder();
+		for (String clzPath : clzPaths) {
+			sb.append(";");
+			sb.append(clzPath);
+		}
+
+		String cat = sb.toString();
+		return cat.length() > 0 ? cat.substring(1) : "";
+	}
+
+	public ClassFile loadClass(String className) {
+		byte[] codes = this.readBinaryCode(className);
+		ClassFileParser parser = new ClassFileParser();
+		return parser.parse(codes);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java
new file mode 100644
index 0000000000..394c35beb9
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java
@@ -0,0 +1,146 @@
+package com.github.eulerlcs.jmr.jvm.loader;
+
+import java.io.UnsupportedEncodingException;
+
+import com.github.eulerlcs.jmr.jvm.clz.AccessFlag;
+import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
+import com.github.eulerlcs.jmr.jvm.clz.ClassIndex;
+import com.github.eulerlcs.jmr.jvm.constant.ClassInfo;
+import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
+import com.github.eulerlcs.jmr.jvm.constant.FieldRefInfo;
+import com.github.eulerlcs.jmr.jvm.constant.MethodRefInfo;
+import com.github.eulerlcs.jmr.jvm.constant.NameAndTypeInfo;
+import com.github.eulerlcs.jmr.jvm.constant.NullConstantInfo;
+import com.github.eulerlcs.jmr.jvm.constant.StringInfo;
+import com.github.eulerlcs.jmr.jvm.constant.UTF8Info;
+
+public class ClassFileParser {
+
+	public ClassFile parse(byte[] codes) {
+
+		ClassFile clzFile = new ClassFile();
+
+		ByteCodeIterator iter = new ByteCodeIterator(codes);
+
+		String magicNumber = iter.nextU4ToHexString();
+
+		if (!"cafebabe".equals(magicNumber)) {
+			return null;
+		}
+
+		clzFile.setMinorVersion(iter.nextU2ToInt());
+		clzFile.setMajorVersion(iter.nextU2ToInt());
+
+		ConstantPool pool = parseConstantPool(iter);
+		clzFile.setConstPool(pool);
+
+		AccessFlag flag = parseAccessFlag(iter);
+		clzFile.setAccessFlag(flag);
+
+		ClassIndex clzIndex = parseClassInfex(iter);
+		clzFile.setClassIndex(clzIndex);
+
+		parseInterfaces(iter);
+
+		return clzFile;
+	}
+
+	private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
+
+		AccessFlag flag = new AccessFlag(iter.nextU2ToInt());
+		// System.out.println("Is public class: " + flag.isPublicClass());
+		// System.out.println("Is final class : " + flag.isFinalClass());
+
+		return flag;
+	}
+
+	private ClassIndex parseClassInfex(ByteCodeIterator iter) {
+
+		int thisClassIndex = iter.nextU2ToInt();
+		int superClassIndex = iter.nextU2ToInt();
+
+		ClassIndex clzIndex = new ClassIndex();
+
+		clzIndex.setThisClassIndex(thisClassIndex);
+		clzIndex.setSuperClassIndex(superClassIndex);
+
+		return clzIndex;
+
+	}
+
+	private ConstantPool parseConstantPool(ByteCodeIterator iter) {
+
+		int constPoolCount = iter.nextU2ToInt();
+
+		System.out.println("Constant Pool Count :" + constPoolCount);
+
+		ConstantPool pool = new ConstantPool();
+
+		pool.addConstantInfo(new NullConstantInfo());
+
+		for (int i = 1; i <= constPoolCount - 1; i++) {
+
+			int tag = iter.nextU1toInt();
+
+			if (tag == 7) {
+				// Class Info
+				int utf8Index = iter.nextU2ToInt();
+				ClassInfo clzInfo = new ClassInfo(pool);
+				clzInfo.setUtf8Index(utf8Index);
+
+				pool.addConstantInfo(clzInfo);
+			} else if (tag == 1) {
+				// UTF-8 String
+				int len = iter.nextU2ToInt();
+				byte[] data = iter.getBytes(len);
+				String value = null;
+				try {
+					value = new String(data, "UTF-8");
+				} catch (UnsupportedEncodingException e) {
+					e.printStackTrace();
+				}
+
+				UTF8Info utf8Str = new UTF8Info(pool);
+				utf8Str.setLength(len);
+				utf8Str.setValue(value);
+				pool.addConstantInfo(utf8Str);
+			} else if (tag == 8) {
+				StringInfo info = new StringInfo(pool);
+				info.setIndex(iter.nextU2ToInt());
+				pool.addConstantInfo(info);
+			} else if (tag == 9) {
+				FieldRefInfo field = new FieldRefInfo(pool);
+				field.setClassInfoIndex(iter.nextU2ToInt());
+				field.setNameAndTypeIndex(iter.nextU2ToInt());
+				pool.addConstantInfo(field);
+			} else if (tag == 10) {
+				// MethodRef
+				MethodRefInfo method = new MethodRefInfo(pool);
+				method.setClassInfoIndex(iter.nextU2ToInt());
+				method.setNameAndTypeIndex(iter.nextU2ToInt());
+				pool.addConstantInfo(method);
+			} else if (tag == 12) {
+				// Name and Type Info
+				NameAndTypeInfo nameType = new NameAndTypeInfo(pool);
+				nameType.setIndex1(iter.nextU2ToInt());
+				nameType.setIndex2(iter.nextU2ToInt());
+				pool.addConstantInfo(nameType);
+			} else {
+				throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet.");
+			}
+		}
+
+		System.out.println("Finished reading Constant pool ");
+
+		return pool;
+	}
+
+	private void parseInterfaces(ByteCodeIterator iter) {
+		int interfaceCount = iter.nextU2ToInt();
+
+		System.out.println("interfaceCount:" + interfaceCount);
+
+		// TODO : 如果实现了interface, 这里需要解析
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java
new file mode 100644
index 0000000000..2f043bc42e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java
@@ -0,0 +1,48 @@
+package com.github.eulerlcs.jmr.jvm.method;
+
+import com.github.eulerlcs.jmr.jvm.attr.CodeAttr;
+import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
+import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
+
+public class Method {
+
+	private int accessFlag;
+	private int nameIndex;
+	private int descriptorIndex;
+
+	private com.github.eulerlcs.jmr.jvm.attr.CodeAttr codeAttr;
+
+	private ClassFile clzFile;
+
+	public ClassFile getClzFile() {
+		return clzFile;
+	}
+
+	public int getNameIndex() {
+		return nameIndex;
+	}
+
+	public int getDescriptorIndex() {
+		return descriptorIndex;
+	}
+
+	public CodeAttr getCodeAttr() {
+		return codeAttr;
+	}
+
+	public void setCodeAttr(CodeAttr code) {
+		this.codeAttr = code;
+	}
+
+	public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) {
+		this.clzFile = clzFile;
+		this.accessFlag = accessFlag;
+		this.nameIndex = nameIndex;
+		this.descriptorIndex = descriptorIndex;
+	}
+
+	public static Method parse(ClassFile clzFile, ByteCodeIterator iter) {
+		return null;
+
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java
new file mode 100644
index 0000000000..7cc99ed27e
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java
@@ -0,0 +1,22 @@
+package com.github.eulerlcs.jmr.jvm.util;
+
+public class Util {
+	public static int byteToInt(byte[] codes) {
+		String s1 = byteToHexString(codes);
+		return Integer.valueOf(s1, 16).intValue();
+	}
+
+	public static String byteToHexString(byte[] codes) {
+		StringBuffer buffer = new StringBuffer();
+		for (int i = 0; i < codes.length; i++) {
+			byte b = codes[i];
+			int value = b & 0xFF;
+			String strHex = Integer.toHexString(value);
+			if (strHex.length() < 2) {
+				strHex = "0" + strHex;
+			}
+			buffer.append(strHex);
+		}
+		return buffer.toString();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java
new file mode 100644
index 0000000000..debc4d7eb6
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java
@@ -0,0 +1,27 @@
+package com.github.eulerlcs.jmr.algorithm;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LRUPageFrameTest {
+	@Test
+	public void testAccess() {
+		LRUPageFrame frame = new LRUPageFrame(3);
+		frame.access(7);
+		frame.access(0);
+		frame.access(1);
+		Assert.assertEquals("1,0,7", frame.toString());
+		frame.access(2);
+		Assert.assertEquals("2,1,0", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,2,1", frame.toString());
+		frame.access(3);
+		Assert.assertEquals("3,0,2", frame.toString());
+		frame.access(0);
+		Assert.assertEquals("0,3,2", frame.toString());
+		frame.access(4);
+		Assert.assertEquals("4,0,3", frame.toString());
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java
new file mode 100644
index 0000000000..1e18416b61
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java
@@ -0,0 +1,220 @@
+package com.github.eulerlcs.jmr.jvm.loader;
+
+import java.io.File;
+import java.util.List;
+
+import javax.xml.bind.DatatypeConverter;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
+import com.github.eulerlcs.jmr.jvm.clz.ClassIndex;
+import com.github.eulerlcs.jmr.jvm.constant.ClassInfo;
+import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
+import com.github.eulerlcs.jmr.jvm.constant.MethodRefInfo;
+import com.github.eulerlcs.jmr.jvm.constant.NameAndTypeInfo;
+import com.github.eulerlcs.jmr.jvm.constant.UTF8Info;
+import com.github.eulerlcs.jmr.jvm.field.Field;
+import com.github.eulerlcs.jmr.jvm.method.Method;
+
+public class ClassFileloaderTest {
+	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
+	private static String userDir = System.getProperty("user.dir");
+	private static String path1 = "C:\temp";
+	private static String path2 = userDir + File.separator + "target" + File.separator + "test-classes";
+	private static String className = EmployeeV1.class.getName();
+	static ClassFileLoader loader = null;
+	static ClassFile clzFile = null;
+	static {
+		loader = new ClassFileLoader();
+		loader.addClassPath(path1);
+		loader.addClassPath(path2);
+		clzFile = loader.loadClass(className);
+		clzFile.print();
+	}
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		loader = null;
+	}
+
+	@Test
+	public void testClassPath() {
+		String clzPath = loader.getClassPath();
+		Assert.assertEquals(path1 + ";" + path2, clzPath);
+	}
+
+	@Test
+	public void testClassFileLength() {
+		byte[] byteCodes = loader.readBinaryCode(className);
+		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
+		Assert.assertEquals(1078, byteCodes.length);
+
+	}
+
+	@Test
+	public void testMagicNumber() {
+		byte[] byteCodes = loader.readBinaryCode(className);
+		byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] };
+		String acctualValue = DatatypeConverter.printHexBinary(codes);
+
+		Assert.assertEquals("CAFEBABE", acctualValue);
+	}
+
+	/**
+	 * ----------------------------------------------------------------------
+	 */
+
+	@Test
+	public void testVersion() {
+
+		Assert.assertEquals(0, clzFile.getMinorVersion());
+		Assert.assertEquals(52, clzFile.getMajorVersion());
+
+	}
+
+	@Test
+	public void testConstantPool() {
+
+		ConstantPool pool = clzFile.getConstantPool();
+
+		Assert.assertEquals(53, pool.getSize());
+
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
+			Assert.assertEquals(2, clzInfo.getUtf8Index());
+
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
+			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
+		}
+		{
+			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
+			Assert.assertEquals(4, clzInfo.getUtf8Index());
+
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
+			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
+		}
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
+			Assert.assertEquals("name", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(6);
+			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(7);
+			Assert.assertEquals("age", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(8);
+			Assert.assertEquals("I", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(9);
+			Assert.assertEquals("<init>", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(10);
+			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
+
+			utf8Info = (UTF8Info) pool.getConstantInfo(11);
+			Assert.assertEquals("Code", utf8Info.getValue());
+		}
+
+		{
+			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(12);
+			Assert.assertEquals(3, methodRef.getClassInfoIndex());
+			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
+		}
+
+		{
+			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
+			Assert.assertEquals(9, nameAndType.getIndex1());
+			Assert.assertEquals(14, nameAndType.getIndex2());
+		}
+		// 抽查几个吧
+		{
+			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(45);
+			Assert.assertEquals(1, methodRef.getClassInfoIndex());
+			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
+		}
+
+		{
+			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
+			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
+		}
+	}
+
+	@Test
+	public void testClassIndex() {
+
+		ClassIndex clzIndex = clzFile.getClzIndex();
+		ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
+		ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
+
+		Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
+		Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
+	}
+
+	/**
+	 * 下面是第三次JVM课应实现的测试用例
+	 */
+	@Test
+	public void testReadFields() {
+
+		List<Field> fields = clzFile.getFields();
+		Assert.assertEquals(2, fields.size());
+		{
+			Field f = fields.get(0);
+			Assert.assertEquals("name:Ljava/lang/String;", f.toString());
+		}
+		{
+			Field f = fields.get(1);
+			Assert.assertEquals("age:I", f.toString());
+		}
+	}
+
+	@Test
+	public void testMethods() {
+
+		List<Method> methods = clzFile.getMethods();
+		ConstantPool pool = clzFile.getConstantPool();
+
+		{
+			Method m = methods.get(0);
+			assertMethodEquals(pool, m, "<init>", "(Ljava/lang/String;I)V", "2ab7000c2a2bb5000f2a1cb50011b1");
+
+		}
+		{
+			Method m = methods.get(1);
+			assertMethodEquals(pool, m, "setName", "(Ljava/lang/String;)V", "2a2bb5000fb1");
+
+		}
+		{
+			Method m = methods.get(2);
+			assertMethodEquals(pool, m, "setAge", "(I)V", "2a1bb50011b1");
+		}
+		{
+			Method m = methods.get(3);
+			assertMethodEquals(pool, m, "sayHello", "()V", "b2001c1222b60024b1");
+
+		}
+		{
+			Method m = methods.get(4);
+			assertMethodEquals(pool, m, "main", "([Ljava/lang/String;)V", "bb000159122b101db7002d4c2bb6002fb1");
+		}
+	}
+
+	private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc,
+			String expectedCode) {
+		String methodName = pool.getUTF8String(m.getNameIndex());
+		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
+		String code = m.getCodeAttr().getCode();
+		Assert.assertEquals(expectedName, methodName);
+		Assert.assertEquals(expectedDesc, methodDesc);
+		Assert.assertEquals(expectedCode, code);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java
new file mode 100644
index 0000000000..070ad19083
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.jvm.loader;
+
+public class EmployeeV1 {
+	private String name;
+	private int age;
+
+	public EmployeeV1(String name, int age) {
+		this.name = name;
+		this.age = age;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+	public void sayHello() {
+		System.out.println("Hello , this is class Employee ");
+	}
+
+	public static void main(String[] args) {
+		EmployeeV1 p = new EmployeeV1("Andy", 29);
+		p.sayHello();
+	}
+}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/5.settingfile/eclipsev45.epf b/students/41689722.eulerlcs/5.settingfile/eclipsev45.epf
new file mode 100644
index 0000000000..ca88d61e06
--- /dev/null
+++ b/students/41689722.eulerlcs/5.settingfile/eclipsev45.epf
@@ -0,0 +1,186 @@
+#Sat Mar 11 11:44:44 JST 2017
+\!/=
+/configuration/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+/configuration/org.eclipse.ui.ide/MAX_RECENT_WORKSPACES=10
+/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES=E\:\\10.github.repo\\coding2017.eulerlcs\\group09\\41689722.eulerlcs\\2.code
+/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES_PROTOCOL=3
+/configuration/org.eclipse.ui.ide/SHOW_RECENT_WORKSPACES=false
+/configuration/org.eclipse.ui.ide/SHOW_WORKSPACE_SELECTION_DIALOG=true
+/instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+/instance/org.eclipse.core.resources/encoding=UTF-8
+/instance/org.eclipse.core.resources/version=1
+/instance/org.eclipse.debug.core/prefWatchExpressions=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<watchExpressions/>\r\n
+/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<launchPerspectives/>\r\n
+/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<DebugViewMemento org.eclipse.debug.ui.BREADCRUMB_DROPDOWN_AUTO_EXPAND\="false"/>
+/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.ExpressionView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684">\r\n<PRESENTATION_CONTEXT_PROPERTIES IMemento.internal.id\="org.eclipse.debug.ui.ExpressionView"/>\r\n</VariablesViewMemento>
+/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.VariableView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684"/>
+/instance/org.eclipse.debug.ui/preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane|
+/instance/org.eclipse.e4.ui.css.swt.theme/themeid=org.eclipse.e4.ui.css.theme.e4_default6.0,6.1,6.2,6.3,10.0
+/instance/org.eclipse.e4.ui.workbench.renderers.swt/enableMRU=true
+/instance/org.eclipse.e4.ui.workbench.renderers.swt/themeEnabled=true
+/instance/org.eclipse.egit.core/GitRepositoriesView.GitDirectories=E\:\\10.github.repo\\coding2017.eulerlcs\\.git;
+/instance/org.eclipse.egit.core/GitRepositoriesView.GitDirectories.relative=E\:\\10.github.repo\\coding2017.eulerlcs\\.git;
+/instance/org.eclipse.epp.logging.aeri.ide/resetSendMode=KEEP
+/instance/org.eclipse.epp.logging.aeri.ide/resetSendModeOn=0
+/instance/org.eclipse.epp.logging.aeri.ide/sendMode=NOTIFY
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.compliance=1.8
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.source=1.8
+/instance/org.eclipse.jdt.launching/org.eclipse.jdt.launching.PREF_VM_XML=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<vmSettings defaultVM\="57,org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType13,1489199648184">\r\n<vmType id\="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType">\r\n<vm id\="1489199648184" javadocURL\="https\://docs.oracle.com/javase/8/docs/api/" name\="jre1.8.0_121" path\="C\:\\Java\\jre1.8.0_121"/>\r\n</vmType>\r\n</vmSettings>\r\n
+/instance/org.eclipse.jdt.ui/content_assist_number_of_computers=24
+/instance/org.eclipse.jdt.ui/content_assist_proposals_background=255,255,255
+/instance/org.eclipse.jdt.ui/content_assist_proposals_foreground=0,0,0
+/instance/org.eclipse.jdt.ui/editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+/instance/org.eclipse.jdt.ui/fontPropagated=true
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.navigator.layout=2
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.navigator.librariesnode=true
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.editor.tab.width=
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=12
+/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.javadoclocations.migrated=true
+/instance/org.eclipse.jdt.ui/org.eclipse.jface.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.jdt.ui/proposalOrderMigrated=true
+/instance/org.eclipse.jdt.ui/sourceHoverBackgroundColor=255,255,225
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_default_serial_version_id=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_generated_serial_version_id=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_annotations=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_deprecated_annotations=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_methods=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_nls_tags=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_override_annotations=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_override_annotations_interface_methods=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.add_serial_version_id=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_blocks=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_parentheses_in_expressions=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_this_for_non_static_field_access=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_this_for_non_static_method_access=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.convert_functional_interfaces=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.convert_to_enhanced_for_loop=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.correct_indentation=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code_changes_only=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.insert_inferred_type_arguments=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_local_variable_final=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_parameters_final=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_private_fields_final=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_type_abstract_if_missing_method=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.make_variable_declarations_final=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.never_use_blocks=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.never_use_parentheses_in_expressions=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.on_save_use_additional_actions=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.organize_imports=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_private_constructors=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_redundant_type_arguments=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces_all=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_casts=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_nls_tags=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_imports=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_local_variables=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_fields=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_members=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_methods=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_types=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.sort_members=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.sort_members_all=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_anonymous_class_creation=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks_only_for_return_and_throw=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_lambda=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_parentheses_in_expressions=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_field_access=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_method_access=false
+/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+/instance/org.eclipse.jdt.ui/spelling_locale_initialized=true
+/instance/org.eclipse.jdt.ui/tabWidthPropagated=true
+/instance/org.eclipse.jdt.ui/useAnnotationsPrefPage=true
+/instance/org.eclipse.jdt.ui/useQuickDiffPrefPage=true
+/instance/org.eclipse.jst.j2ee.webservice.ui/areThereWebServices=false
+/instance/org.eclipse.m2e.discovery/org.eclipse.m2e.discovery.pref.projects=
+/instance/org.eclipse.mylyn.context.core/mylyn.attention.migrated=true
+/instance/org.eclipse.mylyn.monitor.ui/org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true
+/instance/org.eclipse.mylyn.tasks.ui/migrated.task.repositories.secure.store=true
+/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.filters.nonmatching=true
+/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true
+/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.welcome.message=true
+/instance/org.eclipse.oomph.workingsets/working.set.group=<?xml version\="1.0" encoding\="UTF-8"?>\n<workingsets\:WorkingSetGroup xmi\:version\="2.0" xmlns\:xmi\="http\://www.omg.org/XMI" xmlns\:workingsets\="http\://www.eclipse.org/oomph/workingsets/1.0"/>\n
+/instance/org.eclipse.rse.core/org.eclipse.rse.systemtype.local.systemType.defaultUserId=euler
+/instance/org.eclipse.rse.ui/org.eclipse.rse.preferences.order.connections=euler-PC.Local
+/instance/org.eclipse.team.ui/org.eclipse.team.ui.first_time=false
+/instance/org.eclipse.ui.editors/overviewRuler_migration=migrated_3.1
+/instance/org.eclipse.ui.ide/PROBLEMS_FILTERS_MIGRATE=true
+/instance/org.eclipse.ui.ide/platformState=1488095469945
+/instance/org.eclipse.ui.ide/quickStart=false
+/instance/org.eclipse.ui.ide/tipsAndTricks=true
+/instance/org.eclipse.ui.workbench//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false
+/instance/org.eclipse.ui.workbench//org.eclipse.ui.commands/state/org.eclipse.wst.xml.views.XPathView.processor.xpathprocessor/org.eclipse.ui.commands.radioState=xpath10
+/instance/org.eclipse.ui.workbench/ColorsAndFontsPreferencePage.expandedCategories=Torg.eclipse.ui.workbenchMisc\tTorg.eclipse.jdt.ui.presentation\tTorg.eclipse.wst.sse.ui
+/instance/org.eclipse.ui.workbench/ColorsAndFontsPreferencePage.selectedElement=Forg.eclipse.jface.textfont
+/instance/org.eclipse.ui.workbench/PLUGINS_NOT_ACTIVATED_ON_STARTUP=org.eclipse.m2e.discovery;org.eclipse.rse.ui;
+/instance/org.eclipse.ui.workbench/REMOTE_COMMANDS_VIEW_FONT=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.compare.contentmergeviewer.TextMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.debug.ui.DetailPaneFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.debug.ui.MemoryViewTableFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.debug.ui.consoleFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.egit.ui.CommitMessageEditorFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.egit.ui.CommitMessageFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.egit.ui.DiffHeadlineFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.jdt.internal.ui.compare.JavaMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.jdt.internal.ui.compare.PropertiesFileMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.jdt.ui.PropertiesFileEditor.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.jdt.ui.editors.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.jface.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.mylyn.wikitext.ui.presentation.textFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.pde.internal.ui.compare.ManifestContentMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.pde.internal.ui.compare.PluginContentMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.ui.commands=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<org.eclipse.ui.commands/>
+/instance/org.eclipse.ui.workbench/org.eclipse.wst.jsdt.internal.ui.compare.JavaMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.wst.jsdt.ui.editors.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/org.eclipse.wst.sse.ui.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui.workbench/terminal.views.view.font.definition=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.ui/showIntro=false
+/instance/org.eclipse.wst.jsdt.ui/fontPropagated=true
+/instance/org.eclipse.wst.jsdt.ui/org.eclipse.jface.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
+/instance/org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.ui.editor.tab.width=
+/instance/org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.ui.formatterprofiles.version=11
+/instance/org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.ui.javadoclocations.migrated=true
+/instance/org.eclipse.wst.jsdt.ui/proposalOrderMigrated=true
+/instance/org.eclipse.wst.jsdt.ui/tabWidthPropagated=true
+/instance/org.eclipse.wst.jsdt.ui/useAnnotationsPrefPage=true
+/instance/org.eclipse.wst.jsdt.ui/useQuickDiffPrefPage=true
+@org.eclipse.core.net=1.3.0.v20160418-1534
+@org.eclipse.core.resources=3.11.1.v20161107-2032
+@org.eclipse.debug.core=3.10.100.v20160419-1720
+@org.eclipse.debug.ui=3.11.202.v20161114-0338
+@org.eclipse.e4.ui.css.swt.theme=0.10.100.v20160523-0836
+@org.eclipse.e4.ui.workbench.renderers.swt=0.14.0.v20160525-0940
+@org.eclipse.egit.core=4.4.1.201607150455-r
+@org.eclipse.epp.logging.aeri.ide=2.0.3.v20161205-0933
+@org.eclipse.jdt.core=3.12.2.v20161117-1814
+@org.eclipse.jdt.launching=3.8.101.v20161111-2014
+@org.eclipse.jdt.ui=3.12.2.v20160929-0804
+@org.eclipse.jst.j2ee.webservice.ui=1.1.500.v201302011850
+@org.eclipse.m2e.discovery=1.7.0.20160603-1933
+@org.eclipse.mylyn.context.core=3.21.0.v20160701-1337
+@org.eclipse.mylyn.monitor.ui=3.21.0.v20160630-1702
+@org.eclipse.mylyn.tasks.ui=3.21.0.v20160913-2131
+@org.eclipse.oomph.workingsets=1.6.0.v20161019-0656
+@org.eclipse.rse.core=3.3.100.201603151753
+@org.eclipse.rse.ui=3.3.300.201610252046
+@org.eclipse.team.ui=3.8.0.v20160518-1906
+@org.eclipse.ui=3.108.1.v20160929-1045
+@org.eclipse.ui.editors=3.10.1.v20161106-1856
+@org.eclipse.ui.ide=3.12.2.v20161115-1450
+@org.eclipse.ui.workbench=3.108.2.v20161025-2029
+@org.eclipse.wst.jsdt.ui=2.0.0.v201608301904
+file_export_version=3.0
diff --git a/students/41689722.eulerlcs/5.settingfile/git cmd help.txt b/students/41689722.eulerlcs/5.settingfile/git cmd help.txt
new file mode 100644
index 0000000000..86015b4865
--- /dev/null
+++ b/students/41689722.eulerlcs/5.settingfile/git cmd help.txt	
@@ -0,0 +1,43 @@
+open git server deretory
+mkdir abc.git
+cd abc.git
+
+run git bash
+	git --bare init --shared
+
+git clone
+cd abc
+
+git config --global push. default simple
+git push --set-upstream origin master
+git push
+
+get remot branch list
+	git remote update
+
+
+add deleted files
+	git rm <filename>
+	git rm $(git ls-files --deleted)
+	
+
+delete (remote) branch
+	git branch -d branch.abc
+	git push origin :branch.abc
+	
+	or
+	
+	git push --delete origin branch.abc
+	
+
+romote branch douki
+	git fecth --all --prune
+	
+git log
+	git log --graph --pretty=format:
+	
+// http://blog.toshimaru.net/git-log-graph/
+	[alias]
+  lg = git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
+  lga = git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
+ 
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat b/students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat
new file mode 100644
index 0000000000..ddb704e561
--- /dev/null
+++ b/students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat
@@ -0,0 +1,37 @@
+@echo off
+setlocal ENABLEDELAYEDEXPANSION
+
+rem .* 
+:main
+	call :ini
+	
+	set path_root=d:\abc
+	set path_desc=pg.%yymmdd%.%hhmmss%
+	
+	call :copy_source ""
+	call :copy_source ""
+
+	call :end
+	@echo on
+	
+goto :eof
+:copy_source
+	if %1=="" goto :eof
+	set file_name=%~1
+	set file_name=!file_name:/=\!
+	@echo f | xcopy /r/y/s %path_root%\!file_name!		%path_desc%\!file_name!
+
+goto :eof
+:end
+	@echo.
+	@echo.
+	pause
+
+goto :eof
+:ini
+	set self_path="%cd%"
+	set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
+	set yymmdd=!yyyymmdd:~2,6!
+	set hhmmss=%time:~0,2%%time:~3,2%%time:~6,2%
+	if "!hhmmss:~0,1!" == " " set hhmmss=0!hhmmss:~1,7!
+goto :eof
diff --git a/students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat b/students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat
new file mode 100644
index 0000000000..5189f9e130
--- /dev/null
+++ b/students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat
@@ -0,0 +1,37 @@
+@echo off
+setlocal ENABLEDELAYEDEXPANSION
+
+:main
+	call :ini
+	cd /d E:\12.repolist\41689722.eulerlcs\2.code
+	call :del_resource
+	call :end
+	@echo on
+	
+goto :eof
+:del_resource
+	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".settings"`) do rmdir /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".metadata"`) do rmdir /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h "target"`) do rmdir /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h "RemoteSystemsTempFiles"`) do rmdir /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".recommenders"`) do rmdir /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".apt_generated"`) do rmdir /s/q %%a
+
+	for /f "usebackq delims==" %%a in (`dir /b/s/a-d-h ".classpath"`) do del /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/a-d-h ".project"`) do del /s/q %%a
+	for /f "usebackq delims==" %%a in (`dir /b/s/a-d-h ".factorypath"`) do del /s/q %%a
+
+goto :eof
+:end
+	@echo.
+	@echo.
+	pause
+
+goto :eof
+:ini
+	set self_path="%cd%"
+	set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
+	set yymmdd=!yyyymmdd:~2,6!
+	set hhmmss=%time:~0,2%%time:~3,2%%time:~6,2%
+	if "!hhmmss:~0,1!" == " " set hhmmss=0!hhmmss:~1,7!
+goto :eof

From 1c6c8cadc5b7a47d0c3bd3e376c418e345c41faf Mon Sep 17 00:00:00 2001
From: eulerlcs <eulerlcs@gmail.com>
Date: Sun, 18 Jun 2017 22:33:15 +0900
Subject: [PATCH 184/332] refactor

---
 .../2.code/jmr-01-aggregator/pom.xml          |   2 -
 .../2.code/jmr-51-liuxin-question/pom.xml     |  35 ---
 .../coderising/download/api/Connection.java   |  28 --
 .../download/api/ConnectionException.java     |   5 -
 .../download/api/ConnectionManager.java       |  11 -
 .../download/api/DownloadListener.java        |   5 -
 .../download/core/DownloadThread.java         |  21 --
 .../download/core/FileDownloader.java         |  68 -----
 .../download/impl/ConnectionImpl.java         |  26 --
 .../download/impl/ConnectionManagerImpl.java  |  15 --
 .../coderising/jvm/attr/AttributeInfo.java    |  19 --
 .../com/coderising/jvm/attr/CodeAttr.java     |  52 ----
 .../coderising/jvm/attr/LineNumberTable.java  |  46 ----
 .../jvm/attr/LocalVariableItem.java           |  49 ----
 .../jvm/attr/LocalVariableTable.java          |  25 --
 .../coderising/jvm/attr/StackMapTable.java    |  29 --
 .../com/coderising/jvm/clz/AccessFlag.java    |  26 --
 .../com/coderising/jvm/clz/ClassFile.java     | 100 -------
 .../com/coderising/jvm/clz/ClassIndex.java    |  22 --
 .../coderising/jvm/constant/ClassInfo.java    |  28 --
 .../coderising/jvm/constant/ConstantInfo.java |  29 --
 .../coderising/jvm/constant/ConstantPool.java |  28 --
 .../coderising/jvm/constant/FieldRefInfo.java |  54 ----
 .../jvm/constant/MethodRefInfo.java           |  56 ----
 .../jvm/constant/NameAndTypeInfo.java         |  48 ----
 .../jvm/constant/NullConstantInfo.java        |  11 -
 .../coderising/jvm/constant/StringInfo.java   |  28 --
 .../com/coderising/jvm/constant/UTF8Info.java |  37 ---
 .../java/com/coderising/jvm/field/Field.java  |  26 --
 .../jvm/loader/ByteCodeIterator.java          |  55 ----
 .../jvm/loader/ClassFileLoader.java           | 122 ---------
 .../jvm/loader/ClassFileParser.java           | 146 -----------
 .../com/coderising/jvm/method/Method.java     |  48 ----
 .../java/com/coderising/jvm/util/Util.java    |  22 --
 .../coderising/litestruts/LoginAction.java    |  42 ---
 .../com/coderising/litestruts/Struts.java     |  30 ---
 .../java/com/coderising/litestruts/View.java  |  26 --
 .../main/java/com/coding/basic/ArrayList.java |  33 ---
 .../main/java/com/coding/basic/ArrayUtil.java |  96 -------
 .../java/com/coding/basic/BinaryTreeNode.java |  37 ---
 .../main/java/com/coding/basic/Iterator.java  |   8 -
 .../java/com/coding/basic/LRUPageFrame.java   |  50 ----
 .../java/com/coding/basic/LinkedList.java     | 126 ---------
 .../src/main/java/com/coding/basic/List.java  |  13 -
 .../src/main/java/com/coding/basic/Queue.java |  19 --
 .../java/com/coding/basic/stack/Stack.java    |  26 --
 .../com/coding/basic/stack/StackUtil.java     |  54 ----
 .../coding/basic/stack/expr/InfixExpr.java    |  13 -
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 --
 .../src/main/resources/struts.xml             |  11 -
 .../download/core/FileDownloaderTest.java     |  56 ----
 .../jvm/loader/ClassFileloaderTest.java       | 248 ------------------
 .../com/coderising/jvm/loader/EmployeeV1.java |  30 ---
 .../com/coderising/litestruts/StrutsTest.java |  38 ---
 .../com/coding/basic/LRUPageFrameTest.java    |  27 --
 .../com/coding/basic/stack/StackUtilTest.java |  78 ------
 .../basic/stack/expr/InfixExprTest.java       |  45 ----
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-52-liuxin-answer/pom.xml       |  31 ---
 .../coderising/download/api/Connection.java   |  28 --
 .../download/api/ConnectionException.java     |   8 -
 .../download/api/ConnectionManager.java       |  11 -
 .../download/api/DownloadListener.java        |   5 -
 .../download/core/DownloadThread.java         |  50 ----
 .../download/core/FileDownloader.java         | 126 ---------
 .../download/impl/ConnectionImpl.java         |  84 ------
 .../download/impl/ConnectionManagerImpl.java  |  15 --
 .../coderising/litestruts/Configuration.java  | 113 --------
 .../litestruts/ConfigurationException.java    |  21 --
 .../coderising/litestruts/LoginAction.java    |  42 ---
 .../coderising/litestruts/ReflectionUtil.java | 120 ---------
 .../com/coderising/litestruts/Struts.java     |  56 ----
 .../java/com/coderising/litestruts/View.java  |  26 --
 .../java/com/coding/basic/BinaryTreeNode.java |  37 ---
 .../main/java/com/coding/basic/Iterator.java  |   8 -
 .../src/main/java/com/coding/basic/List.java  |  13 -
 .../src/main/java/com/coding/basic/Queue.java |  19 --
 .../com/coding/basic/array/ArrayList.java     |  36 ---
 .../com/coding/basic/array/ArrayUtil.java     |  96 -------
 .../coding/basic/linklist/LRUPageFrame.java   | 151 -----------
 .../com/coding/basic/linklist/LinkedList.java | 129 ---------
 .../java/com/coding/basic/stack/Stack.java    |  26 --
 .../com/coding/basic/stack/StackUtil.java     | 140 ----------
 .../coding/basic/stack/expr/InfixExpr.java    |  15 --
 .../basic/stack/expr/InfixExprTest.java       |  47 ----
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 --
 .../src/main/resources/struts.xml             |  11 -
 .../download/api/ConnectionTest.java          |  42 ---
 .../download/core/FileDownloaderTest.java     |  56 ----
 .../litestruts/ConfigurationTest.java         |  46 ----
 .../litestruts/ReflectionUtilTest.java        | 104 --------
 .../com/coderising/litestruts/StrutsTest.java |  37 ---
 .../basic/linklist/LRUPageFrameTest.java      |  32 ---
 .../coding/basic/linklist/LinkedListTest.java | 197 --------------
 .../com/coding/basic/stack/StackUtilTest.java |  78 ------
 .../src/test/resources/.gitkeep               |   0
 98 files changed, 4516 deletions(-)
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/resources/.gitkeep

diff --git a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml b/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
index 3edeb21d2e..78a5afbac0 100644
--- a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
+++ b/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
@@ -10,8 +10,6 @@
 	<modules>
 		<module>../jmr-02-parent</module>
 		<module>../jmr-11-challenge</module>
-		<module>../jmr-51-liuxin-question</module>
-		<module>../jmr-52-liuxin-answer</module>
 		<module>../jmr-61-collection</module>
 		<module>../jmr-62-litestruts</module>
 		<module>../jmr-63-download</module>
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml
deleted file mode 100644
index dc562ded7e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-51-liuxin-question</artifactId>
-	<description>eulerlcs master java road copy from liuxin question</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-lang3</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java
deleted file mode 100644
index 76dc0f3a40..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/Connection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.download.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * 
-	 * @param startPos
-	 *            开始位置， 从0开始
-	 * @param endPos
-	 *            结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos, int endPos) throws IOException;
-
-	/**
-	 * 得到数据内容的长度
-	 * 
-	 * @return
-	 */
-	public int getContentLength();
-
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java
deleted file mode 100644
index 1551a80b3d..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public class ConnectionException extends Exception {
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java
deleted file mode 100644
index 787984f170..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/ConnectionManager.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.coderising.download.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * 
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java
deleted file mode 100644
index bf9807b307..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java
deleted file mode 100644
index ba94bee146..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/DownloadThread.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.coderising.download.core;
-
-import com.coderising.download.api.Connection;
-
-public class DownloadThread extends Thread {
-
-	Connection conn;
-	int startPos;
-	int endPos;
-
-	public DownloadThread(Connection conn, int startPos, int endPos) {
-
-		this.conn = conn;
-		this.startPos = startPos;
-		this.endPos = endPos;
-	}
-
-	public void run() {
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java
deleted file mode 100644
index 23ee19ab02..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/core/FileDownloader.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.coderising.download.core;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-
-public class FileDownloader {
-
-	String url;
-
-	DownloadListener listener;
-
-	ConnectionManager cm;
-
-	public FileDownloader(String _url) {
-		this.url = _url;
-
-	}
-
-	public void execute() {
-		// 在这里实现你的代码， 注意： 需要用多线程实现下载
-		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
-		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos,
-		// endPos来指定）
-		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-		// 线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
-		// 具体的实现思路：
-		// 1. 需要调用ConnectionManager的open方法打开连接，
-		// 然后通过Connection.getContentLength方法获得文件的长度
-		// 2. 至少启动3个线程下载， 注意每个线程需要先调用ConnectionManager的open方法
-		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
-		// 3. 把byte数组写入到文件中
-		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
-
-		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
-		Connection conn = null;
-		try {
-
-			conn = cm.open(this.url);
-
-			int length = conn.getContentLength();
-
-			new DownloadThread(conn, 0, length - 1).start();
-
-		} catch (ConnectionException e) {
-			e.printStackTrace();
-		} finally {
-			if (conn != null) {
-				conn.close();
-			}
-		}
-
-	}
-
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	public void setConnectionManager(ConnectionManager ucm) {
-		this.cm = ucm;
-	}
-
-	public DownloadListener getListener() {
-		return this.listener;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java
deleted file mode 100644
index 1831118927..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.download.impl;
-
-import java.io.IOException;
-
-import com.coderising.download.api.Connection;
-
-public class ConnectionImpl implements Connection {
-
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {
-
-		return null;
-	}
-
-	@Override
-	public int getContentLength() {
-
-		return 0;
-	}
-
-	@Override
-	public void close() {
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
deleted file mode 100644
index 6585b835c4..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coderising.download.impl;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-
-public class ConnectionManagerImpl implements ConnectionManager {
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
deleted file mode 100644
index 3391da9616..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/AttributeInfo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.coderising.jvm.attr;
-
-public abstract class AttributeInfo {
-	public static final String CODE = "Code";
-	public static final String CONST_VALUE = "ConstantValue";
-	public static final String EXCEPTIONS = "Exceptions";
-	public static final String LINE_NUM_TABLE = "LineNumberTable";
-	public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
-	public static final String STACK_MAP_TABLE = "StackMapTable";
-	int attrNameIndex;
-	int attrLen;
-
-	public AttributeInfo(int attrNameIndex, int attrLen) {
-
-		this.attrNameIndex = attrNameIndex;
-		this.attrLen = attrLen;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java
deleted file mode 100644
index f7ed2f1297..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/CodeAttr.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.coderising.jvm.attr;
-
-import com.coderising.jvm.clz.ClassFile;
-import com.coderising.jvm.loader.ByteCodeIterator;
-
-public class CodeAttr extends AttributeInfo {
-	private int maxStack;
-	private int maxLocals;
-	private int codeLen;
-	private String code;
-
-	public String getCode() {
-		return code;
-	}
-
-	// private ByteCodeCommand[] cmds ;
-	// public ByteCodeCommand[] getCmds() {
-	// return cmds;
-	// }
-	private LineNumberTable lineNumTable;
-	private LocalVariableTable localVarTable;
-	private StackMapTable stackMapTable;
-
-	public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,
-			String code /* ByteCodeCommand[] cmds */) {
-		super(attrNameIndex, attrLen);
-		this.maxStack = maxStack;
-		this.maxLocals = maxLocals;
-		this.codeLen = codeLen;
-		this.code = code;
-		// this.cmds = cmds;
-	}
-
-	public void setLineNumberTable(LineNumberTable t) {
-		this.lineNumTable = t;
-	}
-
-	public void setLocalVariableTable(LocalVariableTable t) {
-		this.localVarTable = t;
-	}
-
-	public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) {
-
-		return null;
-	}
-
-	private void setStackMapTable(StackMapTable t) {
-		this.stackMapTable = t;
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java
deleted file mode 100644
index 71553b4fbb..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LineNumberTable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.coderising.jvm.attr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.coderising.jvm.loader.ByteCodeIterator;
-
-public class LineNumberTable extends AttributeInfo {
-	List<LineNumberItem> items = new ArrayList<LineNumberItem>();
-
-	private static class LineNumberItem {
-		int startPC;
-		int lineNum;
-
-		public int getStartPC() {
-			return startPC;
-		}
-
-		public void setStartPC(int startPC) {
-			this.startPC = startPC;
-		}
-
-		public int getLineNum() {
-			return lineNum;
-		}
-
-		public void setLineNum(int lineNum) {
-			this.lineNum = lineNum;
-		}
-	}
-
-	public void addLineNumberItem(LineNumberItem item) {
-		this.items.add(item);
-	}
-
-	public LineNumberTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-
-	}
-
-	public static LineNumberTable parse(ByteCodeIterator iter) {
-
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java
deleted file mode 100644
index 9561e904a9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.coderising.jvm.attr;
-
-public class LocalVariableItem {
-	private int startPC;
-	private int length;
-	private int nameIndex;
-	private int descIndex;
-	private int index;
-
-	public int getStartPC() {
-		return startPC;
-	}
-
-	public void setStartPC(int startPC) {
-		this.startPC = startPC;
-	}
-
-	public int getLength() {
-		return length;
-	}
-
-	public void setLength(int length) {
-		this.length = length;
-	}
-
-	public int getNameIndex() {
-		return nameIndex;
-	}
-
-	public void setNameIndex(int nameIndex) {
-		this.nameIndex = nameIndex;
-	}
-
-	public int getDescIndex() {
-		return descIndex;
-	}
-
-	public void setDescIndex(int descIndex) {
-		this.descIndex = descIndex;
-	}
-
-	public int getIndex() {
-		return index;
-	}
-
-	public void setIndex(int index) {
-		this.index = index;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java
deleted file mode 100644
index b8a3ccfa8f..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.coderising.jvm.attr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.coderising.jvm.loader.ByteCodeIterator;
-
-public class LocalVariableTable extends AttributeInfo {
-
-	List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();
-
-	public LocalVariableTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-	}
-
-	public static LocalVariableTable parse(ByteCodeIterator iter) {
-
-		return null;
-	}
-
-	private void addLocalVariableItem(LocalVariableItem item) {
-		this.items.add(item);
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java
deleted file mode 100644
index 14427e19ee..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/attr/StackMapTable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.coderising.jvm.attr;
-
-import com.coderising.jvm.loader.ByteCodeIterator;
-
-public class StackMapTable extends AttributeInfo {
-
-	private String originalCode;
-
-	public StackMapTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-	}
-
-	public static StackMapTable parse(ByteCodeIterator iter) {
-		int index = iter.nextU2ToInt();
-		int len = iter.nextU4ToInt();
-		StackMapTable t = new StackMapTable(index, len);
-
-		// 后面的StackMapTable太过复杂， 不再处理， 只把原始的代码读进来保存
-		String code = iter.nextUxToHexString(len);
-		t.setOriginalCode(code);
-
-		return t;
-	}
-
-	private void setOriginalCode(String code) {
-		this.originalCode = code;
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java
deleted file mode 100644
index 2cc6092de0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/AccessFlag.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.jvm.clz;
-
-public class AccessFlag {
-	private int flagValue;
-
-	public AccessFlag(int value) {
-		this.flagValue = value;
-	}
-
-	public int getFlagValue() {
-		return flagValue;
-	}
-
-	public void setFlagValue(int flag) {
-		this.flagValue = flag;
-	}
-
-	public boolean isPublicClass() {
-		return (this.flagValue & 0x0001) != 0;
-	}
-
-	public boolean isFinalClass() {
-		return (this.flagValue & 0x0010) != 0;
-	}
-
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java
deleted file mode 100644
index ad5a7d71db..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassFile.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.coderising.jvm.clz;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.coderising.jvm.constant.ClassInfo;
-import com.coderising.jvm.constant.ConstantPool;
-import com.coderising.jvm.field.Field;
-import com.coderising.jvm.method.Method;
-
-public class ClassFile {
-
-	private int minorVersion;
-	private int majorVersion;
-
-	private AccessFlag accessFlag;
-	private ClassIndex clzIndex;
-	private ConstantPool pool;
-	private List<Field> fields = new ArrayList<Field>();
-	private List<Method> methods = new ArrayList<Method>();
-
-	public ClassIndex getClzIndex() {
-		return clzIndex;
-	}
-
-	public AccessFlag getAccessFlag() {
-		return accessFlag;
-	}
-
-	public void setAccessFlag(AccessFlag accessFlag) {
-		this.accessFlag = accessFlag;
-	}
-
-	public ConstantPool getConstantPool() {
-		return pool;
-	}
-
-	public int getMinorVersion() {
-		return minorVersion;
-	}
-
-	public void setMinorVersion(int minorVersion) {
-		this.minorVersion = minorVersion;
-	}
-
-	public int getMajorVersion() {
-		return majorVersion;
-	}
-
-	public void setMajorVersion(int majorVersion) {
-		this.majorVersion = majorVersion;
-	}
-
-	public void setConstPool(ConstantPool pool) {
-		this.pool = pool;
-
-	}
-
-	public void setClassIndex(ClassIndex clzIndex) {
-		this.clzIndex = clzIndex;
-	}
-
-	public void addField(Field f) {
-		this.fields.add(f);
-	}
-
-	public List<Field> getFields() {
-		return this.fields;
-	}
-
-	public void addMethod(Method m) {
-		this.methods.add(m);
-	}
-
-	public List<Method> getMethods() {
-		return methods;
-	}
-
-	public void print() {
-
-		if (this.accessFlag.isPublicClass()) {
-			System.out.println("Access flag : public  ");
-		}
-		System.out.println("Class Name:" + getClassName());
-
-		System.out.println("Super Class Name:" + getSuperClassName());
-
-	}
-
-	private String getClassName() {
-		int thisClassIndex = this.clzIndex.getThisClassIndex();
-		ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex);
-		return thisClass.getClassName();
-	}
-
-	private String getSuperClassName() {
-		ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
-		return superClass.getClassName();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java
deleted file mode 100644
index 0212bc9fb3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/clz/ClassIndex.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.coderising.jvm.clz;
-
-public class ClassIndex {
-	private int thisClassIndex;
-	private int superClassIndex;
-
-	public int getThisClassIndex() {
-		return thisClassIndex;
-	}
-
-	public void setThisClassIndex(int thisClassIndex) {
-		this.thisClassIndex = thisClassIndex;
-	}
-
-	public int getSuperClassIndex() {
-		return superClassIndex;
-	}
-
-	public void setSuperClassIndex(int superClassIndex) {
-		this.superClassIndex = superClassIndex;
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java
deleted file mode 100644
index 4b593e7347..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ClassInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class ClassInfo extends ConstantInfo {
-	private int type = ConstantInfo.CLASS_INFO;
-	private int utf8Index;
-
-	public ClassInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getUtf8Index() {
-		return utf8Index;
-	}
-
-	public void setUtf8Index(int utf8Index) {
-		this.utf8Index = utf8Index;
-	}
-
-	public int getType() {
-		return type;
-	}
-
-	public String getClassName() {
-		int index = getUtf8Index();
-		UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index);
-		return utf8Info.getValue();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
deleted file mode 100644
index 5ef8fbfef8..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.coderising.jvm.constant;
-
-public abstract class ConstantInfo {
-	public static final int UTF8_INFO = 1;
-	public static final int FLOAT_INFO = 4;
-	public static final int CLASS_INFO = 7;
-	public static final int STRING_INFO = 8;
-	public static final int FIELD_INFO = 9;
-	public static final int METHOD_INFO = 10;
-	public static final int NAME_AND_TYPE_INFO = 12;
-	protected ConstantPool constantPool;
-
-	public ConstantInfo() {
-	}
-
-	public ConstantInfo(ConstantPool pool) {
-		this.constantPool = pool;
-	}
-
-	public abstract int getType();
-
-	public ConstantPool getConstantPool() {
-		return constantPool;
-	}
-
-	public ConstantInfo getConstantInfo(int index) {
-		return this.constantPool.getConstantInfo(index);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java
deleted file mode 100644
index 49ece7d089..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/ConstantPool.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.jvm.constant;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ConstantPool {
-
-	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
-
-	public ConstantPool() {
-	}
-
-	public void addConstantInfo(ConstantInfo info) {
-		this.constantInfos.add(info);
-	}
-
-	public ConstantInfo getConstantInfo(int index) {
-		return this.constantInfos.get(index);
-	}
-
-	public String getUTF8String(int index) {
-		return ((UTF8Info) this.constantInfos.get(index)).getValue();
-	}
-
-	public Object getSize() {
-		return this.constantInfos.size() - 1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
deleted file mode 100644
index 469a30b95e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class FieldRefInfo extends ConstantInfo {
-	private int type = ConstantInfo.FIELD_INFO;
-	private int classInfoIndex;
-	private int nameAndTypeIndex;
-
-	public FieldRefInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public int getClassInfoIndex() {
-		return classInfoIndex;
-	}
-
-	public void setClassInfoIndex(int classInfoIndex) {
-		this.classInfoIndex = classInfoIndex;
-	}
-
-	public int getNameAndTypeIndex() {
-		return nameAndTypeIndex;
-	}
-
-	public void setNameAndTypeIndex(int nameAndTypeIndex) {
-		this.nameAndTypeIndex = nameAndTypeIndex;
-	}
-
-	@Override
-	public String toString() {
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
-		return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]";
-	}
-
-	public String getClassName() {
-		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
-		UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index());
-		return utf8Info.getValue();
-	}
-
-	public String getFieldName() {
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getName();
-	}
-
-	public String getFieldType() {
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getTypeInfo();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
deleted file mode 100644
index 837e501f9f..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class MethodRefInfo extends ConstantInfo {
-	private int type = ConstantInfo.METHOD_INFO;
-
-	private int classInfoIndex;
-	private int nameAndTypeIndex;
-
-	public MethodRefInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public int getClassInfoIndex() {
-		return classInfoIndex;
-	}
-
-	public void setClassInfoIndex(int classInfoIndex) {
-		this.classInfoIndex = classInfoIndex;
-	}
-
-	public int getNameAndTypeIndex() {
-		return nameAndTypeIndex;
-	}
-
-	public void setNameAndTypeIndex(int nameAndTypeIndex) {
-		this.nameAndTypeIndex = nameAndTypeIndex;
-	}
-
-	@Override
-	public String toString() {
-		return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType();
-	}
-
-	public String getClassName() {
-		ConstantPool pool = this.getConstantPool();
-		ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex());
-		return clzInfo.getClassName();
-	}
-
-	public String getMethodName() {
-		ConstantPool pool = this.getConstantPool();
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getName();
-	}
-
-	public String getParamAndReturnType() {
-		ConstantPool pool = this.getConstantPool();
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getTypeInfo();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
deleted file mode 100644
index a792e2dc13..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class NameAndTypeInfo extends ConstantInfo {
-	public int type = ConstantInfo.NAME_AND_TYPE_INFO;
-
-	private int index1;
-	private int index2;
-
-	public NameAndTypeInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getIndex1() {
-		return index1;
-	}
-
-	public void setIndex1(int index1) {
-		this.index1 = index1;
-	}
-
-	public int getIndex2() {
-		return index2;
-	}
-
-	public void setIndex2(int index2) {
-		this.index2 = index2;
-	}
-
-	public int getType() {
-		return type;
-	}
-
-	public String getName() {
-		ConstantPool pool = this.getConstantPool();
-		UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1);
-		return utf8Info1.getValue();
-	}
-
-	public String getTypeInfo() {
-		ConstantPool pool = this.getConstantPool();
-		UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2);
-		return utf8Info2.getValue();
-	}
-
-	public String toString() {
-		return "(" + getName() + "," + getTypeInfo() + ")";
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
deleted file mode 100644
index 6e4e3750c7..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class NullConstantInfo extends ConstantInfo {
-	public NullConstantInfo() {
-	}
-
-	@Override
-	public int getType() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java
deleted file mode 100644
index 3282aad968..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/StringInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class StringInfo extends ConstantInfo {
-	private int type = ConstantInfo.STRING_INFO;
-	private int index;
-
-	public StringInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public int getIndex() {
-		return index;
-	}
-
-	public void setIndex(int index) {
-		this.index = index;
-	}
-
-	@Override
-	public String toString() {
-		return this.getConstantPool().getUTF8String(index);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java
deleted file mode 100644
index dc4d0b0b64..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/constant/UTF8Info.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.coderising.jvm.constant;
-
-public class UTF8Info extends ConstantInfo {
-	private int type = ConstantInfo.UTF8_INFO;
-	private int length;
-	private String value;
-
-	public UTF8Info(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getLength() {
-		return length;
-	}
-
-	public void setLength(int length) {
-		this.length = length;
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	@Override
-	public String toString() {
-		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]";
-	}
-
-	public String getValue() {
-		return value;
-	}
-
-	public void setValue(String value) {
-		this.value = value;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java
deleted file mode 100644
index 64742c6596..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/field/Field.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.jvm.field;
-
-import com.coderising.jvm.constant.ConstantPool;
-import com.coderising.jvm.loader.ByteCodeIterator;
-
-public class Field {
-	private int accessFlag;
-	private int nameIndex;
-	private int descriptorIndex;
-
-	private ConstantPool pool;
-
-	public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) {
-
-		this.accessFlag = accessFlag;
-		this.nameIndex = nameIndex;
-		this.descriptorIndex = descriptorIndex;
-		this.pool = pool;
-	}
-
-	public static Field parse(ConstantPool pool, ByteCodeIterator iter) {
-
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
deleted file mode 100644
index 3cc8ab6697..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.coderising.jvm.loader;
-
-import java.util.Arrays;
-
-import com.coderising.jvm.util.Util;
-
-public class ByteCodeIterator {
-	byte[] codes;
-	int pos = 0;
-
-	ByteCodeIterator(byte[] codes) {
-		this.codes = codes;
-	}
-
-	public byte[] getBytes(int len) {
-		if (pos + len >= codes.length) {
-			throw new ArrayIndexOutOfBoundsException();
-		}
-
-		byte[] data = Arrays.copyOfRange(codes, pos, pos + len);
-		pos += len;
-		return data;
-	}
-
-	public int nextU1toInt() {
-
-		return Util.byteToInt(new byte[] { codes[pos++] });
-	}
-
-	public int nextU2ToInt() {
-		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] });
-	}
-
-	public int nextU4ToInt() {
-		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] });
-	}
-
-	public String nextU4ToHexString() {
-		return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }));
-	}
-
-	public String nextUxToHexString(int len) {
-		byte[] tmp = new byte[len];
-
-		for (int i = 0; i < len; i++) {
-			tmp[i] = codes[pos++];
-		}
-		return Util.byteToHexString(tmp).toLowerCase();
-
-	}
-
-	public void back(int n) {
-		this.pos -= n;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
deleted file mode 100644
index 1af1946bb3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package com.coderising.jvm.loader;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import com.coderising.jvm.clz.ClassFile;
-
-public class ClassFileLoader {
-
-	private List<String> clzPaths = new ArrayList<String>();
-
-	public byte[] readBinaryCode(String className) {
-
-		className = className.replace('.', File.separatorChar) + ".class";
-
-		for (String path : this.clzPaths) {
-
-			String clzFileName = path + File.separatorChar + className;
-			byte[] codes = loadClassFile(clzFileName);
-			if (codes != null) {
-				return codes;
-			}
-		}
-
-		return null;
-
-	}
-
-	private byte[] loadClassFile(String clzFileName) {
-
-		File f = new File(clzFileName);
-
-		try {
-
-			return IOUtils.toByteArray(new FileInputStream(f));
-
-		} catch (IOException e) {
-			e.printStackTrace();
-			return null;
-		}
-	}
-
-	public void addClassPath(String path) {
-		if (this.clzPaths.contains(path)) {
-			return;
-		}
-
-		this.clzPaths.add(path);
-
-	}
-
-	public String getClassPath() {
-		return StringUtils.join(this.clzPaths, ";");
-	}
-
-	public ClassFile loadClass(String className) {
-		byte[] codes = this.readBinaryCode(className);
-		ClassFileParser parser = new ClassFileParser();
-		return parser.parse(codes);
-
-	}
-
-	// ------------------------------backup------------------------
-	public String getClassPath_V1() {
-
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < this.clzPaths.size(); i++) {
-			buffer.append(this.clzPaths.get(i));
-			if (i < this.clzPaths.size() - 1) {
-				buffer.append(";");
-			}
-		}
-		return buffer.toString();
-	}
-
-	private byte[] loadClassFile_V1(String clzFileName) {
-
-		BufferedInputStream bis = null;
-
-		try {
-
-			File f = new File(clzFileName);
-
-			bis = new BufferedInputStream(new FileInputStream(f));
-
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-
-			byte[] buffer = new byte[1024];
-			int length = -1;
-
-			while ((length = bis.read(buffer)) != -1) {
-				bos.write(buffer, 0, length);
-			}
-
-			byte[] codes = bos.toByteArray();
-
-			return codes;
-
-		} catch (IOException e) {
-			e.printStackTrace();
-
-		} finally {
-			if (bis != null) {
-				try {
-					bis.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		return null;
-
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
deleted file mode 100644
index b32ca1926b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/loader/ClassFileParser.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package com.coderising.jvm.loader;
-
-import java.io.UnsupportedEncodingException;
-
-import com.coderising.jvm.clz.AccessFlag;
-import com.coderising.jvm.clz.ClassFile;
-import com.coderising.jvm.clz.ClassIndex;
-import com.coderising.jvm.constant.ClassInfo;
-import com.coderising.jvm.constant.ConstantPool;
-import com.coderising.jvm.constant.FieldRefInfo;
-import com.coderising.jvm.constant.MethodRefInfo;
-import com.coderising.jvm.constant.NameAndTypeInfo;
-import com.coderising.jvm.constant.NullConstantInfo;
-import com.coderising.jvm.constant.StringInfo;
-import com.coderising.jvm.constant.UTF8Info;
-
-public class ClassFileParser {
-
-	public ClassFile parse(byte[] codes) {
-
-		ClassFile clzFile = new ClassFile();
-
-		ByteCodeIterator iter = new ByteCodeIterator(codes);
-
-		String magicNumber = iter.nextU4ToHexString();
-
-		if (!"cafebabe".equals(magicNumber)) {
-			return null;
-		}
-
-		clzFile.setMinorVersion(iter.nextU2ToInt());
-		clzFile.setMajorVersion(iter.nextU2ToInt());
-
-		ConstantPool pool = parseConstantPool(iter);
-		clzFile.setConstPool(pool);
-
-		AccessFlag flag = parseAccessFlag(iter);
-		clzFile.setAccessFlag(flag);
-
-		ClassIndex clzIndex = parseClassInfex(iter);
-		clzFile.setClassIndex(clzIndex);
-
-		parseInterfaces(iter);
-
-		return clzFile;
-	}
-
-	private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
-
-		AccessFlag flag = new AccessFlag(iter.nextU2ToInt());
-		// System.out.println("Is public class: " + flag.isPublicClass());
-		// System.out.println("Is final class : " + flag.isFinalClass());
-
-		return flag;
-	}
-
-	private ClassIndex parseClassInfex(ByteCodeIterator iter) {
-
-		int thisClassIndex = iter.nextU2ToInt();
-		int superClassIndex = iter.nextU2ToInt();
-
-		ClassIndex clzIndex = new ClassIndex();
-
-		clzIndex.setThisClassIndex(thisClassIndex);
-		clzIndex.setSuperClassIndex(superClassIndex);
-
-		return clzIndex;
-
-	}
-
-	private ConstantPool parseConstantPool(ByteCodeIterator iter) {
-
-		int constPoolCount = iter.nextU2ToInt();
-
-		System.out.println("Constant Pool Count :" + constPoolCount);
-
-		ConstantPool pool = new ConstantPool();
-
-		pool.addConstantInfo(new NullConstantInfo());
-
-		for (int i = 1; i <= constPoolCount - 1; i++) {
-
-			int tag = iter.nextU1toInt();
-
-			if (tag == 7) {
-				// Class Info
-				int utf8Index = iter.nextU2ToInt();
-				ClassInfo clzInfo = new ClassInfo(pool);
-				clzInfo.setUtf8Index(utf8Index);
-
-				pool.addConstantInfo(clzInfo);
-			} else if (tag == 1) {
-				// UTF-8 String
-				int len = iter.nextU2ToInt();
-				byte[] data = iter.getBytes(len);
-				String value = null;
-				try {
-					value = new String(data, "UTF-8");
-				} catch (UnsupportedEncodingException e) {
-					e.printStackTrace();
-				}
-
-				UTF8Info utf8Str = new UTF8Info(pool);
-				utf8Str.setLength(len);
-				utf8Str.setValue(value);
-				pool.addConstantInfo(utf8Str);
-			} else if (tag == 8) {
-				StringInfo info = new StringInfo(pool);
-				info.setIndex(iter.nextU2ToInt());
-				pool.addConstantInfo(info);
-			} else if (tag == 9) {
-				FieldRefInfo field = new FieldRefInfo(pool);
-				field.setClassInfoIndex(iter.nextU2ToInt());
-				field.setNameAndTypeIndex(iter.nextU2ToInt());
-				pool.addConstantInfo(field);
-			} else if (tag == 10) {
-				// MethodRef
-				MethodRefInfo method = new MethodRefInfo(pool);
-				method.setClassInfoIndex(iter.nextU2ToInt());
-				method.setNameAndTypeIndex(iter.nextU2ToInt());
-				pool.addConstantInfo(method);
-			} else if (tag == 12) {
-				// Name and Type Info
-				NameAndTypeInfo nameType = new NameAndTypeInfo(pool);
-				nameType.setIndex1(iter.nextU2ToInt());
-				nameType.setIndex2(iter.nextU2ToInt());
-				pool.addConstantInfo(nameType);
-			} else {
-				throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet.");
-			}
-		}
-
-		System.out.println("Finished reading Constant pool ");
-
-		return pool;
-	}
-
-	private void parseInterfaces(ByteCodeIterator iter) {
-		int interfaceCount = iter.nextU2ToInt();
-
-		System.out.println("interfaceCount:" + interfaceCount);
-
-		// TODO : 如果实现了interface, 这里需要解析
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java
deleted file mode 100644
index 690e71a8de..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/method/Method.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.coderising.jvm.method;
-
-import com.coderising.jvm.attr.CodeAttr;
-import com.coderising.jvm.clz.ClassFile;
-import com.coderising.jvm.loader.ByteCodeIterator;
-
-public class Method {
-
-	private int accessFlag;
-	private int nameIndex;
-	private int descriptorIndex;
-
-	private CodeAttr codeAttr;
-
-	private ClassFile clzFile;
-
-	public ClassFile getClzFile() {
-		return clzFile;
-	}
-
-	public int getNameIndex() {
-		return nameIndex;
-	}
-
-	public int getDescriptorIndex() {
-		return descriptorIndex;
-	}
-
-	public CodeAttr getCodeAttr() {
-		return codeAttr;
-	}
-
-	public void setCodeAttr(CodeAttr code) {
-		this.codeAttr = code;
-	}
-
-	public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) {
-		this.clzFile = clzFile;
-		this.accessFlag = accessFlag;
-		this.nameIndex = nameIndex;
-		this.descriptorIndex = descriptorIndex;
-	}
-
-	public static Method parse(ClassFile clzFile, ByteCodeIterator iter) {
-		return null;
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java
deleted file mode 100644
index 1f9e087bb9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/jvm/util/Util.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.coderising.jvm.util;
-
-public class Util {
-	public static int byteToInt(byte[] codes) {
-		String s1 = byteToHexString(codes);
-		return Integer.valueOf(s1, 16).intValue();
-	}
-
-	public static String byteToHexString(byte[] codes) {
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < codes.length; i++) {
-			byte b = codes[i];
-			int value = b & 0xFF;
-			String strHex = Integer.toHexString(value);
-			if (strHex.length() < 2) {
-				strHex = "0" + strHex;
-			}
-			buffer.append(strHex);
-		}
-		return buffer.toString();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java
deleted file mode 100644
index 5f41f42c62..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/LoginAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coderising.litestruts;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * 
- * @author liuxin
- *
- */
-public class LoginAction {
-	private String name;
-	private String password;
-	private String message;
-
-	public String getName() {
-		return name;
-	}
-
-	public String getPassword() {
-		return password;
-	}
-
-	public String execute() {
-		if ("test".equals(name) && "1234".equals(password)) {
-			this.message = "login successful";
-			return "success";
-		}
-		this.message = "login failed,please check your user/pwd";
-		return "fail";
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
-	public String getMessage() {
-		return this.message;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java
deleted file mode 100644
index 5ad5ccb352..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/Struts.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-public class Struts {
-
-	public static View runAction(String actionName, Map<String, String> parameters) {
-
-		/*
-		 * 
-		 * 0. 读取配置文件struts.xml
-		 * 
-		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
-		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
-		 * "password"="1234") , 那就应该调用 setName和setPassword方法
-		 * 
-		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
-		 * 
-		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
-		 * {"message": "登录成功"} , 放到View对象的parameters
-		 * 
-		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
-		 * 放到View对象的jsp字段中。
-		 * 
-		 */
-
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java
deleted file mode 100644
index f1e7fcfa19..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coderising/litestruts/View.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-public class View {
-	private String jsp;
-	private Map parameters;
-
-	public String getJsp() {
-		return jsp;
-	}
-
-	public View setJsp(String jsp) {
-		this.jsp = jsp;
-		return this;
-	}
-
-	public Map getParameters() {
-		return parameters;
-	}
-
-	public View setParameters(Map parameters) {
-		this.parameters = parameters;
-		return this;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java
deleted file mode 100644
index 835e0311d1..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayList.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.coding.basic;
-
-public class ArrayList implements List {
-
-	private int size = 0;
-
-	private Object[] elementData = new Object[100];
-
-	public void add(Object o) {
-
-	}
-
-	public void add(int index, Object o) {
-
-	}
-
-	public Object get(int index) {
-		return null;
-	}
-
-	public Object remove(int index) {
-		return null;
-	}
-
-	public int size() {
-		return -1;
-	}
-
-	public Iterator iterator() {
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java
deleted file mode 100644
index ed475b9433..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/ArrayUtil.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.coding.basic;
-
-public class ArrayUtil {
-
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
-	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * 
-	 * @param origin
-	 * @return
-	 */
-	public void reverseArray(int[] origin) {
-
-	}
-
-	/**
-	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
-	 * 
-	 * @param oldArray
-	 * @return
-	 */
-
-	public int[] removeZero(int[] oldArray) {
-		return null;
-	}
-
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
-	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
-	 * 
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-
-	public int[] merge(int[] array1, int[] array2) {
-		return null;
-	}
-
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * 
-	 * @param oldArray
-	 * @param size
-	 * @return
-	 */
-	public int[] grow(int[] oldArray, int size) {
-		return null;
-	}
-
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
-	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public int[] fibonacci(int max) {
-		return null;
-	}
-
-	/**
-	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public int[] getPrimes(int max) {
-		return null;
-	}
-
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public int[] getPerfectNumbers(int max) {
-		return null;
-	}
-
-	/**
-	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
-	 * 
-	 * @param array
-	 * @param s
-	 * @return
-	 */
-	public String join(int[] array, String seperator) {
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java
deleted file mode 100644
index 2f944d3b91..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.coding.basic;
-
-public class BinaryTreeNode {
-
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-
-	public Object getData() {
-		return data;
-	}
-
-	public void setData(Object data) {
-		this.data = data;
-	}
-
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-
-	public BinaryTreeNode insert(Object o) {
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java
deleted file mode 100644
index f30dfc8edf..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Iterator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.coding.basic;
-
-public interface Iterator {
-	public boolean hasNext();
-
-	public Object next();
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java
deleted file mode 100644
index 28a3314b0d..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LRUPageFrame.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.coding.basic;
-
-/**
- * 用双向链表实现LRU算法
- * 
- * @author liuxin
- */
-public class LRUPageFrame {
-	private static class Node {
-		Node prev;
-		Node next;
-		int pageNum;
-
-		Node() {
-		}
-	}
-
-	private int capacity;
-	private Node first;// 链表头
-	private Node last;// 链表尾
-
-	public LRUPageFrame(int capacity) {
-		this.capacity = capacity;
-	}
-
-	/**
-	 * 获取缓存中对象
-	 * 
-	 * @param key
-	 * @return
-	 */
-	public void access(int pageNum) {
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder buffer = new StringBuilder();
-		Node node = first;
-		while (node != null) {
-			buffer.append(node.pageNum);
-
-			node = node.next;
-			if (node != null) {
-				buffer.append(",");
-			}
-		}
-
-		return buffer.toString();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java
deleted file mode 100644
index 4fe91d2c95..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/LinkedList.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.coding.basic;
-
-public class LinkedList implements List {
-
-	private Node head;
-
-	public void add(Object o) {
-
-	}
-
-	public void add(int index, Object o) {
-
-	}
-
-	public Object get(int index) {
-		return null;
-	}
-
-	public Object remove(int index) {
-		return null;
-	}
-
-	public int size() {
-		return -1;
-	}
-
-	public void addFirst(Object o) {
-
-	}
-
-	public void addLast(Object o) {
-
-	}
-
-	public Object removeFirst() {
-		return null;
-	}
-
-	public Object removeLast() {
-		return null;
-	}
-
-	public Iterator iterator() {
-		return null;
-	}
-
-	private static class Node {
-		Object data;
-		Node next;
-
-	}
-
-	/**
-	 * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3
-	 */
-	public void reverse() {
-
-	}
-
-	/**
-	 * 删除一个单链表的前半部分 例如：list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10
-	 * ,删除以后的值为7,8,10
-	 * 
-	 */
-	public void removeFirstHalf() {
-
-	}
-
-	/**
-	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
-	 * 
-	 * @param i
-	 * @param length
-	 */
-	public void remove(int i, int length) {
-
-	}
-
-	/**
-	 * 假定当前链表和listB均包含已升序排列的整数 从当前链表中取出那些listB所指定的元素 例如当前链表 =
-	 * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
-	 * 返回的结果应该是[101,301,401,601]
-	 * 
-	 * @param list
-	 */
-	public int[] getElements(LinkedList list) {
-		return null;
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 从当前链表中中删除在listB中出现的元素
-	 * 
-	 * @param list
-	 */
-
-	public void subtract(LinkedList list) {
-
-	}
-
-	/**
-	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
-	 */
-	public void removeDuplicateValues() {
-
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
-	 * 
-	 * @param min
-	 * @param max
-	 */
-	public void removeRange(int min, int max) {
-
-	}
-
-	/**
-	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
-	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
-	 * 
-	 * @param list
-	 */
-	public LinkedList intersection(LinkedList list) {
-		return null;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java
deleted file mode 100644
index 03fa879b2e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/List.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coding.basic;
-
-public interface List {
-	public void add(Object o);
-
-	public void add(int index, Object o);
-
-	public Object get(int index);
-
-	public Object remove(int index);
-
-	public int size();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java
deleted file mode 100644
index b2908512c5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/Queue.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.coding.basic;
-
-public class Queue {
-
-	public void enQueue(Object o) {
-	}
-
-	public Object deQueue() {
-		return null;
-	}
-
-	public boolean isEmpty() {
-		return false;
-	}
-
-	public int size() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java
deleted file mode 100644
index b09c9b3d91..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/Stack.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coding.basic.stack;
-
-import com.coding.basic.ArrayList;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-
-	public void push(Object o) {
-	}
-
-	public Object pop() {
-		return null;
-	}
-
-	public Object peek() {
-		return null;
-	}
-
-	public boolean isEmpty() {
-		return false;
-	}
-
-	public int size() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java
deleted file mode 100644
index de35c05449..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/StackUtil.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-
-public class StackUtil {
-	/**
-	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 */
-	public static void reverse(Stack s) {
-	}
-
-	public static void addToBottom(Stack<Integer> s, Integer value) {
-		if (s.isEmpty()) {
-			s.push(value);
-		} else {
-			Integer top = s.pop();
-			addToBottom(s, value);
-			s.push(top);
-		}
-	}
-
-	/**
-	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * 
-	 * @param o
-	 */
-	public static void remove(Stack s, Object o) {
-
-	}
-
-	/**
-	 * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty，
-	 * 可以使用另外一个栈来辅助
-	 * 
-	 * @param len
-	 * @return
-	 */
-	public static Object[] getTop(Stack s, int len) {
-		return null;
-	}
-
-	/**
-	 * 字符串s 可能包含这些字符： ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s =
-	 * "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true 如果 s = "([b{x]y})",
-	 * 则该字符串中的括号不是成对出现的， 该方法返回false;
-	 * 
-	 * @param s
-	 * @return
-	 */
-	public static boolean isValidPairs(String s) {
-		return false;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
deleted file mode 100644
index 4f2cf4b03a..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coding.basic.stack.expr;
-
-public class InfixExpr {
-	String expr = null;
-
-	public InfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		return 0.0f;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml
deleted file mode 100644
index ff7623e6e1..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/main/resources/struts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<struts>
-	<action name="login" class="com.coderising.litestruts.LoginAction">
-		<result name="success">/jsp/homepage.jsp</result>
-		<result name="fail">/jsp/showLogin.jsp</result>
-	</action>
-	<action name="logout" class="com.coderising.litestruts.LogoutAction">
-		<result name="success">/jsp/welcome.jsp</result>
-		<result name="error">/jsp/error.jsp</result>
-	</action>
-</struts>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java
deleted file mode 100644
index 8e171cff93..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/download/core/FileDownloaderTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.coderising.download.core;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-import com.coderising.download.impl.ConnectionManagerImpl;
-
-public class FileDownloaderTest {
-	boolean downloadFinished = false;
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testDownload() {
-
-		String url = "http://localhost:8080/test.jpg";
-
-		FileDownloader downloader = new FileDownloader(url);
-
-		ConnectionManager cm = new ConnectionManagerImpl();
-		downloader.setConnectionManager(cm);
-
-		downloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-
-		});
-
-		downloader.execute();
-
-		// 等待多线程下载程序执行完毕
-		while (!downloadFinished) {
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				// 休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-		System.out.println("下载完成！");
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java
deleted file mode 100644
index 6b78de3ddc..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/ClassFileloaderTest.java
+++ /dev/null
@@ -1,248 +0,0 @@
-package com.coderising.jvm.loader;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.jvm.clz.ClassFile;
-import com.coderising.jvm.clz.ClassIndex;
-import com.coderising.jvm.constant.ClassInfo;
-import com.coderising.jvm.constant.ConstantPool;
-import com.coderising.jvm.constant.MethodRefInfo;
-import com.coderising.jvm.constant.NameAndTypeInfo;
-import com.coderising.jvm.constant.UTF8Info;
-import com.coderising.jvm.field.Field;
-import com.coderising.jvm.method.Method;
-
-public class ClassFileloaderTest {
-	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
-
-	static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin";
-	static String path2 = "C:\temp";
-
-	static ClassFile clzFile = null;
-	static {
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		String className = "com.coderising.jvm.test.EmployeeV1";
-
-		clzFile = loader.loadClass(className);
-		clzFile.print();
-	}
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testClassPath() {
-
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		loader.addClassPath(path2);
-
-		String clzPath = loader.getClassPath();
-
-		Assert.assertEquals(path1 + ";" + path2, clzPath);
-
-	}
-
-	@Test
-	public void testClassFileLength() {
-
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-
-		String className = "com.coderising.jvm.test.EmployeeV1";
-
-		byte[] byteCodes = loader.readBinaryCode(className);
-
-		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
-		Assert.assertEquals(1056, byteCodes.length);
-
-	}
-
-	@Test
-	public void testMagicNumber() {
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		String className = "com.coderising.jvm.test.EmployeeV1";
-		byte[] byteCodes = loader.readBinaryCode(className);
-		byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] };
-
-		String acctualValue = this.byteToHexString(codes);
-
-		Assert.assertEquals("cafebabe", acctualValue);
-	}
-
-	private String byteToHexString(byte[] codes) {
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < codes.length; i++) {
-			byte b = codes[i];
-			int value = b & 0xFF;
-			String strHex = Integer.toHexString(value);
-			if (strHex.length() < 2) {
-				strHex = "0" + strHex;
-			}
-			buffer.append(strHex);
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * ----------------------------------------------------------------------
-	 */
-
-	@Test
-	public void testVersion() {
-
-		Assert.assertEquals(0, clzFile.getMinorVersion());
-		Assert.assertEquals(52, clzFile.getMajorVersion());
-
-	}
-
-	@Test
-	public void testConstantPool() {
-
-		ConstantPool pool = clzFile.getConstantPool();
-
-		Assert.assertEquals(53, pool.getSize());
-
-		{
-			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
-			Assert.assertEquals(2, clzInfo.getUtf8Index());
-
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
-			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
-		}
-		{
-			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
-			Assert.assertEquals(4, clzInfo.getUtf8Index());
-
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
-			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
-		}
-		{
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
-			Assert.assertEquals("name", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(6);
-			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(7);
-			Assert.assertEquals("age", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(8);
-			Assert.assertEquals("I", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(9);
-			Assert.assertEquals("<init>", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(10);
-			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(11);
-			Assert.assertEquals("Code", utf8Info.getValue());
-		}
-
-		{
-			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(12);
-			Assert.assertEquals(3, methodRef.getClassInfoIndex());
-			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
-		}
-
-		{
-			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
-			Assert.assertEquals(9, nameAndType.getIndex1());
-			Assert.assertEquals(14, nameAndType.getIndex2());
-		}
-		// 抽查几个吧
-		{
-			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(45);
-			Assert.assertEquals(1, methodRef.getClassInfoIndex());
-			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
-		}
-
-		{
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
-			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
-		}
-	}
-
-	@Test
-	public void testClassIndex() {
-
-		ClassIndex clzIndex = clzFile.getClzIndex();
-		ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
-		ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
-
-		Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
-		Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
-	}
-
-	/**
-	 * 下面是第三次JVM课应实现的测试用例
-	 */
-	@Test
-	public void testReadFields() {
-
-		List<Field> fields = clzFile.getFields();
-		Assert.assertEquals(2, fields.size());
-		{
-			Field f = fields.get(0);
-			Assert.assertEquals("name:Ljava/lang/String;", f.toString());
-		}
-		{
-			Field f = fields.get(1);
-			Assert.assertEquals("age:I", f.toString());
-		}
-	}
-
-	@Test
-	public void testMethods() {
-
-		List<Method> methods = clzFile.getMethods();
-		ConstantPool pool = clzFile.getConstantPool();
-
-		{
-			Method m = methods.get(0);
-			assertMethodEquals(pool, m, "<init>", "(Ljava/lang/String;I)V", "2ab7000c2a2bb5000f2a1cb50011b1");
-
-		}
-		{
-			Method m = methods.get(1);
-			assertMethodEquals(pool, m, "setName", "(Ljava/lang/String;)V", "2a2bb5000fb1");
-
-		}
-		{
-			Method m = methods.get(2);
-			assertMethodEquals(pool, m, "setAge", "(I)V", "2a1bb50011b1");
-		}
-		{
-			Method m = methods.get(3);
-			assertMethodEquals(pool, m, "sayHello", "()V", "b2001c1222b60024b1");
-
-		}
-		{
-			Method m = methods.get(4);
-			assertMethodEquals(pool, m, "main", "([Ljava/lang/String;)V", "bb000159122b101db7002d4c2bb6002fb1");
-		}
-	}
-
-	private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc,
-			String expectedCode) {
-		String methodName = pool.getUTF8String(m.getNameIndex());
-		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
-		String code = m.getCodeAttr().getCode();
-		Assert.assertEquals(expectedName, methodName);
-		Assert.assertEquals(expectedDesc, methodDesc);
-		Assert.assertEquals(expectedCode, code);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java
deleted file mode 100644
index 2b80092ecb..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/jvm/loader/EmployeeV1.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.coderising.jvm.loader;
-
-public class EmployeeV1 {
-
-	private String name;
-	private int age;
-
-	public EmployeeV1(String name, int age) {
-		this.name = name;
-		this.age = age;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setAge(int age) {
-		this.age = age;
-	}
-
-	public void sayHello() {
-		System.out.println("Hello , this is class Employee ");
-	}
-
-	public static void main(String[] args) {
-		EmployeeV1 p = new EmployeeV1("Andy", 29);
-		p.sayHello();
-
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java
deleted file mode 100644
index f2426db6ea..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coderising/litestruts/StrutsTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class StrutsTest {
-
-	@Test
-	public void testLoginActionSuccess() {
-
-		String actionName = "login";
-
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "1234");
-
-		View view = Struts.runAction(actionName, params);
-
-		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
-		Assert.assertEquals("login successful", view.getParameters().get("message"));
-	}
-
-	@Test
-	public void testLoginActionFailed() {
-		String actionName = "login";
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "123456"); // 密码和预设的不一致
-
-		View view = Struts.runAction(actionName, params);
-
-		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
-		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java
deleted file mode 100644
index bc139cbe2d..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/LRUPageFrameTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coding.basic;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class LRUPageFrameTest {
-	@Test
-	public void testAccess() {
-		LRUPageFrame frame = new LRUPageFrame(3);
-		frame.access(7);
-		frame.access(0);
-		frame.access(1);
-		Assert.assertEquals("1,0,7", frame.toString());
-		frame.access(2);
-		Assert.assertEquals("2,1,0", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(3);
-		Assert.assertEquals("3,0,2", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,3,2", frame.toString());
-		frame.access(4);
-		Assert.assertEquals("4,0,3", frame.toString());
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java
deleted file mode 100644
index 5976823f36..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/StackUtilTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StackUtilTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testAddToBottom() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-
-		StackUtil.addToBottom(s, 0);
-
-		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
-
-	}
-
-	@Test
-	public void testReverse() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
-		StackUtil.reverse(s);
-		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
-	}
-
-	@Test
-	public void testRemove() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		StackUtil.remove(s, 2);
-		Assert.assertEquals("[1, 3]", s.toString());
-	}
-
-	@Test
-	public void testGetTop() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		{
-			Object[] values = StackUtil.getTop(s, 3);
-			Assert.assertEquals(5, values[0]);
-			Assert.assertEquals(4, values[1]);
-			Assert.assertEquals(3, values[2]);
-		}
-	}
-
-	@Test
-	public void testIsValidPairs() {
-		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
-		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
deleted file mode 100644
index 2f03b3ac9a..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class InfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		// InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
-		{
-			InfixExpr expr = new InfixExpr("2+3*4+5");
-			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
-			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
-		}
-
-		{
-			InfixExpr expr = new InfixExpr("3*20/2");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-
-		{
-			InfixExpr expr = new InfixExpr("20/2*3");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-
-		{
-			InfixExpr expr = new InfixExpr("10-30+50");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-51-liuxin-question/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml
deleted file mode 100644
index 80266b31de..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-52-liuxin-answer</artifactId>
-	<description>eulerlcs master java road copy from liuxin answer</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.jdom</groupId>
-			<artifactId>jdom2</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java
deleted file mode 100644
index 76dc0f3a40..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/Connection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.download.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * 
-	 * @param startPos
-	 *            开始位置， 从0开始
-	 * @param endPos
-	 *            结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos, int endPos) throws IOException;
-
-	/**
-	 * 得到数据内容的长度
-	 * 
-	 * @return
-	 */
-	public int getContentLength();
-
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java
deleted file mode 100644
index 4666b77756..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionException.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.coderising.download.api;
-
-public class ConnectionException extends Exception {
-	public ConnectionException(Exception e) {
-		super(e);
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java
deleted file mode 100644
index 787984f170..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/ConnectionManager.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.coderising.download.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * 
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java
deleted file mode 100644
index bf9807b307..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.coderising.download.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java
deleted file mode 100644
index faf849d975..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/DownloadThread.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.coderising.download.core;
-
-import java.io.RandomAccessFile;
-import java.util.concurrent.CyclicBarrier;
-
-import com.coderising.download.api.Connection;
-
-public class DownloadThread extends Thread {
-
-	Connection conn;
-	int startPos;
-	int endPos;
-	CyclicBarrier barrier;
-	String localFile;
-
-	public DownloadThread(Connection conn, int startPos, int endPos, String localFile, CyclicBarrier barrier) {
-
-		this.conn = conn;
-		this.startPos = startPos;
-		this.endPos = endPos;
-		this.localFile = localFile;
-		this.barrier = barrier;
-	}
-
-	public void run() {
-
-		try {
-			System.out.println("Begin to read [" + startPos + "-" + endPos + "]");
-
-			byte[] data = conn.read(startPos, endPos);
-
-			RandomAccessFile file = new RandomAccessFile(localFile, "rw");
-
-			file.seek(startPos);
-
-			file.write(data);
-
-			file.close();
-
-			conn.close();
-
-			barrier.await(); // 等待别的线程完成
-
-		} catch (Exception e) {
-			e.printStackTrace();
-
-		}
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java
deleted file mode 100644
index b5831a72bd..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/core/FileDownloader.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.coderising.download.core;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.concurrent.CyclicBarrier;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-
-public class FileDownloader {
-
-	private String url;
-	private String localFile;
-
-	DownloadListener listener;
-
-	ConnectionManager cm;
-
-	private static final int DOWNLOAD_TRHEAD_NUM = 3;
-
-	public FileDownloader(String _url, String localFile) {
-		this.url = _url;
-		this.localFile = localFile;
-
-	}
-
-	public void execute() {
-		// 在这里实现你的代码， 注意： 需要用多线程实现下载
-		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
-		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos,
-		// endPos来指定）
-		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-		// 线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
-		// 具体的实现思路：
-		// 1. 需要调用ConnectionManager的open方法打开连接，
-		// 然后通过Connection.getContentLength方法获得文件的长度
-		// 2. 至少启动3个线程下载， 注意每个线程需要先调用ConnectionManager的open方法
-		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
-		// 3. 把byte数组写入到文件中
-		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
-
-		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
-
-		CyclicBarrier barrier = new CyclicBarrier(DOWNLOAD_TRHEAD_NUM, new Runnable() {
-			public void run() {
-				listener.notifyFinished();
-			}
-		});
-
-		Connection conn = null;
-		try {
-
-			conn = cm.open(this.url);
-
-			int length = conn.getContentLength();
-
-			createPlaceHolderFile(this.localFile, length);
-
-			int[][] ranges = allocateDownloadRange(DOWNLOAD_TRHEAD_NUM, length);
-
-			for (int i = 0; i < DOWNLOAD_TRHEAD_NUM; i++) {
-
-				DownloadThread thread = new DownloadThread(cm.open(url), ranges[i][0], ranges[i][1], localFile,
-						barrier);
-
-				thread.start();
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			if (conn != null) {
-				conn.close();
-			}
-		}
-
-	}
-
-	private void createPlaceHolderFile(String fileName, int contentLen) throws IOException {
-
-		RandomAccessFile file = new RandomAccessFile(fileName, "rw");
-
-		for (int i = 0; i < contentLen; i++) {
-			file.write(0);
-		}
-
-		file.close();
-	}
-
-	private int[][] allocateDownloadRange(int threadNum, int contentLen) {
-		int[][] ranges = new int[threadNum][2];
-
-		int eachThreadSize = contentLen / threadNum;// 每个线程需要下载的文件大小
-		int left = contentLen % threadNum;// 剩下的归最后一个线程来处理
-
-		for (int i = 0; i < threadNum; i++) {
-
-			int startPos = i * eachThreadSize;
-
-			int endPos = (i + 1) * eachThreadSize - 1;
-
-			if ((i == (threadNum - 1))) {
-				endPos += left;
-			}
-			ranges[i][0] = startPos;
-			ranges[i][1] = endPos;
-
-		}
-
-		return ranges;
-	}
-
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	public void setConnectionManager(ConnectionManager ucm) {
-		this.cm = ucm;
-	}
-
-	public DownloadListener getListener() {
-		return this.listener;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
deleted file mode 100644
index d1aa121f75..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.coderising.download.impl;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Arrays;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-
-class ConnectionImpl implements Connection {
-
-	URL url;
-	static final int BUFFER_SIZE = 1024;
-
-	ConnectionImpl(String _url) throws ConnectionException {
-		try {
-			url = new URL(_url);
-		} catch (MalformedURLException e) {
-			throw new ConnectionException(e);
-		}
-	}
-
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {
-
-		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
-
-		httpConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
-
-		InputStream is = httpConn.getInputStream();
-
-		// is.skip(startPos);
-
-		byte[] buff = new byte[BUFFER_SIZE];
-
-		int totalLen = endPos - startPos + 1;
-
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-		while (baos.size() < totalLen) {
-
-			int len = is.read(buff);
-			if (len < 0) {
-				break;
-			}
-			baos.write(buff, 0, len);
-		}
-
-		if (baos.size() > totalLen) {
-			byte[] data = baos.toByteArray();
-			return Arrays.copyOf(data, totalLen);
-		}
-
-		return baos.toByteArray();
-	}
-
-	@Override
-	public int getContentLength() {
-
-		URLConnection con;
-		try {
-			con = url.openConnection();
-
-			return con.getContentLength();
-
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-
-		return -1;
-
-	}
-
-	@Override
-	public void close() {
-
-	}
-
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
deleted file mode 100644
index 5e98063eaa..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coderising.download.impl;
-
-import com.coderising.download.api.Connection;
-import com.coderising.download.api.ConnectionException;
-import com.coderising.download.api.ConnectionManager;
-
-public class ConnectionManagerImpl implements ConnectionManager {
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-
-		return new ConnectionImpl(url);
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java
deleted file mode 100644
index 5b0f60c148..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Configuration.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.coderising.litestruts;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.JDOMException;
-import org.jdom2.input.SAXBuilder;
-
-public class Configuration {
-
-	Map<String, ActionConfig> actions = new HashMap<>();
-
-	public Configuration(String fileName) {
-
-		String packageName = this.getClass().getPackage().getName();
-
-		packageName = packageName.replace('.', '/');
-
-		InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName);
-
-		parseXML(is);
-
-		try {
-			is.close();
-		} catch (IOException e) {
-			throw new ConfigurationException(e);
-		}
-	}
-
-	private void parseXML(InputStream is) {
-
-		SAXBuilder builder = new SAXBuilder();
-
-		try {
-
-			Document doc = builder.build(is);
-
-			Element root = doc.getRootElement();
-
-			for (Element actionElement : root.getChildren("action")) {
-
-				String actionName = actionElement.getAttributeValue("name");
-				String clzName = actionElement.getAttributeValue("class");
-
-				ActionConfig ac = new ActionConfig(actionName, clzName);
-
-				for (Element resultElement : actionElement.getChildren("result")) {
-
-					String resultName = resultElement.getAttributeValue("name");
-					String viewName = resultElement.getText().trim();
-
-					ac.addViewResult(resultName, viewName);
-
-				}
-
-				this.actions.put(actionName, ac);
-			}
-
-		} catch (JDOMException e) {
-			throw new ConfigurationException(e);
-
-		} catch (IOException e) {
-			throw new ConfigurationException(e);
-
-		}
-
-	}
-
-	public String getClassName(String action) {
-		ActionConfig ac = this.actions.get(action);
-		if (ac == null) {
-			return null;
-		}
-		return ac.getClassName();
-	}
-
-	public String getResultView(String action, String resultName) {
-		ActionConfig ac = this.actions.get(action);
-		if (ac == null) {
-			return null;
-		}
-		return ac.getViewName(resultName);
-	}
-
-	private static class ActionConfig {
-
-		String name;
-		String clzName;
-		Map<String, String> viewResult = new HashMap<>();
-
-		public ActionConfig(String actionName, String clzName) {
-			this.name = actionName;
-			this.clzName = clzName;
-		}
-
-		public String getClassName() {
-			return clzName;
-		}
-
-		public void addViewResult(String name, String viewName) {
-			viewResult.put(name, viewName);
-		}
-
-		public String getViewName(String resultName) {
-			return viewResult.get(resultName);
-		}
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java
deleted file mode 100644
index 97e286827f..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ConfigurationException.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.coderising.litestruts;
-
-import java.io.IOException;
-
-import org.jdom2.JDOMException;
-
-public class ConfigurationException extends RuntimeException {
-
-	public ConfigurationException(String msg) {
-		super(msg);
-	}
-
-	public ConfigurationException(JDOMException e) {
-		super(e);
-	}
-
-	public ConfigurationException(IOException e) {
-		super(e);
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java
deleted file mode 100644
index 5f41f42c62..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/LoginAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coderising.litestruts;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * 
- * @author liuxin
- *
- */
-public class LoginAction {
-	private String name;
-	private String password;
-	private String message;
-
-	public String getName() {
-		return name;
-	}
-
-	public String getPassword() {
-		return password;
-	}
-
-	public String execute() {
-		if ("test".equals(name) && "1234".equals(password)) {
-			this.message = "login successful";
-			return "success";
-		}
-		this.message = "login failed,please check your user/pwd";
-		return "fail";
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
-	public String getMessage() {
-		return this.message;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java
deleted file mode 100644
index 1ba13d5245..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/ReflectionUtil.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.coderising.litestruts;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class ReflectionUtil {
-
-	public static List<Method> getSetterMethods(Class clz) {
-
-		return getMethods(clz, "set");
-
-	}
-
-	public static void setParameters(Object o, Map<String, String> params) {
-
-		List<Method> methods = getSetterMethods(o.getClass());
-
-		for (String name : params.keySet()) {
-
-			String methodName = "set" + name;
-
-			for (Method m : methods) {
-
-				if (m.getName().equalsIgnoreCase(methodName)) {
-					try {
-						m.invoke(o, params.get(name));
-					} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-
-	}
-
-	public static List<Method> getGetterMethods(Class<?> clz) {
-		return getMethods(clz, "get");
-	}
-
-	private static List<Method> getMethods(Class<?> clz, String startWithName) {
-
-		List<Method> methods = new ArrayList<>();
-
-		for (Method m : clz.getDeclaredMethods()) {
-
-			if (m.getName().startsWith(startWithName)) {
-
-				methods.add(m);
-
-			}
-
-		}
-
-		return methods;
-	}
-
-	public static Map<String, Object> getParamterMap(Object o) {
-
-		Map<String, Object> params = new HashMap<>();
-
-		List<Method> methods = getGetterMethods(o.getClass());
-
-		for (Method m : methods) {
-
-			String methodName = m.getName();
-			String name = methodName.replaceFirst("get", "").toLowerCase();
-			try {
-				Object value = m.invoke(o);
-				params.put(name, value);
-			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-
-				e.printStackTrace();
-			}
-		}
-
-		return params;
-	}
-
-	//////////////////////// Backup ///////////////////////////////////
-
-	public static List<Method> getGetterMethods_V1(Class<?> clz) {
-
-		List<Method> methods = new ArrayList<>();
-
-		for (Method m : clz.getDeclaredMethods()) {
-
-			if (m.getName().startsWith("get")) {
-
-				methods.add(m);
-
-			}
-
-		}
-
-		return methods;
-	}
-
-	public static List<Method> getSetterMethods_V1(Class clz) {
-
-		List<Method> methods = new ArrayList<>();
-
-		for (Method m : clz.getDeclaredMethods()) {
-
-			if (m.getName().startsWith("set")) {
-
-				methods.add(m);
-
-			}
-
-		}
-
-		return methods;
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java
deleted file mode 100644
index b3fe556ebc..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/Struts.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.coderising.litestruts;
-
-import java.lang.reflect.Method;
-import java.util.Map;
-
-public class Struts {
-	private final static Configuration cfg = new Configuration("struts.xml");
-
-	public static View runAction(String actionName, Map<String, String> parameters) {
-		/*
-		 * 
-		 * 0. 读取配置文件struts.xml
-		 * 
-		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
-		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
-		 * "password"="1234") , 那就应该调用 setName和setPassword方法
-		 * 
-		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
-		 * 
-		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
-		 * {"message": "登录成功"} , 放到View对象的parameters
-		 * 
-		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
-		 * 放到View对象的jsp字段中。
-		 * 
-		 */
-
-		String clzName = cfg.getClassName(actionName);
-
-		if (clzName == null) {
-			return null;
-		}
-
-		try {
-			Class<?> clz = Class.forName(clzName);
-			Object action = clz.newInstance();
-
-			ReflectionUtil.setParameters(action, parameters);
-
-			Method m = clz.getDeclaredMethod("execute");
-			String resultName = (String) m.invoke(action);
-
-			Map<String, Object> params = ReflectionUtil.getParamterMap(action);
-			String resultView = cfg.getResultView(actionName, resultName);
-			View view = new View();
-			view.setParameters(params);
-			view.setJsp(resultView);
-			return view;
-
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		return null;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java
deleted file mode 100644
index f1e7fcfa19..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coderising/litestruts/View.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.Map;
-
-public class View {
-	private String jsp;
-	private Map parameters;
-
-	public String getJsp() {
-		return jsp;
-	}
-
-	public View setJsp(String jsp) {
-		this.jsp = jsp;
-		return this;
-	}
-
-	public Map getParameters() {
-		return parameters;
-	}
-
-	public View setParameters(Map parameters) {
-		this.parameters = parameters;
-		return this;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java
deleted file mode 100644
index 2f944d3b91..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/BinaryTreeNode.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.coding.basic;
-
-public class BinaryTreeNode {
-
-	private Object data;
-	private BinaryTreeNode left;
-	private BinaryTreeNode right;
-
-	public Object getData() {
-		return data;
-	}
-
-	public void setData(Object data) {
-		this.data = data;
-	}
-
-	public BinaryTreeNode getLeft() {
-		return left;
-	}
-
-	public void setLeft(BinaryTreeNode left) {
-		this.left = left;
-	}
-
-	public BinaryTreeNode getRight() {
-		return right;
-	}
-
-	public void setRight(BinaryTreeNode right) {
-		this.right = right;
-	}
-
-	public BinaryTreeNode insert(Object o) {
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java
deleted file mode 100644
index f30dfc8edf..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Iterator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.coding.basic;
-
-public interface Iterator {
-	public boolean hasNext();
-
-	public Object next();
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java
deleted file mode 100644
index 03fa879b2e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/List.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coding.basic;
-
-public interface List {
-	public void add(Object o);
-
-	public void add(int index, Object o);
-
-	public Object get(int index);
-
-	public Object remove(int index);
-
-	public int size();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java
deleted file mode 100644
index b2908512c5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/Queue.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.coding.basic;
-
-public class Queue {
-
-	public void enQueue(Object o) {
-	}
-
-	public Object deQueue() {
-		return null;
-	}
-
-	public boolean isEmpty() {
-		return false;
-	}
-
-	public int size() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java
deleted file mode 100644
index 81dfe5bdfe..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayList.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.coding.basic.array;
-
-import com.coding.basic.Iterator;
-import com.coding.basic.List;
-
-public class ArrayList implements List {
-
-	private int size = 0;
-
-	private Object[] elementData = new Object[100];
-
-	public void add(Object o) {
-
-	}
-
-	public void add(int index, Object o) {
-
-	}
-
-	public Object get(int index) {
-		return null;
-	}
-
-	public Object remove(int index) {
-		return null;
-	}
-
-	public int size() {
-		return -1;
-	}
-
-	public Iterator iterator() {
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java
deleted file mode 100644
index 0e8e077db7..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/array/ArrayUtil.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.coding.basic.array;
-
-public class ArrayUtil {
-
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
-	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * 
-	 * @param origin
-	 * @return
-	 */
-	public void reverseArray(int[] origin) {
-
-	}
-
-	/**
-	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
-	 * 
-	 * @param oldArray
-	 * @return
-	 */
-
-	public int[] removeZero(int[] oldArray) {
-		return null;
-	}
-
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
-	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
-	 * 
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-
-	public int[] merge(int[] array1, int[] array2) {
-		return null;
-	}
-
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * 
-	 * @param oldArray
-	 * @param size
-	 * @return
-	 */
-	public int[] grow(int[] oldArray, int size) {
-		return null;
-	}
-
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
-	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public int[] fibonacci(int max) {
-		return null;
-	}
-
-	/**
-	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public int[] getPrimes(int max) {
-		return null;
-	}
-
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public int[] getPerfectNumbers(int max) {
-		return null;
-	}
-
-	/**
-	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
-	 * 
-	 * @param array
-	 * @param s
-	 * @return
-	 */
-	public String join(int[] array, String seperator) {
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
deleted file mode 100644
index 305989d5de..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LRUPageFrame.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package com.coding.basic.linklist;
-
-public class LRUPageFrame {
-
-	private static class Node {
-
-		Node prev;
-		Node next;
-		int pageNum;
-
-		Node() {
-		}
-	}
-
-	private int capacity;
-
-	private int currentSize;
-	private Node first;// 链表头
-	private Node last;// 链表尾
-
-	public LRUPageFrame(int capacity) {
-		this.currentSize = 0;
-		this.capacity = capacity;
-
-	}
-
-	/**
-	 * 获取缓存中对象
-	 * 
-	 * @param key
-	 * @return
-	 */
-	public void access(int pageNum) {
-
-		Node node = find(pageNum);
-		// 在该队列中存在， 则提到队列头
-		if (node != null) {
-
-			moveExistingNodeToHead(node);
-
-		} else {
-
-			node = new Node();
-			node.pageNum = pageNum;
-
-			// 缓存容器是否已经超过大小.
-			if (currentSize >= capacity) {
-				removeLast();
-
-			}
-
-			addNewNodetoHead(node);
-
-		}
-	}
-
-	private void addNewNodetoHead(Node node) {
-
-		if (isEmpty()) {
-
-			node.prev = null;
-			node.next = null;
-			first = node;
-			last = node;
-
-		} else {
-			node.prev = null;
-			node.next = first;
-			first.prev = node;
-			first = node;
-		}
-		this.currentSize++;
-	}
-
-	private Node find(int data) {
-
-		Node node = first;
-		while (node != null) {
-			if (node.pageNum == data) {
-				return node;
-			}
-			node = node.next;
-		}
-		return null;
-
-	}
-
-	/**
-	 * 删除链表尾部节点 表示 删除最少使用的缓存对象
-	 */
-	private void removeLast() {
-		Node prev = last.prev;
-		prev.next = null;
-		last.prev = null;
-		last = prev;
-		this.currentSize--;
-	}
-
-	/**
-	 * 移动到链表头，表示这个节点是最新使用过的
-	 * 
-	 * @param node
-	 */
-	private void moveExistingNodeToHead(Node node) {
-
-		if (node == first) {
-
-			return;
-		} else if (node == last) {
-			// 当前节点是链表尾， 需要放到链表头
-			Node prevNode = node.prev;
-			prevNode.next = null;
-			last.prev = null;
-			last = prevNode;
-
-		} else {
-			// node 在链表的中间， 把node 的前后节点连接起来
-			Node prevNode = node.prev;
-			prevNode.next = node.next;
-
-			Node nextNode = node.next;
-			nextNode.prev = prevNode;
-
-		}
-
-		node.prev = null;
-		node.next = first;
-		first.prev = node;
-		first = node;
-
-	}
-
-	private boolean isEmpty() {
-		return (first == null) && (last == null);
-	}
-
-	public String toString() {
-		StringBuilder buffer = new StringBuilder();
-		Node node = first;
-		while (node != null) {
-			buffer.append(node.pageNum);
-
-			node = node.next;
-			if (node != null) {
-				buffer.append(",");
-			}
-		}
-		return buffer.toString();
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java
deleted file mode 100644
index 6c8b4a3315..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/linklist/LinkedList.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package com.coding.basic.linklist;
-
-import com.coding.basic.Iterator;
-import com.coding.basic.List;
-
-public class LinkedList implements List {
-
-	private Node head;
-
-	public void add(Object o) {
-
-	}
-
-	public void add(int index, Object o) {
-
-	}
-
-	public Object get(int index) {
-		return null;
-	}
-
-	public Object remove(int index) {
-		return null;
-	}
-
-	public int size() {
-		return -1;
-	}
-
-	public void addFirst(Object o) {
-
-	}
-
-	public void addLast(Object o) {
-
-	}
-
-	public Object removeFirst() {
-		return null;
-	}
-
-	public Object removeLast() {
-		return null;
-	}
-
-	public Iterator iterator() {
-		return null;
-	}
-
-	private static class Node {
-		Object data;
-		Node next;
-
-	}
-
-	/**
-	 * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3
-	 */
-	public void reverse() {
-
-	}
-
-	/**
-	 * 删除一个单链表的前半部分 例如：list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10
-	 * ,删除以后的值为7,8,10
-	 * 
-	 */
-	public void removeFirstHalf() {
-
-	}
-
-	/**
-	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
-	 * 
-	 * @param i
-	 * @param length
-	 */
-	public void remove(int i, int length) {
-
-	}
-
-	/**
-	 * 假定当前链表和listB均包含已升序排列的整数 从当前链表中取出那些listB所指定的元素 例如当前链表 =
-	 * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
-	 * 返回的结果应该是[101,301,401,601]
-	 * 
-	 * @param list
-	 */
-	public int[] getElements(LinkedList list) {
-		return null;
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 从当前链表中中删除在listB中出现的元素
-	 * 
-	 * @param list
-	 */
-
-	public void subtract(LinkedList list) {
-
-	}
-
-	/**
-	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
-	 */
-	public void removeDuplicateValues() {
-
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
-	 * 
-	 * @param min
-	 * @param max
-	 */
-	public void removeRange(int min, int max) {
-
-	}
-
-	/**
-	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
-	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
-	 * 
-	 * @param list
-	 */
-	public LinkedList intersection(LinkedList list) {
-		return null;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java
deleted file mode 100644
index 83b76cb872..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/Stack.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coding.basic.stack;
-
-import com.coding.basic.array.ArrayList;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-
-	public void push(Object o) {
-	}
-
-	public Object pop() {
-		return null;
-	}
-
-	public Object peek() {
-		return null;
-	}
-
-	public boolean isEmpty() {
-		return false;
-	}
-
-	public int size() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java
deleted file mode 100644
index 100bfc46a9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/StackUtil.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-
-public class StackUtil {
-
-	public static void bad_reverse(Stack<Integer> s) {
-		if (s == null || s.isEmpty()) {
-			return;
-		}
-		Stack<Integer> tmpStack = new Stack();
-		while (!s.isEmpty()) {
-			tmpStack.push(s.pop());
-		}
-
-		s = tmpStack;
-
-	}
-
-	/**
-	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 */
-	public static void reverse(Stack<Integer> s) {
-		if (s == null || s.isEmpty()) {
-			return;
-		}
-		Integer top = s.pop();
-		reverse(s);
-		addToBottom(s, top);
-
-	}
-
-	public static void addToBottom(Stack<Integer> s, Integer value) {
-		if (s.isEmpty()) {
-			s.push(value);
-		} else {
-			Integer top = s.pop();
-			addToBottom(s, value);
-			s.push(top);
-		}
-
-	}
-
-	/**
-	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * 
-	 * @param o
-	 */
-	public static void remove(Stack s, Object o) {
-		if (s == null || s.isEmpty()) {
-			return;
-		}
-		Stack tmpStack = new Stack();
-
-		while (!s.isEmpty()) {
-			Object value = s.pop();
-			if (!value.equals(o)) {
-				tmpStack.push(value);
-			}
-		}
-
-		while (!tmpStack.isEmpty()) {
-			s.push(tmpStack.pop());
-		}
-	}
-
-	/**
-	 * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty，
-	 * 可以使用另外一个栈来辅助
-	 * 
-	 * @param len
-	 * @return
-	 */
-	public static Object[] getTop(Stack s, int len) {
-
-		if (s == null || s.isEmpty() || s.size() < len || len <= 0) {
-			return null;
-		}
-
-		Stack tmpStack = new Stack();
-		int i = 0;
-		Object[] result = new Object[len];
-		while (!s.isEmpty()) {
-			Object value = s.pop();
-			tmpStack.push(value);
-			result[i++] = value;
-			if (i == len) {
-				break;
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * 字符串s 可能包含这些字符： ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s =
-	 * "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true 如果 s = "([b{x]y})",
-	 * 则该字符串中的括号不是成对出现的， 该方法返回false;
-	 * 
-	 * @param s
-	 * @return
-	 */
-	public static boolean isValidPairs(String s) {
-
-		Stack<Character> stack = new Stack();
-		for (int i = 0; i < s.length(); i++) {
-			char c = s.charAt(i);
-
-			if (c == '(' || c == '[' || c == '{') {
-
-				stack.push(c);
-
-			} else if (c == ')') {
-
-				char topChar = stack.pop();
-				if (topChar != '(') {
-					return false;
-				}
-
-			} else if (c == ']') {
-
-				char topChar = stack.pop();
-				if (topChar != '[') {
-					return false;
-				}
-
-			} else if (c == '}') {
-
-				char topChar = stack.pop();
-				if (topChar != '{') {
-					return false;
-				}
-
-			}
-		}
-		return stack.size() == 0;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
deleted file mode 100644
index 1a479c9b97..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExpr.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coding.basic.stack.expr;
-
-public class InfixExpr {
-	String expr = null;
-
-	public InfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-
-		return 0.0f;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
deleted file mode 100644
index feb20c7d5c..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.coding.basic.stack.expr;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class InfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		// InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
-		{
-			InfixExpr expr = new InfixExpr("2+3*4+5");
-			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
-			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
-		}
-
-		{
-			InfixExpr expr = new InfixExpr("3*20/2");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-
-		{
-			InfixExpr expr = new InfixExpr("20/2*3");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-
-		{
-			InfixExpr expr = new InfixExpr("10-30+50");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml
deleted file mode 100644
index e5d9aebba8..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/main/resources/struts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<struts>
-    <action name="login" class="com.coderising.litestruts.LoginAction">
-        <result name="success">/jsp/homepage.jsp</result>
-        <result name="fail">/jsp/showLogin.jsp</result>
-    </action>
-    <action name="logout" class="com.coderising.litestruts.LogoutAction">
-    	<result name="success">/jsp/welcome.jsp</result>
-    	<result name="error">/jsp/error.jsp</result>
-    </action>
-</struts>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java
deleted file mode 100644
index 5e4259bddf..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/api/ConnectionTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coderising.download.api;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.download.impl.ConnectionManagerImpl;
-
-public class ConnectionTest {
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testContentLength() throws Exception {
-		ConnectionManager connMan = new ConnectionManagerImpl();
-		Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg");
-		Assert.assertEquals(35470, conn.getContentLength());
-	}
-
-	@Test
-	public void testRead() throws Exception {
-		ConnectionManager connMan = new ConnectionManagerImpl();
-		Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg");
-
-		byte[] data = conn.read(0, 35469);
-		Assert.assertEquals(35470, data.length);
-
-		data = conn.read(0, 1023);
-		Assert.assertEquals(1024, data.length);
-
-		data = conn.read(1024, 2023);
-		Assert.assertEquals(1000, data.length);
-
-		// 测试不充分，没有断言内容是否正确
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java
deleted file mode 100644
index 2631a1f90b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/download/core/FileDownloaderTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.coderising.download.core;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.coderising.download.api.ConnectionManager;
-import com.coderising.download.api.DownloadListener;
-import com.coderising.download.impl.ConnectionManagerImpl;
-
-public class FileDownloaderTest {
-	boolean downloadFinished = false;
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testDownload() {
-		// String url =
-		// "http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg";
-
-		String url = "http://images2015.cnblogs.com/blog/610238/201604/610238-20160421154632101-286208268.png";
-
-		FileDownloader downloader = new FileDownloader(url, "c:\\coderising\\tmp\\test.jpg");
-
-		ConnectionManager cm = new ConnectionManagerImpl();
-		downloader.setConnectionManager(cm);
-
-		downloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-		});
-
-		downloader.execute();
-
-		// 等待多线程下载程序执行完毕
-		while (!downloadFinished) {
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				// 休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-
-		System.out.println("下载完成！");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java
deleted file mode 100644
index b8ab6c04b9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ConfigurationTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.coderising.litestruts;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ConfigurationTest {
-
-	Configuration cfg = new Configuration("struts.xml");
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testGetClassName() {
-
-		String clzName = cfg.getClassName("login");
-		Assert.assertEquals("com.coderising.litestruts.LoginAction", clzName);
-
-		clzName = cfg.getClassName("logout");
-		Assert.assertEquals("com.coderising.litestruts.LogoutAction", clzName);
-	}
-
-	@Test
-	public void testGetResultView() {
-		String jsp = cfg.getResultView("login", "success");
-		Assert.assertEquals("/jsp/homepage.jsp", jsp);
-
-		jsp = cfg.getResultView("login", "fail");
-		Assert.assertEquals("/jsp/showLogin.jsp", jsp);
-
-		jsp = cfg.getResultView("logout", "success");
-		Assert.assertEquals("/jsp/welcome.jsp", jsp);
-
-		jsp = cfg.getResultView("logout", "error");
-		Assert.assertEquals("/jsp/error.jsp", jsp);
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java
deleted file mode 100644
index 4362ae0ac7..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/ReflectionUtilTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.coderising.litestruts;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ReflectionUtilTest {
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testGetSetterMethod() throws Exception {
-
-		String name = "com.coderising.litestruts.LoginAction";
-		Class<?> clz = Class.forName(name);
-		List<Method> methods = ReflectionUtil.getSetterMethods(clz);
-
-		Assert.assertEquals(2, methods.size());
-
-		List<String> expectedNames = new ArrayList<>();
-		expectedNames.add("setName");
-		expectedNames.add("setPassword");
-
-		Set<String> acctualNames = new HashSet<>();
-		for (Method m : methods) {
-			acctualNames.add(m.getName());
-		}
-
-		Assert.assertTrue(acctualNames.containsAll(expectedNames));
-	}
-
-	@Test
-	public void testSetParameters() throws Exception {
-		String name = "com.coderising.litestruts.LoginAction";
-		Class<?> clz = Class.forName(name);
-		Object o = clz.newInstance();
-
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "1234");
-
-		ReflectionUtil.setParameters(o, params);
-
-		Field f = clz.getDeclaredField("name");
-		f.setAccessible(true);
-		Assert.assertEquals("test", f.get(o));
-
-		f = clz.getDeclaredField("password");
-		f.setAccessible(true);
-		Assert.assertEquals("1234", f.get(o));
-	}
-
-	@Test
-	public void testGetGetterMethod() throws Exception {
-		String name = "com.coderising.litestruts.LoginAction";
-		Class<?> clz = Class.forName(name);
-		List<Method> methods = ReflectionUtil.getGetterMethods(clz);
-
-		Assert.assertEquals(3, methods.size());
-
-		List<String> expectedNames = new ArrayList<>();
-		expectedNames.add("getMessage");
-		expectedNames.add("getName");
-		expectedNames.add("getPassword");
-
-		Set<String> acctualNames = new HashSet<>();
-		for (Method m : methods) {
-			acctualNames.add(m.getName());
-		}
-
-		Assert.assertTrue(acctualNames.containsAll(expectedNames));
-	}
-
-	@Test
-	public void testGetParamters() throws Exception {
-		String name = "com.coderising.litestruts.LoginAction";
-		Class<?> clz = Class.forName(name);
-		LoginAction action = (LoginAction) clz.newInstance();
-		action.setName("test");
-		action.setPassword("123456");
-
-		Map<String, Object> params = ReflectionUtil.getParamterMap(action);
-
-		Assert.assertEquals(3, params.size());
-		Assert.assertEquals(null, params.get("messaage"));
-		Assert.assertEquals("test", params.get("name"));
-		Assert.assertEquals("123456", params.get("password"));
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java
deleted file mode 100644
index 5174fc47f1..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coderising/litestruts/StrutsTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.coderising.litestruts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class StrutsTest {
-	@Test
-	public void testLoginActionSuccess() {
-
-		String actionName = "login";
-
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "1234");
-
-		View view = Struts.runAction(actionName, params);
-
-		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
-		Assert.assertEquals("login successful", view.getParameters().get("message"));
-	}
-
-	@Test
-	public void testLoginActionFailed() {
-		String actionName = "login";
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "123456"); // 密码和预设的不一致
-
-		View view = Struts.runAction(actionName, params);
-
-		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
-		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java
deleted file mode 100644
index 47ef10e125..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.coding.basic.linklist;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class LRUPageFrameTest {
-
-	@Test
-	public void testAccess() {
-		LRUPageFrame frame = new LRUPageFrame(3);
-		frame.access(7);
-		frame.access(0);
-		frame.access(1);
-		Assert.assertEquals("1,0,7", frame.toString());
-		frame.access(2);
-		Assert.assertEquals("2,1,0", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(3);
-		Assert.assertEquals("3,0,2", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,3,2", frame.toString());
-		frame.access(4);
-		Assert.assertEquals("4,0,3", frame.toString());
-		frame.access(5);
-		Assert.assertEquals("5,4,0", frame.toString());
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java
deleted file mode 100644
index 39a1b3f3e0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/linklist/LinkedListTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package com.coding.basic.linklist;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class LinkedListTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testReverse() {
-		LinkedList l = new LinkedList();
-
-		Assert.assertEquals("[]", l.toString());
-
-		l.add(1);
-		l.reverse();
-		Assert.assertEquals("[1]", l.toString());
-
-		l.add(2);
-		l.add(3);
-		l.add(4);
-
-		l.reverse();
-		Assert.assertEquals("[4,3,2,1]", l.toString());
-	}
-
-	@Test
-	public void testRemoveFirstHalf() {
-		{
-			LinkedList linkedList = new LinkedList();
-			linkedList.add(1);
-			linkedList.add(2);
-			linkedList.add(3);
-			linkedList.add(4);
-			linkedList.removeFirstHalf();
-			Assert.assertEquals("[3,4]", linkedList.toString());
-		}
-		{
-			LinkedList linkedList = new LinkedList();
-			linkedList.add(1);
-			linkedList.add(2);
-			linkedList.add(3);
-			linkedList.add(4);
-			linkedList.add(5);
-			linkedList.removeFirstHalf();
-			Assert.assertEquals("[3,4,5]", linkedList.toString());
-		}
-	}
-
-	@Test
-	public void testRemoveIntInt() {
-		{
-			LinkedList linkedList = new LinkedList();
-			linkedList.add(1);
-			linkedList.add(2);
-			linkedList.add(3);
-			linkedList.add(4);
-			linkedList.remove(0, 2);
-			Assert.assertEquals("[3,4]", linkedList.toString());
-		}
-		{
-			LinkedList linkedList = new LinkedList();
-			linkedList.add(1);
-			linkedList.add(2);
-			linkedList.add(3);
-			linkedList.add(4);
-			linkedList.remove(3, 2);
-			Assert.assertEquals("[1,2,3]", linkedList.toString());
-		}
-		{
-			LinkedList linkedList = new LinkedList();
-			linkedList.add(1);
-			linkedList.add(2);
-			linkedList.add(3);
-			linkedList.add(4);
-			linkedList.remove(2, 2);
-			Assert.assertEquals("[1,2]", linkedList.toString());
-		}
-	}
-
-	@Test
-	public void testGetElements() {
-		LinkedList linkedList = new LinkedList();
-		linkedList.add(11);
-		linkedList.add(101);
-		linkedList.add(201);
-		linkedList.add(301);
-		linkedList.add(401);
-		linkedList.add(501);
-		linkedList.add(601);
-		linkedList.add(701);
-		LinkedList list = new LinkedList();
-		list.add(1);
-		list.add(3);
-		list.add(4);
-		list.add(6);
-		Assert.assertArrayEquals(new int[] { 101, 301, 401, 601 }, linkedList.getElements(list));
-	}
-
-	@Test
-	public void testSubtract() {
-		LinkedList list1 = new LinkedList();
-		list1.add(101);
-		list1.add(201);
-		list1.add(301);
-		list1.add(401);
-		list1.add(501);
-		list1.add(601);
-		list1.add(701);
-
-		LinkedList list2 = new LinkedList();
-
-		list2.add(101);
-		list2.add(201);
-		list2.add(301);
-		list2.add(401);
-		list2.add(501);
-
-		list1.subtract(list2);
-
-		Assert.assertEquals("[601,701]", list1.toString());
-	}
-
-	@Test
-	public void testRemoveDuplicateValues() {
-		LinkedList list = new LinkedList();
-		list.add(1);
-		list.add(1);
-		list.add(2);
-		list.add(2);
-		list.add(3);
-		list.add(5);
-		list.add(5);
-		list.add(6);
-		list.removeDuplicateValues();
-
-		Assert.assertEquals("[1,2,3,5,6]", list.toString());
-	}
-
-	@Test
-	public void testRemoveRange() {
-		{
-			LinkedList linkedList = new LinkedList();
-
-			linkedList.add(11);
-			linkedList.add(12);
-			linkedList.add(13);
-			linkedList.add(14);
-			linkedList.add(16);
-			linkedList.add(16);
-			linkedList.add(19);
-
-			linkedList.removeRange(10, 19);
-			Assert.assertEquals("[19]", linkedList.toString());
-		}
-
-		{
-			LinkedList linkedList = new LinkedList();
-
-			linkedList.add(11);
-			linkedList.add(12);
-			linkedList.add(13);
-			linkedList.add(14);
-			linkedList.add(16);
-			linkedList.add(16);
-			linkedList.add(19);
-
-			linkedList.removeRange(10, 14);
-			Assert.assertEquals("[14,16,16,19]", linkedList.toString());
-		}
-	}
-
-	@Test
-	public void testIntersection() {
-		LinkedList list1 = new LinkedList();
-		list1.add(1);
-		list1.add(6);
-		list1.add(7);
-
-		LinkedList list2 = new LinkedList();
-		list2.add(2);
-		list2.add(5);
-		list2.add(6);
-
-		LinkedList newList = list1.intersection(list2);
-		Assert.assertEquals("[6]", newList.toString());
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java
deleted file mode 100644
index 5976823f36..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/java/com/coding/basic/stack/StackUtilTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.coding.basic.stack;
-
-import java.util.Stack;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StackUtilTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testAddToBottom() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-
-		StackUtil.addToBottom(s, 0);
-
-		Assert.assertEquals("[0, 1, 2, 3]", s.toString());
-
-	}
-
-	@Test
-	public void testReverse() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
-		StackUtil.reverse(s);
-		Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
-	}
-
-	@Test
-	public void testRemove() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		StackUtil.remove(s, 2);
-		Assert.assertEquals("[1, 3]", s.toString());
-	}
-
-	@Test
-	public void testGetTop() {
-		Stack<Integer> s = new Stack();
-		s.push(1);
-		s.push(2);
-		s.push(3);
-		s.push(4);
-		s.push(5);
-		{
-			Object[] values = StackUtil.getTop(s, 3);
-			Assert.assertEquals(5, values[0]);
-			Assert.assertEquals(4, values[1]);
-			Assert.assertEquals(3, values[2]);
-		}
-	}
-
-	@Test
-	public void testIsValidPairs() {
-		Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
-		Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-52-liuxin-answer/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000

From efd431d82bce6ba23c12cf00d496ea84ba042832 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Sun, 18 Jun 2017 22:10:32 +0800
Subject: [PATCH 185/332] =?UTF-8?q?ood=20=E7=AC=AC=E4=BA=8C=E6=AC=A1?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/Logger.java   | 38 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 10 +++++
 4 files changed, 68 insertions(+)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..aca173e665
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/liuxin/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
+		
+	}
+
+}

From fb35e9f8ec1fb619d50f650198c888511c67cbb8 Mon Sep 17 00:00:00 2001
From: YouHmilyForProgramming <706097141@qq.com>
Date: Sun, 18 Jun 2017 22:12:10 +0800
Subject: [PATCH 186/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Configuration.java"                       | 23 ++++++
 .../ConfigurationKeys.java"                   |  9 +++
 .../DBUtil.java"                              | 41 ++++++++++
 .../EMail.java"                               | 48 +++++++++++
 .../MailUtil.java"                            | 20 +++++
 .../Product.java"                             | 60 ++++++++++++++
 .../PromotionMail.java"                       | 80 +++++++++++++++++++
 .../Server.java"                              | 20 +++++
 .../User.java"                                | 25 ++++++
 .../product_promotion.txt"                    |  4 +
 10 files changed, 330 insertions(+)
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/ConfigurationKeys.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java"
 create mode 100644 "students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/product_promotion.txt"

diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java"
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Configuration.java"
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/ConfigurationKeys.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/ConfigurationKeys.java"
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java"
new file mode 100644
index 0000000000..c3107056d5
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/DBUtil.java"
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	private String sql;
+	
+	
+    public void setLoadQuery(String productID) throws Exception {
+		
+		 String sql = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		 this.setSql(sql);
+		System.out.println("loadQuery set");
+	}
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public List queryForList(){
+		String query=this.getSql();
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User userInfo = new User();
+			userInfo.setNAME("User" + i);			
+			userInfo.setEMAIL("aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+	public String getSql() {
+		return sql;
+	}
+	public void setSql(String sql) {
+		this.sql = sql;
+	}
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java"
new file mode 100644
index 0000000000..53834eba04
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/EMail.java"
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+
+public class EMail {
+	
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+	
+	
+	
+	public EMail(String fromAddress, String toAddress, String subject, String message) {
+		this.fromAddress = fromAddress;
+		this.toAddress = toAddress;
+		this.subject = subject;
+		this.message = message;
+	}
+	
+	
+	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 getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message=message;
+	}
+	
+	
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java"
new file mode 100644
index 0000000000..86def76810
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/MailUtil.java"
@@ -0,0 +1,20 @@
+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/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java"
new file mode 100644
index 0000000000..93ec68aae0
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Product.java"
@@ -0,0 +1,60 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * 产品类
+ * @author Administrator
+ *
+ */
+public class Product {
+	
+	/**
+	 * 产品ID
+	 */
+	private String productID;
+	
+	/**
+	 * 产品描述
+	 */
+	private String 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;
+	}
+	
+	public static Product readFile(File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]); 
+			System.out.println("产品ID = " + product.getProductID() + "\n");
+			System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+			return product;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java"
new file mode 100644
index 0000000000..1c6225abdb
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/PromotionMail.java"
@@ -0,0 +1,80 @@
+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;
+
+	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
+		Product product=Product.readFile(file);
+		config = new Configuration();
+		Server server =new Server(); 
+		server.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		server.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER)); 
+	    DBUtil dbUtil = new DBUtil();
+	    dbUtil.setLoadQuery(product.getProductID());
+	    List mailingList= dbUtil.queryForList();
+		if (mailingList != null) {
+			System.out.println("开始发送邮件");
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();
+				String toAddress = (String) userInfo.get(EMAIL_KEY);
+				String name = (String) userInfo.get(NAME_KEY);
+				String subject = "您关注的产品降价了";
+				String message = "尊敬的 "+name+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+				String fromAddress=config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+				EMail eMail = new EMail(toAddress,fromAddress,subject,message);
+		        sendEMails(eMail,server,mailDebug); 
+		}
+      }else{
+    	  System.out.println("没有邮件发送");
+		}
+	}
+	
+	protected void sendEMails(EMail eMail,Server server,boolean debug) throws IOException {
+				try 
+				{
+					if (eMail.getToAddress().length() > 0)
+						MailUtil.sendEmail(eMail.getToAddress(), eMail.getFromAddress(), eMail.getSubject(), eMail.getMessage(), server.getSmtpHost(), debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						MailUtil.sendEmail(eMail.getToAddress(), eMail.getFromAddress(), eMail.getSubject(), eMail.getMessage(), server.getAltSmtpHost(), debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+}
+
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java"
new file mode 100644
index 0000000000..37776d9aa6
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/Server.java"
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp;
+
+
+public class Server {
+	
+	private String smtpHost;
+	private String altSmtpHost;
+	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;
+	}
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java"
new file mode 100644
index 0000000000..69d9010247
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/User.java"
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp;
+
+public class User {
+	
+	private String NAME;
+	
+	private String EMAIL;
+
+	public String getNAME() {
+		return NAME;
+	}
+
+	public void setNAME(String nAME) {
+		NAME = nAME;
+	}
+
+	public String getEMAIL() {
+		return EMAIL;
+	}
+
+	public void setEMAIL(String eMAIL) {
+		EMAIL = eMAIL;
+	}
+	
+}
diff --git "a/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/product_promotion.txt" "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/product_promotion.txt"
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\270\200\346\254\241\344\275\234\344\270\232/product_promotion.txt"
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 7c7c5b191f7befbd2760229cc03c80bda2ce3b60 Mon Sep 17 00:00:00 2001
From: jyp <jyp10@qq.com>
Date: Sun, 18 Jun 2017 22:35:51 +0800
Subject: [PATCH 187/332] commit

---
 .../data-structure/build.gradle               |  22 +--
 .../com/coding/basic/array/ArrayUtil.java     | 149 +++++++++++++-----
 .../com/coding/basic/array/ArrayUtilTest.java |  52 ++++++
 3 files changed, 160 insertions(+), 63 deletions(-)
 create mode 100644 students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java

diff --git a/students/992331664/data-structure/data-structure/build.gradle b/students/992331664/data-structure/data-structure/build.gradle
index 588e5e86aa..e8037fb1c4 100644
--- a/students/992331664/data-structure/data-structure/build.gradle
+++ b/students/992331664/data-structure/data-structure/build.gradle
@@ -1,30 +1,12 @@
-/*
- * This build file was auto generated by running the Gradle 'init' task
- * by 'gant' at '17-6-13 上午11:30' with Gradle 3.0
- *
- * This generated file contains a sample Java project to get you started.
- * For more details take a look at the Java Quickstart chapter in the Gradle
- * user guide available at https://docs.gradle.org/3.0/userguide/tutorial_java_projects.html
- */
-
-// Apply the java plugin to add support for Java
 apply plugin: 'java'
 
-// In this section you declare where to find the dependencies of your project
 repositories {
-    // Use 'jcenter' for resolving your dependencies.
-    // You can declare any Maven/Ivy/file repository here.
     jcenter()
 }
 
-// In this section you declare the dependencies for your production and test code
 dependencies {
-    // The production code uses the SLF4J logging API at compile time
     compile 'org.slf4j:slf4j-api:1.7.21'
-
-    // Declare the dependency for your favourite test framework you want to use in your tests.
-    // TestNG is also supported by the Gradle Test task. Just change the
-    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
-    // 'test.useTestNG()' to your build script.
+	compile 'org.apache.poi:poi:3.16'
+	compile 'org.apache.poi:poi-ooxml:3.16'
     testCompile 'junit:junit:4.12'
 }
diff --git a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
index 45740e6d57..c17e6def49 100644
--- a/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
+++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java
@@ -1,96 +1,159 @@
 package com.coding.basic.array;
 
+import java.util.Arrays;
+
+import javax.management.RuntimeErrorException;
+
 public class ArrayUtil {
-	
+
 	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换
-		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
-		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+	 * 
 	 * @param origin
 	 * @return
 	 */
-	public void reverseArray(int[] origin){
-		
+	public void reverseArray(int[] origin) {
+		if (origin != null && origin.length > 1) {
+			for (int i = 0; i < origin.length / 2; i++) {
+				int temp = origin[i];
+				origin[i] = origin[origin.length - 1 - i];
+				origin[origin.length - 1 - i] = temp;
+			}
+		}
 	}
-	
+
 	/**
-	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
-	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
+	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
+	 * 
 	 * @param oldArray
 	 * @return
 	 */
-	
-	public int[] removeZero(int[] oldArray){
-		return null;
+
+	public int[] removeZero(int[] oldArray) {
+		// JDK 1.8
+		// int[] newArray = Arrays.stream(oldArray).filter(item->item
+		// !=0).toArray();
+
+		int[] newArray = new int[oldArray.length];
+
+		int zeroCount = 0;
+		for (int i = 0; i < oldArray.length; i++) {
+			if (oldArray[i] == 0) {
+				zeroCount++;
+			} else {
+				newArray[i - zeroCount] = oldArray[i];
+			}
+		}
+		if (zeroCount == 0) {
+			return Arrays.copyOf(oldArray, oldArray.length);
+		} else {
+			return Arrays.copyOf(newArray, oldArray.length - zeroCount);
+		}
 	}
-	
+
 	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
-	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
+	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
+	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
+	 * 
 	 * @param array1
 	 * @param array2
 	 * @return
 	 */
-	
-	public int[] merge(int[] array1, int[] array2){
-		return  null;
+
+	public int[] merge(int[] array1, int[] array2) {
+		return null;
 	}
+
 	/**
 	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持
-	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
 	 * [2,3,6,0,0,0]
+	 * 
 	 * @param oldArray
 	 * @param size
 	 * @return
 	 */
-	public int[] grow(int [] oldArray,  int size){
-		return null;
+	public int[] grow(int[] oldArray, int size) {
+		if (oldArray.length + size < 0) {
+			throw new RuntimeErrorException(null, "size + oldArray.length 不能小于0");
+		}
+		int[] newArray = new int[oldArray.length + size];
+
+		if (size < 0) {
+			for (int i = 0; i < newArray.length; i++) {
+				newArray[i] = oldArray[i];
+			}
+		} else {
+			for (int i = 0; i < oldArray.length; i++) {
+				newArray[i] = oldArray[i];
+			}
+		}
+		return newArray;
 	}
-	
+
 	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
-	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
-	 * max = 1, 则返回空数组 []
+	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
+	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
+	 * 
 	 * @param max
 	 * @return
 	 */
-	public int[] fibonacci(int max){
-		return null;
+	public int[] fibonacci(int max) {
+		if (max <= 1) {
+			return new int[0];
+		}
+		int a = 1;
+		int count = 1;
+		for (int i = 1; i <= max; i += a) {
+			a += i;
+			count+=2;
+		}
+		
+		int[] result = new int[count];
+
+		a = 1;
+		count = 0;
+		result[count++] = 1;
+
+		for (int i = 1; i <= max; i += a) {
+			a += i;
+			result[count++] = i;
+			result[count++] = a;
+		}
+		return result;
 	}
-	
+
 	/**
-	 * 返回小于给定最大值max的所有素数数组
-	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+	 * 
 	 * @param max
 	 * @return
 	 */
-	public int[] getPrimes(int max){
+	public int[] getPrimes(int max) {
 		return null;
 	}
-	
+
 	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
-	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
+	 * 
 	 * @param max
 	 * @return
 	 */
-	public int[] getPerfectNumbers(int max){
+	public int[] getPerfectNumbers(int max) {
 		return null;
 	}
-	
+
 	/**
-	 * 用seperator 把数组 array给连接起来
-	 * 例如array= [3,8,9], seperator = "-"
-	 * 则返回值为"3-8-9"
+	 * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9"
+	 * 
 	 * @param array
 	 * @param s
 	 * @return
 	 */
-	public String join(int[] array, String seperator){
+	public String join(int[] array, String seperator) {
 		return null;
 	}
-	
 
 }
diff --git a/students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java b/students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java
new file mode 100644
index 0000000000..255267ce2c
--- /dev/null
+++ b/students/992331664/data-structure/data-structure/src/test/java/com/coding/basic/array/ArrayUtilTest.java
@@ -0,0 +1,52 @@
+package com.coding.basic.array;
+
+import java.util.Arrays;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+	ArrayUtil arrayUtil;
+	
+	int[] resultArray ;
+	
+	@Before
+	public void before(){
+		arrayUtil = new ArrayUtil();
+	}
+	
+	@After
+	public void printArray(){
+		System.out.println(Arrays.toString(resultArray));
+	}
+	
+	@Test
+	public void testReverseArray(){
+		int[] arr = {12,344,5,6,0,4,65,4,};
+		arrayUtil.reverseArray(arr);
+		resultArray = arr;
+	}
+	
+	@Test
+	public void testRemoveZero(){
+		int[] arr = {};
+		resultArray = arrayUtil.removeZero(arr);
+	}
+	
+	@Test
+	public void testMerge(){
+	}
+	
+	@Test
+	public void testGrow(){
+		int[] arr = {1,6,4,2,0};
+		resultArray = arrayUtil.grow(arr, 2);
+	}
+	
+	@Test
+	public void testFibonacci(){
+		resultArray = arrayUtil.fibonacci(15);
+	}
+}

From 9e507e2606d1a702422099d107c7f7b9a7b6dae2 Mon Sep 17 00:00:00 2001
From: Enan <enanznn@163.com>
Date: Sun, 18 Jun 2017 23:38:46 +0800
Subject: [PATCH 188/332] 1241588932

---
 .../main/java/com/coderising/ood/srp/config/Configuration.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
index e468795316..65cfff3ae9 100644
--- a/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -9,7 +9,7 @@ public class Configuration {
 
 	static Map<String,String> configurations = new HashMap<>();
 	static{
-		// TODO 从配置文件中加载配置到 map 中
+		// TODO 从配置文件中加载配置到 map  中
 		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");

From 6bb773edf80545c6503949b3f294f74c820d2ab3 Mon Sep 17 00:00:00 2001
From: doublesouth <1241588932@qq.com>
Date: Sun, 18 Jun 2017 23:54:22 +0800
Subject: [PATCH 189/332] 1241588932

---
 .../main/java/com/coderising/ood/srp/config/Configuration.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
index 65cfff3ae9..e468795316 100644
--- a/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
+++ b/students/1241588932/src/main/java/com/coderising/ood/srp/config/Configuration.java
@@ -9,7 +9,7 @@ public class Configuration {
 
 	static Map<String,String> configurations = new HashMap<>();
 	static{
-		// TODO 从配置文件中加载配置到 map  中
+		// TODO 从配置文件中加载配置到 map 中
 		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");

From f497794da0db18c9546ba9ceeae91c5c8618157c Mon Sep 17 00:00:00 2001
From: tianxianhu <329866097@qq.com>
Date: Mon, 19 Jun 2017 01:46:42 +0800
Subject: [PATCH 190/332] refactor the homework

---
 .../java/com/coderising/ood/srp/DBUtil.java   |  11 +-
 .../java/com/coderising/ood/srp/Email.java    |  49 +++++
 .../java/com/coderising/ood/srp/FileUtil.java |  36 ++++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 --
 .../com/coderising/ood/srp/PromotionMail.java | 204 +++---------------
 .../java/com/coderising/ood/srp/User.java     |  31 +++
 6 files changed, 145 insertions(+), 204 deletions(-)
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/Email.java
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java
 delete mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/329866097/src/main/java/com/coderising/ood/srp/User.java

diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
index 82e9261d18..2c5d9dd968 100644
--- a/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -10,16 +10,13 @@ public class DBUtil {
 	 * @param sql
 	 * @return
 	 */
-	public static List query(String sql){
+	public static List<User> query(String sql){
 		
-		List userList = new ArrayList();
+		List<User> 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);
+			User user = new User("User" + i, "aa@bb.com");
+			userList.add(user);
 		}
-
 		return userList;
 	}
 }
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/Email.java b/students/329866097/src/main/java/com/coderising/ood/srp/Email.java
new file mode 100644
index 0000000000..ced66562d2
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by tianxianhu on 2017/6/18.
+ */
+public class Email {
+
+    private static String smtpHost;
+    private static String altSmtpHost;
+    private static String fromAddress;
+
+    private static Configuration config;
+
+    static  {
+        config = new Configuration();
+        setDefaultConfig(config);
+    }
+
+    private static void setDefaultConfig(Configuration config) {
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public void send(User user, String product, String host) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+
+        if(user.getEmail().length() > 0) {
+            String name = user.getName();
+            String subject = "您关注的产品降价了";
+            String message = "尊敬的 " + name + ", 您关注的产品 " + product + " 降价了，欢迎购买!";
+
+            buffer.append("From:").append(fromAddress).append("\n");
+            buffer.append("To:").append(user.getEmail()).append("\n");
+            buffer.append("Subject:").append(subject).append("\n");
+            buffer.append("Content:").append(message).append("\n");
+            System.out.println(buffer.toString());
+        }
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+}
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..e8cdb97e9a
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,36 @@
+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.Map;
+
+public class FileUtil {
+
+	public static Map<String, String> readFile(String filePath) throws IOException {
+		File file = new File(filePath);
+		BufferedReader br = null;
+		Map<String, String> productMap = new HashMap<>();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String content;
+			while((content = br.readLine()) != null) {
+				String[] data = content.split(" ");
+				String productId = data[0];
+				String productDesc = data[1];
+				productMap.put(productId, productDesc);
+				System.out.println("产品ID = " + productId + "\n");
+				System.out.println("产品描述 = " + productDesc + "\n");
+			}
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+
+		return productMap;
+	}
+}
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 9f9e749af7..0000000000
--- a/students/329866097/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,18 +0,0 @@
-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/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
index d32df49c79..1273603cb8 100644
--- a/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -4,195 +4,41 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 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("src/main/resources/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) 
-				{
-					
+		Email email = new Email();
+
+		Map<String, String> productMap = FileUtil.readFile( "src/main/resources/product_promotion.txt");
+		for (Map.Entry<String, String> entry : productMap.entrySet()) {
+			String productId = entry.getKey();
+			String productDesc = entry.getValue();
+			List<User> userList = DBUtil.query(setLoadQuery(productId));
+			for(User user : userList) {
+				try {
+					email.send(user, productDesc, email.getSmtpHost());
+				} catch (Exception e) {
 					try {
-						MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
-						
-					} catch (Exception e2) 
-					{
-						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+						email.send(user, productDesc, email.getAltSmtpHost());
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
 					}
 				}
 			}
-			
-
 		}
+	}
 
-		else {
-			System.out.println("没有邮件发送");
-			
-		}
+	private static String setLoadQuery(String productID) throws Exception {
+		
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
 
+		return sendMailQuery;
 	}
 }
diff --git a/students/329866097/src/main/java/com/coderising/ood/srp/User.java b/students/329866097/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..c1df43bc45
--- /dev/null
+++ b/students/329866097/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,31 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by tianxianhu on 2017/6/18.
+ */
+public class User {
+
+    private String name;
+    private String email;
+
+    public User(String name, String email) {
+        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;
+    }
+}

From 1f4be1b7d8d426e68700b4e6d74e4b4dd673810d Mon Sep 17 00:00:00 2001
From: zoakerc <zoakerc@gmail.com>
Date: Sun, 18 Jun 2017 10:47:24 +0800
Subject: [PATCH 191/332] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9B=AE?=
 =?UTF-8?q?=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/303252800/.gitignore | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 students/303252800/.gitignore

diff --git a/students/303252800/.gitignore b/students/303252800/.gitignore
new file mode 100644
index 0000000000..41e8fd6dd8
--- /dev/null
+++ b/students/303252800/.gitignore
@@ -0,0 +1,22 @@
+target/
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.idea
+*.iws
+*.iml
+*.ipr
+*.zip
+*.class
+*.jar
+*.war
+rebel.xml
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file

From 881e737b43b182e3412397e6797ac7a3c2e11624 Mon Sep 17 00:00:00 2001
From: zoakerc <zoakerc@gmail.com>
Date: Sun, 18 Jun 2017 10:48:25 +0800
Subject: [PATCH 192/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=80=E4=B8=AA?=
 =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BD=BF=E4=B9=8B=E7=AC=A6=E5=90=88=E5=8D=95?=
 =?UTF-8?q?=E4=B8=80=E8=81=8C=E8=B4=A3=E5=8E=9F=E5=88=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/303252800/practice13-ood-srp/pom.xml |  29 +++
 .../303252800/practice13-ood-srp/readme.md    |   8 +
 .../practice13/EmailConfiguration.java        |  47 +++++
 .../practice13/MainApplication.java           |  17 ++
 .../practice13/PromotionNotifier.java         |  54 +++++
 .../practice13/PromotionProduct.java          |  52 +++++
 .../practice13/PromotionSubscriber.java       |  35 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../com/coderising/ood/srp/DBUtil.java        |  25 +++
 .../com/coderising/ood/srp/MailUtil.java      |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 13 files changed, 520 insertions(+)
 create mode 100644 students/303252800/practice13-ood-srp/pom.xml
 create mode 100644 students/303252800/practice13-ood-srp/readme.md
 create mode 100644 students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/303252800/practice13-ood-srp/pom.xml b/students/303252800/practice13-ood-srp/pom.xml
new file mode 100644
index 0000000000..7c3a372045
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.coding2017</groupId>
+    <artifactId>practice13-ood-srp</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <java.version>1.6</java.version>
+        <java.encoding>UTF-8</java.encoding>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${java.encoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/students/303252800/practice13-ood-srp/readme.md b/students/303252800/practice13-ood-srp/readme.md
new file mode 100644
index 0000000000..e5f4455a16
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/readme.md
@@ -0,0 +1,8 @@
+# practice13-ood-srp
+
+　　重构一个项目使之符合 SRP （单一职责原则）
+
+- `EmailConfiguration` 邮件配置职责类
+- `PromotionProduct` 促销产品职责类
+- `PromotionSubscriber` 促销订阅职责类
+- `PromotionNotifier` 促销通知职责类
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java
new file mode 100644
index 0000000000..3dde0cb7bc
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/EmailConfiguration.java
@@ -0,0 +1,47 @@
+package com.coding2017.practice13;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+// 邮件配置职责类
+public final class EmailConfiguration {
+
+    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";
+
+    private static final Map<String, String> configurations = new HashMap<String, String>();
+
+    static {
+        configurations.put(SMTP_SERVER, "smtp.163.com");
+        configurations.put(ALT_SMTP_SERVER, "smtp1.163.com");
+        configurations.put(EMAIL_ADMIN, "admin@company.com");
+    }
+
+    // 外部不能创建实例
+    private EmailConfiguration() {
+    }
+
+    // 外部不能更改配置
+    public static Map<String, String> getInstance() {
+        return Collections.unmodifiableMap(configurations);
+    }
+
+
+    public static String getProperty(String key) {
+        return configurations.get(key);
+    }
+
+    public static String getFromAddress() {
+        return configurations.get(EmailConfiguration.EMAIL_ADMIN);
+    }
+
+    public static String getSmtpServer() {
+        return configurations.get(EmailConfiguration.SMTP_SERVER);
+    }
+
+    public static String getAltSmtpServer() {
+        return configurations.get(EmailConfiguration.ALT_SMTP_SERVER);
+    }
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java
new file mode 100644
index 0000000000..b04ed0f0a1
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/MainApplication.java
@@ -0,0 +1,17 @@
+package com.coding2017.practice13;
+
+import java.util.List;
+
+public class MainApplication {
+
+    public static void main(String[] args) throws Exception {
+        List<PromotionProduct> products = PromotionProduct.readFromFile("com/coderising/ood/srp/product_promotion.txt");
+
+        for (PromotionProduct product : products) {
+            List<PromotionSubscriber> subscribers = PromotionSubscriber.querySubscribers(product.getProductId());
+            for (PromotionSubscriber subscriber : subscribers) {
+                PromotionNotifier.sendEmail(product, subscriber);
+            }
+        }
+    }
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java
new file mode 100644
index 0000000000..30c8a44f00
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionNotifier.java
@@ -0,0 +1,54 @@
+package com.coding2017.practice13;
+
+import java.text.MessageFormat;
+
+// 促销通知职责类
+public class PromotionNotifier {
+
+    private static String subject = "您关注的产品降价了";
+    private static String message = "尊敬的 {1} , 您关注的产品 {2} 降价了，欢迎购买!";
+
+    /**
+     * 发送邮件通知
+     *
+     * @param product    促销产品
+     * @param subscriber 订阅人
+     */
+    public static void sendEmail(PromotionProduct product, PromotionSubscriber subscriber) {
+        System.out.println("开始发送邮件");
+        String content = MessageFormat.format(message, subscriber.getSubscriber(), product.getProductDesc());
+        if (subscriber.getToAddress().length() > 0) {
+            try {
+                sendEmail(EmailConfiguration.getFromAddress(), subscriber.getToAddress(), subject, content, EmailConfiguration.getSmtpServer());
+            } catch (Exception e1) {
+                try {
+                    sendEmail(EmailConfiguration.getFromAddress(), subscriber.getToAddress(), subject, content, EmailConfiguration.getAltSmtpServer());
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+    /**
+     * 执行发送邮件
+     *
+     * @param fromAddress 发件人地址
+     * @param toAddress   收件人地址
+     * @param subject     邮件标题
+     * @param content     邮件内容
+     * @param smtpHost    smtp服务器地址
+     */
+    private static void sendEmail(String fromAddress, String toAddress, String subject, String content, 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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java
new file mode 100644
index 0000000000..59200d05bf
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionProduct.java
@@ -0,0 +1,52 @@
+package com.coding2017.practice13;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+// 促销产品职责类
+public class PromotionProduct {
+
+    /** 产品ID */
+    private String productId;
+    /** 产品描述 */
+    private String productDesc;
+
+    public String getProductId() {
+        return productId;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public static List<PromotionProduct> readFromFile(String filepath) throws IOException {
+        List<PromotionProduct> products = new ArrayList<PromotionProduct>();
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(new File(filepath)));
+            String line = null;
+            while ((line = br.readLine()) != null) {
+                String[] data = line.split(" ");
+                PromotionProduct product = new PromotionProduct();
+                product.productId = data[0];
+                product.productDesc = data[1];
+                products.add(product);
+                System.out.println("产品ID = " + product.getProductId() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+            }
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            if (br != null) {
+                br.close();
+            }
+        }
+        return products;
+    }
+
+
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java
new file mode 100644
index 0000000000..e58760e6ca
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/java/com/coding2017/practice13/PromotionSubscriber.java
@@ -0,0 +1,35 @@
+package com.coding2017.practice13;
+
+import java.util.ArrayList;
+import java.util.List;
+
+// 促销订阅人职责类
+public class PromotionSubscriber {
+
+    /** 订阅人邮件地址 */
+    private String toAddress;
+    /** 订阅人姓名 */
+    private String subscriber;
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public String getSubscriber() {
+        return subscriber;
+    }
+
+    /**
+     * 查询促销产品订阅人列表
+     *
+     * @param productId 产品ID
+     * @return 订阅人列表
+     */
+    public static List<PromotionSubscriber> querySubscribers(String productId) {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productId + "' "
+                + "and send_mail=1 ";
+        System.out.println("loadQuery set");
+        return new ArrayList<PromotionSubscriber>();
+    }
+}
diff --git a/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/Configuration.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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<String,String> 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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/ConfigurationKeys.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/DBUtil.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/MailUtil.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/PromotionMail.java b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/src/main/resources/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/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/product_promotion.txt b/students/303252800/practice13-ood-srp/src/main/resources/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/303252800/practice13-ood-srp/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

From 3a0199d01cd6fe18969f3ca1c91320351d14b406 Mon Sep 17 00:00:00 2001
From: doudou <coderlmm@gmail.com>
Date: Mon, 19 Jun 2017 09:53:42 +0800
Subject: [PATCH 193/332] homework

---
 students/759412759/{ => ood-assignment}/pom.xml                 | 0
 .../src/main/java/com/coderising/ood/srp/Configuration.java     | 0
 .../src/main/java/com/coderising/ood/srp/ConfigurationKeys.java | 0
 .../src/main/java/com/coderising/ood/srp/DBUtil.java            | 0
 .../src/main/java/com/coderising/ood/srp/Mail.java              | 0
 .../src/main/java/com/coderising/ood/srp/MailUtil.java          | 0
 .../src/main/java/com/coderising/ood/srp/Product.java           | 0
 .../src/main/java/com/coderising/ood/srp/ProductService.java}   | 2 +-
 .../src/main/java/com/coderising/ood/srp/PromotionMail.java     | 2 +-
 .../src/main/java/com/coderising/ood/srp/UserService.java       | 0
 .../src/main/java/com/coderising/ood/srp/product_promotion.txt  | 0
 11 files changed, 2 insertions(+), 2 deletions(-)
 rename students/759412759/{ => ood-assignment}/pom.xml (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/Configuration.java (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/DBUtil.java (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/Mail.java (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/MailUtil.java (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/Product.java (100%)
 rename students/759412759/{src/main/java/com/coderising/ood/srp/FileUtil.java => ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java} (96%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/PromotionMail.java (97%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/UserService.java (100%)
 rename students/759412759/{ => ood-assignment}/src/main/java/com/coderising/ood/srp/product_promotion.txt (100%)

diff --git a/students/759412759/pom.xml b/students/759412759/ood-assignment/pom.xml
similarity index 100%
rename from students/759412759/pom.xml
rename to students/759412759/ood-assignment/pom.xml
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/Configuration.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/Mail.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/Mail.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/MailUtil.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/Product.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/Product.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
similarity index 96%
rename from students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
index 6a7eeba44c..18674e0101 100644
--- a/students/759412759/src/main/java/com/coderising/ood/srp/FileUtil.java
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
@@ -5,7 +5,7 @@
 /**
  * Created by Tudou on 2017/6/16.
  */
-public class FileUtil {
+public class ProductService {
 
     public static Product loadProductFromFile(String filePath) throws IOException {
         Product product = new Product();
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
similarity index 97%
rename from students/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 5dfa3853c8..015b68ff10 100644
--- a/students/759412759/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -15,7 +15,7 @@ public static void main(String[] args) throws Exception {
         PromotionMail pe = new PromotionMail();
 
         String path = "F:\\IDEA_PRO_01\\coderrising\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
-        Product product = FileUtil.loadProductFromFile(path);
+        Product product = ProductService.loadProductFromFile(path);
         List<HashMap<String, String>> list = userService.loadMailingList(product.getProductID());
 
         pe.sendEMails(list,product,Boolean.FALSE);
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/UserService.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/UserService.java
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java
diff --git a/students/759412759/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
similarity index 100%
rename from students/759412759/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

From a1cb65dd1367f8cb6e3e38da1156ad10473efa2d Mon Sep 17 00:00:00 2001
From: yuyingzhi <yuyz@mdf.com>
Date: Mon, 19 Jun 2017 10:09:41 +0800
Subject: [PATCH 194/332] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=96=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../81681981/first_OOP_homework/readme.txt    | 20 +++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/students/81681981/first_OOP_homework/readme.txt b/students/81681981/first_OOP_homework/readme.txt
index 0ddf999fd4..0330532c81 100644
--- a/students/81681981/first_OOP_homework/readme.txt
+++ b/students/81681981/first_OOP_homework/readme.txt
@@ -1,11 +1,11 @@
-ҵ˵
+作业说明
 
-༰
-1.conifgurationKeys.java ʼͷϢ
-2.User.java  ӦûϢû䣩 
-3.޸DBUtil.java ݿ࣬Ѽֵ ޸ΪUser
-4.Email.java άʼ͵ǰϢʼ⣬ʼݣsmtphost,altSmtpHost,fromAddress,subject,message
-5.Product.java άƷϢû
-6.Message.javaάҪ͵
-7.޸PromotionMail.java ܣȡƷϢ֯Ҫ͵ݷװΪMessage󣬻ȡòƷӦĶûMailUtil.java ʼ
-8.MailUtil.java 
\ No newline at end of file
+类及功能
+1.conifgurationKeys.java 邮件发送服务器配置信息
+2.新增User.java  对应订阅用户信息（用户名，邮箱） 
+3.修改DBUtil.java 数据库操作类，把键值 修改为User对象
+4.新增Email.java 维护邮件发送的前置信息和邮件标题，邮件内容，smtphost,altSmtpHost,fromAddress,subject,message
+5.新增Product.java 维护产品信息及订阅用户
+6.新增Message.java　维护要发送的内容
+7.修改PromotionMail.java 功能：读取产品信息，组织要发送的内容封装为Message对象，获取该产品对应的订阅用户，调用MailUtil.java 发送邮件
+8.MailUtil.java 负责发送
\ No newline at end of file

From 6679cda086e49e2add617c334aed407eb079a89c Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 19 Jun 2017 11:18:30 +0800
Subject: [PATCH 195/332] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?=
 =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 coding2017 | 1 -
 1 file changed, 1 deletion(-)
 delete mode 160000 coding2017

diff --git a/coding2017 b/coding2017
deleted file mode 160000
index bdbfcff8c9..0000000000
--- a/coding2017
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit bdbfcff8c9b106c07b6cbd6702fe97accc1dc90b

From 4beaab48aefd1cfe68b994aa33b1fcd189e1335d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BE=90=E9=98=B3=E9=98=B3?= <1425809544@qq.com>
Date: Mon, 19 Jun 2017 11:28:27 +0800
Subject: [PATCH 196/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=82=AE=E4=BB=B6?=
 =?UTF-8?q?=E5=8F=91=E9=80=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/config/Configuration.java  | 23 +++++++
 .../ood/config/ConfigurationKeys.java         |  9 +++
 .../coderising/ood/file/product_promotion.txt |  4 ++
 .../java/com/coderising/ood/pojo/Email.java   | 49 +++++++++++++++
 .../ood/pojo/EmailServiceConfig.java          | 45 +++++++++++++
 .../java/com/coderising/ood/pojo/Product.java | 37 +++++++++++
 .../java/com/coderising/ood/pojo/User.java    | 29 +++++++++
 .../coderising/ood/service/EmailService.java  | 55 ++++++++++++++++
 .../ood/service/ProductService.java           | 52 +++++++++++++++
 .../coderising/ood/service/PromotionMail.java | 63 +++++++++++++++++++
 .../coderising/ood/service/UserService.java   | 44 +++++++++++++
 11 files changed, 410 insertions(+)
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
 create mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java

diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
new file mode 100644
index 0000000000..a3f51236bc
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.config;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String,String>();
+	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/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..e7c449f10c
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.config;
+
+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/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/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/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
new file mode 100644
index 0000000000..ed92dfec0b
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:44
+ **/
+public class Email {
+
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Email() {
+    }
+
+    public Email(String toAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public Email setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+        return this;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public Email setSubject(String subject) {
+        this.subject = subject;
+        return this;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Email setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
new file mode 100644
index 0000000000..091583b3ed
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
@@ -0,0 +1,45 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 10:00
+ **/
+public class EmailServiceConfig {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String fromAddress;
+
+    public EmailServiceConfig(String smtpHost, String altSmtpHost, String fromAddress) {
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public EmailServiceConfig setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+        return this;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public EmailServiceConfig setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+        return this;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public EmailServiceConfig setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+        return this;
+    }
+}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
new file mode 100644
index 0000000000..f869bf1f12
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.pojo;
+
+/**
+ * 产品类
+ *
+ * @author xyy
+ * @create 2017-06-19 9:30
+ **/
+public class Product {
+
+
+    private String productID;
+    private String productDesc;
+
+
+
+
+
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public Product setProductID(String productID) {
+        this.productID = productID;
+        return this;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public Product setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+        return this;
+    }
+}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
new file mode 100644
index 0000000000..69975f6cbd
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:48
+ **/
+public class User {
+
+    private String name;
+    private String email;
+
+    public String getName() {
+        return name;
+    }
+
+    public User setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public User setEmail(String email) {
+        this.email = email;
+        return this;
+    }
+}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
new file mode 100644
index 0000000000..2fece21ec2
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Email;
+import com.coderising.ood.pojo.EmailServiceConfig;
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.io.IOException;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:44
+ **/
+public class EmailService {
+
+
+    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());
+
+    }
+
+
+    public static Email configureEMail(User user, Product product) throws IOException {
+        String toAddress = user.getEmail();
+        String name = "";
+        if (toAddress.length() > 0) {
+            name = user.getName();
+        }
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        Email email = new Email(toAddress, subject, message);
+        return email;
+    }
+
+    public static void sendEmail(EmailServiceConfig emailServiceConfig, Email email, boolean debug) {
+        try {
+            if (email.getToAddress().length() > 0) {
+                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getSmtpHost(), debug);
+            }
+        } catch (Exception e) {
+            try {
+                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getAltSmtpHost(), debug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
new file mode 100644
index 0000000000..ccacef7bce
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:34
+ **/
+public class ProductService {
+
+
+    public static List<Product> getAllProductFromFile(File file) throws IOException {
+        List productList = new ArrayList();
+        BufferedReader br = null;
+
+        try {
+
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+                System.out.println("产品ID = " + product.getProductID() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+                productList.add(product);
+            }
+
+            return productList;
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+        return null;
+    }
+
+}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
new file mode 100644
index 0000000000..f89aff500a
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.config.Configuration;
+import com.coderising.ood.config.ConfigurationKeys;
+import com.coderising.ood.pojo.Email;
+import com.coderising.ood.pojo.EmailServiceConfig;
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        File file = new File("D:\\product_promotion.txt");
+        //1.获得产品信息
+        ProductService productService = new ProductService();
+        List productList = productService.getAllProductFromFile(file);
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(productList, emailDebug);
+    }
+
+
+
+    public PromotionMail(List productList, boolean mailDebug) throws Exception {
+        //2.邮件服务器配置
+        Configuration config = new Configuration();
+        EmailServiceConfig emailServiceConfig = new EmailServiceConfig(config.getProperty(ConfigurationKeys.SMTP_SERVER), config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER), config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        //3.发送邮件
+        sendEMails(mailDebug, productList, emailServiceConfig);
+
+    }
+
+
+    public void sendEMails(boolean debug, List<Product> productList, EmailServiceConfig emailServiceConfig) throws Exception {
+        System.out.println("开始发送邮件");
+        if (productList != null) {
+            for (Product product : productList) {
+                List<User> userList = UserService.getSendEmailUser(product);
+                if (null != userList && userList.size() > 0) {
+                    for (User user : userList) {
+                        Email email = EmailService.configureEMail((user), product);
+                        if (email.getToAddress().length() > 0) {
+                            EmailService.sendEmail(emailServiceConfig,email,debug);
+                        }
+                    }
+                }
+            }
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+
+}
+
+
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
new file mode 100644
index 0000000000..a7c6d8fe38
--- /dev/null
+++ b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:48
+ **/
+public class UserService {
+
+
+    public static List getSendEmailUser(Product product) throws Exception {
+
+
+        setLoadQuery(product);
+
+        List<User> userList = new ArrayList();
+
+        for (int i = 0; i < 3; i++) {
+            User user = new User();
+            user.setName("user" + i);
+            user.setEmail(user.getName() + "@qq.com");
+            userList.add(user);
+        }
+        return userList;
+    }
+
+
+    //通过产品id获取关注了产品的用户
+    public static void setLoadQuery(Product product) throws Exception {
+
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() + "' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set");
+    }
+
+
+}

From ae97f0ebc6037fa194b03177fed0cf480e58b02c Mon Sep 17 00:00:00 2001
From: sheng <1158154002@qq.com>
Date: Mon, 19 Jun 2017 13:02:45 +0800
Subject: [PATCH 197/332] 02 ocp

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 11 ++++++++++
 .../java/com/coderising/ood/ocp/EmailLog.java | 10 +++++++++
 .../com/coderising/ood/ocp/LogMethod.java     |  5 +++++
 .../java/com/coderising/ood/ocp/LogType.java  |  5 +++++
 .../java/com/coderising/ood/ocp/Logger.java   | 21 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/PrintLog.java | 10 +++++++++
 .../java/com/coderising/ood/ocp/RawLog.java   | 10 +++++++++
 .../coderising/ood/ocp/RawLogWithDate.java    | 12 +++++++++++
 .../java/com/coderising/ood/ocp/SmsLog.java   | 10 +++++++++
 9 files changed, 94 insertions(+)
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java

diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..9471308b5b
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+import java.util.Date;
+
+public class DateUtil {
+	
+	public static String getCurrentDateAsString() {
+		
+		return new Date().toString();
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java
new file mode 100644
index 0000000000..197f08d2db
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/EmailLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class EmailLog implements LogMethod{
+
+	@Override
+	public void send(String msg) {
+		System.out.println("Email send "+msg);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java
new file mode 100644
index 0000000000..f813444cd8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogMethod.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface LogMethod {
+	void send(String msg);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java
new file mode 100644
index 0000000000..ed2b6fc7e6
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/LogType.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface LogType {
+	String getMsg(String msg);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..09fae40095
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+	LogType type;
+	LogMethod method;
+
+	public Logger(LogType logType, LogMethod logMethod) {
+		this.type = logType;
+		this.method = logMethod;
+	}
+
+	public void log(String msg) {
+		method.send(type.getMsg(msg));
+	}
+	
+	public static void main(String[] args) {
+		Logger logger=new Logger(new RawLog(), new EmailLog());
+		logger.log("hello world !");
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java
new file mode 100644
index 0000000000..6f1b379707
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/PrintLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class PrintLog implements LogMethod{
+
+	@Override
+	public void send(String msg) {
+		System.out.println("Print Log "+msg);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java
new file mode 100644
index 0000000000..88f1811f2e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class RawLog implements LogType {
+
+	@Override
+	public String getMsg(String msg) {
+		return msg;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java
new file mode 100644
index 0000000000..c791fe142d
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/RawLogWithDate.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class RawLogWithDate implements LogType {
+
+	@Override
+	public String getMsg(String msg) {
+		String txtDate = DateUtil.getCurrentDateAsString();
+		msg = txtDate + ": " + msg;
+		return msg;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java b/students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java
new file mode 100644
index 0000000000..8bca6372ba
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/ood/ocp/SmsLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SmsLog implements LogMethod{
+
+	@Override
+	public void send(String msg) {
+		System.out.println("SMS send "+msg);
+	}
+
+}

From c6853836ca933730234b79272014392b3e1de68b Mon Sep 17 00:00:00 2001
From: penglei <leipengzj@163.com>
Date: Mon, 19 Jun 2017 14:17:05 +0800
Subject: [PATCH 198/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=90=8E=E7=9A=84?=
 =?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/com/leipengzj/Configuration.java      |  31 ++++
 .../799298900/src/com/leipengzj/DBUtil.java   |  25 ++++
 .../799298900/src/com/leipengzj/MailInfo.java |  92 ++++++++++++
 .../799298900/src/com/leipengzj/MailUtil.java |  18 +++
 .../src/com/leipengzj/PromotionMail.java      | 139 ++++++++++++++++++
 .../src/com/leipengzj/product_promotion.txt   |   4 +
 6 files changed, 309 insertions(+)
 create mode 100644 students/799298900/src/com/leipengzj/Configuration.java
 create mode 100644 students/799298900/src/com/leipengzj/DBUtil.java
 create mode 100644 students/799298900/src/com/leipengzj/MailInfo.java
 create mode 100644 students/799298900/src/com/leipengzj/MailUtil.java
 create mode 100644 students/799298900/src/com/leipengzj/PromotionMail.java
 create mode 100644 students/799298900/src/com/leipengzj/product_promotion.txt

diff --git a/students/799298900/src/com/leipengzj/Configuration.java b/students/799298900/src/com/leipengzj/Configuration.java
new file mode 100644
index 0000000000..26665ad1a9
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/Configuration.java
@@ -0,0 +1,31 @@
+package com.leipengzj;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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);
+	}
+
+}
+
+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/799298900/src/com/leipengzj/DBUtil.java b/students/799298900/src/com/leipengzj/DBUtil.java
new file mode 100644
index 0000000000..ec8ae4aba9
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/DBUtil.java
@@ -0,0 +1,25 @@
+package com.leipengzj;
+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/799298900/src/com/leipengzj/MailInfo.java b/students/799298900/src/com/leipengzj/MailInfo.java
new file mode 100644
index 0000000000..ecaa0dac9b
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/MailInfo.java
@@ -0,0 +1,92 @@
+package com.leipengzj;
+
+/**
+ * Created by pl on 2017/6/19.
+ */
+public class MailInfo {
+
+    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;
+
+    public String getSendMailQuery() {
+        return sendMailQuery;
+    }
+
+    public void setSendMailQuery(String sendMailQuery) {
+        this.sendMailQuery = sendMailQuery;
+    }
+
+    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 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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    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/799298900/src/com/leipengzj/MailUtil.java b/students/799298900/src/com/leipengzj/MailUtil.java
new file mode 100644
index 0000000000..42d4329f96
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/MailUtil.java
@@ -0,0 +1,18 @@
+package com.leipengzj;
+
+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/799298900/src/com/leipengzj/PromotionMail.java b/students/799298900/src/com/leipengzj/PromotionMail.java
new file mode 100644
index 0000000000..5d152ac3cb
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/PromotionMail.java
@@ -0,0 +1,139 @@
+package com.leipengzj;
+
+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 {
+		MailInfo mi = new MailInfo();
+
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		readFile(mi,file);
+
+
+		config = new Configuration();
+
+		mi.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mi.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mi.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+		String sql = "Select name from subscriptions "
+				+ "where product_id= '" + mi.getProductID() +"' "
+				+ "and send_mail=1 ";
+		//查询出邮件列表
+		List query = DBUtil.query(sql);
+
+		sendEMails(mi,mailDebug, query);
+
+		
+	}
+
+
+	//读取产品信息
+	protected void readFile(MailInfo mi,File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			mi.setProductID(data[0]);
+			mi.setProductDesc(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();
+		}
+	}
+
+    //配置邮件并设置发送的邮件内容
+	protected void configureEMail(HashMap userInfo,MailInfo mi) throws IOException
+	{
+		String toAddress = (String) userInfo.get(EMAIL_KEY);
+		String name = (String) userInfo.get(NAME_KEY);
+		if (toAddress.length() > 0){
+		   mi.setSubject("您关注的产品降价了");
+		   mi.setMessage("尊敬的 "+name+", 您关注的产品 " + mi.getProductDesc() + " 降价了，欢迎购买!");
+		}
+
+	}
+
+
+	protected void sendEMails(MailInfo mi,boolean debug, List mailingList) throws IOException
+	{
+
+		System.out.println("开始发送邮件");
+	
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				configureEMail((HashMap) iter.next(),mi);
+				try 
+				{
+					if (mi.getToAddress().length() > 0)
+						MailUtil.sendEmail(mi.getToAddress(), mi.getToAddress(), mi.getSubject(), mi.getMessage(), mi.getSmtpHost(), debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						MailUtil.sendEmail(mi.getToAddress(), mi.getToAddress(), mi.getSubject(), mi.getMessage(), mi.getAltSmtpHost(), debug);
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+		}
+		else {
+			System.out.println("没有邮件发送");
+		}
+
+	}
+}
diff --git a/students/799298900/src/com/leipengzj/product_promotion.txt b/students/799298900/src/com/leipengzj/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/799298900/src/com/leipengzj/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From a2afd81213946e181da99d4f93dfa9fc21b51644 Mon Sep 17 00:00:00 2001
From: doudou <coderlmm@gmail.com>
Date: Mon, 19 Jun 2017 14:42:24 +0800
Subject: [PATCH 199/332] homework

---
 .gitignore                                    |  2 --
 .../com/coderising/ood/ocp/DateFormater.java  | 14 +++++++++++++
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 ++++++++++
 .../java/com/coderising/ood/ocp/Formater.java | 12 +++++++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 20 +++++++++++++++++++
 .../com/coderising/ood/ocp/MailPrintUtil.java | 10 ++++++++++
 .../java/com/coderising/ood/ocp/Printer.java  | 11 ++++++++++
 .../com/coderising/ood/ocp/SMSPrintUtil.java  |  9 +++++++++
 8 files changed, 86 insertions(+), 2 deletions(-)
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java
 create mode 100644 students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java

diff --git a/.gitignore b/.gitignore
index 4b65de1971..ccf385a085 100644
--- a/.gitignore
+++ b/.gitignore
@@ -280,8 +280,6 @@ target
 liuxin/.DS_Store
 liuxin/src/.DS_Store
 
-students/*
-!students/785396327
 
 
 
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java
new file mode 100644
index 0000000000..18b61a77b3
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateFormater.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.ocp;
+
+/**
+ * 日期类型格式化模板
+ * Created by Tudou on 2017/6/19.
+ */
+public class DateFormater extends Formater {
+
+    @Override
+    public String formatMessage(String message) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        return txtDate + " : " + message;
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/759412759/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/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java
new file mode 100644
index 0000000000..7a94fea749
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Formater.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * 格式化打印参数基类
+ * Created by Tudou on 2017/6/19.
+ */
+public class Formater {
+
+    public String formatMessage(String message){
+        return message;
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..a9f62d6a66
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+
+    private Printer printer;
+    private Formater formater;
+
+
+    public Logger(Printer printer, Formater formater) {
+        this.printer = printer;
+        this.formater = formater;
+    }
+
+
+    public void log(String msg) {
+        String logMsg = formater.formatMessage(msg);
+        printer.print(logMsg);
+    }
+}
+
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java
new file mode 100644
index 0000000000..d522e5e7d2
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/MailPrintUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+
+public class MailPrintUtil extends Printer {
+
+	@Override
+	public void print(String msg) {
+
+	}
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java
new file mode 100644
index 0000000000..caa28fbf0c
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/Printer.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by Tudou on 2017/6/19.
+ */
+public class Printer {
+
+    public void print(String msg){
+        System.out.println(msg);
+    }
+}
diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java
new file mode 100644
index 0000000000..204256f44b
--- /dev/null
+++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSPrintUtil.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class SMSPrintUtil extends Printer {
+
+	@Override
+	public void print(String msg) {
+
+	}
+}

From cf8de7eb7d6d595fe5cf1ad0a89353af914ca54d Mon Sep 17 00:00:00 2001
From: orajavac <oraclegit@126.com>
Date: Mon, 19 Jun 2017 15:09:41 +0800
Subject: [PATCH 200/332] 20170619_1509

---
 .../orajavac/coding2017/ood/ocp/DateUtil.java |   8 +
 .../orajavac/coding2017/ood/ocp/Logger.java   |   6 +
 .../coding2017/ood/ocp/LoggerManagement.java  |  20 +++
 .../orajavac/coding2017/ood/ocp/MailUtil.java |   8 +
 .../coding2017/ood/ocp/PrintUtil.java         |   8 +
 .../orajavac/coding2017/ood/ocp/RawLog.java   |   7 +
 .../coding2017/ood/ocp/RawLogWithDate.java    |   8 +
 .../coding2017/ood/ocp/RawLogger.java         |   5 +
 .../orajavac/coding2017/ood/ocp/SMSUtil.java  |   8 +
 .../orajavac/coding2017/ood/srp/DBUtil.java   |  10 ++
 .../orajavac/coding2017/ood/srp/FileUtil.java |  31 ++++
 .../orajavac/coding2017/ood/srp/Mail.java     |  49 ++++++
 .../orajavac/coding2017/ood/srp/MailUtil.java |  81 +++++++++-
 .../orajavac/coding2017/ood/srp/Product.java  |  18 +++
 .../coding2017/ood/srp/PromotionMail.java     | 150 ++----------------
 15 files changed, 275 insertions(+), 142 deletions(-)
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java
 create mode 100644 students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java

diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..d8bbcd124c
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/DateUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class DateUtil {
+public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java
new file mode 100644
index 0000000000..be360ccdd4
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/Logger.java
@@ -0,0 +1,6 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public interface Logger {
+
+	public void send(String msg);
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java
new file mode 100644
index 0000000000..c658bd33ea
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/LoggerManagement.java
@@ -0,0 +1,20 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LoggerManagement {
+
+	public void log(String msg){
+		
+		List<RawLogger> rawlog = new ArrayList<RawLogger>();
+		for (RawLogger r : rawlog){
+			r.log(msg);
+		}
+		
+		List<Logger> logger = new ArrayList<Logger>();
+		for (Logger l : logger){
+			l.send(msg);
+		}
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..8cfd91064d
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/MailUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class MailUtil implements Logger{
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java
new file mode 100644
index 0000000000..d83397c1d6
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/PrintUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class PrintUtil implements Logger{
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java
new file mode 100644
index 0000000000..ad6cbb7510
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLog.java
@@ -0,0 +1,7 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class RawLog implements RawLogger{
+	public void log(String msg){
+		String logMsg = msg;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java
new file mode 100644
index 0000000000..f9640769ee
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogWithDate.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class RawLogWithDate implements RawLogger{
+	public void log(String msg){
+		String txtDate = DateUtil.getCurrentDateAsString();
+		String logMsg = txtDate + ": " + msg;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java
new file mode 100644
index 0000000000..d4ad9eacd3
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/RawLogger.java
@@ -0,0 +1,5 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public interface RawLogger {
+	public void log(String msg);
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..82eb15bed9
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/ocp/SMSUtil.java
@@ -0,0 +1,8 @@
+package com.github.orajavac.coding2017.ood.ocp;
+
+public class SMSUtil implements Logger{
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
index c4d5f8a65d..528ff9321d 100644
--- a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java
@@ -22,4 +22,14 @@ public static List query(String sql){
 
 		return userList;
 	}
+	
+	public static void setLoadQuery(String productID) throws Exception {
+		
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		
+		System.out.println("loadQuery set");
+	}
 }
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java
new file mode 100644
index 0000000000..14f6443bbf
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/FileUtil.java
@@ -0,0 +1,31 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileUtil {
+	public static Product readFile(File file) throws IOException // @02C
+	{
+		BufferedReader br = null;
+		Product p = new Product();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			p.setProductID(data[0]); 
+			p.setProductDesc(data[1]); 
+			
+			System.out.println("产品ID = " + p.getProductID() + "\n");
+			System.out.println("产品描述 = " + p.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return p;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java
new file mode 100644
index 0000000000..46f5a92db1
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Mail.java
@@ -0,0 +1,49 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class Mail {
+	private String smtpHost = null;
+	private String altSmtpHost = null; 
+	private String fromAddress = null;
+	private String toAddress = null;
+	private String subject = null;
+	private String message = null;
+	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 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 getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
index c9614ebfc5..aa16293062 100644
--- a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java
@@ -1,7 +1,15 @@
 package com.github.orajavac.coding2017.ood.srp;
 
-public class MailUtil {
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 
+public class MailUtil {
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+	
 	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
 			boolean debug) {
 		//假装发了一封邮件
@@ -13,6 +21,77 @@ public static void sendEmail(String toAddress, String fromAddress, String subjec
 		System.out.println(buffer.toString());
 		
 	}
+	
+	public static String setSMTPHost(Configuration config) 
+	{
+		return config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+
+	
+	public static String setAltSMTPHost(Configuration config) 
+	{
+		return config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
 
 	
+	public static String setFromAddress(Configuration config) 
+	{
+		return config.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+	
+	public static void setMessage(HashMap userInfo,Product p,Mail mail) throws IOException 
+	{
+		
+		String name = (String) userInfo.get(NAME_KEY);
+		
+		mail.setSubject("您关注的产品降价了");
+		
+		String message = "尊敬的 "+name+", 您关注的产品 " + p.getProductDesc() + " 降价了，欢迎购买!" ;		
+		mail.setMessage(message);		
+		
+
+	}
+	
+	public static void sendEMails(boolean debug, List mailingList,Product p,Mail mail) throws IOException 
+	{
+
+		System.out.println("开始发送邮件");
+		
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				HashMap userInfo = (HashMap) iter.next();
+				String toAddress = (String) userInfo.get(EMAIL_KEY); 
+				if (toAddress.length() > 0) 
+					setMessage(userInfo,p,mail);
+				try 
+				{
+					if (toAddress.length() > 0)
+						MailUtil.sendEmail(toAddress, mail.getFromAddress(), mail.getSubject(), mail.getMessage(), mail.getSmtpHost(), debug);
+				} 
+				catch (Exception e) 
+				{
+					
+					try {
+						MailUtil.sendEmail(toAddress, mail.getFromAddress(), mail.getSubject(), mail.getMessage(), mail.getAltSmtpHost(), debug); 
+						
+					} catch (Exception e2) 
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+					}
+				}
+			}
+			
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
+
+	}
+	
 }
diff --git a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java
new file mode 100644
index 0000000000..02345d790c
--- /dev/null
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Product.java
@@ -0,0 +1,18 @@
+package com.github.orajavac.coding2017.ood.srp;
+
+public class Product {
+	private String productID = null;
+	private String productDesc = null;
+	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/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
index db982d9f34..53e7e27471 100644
--- a/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
+++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java
@@ -15,22 +15,15 @@ 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 Mail mail = new Mail();
 
-	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 {
@@ -46,154 +39,29 @@ public static void main(String[] args) throws Exception {
 	public PromotionMail(File file, boolean mailDebug) throws Exception {
 		
 		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
-		readFile(file);
+		Product p = FileUtil.readFile(file);
 
 		
 		config = new Configuration();
 		
-		setSMTPHost();
-		setAltSMTPHost(); 
+		mail.setSmtpHost(MailUtil.setSMTPHost(config));
+		mail.setAltSmtpHost(MailUtil.setAltSMTPHost(config)); 
 	
 
-		setFromAddress();
+		mail.setFromAddress(MailUtil.setFromAddress(config));
 
 		
-		setLoadQuery();
+		DBUtil.setLoadQuery(p.getProductID());
 		
-		sendEMails(mailDebug, loadMailingList()); 
+		MailUtil.sendEMails(mailDebug, loadMailingList(),p,mail); 
 
 		
 	}
 
-
-
-
-	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("没有邮件发送");
-			
-		}
-
-	}
 }

From b82b6b49a39dbd1aaf50d216b0f3309a3d23710a Mon Sep 17 00:00:00 2001
From: boxin <begin161109@163.com>
Date: Mon, 19 Jun 2017 15:10:54 +0800
Subject: [PATCH 201/332] SRP 1.0-version

---
 .../com/coderising/ood/srp/Configuration.java | 23 +++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../com/coderising/ood/srp/MailContent.java   | 69 +++++++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 62 +++++++++++++++++
 .../coderising/ood/srp/bean/ProductInfo.java  | 33 +++++++++
 .../com/coderising/ood/srp/bean/UserInfo.java | 28 ++++++++
 .../ood/srp/dao/ProductInfoDAO.java           | 48 +++++++++++++
 .../coderising/ood/srp/dao/UserInfoDAO.java   | 58 ++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 .../com/coderising/ood/srp/test/MainTest.java | 60 ++++++++++++++++
 .../com/coderising/ood/srp/util/DBUtil.java   | 25 +++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 18 +++++
 12 files changed, 437 insertions(+)
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ProductInfo.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/UserInfo.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductInfoDAO.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserInfoDAO.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java

diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/349184132/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<String,String> 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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/349184132/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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
new file mode 100644
index 0000000000..fbc4702737
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
@@ -0,0 +1,69 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by wang on 2017/6/17.
+ */
+public class MailContent {
+
+    private Configuration config = new Configuration();
+
+    private String smtpHost;
+
+    private String altSmtpHost;
+
+    private String fromAddress;
+
+    private String subject;
+
+    private String message;
+
+    public void setMailContent(String uName, String productDesc) {
+        setSMTPHost();
+        setAltSMTPHost();
+        setFromAddress();
+        setMessage(uName,productDesc);
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    private void setSMTPHost() {
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+
+    }
+
+    private void setAltSMTPHost() {
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+
+
+    private void setFromAddress() {
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+
+    public void setMessage(String uName, String productDesc){
+
+
+        subject = "您关注的产品降价了";
+        message = "尊敬的 "+uName+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;
+
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..2c8c71cfc6
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,62 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.bean.ProductInfo;
+import com.coderising.ood.srp.bean.UserInfo;
+
+import java.util.List;
+
+/**
+ * Created by wang on 2017/6/17.
+ */
+
+/**
+ * 发送邮件类
+ */
+public class PromotionMail {
+
+    private List<ProductInfo> proInfo;
+    private List<UserInfo> userInfo;
+    private MailContent mailContent;
+
+    public PromotionMail(){
+
+    }
+
+
+
+    public PromotionMail(List<ProductInfo> proInfo, List<UserInfo> userInfo, MailContent mailContent) {
+        this.proInfo = proInfo;
+        this.userInfo = userInfo;
+        this.mailContent = mailContent;
+    }
+
+    public void sendEMail(){
+
+        sendEMail(false);
+
+    }
+
+    public void sendEMail(boolean debug){
+        String productDesc = proInfo.get(0).getProductDesc();
+
+
+        System.out.println("开始发送邮件：");
+        for(UserInfo u : userInfo) {
+
+            String name = u.getName();
+            String toAddress = u.getEmail();
+
+            mailContent.setMailContent(name,productDesc);
+
+            String fromAddress = mailContent.getFromAddress();
+            String subject = mailContent.getSubject();
+            String message = mailContent.getMessage();
+            String smtpHost = mailContent.getSmtpHost();
+
+
+            MailUtil.sendEmail(toAddress,fromAddress,subject,message,smtpHost,debug);
+        }
+        System.out.println("邮件发送完毕！");
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ProductInfo.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ProductInfo.java
new file mode 100644
index 0000000000..1d18216e7c
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/ProductInfo.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp.bean;
+
+/**
+ * Created by wang on 2017/6/17.
+ */
+
+/**
+ * 产品信息
+ */
+public class ProductInfo {
+
+    private String ProductID;
+    private String ProductDesc;
+
+    public String getProductID() {
+        return ProductID;
+    }
+
+    public String getProductDesc() {
+        return ProductDesc;
+    }
+
+    public void setProductID(String productID) {
+        ProductID = productID;
+    }
+
+    public void setProductDesc(String productDesc) {
+        ProductDesc = productDesc;
+    }
+
+
+
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/UserInfo.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/UserInfo.java
new file mode 100644
index 0000000000..d8966fa49d
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/bean/UserInfo.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp.bean;
+
+/**用户信息类
+ * Created by wang on 2017/6/17.
+ */
+
+
+public class UserInfo {
+
+    private String name;
+    private String 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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductInfoDAO.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductInfoDAO.java
new file mode 100644
index 0000000000..fd4cbcf6d0
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductInfoDAO.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.bean.ProductInfo;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**产品信息数据访问类
+ * Created by wang on 2017/6/17.
+ */
+public class ProductInfoDAO {
+
+    private List<ProductInfo> productList = new ArrayList<>();
+
+
+    public void readFile(File file) {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String newLine = br.readLine();
+
+            while(newLine!=null && newLine!=" ") {
+                String temp = newLine;
+                String[] datas = temp.split(" ");
+
+                addProductInfo(datas);
+                newLine = br.readLine();
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void addProductInfo(String[] datas) {
+
+        ProductInfo product = new ProductInfo();
+        product.setProductID(datas[0]);
+        product.setProductDesc(datas[1]);
+        this.productList.add(product);
+    }
+
+    public List<ProductInfo> getProductList(){
+        return this.productList;
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserInfoDAO.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserInfoDAO.java
new file mode 100644
index 0000000000..30293b62b6
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserInfoDAO.java
@@ -0,0 +1,58 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.bean.UserInfo;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Created by wang on 2017/6/17.
+ */
+public class UserInfoDAO {
+
+    private String sendMailQuery;
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+    private List<UserInfo> infos = new ArrayList<>();
+
+    public UserInfoDAO() {}
+
+
+    /**
+     * 查询用户信息，封装UserInfo对象 然后返回 List<UserInfo>
+     * @param productID
+     * @return
+     */
+    public List queryUserInfo(String productID){
+
+        sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+
+        System.out.println("loadQuery set");
+        return getUserInfos();
+    }
+
+
+    private List loadMailingList(){
+        return DBUtil.query(sendMailQuery);
+    }
+
+    private List getUserInfos(){
+        List<HashMap> datas = this.loadMailingList();
+
+        for (HashMap<String,String> users: datas) {
+            UserInfo u = new UserInfo();
+            u.setName(users.get(NAME_KEY));
+            u.setEmail(users.get(EMAIL_KEY));
+            infos.add(u);
+        }
+        return infos;
+    }
+
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/349184132/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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java
new file mode 100644
index 0000000000..9418141f28
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java
@@ -0,0 +1,60 @@
+package com.coderising.ood.srp.test;
+
+import com.coderising.ood.srp.*;
+import com.coderising.ood.srp.bean.ProductInfo;
+import com.coderising.ood.srp.bean.UserInfo;
+import com.coderising.ood.srp.dao.ProductInfoDAO;
+import com.coderising.ood.srp.dao.UserInfoDAO;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Created by wang on 2017/6/17.
+ */
+public class MainTest {
+
+    @Test
+    public void readFile() {
+        File f = new File("C:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        ProductInfoDAO pDAO = new ProductInfoDAO();
+        pDAO.readFile(f);
+        Assert.assertEquals("P8756", pDAO.getProductList().get(0).getProductID());
+        Assert.assertEquals("iPhone8", pDAO.getProductList().get(0).getProductDesc());
+
+        Assert.assertEquals("P4955", pDAO.getProductList().get(3).getProductID());
+    }
+
+    @Test
+    public void showUserInfo(){
+        File f = new File("C:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        ProductInfoDAO pDAO = new ProductInfoDAO();
+        pDAO.readFile(f);
+
+        List<ProductInfo> pInfo = pDAO.getProductList();
+
+        UserInfoDAO uDAO = new UserInfoDAO();
+        List<UserInfo> userInfos = uDAO.queryUserInfo(pInfo.get(0).getProductID());
+        Assert.assertEquals("User1",userInfos.get(0).getName());
+
+    }
+
+    @Test
+    public void mailInfo(){
+        File f = new File("C:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
+        ProductInfoDAO pDAO = new ProductInfoDAO();
+        pDAO.readFile(f);
+
+        List<ProductInfo> pInfo = pDAO.getProductList();
+
+        UserInfoDAO uDAO = new UserInfoDAO();
+        List<UserInfo> userInfos = uDAO.queryUserInfo(pInfo.get(0).getProductID());
+
+        MailContent mCont = new MailContent();
+        PromotionMail pMail = new PromotionMail(pInfo,userInfos,mCont);
+        pMail.sendEMail();
+    }
+
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..a23198fcea
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/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.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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..bb028c690c
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.util;
+
+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());
+		
+	}
+
+	
+}

From b468fdf8fe49b5280f24fe067d3f67f81b1e8b6c Mon Sep 17 00:00:00 2001
From: yyglider <yaoyuan0120@126.com>
Date: Mon, 19 Jun 2017 15:13:17 +0800
Subject: [PATCH 202/332] delete season one

delete season one
---
 .../main/java/season_1/code01/ArrayList.java  | 138 --------
 .../main/java/season_1/code01/BinaryTree.java |  97 -----
 .../main/java/season_1/code01/Iterator.java   |   7 -
 .../main/java/season_1/code01/LinkedList.java | 327 -----------------
 .../main/java/season_1/code01/List.java       |   9 -
 .../main/java/season_1/code01/Queue.java      |  24 --
 .../main/java/season_1/code01/Stack.java      |  31 --
 .../main/java/season_1/code02/ArrayUtil.java  | 257 --------------
 .../code02/litestruts/ActionConfig.java       |  28 --
 .../code02/litestruts/Configuration.java      |  64 ----
 .../code02/litestruts/LoginAction.java        |  39 --
 .../code02/litestruts/ReflectionUtil.java     | 120 -------
 .../season_1/code02/litestruts/Struts.java    |  76 ----
 .../java/season_1/code02/litestruts/View.java |  23 --
 .../season_1/code03/v1/DownloadThread.java    |  51 ---
 .../season_1/code03/v1/FileDownloader.java    | 115 ------
 .../season_1/code03/v1/api/Connection.java    |  23 --
 .../code03/v1/api/ConnectionException.java    |   9 -
 .../code03/v1/api/ConnectionManager.java      |  10 -
 .../code03/v1/api/DownloadListener.java       |   5 -
 .../code03/v1/impl/ConnectionImpl.java        |  95 -----
 .../code03/v1/impl/ConnectionManagerImpl.java |  34 --
 .../season_1/code03/v2/DownloadThread.java    |  52 ---
 .../season_1/code03/v2/FileDownloader.java    | 133 -------
 .../season_1/code03/v2/api/Connection.java    |  23 --
 .../code03/v2/api/ConnectionException.java    |   8 -
 .../code03/v2/api/ConnectionManager.java      |  10 -
 .../code03/v2/api/DownloadListener.java       |   5 -
 .../code03/v2/impl/ConnectionImpl.java        |  92 -----
 .../code03/v2/impl/ConnectionManagerImpl.java |  16 -
 .../java/season_1/code04/LRUPageFrame.java    | 162 ---------
 .../main/java/season_1/code05/Stack.java      |  54 ---
 .../main/java/season_1/code05/StackUtil.java  | 148 --------
 .../main/java/season_1/code06/InfixExpr.java  | 126 -------
 .../java/season_1/code07/InfixToPostfix.java  |  44 ---
 .../java/season_1/code07/PostfixExpr.java     |  47 ---
 .../main/java/season_1/code07/PrefixExpr.java |  55 ---
 .../main/java/season_1/code07/Token.java      |  63 ----
 .../java/season_1/code07/TokenParser.java     |  89 -----
 .../java/season_1/code08/CircleQueue.java     |  93 -----
 .../main/java/season_1/code08/Josephus.java   |  55 ---
 .../main/java/season_1/code08/Queue.java      |  61 ----
 .../season_1/code08/QueueWithTwoStacks.java   |  66 ----
 .../java/season_1/code09/QuickMinStack.java   |  40 ---
 .../season_1/code09/StackWithTwoQueues.java   |  42 ---
 .../season_1/code09/TwoStackInOneArray.java   | 152 --------
 .../java/season_1/code10/BinaryTreeNode.java  |  39 --
 .../java/season_1/code10/BinaryTreeUtil.java  | 125 -------
 .../main/java/season_1/code10/FileList.java   |  38 --
 .../season_1/code11/BinarySearchTree.java     | 305 ----------------
 .../season_1/mini_jvm/attr/AttributeInfo.java |  19 -
 .../java/season_1/mini_jvm/attr/CodeAttr.java | 119 -------
 .../season_1/mini_jvm/attr/ConstantValue.java |  21 --
 .../mini_jvm/attr/LineNumberTable.java        |  69 ----
 .../mini_jvm/attr/LocalVariableTable.java     |  98 -----
 .../season_1/mini_jvm/attr/StackMapTable.java |  30 --
 .../season_1/mini_jvm/clz/AccessFlag.java     |  25 --
 .../java/season_1/mini_jvm/clz/ClassFile.java | 121 -------
 .../season_1/mini_jvm/clz/ClassIndex.java     |  19 -
 .../java/season_1/mini_jvm/cmd/BiPushCmd.java |  29 --
 .../mini_jvm/cmd/ByteCodeCommand.java         | 158 ---------
 .../season_1/mini_jvm/cmd/CommandParser.java  | 149 --------
 .../season_1/mini_jvm/cmd/ComparisonCmd.java  |  79 -----
 .../season_1/mini_jvm/cmd/GetFieldCmd.java    |  37 --
 .../mini_jvm/cmd/GetStaticFieldCmd.java       |  39 --
 .../season_1/mini_jvm/cmd/IncrementCmd.java   |  39 --
 .../mini_jvm/cmd/InvokeSpecialCmd.java        |  46 ---
 .../mini_jvm/cmd/InvokeVirtualCmd.java        |  85 -----
 .../java/season_1/mini_jvm/cmd/LdcCmd.java    |  51 ---
 .../season_1/mini_jvm/cmd/NewObjectCmd.java   |  39 --
 .../season_1/mini_jvm/cmd/NoOperandCmd.java   | 146 --------
 .../season_1/mini_jvm/cmd/OneOperandCmd.java  |  29 --
 .../season_1/mini_jvm/cmd/PutFieldCmd.java    |  44 ---
 .../season_1/mini_jvm/cmd/TwoOperandCmd.java  |  67 ----
 .../season_1/mini_jvm/constant/ClassInfo.java |  26 --
 .../mini_jvm/constant/ConstantInfo.java       |  28 --
 .../mini_jvm/constant/ConstantPool.java       |  25 --
 .../mini_jvm/constant/FieldRefInfo.java       |  49 ---
 .../mini_jvm/constant/MethodRefInfo.java      |  52 ---
 .../mini_jvm/constant/NameAndTypeInfo.java    |  45 ---
 .../mini_jvm/constant/NullConstantInfo.java   |  12 -
 .../mini_jvm/constant/StringInfo.java         |  25 --
 .../season_1/mini_jvm/constant/UTF8Info.java  |  33 --
 .../mini_jvm/engine/ExecutionResult.java      |  57 ---
 .../mini_jvm/engine/ExecutorEngine.java       |  77 ----
 .../java/season_1/mini_jvm/engine/Heap.java   |  39 --
 .../season_1/mini_jvm/engine/JavaObject.java  |  71 ----
 .../season_1/mini_jvm/engine/MethodArea.java  |  90 -----
 .../season_1/mini_jvm/engine/MiniJVM.java     |  30 --
 .../mini_jvm/engine/OperandStack.java         |  26 --
 .../season_1/mini_jvm/engine/StackFrame.java  | 126 -------
 .../java/season_1/mini_jvm/field/Field.java   |  64 ----
 .../mini_jvm/loader/ByteCodeIterator.java     |  63 ----
 .../mini_jvm/loader/ClassFileLoader.java      | 144 --------
 .../mini_jvm/loader/ClassFileParser.java      | 159 ---------
 .../java/season_1/mini_jvm/method/Method.java | 151 --------
 .../java/season_1/mini_jvm/util/Util.java     |  22 --
 .../java/season_1/code01/ArrayListTest.java   |  67 ----
 .../java/season_1/code01/BinaryTreeTest.java  |  27 --
 .../java/season_1/code01/LinkedListTest.java  | 174 ---------
 .../test/java/season_1/code01/QueueTest.java  |  24 --
 .../test/java/season_1/code01/StackTest.java  |  27 --
 .../java/season_1/code02/ArrayUtilTest.java   |  73 ----
 .../code02/litestruts/StrutsTest.java         |  43 ---
 .../season_1/code03/FileDownloaderTest.java   |  60 ----
 .../season_1/code04/LRUPageFrameTest.java     |  38 --
 .../java/season_1/code05/StackUtilTest.java   |  79 -----
 .../java/season_1/code06/InfixExprTest.java   |  49 ---
 .../java/season_1/code07/PostfixExprTest.java |  42 ---
 .../java/season_1/code07/PrefixExprTest.java  |  45 ---
 .../java/season_1/code08/JosephusTest.java    |  32 --
 .../season_1/code09/QuickMinStackTest.java    |  34 --
 .../code09/StackWithTwoQueuesTest.java        |  27 --
 .../season_1/code10/BinaryTreeUtilTest.java   |  79 -----
 .../season_1/code11/BinarySearchTreeTest.java |  93 -----
 .../mini_jvm/ClassFileloaderTest.java         | 335 ------------------
 .../java/season_1/mini_jvm/EmployeeV1.java    |  28 --
 .../java/season_1/mini_jvm/EmployeeV2.java    |  54 ---
 .../test/java/season_1/mini_jvm/Example.java  |  16 -
 .../season_1/mini_jvm/HourlyEmployee.java     |  27 --
 .../java/season_1/mini_jvm/MiniJVMTest.java   |  28 --
 121 files changed, 8198 deletions(-)
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/ArrayList.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/BinaryTree.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/Iterator.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/LinkedList.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/List.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/Queue.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code01/Stack.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code02/litestruts/View.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code05/Stack.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code05/StackUtil.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code06/InfixExpr.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code07/Token.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code07/TokenParser.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code08/CircleQueue.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code08/Josephus.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code08/Queue.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code10/FileList.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java
 delete mode 100644 students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code01/QueueTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code01/StackTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code08/JosephusTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/Example.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java
 delete mode 100644 students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java

diff --git a/students/769232552/season_one/main/java/season_1/code01/ArrayList.java b/students/769232552/season_one/main/java/season_1/code01/ArrayList.java
deleted file mode 100644
index 6746de2a50..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/ArrayList.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package code01;
-
-/**
- * Created by yaoyuan on 2017/3/6.
- */
-public class ArrayList implements List {
-
-    private int max_size = 0;//总长度
-    private int current_size = 0; //当前长度
-    private float extendPercent = 2; //扩展系数
-
-    private Object[] elementData;
-
-    /**
-     * 默认构造函数，初始化数组长度为100
-     */
-    public ArrayList(){
-        this.elementData = new Object[100];
-        this.max_size = 100;
-    }
-    /**
-     * 构造函数
-     * @param size，初始化数组长度
-     */
-    public ArrayList(int size){
-        this.elementData = new Object[size];
-        this.max_size = size;
-    }
-
-    /**
-     * 顺序添加元素，超出原始界限时，数组自动扩展
-     */
-    public void add(Object o) {
-        //如果越界了，需要复制原有的数组到扩充后的数组中
-        if(this.current_size + 1 > this.max_size) {
-            this.max_size = (int) Math.floor(this.max_size * this.extendPercent);
-            this.elementData = copyToNew(this.elementData,this.max_size);
-        }
-        this.elementData[this.current_size] = o;
-        this.current_size ++;
-
-    }
-
-    /**
-     * 指定位置添加元素
-     * 一种是在中间，一种是当前插入的位置尾部(如果超过尾部则默认添加到尾部)
-     */
-    public void add(int index, Object o){
-        assert(index>=0);
-        //如果越界了，需要复制原有的数组到扩充后的数组中
-        if(this.current_size + 1 > this.max_size) {
-            //如果越界了，需要复制原有的数组到扩充后的数组中
-            this.max_size = (int) Math.floor(this.max_size * this.extendPercent);
-            this.elementData = copyToNew(this.elementData,this.max_size);
-        }
-        //数组中间插入
-        if(index < this.current_size){
-            //需要把当前位置的元素往后移动
-            for (int i = this.current_size - 1; i >= index; i--) {
-                this.elementData[i+1] = this.elementData[i];
-            }
-            this.elementData[index] = o;
-        }else {
-            //后面加入
-            this.elementData[this.current_size] = o;
-        }
-        this.current_size ++;
-    }
-
-    public Object get(int index){
-        if(index >= 0 && index <= this.current_size-1){
-            return this.elementData[index];
-        }else {
-            throw new ArrayIndexOutOfBoundsException(index);
-        }
-    }
-
-    /**
-     * 删除指定位置的元素
-     * @param index
-     * @return
-     */
-    public Object remove(int index){
-        Object result = null;
-        if(index >= 0 && index <= current_size-1){
-            result = elementData[index];
-            //删除操作
-            if(index == current_size - 1){
-                elementData[index] = null;
-            }else {
-                //需要把当前位置后面的元素往前移动
-                for (int i = index; i < this.current_size-1 ; i++) {
-                    this.elementData[i] = this.elementData[i+1];
-                }
-                this.elementData[this.current_size-1] = null;
-            }
-            this.current_size --;
-        }else {
-            throw new ArrayIndexOutOfBoundsException(index);
-        }
-        return result;
-    }
-
-    public int size(){
-        return this.current_size;
-    }
-
-    public Iterator iterator(){
-        return new Iterator() {
-            int next_pos = 0;
-            int pos = -1;
-            public boolean hasNext() {
-                if(max_size <= 0){
-                    return false;
-                }
-                return next_pos < ArrayList.this.size();
-            }
-
-            public Object next() {
-                Object next = ArrayList.this.get(next_pos);
-                pos = next_pos ++;
-                return next;
-            }
-            public void remove(){
-                ArrayList.this.remove(pos);
-            }
-        };
-    }
-
-    private Object[] copyToNew(Object[] oldArray, int extendSize){
-        Object[] newArray = new Object[extendSize];
-        for (int i = 0; i < size(); i++) {
-            newArray[i] = oldArray[i];
-        }
-        return newArray;
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code01/BinaryTree.java b/students/769232552/season_one/main/java/season_1/code01/BinaryTree.java
deleted file mode 100644
index b29fb960cb..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/BinaryTree.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package code01;
-
-/**
- * Created by yaoyuan on 2017/3/10.
- */
-public class BinaryTree<T extends Comparable<T>>{
-
-    private BinaryTreeNode root = null;
-    private int size = 0;
-
-    public BinaryTreeNode createBinaryTree(T[] array){
-        for(T data : array){
-            this.insert(data);
-        }
-        return this.root;
-    }
-
-    // recursive way,
-    // t is the node that roots the subtree.
-    public BinaryTreeNode<T> insert(T data, BinaryTreeNode t){
-        if(t == null){
-            return new BinaryTreeNode<T>(data);
-        }
-        int comparator = ((T) t.data).compareTo(data);
-        if(comparator > 0){
-            t.left = insert(data,t.right);
-        }else if(comparator < 0){
-            t.right = insert(data,t.left);
-        }else {
-            // do nothing
-        }
-        return t;
-
-    }
-
-
-    //loop way
-    public void insert(T data){
-        if(this.root == null){
-            BinaryTreeNode node = new BinaryTreeNode(data);
-            this.root = node;
-            this.size ++;
-            return;
-        }
-        BinaryTreeNode cursor = this.root;
-        while (cursor != null){
-            if(data.compareTo((T) cursor.data) <= 0){
-                if(cursor.left == null) {
-                    cursor.left = new BinaryTreeNode(data);
-                    return;
-                }
-                cursor = cursor.left;
-            }
-            if(data.compareTo((T) cursor.data) > 0){
-                if(cursor.right == null) {
-                    cursor.right = new BinaryTreeNode(data);
-                    return;
-                }
-                cursor = cursor.right;
-            }
-        }
-        this.size ++;
-    }
-
-    public void leftOrderScan(BinaryTreeNode cursor){
-        if(cursor == null){
-            return;
-        }
-        leftOrderScan(cursor.left);
-        System.out.println(cursor.data.toString() + " ");
-        leftOrderScan(cursor.right);
-    }
-
-    public BinaryTreeNode getRoot(){
-        return this.root;
-    }
-
-    class BinaryTreeNode<T> {
-
-        private T data;
-        private BinaryTreeNode left;
-        private BinaryTreeNode right;
-
-        public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) {
-            this.left = right;
-            this.right = left;
-            this.data = data;
-        }
-
-        public BinaryTreeNode(T data) {
-            this.left = null;
-            this.right = null;
-            this.data = data;
-        }
-
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/code01/Iterator.java b/students/769232552/season_one/main/java/season_1/code01/Iterator.java
deleted file mode 100644
index b4074067bb..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/Iterator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package code01;
-
-public interface Iterator {
-	public boolean hasNext();
-	public Object next();
-	public void remove();
-}
diff --git a/students/769232552/season_one/main/java/season_1/code01/LinkedList.java b/students/769232552/season_one/main/java/season_1/code01/LinkedList.java
deleted file mode 100644
index f7bbc970a9..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/LinkedList.java
+++ /dev/null
@@ -1,327 +0,0 @@
-package code01;
-
-
-public class LinkedList implements List {
-
-	private Node head;
-    private Node tail; //指向链表最后一个元素的引用
-
-    private int size; //总长度
-
-    public LinkedList() {
-        this.head = null;
-        this.tail = null;
-        this.size = 0;
-    }
-
-    /**
-     * 新增顺序添加一个元素
-     * @param o
-     */
-    public void add(Object o){
-        Node node = new Node();
-        node.data = o;
-        node.next = null;
-        //空链表
-        if(head == null){
-            this.head = node;
-            this.tail = node;
-        }else { //非空链表，要先找到链表尾部，再加入新解答
-            this.tail.next = node;
-            this.tail = node;
-        }
-        this.size ++;
-	}
-
-    /**
-     * 指定索引处添加node
-     */
-    public void add(int index, Object o) {
-        assert(index >= 0);
-        Node node = new Node();
-        node.data = o;
-        node.next = null;
-
-        if(index == 0){
-            //添加在头部
-            node.next = head;
-            head = node;
-        }else if(index >= this.size){
-            //添加在尾部
-            this.tail.next = node;
-        }else {
-            //添加在中间
-            Node cursor = this.head;
-            for (int i = 0; i < index - 1; i++) {
-                cursor = cursor.next;
-            }
-            node.next = cursor.next;
-            cursor.next = node;
-        }
-        this.size ++;
-    }
-
-	public Object get(int index){
-		assert(index < this.size);
-        Node cursor = this.head;
-        for (int i = 0; i < index; i++) {
-            cursor = cursor.next;
-        }
-        return  cursor.data;
-	}
-
-	public Object remove(int index){
-        assert(index >= 0 && index < this.size);
-        Object result = null;
-        //删除的是链表尾部的元素
-        if(index == this.size - 1){
-            Node cursor = this.head;
-            for (int i = 0; i < index - 1; i++) {
-                cursor = cursor.next;
-            }
-            result = cursor.next.data;
-            tail = cursor;
-            cursor.next = null;
-        }else if(index == 0){
-            //删除的是头部元素
-            result = head.data;
-            head = head.next;
-        }else {
-            //删除的是链表中间的元素
-            Node cursor = this.head;
-            for (int i = 0; i < index - 1; i++) {
-                cursor = cursor.next;
-            }
-            result = cursor.next.data;
-            cursor.next = cursor.next.next;
-        }
-        this.size --;
-        return result;
-	}
-
-	public int size(){
-		return this.size;
-	}
-
-	public void addFirst(Object o){
-        Node node = new Node();
-        node.data = o;
-        node.next = null;
-        if(this.head == null){
-            this.head = node;
-            this.tail = node;
-        }else {
-            node.next = head;
-            this.head = node;
-        }
-        this.size ++;
-	}
-	public void addLast(Object o){
-        Node node = new Node();
-        node.data = o;
-        node.next = null;
-        if(this.head == null){
-            this.head = node;
-            this.tail = node;
-        }else {
-            this.tail.next = node;
-            this.tail = node;
-        }
-        this.size ++;
-    }
-
-	public Object removeFirst(){
-		Object first = null;
-        if(this.head != null){
-            first = this.head.data;
-            head = head.next;
-            this.size --;
-        }
-        return first;
-	}
-
-	public Object removeLast(){
-		Object last = null;
-        if(this.tail != null){
-            if(this.head != this.tail){
-                Node cursor;
-                for (cursor = head;cursor.next!=tail;cursor=cursor.next);
-                last = this.tail.data;
-                this.tail = cursor;
-                this.tail.next = null;
-            }else {
-                last = this.tail.data;
-                this.head = null;
-                this.tail = null;
-            }
-            this.size --;
-        }
-        return last;
-	}
-	public Iterator iterator(){
-		return null;
-	}
-
-    /**
-     * 节点类
-     */
-    private static class Node{
-		Object data;
-		Node next;
-
-	}
-
-	/**
-	 * 把该链表逆置
-	 * 例如链表为 3->7->10 , 逆置后变为  10->7->3
-	 */
-	public void reverse(){
-        if(this.head == null || this.head == this.tail){
-            return;
-        }
-
-        Node pre_cursor = null;
-        Node cursor = this.head;
-        Node after_cursor = cursor.next;
-
-        while(cursor != null){
-            cursor.next = pre_cursor;
-            pre_cursor = cursor;
-            cursor = after_cursor;
-            if(after_cursor != null){
-                after_cursor = after_cursor.next;
-            }
-        }
-
-        Node tmpNode = this.head;
-        this.head = this.tail;
-        this.tail = tmpNode;
-	}
-
-	/**
-	 * 删除一个单链表的前半部分
-	 * 例如：list = 2->5->7->8 , 删除以后的值为 7->8
-	 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10
-
-	 */
-	public void removeFirstHalf(){
-        if(this.head == null || this.head.next == null){
-            return;
-        }
-        if(this.head.next.next == null){
-            this.head = this.head.next;
-        }
-
-        Node stepOne = this.head;
-        Node stepTwo = this.head;
-
-        while (stepTwo.next != null){
-            stepOne = stepOne.next;
-            stepTwo = stepTwo.next.next;
-        }
-        this.head = stepOne;
-	}
-
-	/**
-	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
-	 * @param i
-	 * @param length
-	 */
-	public void remove(int i, int length){
-        Node current = head;
-        Node firstHalf = null;
-        for (int k = 0; k < i; k ++){
-            if(current == null){
-                return;
-            }
-            firstHalf = current;  //记录待删除节点的前一个节点
-            current = current.next;
-        }
-
-        //移动length长度
-        for (int j = 0; j < length; j++) {
-            if(current == null){
-                return;
-            }
-            current = current.next;
-        }
-
-        if(i == 0){
-            head = current;
-        }else {
-            firstHalf.next = current;
-        }
-    }
-	/**
-	 * 假定当前链表和list均包含已升序排列的整数
-	 * 从当前链表中取出那些list所指定的元素
-	 * 例如当前链表 = 11->101->201->301->401->501->601->701
-	 * listB = 1->3->4->6
-	 * 返回的结果应该是[101,301,401,601]
-	 * @param list
-	 */
-	public static int[] getElements(LinkedList list){
-		return null;
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 从当前链表中中删除在list中出现的元素
-
-	 * @param list
-	 */
-
-	public  void subtract(LinkedList list){
-
-	}
-
-	/**
-	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
-	 */
-	public void removeDuplicateValues(){
-        if(this.head == null){
-            return;
-        }
-        Node current = this.head;
-        Node current_next = this.head;
-        while (current_next != null){
-            current_next = current_next.next; //如果放到下个while循环后面写，就需要判断一次current_next是不是null了
-            while(current_next != null && current_next.data.equals(current.data)){
-                //删除重复节点
-                current.next = current_next.next;
-                current_next = current_next.next;
-            }
-            current = current_next;
-        }
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。
-	 * 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
-	 * @param min
-	 * @param max
-	 */
-	public  void removeRange(int min, int max){
-        //怎么才能高效呢
-	}
-
-	/**
-	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
-	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
-	 * @param list
-	 */
-	public  LinkedList intersection( LinkedList list){
-		return null;
-	}
-
-    /**
-     * 遍历列表
-     */
-    public void printList(){
-        System.out.println();
-        for (Node cursor = this.head;cursor!=null;cursor=cursor.next){
-            System.out.print(cursor.data+" ");
-        }
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/code01/List.java b/students/769232552/season_one/main/java/season_1/code01/List.java
deleted file mode 100644
index 95bc37d172..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/List.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package code01;
-
-public interface List {
-	public void add(Object o);
-	public void add(int index, Object o);
-	public Object get(int index);
-	public Object remove(int index);
-	public int size();
-}
diff --git a/students/769232552/season_one/main/java/season_1/code01/Queue.java b/students/769232552/season_one/main/java/season_1/code01/Queue.java
deleted file mode 100644
index d9956deb9a..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/Queue.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package code01;
-
-public class Queue {
-
-	private LinkedList linkedList = new LinkedList();
-
-	public void enQueue(Object o){
-		linkedList.addFirst(o);
-	}
-	
-	public Object deQueue(){
-		Object result = linkedList.removeLast();
-		return result;
-	}
-	
-	public boolean isEmpty(){
-		return linkedList.size() == 0;
-	}
-	
-	public int size(){
-		return linkedList.size();
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code01/Stack.java b/students/769232552/season_one/main/java/season_1/code01/Stack.java
deleted file mode 100644
index dbaeb91a48..0000000000
--- a/students/769232552/season_one/main/java/season_1/code01/Stack.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package code01;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){
-		elementData.add(o);
-	}
-	
-	public Object pop(){
-		Object result = null;
-		if(elementData.size()!=0) {
-			result = elementData.remove(elementData.size() - 1);
-		}
-		return result;
-	}
-	
-	public Object peek(){
-		Object result = null;
-		if(elementData.size()!=0) {
-			result = elementData.get(elementData.size() - 1);
-		}
-		return result;
-	}
-	public boolean isEmpty(){
-		return elementData.size() == 0;
-	}
-	public int size(){
-		return elementData.size();
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java b/students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java
deleted file mode 100644
index 23055ef138..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/ArrayUtil.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package code02;
-import org.apache.commons.lang.ArrayUtils;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ArrayUtil {
-	
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换
-		例如： a = [7, 9 , 30, 3]  ,   置换后为 [3, 30, 9,7]
-		如果     a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * @param origin
-	 * @return
-	 */
-	public void reverseArray(int[] origin){
-		if (origin == null || origin.length <= 1){
-			return;
-		}
-
-		int head = 0;
-		int tail = origin.length - 1;
-		int tmp;
-		while (head != tail){
-			//调换位置
-			tmp = origin[head];
-			origin[head] = origin[tail];
-			origin[tail] = tmp;
-
-            head ++;
-            tail --;
-		}
-
-	}
-	
-	/**
-	 * 现在有如下的一个数组：   int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}   
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为：   
-	 * {1,3,4,5,6,6,5,4,7,6,7,5}  
-	 * @param oldArray
-	 * @return
-	 */
-	public int[] removeZero(int[] oldArray){
-		if (oldArray == null || oldArray.length < 1){
-			return null;
-		}
-
-		List<Integer> newList = new ArrayList<Integer>();
-		for(int number : oldArray){
-			if(number != 0){
-				newList.add(number);
-			}
-		}
-
-        Integer[] result = new Integer[newList.size()];
-        result = (Integer[]) newList.toArray(result);
-        return ArrayUtils.toPrimitive(result);
-
-
-	}
-	
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 ,  创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的
-	 * 例如 a1 = [3, 5, 7,8]   a2 = [4, 5, 6,7]    则 a3 为[3,4,5,6,7,8]    , 注意： 已经消除了重复
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-	
-	public int[] merge(int[] array1, int[] array2){
-        if(array1 == null && array2 == null){
-            return null;
-        }
-        if(array1 == null){
-            return array2;
-        }
-        if(array2 == null){
-            return array1;
-        }
-        int[] newArray = new int[array1.length + array2.length];
-        int m = 0,n = 0, k = 0;
-        while (m < array1.length && n < array2.length){
-            if(array1[m] <= array2[n]){
-                newArray[k++] = array1[m++];
-            }else {
-                newArray[k++] = array2[n++];
-            }
-        }
-        if(m >= array1.length){
-            while (n < array2.length){
-                newArray[k++] = array2[n++];
-            }
-        }
-        if(n >= array2.length){
-            while (m < array1.length){
-                newArray[k++] = array1[m++];
-            }
-        }
-		return  newArray;
-	}
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持
-	 * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * @param oldArray
-	 * @param size
-	 * @return
-	 */
-	public int[] grow(int [] oldArray,  int size){
-        int[] newArray = new int[oldArray.length + size];
-        int i = 0;
-        for (; i < oldArray.length; i++) {
-            newArray[i] = oldArray[i];
-        }
-        for (int j = 0; j < size; j++){
-            newArray[i++] = 0;
-        }
-        return newArray;
-	}
-	
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21......  ，给定一个最大值， 返回小于该值的数列
-	 * 例如， max = 15 , 则返回的数组应该为 [1，1，2，3，5，8，13]
-	 * max = 1, 则返回空数组 []
-	 * @param max
-	 * @return
-	 */
-    //也就是需要生成一个小于max值的fibonacci数组
-	public int[] fibonacci(int max){
-        if(max < 2){
-            return new int[]{};
-        }
-        if(max < 3){
-            return new int[]{1,1};
-        }
-        List<Integer> list = new ArrayList<Integer>();
-        list.add(0,1);
-        list.add(1,1);
-        int i=0;
-        while (list.get(i) + list.get(i+1) < max){
-            list.add(i+2,list.get(i) + list.get(i+1));
-            i++;
-        }
-
-        int[] newArray = new int[list.size()];
-        for (int j = 0; j < list.size(); j++) {
-            newArray[j] = list.get(j).intValue();
-        }
-        return newArray;
-	}
-	
-	/**
-	 * 返回小于给定最大值max的所有素数数组
-	 * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * @param max
-	 * @return
-     *
-     * 原理：
-     * １，判断一个数字是否为素数，一个数 n 如果是合数，那么它的所有的因子不超过sqrt(n)
-     * ２，当i是素数的时候，i的所有的倍数必然是合数。
-	 */
-	public int[] getPrimes(int max){
-
-        if(max <= 2){
-            return null;
-        }
-        boolean[] prime = new boolean[max + 1];
-        for (int i = 2; i <= max; i++) {
-            if(i%2 == 0){
-                prime[i] = false; //偶数
-            }else {
-                prime[i] = true;
-            }
-        }
-
-        for (int i = 2; i <= Math.sqrt(max) ; i++) {
-            if(prime[i]){//奇数
-                //如果i是素数，那么把i的倍数标记为非素数
-                for(int j = i+i; j <= max; j += i){
-                    prime[j] = false;
-                }
-            }
-        }
-
-        List num = new ArrayList<Integer>();
-        for (int i = 2; i <= max; i++) {
-            if(prime[i]){
-                num.add(i);
-            }
-        }
-
-        Integer[] result = new Integer[num.size()];
-        result = (Integer[]) num.toArray(result);
-        return ArrayUtils.toPrimitive(result);
-	}
-	
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3
-	 * 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * @param max
-	 * @return
-	 */
-	public int[] getPerfectNumbers(int max){
-
-        if(max < 6){
-            return null;
-        }
-
-        List<Integer> perfectNumlist = new ArrayList<Integer>();
-
-        for (int j = 6;j <= max; j++){
-            List<Integer> factorNumlist = new ArrayList<Integer>();
-            factorNumlist.add(1);
-            for (int i = 2; i < j; i++) {
-                if(j % i == 0){
-                    factorNumlist.add(i);
-                }
-            }
-            int sum = 0;
-            for(Integer num : factorNumlist){
-                sum += num;
-            }
-
-            if(sum == j){
-                perfectNumlist.add(j);
-            }
-        }
-        Integer[] result = new Integer[perfectNumlist.size()];
-        result = (Integer[]) perfectNumlist.toArray(result);
-        return ArrayUtils.toPrimitive(result);
-	}
-	
-	/**
-	 * 用seperator 把数组 array给连接起来
-	 * 例如array= [3,8,9], seperator = "-"
-	 * 则返回值为"3-8-9"
-	 * @param array
-	 * @param seperator
-	 * @return
-	 */
-	public String join(int[] array, String seperator){
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < array.length - 1; i++) {
-            sb.append(array[i]);
-            sb.append(seperator);
-        }
-        sb.append(array[array.length - 1]);
-        return sb.toString();
-	}
-
-    public void printArr(int[] array){
-        for(int num : array){
-            System.out.print(num + " ");
-        }
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java
deleted file mode 100644
index b5e077e7a5..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/litestruts/ActionConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package code02.litestruts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created by yaoyuan on 2017/3/22.
- */
-public class ActionConfig {
-    String name;
-    String clzName;
-    Map<String,String> viewResult = new HashMap<String,String>();
-
-
-    public ActionConfig(String actionName, String clzName) {
-        this.name = actionName;
-        this.clzName = clzName;
-    }
-    public String getClassName(){
-        return clzName;
-    }
-    public void addViewResult(String name, String viewName){
-        viewResult.put(name, viewName);
-    }
-    public String getViewName(String resultName){
-        return viewResult.get(resultName);
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java
deleted file mode 100644
index 85d3d98a1f..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/litestruts/Configuration.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package code02.litestruts;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Created by yaoyuan on 2017/3/21.
- */
-public class Configuration {
-
-
-    private String path;
-    private final Map<String, ActionConfig> actionMap = new HashMap<String, ActionConfig>();
-
-    Configuration(String path){
-        parseXML(path);
-    }
-
-    //解析xml文件
-    private void parseXML(String path){
-        //读取文件
-        File file = new File(path);
-        SAXReader reader = new SAXReader();
-        Document document = null;
-        try {
-            document = reader.read(file);
-        } catch (DocumentException e) {
-            e.printStackTrace();
-        }
-        Element root = document.getRootElement();
-
-        for (Iterator<Element> iterator = root.elementIterator("action"); iterator.hasNext();) {
-            Element e = iterator.next();
-            String actionName = e.attributeValue("name");
-            String clazName = e.attributeValue("class");
-            ActionConfig actionConfig = new ActionConfig(actionName,clazName);
-            for(Iterator<Element> childIterator = e.elementIterator();childIterator.hasNext();){
-                Element child = childIterator.next();
-                String jspKey = child.attributeValue("name");
-                String jspValue = child.getTextTrim();
-                actionConfig.addViewResult(jspKey,jspValue);
-            }
-            actionMap.put(actionName,actionConfig);
-        }
-    }
-
-    public String getView(String actionName, String result){
-        String jspKey = actionName + "." + result;
-        return actionMap.get(actionName).getViewName(result);
-    }
-
-
-    public Map<String, ActionConfig> getActionMap() {
-        return actionMap;
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java
deleted file mode 100644
index 0799eae71a..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/litestruts/LoginAction.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package code02.litestruts;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * @author liuxin
- *
- */
-public class LoginAction{
-    private String name ;
-    private String password;
-    private String message;
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String execute(){
-        if("test".equals(name) && "1234".equals(password)){
-            this.message = "login successful";
-            return "success";
-        }
-        this.message = "login failed,please check your user/pwd";
-        return "fail";
-    }
-
-    public void setName(String name){
-        this.name = name;
-    }
-    public void setPassword(String password){
-        this.password = password;
-    }
-    public String getMessage(){
-        return this.message;
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java
deleted file mode 100644
index c4a8ed34fc..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/litestruts/ReflectionUtil.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package code02.litestruts;
-
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by yaoyuan on 2017/3/21.
- */
-public class ReflectionUtil {
-    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ReflectionUtil.class);
-
-    private static final Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
-
-    //加载xml文件中的类
-    public void initiateClazz(Configuration cfg){
-        Map<String, ActionConfig> actionMap = cfg.getActionMap();
-
-        for (Map.Entry<String, ActionConfig> entry : actionMap.entrySet()) {
-            String actionName = entry.getKey(); //login
-            ActionConfig actionConfig =entry.getValue();
-            String className = actionConfig.getClassName(); //code02.litestruts.LoginAction
-            Class<?> cls;
-            try {
-                cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader());
-                clazzMap.put(actionName,cls);
-            } catch (Exception e) {
-                logger.warn("加载类 " + className + "出错！");
-            }
-        }
-
-    }
-
-
-    //返回实例对象
-    public Object getInstance(String actionName){
-        Object instance = null;
-        for (Map.Entry<String, Class<?>> entry : clazzMap.entrySet()) {
-            String action = entry.getKey(); //login
-            Class<?> cls = entry.getValue(); //code02.litestruts.LoginAction.class
-            if(actionName.equals(action)){
-                try {
-                    instance = cls.newInstance();
-                } catch (Exception e) {
-                    logger.error("生成实例出错！", e);
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-        return instance;
-    }
-
-
-    //参数赋值
-    public void setParameters(Object o, Map<String, String> params) {
-
-        List<Method> methods = getSetterMethods(o.getClass());
-        for (String name : params.keySet()) {
-            String methodName = "set" + name;
-            for (Method m : methods) {
-                if (m.getName().equalsIgnoreCase(methodName)) {
-                    try {
-                        m.invoke(o, params.get(name));
-                    } catch (InvocationTargetException e) {
-                        e.printStackTrace();
-                    } catch (IllegalAccessException e) {
-                        e.printStackTrace();
-                    }
-                }
-            }
-        }
-    }
-
-    //运行无参方法
-    public Object runMethodWithoutParams(Object o , String methodName){
-        Class<?> clz = o.getClass();
-        Object result = null;
-        try {
-            Method method = clz.getDeclaredMethod(methodName);
-            try {
-                result = method.invoke(o);
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (InvocationTargetException e) {
-                e.printStackTrace();
-            }
-        } catch (NoSuchMethodException e) {
-            e.printStackTrace();
-        }
-        return result;
-    }
-
-    //返回以set开头的方法
-    public List<Method> getSetterMethods(Class<?> clz){
-        return getMethods(clz,"set");
-    }
-
-    //返回以get开头的方法
-    public List<Method> getGetterMethods(Class<?> clz){
-        return getMethods(clz,"get");
-    }
-
-    private List<Method> getMethods(Class<?> clz, String startWithName){
-        List<Method> methodsList = new ArrayList<Method>();
-        Method[] methods = clz.getDeclaredMethods();
-        for (int i = 0; i < methods.length; i++) {
-            String methodName = methods[i].getName();
-            if(methodName.startsWith(startWithName)){
-                methodsList.add(methods[i]);
-            }
-        }
-        return methodsList;
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java
deleted file mode 100644
index de2c22ea94..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/litestruts/Struts.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package code02.litestruts;
-
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-public class Struts {
-    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Struts.class);
-    /*
-      0. 读取配置文件struts.xml
-
-       1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）
-      据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
-      ("name"="test" ,  "password"="1234") ,
-      那就应该调用 setName和setPassword方法
-
-
-
-
-  */
-    public static View runAction(String actionName, Map<String, String> parameters)  {
-        View view = new View();
-        Configuration cfg = new Configuration("src/main/resources/struts.xml");
-        ReflectionUtil reflectionUtil = new ReflectionUtil();
-        reflectionUtil.initiateClazz(cfg);
-       /* 1. 根据actionName找到相对应的class ， 例如LoginAction,   通过反射实例化（创建对象）*/
-        Object o = reflectionUtil.getInstance(actionName);
-        /*2. 根据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是
-            ("name"="test" ,  "password"="1234") ,那就应该调用 setName和setPassword方法*/
-        reflectionUtil.setParameters(o,parameters);
-        /*3. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"*/
-        String result = (String) reflectionUtil.runMethodWithoutParams(o,"execute");
-       /* 4. 通过反射找到对象的所有getter方法（例如 getMessage）,通过反射来调用，
-       把值和属性形成一个HashMap , 例如 {"message":  "登录成功"} ,放到View对象的parameters*/
-        Map params = new HashMap<String, String>();
-        List<Method> methods = reflectionUtil.getGetterMethods(o.getClass());
-        for(Method method : methods){
-            String key = method.getName().substring(3);
-            String value = null;
-            try {
-                value = (String) method.invoke(o);
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (InvocationTargetException e) {
-                e.printStackTrace();
-            }
-            params.put(key,value);
-        }
-        /*5. 根据struts.xml中的 <result> 配置,以及execute的返回值，确定哪一个jsp，放到View对象的jsp字段中。*/
-        String jsp = cfg.getView(actionName,result);
-        view.setParameters(params);
-        view.setJsp(jsp);
-
-        return view;
-    }
-
-    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
-
-        String actionName = "login";
-        HashMap<String,String> params = new HashMap<String, String>();
-        params.put("name","test");
-        params.put("password","12345");
-
-        View view = Struts.runAction(actionName,params);
-        System.out.println(view.getJsp());
-        System.out.println(view.getParameters());
-
-
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code02/litestruts/View.java b/students/769232552/season_one/main/java/season_1/code02/litestruts/View.java
deleted file mode 100644
index c7e630587c..0000000000
--- a/students/769232552/season_one/main/java/season_1/code02/litestruts/View.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package code02.litestruts;
-
-import java.util.Map;
-
-public class View {
-	private String jsp;
-	private Map parameters;
-	
-	public String getJsp() {
-		return jsp;
-	}
-	public View setJsp(String jsp) {
-		this.jsp = jsp;
-		return this;
-	}
-	public Map getParameters() {
-		return parameters;
-	}
-	public View setParameters(Map parameters) {
-		this.parameters = parameters;
-		return this;
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java b/students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java
deleted file mode 100644
index f91bff3bf1..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/DownloadThread.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package code03.v1;
-
-import code03.v1.api.Connection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * 定义线程类
- */
-
-
-public class DownloadThread extends Thread{
-
-	private static final Logger logger = LoggerFactory.getLogger(DownloadThread.class);
-
-	private Connection conn;
-	private int startPos;
-	private int endPos;
-	private CountDownLatch finished;
-	private String fileName;
-
-
-	public DownloadThread(Connection conn, int startPos, int endPos, CountDownLatch finished,String fileName){
-		this.conn = conn;
-		this.startPos = startPos;
-		this.endPos = endPos;
-		this.finished = finished;
-		this.fileName = fileName;
-	}
-
-	@Override
-	public void run(){
-		logger.debug("thread {} begin to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos);
-
-		try {
-			byte[] data = conn.read(startPos,endPos);
-			RandomAccessFile rfile = new RandomAccessFile(fileName,"rw");
-			rfile.seek(startPos);
-			rfile.write(data);
-			rfile.close();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		finished.countDown();
-		logger.debug("thread {} end to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos);
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java b/students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java
deleted file mode 100644
index 542fd978c2..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/FileDownloader.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package code03.v1;
-
-import code03.v1.api.Connection;
-import code03.v1.api.ConnectionException;
-import code03.v1.api.ConnectionManager;
-import code03.v1.api.DownloadListener;
-import code03.v1.impl.ConnectionManagerImpl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * 线程启动类
- */
-
-public class FileDownloader {
-	private final static int THREAD_NUM = 5;
-
-	private static final String fileHolder = "D:/test.png";
-	private String url;
-	private DownloadListener listener;
-	private ConnectionManager cm;
-	private static boolean downloadFinished = false;
-
-	static final CountDownLatch finished = new CountDownLatch(THREAD_NUM); //v2的版本中使用了CyclicBarrier方式
-
-
-	public FileDownloader(String _url) {
-		this.url = _url;
-	}
-
-	/*
-	(1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
-	(2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-	     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。*/
-	public void execute(){
-		Connection conn = null;
-		try {
-			//启动线程
-			int startPos = 0, endPos = 0;
-			List<Thread> threads = new ArrayList<Thread>();
-			for (int i = 0; i < THREAD_NUM; i++) {
-				conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream
-				int length = conn.getContentLength();
-				startPos = length/THREAD_NUM *  i;
-				endPos = length/THREAD_NUM * (i + 1)- 1;
-				DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos,finished, fileHolder);
-				threads.add(downloadThread);
-				downloadThread.start();
-			}
-			finished.await();
-			//调用join方法，确保所有线程的工作已经完成
-			/*for (int i = 0; i < THREAD_NUM; i++) {
-				try {
-					threads.get(i).join();
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-			}*/
-			listener.notifyFinished();
-		} catch (ConnectionException e) {
-			e.printStackTrace();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		} finally {
-			if(conn != null){
-				conn.close();
-			}
-		}
-	}
-
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	public void setConnectionManager(ConnectionManager ucm){
-		this.cm = ucm;
-	}
-	
-	public DownloadListener getListener(){
-		return this.listener;
-	}
-
-
-	public static void main(String[] args) {
-
-		String url = "http://litten.me/assets/blogImg/litten.png";
-		FileDownloader fileDownloader = new FileDownloader(url);
-		ConnectionManager cm = new ConnectionManagerImpl();
-		fileDownloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-		});
-		fileDownloader.setConnectionManager(cm);
-		fileDownloader.execute();
-
-
-		while (!downloadFinished){
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				//休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-		System.out.println("download finished ! ");
-
-
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java
deleted file mode 100644
index 92a3d4725a..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/api/Connection.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package code03.v1.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * @param startPos 开始位置， 从0开始
-	 * @param endPos 结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos,int endPos) throws IOException;
-	/**
-	 * 得到数据内容的长度
-	 * @return
-	 */
-	public int getContentLength();
-
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java
deleted file mode 100644
index bee02c3717..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionException.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package code03.v1.api;
-
-public class ConnectionException extends Exception {
-
-    public ConnectionException(String message,Throwable e){
-        super(message,e);
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java
deleted file mode 100644
index 4ec1b87667..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/api/ConnectionManager.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package code03.v1.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java b/students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java
deleted file mode 100644
index 8cd24bfd57..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package code03.v1.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java b/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java
deleted file mode 100644
index 75c91bb5bb..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package code03.v1.impl;
-
-import code03.v1.api.Connection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLConnection;
-
-
-public class ConnectionImpl implements Connection{
-
-	private static final Logger logger = LoggerFactory.getLogger(ConnectionImpl.class);
-
-
-	private URLConnection urlConnection;
-	private int length = -1;
-
-
-    public ConnectionImpl(URLConnection urlConnection){
-		this.urlConnection  = urlConnection;
-	}
-
-	/**
-	 * 读取urlConnection.getInputStream()中的数据，返回byte[]
-	 */
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {
-		int contentLength = getContentLength();
-		if(startPos < 0 || endPos > contentLength || contentLength <= 0){
-			logger.info("index out of range !");
-			return null;
-		}
-
-		InputStream raw = null;
-		BufferedInputStream in = null;
-		int size = endPos - startPos + 1;
-		byte[] data = new byte[size];
-		try{
-			raw = urlConnection.getInputStream();
-			in = new BufferedInputStream(raw);
-			in.skip(startPos);
-
-			int offset = 0;
-			while(offset < size){
-				int bytesRead = in.read(data, offset, size - offset);
-				while (bytesRead  == -1){break;}
-				offset += bytesRead;
-			}
-            //用这种方式比较好
-            /*
-            int BUFFER_SIZE = 1024;
-            byte[] buff = new byte[BUFFER_SIZE];
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            while(baos.size() < size){
-                int bytesRead = in.read(buff); //缓存读取的数据，其SIZE大小不一定要等于总的SIZE
-                if(bytesRead<0) break;
-                baos.write(buff,0,bytesRead);
-            }
-            byte[] data = baos.toByteArray();
-            Arrays.copyOf(data,size);
-            */
-
-        } catch (IOException e) {
-			e.printStackTrace();
-		}finally {
-			raw.close();
-			in.close();
-		}
-		return data;
-	}
-
-	@Override
-	public int getContentLength() {
-		if(length != -1){
-			return length;
-		}
-		length = urlConnection.getContentLength();
-		//if without content-length header
-		if(length == -1) {
-            throw new RuntimeException("content-length error");
-        }
-		return length;
-	}
-
-	@Override
-	public void close() {
-		if(urlConnection != null){
-			urlConnection = null;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java b/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java
deleted file mode 100644
index b4c9a1b90d..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v1/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package code03.v1.impl;
-
-import code03.v1.api.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-/**
- * 获取Connection实例
- */
-
-public class ConnectionManagerImpl implements ConnectionManager {
-	private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class);
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-		Connection connection = null;
-		try {
-			URL _url = new URL(url);
-			URLConnection urlConnection = _url.openConnection();
-			connection = new ConnectionImpl(urlConnection);
-		} catch (MalformedURLException e) {
-			logger.error("url {} format error",url);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return connection;
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java b/students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java
deleted file mode 100644
index 54cc1d3d0b..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/DownloadThread.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package code03.v2;
-
-import code03.v2.api.Connection;
-
-import java.io.RandomAccessFile;
-import java.util.concurrent.CyclicBarrier;
-
-public class DownloadThread extends Thread{
-
-	Connection conn;
-	int startPos;
-	int endPos;
-	CyclicBarrier barrier;
-	String localFile;
-	public DownloadThread( Connection conn, int startPos, int endPos, String localFile, CyclicBarrier barrier){
-		
-		this.conn = conn;		
-		this.startPos = startPos;
-		this.endPos = endPos;
-		this.localFile = localFile;
-		this.barrier = barrier;
-	}
-
-
-
-	public void run(){
-		
-		
-		try {
-			System.out.println("Begin to read [" + startPos +"-"+endPos+"]");
-			
-			byte[] data = conn.read(startPos, endPos);		
-			
-			RandomAccessFile file = new RandomAccessFile(localFile,"rw");
-			
-			file.seek(startPos);	
-			
-			file.write(data);
-			
-			file.close();
-			
-			conn.close();
-			
-			barrier.await(); //等待别的线程完成
-			
-		} catch (Exception e) {			
-			e.printStackTrace();
-			
-		} 
-		
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java b/students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java
deleted file mode 100644
index 12c750145f..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/FileDownloader.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package code03.v2;
-
-import code03.v2.api.Connection;
-import code03.v2.api.ConnectionManager;
-import code03.v2.api.DownloadListener;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.concurrent.CyclicBarrier;
-
-
-
-public class FileDownloader {
-	
-	private String url;
-	private String localFile;
-	
-	DownloadListener listener;
-	
-	ConnectionManager cm;
-	
-
-	private static final int DOWNLOAD_TRHEAD_NUM = 3;
-	
-	public FileDownloader(String _url, String localFile) {
-		this.url = _url;
-		this.localFile = localFile;
-		
-	}
-	
-	public void execute(){
-		// 在这里实现你的代码， 注意： 需要用多线程实现下载
-		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
-		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos, endPos来指定）
-		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-		//     线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
-		// 具体的实现思路：
-		// 1. 需要调用ConnectionManager的open方法打开连接， 然后通过Connection.getContentLength方法获得文件的长度
-		// 2. 至少启动3个线程下载，  注意每个线程需要先调用ConnectionManager的open方法
-		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
-		// 3. 把byte数组写入到文件中
-		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
-		
-		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
-		
-		CyclicBarrier barrier = new CyclicBarrier(DOWNLOAD_TRHEAD_NUM , new Runnable(){
-			public void run(){
-				listener.notifyFinished();
-			}
-		}); 
-		
-		Connection conn  = null;
-		try {
-			
-			conn  = cm.open(this.url);
-			
-			int length = conn.getContentLength();	
-			
-			createPlaceHolderFile(this.localFile, length);			
-			
-			int[][] ranges = allocateDownloadRange(DOWNLOAD_TRHEAD_NUM, length);
-			
-			for(int i=0; i< DOWNLOAD_TRHEAD_NUM; i++){
-			
-				
-				DownloadThread thread = new DownloadThread(
-						cm.open(url), 
-						ranges[i][0], 
-						ranges[i][1], 
-						localFile, 
-						barrier);
-				thread.start();
-			}
-			
-		} catch (Exception e) {			
-			e.printStackTrace();
-		}finally{
-			if(conn != null){
-				conn.close();
-			}
-		}
-		
-	}
-	
-	private void createPlaceHolderFile(String fileName, int contentLen) throws IOException{
-		
-		RandomAccessFile file = new RandomAccessFile(fileName,"rw");
-		
-		for(int i=0; i<contentLen ;i++){
-			file.write(0);
-		}
-		
-		file.close();
-	}
-	
-	private int[][] allocateDownloadRange(int threadNum, int contentLen){
-		int[][] ranges = new int[threadNum][2];
-		
-		int eachThreadSize = contentLen / threadNum;// 每个线程需要下载的文件大小
-		int left = contentLen % threadNum;// 剩下的归最后一个线程来处理
-		
-		for(int i=0;i<threadNum;i++){
-			
-			int startPos = i * eachThreadSize;
-			
-			int endPos = (i + 1) * eachThreadSize - 1;
-			
-			if ((i == (threadNum - 1))) {
-				endPos += left;
-			}
-			ranges[i][0] = startPos;
-			ranges[i][1] = endPos;
-			
-		}
-		
-		return ranges;
-	}
-	
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	
-	
-	public void setConnectionManager(ConnectionManager ucm){
-		this.cm = ucm;
-	}
-	
-	public DownloadListener getListener(){
-		return this.listener;
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java
deleted file mode 100644
index 68e165d657..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/api/Connection.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package code03.v2.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * @param startPos 开始位置， 从0开始
-	 * @param endPos 结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos, int endPos) throws IOException;
-	/**
-	 * 得到数据内容的长度
-	 * @return
-	 */
-	public int getContentLength();
-	
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java
deleted file mode 100644
index 6dedcdd92b..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionException.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package code03.v2.api;
-
-public class ConnectionException extends Exception {
-	public ConnectionException(Exception e){
-		super(e);
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java
deleted file mode 100644
index 634564fbdf..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/api/ConnectionManager.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package code03.v2.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java b/students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java
deleted file mode 100644
index 02402a1950..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package code03.v2.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java b/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java
deleted file mode 100644
index cd55020a66..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package code03.v2.impl;
-
-import code03.v2.api.Connection;
-import code03.v2.api.ConnectionException;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Arrays;
-
-
-class ConnectionImpl implements Connection {
-	
-	URL url;
-	static final int BUFFER_SIZE = 1024;
-	
-	ConnectionImpl(String _url) throws ConnectionException {
-		try {			
-			url = new URL(_url);
-		} catch (MalformedURLException e) {			
-			throw new ConnectionException(e);
-		}
-	}
-	
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {		
-		
-
-		HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
-		
-		httpConn.setRequestProperty("Range", "bytes=" + startPos + "-"
-                + endPos);
-		
-		InputStream is  = httpConn.getInputStream();
-
-		is.skip(startPos);
-		
-        byte[] buff = new byte[BUFFER_SIZE];  
-     
-        int totalLen = endPos - startPos + 1;
-        
-        
-        
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();        
-      
-        while(baos.size() < totalLen){  
-        	
-        	int len = is.read(buff);           
-            if (len < 0) {  
-                break;  
-            }             
-            baos.write(buff,0, len);            
-        }  
-        
-        
-        if(baos.size() > totalLen){
-        	byte[] data = baos.toByteArray();
-        	return Arrays.copyOf(data, totalLen);
-        }
-        
-		return baos.toByteArray();
-	}
-
-	@Override
-	public int getContentLength() {
-		
-        URLConnection con;
-		try {
-			con = url.openConnection();
-			
-			return con.getContentLength(); 
-			
-		} catch (IOException e) {			
-			e.printStackTrace();
-		}  
-        
-		return -1;
-            
-        
-	}
-
-	@Override
-	public void close() {
-		
-		
-	}
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java b/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java
deleted file mode 100644
index 596beaa191..0000000000
--- a/students/769232552/season_one/main/java/season_1/code03/v2/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package code03.v2.impl;
-
-
-import code03.v2.api.Connection;
-import code03.v2.api.ConnectionException;
-import code03.v2.api.ConnectionManager;
-
-public class ConnectionManagerImpl implements ConnectionManager {
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-		
-		return new ConnectionImpl(url);
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java b/students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java
deleted file mode 100644
index 0ffce58b83..0000000000
--- a/students/769232552/season_one/main/java/season_1/code04/LRUPageFrame.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package code04;
-
-/**
- * 用双向链表实现LRU算法
- */
-public class LRUPageFrame {
-	
-	private  class Node {
-		
-		Node prev;
-		Node next;
-		int pageNum;
-		Node() {
-		}
-	}
-
-	private int size;
-	private int capacity;
-	
-	private Node first;// 链表头
-	private Node last;// 链表尾
-
-	public LRUPageFrame(int capacity) {
-		this.capacity = capacity;
-		this.size = 0;
-	}
-
-	/**
-	 * 获取缓存中对象
-	 * 1、如果缓存中不存在，则直接加入表头
-	 * 2、如果缓存中存在，则把该对象移动到表头
-	 * @param pageNum
-	 * @return
-	 */
-	public void access(int pageNum) {
-		Node node = hasContains(pageNum);
-		if(node != null){
-			moveToHead(node);
-		}else {
-			addToHead(pageNum);
-		}
-	
-	}
-
-	/**
-	 * 对象是否存在缓存中，如存在则返回该对象在链表中的位置，否则返回null
-	 * @return
-     */
-	private Node hasContains(int key){
-		Node node = this.first;
-		while (node != null){
-			if(node.pageNum == key){
-				return node;
-			}
-			node = node.next;
-		}
-		return node;
-	}
-
-	/**
-	 * 对象加入表头，先先判断缓存是否已经满了
-	 * @return
-     */
-	private void addToHead(int key){
-		Node node = new Node();
-		node.pageNum = key;
-		if(size < capacity){
-			addFirst(node);
-		}else {
-			removeLast();
-			addFirst(node);
-		}
-
-	}
-
-
-	/**
-	 * 对象移动到表头
-	 * @return
-     */
-	private void moveToHead(Node node){
-		if(node == first){
-			return;
-		}
-		if(node == last){
-			node.next = first;
-			first.prev = node;
-			first = node;
-			last = node.prev;
-			last.next = null;
-			node.prev = null;
-			return;
-		}
-		node.prev.next = node.next;
-		node.next.prev = node.prev;
-		node.next = first;
-		node.prev = null;
-		first.prev = node;
-		first = node;
-	}
-
-	/**
-	 * 删除表尾
-	 * @return
-     */
-	private void removeLast(){
-		if(last != null){
-			Node newLast = last.prev;
-			last.prev = null;
-			last = newLast;
-			last.next = null;
-			size --;
-		}
-	}
-	/**
-	 * 添加元素到表头
-	 * @return
-     */
-	private void addFirst(Node node){
-		//0个节点
-		if(first == null){
-			first = node;
-			last = node;
-			size ++;
-			return;
-		}
-		//一个节点
-		else if(first == last){
-			first = node;
-			first.next = last;
-			last.prev = first;
-			size ++;
-			return;
-		}else {
-			node.next = first;
-			first.prev = node;
-			first = node;
-			size ++;
-		}
-	}
-	/**
-	 * 当前链表空间
-	 * @return
-     */
-	public int getSize() {
-		return size;
-	}
-
-	public String toString(){
-		StringBuilder buffer = new StringBuilder();
-		Node node = first;
-		while(node != null){
-			buffer.append(node.pageNum);			
-			node = node.next;
-			if(node != null){
-				buffer.append(",");
-			}
-		}
-		return buffer.toString();
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code05/Stack.java b/students/769232552/season_one/main/java/season_1/code05/Stack.java
deleted file mode 100644
index 04e1f1aebb..0000000000
--- a/students/769232552/season_one/main/java/season_1/code05/Stack.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package code05;
-
-import code01.ArrayList;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-	
-	public void push(Object o){
-		if(o == null){
-			return;
-		}
-		elementData.add(o);
-	}
-
-
-	public Object pop(){
-		Object last = null;
-		int last_index = elementData.size() - 1;
-		if(last_index >= 0){
-			last = elementData.get(last_index);
-			elementData.remove(last_index);
-		}
-		return last;
-	}
-	
-	public Object peek(){
-		Object last = null;
-		int last_index = elementData.size() - 1 ;
-		if(last_index >= 0){
-			last = elementData.get(last_index);
-		}
-		return last;
-	}
-	public boolean isEmpty(){
-		return elementData.size() == 0;
-	}
-	public int size(){
-		return elementData.size();
-	}
-
-	@Override
-	public String toString(){
-		StringBuilder sb = new StringBuilder();
-		sb.append("[");
-		int i = 0;
-		for (; i < size() - 1; i++) {
-			sb.append(elementData.get(i));
-			sb.append(", ");
-		}
-		sb.append(elementData.get(i));
-		sb.append("]");
-		return sb.toString();
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code05/StackUtil.java b/students/769232552/season_one/main/java/season_1/code05/StackUtil.java
deleted file mode 100644
index fb9e90631a..0000000000
--- a/students/769232552/season_one/main/java/season_1/code05/StackUtil.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package code05;
-
-public class StackUtil {
-	
-	
-	/**
-	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 */
-
-	/**
-	 * 此处是传值，将原有栈的地址 复制给 变量 s， s在函数内相当于局部变量，因此 s 重新赋值并没有什么用
-	 * @param s
-	 */
-	public static void bad_reverse(Stack s) {
-		if(s == null){
-			return;
-		}
-		// need a new stack
-		Stack newStack = new Stack();
-		while (s.peek() != null){
-			newStack.push(s.pop());
-		}
-		s = newStack;
-	}
-
-
-	public static void reverse(Stack s) {
-		if(s == null || s.isEmpty()){
-			return;
-		}
-
-		Stack tmp = new Stack();
-		while(!s.isEmpty()){
-			tmp.push(s.pop());
-		}
-		while(!tmp.isEmpty()){
-			int top = (Integer) tmp.pop();
-			addToBottom(s,top);//加入到原来栈的栈底
-		}
-
-
-	}
-
-	public static void addToBottom(Stack s,  int value){
-		if(s.isEmpty()){
-			s.push(value);
-		} else{
-			int top = (Integer)  s.pop();
-			addToBottom(s,value);
-			s.push(top);
-		}
-
-	}
-
-	/**
-	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * @param o
-	 */
-	public static void remove(Stack s,Object o) {
-		if(s == null || o == null){
-			return;
-		}
-		Stack newStack = new Stack();
-		while (s.peek() != null){
-			Object e = s.pop();
-			if(!e.equals(o)){
-				newStack.push(e);
-			}
-		}
-		while (newStack.peek() != null){
-			s.push(newStack.pop());
-		}
-	}
-
-	/**
-	 * 从栈顶取得len个元素, 原来的栈中元素保持不变
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * @param len
-	 * @return
-	 */
-	public static Object[] getTop(Stack s,int len) throws Exception {
-		if(s == null || s.isEmpty() || s.size() < len || len <= 0){
-			return null;
-		}
-		Stack newStack = new Stack();
-		for (int i = 0; i < len; i++) {
-			Object o = s.pop();
-			newStack.push(o);
-		}
-		Object[] objects = new Object[len];
-		for (int i = len - 1; i >= 0; i--) {
-			Object o = newStack.pop();
-			s.push(o);
-			objects[i] = o;
-		}
-		return objects;
-	}
-	/**
-	 * 字符串s 可能包含这些字符：  ( ) [ ] { }, a,b,c... x,yz
-	 * 使用堆栈检查字符串s中的括号是不是成对出现的。
-	 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true
-	 * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的， 该方法返回false;
-	 * @param s
-	 * @return
-	 */
-	public static boolean isValidPairs(String s){
-		char tag_1_start = '{';
-		char tag_1_end = '}';
-		char tag_2_start = '[';
-		char tag_2_end = ']';
-		char tag_3_start = '(';
-		char tag_3_end = ')';
-
-		int length = s.length();
-		Stack stack = new Stack();
-		for (int i = 0; i < length; i++) {
-			char c  = s.charAt(i);
-			if(c == tag_1_start || c == tag_2_start || c == tag_3_start){
-				stack.push(c);
-			}
-			else if(c == tag_1_end){
-				//pop all element after tag_1_start
-				Object t= stack.pop();
-				if(!t.equals(tag_1_start)){
-					return false;
-				}
-			}
-			else if(c == tag_2_end){
-				//pop all element after tag_1_start
-				Object t=  stack.pop();
-				if(!t.equals(tag_2_start)){
-					return false;
-				}
-			}
-			else if(c == tag_3_end){
-				//pop all element after tag_1_start
-				Object t= stack.pop();
-				if(!t.equals(tag_3_start)){
-					return false;
-				}
-			}
-		}
-		return stack.size() == 0;
-	}
-	
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code06/InfixExpr.java b/students/769232552/season_one/main/java/season_1/code06/InfixExpr.java
deleted file mode 100644
index a13e190091..0000000000
--- a/students/769232552/season_one/main/java/season_1/code06/InfixExpr.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package code06;
-
-import code05.Stack;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class InfixExpr {
-	String expr = null;
-	
-	public InfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	private float calc(float a, float b, String ops){
-		float result = 0.0f;
-		if (ops.equals("+")) {
-			return b + a;
-		}
-		if (ops.equals("-")) {
-			return b - a;
-		}
-		if (ops.equals("*")) {
-			return b * a;
-		}
-		if (ops.equals("/")) {
-			return b / a;
-		}
-		return result;
-	}
-
-	private boolean isOperator(String ch){
-		boolean isOperator = (ch.equals("+") || ch.equals("-") || ch.equals("*") || ch.equals("/"));
-		return isOperator;
-	}
-
-	//parse string to list
-	private List parser(){
-		char[] chs = expr.toCharArray();
-		List values = new ArrayList<String>();
-		int currentCharPos = 0; // 当前字符的位置
-		while (currentCharPos < chs.length) {
-			String currentStr = String.valueOf(chs[currentCharPos]);
-			if(isOperator(currentStr)){
-				values.add(currentStr);
-				currentCharPos ++;
-			}
-			else {
-				int numberOffset  =  0;
-				while (currentCharPos + numberOffset < chs.length && !isOperator(String.valueOf(chs[currentCharPos+numberOffset]))){
-					numberOffset ++ ;
-				}
-				if(numberOffset == 1){
-					values.add(currentStr);
-					currentCharPos++;
-				}else {
-					String number = new String(chs,currentCharPos,numberOffset);
-					values.add(number);
-					currentCharPos = currentCharPos + numberOffset;
-				}
-			}
-		}
-		return values;
-	}
-
-	private int morePriority(String peek, String e) {
-		boolean hasMorePriority = ((e.equals("+") || e.equals("-")) && (peek.equals("*") || peek.equals("/")));
-		boolean hasLessPriority = ((e.equals("*") || e.equals("/")) && (peek.equals("+") || peek.equals("-")));
-		if(hasMorePriority) {
-			return 1;
-		}
-		if(hasLessPriority){
-			return -1;
-		}
-		return 0;
-	}
-
-	public float evaluate() {
-		float result = 0.0f;
-
-		Stack numberStack = new Stack();
-		Stack opsStack = new Stack();
-
-		List<String> elements = this.parser();
-		for(String e : elements){
-			if(!isOperator(e)){ //数字直接入栈
-				float number = Float.valueOf(e);
-				numberStack.push(number);
-			}else {//操作符
-				if(opsStack.isEmpty()){
-					opsStack.push(e);
-				}else {
-					//栈顶符号有着相等或者更高的优先级
-					if(morePriority((String) opsStack.peek(),e) >= 0){
-						float a = (Float) numberStack.pop();
-						float b = (Float) numberStack.pop();
-						String ops = (String) opsStack.pop();
-
-						float value = calc(a,b,ops);
-
-						numberStack.push(value);
-						opsStack.push(e);
-					}else {
-						opsStack.push(e);
-					}
-				}
-			}
-		}
-		while (!opsStack.isEmpty()) {
-			float a = (Float) numberStack.pop();
-			float b = (Float) numberStack.pop();
-			String ops = (String) opsStack.pop();
-			float value = calc(a, b, ops);
-			numberStack.push(value);
-		}
-
-		result = (Float) numberStack.pop();
-		return result;
-	}
-
-	public static void main(String[] args) {
-		InfixExpr expr = new InfixExpr("20+30.8*400/500");
-		List<String> elements = expr.parser();
-		System.out.println(expr.evaluate());
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java b/students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java
deleted file mode 100644
index 7da7c7d58d..0000000000
--- a/students/769232552/season_one/main/java/season_1/code07/InfixToPostfix.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package code07;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-public class InfixToPostfix {
-	
-	public static List<Token> convert(String expr) {
-
-	    List<Token> tokens = new ArrayList<Token>();
-
-        Stack<Token> tokenStack = new Stack<Token>();
-        List<Token> infixTokens =TokenParser.parseInfix(expr);
-
-        for(Token t : infixTokens){
-            if(t.isNumber()){
-                tokens.add(t);
-            }else {
-                while (!tokenStack.isEmpty() && !t.hasHigherPriority(tokenStack.peek())){
-                    tokens .add(tokenStack.pop());
-                }
-                tokenStack.push(t);
-            }
-        }
-
-        while(!tokenStack.isEmpty()){
-            tokens.add(tokenStack.pop());
-        }
-
-		return tokens;
-	}
-
-    public static void main(String[] args) {
-        String expr = "2+3*4+5";
-        List<Token> tokens = InfixToPostfix.convert(expr);
-        for(Token t : tokens){
-            System.out.println(t.getStringValue());
-        }
-
-    }
-
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java b/students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java
deleted file mode 100644
index cf9e3e6722..0000000000
--- a/students/769232552/season_one/main/java/season_1/code07/PostfixExpr.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package code07;
-
-import java.util.List;
-import java.util.Stack;
-
-public class PostfixExpr {
-String expr = null;
-	
-	public PostfixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-
-		Stack<Float> numStack = new Stack<Float>();
-		List<Token> tokens = TokenParser.parseNoInfix(this.expr);
-
-		for(Token token : tokens){
-			if(token.isNumber()){
-				numStack.push(new Float(token.getIntValue()));
-			} else{
-				Float f2 = numStack.pop();
-				Float f1 = numStack.pop();
-				numStack.push(calc(f1,f2,token.getStringValue()));
-			}
-		}
-
-		return numStack.pop().floatValue();
-	}
-
-	//如下类似排比句的代码写法就是卫语句
-	private Float calc(Float f1, Float f2, String op){
-		if(op.equals("+")){
-			return f1+f2;
-		}
-		if(op.equals("-")){
-			return f1-f2;
-		}
-		if(op.equals("*")){
-			return f1*f2;
-		}
-		if(op.equals("/")){
-			return f1/f2;
-		}
-		throw new RuntimeException(op + " is not supported");
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java b/students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java
deleted file mode 100644
index 1f8bcff595..0000000000
--- a/students/769232552/season_one/main/java/season_1/code07/PrefixExpr.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package code07;
-
-import java.util.List;
-import java.util.Stack;
-
-public class PrefixExpr {
-	String expr = null;
-	
-	public PrefixExpr(String expr) {
-		this.expr = expr;
-	}
-
-	public float evaluate() {
-		Stack<Token> exprStack = new Stack<Token>();
-		Stack<Float> numberStack = new Stack<Float>();
-
-		List<Token> tokens = TokenParser.parseNoInfix(this.expr);
-
-		for(Token t: tokens){
-			 exprStack.push(t);
-		}
-
-		while (!exprStack.isEmpty()){
-			Token t = exprStack.pop();
-			if(Token.OPERATOR == t.getType()){
-				float a = numberStack.pop();
-				float b = numberStack.pop();
-				float result = calc(a,b,t.getStringValue());
-				numberStack.push(result);
-			}else if(Token.NUMBER == t.getType()){
-				numberStack.push(Float.parseFloat(t.getStringValue()));
-			}else {
-				System.out.println("char :["+t.getStringValue()+"] is not number or operator,ignore");
-			}
-		}
-
-		return numberStack.pop().floatValue();
-	}
-
-	private Float calc(Float f1, Float f2, String op){
-		if(op.equals("+")){
-			return f1+f2;
-		}
-		if(op.equals("-")){
-			return f1-f2;
-		}
-		if(op.equals("*")){
-			return f1*f2;
-		}
-		if(op.equals("/")){
-			return f1/f2;
-		}
-		throw new RuntimeException(op + " is not supported");
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/code07/Token.java b/students/769232552/season_one/main/java/season_1/code07/Token.java
deleted file mode 100644
index a5d6735427..0000000000
--- a/students/769232552/season_one/main/java/season_1/code07/Token.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package code07;
-
-import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Created by yyglider on 2017/4/19.
- */
-public class Token {
-
-    public static final List<String> OPERATORS = Arrays.asList("+","-","*","/");
-
-    private static final Map<String,Integer> priorities = new HashMap<String, Integer>();
-
-    static {
-        priorities.put("+",1);
-        priorities.put("-",1);
-        priorities.put("*",2);
-        priorities.put("/",2);
-    }
-
-    public static final int OPERATOR = 1;
-    public static final int NUMBER = 2;
-
-    private String value;
-    private int type;
-
-    public Token(int type, String value) {
-        this.value = value;
-        this.type = type;
-    }
-
-    public boolean isNumber(){
-        return type == NUMBER;
-    }
-
-    public boolean isOperator(){
-        return type == OPERATOR;
-    }
-
-    public int getIntValue(){
-        return Integer.valueOf(value).intValue();
-    }
-
-    public String getStringValue(){
-        return value;
-    }
-
-    public int getType() {
-        return type;
-    }
-
-    public boolean hasHigherPriority(Token t){
-        if(!this.isOperator() && !t.isOperator()){
-            throw new RuntimeException("numbers can't compare priority");
-        }
-        return priorities.get(this.value) - priorities.get(t.value) > 0;
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code07/TokenParser.java b/students/769232552/season_one/main/java/season_1/code07/TokenParser.java
deleted file mode 100644
index df91e4d3dc..0000000000
--- a/students/769232552/season_one/main/java/season_1/code07/TokenParser.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package code07;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by yyglider on 2017/4/20.
- * 解析表达式成各个Token
- */
-public class TokenParser {
-
-    public static List<Token> parseNoInfix(String expr){
-        List<Token> tokens = new ArrayList<Token>();
-
-        String[] chs = expr.split(" ");
-
-        for (int i = 0; i < chs.length; i++) {
-            if(isOperator(chs[i])){
-                tokens.add(new Token(Token.OPERATOR,chs[i]));
-            }else {
-                String value = chs[i];
-                tokens.add(new Token(Token.NUMBER,value));
-            }
-        }
-        return tokens;
-    }
-
-
-    public static List<Token> parseInfix(String expr){
-        List<Token> tokens = new ArrayList<Token>();
-
-        char[] chs = expr.toCharArray();
-
-        int i = 0;
-        while (i < chs.length){
-            if(isOperator(chs[i])){
-                tokens.add(new Token(Token.OPERATOR,String.valueOf(chs[i])));
-                i++;
-            }else if(Character.isDigit(chs[i])){
-
-                int nextOperatorPos = findNextOperatorPos(i,chs);
-                String value = expr.substring(i,nextOperatorPos);
-                tokens.add(new Token(Token.NUMBER,value));
-                i = nextOperatorPos;
-
-            }else {
-                System.out.println("char :["+chs[i]+"] is not number or operator,ignore");
-                i++;
-            }
-        }
-        return tokens;
-    }
-
-    private static int findNextOperatorPos(int i, char[] chs) {
-        while (Character.isDigit(chs[i])) {
-            i++;
-            if (i == chs.length) {
-                break;
-            }
-        }
-        return i;
-    }
-
-    private static boolean isOperator(char c) {
-        String sc = String.valueOf(c);
-        return Token.OPERATORS.contains(sc);
-    }
-
-    private static boolean isOperator(String c) {
-        return Token.OPERATORS.contains(c);
-    }
-
-    public static void main(String[] args) {
-/*
-        String expr = "20+30.8*400/500";
-        List<Token> tokens = TokenParser.parseInfix(expr);
-        for(Token t: tokens){
-            System.out.println(t.getStringValue());
-        }
-*/
-
-
-        String expr2 = "- + + 6 / * 2 9 3 * 4 2 8";
-        List<Token> tokens2 = TokenParser.parseNoInfix(expr2);
-        for(Token t: tokens2){
-            System.out.println(t.getStringValue());
-        }
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/code08/CircleQueue.java b/students/769232552/season_one/main/java/season_1/code08/CircleQueue.java
deleted file mode 100644
index 99ccd2cc57..0000000000
--- a/students/769232552/season_one/main/java/season_1/code08/CircleQueue.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package code08;
-
-/**
- * 用数组实现循环队列 - 杜绝“假上溢”
- * 在入队和出队的操作中，头尾指针只增加不减小，致使被删除元素的空间永远无法重新利用。
- *
- * 因此，尽管队列中实际的元素个数远远小于向量空间的规模，但也可能由于尾指针巳超出向量空间的上界而不能做入队操作。
- * 为充分利用向量空间。克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆环，并称这种向量为循环队列。
- * 在循环队列中进行出队、入队操作时，头尾指针仍要加1，朝前移动。
- * 只不过当头尾指针指向向量上界（QueueSize-1）时，其加1操作的结果是指向向量的下界0。
- * @param <E>
- */
-public class CircleQueue <E> {
-	
-	private int maxSize;
-    //用数组来保存循环队列的元素
-    private Object[] elementData;
-    //队头
-    private int front;
-    //队尾
-    private int rear;
-    //元素个数
-    private int count;
-
-    public CircleQueue(int maxSize) {
-        this.maxSize = maxSize+1; //队列需要一个空的位置用于区分队列满和队列空
-        this.elementData  = new Object[maxSize+1];
-        this.front = 0;
-        this.rear = 0;
-    }
-
-    public int size() {
-        return count;
-    }
-
-    public void enQueue(E data) {
-        if(this.isFull()){
-            System.out.println("queue is full, enQueue failed");
-            return;
-        }
-        elementData[rear] = data;
-        rear = (rear + 1) % this.maxSize;
-        count ++;
-    }
-
-    public E deQueue() {
-        if(this.isEmpty()){
-            System.out.println("queue is empty, deQueue failed");
-            return null;
-        }
-        E e = (E) elementData[front];
-        front = (front + 1) % this.maxSize;
-        count --;
-        return e;
-    }
-
-    public boolean isFull(){
-	    return ((rear + 1) % this.maxSize == front);
-    }
-
-    public boolean isEmpty() {
-        return rear == front;
-    }
-
-    public static void main(String[] args) {
-        CircleQueue<String> q = new CircleQueue<String>(11);
-        q.enQueue("a1");
-        q.enQueue("a2");
-        q.enQueue("a3");
-        q.enQueue("a4");
-        q.enQueue("a5");
-        q.enQueue("a6");
-        q.enQueue("a7");
-        q.enQueue("a8");
-        q.enQueue("a9");
-        q.enQueue("a10");
-        System.out.println("current size is : " + q.size());
-
-        System.out.println("dequeue : " + q.deQueue());
-        System.out.println("after deQueue , current size is : " + q.size());
-
-        q.enQueue("new1");
-        System.out.println("after enQueue , current size is : " + q.size());
-
-        /*while(!q.isEmpty()){
-            System.out.println(q.deQueue());
-            System.out.println("current size is : " + q.size());
-        }*/
-
-
-
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/code08/Josephus.java b/students/769232552/season_one/main/java/season_1/code08/Josephus.java
deleted file mode 100644
index 4c964631e2..0000000000
--- a/students/769232552/season_one/main/java/season_1/code08/Josephus.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package code08;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 用Queue来实现Josephus问题
- * 在这个古老的问题当中， N个深陷绝境的人一致同意用这种方式减少生存人数：  N个人围成一圈（位置记为0到N-1）， 并且从第一个人报数， 报到M的人会被杀死， 直到最后一个人留下来
- * 该方法返回一个List， 包含了被杀死人的次序
-
- 	0 1 2 3  4 5 6 7 8 9    m=3, n=10
-
- 	第一个人(2)出列后的序列为：
-    3 4 5 6 7 8 9 0 1 (0,1,2 出队列，0,1　再入队列)
-
- 	第二个人(5)出列后的序列为：
- 　　6 7 8 9 0 1　3 4  (3,4,5 出队列，3,4　再入队列)
-
- 	...
-
-    如果剩余队列长度小于等于m则依次出队列
-
- */
-public class Josephus {
-	
-	public static List<Integer> execute(int n, int m){
-		List<Integer> kList = new ArrayList<Integer>();
-		CircleQueue<Integer> circleQueue = new CircleQueue<Integer>(n);
-
-		for (int i = 0; i < n ; i++) {
-			circleQueue.enQueue(i);
-		}
-
-		Queue<Integer> tmpQueue = new Queue<Integer>();
-		while(!circleQueue.isEmpty()){
-
-			if(m > circleQueue.size()) {
-				m = m % circleQueue.size();
-			}
-
-			for (int j = 0; j < m-1; j++) {
-				tmpQueue.enQueue(circleQueue.deQueue());
-			}
-
-			Integer kill = circleQueue.deQueue();
-			kList.add(kill);
-
-			for (int j = 0; j < m-1; j++) {
-				circleQueue.enQueue(tmpQueue.deQueue());
-			}
-		}
-		return kList;
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/code08/Queue.java b/students/769232552/season_one/main/java/season_1/code08/Queue.java
deleted file mode 100644
index f4e1977b73..0000000000
--- a/students/769232552/season_one/main/java/season_1/code08/Queue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package code08;
-
-import java.util.NoSuchElementException;
-
-public class Queue<E> {
-    private Node<E> first;    
-    private Node<E> last;     
-    private int size;               
-
-    
-    private static class Node<E> {
-        private E item;
-        private Node<E> next;
-    }
-
-    
-    public Queue() {
-        first = null;
-        last  = null;
-        size = 0;
-    }
-
-    
-    public boolean isEmpty() {
-        return first == null;
-    }
-
-    public int size() {
-        return size;
-    }
-
-    
-
-    public void enQueue(E data) {
-        Node<E> oldlast = last;
-        last = new Node<E>();
-        last.item = data;
-        last.next = null;
-        if (isEmpty()) {
-        	first = last;
-        }
-        else{
-        	oldlast.next = last;
-        }
-        size++;
-    }
-
-    public E deQueue() {
-        if (isEmpty()) {
-        	throw new NoSuchElementException("Queue underflow");
-        }
-        E item = first.item;
-        first = first.next;
-        size--;
-        if (isEmpty()) {
-        	last = null;  
-        }
-        return item;
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java b/students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java
deleted file mode 100644
index 7f9700f573..0000000000
--- a/students/769232552/season_one/main/java/season_1/code08/QueueWithTwoStacks.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package code08;
-
-import java.util.Stack;
-
-/**
- * 用两个栈来实现一个队列
- * @param <E>
- */
-public class QueueWithTwoStacks<E> {
-	private Stack<E> stack1;    
-    private Stack<E> stack2;    
-
-    
-    public QueueWithTwoStacks() {
-        stack1 = new Stack<E>();
-        stack2 = new Stack<E>();
-    }
-
-    
-
-    public boolean isEmpty() {
-        return stack1.isEmpty() && stack2.isEmpty();
-    }
-
-    
-    public int size() {
-        return stack1.size() + stack2.size();
-    }
-
-
-    public void enQueue(E item) {
-        stack1.push(item);
-    }
-
-    public E deQueue() {
-        if(!stack2.isEmpty()){
-            return stack2.pop();
-        }
-        if(!stack1.isEmpty()){
-            while (!stack1.isEmpty()){
-                E e = stack1.pop();
-                stack2.push(e);
-            }
-            return stack2.pop();
-        }
-        return null;
-    }
-
-
-    public static void main(String[] args) {
-        QueueWithTwoStacks q = new QueueWithTwoStacks();
-        q.enQueue("a");
-        q.enQueue("b");
-        q.enQueue("c");
-        while (!q.isEmpty()){
-            System.out.println(q.deQueue());
-        }
-        q.enQueue("d");
-        q.enQueue("e");
-        while (!q.isEmpty()){
-            System.out.println(q.deQueue());
-        }
-    }
-
- }
-
diff --git a/students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java b/students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java
deleted file mode 100644
index 7951a2bde1..0000000000
--- a/students/769232552/season_one/main/java/season_1/code09/QuickMinStack.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package code09;
-
-import code05.Stack;
-
-/**
- * 设计一个栈，支持栈的push和pop操作，以及第三种操作findMin, 它返回改数据结构中的最小元素
- * finMin操作最坏的情形下时间复杂度应该是O(1)，简单来讲，操作一次就可以得到最小值
- *
- * 构造一个辅助栈，每次压入当前主栈中最小的元素
- */
-public class QuickMinStack {
-
-    Stack mainStack = new Stack();
-    Stack subStack = new Stack(); //辅助栈
-
-    public void push(int data){
-        mainStack.push(data);
-
-        //每次压入当前主栈中最小的元素
-        if(subStack.isEmpty()){
-            subStack.push(data);
-        }
-        else if(data >= (Integer)subStack.peek()){
-            subStack.push(subStack.peek());
-        }
-        else {
-            subStack.push(data);
-        }
-
-    }
-
-    public int pop(){
-        subStack.pop();
-        return (Integer) mainStack.pop();
-    }
-
-    public int findMin(){
-        return (Integer) subStack.peek();
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java b/students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java
deleted file mode 100644
index 926977502e..0000000000
--- a/students/769232552/season_one/main/java/season_1/code09/StackWithTwoQueues.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package code09;
-
-import code08.Queue;
-
-/**
- * 思路和2个栈实现一个队列是一致的，入的时候简单，出的时候麻烦
- */
-
-public class StackWithTwoQueues {
-
-
-    Queue q1 = new Queue();
-    Queue q2 = new Queue();
-
-    public void push(int data) {
-        q1.enQueue(data);
-    }
-
-    public int pop() {
-        if(q1.isEmpty()){
-            return -1;
-        }
-
-        if(q1.size() == 1){
-            return (Integer) q1.deQueue();
-        }
-
-        while (q1.size()>1){
-            q2.enQueue(q1.deQueue());
-        }
-
-        int result = (Integer) q1.deQueue();
-
-        while (!q2.isEmpty()){
-            q1.enQueue(q2.deQueue());
-        }
-
-        return result;
-    }
-
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java b/students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java
deleted file mode 100644
index 9390e16246..0000000000
--- a/students/769232552/season_one/main/java/season_1/code09/TwoStackInOneArray.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package code09;
-
-import code01.ArrayList;
-
-/**
- * 用一个数组实现两个栈
- * 将数组的起始位置看作是第一个栈的栈底，将数组的尾部看作第二个栈的栈底，压栈时，栈顶指针分别向中间移动，直到两栈顶指针相遇，则扩容。
- */
-public class TwoStackInOneArray {
-
-    Object[] data = new Object[10];
-    int top1 = -1, end1 = 0;
-    int top2 = data.length, end2 = data.length - 1;
-
-    /**
-     * 向第一个栈中压入元素
-     * @param o
-     */
-    public void push1(Object o){
-        if(top1+1 < top2){
-            data[++top1] = o;
-            return;
-        }
-        resize();
-        data[++top1] = o;
-    }
-
-    /**
-     * 从第一个栈中弹出元素
-     * @return
-     */
-    public Object pop1(){
-        if(top1 < 0){
-            return null;
-        }
-        return data[top1--];
-    }
-
-    /**
-     * 获取第一个栈的栈顶元素
-     * @return
-     */
-
-    public Object peek1(){
-        if(top1 < 0){
-            return null;
-        }
-        return data[top1];
-    }
-
-    /**
-     * 向第二个栈压入元素
-     */
-    public void push2(Object o){
-
-        if(top2 - 1 > top1){
-            data[--top2] = o;
-            return;
-        }
-        resize();
-        data[--top2] = o;
-    }
-
-    /**
-     * 从第二个栈弹出元素
-     * @return
-     */
-    public Object pop2(){
-        if(top2 > data.length - 1){
-            return null;
-        }
-        return data[top2++];
-    }
-    /**
-     * 获取第二个栈的栈顶元素
-     * @return
-     */
-
-    public Object peek2(){
-        if(top2 > data.length - 1){
-            return null;
-        }
-        return data[top2];
-    }
-
-    /**
-     * 重新分配空间
-     */
-    private void resize() {
-        System.out.println("resize data array ...");
-        Object[] newData = new Object[20];
-        //copy stack 1
-        for (int i = end1; i <= top1; i++) {
-            newData[i] = this.data[i];
-        }
-        //copy stack 2
-        int newDataTop = newData.length;
-        for (int j = end2; j >= top2 ; j--) {
-            newData[--newDataTop] = this.data[j];
-        }
-        this.top2 = newDataTop;
-        this.end2 = newData.length -1;
-        this.data = newData;
-        System.out.println("data array resize to " + this.data.length);
-    }
-
-    @Override
-    public String toString(){
-        StringBuilder sb = new StringBuilder();
-        int i = this.end1;
-        sb.append("stack 1 : ");
-        for(; i <= this.top1; i++){
-            sb.append(data[i].toString()+" ");
-        }
-        sb.append(", stack 2 : ");
-        int j = this.end2;
-        for(; j >= this.top2; j--){
-            sb.append(data[j].toString()+" ");
-        }
-        return sb.toString();
-    }
-
-    public static void main(String[] args) {
-        TwoStackInOneArray s = new TwoStackInOneArray();
-        s.push1(10);
-        s.push1(11);
-        s.push1(12);
-        s.push1(13);
-        s.push1(14);
-
-        s.push2(20);
-        s.push2(21);
-        s.push2(22);
-        s.push2(23);
-        s.push2(24);
-
-        System.out.println(s);
-
-        s.push2(25);
-
-        System.out.println(s);
-
-        s.pop2();
-        s.pop2();
-        s.pop1();
-        s.pop1();
-
-        System.out.println(s);
-
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java b/students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java
deleted file mode 100644
index a7f242c984..0000000000
--- a/students/769232552/season_one/main/java/season_1/code10/BinaryTreeNode.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package code10;
-
-/**
- * Created by on 2017/5/9.
- */
-
-public class BinaryTreeNode<T> {
-
-    public T data;
-    public BinaryTreeNode<T> left;
-    public BinaryTreeNode<T> right;
-
-    public BinaryTreeNode(T data){
-        this.data=data;
-    }
-    public T getData() {
-        return data;
-    }
-    public void setData(T data) {
-        this.data = data;
-    }
-    public BinaryTreeNode<T> getLeft() {
-        return left;
-    }
-    public void setLeft(BinaryTreeNode<T> left) {
-        this.left = left;
-    }
-    public BinaryTreeNode<T> getRight() {
-        return right;
-    }
-    public void setRight(BinaryTreeNode<T> right) {
-        this.right = right;
-    }
-
-    public BinaryTreeNode<T> insert(Object o){
-        return  null;
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java b/students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java
deleted file mode 100644
index 144758651c..0000000000
--- a/students/769232552/season_one/main/java/season_1/code10/BinaryTreeUtil.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package code10;
-
-import code01.BinaryTree;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-/**
- * Created by on 2017/5/9.
- */
-public class BinaryTreeUtil {
-    /**
-     * 用递归的方式实现对二叉树的前序遍历
-     *
-     * @param root
-     * @return
-     */
-    public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
-        List<T> result = new ArrayList<T>();
-        preOrder(root,result);
-        return result;
-    }
-
-    public static <T> void preOrder(BinaryTreeNode<T> root, List<T> result){
-        if(root == null){
-            return;
-        }
-        result.add(root.getData());
-        preOrder(root.getLeft(),result);
-        preOrder(root.getRight(),result);
-    }
-
-    /**
-     * 用递归的方式实现对二叉树的中遍历
-     *
-     * @param root
-     * @return
-     */
-    public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
-        List<T> result = new ArrayList<T>();
-        inOrder(root,result);
-        return result;
-    }
-
-    public static <T> void inOrder(BinaryTreeNode<T> root, List<T> result){
-        if(root == null){
-            return;
-        }
-        inOrder(root.getLeft(),result);
-        result.add(root.getData());
-        inOrder(root.getRight(),result);
-    }
-
-    /**
-     * 用递归的方式实现对二叉树的后遍历
-     *
-     * @param root
-     * @return
-     */
-    public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
-        List<T> result = new ArrayList<T>();
-        postOrder(root,result);
-        return result;
-    }
-
-    public static <T> void postOrder(BinaryTreeNode<T> root, List<T> result){
-        if(root == null){
-            return;
-        }
-        postOrder(root.getLeft(),result);
-        postOrder(root.getRight(),result);
-        result.add(root.getData());
-    }
-
-    /**
-     * 用非递归的方式实现对二叉树的前序遍历（后序便历类似）
-     * @param root
-     * @return
-     */
-    public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
-
-        List<T> result = new ArrayList<T>();
-        Stack visitStack = new Stack();
-
-        visitStack.push(root);
-
-        while(!visitStack.isEmpty()){
-            BinaryTreeNode node = (BinaryTreeNode) visitStack.pop();
-            result.add((T) node.getData());
-            if(node.getRight() != null){
-                visitStack.push(node.getRight());
-            }
-            if(node.getLeft() != null){
-                visitStack.push(node.getLeft());
-            }
-
-        }
-
-        return result;
-    }
-    /**
-     * 用非递归的方式实现对二叉树的中序遍历
-     */
-    public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
-
-        List<T> result = new ArrayList<T>();
-
-        Stack visitStack = new Stack();
-
-        BinaryTreeNode node = root;
-
-        while(node != null ||!visitStack.isEmpty()){
-            while (node != null){
-                visitStack.push(node);
-                node = node.left;
-            }
-            BinaryTreeNode pNode = (BinaryTreeNode) visitStack.pop();
-            result.add((T) pNode.getData());
-            node = pNode.right;
-        }
-        return result;
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/code10/FileList.java b/students/769232552/season_one/main/java/season_1/code10/FileList.java
deleted file mode 100644
index 669d8e32e3..0000000000
--- a/students/769232552/season_one/main/java/season_1/code10/FileList.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package code10;
-
-import java.io.File;
-
-/**
- * Created by on 2017/5/9.
- */
-public class FileList {
-
-    public void list(File file){
-        list(file,0);
-    }
-
-    public void list(File file,int layer){
-        showFileName(file,layer);
-        if(file.isDirectory()){
-            File[] files = file.listFiles();
-            for(File f : files){
-                list(f,layer+1);
-            }
-        }
-    }
-
-    public void showFileName(File file,int i){
-        for (int j = 0; j < i; j++) {
-            System.out.print(" - ");
-        }
-        System.out.println(file.getName());
-    }
-
-    public static void main(String[] args) {
-        FileList fileList = new FileList();
-        String path = "D:\\dir1";
-        File file = new File(path);
-        fileList.list(file);
-    }
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java b/students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java
deleted file mode 100644
index 6b97488945..0000000000
--- a/students/769232552/season_one/main/java/season_1/code11/BinarySearchTree.java
+++ /dev/null
@@ -1,305 +0,0 @@
-package code11;
-
-import code10.BinaryTreeNode;
-
-import java.util.*;
-
-/**
- * Created by yyglider on 2017/5/16.
- */
-public class BinarySearchTree<T extends Comparable> {
-
-    BinaryTreeNode<T> root;
-
-    public BinarySearchTree(BinaryTreeNode<T> root) {
-        this.root = root;
-    }
-
-    public BinaryTreeNode<T> getRoot() {
-        return root;
-    }
-
-    public T findMin() {
-        if (this.root == null) {
-            return null;
-        }
-
-        BinaryTreeNode pNode = this.root;
-        while (pNode != null && pNode.left != null) {
-            pNode = pNode.left;
-        }
-        return (T) pNode.getData();
-    }
-
-    public T findMax() {
-        if (this.root == null) {
-            return null;
-        }
-
-        BinaryTreeNode pNode = this.root;
-        while (pNode != null && pNode.right != null) {
-            pNode = pNode.right;
-        }
-        return (T) pNode.getData();
-    }
-
-    public int height() {
-        if (this.root == null) {
-            return 0;
-        }
-        return getHeight(this.root);
-    }
-
-    private int getHeight(BinaryTreeNode<T> node) {
-        if (node == null) {
-            return 0;
-        }
-        int left = getHeight(node.left);
-        int right = getHeight(node.right);
-        return 1 + Math.max(left, right);
-    }
-
-    public int size() {
-        if (this.root == null) {
-            return 0;
-        }
-        return getSize(this.root);
-    }
-
-    private int getSize(BinaryTreeNode node) {
-        if (node == null) {
-            return 0;
-        }
-        int left = getSize(node.left);
-        int right = getSize(node.right);
-        return 1 + left + right;
-    }
-
-
-    public void remove(T e) {
-        if (this.root == null || e == null) {
-            return;
-        }
-
-        if (e.equals(this.root.getData())) {
-            this.root = null;
-            return;
-        }
-
-        BinaryTreeNode pNode = this.root; //记录待删除的元素位置
-        BinaryTreeNode pPreNode = this.root; //记录待删除的元素的前一个位置
-
-        //find e
-        while (pNode != null) {
-            if (e.compareTo(pNode.getData()) > 0) {
-                pPreNode = pNode;
-                pNode = pNode.right;
-            } else if (e.compareTo(pNode.getData()) < 0) {
-                pPreNode = pNode;
-                pNode = pNode.left;
-            } else {
-                break;
-            }
-
-        }
-
-        //delete e
-        if (pNode != null && e.equals(pNode.getData())) {
-            BinaryTreeNode node;
-            BinaryTreeNode preNode;
-
-            //如果其结点只包含左子树，或者右子树的话，此时直接删除该结点
-            boolean hasOneChild = ((pNode.right != null && pNode.left == null) && (pNode.right == null && pNode.left != null));
-            if (hasOneChild) {
-                if (pNode.left != null) {
-                    node = pNode.left;
-                    pNode.setData(node.getData());
-                    pNode.left = null;
-                    return;
-                }
-                node = pNode.right;
-                pNode.setData(node.getData());
-                pNode.right = null;
-
-            }
-
-            //如果其结点既包含左子树，也包含右子树
-            //找到其右子树的的最小元素（实际上用左子树最大元素代替也是可以的）
-            if (pNode.right != null && pNode.left != null) {
-                preNode = pNode;
-                node = pNode.right;
-                while (node != null && node.left != null) {
-                    preNode = node;
-                    node = node.left;
-                }
-                //如果是叶子节点
-                if (node.right == null) {
-                    pNode.setData(node.getData());
-
-                    preNode.right = null;
-                    return;
-                }
-
-                pNode.setData(node.getData());
-
-                //非叶子结点，用其右孩子的元素来替代
-                preNode = node;
-                node = node.right;
-                preNode.setData(node.getData());
-                preNode.right = null;
-                return;
-            }
-
-            //其本身就是叶子节点
-            pPreNode = null;
-
-        }
-    }
-
-    //层序遍历,使用队列的方式
-    public List<T> levelVisit() {
-        if (this.root == null) {
-            return null;
-        }
-        List<T> results = new ArrayList<T>();
-        Queue<BinaryTreeNode> queue = new ArrayDeque<BinaryTreeNode>();
-
-        queue.add(this.root);
-
-        while (!queue.isEmpty()) {
-            BinaryTreeNode node = queue.poll();
-            results.add((T) node.getData());
-
-            if (node.left != null) {
-                queue.add(node.left);
-            }
-            if (node.right != null) {
-                queue.add(node.right);
-            }
-        }
-        return results;
-    }
-
-
-    /**
-     * 验证是否是二叉查找树
-     */
-    public boolean isValid() {
-        if (this.root == null) {
-            return true;
-        }
-        return checkValid(this.root);
-    }
-
-    public boolean checkValid(BinaryTreeNode node) {
-
-        if (node == null) {
-            return true;
-        }
-        T nodeData = (T) node.getData();
-        boolean currentFlag = (((node.left != null && nodeData.compareTo(node.left.getData()) > 0)
-                        || node.left == null)
-                && ((node.right != null && nodeData.compareTo(node.right.getData()) < 0
-                        || node.right == null)));
-        boolean leftFlag = checkValid(node.left);
-        boolean rightFlag = checkValid(node.right);
-        return currentFlag && leftFlag && rightFlag;
-    }
-
-
-
-    /**
-     * 最近公共祖先（LCA）问题
-     * 基本思想为：从树根开始，该节点的值为t，
-     * 如果t大于t1和t2，说明t1和t2都位于t的左侧，所以它们的共同祖先必定在t的左子树中，从t.left开始搜索；
-     * 如果t小于t1和t2，说明t1和t2都位于t的右侧，那么从t.right开始搜索；
-     * 如果t1<=t<= t2，说明t1和t2位于t的两侧（或t=t1，或t=t2），那么该节点t为公共祖先。
-     */
-    public T getLowestCommonAncestor(T n1, T n2) {
-        if (this.root == null || n1 == null || n2 == null) {
-            return null;
-        }
-
-        BinaryTreeNode pNode = this.root;
-
-        while (pNode != null) {
-            if (n1.compareTo(pNode.getData()) > 0 && n2.compareTo(pNode.getData()) > 0) {
-                pNode = pNode.right;
-            } else if (n1.compareTo(pNode.getData()) < 0 && n2.compareTo(pNode.getData()) < 0) {
-                pNode = pNode.left;
-            } else {
-                return (T) pNode.getData();
-            }
-        }
-        return null;
-    }
-
-
-    /**
-     * 两个节点之间的最短路径
-     */
-    public List<T> getNodesBetween(T n1, T n2) {
-
-        if (this.root == null || n1 == null || n2 == null) {
-            return null;
-        }
-
-        final List<T> list1 = new ArrayList<T>();
-        List<T> list2 = new ArrayList<T>();
-        BinaryTreeNode pNode1 = this.root;
-        BinaryTreeNode pNode2 = this.root;
-
-        //find n1 path
-        while (pNode1 != null) {
-            list1.add((T) pNode1.getData());
-
-            if (n1.compareTo(pNode1.getData()) > 0) {
-                pNode1 = pNode1.right;
-            } else if (n1.compareTo(pNode1.getData()) < 0) {
-                pNode1 = pNode1.left;
-            } else {
-                break;
-            }
-        }
-        //find n2 path
-        while (pNode2 != null) {
-            list2.add((T) pNode2.getData());
-
-            if (n2.compareTo(pNode2.getData()) > 0) {
-                pNode2 = pNode2.right;
-            } else if (n2.compareTo(pNode2.getData()) < 0) {
-                pNode2 = pNode2.left;
-            } else {
-                break;
-            }
-        }
-
-        //join path1 and path2
-        int i = 0, j = 0;
-        T first = null;
-        List<T> results = new ArrayList<T>();
-
-        while (i < list1.size() && i < list2.size()) {
-            if (list1.get(i) != list2.get(i)) {
-                break;
-            }
-            i++;
-        }
-        if (i > 0) {
-            i--;
-        }
-        int resultsLen = list1.size() + list2.size() - 2 * i - 1;
-        for (int k = list1.size() - 1; k > i; k--) {
-            results.add(list1.get(k));
-        }
-        for (int k = i; k < list2.size(); k++) {
-            results.add(list2.get(k));
-        }
-
-        Collections.reverse(list1);
-
-        return results;
-    }
-
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java
deleted file mode 100644
index 386305bbda..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/AttributeInfo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package mini_jvm.attr;
-
-public abstract class AttributeInfo {
-	public static final String CODE = "Code";
-	public static final String CONST_VALUE = "ConstantValue";
-	public static final String EXCEPTIONS = "Exceptions";
-	public static final String LINE_NUM_TABLE = "LineNumberTable";
-	public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
-	public static final String STACK_MAP_TABLE = "StackMapTable";
-	int attrNameIndex;				
-	int attrLen ;
-	public AttributeInfo(int attrNameIndex, int attrLen) {
-		
-		this.attrNameIndex = attrNameIndex;
-		this.attrLen = attrLen;
-	}
-	
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java
deleted file mode 100644
index 4817c1eee8..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/CodeAttr.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package mini_jvm.attr;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.cmd.ByteCodeCommand;
-import mini_jvm.cmd.CommandParser;
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.loader.ByteCodeIterator;
-
-public class CodeAttr extends AttributeInfo {
-	private int maxStack ;
-	private int maxLocals ;
-	private int codeLen ;
-	private String code;
-	public String getCode() {
-		return code;
-	}
-
-	private ByteCodeCommand[] cmds ;
-	public ByteCodeCommand[] getCmds() {		
-		return cmds;
-	}
-
-	private LineNumberTable lineNumTable;
-	private LocalVariableTable localVarTable;
-	private StackMapTable stackMapTable;
-	
-	public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) {
-		super(attrNameIndex, attrLen);
-		this.maxStack = maxStack;
-		this.maxLocals = maxLocals;
-		this.codeLen = codeLen;
-		this.code = code;
-		this.cmds = cmds;
-	}
-
-	public void setLineNumberTable(LineNumberTable t) {
-		this.lineNumTable = t;
-	}
-
-	public void setLocalVariableTable(LocalVariableTable t) {
-		this.localVarTable = t;		
-	}
-	
-
-	public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){
-		
-		int attrNameIndex = iter.nextU2ToInt();
-		int attrLen = iter.nextU4ToInt();
-		int maxStack = iter.nextU2ToInt();
-		int maxLocals = iter.nextU2ToInt();
-		int codeLen = iter.nextU4ToInt();
-		
-		String code = iter.nextUxToHexString(codeLen);
-		
-		ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code);
-		CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds);
-		
-		int exceptionTableLen = iter.nextU2ToInt();
-		//TODO 处理exception
-		if(exceptionTableLen>0){
-			String exTable = iter.nextUxToHexString(exceptionTableLen);
-			System.out.println("Encountered exception table , just ignore it :" + exTable);
-			
-		}
-		
-		
-		int subAttrCount = iter.nextU2ToInt();
-		
-		for(int x=1; x<=subAttrCount; x++){
-			int subAttrIndex = iter.nextU2ToInt();
-			String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex);
-		
-			//已经向前移动了U2, 现在退回去。
-			iter.back(2);
-			//line item table
-			if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){
-				LineNumberTable t = LineNumberTable.parse(iter);
-				codeAttr.setLineNumberTable(t);
-			}
-			else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){
-				LocalVariableTable t = LocalVariableTable.parse(iter);
-				codeAttr.setLocalVariableTable(t);
-			} 
-			else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){
-				StackMapTable t = StackMapTable.parse(iter);
-				codeAttr.setStackMapTable(t);
-			}
-			else{
-				throw new RuntimeException("Need code to process " + subAttrName);
-			}
-			
-			
-		}
-		return codeAttr;
-	}
-	
-
-	public String toString(ConstantPool pool){
-		StringBuilder buffer = new StringBuilder();
-		//buffer.append("Code:").append(code).append("\n");
-		/*for(int i=0;i<cmds.length;i++){
-			buffer.append(cmds[i].toString(pool)).append("\n");
-		}*/
-		buffer.append("\n");
-		buffer.append(this.lineNumTable.toString());
-		buffer.append(this.localVarTable.toString(pool));
-		return buffer.toString();
-	}
-	private void setStackMapTable(StackMapTable t) {
-		this.stackMapTable = t;
-		
-	}
-
-	
-	
-	
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java
deleted file mode 100644
index 2b3ceea06a..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/ConstantValue.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package mini_jvm.attr;
-
-public class ConstantValue extends AttributeInfo {
-
-	private int constValueIndex;
-	
-	public ConstantValue(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);		
-	}
-	
-	
-	public int getConstValueIndex() {
-		return constValueIndex;
-	}
-	public void setConstValueIndex(int constValueIndex) {
-		this.constValueIndex = constValueIndex;
-	}
-	
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java
deleted file mode 100644
index 2d0002c347..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LineNumberTable.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package mini_jvm.attr;
-
-
-import mini_jvm.loader.ByteCodeIterator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class LineNumberTable extends AttributeInfo {
-	List<LineNumberItem> items = new ArrayList<LineNumberItem>();
-
-	public void addLineNumberItem(LineNumberItem item){
-		this.items.add(item);
-	}
-
-	public LineNumberTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-	}
-	
-	public static LineNumberTable parse(ByteCodeIterator iter){
-		
-		int index = iter.nextU2ToInt();
-		int len = iter.nextU4ToInt();
-		
-		LineNumberTable table = new LineNumberTable(index,len);
-		
-		int itemLen = iter.nextU2ToInt();
-		
-		for(int i=1; i<=itemLen; i++){
-			LineNumberItem item = new LineNumberItem();
-			item.setStartPC(iter.nextU2ToInt());
-			item.setLineNum(iter.nextU2ToInt());
-			table.addLineNumberItem(item);
-		}
-		return table;
-	}
-	
-	public String toString(){
-		StringBuilder buffer = new StringBuilder();
-		buffer.append("Line Number Table:\n");
-		for(LineNumberItem item : items){
-			buffer.append("startPC:"+item.getStartPC()).append(",");
-			buffer.append("lineNum:"+item.getLineNum()).append("\n");
-		}
-		buffer.append("\n");
-		return buffer.toString();
-		
-	}
-
-	private static class LineNumberItem{
-		int startPC;
-		int lineNum;
-		public int getStartPC() {
-			return startPC;
-		}
-		public void setStartPC(int startPC) {
-			this.startPC = startPC;
-		}
-		public int getLineNum() {
-			return lineNum;
-		}
-		public void setLineNum(int lineNum) {
-			this.lineNum = lineNum;
-		}
-	}
-	
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java
deleted file mode 100644
index 946ef5fa5d..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/LocalVariableTable.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package mini_jvm.attr;
-
-
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.loader.ByteCodeIterator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-
-public class LocalVariableTable extends AttributeInfo{
-
-	List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();
-	
-	public LocalVariableTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);		
-	}
-	
-	
-	private void addLocalVariableItem(LocalVariableItem item) {
-		this.items.add(item);		
-	}
-	
-	public static LocalVariableTable parse(ByteCodeIterator iter){
-		
-		int index = iter.nextU2ToInt();
-		int len = iter.nextU4ToInt();
-		
-		LocalVariableTable table = new LocalVariableTable(index,len);
-		
-		int itemLen = iter.nextU2ToInt();
-		
-		for(int i=1; i<=itemLen; i++){
-			LocalVariableItem item = new LocalVariableItem();
-			item.setStartPC(iter.nextU2ToInt());
-			item.setLength(iter.nextU2ToInt());
-			item.setNameIndex(iter.nextU2ToInt());
-			item.setDescIndex(iter.nextU2ToInt());
-			item.setIndex(iter.nextU2ToInt());
-			table.addLocalVariableItem(item);
-		}
-		return table;
-	}
-	
-	
-	public String toString(ConstantPool pool){
-		StringBuilder buffer = new StringBuilder();
-		buffer.append("Local Variable Table:\n");
-		for(LocalVariableItem item : items){
-			buffer.append("startPC:"+item.getStartPC()).append(",");
-			buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(",");
-			buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(",");
-			buffer.append("slotIndex:"+ item.getIndex()).append("\n");
-		}
-		buffer.append("\n");
-		return buffer.toString();
-	}
-
-	private static class LocalVariableItem {
-		private int startPC;
-		private int length;
-		private int nameIndex;
-		private int descIndex;
-		private int index;
-		public int getStartPC() {
-			return startPC;
-		}
-		public void setStartPC(int startPC) {
-			this.startPC = startPC;
-		}
-		public int getLength() {
-			return length;
-		}
-		public void setLength(int length) {
-			this.length = length;
-		}
-		public int getNameIndex() {
-			return nameIndex;
-		}
-		public void setNameIndex(int nameIndex) {
-			this.nameIndex = nameIndex;
-		}
-		public int getDescIndex() {
-			return descIndex;
-		}
-		public void setDescIndex(int descIndex) {
-			this.descIndex = descIndex;
-		}
-		public int getIndex() {
-			return index;
-		}
-		public void setIndex(int index) {
-			this.index = index;
-		}
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java b/students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java
deleted file mode 100644
index 65b3b24c82..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/attr/StackMapTable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package mini_jvm.attr;
-
-
-import mini_jvm.loader.ByteCodeIterator;
-
-public class StackMapTable extends AttributeInfo{
-	
-	private String originalCode;
-
-	public StackMapTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);		
-	}
-
-	public static StackMapTable parse(ByteCodeIterator iter){
-		int index = iter.nextU2ToInt();
-		int len = iter.nextU4ToInt();
-		StackMapTable t = new StackMapTable(index,len);
-		
-		//后面的StackMapTable太过复杂， 不再处理， 只把原始的代码读进来保存
-		String code = iter.nextUxToHexString(len);
-		t.setOriginalCode(code);
-		
-		return t;
-	}
-
-	private void setOriginalCode(String code) {
-		this.originalCode = code;
-		
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java
deleted file mode 100644
index b6717402da..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/AccessFlag.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package mini_jvm.clz;
-
-public class AccessFlag {
-	private int flagValue;
-
-	public AccessFlag(int value) {
-		this.flagValue = value;
-	}
-
-	public int getFlagValue() {
-		return flagValue;
-	}
-
-	public void setFlagValue(int flag) {
-		this.flagValue = flag;
-	}
-	
-	public boolean isPublicClass(){
-		return (this.flagValue & 0x0001) != 0;
-	}
-	public boolean isFinalClass(){
-		return (this.flagValue & 0x0010) != 0;
-	}
-	
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java
deleted file mode 100644
index d0884893aa..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassFile.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package mini_jvm.clz;
-
-import mini_jvm.constant.ClassInfo;
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.field.Field;
-import mini_jvm.method.Method;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ClassFile {
-
-	private int minorVersion;
-	private int majorVersion;
-
-	private AccessFlag accessFlag;
-	private ClassIndex clzIndex;
-	private ConstantPool pool;
-	private List<Field> fields = new ArrayList<Field>();
-	private List<Method> methods = new ArrayList<Method>();
-
-	public ClassIndex getClzIndex() {
-		return clzIndex;
-	}
-	public AccessFlag getAccessFlag() {
-		return accessFlag;
-	}
-	public void setAccessFlag(AccessFlag accessFlag) {
-		this.accessFlag = accessFlag;
-	}
-
-
-
-	public ConstantPool getConstantPool() {
-		return pool;
-	}
-	public int getMinorVersion() {
-		return minorVersion;
-	}
-	public void setMinorVersion(int minorVersion) {
-		this.minorVersion = minorVersion;
-	}
-	public int getMajorVersion() {
-		return majorVersion;
-	}
-	public void setMajorVersion(int majorVersion) {
-		this.majorVersion = majorVersion;
-	}
-	public void setConstPool(ConstantPool pool) {
-		this.pool = pool;
-
-	}
-	public void setClassIndex(ClassIndex clzIndex) {
-		this.clzIndex = clzIndex;
-	}
-
-	public void setFields(List<Field> f){
-		this.fields = f;
-	}
-	public List<Field> getFields(){
-		return this.fields;
-	}
-	public void addField(Field f){this.fields.add(f);}
-
-
-	public void setMethods(List<Method> m){
-		this.methods = m;
-	}
-	public List<Method> getMethods() {
-		return methods;
-	}
-	public void addMethod(Method m){this.methods.add(m);}
-
-
-
-	public void print(){
-		if(this.accessFlag.isPublicClass()){
-			System.out.println("Access flag : public  ");
-		}
-		System.out.println("Class Name:"+ getClassName());
-		System.out.println("Super Class Name:"+ getSuperClassName());
-	}
-
-	private String getClassName(){
-		int thisClassIndex = this.clzIndex.getThisClassIndex();
-		ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex);
-		return thisClass.getClassName();
-	}
-	public String getSuperClassName(){
-		ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
-		return superClass.getClassName();
-	}
-
-	public Method getMethod(String methodName, String paramAndReturnType){
-
-		for(Method m :methods){
-
-			int nameIndex = m.getNameIndex();
-			int descriptionIndex = m.getDescriptorIndex();
-
-			String name = this.getConstantPool().getUTF8String(nameIndex);
-			String desc = this.getConstantPool().getUTF8String(descriptionIndex);
-			if(name.equals(methodName) && desc.equals(paramAndReturnType)){
-				return m;
-			}
-		}
-		return null;
-	}
-	public Method getMainMethod(){
-		for(Method m :methods){
-			int nameIndex = m.getNameIndex();
-			int descIndex = m.getDescriptorIndex();
-			String name = this.getConstantPool().getUTF8String(nameIndex);
-			String desc = this.getConstantPool().getUTF8String(descIndex);
-			if(name.equals("main")  && desc.equals("([Ljava/lang/String;)V")){
-				return m;
-			}
-		}
-		return null;
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java b/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java
deleted file mode 100644
index dcc59908f0..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/clz/ClassIndex.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package mini_jvm.clz;
-
-public class ClassIndex {
-	private int thisClassIndex;
-	private int superClassIndex;
-	
-	public int getThisClassIndex() {
-		return thisClassIndex;
-	}
-	public void setThisClassIndex(int thisClassIndex) {
-		this.thisClassIndex = thisClassIndex;
-	}
-	public int getSuperClassIndex() {
-		return superClassIndex;
-	}
-	public void setSuperClassIndex(int superClassIndex) {
-		this.superClassIndex = superClassIndex;
-	}
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java
deleted file mode 100644
index bc2be8f9f8..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/BiPushCmd.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.Heap;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class BiPushCmd extends OneOperandCmd {
-
-	public BiPushCmd(ClassFile clzFile, String opCode) {
-		super(clzFile,opCode);
-	}
-
-	@Override
-	public String toString() {
-	
-		return this.getOffset()+":"+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand();
-	}
-	public void execute(StackFrame frame, ExecutionResult result){
-		int value = this.getOperand();
-		JavaObject jo = Heap.getInstance().newInt(value);
-		frame.getOprandStack().push(jo);
-		
-	}
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java
deleted file mode 100644
index cc877430c0..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ByteCodeCommand.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package mini_jvm.cmd;
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.ConstantInfo;
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.StackFrame;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-
-
-public abstract class ByteCodeCommand {	
-	
-	String opCode;
-	ClassFile clzFile;
-	private int offset;
-	
-	public static final String aconst_null = "01";
-	public static final String new_object = "BB";
-	public static final String lstore = "37";
-	public static final String invokespecial = "B7";
-	public static final String invokevirtual = "B6";
-	public static final String getfield = "B4";
-	public static final String putfield = "B5";
-	public static final String getstatic = "B2";
-	public static final String ldc = "12";
-	public static final String dup = "59";
-	public static final String bipush = "10";
-	public static final String aload_0 = "2A";
-	public static final String aload_1 = "2B";
-	public static final String aload_2 = "2C";
-	public static final String iload = "15";
-	public static final String iload_1 = "1B";
-	public static final String iload_2 = "1C";
-	public static final String iload_3 = "1D";
-	public static final String fload_3 = "25";
-
-	public static final String voidreturn = "B1";
-	public static final String ireturn = "AC";
-	public static final String freturn = "AE";
-
-	public static final String astore_1 = "4C";
-	public static final String if_icmp_ge = "A2";
-	public static final String if_icmple = "A4";
-	public static final String goto_no_condition = "A7";
-	public static final String iconst_0 = "03";
-	public static final String iconst_1 = "04";
-	public static final String istore_1 = "3C";
-	public static final String istore_2 = "3D";
-	public static final String iadd = "60";
-	public static final String iinc = "84";
-	private static Map<String,String> codeMap = new HashMap<String,String>();
-	
-	static{
-		codeMap.put("01", "aconst_null");
-		
-		codeMap.put("A2", "if_icmp_ge");
-		codeMap.put("A4", "if_icmple");
-		codeMap.put("A7", "goto");
-		
-		codeMap.put("BB", "new");
-		codeMap.put("37", "lstore");
-		codeMap.put("B7", "invokespecial");
-		codeMap.put("B6", "invokevirtual");
-		codeMap.put("B4", "getfield");
-		codeMap.put("B5", "putfield");
-		codeMap.put("B2", "getstatic");
-		
-		codeMap.put("2A", "aload_0");
-		codeMap.put("2B", "aload_1");
-		codeMap.put("2C", "aload_2");
-		
-		codeMap.put("10", "bipush");
-		codeMap.put("15", "iload");
-		codeMap.put("1A", "iload_0");
-		codeMap.put("1B", "iload_1");
-		codeMap.put("1C", "iload_2");
-		codeMap.put("1D", "iload_3");
-		
-		codeMap.put("25", "fload_3");
-		
-		codeMap.put("1E", "lload_0");
-		
-		codeMap.put("24", "fload_2");
-		codeMap.put("4C", "astore_1");
-		
-		codeMap.put("A2", "if_icmp_ge");
-		codeMap.put("A4", "if_icmple");
-		
-		codeMap.put("A7", "goto");
-		
-		codeMap.put("B1", "return");
-		codeMap.put("AC", "ireturn");
-		codeMap.put("AE", "freturn");
-		
-		codeMap.put("03", "iconst_0");
-		codeMap.put("04", "iconst_1");
-		
-		codeMap.put("3C", "istore_1");
-		codeMap.put("3D", "istore_2");
-		
-		codeMap.put("59", "dup");
-		
-		codeMap.put("60", "iadd");
-		codeMap.put("84", "iinc");
-		
-		codeMap.put("12", "ldc");
-	}
-	
-	
-
-	
-
-	protected ByteCodeCommand(ClassFile clzFile, String opCode){
-		this.clzFile = clzFile;
-		this.opCode = opCode;
-	}
-	
-	protected ClassFile getClassFile() {
-		return clzFile;
-	}
-	
-	public int getOffset() {
-		return offset;
-	}
-
-	public void setOffset(int offset) {
-		this.offset = offset;
-	}
-	protected ConstantInfo getConstantInfo(int index){
-		return this.getClassFile().getConstantPool().getConstantInfo(index);
-	}
-	
-	protected ConstantPool getConstantPool(){
-		return this.getClassFile().getConstantPool();
-	}
-	
-	
-	
-	public String getOpCode() {
-		return opCode;
-	}
-
-	public abstract int getLength();
-	
-	public String getReadableCodeText(){
-		String txt = codeMap.get(opCode);
-		if(txt == null){
-			return opCode;
-		}
-		return txt;
-	}
-	
-	public abstract void execute(StackFrame frame, ExecutionResult result);
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java
deleted file mode 100644
index 3effa7ae5d..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/CommandParser.java
+++ /dev/null
@@ -1,149 +0,0 @@
-package mini_jvm.cmd;
-
-import mini_jvm.clz.ClassFile;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class CommandParser {
-	
-	
-
-	public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) {
-
-		if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) {
-			throw new RuntimeException("the orignal code is not correct");
-
-		}
-
-		codes = codes.toUpperCase();
-
-		CommandIterator iter = new CommandIterator(codes);
-		List<ByteCodeCommand> cmds = new ArrayList<ByteCodeCommand>();
-
-		while (iter.hasNext()) {
-			String opCode = iter.next2CharAsString();
-
-			if (ByteCodeCommand.new_object.equals(opCode)) {
-				NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode);
-
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.invokespecial.equals(opCode)) {
-				InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-				// System.out.println( cmd.toString(clzFile.getConstPool()));
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.invokevirtual.equals(opCode)) {
-				InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.getfield.equals(opCode)) {
-				GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.getstatic.equals(opCode)) {
-				GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.putfield.equals(opCode)) {
-				PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.ldc.equals(opCode)) {
-				LdcCmd cmd = new LdcCmd(clzFile, opCode);
-				cmd.setOperand(iter.next2CharAsInt());
-				cmds.add(cmd);
-			} else if (ByteCodeCommand.bipush.equals(opCode)) {
-				BiPushCmd cmd = new BiPushCmd(clzFile, opCode);
-				cmd.setOperand(iter.next2CharAsInt());
-				cmds.add(cmd);
-			}else if(ByteCodeCommand.if_icmp_ge.equals(opCode) 
-					|| ByteCodeCommand.if_icmple.equals(opCode) 
-					|| ByteCodeCommand.goto_no_condition.equals(opCode)){
-				ComparisonCmd cmd = new ComparisonCmd(clzFile,opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-				cmds.add(cmd);
-			} else if(ByteCodeCommand.iinc.equals(opCode)){
-				IncrementCmd cmd = new IncrementCmd(clzFile,opCode);
-				cmd.setOprand1(iter.next2CharAsInt());
-				cmd.setOprand2(iter.next2CharAsInt());
-				cmds.add(cmd);
-			}
-			else if (ByteCodeCommand.dup.equals(opCode) 
-					|| ByteCodeCommand.aload_0.equals(opCode) 
-					|| ByteCodeCommand.aload_1.equals(opCode) 
-					|| ByteCodeCommand.aload_2.equals(opCode)
-					|| ByteCodeCommand.iload_1.equals(opCode) 
-					|| ByteCodeCommand.iload_2.equals(opCode) 
-					|| ByteCodeCommand.iload_3.equals(opCode)
-					|| ByteCodeCommand.fload_3.equals(opCode) 
-					|| ByteCodeCommand.iconst_0.equals(opCode)
-					|| ByteCodeCommand.iconst_1.equals(opCode)
-					|| ByteCodeCommand.istore_1.equals(opCode)
-					|| ByteCodeCommand.istore_2.equals(opCode)
-					|| ByteCodeCommand.voidreturn.equals(opCode) 
-					|| ByteCodeCommand.iadd.equals(opCode)
-					|| ByteCodeCommand.astore_1.equals(opCode)
-					|| ByteCodeCommand.ireturn.equals(opCode)) {
-
-				NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode);
-				cmds.add(cmd);
-			} else {
-				throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented");
-			}
-
-		}
-
-		calcuateOffset(cmds);
-
-		ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()];
-		cmds.toArray(result);
-		return result;
-	}
-
-	private static void calcuateOffset(List<ByteCodeCommand> cmds) {
-
-		int offset = 0;
-		for (ByteCodeCommand cmd : cmds) {
-			cmd.setOffset(offset);
-			offset += cmd.getLength();
-		}
-
-	}
-
-	private static class CommandIterator {
-		String codes = null;
-		int pos = 0;
-
-		CommandIterator(String codes) {
-			this.codes = codes;
-		}
-
-		public boolean hasNext() {
-			return pos < this.codes.length();
-		}
-
-		public String next2CharAsString() {
-			String result = codes.substring(pos, pos + 2);
-			pos += 2;
-			return result;
-		}
-
-		public int next2CharAsInt() {
-			String s = this.next2CharAsString();
-			return Integer.valueOf(s, 16).intValue();
-		}
-
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java
deleted file mode 100644
index e195966a83..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/ComparisonCmd.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class ComparisonCmd extends TwoOperandCmd {
-
-	protected ComparisonCmd(ClassFile clzFile, String opCode) {
-		super(clzFile, opCode);
-		
-	}
-
-	
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-		if(ByteCodeCommand.if_icmp_ge.equals(this.getOpCode())){
-			//注意次序
-			JavaObject jo2 = frame.getOprandStack().pop();
-			JavaObject jo1 = frame.getOprandStack().pop();
-			
-			if(jo1.getIntValue() >= jo2.getIntValue()){
-				
-				this.setJumpResult(result);
-				
-			}
-			
-		} else if(ByteCodeCommand.if_icmple.equals(this.getOpCode())){
-			//注意次序
-			JavaObject jo2 = frame.getOprandStack().pop();
-			JavaObject jo1 = frame.getOprandStack().pop();
-			
-			if(jo1.getIntValue() <= jo2.getIntValue()){
-				this.setJumpResult(result);
-			}
-			
-		} else if(ByteCodeCommand.goto_no_condition.equals(this.getOpCode())){
-			this.setJumpResult(result);
-			
-		} else{
-			throw new RuntimeException(this.getOpCode() + "has not been implemented");
-		}
-		
-		
-		
-		
-	}
-
-	private int getOffsetFromStartCmd(){
-		//If the comparison succeeds, the unsigned branchbyte1 and branchbyte2
-		//are used to construct a signed 16-bit offset, where the offset is calculated
-		//to be (branchbyte1 << 8) | branchbyte2. Execution then proceeds at that
-		//offset from the address of the opcode of this if_icmp<cond> instruction
-		
-	
-		int index1 = this.getOprand1();
-		int index2 = this.getOprand2();
-		short offsetFromCurrent = (short)(index1 << 8 | index2);				
-		return this.getOffset() + offsetFromCurrent ;
-	}
-	private void setJumpResult(ExecutionResult result){
-		
-		int offsetFromStartCmd = this.getOffsetFromStartCmd();		
-		
-		result.setNextAction(ExecutionResult.JUMP);
-		result.setNextCmdOffset(offsetFromStartCmd);
-	}
-
-	@Override
-	public String toString() {
-		int index = this.getIndex();
-		String text = this.getReadableCodeText();
-		return this.getOffset()+":"+ this.getOpCode() + " "+text + " " + this.getOffsetFromStartCmd();
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java
deleted file mode 100644
index b84aa9e15e..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetFieldCmd.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.FieldRefInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class GetFieldCmd extends TwoOperandCmd {
-
-	public GetFieldCmd(ClassFile clzFile, String opCode) {
-		super(clzFile,opCode);		
-	}
-
-	@Override
-	public String toString() {
-		
-		return super.getOperandAsField();
-	}
-
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-		FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex());
-		String fieldName = fieldRef.getFieldName();
-		JavaObject jo = frame.getOprandStack().pop();
-		JavaObject fieldValue = jo.getFieldValue(fieldName);
-		
-		frame.getOprandStack().push(fieldValue);
-		
-		
-		
-	}
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java
deleted file mode 100644
index a1696b7ffd..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/GetStaticFieldCmd.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.FieldRefInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.Heap;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class GetStaticFieldCmd extends TwoOperandCmd {
-
-	public GetStaticFieldCmd(ClassFile clzFile, String opCode) {
-		super(clzFile,opCode);
-		
-	}
-
-	@Override
-	public String toString() {
-		
-		return super.getOperandAsField();
-	}
-	
-	@Override	
-	public void execute(StackFrame frame, ExecutionResult result) {
-		FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex());
-		String className = info.getClassName();
-		String fieldName = info.getFieldName();
-		String fieldType = info.getFieldType();
-		
-		if("java/lang/System".equals(className) 
-				&& "out".equals(fieldName) 
-				&& "Ljava/io/PrintStream;".equals(fieldType)){
-			JavaObject jo = Heap.getInstance().newObject(className);
-			frame.getOprandStack().push(jo);
-		}
-		//TODO 处理非System.out的情况
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java
deleted file mode 100644
index 3afe4df883..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/IncrementCmd.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.Heap;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class IncrementCmd extends TwoOperandCmd {
-
-	public IncrementCmd(ClassFile clzFile, String opCode) {
-		super(clzFile, opCode);
-		
-	}
-
-	@Override
-	public String toString() {
-		
-		return this.getOffset()+":"+this.getOpCode()+ " " +this.getReadableCodeText();
-	}
-
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-		int index = this.getOprand1();
-		
-		int constValue = this.getOprand2();
-		
-		int currentValue = frame.getLocalVariableValue(index).getIntValue();
-		
-		JavaObject jo = Heap.getInstance().newInt(constValue+currentValue);
-		
-		frame.setLocalVariableValue(index, jo);
-		
-
-	}
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java
deleted file mode 100644
index ae0cd08d9b..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeSpecialCmd.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.MethodRefInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.MethodArea;
-import mini_jvm.engine.StackFrame;
-import mini_jvm.method.Method;
-
-public class InvokeSpecialCmd extends TwoOperandCmd {
-
-	public InvokeSpecialCmd(ClassFile clzFile, String opCode) {
-		super(clzFile,opCode);
-		
-	}
-
-	@Override
-	public String toString() {
-		
-		return super.getOperandAsMethod();
-	}
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-				
-		MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex());
-		
-		// 我们不用实现jang.lang.Object 的init方法
-		if(methodRefInfo.getClassName().equals("java/lang/Object") 
-				&& methodRefInfo.getMethodName().equals("<init>")){
-			return ;
-			
-		}
-		Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo);
-		
-		
-		result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
-		result.setNextMethod(nextMethod);
-		
-		
-		
-	}
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java
deleted file mode 100644
index 0414b98f18..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/InvokeVirtualCmd.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.MethodRefInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.MethodArea;
-import mini_jvm.engine.StackFrame;
-import mini_jvm.method.Method;
-
-public class InvokeVirtualCmd extends TwoOperandCmd {
-
-	public InvokeVirtualCmd(ClassFile clzFile,String opCode) {
-		super(clzFile,opCode);
-	}
-
-	@Override
-	public String toString() {
-		
-		return super.getOperandAsMethod();
-	}
-
-	private boolean isSystemOutPrintlnMethod(String className, String methodName){
-		return "java/io/PrintStream".equals(className) 
-				&& "println".equals(methodName);
-	}
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-		//先得到对该方法的描述
-		MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex());
-		
-		String className = methodRefInfo.getClassName();
-		String methodName = methodRefInfo.getMethodName();
-		
-		// 我们没有实现System.out.println方法，  所以也不用建立新的栈帧， 直接调用Java的方法， 打印出来即可。 
-		if(isSystemOutPrintlnMethod(className,methodName)){
-			JavaObject jo = (JavaObject)frame.getOprandStack().pop();
-			String value = jo.toString();
-			System.err.println("-------------------"+value+"----------------");
-			
-			// 这里就是那个out对象， 因为是个假的，直接pop出来
-			frame.getOprandStack().pop();
-			
-			return;
-		}
-		
-		//注意：多态， 这才是真正的对象, 先从该对象的class 中去找对应的方法，找不到的话再去找父类的方法
-		JavaObject jo = frame.getOprandStack().peek();
-		
-		MethodArea ma = MethodArea.getInstance();
-		
-		Method m = null;
-		
-		String currentClassName = jo.getClassName();
-		
-		while(currentClassName != null){
-			
-			ClassFile currentClassFile = ma.findClassFile(currentClassName);
-			
-			m = currentClassFile.getMethod(methodRefInfo.getMethodName(), 
-					methodRefInfo.getParamAndReturnType());
-			if(m != null){
-				
-				break;
-				
-			} else{
-				//查找父类
-				currentClassName = currentClassFile.getSuperClassName();
-			}
-		}	
-		
-		if(m == null){
-			throw new RuntimeException("Can't find method for :" + methodRefInfo.toString());
-		}
-		
-		
-		result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME);
-		
-		result.setNextMethod(m);
-	}
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java
deleted file mode 100644
index 2ada87ca6d..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/LdcCmd.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.ConstantInfo;
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.constant.StringInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.Heap;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class LdcCmd extends OneOperandCmd {
-
-	public LdcCmd(ClassFile clzFile, String opCode) {
-		super(clzFile,opCode);		
-	}
-	
-	@Override
-	public String toString() {
-		
-		ConstantInfo info = getConstantInfo(this.getOperand());
-		
-		String value = "TBD";
-		if(info instanceof StringInfo){
-			StringInfo strInfo = (StringInfo)info;
-			value = strInfo.toString();
-		}
-		
-		return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+  value;
-		
-	}
-	public void  execute(StackFrame frame, ExecutionResult result){
-		
-		ConstantPool pool = this.getConstantPool();
-		ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand());
-		
-		if(info instanceof StringInfo){
-			StringInfo strInfo = (StringInfo)info;
-			String value = strInfo.toString();
-			JavaObject jo = Heap.getInstance().newString(value);
-			frame.getOprandStack().push(jo);
-		}
-		else{
-			//TBD 处理其他类型
-			throw new RuntimeException("Only support StringInfo constant");
-		}
-		
-		
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java
deleted file mode 100644
index ef07cb7dcb..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NewObjectCmd.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.ClassInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.Heap;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class NewObjectCmd extends TwoOperandCmd{
-	
-	public NewObjectCmd(ClassFile clzFile, String opCode){
-		super(clzFile,opCode);
-	}
-
-	@Override
-	public String toString() {
-		
-		return super.getOperandAsClassInfo();
-	}
-	public void execute(StackFrame frame, ExecutionResult result){
-		
-		int index = this.getIndex();
-		
-		ClassInfo info = (ClassInfo)this.getConstantInfo(index);
-		
-		String clzName = info.getClassName();
-		
-		//在Java堆上创建一个实例
-		JavaObject jo = Heap.getInstance().newObject(clzName);
-		
-		frame.getOprandStack().push(jo);
-		
-		
-		
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java
deleted file mode 100644
index da490b7931..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/NoOperandCmd.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.Heap;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class NoOperandCmd extends ByteCodeCommand{
-
-	public NoOperandCmd(ClassFile clzFile, String opCode) {
-		super(clzFile, opCode);
-	}
-
-	@Override
-	public String toString() {
-		return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText();
-	}
-
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-		String opCode = this.getOpCode();
-		
-		if(ByteCodeCommand.aload_0.equals(opCode)){
-		
-			JavaObject jo = frame.getLocalVariableValue(0);
-			
-			frame.getOprandStack().push(jo);
-			
-		} else if(ByteCodeCommand.aload_1.equals(opCode)){
-			
-			JavaObject jo = frame.getLocalVariableValue(1);
-			
-			frame.getOprandStack().push(jo);
-			
-		} else if(ByteCodeCommand.aload_2.equals(opCode)){
-			
-			JavaObject jo = frame.getLocalVariableValue(2);
-			
-			frame.getOprandStack().push(jo);
-			
-		}else if(ByteCodeCommand.iload_1.equals(opCode)){
-			
-			JavaObject jo = frame.getLocalVariableValue(1);
-			
-			frame.getOprandStack().push(jo);
-			
-		} else if (ByteCodeCommand.iload_2.equals(opCode)){
-			
-			JavaObject jo = frame.getLocalVariableValue(2);
-			
-			frame.getOprandStack().push(jo);
-			
-		}  else if (ByteCodeCommand.iload_3.equals(opCode)){
-			
-			JavaObject jo = frame.getLocalVariableValue(3);
-			
-			frame.getOprandStack().push(jo);
-			
-		}else if (ByteCodeCommand.fload_3.equals(opCode)){
-			
-			JavaObject jo = frame.getLocalVariableValue(3);
-			
-			frame.getOprandStack().push(jo);
-			
-		}
-		else if (ByteCodeCommand.voidreturn.equals(opCode)){
-			
-			result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME);
-			
-		} else if(ByteCodeCommand.ireturn.equals(opCode)){
-			StackFrame callerFrame = frame.getCallerFrame();
-			JavaObject jo = frame.getOprandStack().pop();
-			callerFrame.getOprandStack().push(jo);
-			
-		} else if(ByteCodeCommand.freturn.equals(opCode)){
-			
-			StackFrame callerFrame = frame.getCallerFrame();
-			JavaObject jo = frame.getOprandStack().pop();
-			callerFrame.getOprandStack().push(jo);
-		}
-		
-		else if(ByteCodeCommand.astore_1.equals(opCode)){
-			
-			JavaObject jo = frame.getOprandStack().pop();
-			
-		    frame.setLocalVariableValue(1, jo);
-		    
-		} else if(ByteCodeCommand.dup.equals(opCode)){
-			
-			JavaObject jo = frame.getOprandStack().peek();
-			frame.getOprandStack().push(jo);
-			
-		} else if(ByteCodeCommand.iconst_0.equals(opCode)){
-			
-			JavaObject jo = Heap.getInstance().newInt(0);
-			
-			frame.getOprandStack().push(jo);
-			
-		} else if(ByteCodeCommand.iconst_1.equals(opCode)){
-			
-			JavaObject jo = Heap.getInstance().newInt(1);
-			
-			frame.getOprandStack().push(jo);
-			
-		} else if(ByteCodeCommand.istore_1.equals(opCode)){
-			
-			JavaObject jo = frame.getOprandStack().pop();
-			
-			frame.setLocalVariableValue(1, jo);
-			
-		}  else if(ByteCodeCommand.istore_2.equals(opCode)){
-			
-			JavaObject jo = frame.getOprandStack().pop();
-			
-			frame.setLocalVariableValue(2, jo);
-			
-		} else if(ByteCodeCommand.iadd.equals(opCode)){
-			
-			JavaObject jo1 = frame.getOprandStack().pop();
-			JavaObject jo2 = frame.getOprandStack().pop();
-			
-			JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue());
-			
-			frame.getOprandStack().push(sum);
-			
-		} else if (ByteCodeCommand.aconst_null.equals(opCode)){
-			
-			frame.getOprandStack().push(null);
-			
-		} 
-		else{
-			throw new RuntimeException("you must forget to implement the operation :" + opCode);
-		}
-		
-		
-	}
-	
-	
-	public  int getLength(){
-		return 1;
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java
deleted file mode 100644
index 0ffadfbd2b..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/OneOperandCmd.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package mini_jvm.cmd;
-
-import mini_jvm.clz.ClassFile;
-
-
-
-public abstract class OneOperandCmd extends ByteCodeCommand {
-
-	private int operand;
-	
-	public OneOperandCmd(ClassFile clzFile, String opCode) {
-		super(clzFile, opCode);
-		
-	}
-	public  int getOperand() {
-		
-		return this.operand;
-	}
-
-	public void setOperand(int oprand1) {
-		this.operand = oprand1;
-		
-	}
-	public  int getLength(){
-		return 2;
-	}
-
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java
deleted file mode 100644
index 94652375fd..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/PutFieldCmd.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.ClassInfo;
-import mini_jvm.constant.FieldRefInfo;
-import mini_jvm.constant.NameAndTypeInfo;
-import mini_jvm.engine.ExecutionResult;
-import mini_jvm.engine.JavaObject;
-import mini_jvm.engine.StackFrame;
-
-public class PutFieldCmd extends TwoOperandCmd {
-
-	public PutFieldCmd(ClassFile clzFile, String opCode) {
-		super(clzFile,opCode);
-	}
-
-	@Override
-	public String toString() {
-		
-		return super.getOperandAsField();
-	}
-	@Override
-	public void execute(StackFrame frame, ExecutionResult result) {
-		
-		FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex());
-		
-		ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex());
-		NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex());
-		// for example : name
-		String fieldName = nameTypeInfo.getName();
-		// for example : Ljava/lang/String : 注意：我们不再检查类型
-		String fieldType = nameTypeInfo.getTypeInfo();
-		
-		JavaObject fieldValue = frame.getOprandStack().pop();
-		JavaObject objectRef = frame.getOprandStack().pop();
-		
-		objectRef.setFieldValue(fieldName, fieldValue);
-		
-	}
-
-
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java b/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java
deleted file mode 100644
index 93ea4b02bf..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/cmd/TwoOperandCmd.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package mini_jvm.cmd;
-
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.ClassInfo;
-import mini_jvm.constant.ConstantInfo;
-import mini_jvm.constant.FieldRefInfo;
-import mini_jvm.constant.MethodRefInfo;
-
-public abstract class TwoOperandCmd extends ByteCodeCommand{
-	
-	int oprand1 = -1;
-	int oprand2 = -1;
-	
-	public int getOprand1() {
-		return oprand1;
-	}
-
-	public void setOprand1(int oprand1) {
-		this.oprand1 = oprand1;
-	}
-
-	public void setOprand2(int oprand2) {
-		this.oprand2 = oprand2;
-	}
-
-	public int getOprand2() {
-		return oprand2;
-	}
-	
-	public TwoOperandCmd(ClassFile clzFile, String opCode) {
-		super(clzFile, opCode);
-	}
-
-	public int getIndex(){
-		int oprand1 = this.getOprand1();
-		int oprand2 = this.getOprand2();
-		int index = oprand1 << 8 | oprand2;
-		return index;
-	}
-	
-	protected String getOperandAsClassInfo(){
-		int index = getIndex();
-		String codeTxt = getReadableCodeText();
-		ClassInfo info = (ClassInfo)getConstantInfo(index);
-		return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +"  "+ info.getClassName();
-	}
-	
-	protected String getOperandAsMethod(){
-		int index = getIndex();
-		String codeTxt = getReadableCodeText();
-		ConstantInfo constInfo = this.getConstantInfo(index);
-		MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index);
-		return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +"  "+ info.toString();
-	}
-
-	protected String getOperandAsField(){
-		int index = getIndex();
-		
-		String codeTxt = getReadableCodeText();
-		FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index);
-		return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +"  "+ info.toString();
-	}
-	public  int getLength(){
-		return 3;
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java
deleted file mode 100644
index 8b974772fe..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ClassInfo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package mini_jvm.constant;
-
-public class ClassInfo extends ConstantInfo {
-	private final int type = ConstantInfo.CLASS_INFO;
-
-	private int utf8Index ;
-	public ClassInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getUtf8Index() {
-		return utf8Index;
-	}
-	public void setUtf8Index(int utf8Index) {
-		this.utf8Index = utf8Index;
-	}
-	public int getType() {
-		return type;
-	}
-	
-	public String getClassName() {		
-		int index = getUtf8Index();
-		UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index);
-		return utf8Info.getValue();		
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java
deleted file mode 100644
index 54f89aacd8..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package mini_jvm.constant;
-
-public abstract class ConstantInfo {
-	public static final int UTF8_INFO = 1;
-	public static final int FLOAT_INFO = 4;
-	public static final int CLASS_INFO = 7;
-	public static final int STRING_INFO = 8;
-	public static final int FIELD_INFO = 9;
-	public static final int METHOD_INFO = 10;
-	public static final int NAME_AND_TYPE_INFO = 12;
-
-	protected ConstantPool constantPool;
-	
-	public ConstantInfo(){}
-	
-	public ConstantInfo(ConstantPool pool) {
-		this.constantPool = pool;
-	}
-	public abstract int getType();
-	
-	public ConstantPool getConstantPool() {
-		return constantPool;
-	}
-	public ConstantInfo getConstantInfo(int index){
-		return this.constantPool.getConstantInfo(index);
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java
deleted file mode 100644
index c5d8348d89..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/ConstantPool.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package mini_jvm.constant;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ConstantPool {
-	
-	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
-	
-	public ConstantPool(){}
-
-	public void addConstantInfo(ConstantInfo info){
-		this.constantInfos.add(info);
-	}
-	
-	public ConstantInfo getConstantInfo(int index){
-		return this.constantInfos.get(index);
-	}
-	public String getUTF8String(int index){
-		return ((UTF8Info)this.constantInfos.get(index)).getValue();
-	}
-	public Object getSize() {		
-		return this.constantInfos.size() -1;
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java
deleted file mode 100644
index be474180d8..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/FieldRefInfo.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package mini_jvm.constant;
-
-public class FieldRefInfo extends ConstantInfo{
-	private final int type = ConstantInfo.FIELD_INFO;
-
-	private int classInfoIndex;
-	private int nameAndTypeIndex;
-	
-	public FieldRefInfo(ConstantPool pool) {
-		super(pool);
-	}
-	public int getType() {
-		return type;
-	}
-	
-	public int getClassInfoIndex() {
-		return classInfoIndex;
-	}
-	public void setClassInfoIndex(int classInfoIndex) {
-		this.classInfoIndex = classInfoIndex;
-	}
-	public int getNameAndTypeIndex() {
-		return nameAndTypeIndex;
-	}
-	public void setNameAndTypeIndex(int nameAndTypeIndex) {
-		this.nameAndTypeIndex = nameAndTypeIndex;
-	}
-	
-	public String toString(){
-		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
-		return getClassName() +" : "+  typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]";
-	}
-	
-	public String getClassName(){
-		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
-		UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index());
-		return utf8Info.getValue();
-	}
-	
-	public String getFieldName(){
-		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getName();		
-	}
-	
-	public String getFieldType(){
-		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getTypeInfo();	
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java
deleted file mode 100644
index 8e3789e1b4..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/MethodRefInfo.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package mini_jvm.constant;
-
-public class MethodRefInfo extends ConstantInfo {
-	
-	private final int type = ConstantInfo.METHOD_INFO;
-	
-	private int classInfoIndex;	
-	private int nameAndTypeIndex;
-	
-	public MethodRefInfo(ConstantPool pool) {
-		 super(pool);
-	}
-
-	public int getType() {
-		return type;
-	}
-	
-	public int getClassInfoIndex() {
-		return classInfoIndex;
-	}
-	public void setClassInfoIndex(int classInfoIndex) {
-		this.classInfoIndex = classInfoIndex;
-	}
-	public int getNameAndTypeIndex() {
-		return nameAndTypeIndex;
-	}
-	public void setNameAndTypeIndex(int nameAndTypeIndex) {
-		this.nameAndTypeIndex = nameAndTypeIndex;
-	}
-	
-	public String toString(){
-		return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ;
-	}
-
-	public String getClassName(){
-		ConstantPool pool = this.getConstantPool();
-		ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex());
-		return clzInfo.getClassName();
-	}
-	
-	public String getMethodName(){
-		ConstantPool pool = this.getConstantPool();
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getName();
-	}
-	
-	public String getParamAndReturnType(){
-		ConstantPool pool = this.getConstantPool();
-		NameAndTypeInfo  typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getTypeInfo();
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java
deleted file mode 100644
index 142787ce16..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NameAndTypeInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package mini_jvm.constant;
-
-public class NameAndTypeInfo extends ConstantInfo{
-	public final int type = ConstantInfo.NAME_AND_TYPE_INFO;
-	
-	private int index1;
-	private int index2;
-	
-	public NameAndTypeInfo(ConstantPool pool) {
-		super(pool);
-	}
-	
-	public int getIndex1() {
-		return index1;
-	}
-	public void setIndex1(int index1) {
-		this.index1 = index1;
-	}
-	public int getIndex2() {
-		return index2;
-	}
-	public void setIndex2(int index2) {
-		this.index2 = index2;
-	}
-	public int getType() {
-		return type;
-	}
-	
-	
-	public String getName(){
-		ConstantPool pool = this.getConstantPool();
-		UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1);
-		return utf8Info1.getValue();
-	}
-	
-	public String getTypeInfo(){
-		ConstantPool pool = this.getConstantPool();
-		UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2);
-		return utf8Info2.getValue();
-	}
-	
-	public String toString(){
-		return "(" + getName() + "," + getTypeInfo()+")";
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java
deleted file mode 100644
index 6c3bcad2df..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/NullConstantInfo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package mini_jvm.constant;
-
-public class NullConstantInfo extends ConstantInfo {
-
-	public NullConstantInfo(){}
-
-	@Override
-	public int getType() {		
-		return -1;
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java
deleted file mode 100644
index 8b432cffb7..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/StringInfo.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package mini_jvm.constant;
-
-public class StringInfo extends ConstantInfo{
-	private final int type = ConstantInfo.STRING_INFO;
-	private int index;
-
-	public StringInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getType() {
-		return type;
-	}
-	public int getIndex() {
-		return index;
-	}
-	public void setIndex(int index) {
-		this.index = index;
-	}
-
-	public String toString(){
-		return this.getConstantPool().getUTF8String(index);
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java b/students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java
deleted file mode 100644
index 2c2253e622..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/constant/UTF8Info.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package mini_jvm.constant;
-
-public class UTF8Info extends ConstantInfo{
-	private final int type = ConstantInfo.UTF8_INFO;
-
-	private int length ;
-	private String value;
-
-	public UTF8Info(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getLength() {
-		return length;
-	}
-	public void setLength(int length) {
-		this.length = length;
-	}
-	public String getValue() {
-		return value;
-	}
-	public void setValue(String value) {
-		this.value = value;
-	}
-	public int getType() {
-		return type;
-	}
-
-	@Override
-	public String toString() {
-		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]";
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java
deleted file mode 100644
index 58c9d26dca..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutionResult.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package mini_jvm.engine;
-
-
-import mini_jvm.method.Method;
-
-public class ExecutionResult {
-	public static final int RUN_NEXT_CMD = 1;
-	public static final int JUMP = 2;
-	public static final int EXIT_CURRENT_FRAME = 3;
-	public static final int PAUSE_AND_RUN_NEW_FRAME = 4;
-	
-	private int nextAction = RUN_NEXT_CMD; 
-	
-	private int nextCmdOffset = 0;
-	
-	private Method nextMethod;
-	
-	public Method getNextMethod() {
-		return nextMethod;
-	}
-	public void setNextMethod(Method nextMethod) {
-		this.nextMethod = nextMethod;
-	}
-
-	
-	
-	public void setNextAction(int action){
-		this.nextAction = action;
-	}
-	public boolean isPauseAndRunNewFrame(){
-		return this.nextAction == PAUSE_AND_RUN_NEW_FRAME;
-	}
-	public boolean isExitCurrentFrame(){
-		return this.nextAction == EXIT_CURRENT_FRAME;
-	}
-	
-	public boolean isRunNextCmd(){
-		return this.nextAction == RUN_NEXT_CMD;
-	}
-	
-	public boolean isJump(){
-		return this.nextAction == JUMP;
-	}
-	
-	public int getNextCmdOffset() {
-		return nextCmdOffset;
-	}
-
-	public void setNextCmdOffset(int nextCmdOffset) {
-		this.nextCmdOffset = nextCmdOffset;
-	}
-	
-	
-	
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java
deleted file mode 100644
index d7ef541eb8..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/ExecutorEngine.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package mini_jvm.engine;
-
-import mini_jvm.method.Method;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-public class ExecutorEngine {
-
-	private Stack<StackFrame> stack = new Stack<StackFrame>();
-	
-	public ExecutorEngine() {
-		
-	}
-	
-	public void execute(Method mainMethod){
-		
-		StackFrame mainFrame = StackFrame.create(mainMethod);
-		stack.push(mainFrame);
-		
-		while(!stack.empty()){
-			
-			StackFrame frame = stack.peek();			
-			
-			ExecutionResult result = frame.execute();
-			
-			if(result.isPauseAndRunNewFrame()){
-				
-				Method nextMethod = result.getNextMethod();
-				StackFrame nextFrame = StackFrame.create(nextMethod);
-				nextFrame.setCallerFrame(frame);				
-				setupFunctionCallParams(frame,nextFrame);
-				
-				stack.push(nextFrame);
-				
-			} else {
-				stack.pop();
-			}
-		}
-		
-	}
-	
-	
-	
-	private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) {
-		
-		Method nextMethod = nextFrame.getMethod();
-		
-		
-		List<String> paramList = nextMethod.getParameterList();
-		
-		//加上1 是因为要把this也传递过去
-		
-		int paramNum = paramList.size() + 1;
-		
-		
-		List<JavaObject> values = new ArrayList<JavaObject>();
-		
-		//数据结构知识：  从栈中取出栈顶的x个元素
-		while(paramNum>0){			
-			values.add(currentFrame.getOprandStack().pop());
-			paramNum --;
-		}
-		//数据结构知识：  把一个列表倒序排列
-		List<JavaObject> params = new ArrayList<JavaObject>();
-		
-		for(int i=values.size()-1; i>=0 ;i--){
-			params.add(values.get(i));
-		}
-		
-		
-		nextFrame.setLocalVariableTable(params);
-		
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java
deleted file mode 100644
index 4a197b98f6..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/Heap.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package mini_jvm.engine;
-
-public class Heap {
-	
-	/**
-	 * 没有实现垃圾回收， 所以对于下面新创建的对象， 并没有记录到一个数据结构当中
-	 */
-	
-	private static Heap instance = new Heap();
-	private Heap() {		
-	}
-	public static Heap getInstance(){
-		return instance;
-	}
-	public JavaObject newObject(String clzName){
-		
-		JavaObject jo = new JavaObject(JavaObject.OBJECT);
-		jo.setClassName(clzName);
-		return jo;
-	}
-	
-	public JavaObject newString(String value){
-		JavaObject jo = new JavaObject(JavaObject.STRING);
-		jo.setStringValue(value);
-		return jo;
-	}
-	
-	public JavaObject newFloat(float value){
-		JavaObject jo = new JavaObject(JavaObject.FLOAT);
-		jo.setFloatValue(value);
-		return jo;
-	}
-	public JavaObject newInt(int value){
-		JavaObject jo = new JavaObject(JavaObject.INT);
-		jo.setIntValue(value);
-		return jo;
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java
deleted file mode 100644
index 51185b1056..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/JavaObject.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package mini_jvm.engine;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class JavaObject {
-	public static final int OBJECT = 1;
-	public static final int STRING = 2;
-	public static final int INT = 3;
-	public static final int FLOAT = 4;
-	
-	int type;
-	private String className;
-	
-	private Map<String, JavaObject> fieldValues = new HashMap<String,JavaObject>();
-	
-	private String stringValue;
-	
-	private int intValue;
-	
-	private float floatValue;
-	
-	public void setFieldValue(String fieldName, JavaObject fieldValue){
-		fieldValues.put(fieldName, fieldValue);
-	}
-	public JavaObject(int type){
-		this.type = type;
-	}
-	public void setClassName(String className){
-		this.className = className;
-	}
-	public void setStringValue(String value){
-		stringValue = value;
-	}
-	public String getStringValue(){
-		return this.stringValue;
-	}
-	public void setIntValue(int value) {
-		this.intValue = value;		
-	}
-	public int getIntValue(){
-		return this.intValue;
-	}
-	public int getType(){
-		return type;
-	}
-	public JavaObject getFieldValue(String fieldName){
-		return this.fieldValues.get(fieldName);
-	}
-	public String toString(){
-		switch(this.getType()){
-		case INT: 
-			return String.valueOf(this.intValue);
-		case STRING:
-			return this.stringValue;
-		case OBJECT:
-			return this.className +":"+ this.fieldValues;
-		case FLOAT :
-			return String.valueOf(this.floatValue);
-		default:
-			return null;
-		}
-	}
-	public String getClassName(){
-		return this.className;
-	}
-	public void setFloatValue(float value) {
-		this.floatValue = value;		
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java
deleted file mode 100644
index 29e7c5a380..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MethodArea.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package mini_jvm.engine;
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.constant.MethodRefInfo;
-import mini_jvm.loader.ClassFileLoader;
-import mini_jvm.method.Method;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-
-public class MethodArea {
-	
-	public static final MethodArea instance = new MethodArea();
-	
-	/**
-	 * 注意：我们做了极大的简化， ClassLoader 只有一个， 实际JVM中的ClassLoader,是一个双亲委托的模型
-	 */
-	
-	private ClassFileLoader clzLoader = null;
-	
-	Map<String,ClassFile> map = new HashMap<String,ClassFile>();
-	
-	private MethodArea(){		
-	}
-	
-	public static MethodArea getInstance(){
-		return instance;
-	}
-	
-	public void setClassFileLoader(ClassFileLoader clzLoader){
-		this.clzLoader = clzLoader;
-	}
-	
-	public Method getMainMethod(String className){
-		
-		ClassFile clzFile = this.findClassFile(className);
-		
-		return clzFile.getMainMethod();
-	}
-	
-	
-	public  ClassFile findClassFile(String className){
-		
-		if(map.get(className) != null){
-			return map.get(className);
-		}
-		// 看来该class 文件还没有load过
-		ClassFile clzFile = this.clzLoader.loadClass(className);
-		
-		map.put(className, clzFile);
-		
-		return clzFile;
-		
-	}
-	
-	
-	public Method getMethod(String className, String methodName, String paramAndReturnType){
-		
-		ClassFile clz = this.findClassFile(className);
-		
-		Method m = clz.getMethod(methodName, paramAndReturnType);
-		
-		if(m == null){
-			
-			throw new RuntimeException("method can't be found : \n" 
-					+ "class: " + className
-					+ "method: " + methodName
-					+ "paramAndReturnType: " + paramAndReturnType);
-		}
-		
-		return m;
-	}
-	
-	
-	public Method getMethod(MethodRefInfo methodRef){
-		
-		ClassFile clz = this.findClassFile(methodRef.getClassName());
-		
-		Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType());
-		
-		if(m == null){
-			throw new RuntimeException("method can't be found : " + methodRef.toString());
-		}
-		
-		return m;
-			
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java
deleted file mode 100644
index 6781fed5ad..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/MiniJVM.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package mini_jvm.engine;
-
-import mini_jvm.loader.ClassFileLoader;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-
-
-public class MiniJVM {
-	
-	public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{
-		
-		ClassFileLoader loader = new ClassFileLoader();
-		for(int i=0;i<classPaths.length ; i++){
-			loader.addClassPath(classPaths[i]);
-		}
-		
-		MethodArea methodArea= MethodArea.getInstance();
-		
-		methodArea.setClassFileLoader(loader);
-		
-		ExecutorEngine engine = new ExecutorEngine();
-		
-		className = className.replace(".", "/");
-		
-		engine.execute(methodArea.getMainMethod(className));
-	}
-	
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java
deleted file mode 100644
index 6bfd165f3b..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/OperandStack.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package mini_jvm.engine;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class OperandStack {
-	private List<JavaObject> operands = new ArrayList<JavaObject>();
-	
-	public void push(JavaObject jo){
-		operands.add(jo);
-	}
-	public JavaObject pop(){
-		int index = size()-1;
-		JavaObject jo = (JavaObject)operands.get(index);
-		operands.remove(index);
-		return jo;
-		
-	}
-	public JavaObject top(){
-		int index = size()-1;
-		return (JavaObject)operands.get(index);
-	}
-	public int size(){
-		return operands.size();		
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java b/students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java
deleted file mode 100644
index 65b4bc119d..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/engine/StackFrame.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package mini_jvm.engine;
-
-import mini_jvm.cmd.ByteCodeCommand;
-import mini_jvm.method.Method;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Stack;
-
-
-public class StackFrame {
-	
-	private List<JavaObject> localVariableTable = new ArrayList<JavaObject>();
-	private Stack<JavaObject> oprandStack = new Stack<JavaObject>();
-	
-	int index = 0;
-	
-	private Method m = null;
-	
-	private StackFrame callerFrame = null;
-	
-	public StackFrame getCallerFrame() {
-		return callerFrame;
-	}
-
-	public void setCallerFrame(StackFrame callerFrame) {
-		this.callerFrame = callerFrame;
-	}
-
-	public static  StackFrame create(Method m){
-		StackFrame frame = new StackFrame(m);
-		return frame;
-	}
-
-	
-	private StackFrame(Method m) {		
-		this.m = m;
-	}
-	
-	
-	
-	public JavaObject getLocalVariableValue(int index){
-		return this.localVariableTable.get(index);
-	}
-	
-	public Stack<JavaObject> getOprandStack(){
-		return this.oprandStack;
-	}
-	
-	public int getNextCommandIndex(int offset){
-		
-		ByteCodeCommand[] cmds = m.getCodeAttr().getCmds();
-		for(int i=0;i<cmds.length; i++){
-			if(cmds[i].getOffset() == offset){
-				return i;
-			}
-		}
-		throw new RuntimeException("Can't find next command");
-	}
-	
-	public ExecutionResult execute(){
-		
-				
-		ByteCodeCommand [] cmds = m.getCmds();
-		
-		while(index<cmds.length){
-			
-			ExecutionResult result = new ExecutionResult();	
-			//缺省值是执行下一条命令
-			result.setNextAction(ExecutionResult.RUN_NEXT_CMD);
-			
-			System.out.println(cmds[index].toString());
-			
-			cmds[index].execute(this,result);
-			
-			if(result.isRunNextCmd()){
-				index++;
-			}
-			else if(result.isExitCurrentFrame()){
-				return result;
-			}
-			else if(result.isPauseAndRunNewFrame()){
-				index++;
-				return result;
-			}					
-			else if(result.isJump()){
-				int offset = result.getNextCmdOffset();
-				this.index = getNextCommandIndex(offset);
-			} else{
-				index++;
-			}
-			
-		}
-		
-		//当前StackFrmae的指令全部执行完毕，可以退出了
-		ExecutionResult result = new ExecutionResult();
-		result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME);
-		return result;
-		
-	}
-
-	
-	
-	
-	public void setLocalVariableTable(List<JavaObject> values){
-		this.localVariableTable = values;	
-	}
-	
-	public void setLocalVariableValue(int index, JavaObject jo){
-		//问题： 为什么要这么做？？
-		if(this.localVariableTable.size()-1 < index){
-			for(int i=this.localVariableTable.size(); i<=index; i++){
-				this.localVariableTable.add(null);
-			}
-		}
-		this.localVariableTable.set(index, jo);
-		
-		
-	}
-	
-	public Method getMethod(){
-		return m;
-	}
-	
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java b/students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java
deleted file mode 100644
index 1379bd3715..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/field/Field.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package mini_jvm.field;
-
-
-import mini_jvm.attr.AttributeInfo;
-import mini_jvm.attr.ConstantValue;
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.constant.UTF8Info;
-import mini_jvm.loader.ByteCodeIterator;
-
-public class Field {
-	private int accessFlag;
-	private int nameIndex;
-	private int descriptorIndex;
-
-	private ConstantPool pool;
-	private ConstantValue constValue;
-
-	public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) {
-
-		this.accessFlag = accessFlag;
-		this.nameIndex = nameIndex;
-		this.descriptorIndex = descriptorIndex;
-		this.pool = pool;
-	}
-
-	public String toString() {
-		String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue();
-
-		String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue();
-		return name +":"+ desc;
-	}
-
-
-	public static Field parse(ConstantPool pool,ByteCodeIterator iter){
-
-		int accessFlag = iter.nextU2ToInt();
-		int nameIndex = iter.nextU2ToInt();
-		int descIndex = iter.nextU2ToInt();
-		int attribCount = iter.nextU2ToInt();
-		//System.out.println("field attribute count:"+ attribCount);
-
-		Field f = new Field(accessFlag, nameIndex, descIndex,pool);
-
-		for( int i=1; i<= attribCount; i++){
-			int attrNameIndex = iter.nextU2ToInt();
-			String attrName = pool.getUTF8String(attrNameIndex);
-
-			if(AttributeInfo.CONST_VALUE.equals(attrName)){
-				int attrLen = iter.nextU4ToInt();
-				ConstantValue constValue = new ConstantValue(attrNameIndex, attrLen);
-				constValue.setConstValueIndex(iter.nextU2ToInt());
-				f.setConstantValue(constValue);
-			} else{
-				throw new RuntimeException("the attribute " + attrName + " has not been implemented yet.");
-			}
-		}
-
-		return f;
-	}
-	public void setConstantValue(ConstantValue constValue) {
-		this.constValue = constValue;
-	}
-
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java
deleted file mode 100644
index 318c48cf5b..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ByteCodeIterator.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package mini_jvm.loader;
-
-import mini_jvm.util.Util;
-
-public class ByteCodeIterator {
-
-    private byte[] byteCodes;
-    private int currentIndex = -1;
-    private int byteSize = 0;
-
-    ByteCodeIterator(byte[] byteCodes){
-        this.byteCodes = byteCodes;
-        this.byteSize = byteCodes.length;
-    }
-
-    public boolean hasNext(){
-        return currentIndex < byteSize;
-    }
-
-
-    public int nextU1ToInt(){
-        return Util.byteToInt(new byte[]{byteCodes[++currentIndex]});
-    }
-
-    public int nextU2ToInt(){
-        return Util.byteToInt(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex]});
-    }
-
-    public int nextU4ToInt(){
-        return Util.byteToInt(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex],
-                byteCodes[++currentIndex],byteCodes[++currentIndex]});
-    }
-
-    public String nextU2ToHexString(){
-        return Util.byteToHexString(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex]});
-    }
-
-    public String nextU4ToHexString(){
-        return Util.byteToHexString(new byte[]{byteCodes[++currentIndex],byteCodes[++currentIndex],
-                byteCodes[++currentIndex],byteCodes[++currentIndex]});
-    }
-
-    public String nextBytesLenAsString(int BytesLen) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < BytesLen; i++) {
-            char c = (char) byteCodes[++currentIndex];
-            sb.append(c);
-        }
-        return sb.toString();
-    }
-
-    public String nextUxToHexString(int len) {
-        byte[] tmp = new byte[len];
-        for (int i = 0; i < len; i++) {
-            tmp[i] = byteCodes[++currentIndex];
-        }
-        return Util.byteToHexString(tmp).toLowerCase();
-    }
-
-    public void back(int n) {
-        this.currentIndex -= n;
-    }
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java
deleted file mode 100644
index 974914032e..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileLoader.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package mini_jvm.loader;
-
-import mini_jvm.clz.ClassFile;
-import org.apache.commons.io.IOUtils;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class ClassFileLoader {
-
-	private List<String> clzPaths = new ArrayList<String>();
-
-	public ClassFile loadClass(String className){
-		byte[] byteCodes = readBinaryCode(className);
-		ClassFileParser classFileParser = new ClassFileParser();
-		ClassFile clzFile = classFileParser.parse(byteCodes);
-		return clzFile;
-	}
-
-
-	/**
-	 * 读取class文件的二进制代码
-	 * @param className
-	 * @return
-     */
-	public byte[] readBinaryCodeV1(String className) {
-		String clazzPath = getClassPath(className);
-		BufferedInputStream bins = null;
-		ByteArrayOutputStream  bouts = new ByteArrayOutputStream();
-		try {
-			bins = new BufferedInputStream(new FileInputStream(new File(clazzPath)));
-			byte[] buffer = new byte[1024];
-			int length = -1;
-			while((length = bins.read(buffer)) != -1){
-				bouts.write(buffer, 0, length);
-			}
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		byte[] codes = bouts.toByteArray();
-		//关闭流
-		try {
-			if(bins != null){
-				//调用外层流的close方法就关闭其装饰的内层流
-				bins.close();
-			}
-			if(bouts != null){
-				bouts.close();
-			}
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return codes;
-	}
-
-	/**
-	 * 使用IOUtils.toByteArray()读取流文件
-	 */
-	public byte[] readBinaryCode(String className){
-		String clzPath = getClassPath(className);
-		File f = new File(clzPath);
-		try{
-			return IOUtils.toByteArray(new FileInputStream(f));
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-			return null;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return null;
-		}
-	}
-
-
-	/**
-	 * 从扫描根目录，获取指定类的绝对路径
-	 * @param className
-	 * @return
-	 */
-	private String getClassPath(String className){
-		String clazzPath = null;
-		//遍历clzPaths中所有路径
-		for (String path : this.clzPaths){
-			File file = new File(path);
-			clazzPath = getClassPath(className,file);
-			if(clazzPath!=null) break;
-		}
-		return clazzPath;
-	}
-
-	private String getClassPath(String className, File file){
-		String clazzPath = null;
-		if(file.exists()){
-			//如果是目录，则遍历所有目录下的文件
-			if(file.isDirectory()){
-				File[] fs = file.listFiles();
-				for (File f : fs){
-					clazzPath = getClassPath(className,f);
-				}
-			}else {
-				//检查是否是该类对应的class文件
-				if(isClazzFile(file.getName(),className)){
-					clazzPath = file.getAbsolutePath();
-				}
-			}
-		}
-		return clazzPath;
-	}
-
-	private boolean isClazzFile(String filename , String className){
-		String fileClazzName = null;
-		String [] names = filename.split("\\.");
-		if(names.length > 0){
-			fileClazzName = names[0];
-		}
-		return className.endsWith(fileClazzName);
-	}
-	
-	public void addClassPath(String path) {
-		clzPaths.add(path);
-	}
-
-	public String getClassPath(){
-		StringBuilder sb = new StringBuilder();
-		int i = 0;
-		for (; i < clzPaths.size() - 1; i++) {
-			sb.append(clzPaths.get(i));
-			sb.append(";");
-		}
-		sb.append(clzPaths.get(i));
-		return sb.toString();
-	}
-
-	public static void main(String[] args) {
-		String FULL_QUALIFIED_CLASS_NAME = "mini_jvm/test/EmployeeV1";
-		String path1 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\test-classes\\mini_jvm";
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		String className = "mini_jvm.test.EmployeeV1";
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java b/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java
deleted file mode 100644
index 6ea12db446..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/loader/ClassFileParser.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package mini_jvm.loader;
-
-
-import mini_jvm.clz.AccessFlag;
-import mini_jvm.clz.ClassFile;
-import mini_jvm.clz.ClassIndex;
-import mini_jvm.constant.*;
-import mini_jvm.field.Field;
-import mini_jvm.method.Method;
-
-public class ClassFileParser {
-
-	public ClassFile parse(byte[] byteCodes) {
-		ByteCodeIterator iterator = new ByteCodeIterator(byteCodes);
-		ClassFile clzFile = new ClassFile();
-
-		//magic number
-		String magicNumber = iterator.nextU4ToHexString();
-		if (!"cafebabe".equals(magicNumber)) {
-			throw new RuntimeException("not java .class file!");
-		}
-		int minorVersion = iterator.nextU2ToInt();		//次版本号
-		int majorVersion = iterator.nextU2ToInt();		//主版本号
-		clzFile.setMajorVersion(majorVersion);
-		clzFile.setMinorVersion(minorVersion);
-
-		ConstantPool constantPool = parseConstantPool(iterator); //常量池
-		clzFile.setConstPool(constantPool);
-
-		AccessFlag accessFlag = parseAccessFlag(iterator);		 //解析访问标识
-		clzFile.setAccessFlag(accessFlag);
-
-		ClassIndex clzIndex = parseClassIndex(iterator);		 //解析类索引
-		clzFile.setClassIndex(clzIndex);
-
-		//解析接口，此处暂不支持
-		parseInterfaces(iterator);
-
-		//解析字段
-		parseField(clzFile,iterator);
-
-		//解析方法
-		parseMethod(clzFile,iterator);
-
-		return clzFile;
-	}
-
-	private void parseMethod(ClassFile clzFile, ByteCodeIterator iterator) {
-		//方法个数
-		int methodCount = iterator.nextU2ToInt();
-		for (int i = 0; i < methodCount; i++) {
-			Method m = Method.parse(clzFile,iterator);
-			clzFile.addMethod(m);
-		}
-	}
-
-	//解析字段
-	private void parseField(ClassFile clzFile, ByteCodeIterator iterator) {
-		//字段个数
-		int fieldsCount = iterator.nextU2ToInt();
-		for (int i = 0; i < fieldsCount; i++) {
-			Field f = Field.parse(clzFile.getConstantPool(),iterator);
-			clzFile.addField(f);
-		}
-	}
-
-
-	private AccessFlag parseAccessFlag(ByteCodeIterator iterator) {
-		int accessValue = iterator.nextU2ToInt();
-		AccessFlag accessFlag = new AccessFlag(accessValue);
-
-		return accessFlag;
-	}
-
-	private ClassIndex parseClassIndex(ByteCodeIterator iterator) {
-		ClassIndex clzIndex = new ClassIndex();
-
-		int thisClzIndex = iterator.nextU2ToInt();
-		int superClzIndex = iterator.nextU2ToInt();
-		clzIndex.setThisClassIndex(thisClzIndex);
-		clzIndex.setSuperClassIndex(superClzIndex);
-
-		return clzIndex;
-	}
-
-	private ConstantPool parseConstantPool(ByteCodeIterator iterator) {
-		//常量池
-		ConstantPool constantPool = new ConstantPool();
-		//常量池成员数
-		int constantPoolLength = iterator.nextU2ToInt();
-		//第0位补上一个占位符
-		NullConstantInfo nullConstantInfo = new NullConstantInfo();
-		constantPool.addConstantInfo(nullConstantInfo);
-		for (int i = 1; i < constantPoolLength; i++) {
-			int tag = iterator.nextU1ToInt();
-			// tag = 1, UTF8_INFO
-			if (tag == 1) {
-				UTF8Info utf8Info = new UTF8Info(constantPool);
-				int length = iterator.nextU2ToInt();
-				String value = iterator.nextBytesLenAsString(length);
-				utf8Info.setLength(length);
-				utf8Info.setValue(value);
-				constantPool.addConstantInfo(utf8Info);
-			}
-			// tag = 7, CLASS_INFO
-			else if (tag == 7) {
-				ClassInfo classInfo = new ClassInfo(constantPool);
-				int nameIndex = iterator.nextU2ToInt();
-				classInfo.setUtf8Index(nameIndex);
-				constantPool.addConstantInfo(classInfo);
-			}
-			// tag = 8, STRING_INFO
-			else if (tag == 8) {
-				StringInfo stringInfo = new StringInfo(constantPool);
-				int stringIndex = iterator.nextU2ToInt();
-				stringInfo.setIndex(stringIndex);
-				constantPool.addConstantInfo(stringInfo);
-			}
-			// tag = 9, Fieldref
-			else if (tag == 9) {
-				FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool);
-				int classInfoIndex = iterator.nextU2ToInt();
-				int nameAndTypeIndex = iterator.nextU2ToInt();
-				fieldRefInfo.setClassInfoIndex(classInfoIndex);
-				fieldRefInfo.setNameAndTypeIndex(nameAndTypeIndex);
-				constantPool.addConstantInfo(fieldRefInfo);
-			}
-			// tag = 10, MethodRef
-			else if (tag == 10) {
-				MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool);
-				int classInfoIndex = iterator.nextU2ToInt();
-				int nameAndTypeIndex = iterator.nextU2ToInt();
-				methodRefInfo.setClassInfoIndex(classInfoIndex);
-				methodRefInfo.setNameAndTypeIndex(nameAndTypeIndex);
-				constantPool.addConstantInfo(methodRefInfo);
-			}
-			// tag = 12, NameAndType
-			else if (tag == 12) {
-				NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool);
-				int nameAndTypeIndex = iterator.nextU2ToInt();
-				int descriptorIndex = iterator.nextU2ToInt();
-				nameAndTypeInfo.setIndex1(nameAndTypeIndex);
-				nameAndTypeInfo.setIndex2(descriptorIndex);
-				constantPool.addConstantInfo(nameAndTypeInfo);
-			} else {
-				throw new RuntimeException("not realized tag " + tag);
-			}
-		}
-
-		return constantPool;
-	}
-
-	private void parseInterfaces(ByteCodeIterator iterator) {
-		int interfaceCount = iterator.nextU2ToInt();
-		// TODO : 如果实现了interface, 这里需要解析
-		System.out.println("interfaceCount:" + interfaceCount);
-	}
-}
-
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java b/students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java
deleted file mode 100644
index 6c026d3eb1..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/method/Method.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package mini_jvm.method;
-
-
-import mini_jvm.attr.AttributeInfo;
-import mini_jvm.attr.CodeAttr;
-import mini_jvm.clz.ClassFile;
-import mini_jvm.cmd.ByteCodeCommand;
-import mini_jvm.constant.ConstantPool;
-import mini_jvm.constant.UTF8Info;
-import mini_jvm.loader.ByteCodeIterator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Method {
-	
-	private int accessFlag;
-	private int nameIndex;
-	private int descriptorIndex;
-	
-	private CodeAttr codeAttr;
-	private ClassFile clzFile;
-	
-	
-	public ClassFile getClzFile() {
-		return clzFile;
-	}
-
-	public int getNameIndex() {
-		return nameIndex;
-	}
-	public int getDescriptorIndex() {
-		return descriptorIndex;
-	}
-	
-	public CodeAttr getCodeAttr() {
-		return codeAttr;
-	}
-
-	public void setCodeAttr(CodeAttr code) {
-		this.codeAttr = code;
-	}
-
-	public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) {
-		this.clzFile = clzFile;
-		this.accessFlag = accessFlag;
-		this.nameIndex = nameIndex;
-		this.descriptorIndex = descriptorIndex;
-	}
-
-	public static Method parse(ClassFile clzFile, ByteCodeIterator iterator){
-		int accessFlag = iterator.nextU2ToInt();
-		int nameIndex = iterator.nextU2ToInt();
-		int descIndex = iterator.nextU2ToInt();
-		int attrCount = iterator.nextU2ToInt();
-
-		Method m = new Method(clzFile,accessFlag,nameIndex,descIndex);
-
-		for (int i = 0; i < attrCount; i++) {
-			int attrNameIndex = iterator.nextU2ToInt();
-			String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex);
-			iterator.back(2);
-
-			if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){
-				CodeAttr codeAttr = CodeAttr.parse(clzFile,iterator);
-				m.setCodeAttr(codeAttr);
-			}else {
-				throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName);
-			}
-		}
-		return m;
-	}
-
-
-	public String toString() {
-
-		ConstantPool pool = this.clzFile.getConstantPool();
-		StringBuilder buffer = new StringBuilder();
-		String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue();
-		String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue();
-		buffer.append(name).append(":").append(desc).append("\n");
-		buffer.append(this.codeAttr.toString(pool));
-		return buffer.toString();
-	}
-
-
-	public ByteCodeCommand[] getCmds() {
-		return this.getCodeAttr().getCmds();
-	}
-
-
-	private String getParamAndReturnType(){
-		UTF8Info  nameAndTypeInfo = (UTF8Info)this.getClzFile()
-				.getConstantPool().getConstantInfo(this.getDescriptorIndex());
-		return nameAndTypeInfo.getValue();
-	}
-
-	public List<String> getParameterList(){
-
-		// e.g. (Ljava/util/List;Ljava/lang/String;II)V
-		String paramAndType = getParamAndReturnType();
-
-		int first = paramAndType.indexOf("(");
-		int last = paramAndType.lastIndexOf(")");
-		// e.g. Ljava/util/List;Ljava/lang/String;II
-		String param = paramAndType.substring(first+1, last);
-
-		List<String> paramList = new ArrayList<String>();
-
-		if((null == param) || "".equals(param)){
-			return paramList;
-		}
-
-		while(!param.equals("")){
-
-			int pos = 0;
-			// 这是一个对象类型
-			if(param.charAt(pos) == 'L'){
-
-				int end = param.indexOf(";");
-
-				if(end == -1){
-					throw new RuntimeException("can't find the ; for a object type");
-				}
-				paramList.add(param.substring(pos+1,end));
-
-				pos = end + 1;
-
-			}
-			else if(param.charAt(pos) == 'I'){
-				// int
-				paramList.add("I");
-				pos ++;
-
-			}
-			else if(param.charAt(pos) == 'F'){
-				// float
-				paramList.add("F");
-				pos ++;
-
-			} else{
-				throw new RuntimeException("the param has unsupported type:" + param);
-			}
-
-			param = param.substring(pos);
-
-		}
-		return paramList;
-
-	}
-}
diff --git a/students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java b/students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java
deleted file mode 100644
index 49f6bc0e39..0000000000
--- a/students/769232552/season_one/main/java/season_1/mini_jvm/util/Util.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package mini_jvm.util;
-
-public class Util {
-	public static int byteToInt(byte[] codes){
-    	String s1 = byteToHexString(codes);
-    	return Integer.valueOf(s1, 16).intValue();
-    }
-
-	public static String byteToHexString(byte[] codes){
-		StringBuffer buffer = new StringBuffer();
-		for(int i=0;i<codes.length;i++){
-			byte b = codes[i];
-			int value = b & 0xFF;
-			String strHex = Integer.toHexString(value);
-			if(strHex.length()< 2){
-				strHex = "0" + strHex;
-			}		
-			buffer.append(strHex);
-		}
-		return buffer.toString();
-	}
-}
diff --git a/students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java b/students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java
deleted file mode 100644
index 2bfd7f52e1..0000000000
--- a/students/769232552/season_one/test/java/season_1/code01/ArrayListTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package code01;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Created by yaoyuan on 2017/3/8.
- */
-public class ArrayListTest {
-    ArrayList arrayList;
-    @Before
-    public void setUp(){
-        arrayList = new ArrayList();
-    }
-
-    @Test
-    public void testAdd() throws Exception {
-
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            arrayList.add(str);
-        }
-
-        // size()
-        Assert.assertEquals(array.length,arrayList.size());
-
-        //add(),get()
-        for (int i = 0; i < arrayList.size(); i++){
-            Assert.assertEquals(array[i],arrayList.get(i));
-        }
-    }
-
-    @Test
-    public void testAddWithIndex() throws Exception {
-        ArrayList arrayList2 = new ArrayList(3);//自动扩容
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (int i = 0; i < array.length; i++){
-            arrayList2.add(i,array[i]);
-        }
-        //add(),get()
-        for (int i = 0; i < arrayList2.size(); i++){
-            Assert.assertEquals(array[i],arrayList2.get(i));
-        }
-        arrayList2.add(3,"new");
-        Assert.assertEquals("new",arrayList2.get(3));
-
-
-    }
-
-    @Test
-    public void testRemove() throws Exception {
-
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            arrayList.add(str);
-        }
-        arrayList.remove(0);
-        arrayList.remove(0);
-
-
-        for (int i = 0; i < arrayList.size(); i++) {
-            Assert.assertEquals(array[i+2],arrayList.get(i));
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java b/students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java
deleted file mode 100644
index 8c1f4e8e09..0000000000
--- a/students/769232552/season_one/test/java/season_1/code01/BinaryTreeTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package code01;
-
-import org.junit.Test;
-
-/**
- * Created by yaoyuan on 2017/3/10.
- */
-public class BinaryTreeTest {
-
-    @Test
-    public void testCreateBinaryTree(){
-
-        BinaryTree<Integer> binaryTree1 = new BinaryTree<Integer>();
-        BinaryTree<Integer> binaryTree2 = new BinaryTree<Integer>();
-        Integer[] array1 = new Integer[]{3,4,1,2,5};
-        Integer[] array2 = new Integer[]{3,1,4,5,2};
-        binaryTree1.createBinaryTree(array1);
-        binaryTree2.createBinaryTree(array2);
-        binaryTree1.leftOrderScan(binaryTree1.getRoot());
-        binaryTree2.leftOrderScan(binaryTree2.getRoot());
-    }
-
-    @Test
-    public void testInsert(){
-        BinaryTree<Integer> binaryTree3 = new BinaryTree<Integer>();
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java b/students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java
deleted file mode 100644
index 5481783932..0000000000
--- a/students/769232552/season_one/test/java/season_1/code01/LinkedListTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package code01;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Created by yaoyuan on 2017/3/8.
- */
-public class LinkedListTest {
-
-    @Test
-    public void testAdd() throws Exception {
-
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-
-        // size()
-        Assert.assertEquals(array.length,linklist.size());
-
-        //add(),get()
-        for (int i = 0; i < linklist.size(); i++){
-            Assert.assertEquals(array[i],linklist.get(i));
-        }
-
-    }
-
-    @Test
-    public void testAddWithIndex() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-
-        //add(),get()
-        for (int i = 0; i < linklist.size(); i++){
-            Assert.assertEquals(array[i],linklist.get(i));
-        }
-
-        String str = "new";
-        linklist.add(0,str);
-        Assert.assertEquals(str,linklist.get(0));
-
-        linklist.add(3,str);
-        Assert.assertEquals(str,linklist.get(3));
-
-        linklist.add(linklist.size() ,str);
-        Assert.assertEquals(str,linklist.get(linklist.size()-1));
-    }
-
-    @Test
-    public void testRemove() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-
-        //remove(),get()
-        Assert.assertEquals(linklist.remove(0),array[0]);
-        Assert.assertEquals(linklist.size(),array.length - 1);
-
-        Assert.assertEquals(linklist.remove(linklist.size() - 1),array[array.length-1]);
-        Assert.assertEquals(linklist.size(),array.length - 2);
-
-    }
-
-    @Test
-    public void testAddFirst() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        //addFirst(),get()
-        String str = "new";
-        linklist.addFirst(str);
-        Assert.assertEquals(str,linklist.get(0));
-        Assert.assertEquals(linklist.size(),array.length + 1);
-    }
-
-    @Test
-    public void testAddLast() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        //addLast(),get()
-        String str = "new";
-        linklist.addLast(str);
-        Assert.assertEquals(str,linklist.get(linklist.size()-1));
-        Assert.assertEquals(linklist.size(),array.length + 1);
-    }
-
-    @Test
-    public void testRemoveFirst() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        //removeFirst(),get()
-        Assert.assertEquals(linklist.removeFirst(),array[0]);
-        Assert.assertEquals(linklist.size(),array.length - 1);
-    }
-
-    @Test
-    public void testRemoveLast() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        //removeLast(),get()
-        Assert.assertEquals(linklist.removeLast(),array[array.length-1]);
-        Assert.assertEquals(linklist.size(),array.length - 1);
-
-    }
-
-    @Test
-    public void testReverse(){
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        linklist.reverse();
-        for(int i=0; i<array.length; i++){
-            Assert.assertEquals(array[array.length - i-1], linklist.get(i));
-        }
-    }
-
-    @Test
-    public void testremoveFirstHalf(){
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        linklist.removeFirstHalf();
-        for(int i=0; i<array.length/2; i++){
-            Assert.assertEquals(array[i+array.length/2], linklist.get(i));
-        }
-    }
-
-    @Test
-    public void testRemoveDuplicateValues() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","b","b","d","d","d"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        linklist.printList();
-        linklist.removeDuplicateValues();
-        linklist.printList();
-
-    }
-
-    @Test
-    public void testRemove1() throws Exception {
-        LinkedList linklist = new LinkedList();
-        String[] array = new String[]{"a","b","c","d","e","f","g"};
-        for (String str : array){
-            linklist.add(str);
-        }
-        linklist.printList();
-        linklist.remove(0,4);
-        linklist.printList();
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/QueueTest.java b/students/769232552/season_one/test/java/season_1/code01/QueueTest.java
deleted file mode 100644
index 1390e3d3be..0000000000
--- a/students/769232552/season_one/test/java/season_1/code01/QueueTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package code01;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Created by yaoyuan on 2017/3/8.
- */
-public class QueueTest {
-
-    @Test
-    public void testQueue() throws Exception {
-        Queue queue = new Queue();
-        String[] array = new String[]{"a","b","c"};
-        for (String str : array){
-            queue.enQueue(str);
-        }
-        int i = 0;
-        while (!queue.isEmpty()){
-            Assert.assertEquals(array[i],queue.deQueue());
-            i ++;
-        }
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code01/StackTest.java b/students/769232552/season_one/test/java/season_1/code01/StackTest.java
deleted file mode 100644
index e4c9878d50..0000000000
--- a/students/769232552/season_one/test/java/season_1/code01/StackTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package code01;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-
-/**
- * Created by yaoyuan on 2017/3/8.
- */
-public class StackTest {
-
-    @Test
-    public void testStack() throws Exception {
-        Stack stack = new Stack();
-        String[] array = new String[]{"a","b","c"};
-        for (String str : array){
-            stack.push(str);
-        }
-        int i = 2;
-        while (!stack.isEmpty()){
-            Assert.assertEquals(array[i],stack.peek());
-            Assert.assertEquals(array[i],stack.pop());
-            i --;
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java b/students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java
deleted file mode 100644
index 1277e3dab6..0000000000
--- a/students/769232552/season_one/test/java/season_1/code02/ArrayUtilTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package code02;
-
-import org.junit.Test;
-
-/**
- * Created by yaoyuan on 2017/3/13.
- */
-public class ArrayUtilTest {
-
-    @Test
-    public void testReverseArray() throws Exception {
-        int[] arr1 = new int[]{1,2,3,4,5,6,7};
-        ArrayUtil arrayUtil = new ArrayUtil();
-        arrayUtil.reverseArray(arr1);
-        arrayUtil.printArr(arr1);
-
-
-    }
-
-    @Test
-    public void testRemoveZero() throws Exception {
-        int[] arr1 = new int[]{1,0,2,3,0,0,4,5,6,0};
-        ArrayUtil arrayUtil = new ArrayUtil();
-        int[] arr2 = arrayUtil.removeZero(arr1);
-        arrayUtil.printArr(arr2);
-    }
-
-    @Test
-    public void testMerge() throws Exception {
-        int[] arr1 = new int[]{3, 5, 7, 8};
-        int[] arr2 = new int[]{4, 5, 6, 7};
-        ArrayUtil arrayUtil = new ArrayUtil();
-        int[] arr3 = arrayUtil.merge(arr1,arr2);
-        arrayUtil.printArr(arr3);
-    }
-
-    @Test
-    public void testGrow() throws Exception {
-        int[] arr1 = new int[]{1,2,3,4,5,6,7};
-        ArrayUtil arrayUtil = new ArrayUtil();
-        int[] arr2 = arrayUtil.grow(arr1,3);
-        arrayUtil.printArr(arr2);
-    }
-
-    @Test
-    public void testFibonacci() throws Exception {
-        ArrayUtil arrayUtil = new ArrayUtil();
-        int[] arr1 = arrayUtil.fibonacci(4);
-        arrayUtil.printArr(arr1);
-
-        int[] arr2 = arrayUtil.fibonacci(20);
-        arrayUtil.printArr(arr2);
-    }
-
-    @Test
-    public void testGetPrimes() throws Exception {
-        ArrayUtil arrayUtil = new ArrayUtil();
-        arrayUtil.printArr(arrayUtil.getPrimes(30));
-    }
-
-    @Test
-    public void testGetPerfectNumbers() throws Exception {
-        ArrayUtil arrayUtil = new ArrayUtil();
-        arrayUtil.printArr(arrayUtil.getPerfectNumbers(1000));
-    }
-
-    @Test
-    public void testJoin() throws Exception {
-        int[] arr1 = new int[]{1,2,3,4,5,6,7};
-        ArrayUtil arrayUtil = new ArrayUtil();
-        System.out.println(arrayUtil.join(arr1,"-"));
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java b/students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java
deleted file mode 100644
index 9213702251..0000000000
--- a/students/769232552/season_one/test/java/season_1/code02/litestruts/StrutsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package code02.litestruts;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-
-
-
-public class StrutsTest {
-
-	@Test
-	public void testLoginActionSuccess() {
-		
-		String actionName = "login";
-        
-		Map<String,String> params = new HashMap<String,String>();
-        params.put("name","test");
-        params.put("password","1234");
-        
-        
-        View view  = Struts.runAction(actionName,params);        
-        
-        Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
-        Assert.assertEquals("login successful", view.getParameters().get("Message"));
-	}
-
-	@Test
-	public void testLoginActionFailed() {
-		String actionName = "login";
-		Map<String,String> params = new HashMap<String,String>();
-        params.put("name","test");
-        params.put("password","123456"); //密码和预设的不一致
-        
-        View view  = Struts.runAction(actionName,params);        
-        
-        Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
-        Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("Message"));
-	}
-}
diff --git a/students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java b/students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java
deleted file mode 100644
index 64d2d93c99..0000000000
--- a/students/769232552/season_one/test/java/season_1/code03/FileDownloaderTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package code03;
-
-import code03.v1.FileDownloader;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import code03.v1.api.ConnectionManager;
-import code03.v1.api.DownloadListener;
-import code03.v1.impl.ConnectionManagerImpl;
-
-public class FileDownloaderTest {
-	boolean downloadFinished = false;
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testDownload() {
-		
-		String url = "http://litten.me/assets/blogImg/litten.png";
-
-		FileDownloader downloader = new FileDownloader(url);
-
-	
-		ConnectionManager cm = new ConnectionManagerImpl();
-		downloader.setConnectionManager(cm);
-		
-		downloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-
-		});
-
-		
-		downloader.execute();
-		
-		// 等待多线程下载程序执行完毕
-		while (!downloadFinished) {
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				//休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {				
-				e.printStackTrace();
-			}
-		}
-		System.out.println("下载完成！");
-		
-		
-
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java b/students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java
deleted file mode 100644
index 7448e3ee56..0000000000
--- a/students/769232552/season_one/test/java/season_1/code04/LRUPageFrameTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package code04;
-
-import  org.junit.Assert;
-
-import org.junit.Test;
-
-
-public class LRUPageFrameTest {
-
-	@Test
-	public void testAccess() {
-		LRUPageFrame frame = new LRUPageFrame(3);
-		frame.access(7);
-		frame.access(0);
-		frame.access(1);
-        //1，0，7
-		Assert.assertEquals("1,0,7", frame.toString());
-        frame.access(2);
-        //2，1，0
-		Assert.assertEquals("2,1,0", frame.toString());
-		frame.access(0);
-		//0，2，1
-        Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(0);
-        //0，2，1
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(3);
-        //3，0，2
-        Assert.assertEquals("3,0,2", frame.toString());
-		frame.access(0);
-        //0，3，2
-		Assert.assertEquals("0,3,2", frame.toString());
-		frame.access(4);
-		//4，0，3
-        Assert.assertEquals("4,0,3", frame.toString());
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java b/students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java
deleted file mode 100644
index e745e60fbc..0000000000
--- a/students/769232552/season_one/test/java/season_1/code05/StackUtilTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package code05;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-/**
- * Created by yaoyuan on 2017/4/6.
- */
-public class StackUtilTest {
-
-    @Before
-    public void setUp() throws Exception {
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    public void testAddToBottom() {
-        Stack s = new Stack();
-        s.push(1);
-        s.push(2);
-        s.push(3);
-
-        StackUtil.addToBottom(s, 0);
-        Assert.assertEquals("[0, 1, 2, 3]", s.toString());
-
-    }
-
-    @Test
-    public void testReverse() {
-        Stack s = new Stack();
-        s.push(1);
-        s.push(2);
-        s.push(3);
-        s.push(4);
-        s.push(5);
-        Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString());
-        StackUtil.reverse(s);
-        Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString());
-    }
-
-    @Test
-    public void testRemove() {
-        Stack s = new Stack();
-        s.push(1);
-        s.push(2);
-        s.push(3);
-        StackUtil.remove(s, 2);
-        Assert.assertEquals("[1, 3]", s.toString());
-    }
-
-    @Test
-    public void testGetTop() throws Exception {
-        Stack s = new Stack();
-        s.push(1);
-        s.push(2);
-        s.push(3);
-        s.push(4);
-        s.push(5);
-        {
-            Object[] values = StackUtil.getTop(s, 3);
-            Assert.assertEquals(5, values[0]);
-            Assert.assertEquals(4, values[1]);
-            Assert.assertEquals(3, values[2]);
-        }
-    }
-
-    @Test
-    public void testIsValidPairs() {
-        Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])"));
-        Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})"));
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java b/students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java
deleted file mode 100644
index af0ea63370..0000000000
--- a/students/769232552/season_one/test/java/season_1/code06/InfixExprTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package code06;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class InfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		//InfixExpr expr = new InfixExpr("300*20+12*5-20/4");
-		{
-			InfixExpr expr = new InfixExpr("2+3*4+5");
-			expr.evaluate();
-			Assert.assertEquals(19.0, expr.evaluate(), 0.001f);
-		}
-		{
-			InfixExpr expr = new InfixExpr("3*20+12*5-40/2");
-			Assert.assertEquals(100.0, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("3*20/2");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("20/2*3");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-		{
-			InfixExpr expr = new InfixExpr("10-30+50");
-			Assert.assertEquals(30, expr.evaluate(), 0.001f);
-		}
-		
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java b/students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java
deleted file mode 100644
index ace42b0db2..0000000000
--- a/students/769232552/season_one/test/java/season_1/code07/PostfixExprTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package code07;
-
-
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class PostfixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		{
-			PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *");
-			Assert.assertEquals(288, expr.evaluate(),0.0f);
-		}
-
-		{
-			//9+(3-1)*3+10/2
-			PostfixExpr expr = new PostfixExpr("9 3 1 - 3 * + 10 2 / +");
-			Assert.assertEquals(20, expr.evaluate(),0.0f);
-		}
-		
-		{
-			//10-2*3+50
-			PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +");
-			Assert.assertEquals(54, expr.evaluate(),0.0f);
-		}
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java b/students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java
deleted file mode 100644
index 6626b3ba01..0000000000
--- a/students/769232552/season_one/test/java/season_1/code07/PrefixExprTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package code07;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-public class PrefixExprTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testEvaluate() {
-		{
-			// 2*3+4*5 
-			PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5");
-			Assert.assertEquals(26, expr.evaluate(),0.001f);
-		}
-		{
-			// 4*2 + 6+9*2/3 -8
-			PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8");
-			Assert.assertEquals(12, expr.evaluate(),0.001f);
-		}
-		{
-			//(3+4)*5-6
-			PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6");
-			Assert.assertEquals(29, expr.evaluate(),0.001f);
-		}
-		{
-			//1+((2+3)*4)-5
-			PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5");
-			Assert.assertEquals(16, expr.evaluate(),0.001f);
-		}
-		
-		
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/code08/JosephusTest.java b/students/769232552/season_one/test/java/season_1/code08/JosephusTest.java
deleted file mode 100644
index 2212b059c1..0000000000
--- a/students/769232552/season_one/test/java/season_1/code08/JosephusTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package code08;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-
-
-public class JosephusTest {
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testExecute() {
-		Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString());
-	}
-
-	@Test
-	public void testExecute2() {
-
-		Assert.assertEquals("[2, 5, 1, 6, 4, 0, 3]", Josephus.execute(7, 3).toString());
-
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java b/students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java
deleted file mode 100644
index 8eac5ec714..0000000000
--- a/students/769232552/season_one/test/java/season_1/code09/QuickMinStackTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package code09;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by yyglider on 2017/5/4.
- */
-public class QuickMinStackTest {
-    QuickMinStack stack = new QuickMinStack();
-
-    @Before
-    public void before(){
-        stack.push(3);
-        stack.push(4);
-        stack.push(2);
-        stack.push(1);
-    }
-
-    @Test
-    public void findMin() throws Exception {
-        Assert.assertEquals(1,stack.findMin());
-        stack.pop();
-        Assert.assertEquals(2,stack.findMin());
-        stack.pop();
-        Assert.assertEquals(3,stack.findMin());
-        stack.push(0);
-        Assert.assertEquals(0,stack.findMin());
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java b/students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java
deleted file mode 100644
index a01b6a5a07..0000000000
--- a/students/769232552/season_one/test/java/season_1/code09/StackWithTwoQueuesTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package code09;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by yyglider on 2017/5/4.
- */
-public class StackWithTwoQueuesTest {
-    @Test
-    public void pop() throws Exception {
-        StackWithTwoQueues stack = new StackWithTwoQueues();
-        stack.push(1);
-        stack.push(2);
-        stack.push(3);
-        stack.push(4);
-
-        Assert.assertEquals(4,stack.pop());
-        Assert.assertEquals(3,stack.pop());
-        Assert.assertEquals(2,stack.pop());
-        Assert.assertEquals(1,stack.pop());
-
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java b/students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java
deleted file mode 100644
index 827ff1794b..0000000000
--- a/students/769232552/season_one/test/java/season_1/code10/BinaryTreeUtilTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package code10;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by yyglider on 2017/5/9.
- */
-public class BinaryTreeUtilTest {
-
-    BinaryTreeNode<Integer> root = null;
-    @Before
-    public void setUp() throws Exception {
-        root = new BinaryTreeNode<Integer>(1);
-        root.setLeft(new BinaryTreeNode<Integer>(2));
-        root.setRight(new BinaryTreeNode<Integer>(5));
-        root.getLeft().setLeft(new BinaryTreeNode<Integer>(3));
-        root.getLeft().setRight(new BinaryTreeNode<Integer>(4));
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    public void testPreOrderVisit() {
-
-        List<Integer> result = BinaryTreeUtil.preOrderVisit(root);
-        Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString());
-
-
-    }
-    @Test
-    public void testInOrderVisit() {
-
-
-        List<Integer> result = BinaryTreeUtil.inOrderVisit(root);
-        Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString());
-
-    }
-
-    @Test
-    public void testPostOrderVisit() {
-
-
-        List<Integer> result = BinaryTreeUtil.postOrderVisit(root);
-        Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString());
-
-    }
-
-
-    @Test
-    public void testInOrderVisitWithoutRecursion() {
-        BinaryTreeNode<Integer> node = root.getLeft().getRight();
-        node.setLeft(new BinaryTreeNode<Integer>(6));
-        node.setRight(new BinaryTreeNode<Integer>(7));
-
-        List<Integer> result = BinaryTreeUtil.inOrderWithoutRecursion(root);
-        Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString());
-
-    }
-    @Test
-    public void testPreOrderVisitWithoutRecursion() {
-        BinaryTreeNode<Integer> node = root.getLeft().getRight();
-        node.setLeft(new BinaryTreeNode<Integer>(6));
-        node.setRight(new BinaryTreeNode<Integer>(7));
-
-        List<Integer> result = BinaryTreeUtil.preOrderWithoutRecursion(root);
-        Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString());
-
-    }
-
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java b/students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java
deleted file mode 100644
index e2f3d6a05d..0000000000
--- a/students/769232552/season_one/test/java/season_1/code11/BinarySearchTreeTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package code11;
-
-import static org.junit.Assert.fail;
-
-import code10.BinaryTreeNode;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-
-public class BinarySearchTreeTest {
-
-    BinarySearchTree<Integer> tree = null;
-
-    @Before
-    public void setUp() throws Exception {
-        BinaryTreeNode<Integer> root = new BinaryTreeNode<Integer>(6);
-        root.left = new BinaryTreeNode<Integer>(2);
-        root.right = new BinaryTreeNode<Integer>(8);
-        root.left.left = new BinaryTreeNode<Integer>(1);
-        root.left.right = new BinaryTreeNode<Integer>(4);
-        root.left.right.left = new BinaryTreeNode<Integer>(3);
-        tree = new BinarySearchTree<Integer>(root);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        tree = null;
-    }
-
-    @Test
-    public void testFindMin() {
-        Assert.assertEquals(1, tree.findMin().intValue());
-
-    }
-
-    @Test
-    public void testFindMax() {
-        Assert.assertEquals(8, tree.findMax().intValue());
-    }
-
-    @Test
-    public void testHeight() {
-        Assert.assertEquals(4, tree.height());
-    }
-
-    @Test
-    public void testSize() {
-        Assert.assertEquals(6, tree.size());
-    }
-
-    @Test
-    public void testRemoveLeaf() {
-        tree.remove(3);
-        BinaryTreeNode<Integer> root= tree.getRoot();
-        Assert.assertEquals(4, root.left.right.data.intValue());
-
-    }
-
-    @Test
-    public void testRemoveMiddleNode() {
-        tree.remove(2);
-        BinaryTreeNode<Integer> root= tree.getRoot();
-        Assert.assertEquals(3, root.left.data.intValue());
-        Assert.assertEquals(4, root.left.right.data.intValue());
-    }
-
-    @Test
-    public void testLevelVisit(){
-        Assert.assertEquals(Arrays.asList(6, 2, 8, 1, 4, 3), tree.levelVisit());
-    }
-
-    @Test
-    public void testGetLowestCommonAncestor(){
-        Assert.assertEquals(new Integer(6),tree.getLowestCommonAncestor(2,8));
-        Assert.assertEquals(new Integer(2),tree.getLowestCommonAncestor(1,4));
-    }
-
-    @Test
-    public void testGetNodesBetween(){
-        Assert.assertEquals(Arrays.asList(1,2,4), tree.getNodesBetween(1,4));
-    }
-
-    @Test
-    public void testIsValid(){
-        Assert.assertTrue(tree.isValid());
-        tree.root.left = new BinaryTreeNode<Integer>(12);
-        Assert.assertFalse(tree.isValid());
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java b/students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java
deleted file mode 100644
index dca7123987..0000000000
--- a/students/769232552/season_one/test/java/season_1/mini_jvm/ClassFileloaderTest.java
+++ /dev/null
@@ -1,335 +0,0 @@
-package mini_jvm;
-
-import mini_jvm.clz.ClassFile;
-import mini_jvm.clz.ClassIndex;
-import mini_jvm.cmd.BiPushCmd;
-import mini_jvm.cmd.ByteCodeCommand;
-import mini_jvm.cmd.OneOperandCmd;
-import mini_jvm.cmd.TwoOperandCmd;
-import mini_jvm.constant.*;
-import mini_jvm.field.Field;
-import mini_jvm.loader.ClassFileLoader;
-import mini_jvm.method.Method;
-import mini_jvm.util.Util;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-
-public class ClassFileloaderTest {
-
-	
-	private static final String FULL_QUALIFIED_CLASS_NAME = "mini_jvm/test/EmployeeV1";
-	static String path1 = "D:\\worksapce\\gitRepo\\coding2017\\group23\\769232552\\coding\\src\\test\\resources";
-
-	static String path2 = "C:\\temp";
-
-	static ClassFile clzFile = null;
-	static {
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		String className = "mini_jvm.test.EmployeeV1";
-		
-		clzFile = loader.loadClass(className);
-		clzFile.print();
-	}
-	
-	
-	@Before
-	public void setUp() throws Exception {		 
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-	
-	@Test
-	public void testClassPath(){		
-		
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		loader.addClassPath(path2);
-		
-		String clzPath = loader.getClassPath();
-		
-		Assert.assertEquals(path1+";"+path2,clzPath);
-		
-	}
-	
-	@Test
-	public void testClassFileLength() {		
-		
-		ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		
-		String className = "com.coderising.jvm.test.EmployeeV1";
-		
-		byte[] byteCodes = loader.readBinaryCode(className);
-		
-		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
-		Assert.assertEquals(1056, byteCodes.length);
-		
-	}
-	
-	
-    @Test	
-	public void testMagicNumber(){
-    	ClassFileLoader loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		String className = "com.coderising.jvm.test.EmployeeV1";
-		byte[] byteCodes = loader.readBinaryCode(className);
-		byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]};
-		
-		
-		String acctualValue = Util.byteToHexString(codes);
-		
-		Assert.assertEquals("cafebabe", acctualValue);
-	}
-    
-    
-    
-
-    
-    /**
-     * ----------------------------------------------------------------------
-     */
-    
-    
-    @Test
-    public void testVersion(){    			
-		
-		Assert.assertEquals(0, clzFile.getMinorVersion());
-		Assert.assertEquals(52, clzFile.getMajorVersion());
-		
-    }
-    
-    @Test
-    public void testConstantPool(){
-    	
-
-		ConstantPool pool = clzFile.getConstantPool();
-		
-		Assert.assertEquals(53, pool.getSize());
-	
-		{
-			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
-			Assert.assertEquals(2, clzInfo.getUtf8Index());
-			
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
-			Assert.assertEquals("com/coderising/jvm/test/EmployeeV1", utf8Info.getValue());
-		}
-		{
-			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
-			Assert.assertEquals(4, clzInfo.getUtf8Index());
-			
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
-			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
-		}
-		{
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
-			Assert.assertEquals("name", utf8Info.getValue());
-			
-			utf8Info = (UTF8Info) pool.getConstantInfo(6);
-			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
-			
-			utf8Info = (UTF8Info) pool.getConstantInfo(7);
-			Assert.assertEquals("age", utf8Info.getValue());
-			
-			utf8Info = (UTF8Info) pool.getConstantInfo(8);
-			Assert.assertEquals("I", utf8Info.getValue());
-			
-			utf8Info = (UTF8Info) pool.getConstantInfo(9);
-			Assert.assertEquals("<init>", utf8Info.getValue());
-			
-			utf8Info = (UTF8Info) pool.getConstantInfo(10);
-			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
-			
-			utf8Info = (UTF8Info) pool.getConstantInfo(11);
-			Assert.assertEquals("Code", utf8Info.getValue());
-		}
-		
-		{
-			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(12);
-			Assert.assertEquals(3, methodRef.getClassInfoIndex());
-			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
-		}
-		
-		{
-			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
-			Assert.assertEquals(9, nameAndType.getIndex1());
-			Assert.assertEquals(14, nameAndType.getIndex2());
-		}
-		//抽查几个吧
-		{
-			MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45);
-			Assert.assertEquals(1, methodRef.getClassInfoIndex());
-			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
-		}
-		
-		{
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
-			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
-		}
-    }
-    @Test
-    public void testClassIndex(){
-    	
-    	ClassIndex clzIndex = clzFile.getClzIndex();
-    	ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
-    	ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
-    	
-    	
-    	Assert.assertEquals("com/coderising/jvm/test/EmployeeV1", thisClassInfo.getClassName());
-    	Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
-    }
-
-	/**
-	 * 下面是第三次JVM课应实现的测试用例
-	 */
-	@Test
-	public void testReadFields(){
-
-		List<Field> fields = clzFile.getFields();
-		Assert.assertEquals(2, fields.size());
-		{
-			Field f = fields.get(0);
-			Assert.assertEquals("name:Ljava/lang/String;", f.toString());
-		}
-		{
-			Field f = fields.get(1);
-			Assert.assertEquals("age:I", f.toString());
-		}
-	}
-	@Test
-	public void testMethods(){
-
-		List<Method> methods = clzFile.getMethods();
-		ConstantPool pool = clzFile.getConstantPool();
-
-		{
-			Method m = methods.get(0);
-			assertMethodEquals(pool,m,
-					"<init>",
-					"(Ljava/lang/String;I)V",
-					"2ab7000c2a2bb5000f2a1cb50011b1");
-
-		}
-		{
-			Method m = methods.get(1);
-			assertMethodEquals(pool,m,
-					"setName",
-					"(Ljava/lang/String;)V",
-					"2a2bb5000fb1");
-
-		}
-		{
-			Method m = methods.get(2);
-			assertMethodEquals(pool,m,
-					"setAge",
-					"(I)V",
-					"2a1bb50011b1");
-		}
-		{
-			Method m = methods.get(3);
-			assertMethodEquals(pool,m,
-					"sayHello",
-					"()V",
-					"b2001c1222b60024b1");
-
-		}
-		{
-			Method m = methods.get(4);
-			assertMethodEquals(pool,m,
-					"main",
-					"([Ljava/lang/String;)V",
-					"bb000159122b101db7002d4c2bb6002fb1");
-		}
-	}
-
-	private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){
-		String methodName = pool.getUTF8String(m.getNameIndex());
-		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
-		String code = m.getCodeAttr().getCode();
-		Assert.assertEquals(expectedName, methodName);
-		Assert.assertEquals(expectedDesc, methodDesc);
-		Assert.assertEquals(expectedCode, code);
-	}
-
-	@Test
-	public void testByteCodeCommand(){
-		{
-			Method initMethod = this.clzFile.getMethod("<init>", "(Ljava/lang/String;I)V");
-			ByteCodeCommand [] cmds = initMethod.getCmds();
-
-			assertOpCodeEquals("0: aload_0", cmds[0]);
-			assertOpCodeEquals("1: invokespecial #12", cmds[1]);
-			assertOpCodeEquals("4: aload_0", cmds[2]);
-			assertOpCodeEquals("5: aload_1", cmds[3]);
-			assertOpCodeEquals("6: putfield #15", cmds[4]);
-			assertOpCodeEquals("9: aload_0", cmds[5]);
-			assertOpCodeEquals("10: iload_2", cmds[6]);
-			assertOpCodeEquals("11: putfield #17", cmds[7]);
-			assertOpCodeEquals("14: return", cmds[8]);
-		}
-
-		{
-			Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V");
-			ByteCodeCommand [] cmds = setNameMethod.getCmds();
-
-			assertOpCodeEquals("0: aload_0", cmds[0]);
-			assertOpCodeEquals("1: aload_1", cmds[1]);
-			assertOpCodeEquals("2: putfield #15", cmds[2]);
-			assertOpCodeEquals("5: return", cmds[3]);
-
-		}
-
-		{
-			Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V");
-			ByteCodeCommand [] cmds = sayHelloMethod.getCmds();
-
-			assertOpCodeEquals("0: getstatic #28", cmds[0]);
-			assertOpCodeEquals("3: ldc #34", cmds[1]);
-			assertOpCodeEquals("5: invokevirtual #36", cmds[2]);
-			assertOpCodeEquals("8: return", cmds[3]);
-
-		}
-
-		{
-			Method mainMethod = this.clzFile.getMainMethod();
-
-			ByteCodeCommand [] cmds = mainMethod.getCmds();
-
-			assertOpCodeEquals("0: new #1", cmds[0]);
-			assertOpCodeEquals("3: dup", cmds[1]);
-			assertOpCodeEquals("4: ldc #43", cmds[2]);
-			assertOpCodeEquals("6: bipush 29", cmds[3]);
-			assertOpCodeEquals("8: invokespecial #45", cmds[4]);
-			assertOpCodeEquals("11: astore_1", cmds[5]);
-			assertOpCodeEquals("12: aload_1", cmds[6]);
-			assertOpCodeEquals("13: invokevirtual #47", cmds[7]);
-			assertOpCodeEquals("16: return", cmds[8]);
-		}
-
-	}
-
-	private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){
-
-		String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText();
-
-		if(cmd instanceof OneOperandCmd){
-			if(cmd instanceof BiPushCmd){
-				acctual += " " + ((OneOperandCmd)cmd).getOperand();
-			} else{
-				acctual += " #" + ((OneOperandCmd)cmd).getOperand();
-			}
-		}
-		if(cmd instanceof TwoOperandCmd){
-			acctual += " #" + ((TwoOperandCmd)cmd).getIndex();
-		}
-		Assert.assertEquals(expected, acctual);
-	}
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java b/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java
deleted file mode 100644
index b06f72b9e2..0000000000
--- a/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package mini_jvm;
-
-public class EmployeeV1 {
-	
-	
-	private String name;
-    private int age;
-    
-    public EmployeeV1(String name, int age) {
-        this.name = name;
-        this.age = age;        
-    }    
-
-    public void setName(String name) {
-        this.name = name;
-    }
-    public void setAge(int age){
-    	this.age = age;
-    }
-    public void sayHello() {        
-    	System.out.println("Hello , this is class Employee ");    	
-    }
-    public static void main(String[] args){
-    	EmployeeV1 p = new EmployeeV1("Andy",29);
-    	p.sayHello();    
-    	
-    }
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java b/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java
deleted file mode 100644
index 54a7ce4713..0000000000
--- a/students/769232552/season_one/test/java/season_1/mini_jvm/EmployeeV2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package mini_jvm;
-
-public class EmployeeV2 {
-
-	public final static String TEAM_NAME = "Dev Team";
-	private String name;
-	private int age;
-	public EmployeeV2(String name, int age) {
-        this.name = name;
-        this.age = age;        
-    }
-
-	public void sayHello() {
-		System.out.println("Hello , this is class Employee ");
-		System.out.println(TEAM_NAME);
-		System.out.println(this.name);
-	}
-	
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setAge(int age) {
-		this.age = age;
-	}
-
-	
-
-	public void isYouth() {
-		if (age < 40) {
-			System.out.println("You're still young");
-		} else {
-			System.out.println("You're old");
-		}
-	}
-	
-	
-
-	public void testAdd() {
-		int sum = 0;
-		for (int i = 1; i <= 100; i++) {
-			sum += i;
-		}
-		System.out.println(sum);
-	}
-
-	
-	public static void main(String[] args) {
-		EmployeeV2 p = new EmployeeV2("Andy", 35);
-		p.sayHello();
-		p.isYouth();
-		p.testAdd();
-	}
-}
\ No newline at end of file
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/Example.java b/students/769232552/season_one/test/java/season_1/mini_jvm/Example.java
deleted file mode 100644
index 01526633b6..0000000000
--- a/students/769232552/season_one/test/java/season_1/mini_jvm/Example.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package mini_jvm;
-
-public class Example{
-    public void disp(char c){
-        System.out.println(c);
-    }
-    public void disp(int c){
-       System.out.println(c );
-    }
-    public static void main(String args[]){
-        Example obj = new Example();
-        obj.disp('a');
-        obj.disp(5);
-    }
-}
-
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java b/students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java
deleted file mode 100644
index 289ece0647..0000000000
--- a/students/769232552/season_one/test/java/season_1/mini_jvm/HourlyEmployee.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package mini_jvm;
-
-public class HourlyEmployee extends EmployeeV2 {
-
-	int hourlySalary;
-	
-	public HourlyEmployee(String name, 
-			int age, int hourlySalary) {
-		super(name, age);
-		this.hourlySalary = hourlySalary;
-	}
-	
-	public void sayHello(){		
-		System.out.println("Hello , this is Hourly Employee");		
-	}
-	public static void main(String[] args){
-		EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40);	
-		e.sayHello();		
-	}
-	
-	public int getHourlySalary(){
-		return this.hourlySalary;
-	}
-	
-
-
-}
diff --git a/students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java b/students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java
deleted file mode 100644
index 2ecc54f150..0000000000
--- a/students/769232552/season_one/test/java/season_1/mini_jvm/MiniJVMTest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package mini_jvm;
-
-
-import mini_jvm.engine.MiniJVM;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class MiniJVMTest {
-	
-	static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin";
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testMain() throws Exception{
-		String[] classPaths = {PATH};
-		MiniJVM jvm = new MiniJVM();
-		jvm.run(classPaths, "com.coderising.jvm.test.HourlyEmployee");
-		
-	}
-
-}

From e92eb19a345e4dd0feea8c4da1876bcf315b1fdb Mon Sep 17 00:00:00 2001
From: yuyingzhi828 <81681981@qq.com>
Date: Mon, 19 Jun 2017 15:13:33 +0800
Subject: [PATCH 203/332] Update .gitignore

---
 .gitignore | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/.gitignore b/.gitignore
index f1e9957cfa..275756fb99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -280,6 +280,22 @@ target
 liuxin/.DS_Store
 liuxin/src/.DS_Store
 
+students/1005475328/*
+students/1329920463/*
+students/1452302762/*
+students/14703250/*
+students/2842295913/*
+students/383117348/*
+students/404481481/*
+students/406400373/*
+students/549739951/*
+students/582161208/*
+students/592146505/*
+students/740707954/*
+students/844620174/*
+students/87049319/*
+students/183549495/*
+
 
 
 

From 9b47297d238690620d834bedbe17fe95e9e8a521 Mon Sep 17 00:00:00 2001
From: boxin <begin161109@163.com>
Date: Mon, 19 Jun 2017 15:21:27 +0800
Subject: [PATCH 204/332] srp 349184132

---
 students/349184132/ood/ood-assignment/pom.xml |  44 ++++
 .../src/main/java/srp/Configuration.java      |  23 +++
 .../src/main/java/srp/ConfigurationKeys.java  |   9 +
 .../src/main/java/srp/DBUtil.java             |  25 +++
 .../src/main/java/srp/MailUtil.java           |  18 ++
 .../src/main/java/srp/PromotionMail.java      | 192 ++++++++++++++++++
 .../src/main/java/srp/product_promotion.txt   |   4 +
 7 files changed, 315 insertions(+)
 create mode 100644 students/349184132/ood/ood-assignment/pom.xml
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/srp/Configuration.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/srp/ConfigurationKeys.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/srp/DBUtil.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/srp/MailUtil.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/srp/PromotionMail.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/srp/product_promotion.txt

diff --git a/students/349184132/ood/ood-assignment/pom.xml b/students/349184132/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..e5f19f00ee
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/pom.xml
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/349184132/ood/ood-assignment/src/main/java/srp/Configuration.java b/students/349184132/ood/ood-assignment/src/main/java/srp/Configuration.java
new file mode 100644
index 0000000000..3a17cdd457
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/srp/Configuration.java
@@ -0,0 +1,23 @@
+package srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/349184132/ood/ood-assignment/src/main/java/srp/ConfigurationKeys.java b/students/349184132/ood/ood-assignment/src/main/java/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..ef3a07a354
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package 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/349184132/ood/ood-assignment/src/main/java/srp/DBUtil.java b/students/349184132/ood/ood-assignment/src/main/java/srp/DBUtil.java
new file mode 100644
index 0000000000..912bebf080
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package 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/349184132/ood/ood-assignment/src/main/java/srp/MailUtil.java b/students/349184132/ood/ood-assignment/src/main/java/srp/MailUtil.java
new file mode 100644
index 0000000000..556976f5c9
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package 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/349184132/ood/ood-assignment/src/main/java/srp/PromotionMail.java b/students/349184132/ood/ood-assignment/src/main/java/srp/PromotionMail.java
new file mode 100644
index 0000000000..19aae203dc
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/srp/PromotionMail.java
@@ -0,0 +1,192 @@
+package srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+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:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\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(); // 通过Config 对象来设置 host
+		setAltSMTPHost(); // 设置备用host // 不应该暴露出来 封装在 setSMTPHost 中
+
+
+		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) {
+			System.out.println("没有邮件发送");
+		}else {
+
+			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());
+					}
+				}
+			}
+		}
+
+
+	}
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/srp/product_promotion.txt b/students/349184132/ood/ood-assignment/src/main/java/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/srp/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From b81c9a1584cb0e0556bdb0970db6d83b68447d79 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 19 Jun 2017 15:23:03 +0800
Subject: [PATCH 205/332] remove code

---
 .../coderising/ood/config/Configuration.java  | 23 -------
 .../ood/config/ConfigurationKeys.java         |  9 ---
 .../coderising/ood/file/product_promotion.txt |  4 --
 .../java/com/coderising/ood/pojo/Email.java   | 49 ---------------
 .../ood/pojo/EmailServiceConfig.java          | 45 -------------
 .../java/com/coderising/ood/pojo/Product.java | 37 -----------
 .../java/com/coderising/ood/pojo/User.java    | 29 ---------
 .../coderising/ood/service/EmailService.java  | 55 ----------------
 .../ood/service/ProductService.java           | 52 ---------------
 .../coderising/ood/service/PromotionMail.java | 63 -------------------
 .../coderising/ood/service/UserService.java   | 44 -------------
 11 files changed, 410 deletions(-)
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
 delete mode 100644 group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java

diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
deleted file mode 100644
index a3f51236bc..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.config;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> configurations = new HashMap<String,String>();
-	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/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
deleted file mode 100644
index e7c449f10c..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.coderising.ood.config;
-
-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/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
deleted file mode 100644
index b7a974adb3..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-P8756 iPhone8
-P3946 XiaoMi10
-P8904 Oppo_R15
-P4955 Vivo_X20
\ No newline at end of file
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
deleted file mode 100644
index ed92dfec0b..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.coderising.ood.pojo;
-
-/**
- * @author xyy
- * @create 2017-06-19 9:44
- **/
-public class Email {
-
-
-    private String toAddress;
-    private String subject;
-    private String message;
-
-    public Email() {
-    }
-
-    public Email(String toAddress, String subject, String message) {
-        this.toAddress = toAddress;
-        this.subject = subject;
-        this.message = message;
-    }
-
-    public String getToAddress() {
-        return toAddress;
-    }
-
-    public Email setToAddress(String toAddress) {
-        this.toAddress = toAddress;
-        return this;
-    }
-
-    public String getSubject() {
-        return subject;
-    }
-
-    public Email setSubject(String subject) {
-        this.subject = subject;
-        return this;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public Email setMessage(String message) {
-        this.message = message;
-        return this;
-    }
-}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
deleted file mode 100644
index 091583b3ed..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.coderising.ood.pojo;
-
-/**
- * @author xyy
- * @create 2017-06-19 10:00
- **/
-public class EmailServiceConfig {
-
-    private String smtpHost;
-    private String altSmtpHost;
-    private String fromAddress;
-
-    public EmailServiceConfig(String smtpHost, String altSmtpHost, String fromAddress) {
-        this.smtpHost = smtpHost;
-        this.altSmtpHost = altSmtpHost;
-        this.fromAddress = fromAddress;
-    }
-
-    public String getSmtpHost() {
-        return smtpHost;
-    }
-
-    public EmailServiceConfig setSmtpHost(String smtpHost) {
-        this.smtpHost = smtpHost;
-        return this;
-    }
-
-    public String getAltSmtpHost() {
-        return altSmtpHost;
-    }
-
-    public EmailServiceConfig setAltSmtpHost(String altSmtpHost) {
-        this.altSmtpHost = altSmtpHost;
-        return this;
-    }
-
-    public String getFromAddress() {
-        return fromAddress;
-    }
-
-    public EmailServiceConfig setFromAddress(String fromAddress) {
-        this.fromAddress = fromAddress;
-        return this;
-    }
-}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
deleted file mode 100644
index f869bf1f12..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.coderising.ood.pojo;
-
-/**
- * 产品类
- *
- * @author xyy
- * @create 2017-06-19 9:30
- **/
-public class Product {
-
-
-    private String productID;
-    private String productDesc;
-
-
-
-
-
-
-    public String getProductID() {
-        return productID;
-    }
-
-    public Product setProductID(String productID) {
-        this.productID = productID;
-        return this;
-    }
-
-    public String getProductDesc() {
-        return productDesc;
-    }
-
-    public Product setProductDesc(String productDesc) {
-        this.productDesc = productDesc;
-        return this;
-    }
-}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
deleted file mode 100644
index 69975f6cbd..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.coderising.ood.pojo;
-
-/**
- * @author xyy
- * @create 2017-06-19 9:48
- **/
-public class User {
-
-    private String name;
-    private String email;
-
-    public String getName() {
-        return name;
-    }
-
-    public User setName(String name) {
-        this.name = name;
-        return this;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public User setEmail(String email) {
-        this.email = email;
-        return this;
-    }
-}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
deleted file mode 100644
index 2fece21ec2..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.coderising.ood.service;
-
-import com.coderising.ood.pojo.Email;
-import com.coderising.ood.pojo.EmailServiceConfig;
-import com.coderising.ood.pojo.Product;
-import com.coderising.ood.pojo.User;
-
-import java.io.IOException;
-
-/**
- * @author xyy
- * @create 2017-06-19 9:44
- **/
-public class EmailService {
-
-
-    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());
-
-    }
-
-
-    public static Email configureEMail(User user, Product product) throws IOException {
-        String toAddress = user.getEmail();
-        String name = "";
-        if (toAddress.length() > 0) {
-            name = user.getName();
-        }
-        String subject = "您关注的产品降价了";
-        String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
-        Email email = new Email(toAddress, subject, message);
-        return email;
-    }
-
-    public static void sendEmail(EmailServiceConfig emailServiceConfig, Email email, boolean debug) {
-        try {
-            if (email.getToAddress().length() > 0) {
-                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getSmtpHost(), debug);
-            }
-        } catch (Exception e) {
-            try {
-                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getAltSmtpHost(), debug);
-            } catch (Exception e2) {
-                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
-            }
-        }
-    }
-}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
deleted file mode 100644
index ccacef7bce..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.coderising.ood.service;
-
-import com.coderising.ood.pojo.Product;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author xyy
- * @create 2017-06-19 9:34
- **/
-public class ProductService {
-
-
-    public static List<Product> getAllProductFromFile(File file) throws IOException {
-        List productList = new ArrayList();
-        BufferedReader br = null;
-
-        try {
-
-            br = new BufferedReader(new FileReader(file));
-            String temp = null;
-            while ((temp = br.readLine()) != null) {
-                String[] data = temp.split(" ");
-                Product product = new Product();
-                product.setProductID(data[0]);
-                product.setProductDesc(data[1]);
-                System.out.println("产品ID = " + product.getProductID() + "\n");
-                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
-                productList.add(product);
-            }
-
-            return productList;
-
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                br.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-
-        }
-        return null;
-    }
-
-}
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
deleted file mode 100644
index f89aff500a..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.coderising.ood.service;
-
-import com.coderising.ood.config.Configuration;
-import com.coderising.ood.config.ConfigurationKeys;
-import com.coderising.ood.pojo.Email;
-import com.coderising.ood.pojo.EmailServiceConfig;
-import com.coderising.ood.pojo.Product;
-import com.coderising.ood.pojo.User;
-
-import java.io.File;
-import java.util.List;
-
-public class PromotionMail {
-
-    public static void main(String[] args) throws Exception {
-        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
-        File file = new File("D:\\product_promotion.txt");
-        //1.获得产品信息
-        ProductService productService = new ProductService();
-        List productList = productService.getAllProductFromFile(file);
-        boolean emailDebug = false;
-
-        PromotionMail pe = new PromotionMail(productList, emailDebug);
-    }
-
-
-
-    public PromotionMail(List productList, boolean mailDebug) throws Exception {
-        //2.邮件服务器配置
-        Configuration config = new Configuration();
-        EmailServiceConfig emailServiceConfig = new EmailServiceConfig(config.getProperty(ConfigurationKeys.SMTP_SERVER), config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER), config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
-        //3.发送邮件
-        sendEMails(mailDebug, productList, emailServiceConfig);
-
-    }
-
-
-    public void sendEMails(boolean debug, List<Product> productList, EmailServiceConfig emailServiceConfig) throws Exception {
-        System.out.println("开始发送邮件");
-        if (productList != null) {
-            for (Product product : productList) {
-                List<User> userList = UserService.getSendEmailUser(product);
-                if (null != userList && userList.size() > 0) {
-                    for (User user : userList) {
-                        Email email = EmailService.configureEMail((user), product);
-                        if (email.getToAddress().length() > 0) {
-                            EmailService.sendEmail(emailServiceConfig,email,debug);
-                        }
-                    }
-                }
-            }
-
-        } else {
-            System.out.println("没有邮件发送");
-
-        }
-
-    }
-
-
-}
-
-
diff --git a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java b/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
deleted file mode 100644
index a7c6d8fe38..0000000000
--- a/group08/1425809544/06-21/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.coderising.ood.service;
-
-import com.coderising.ood.pojo.Product;
-import com.coderising.ood.pojo.User;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author xyy
- * @create 2017-06-19 9:48
- **/
-public class UserService {
-
-
-    public static List getSendEmailUser(Product product) throws Exception {
-
-
-        setLoadQuery(product);
-
-        List<User> userList = new ArrayList();
-
-        for (int i = 0; i < 3; i++) {
-            User user = new User();
-            user.setName("user" + i);
-            user.setEmail(user.getName() + "@qq.com");
-            userList.add(user);
-        }
-        return userList;
-    }
-
-
-    //通过产品id获取关注了产品的用户
-    public static void setLoadQuery(Product product) throws Exception {
-
-        String sql = "Select name from subscriptions "
-                + "where product_id= '" + product.getProductID() + "' "
-                + "and send_mail=1 ";
-
-        System.out.println("loadQuery set");
-    }
-
-
-}

From dd5788367bb29b485b1a3a0a1ece38e3448fa5bb Mon Sep 17 00:00:00 2001
From: Zering <550727632@qq.com>
Date: Mon, 19 Jun 2017 15:37:43 +0800
Subject: [PATCH 206/332] ocp

---
 .../java/com/coderising/ood/ocp/Logger.java   | 20 +++++++++++++++++++
 .../coderising/ood/ocp/logs/ILogMethod.java   | 10 ++++++++++
 .../com/coderising/ood/ocp/logs/ILogType.java | 12 +++++++++++
 .../ood/ocp/logs/impl/EmailLog.java           | 13 ++++++++++++
 .../ood/ocp/logs/impl/PrintLog.java           | 12 +++++++++++
 .../coderising/ood/ocp/logs/impl/RowLog.java  | 13 ++++++++++++
 .../ood/ocp/logs/impl/RowLogWithDate.java     | 12 +++++++++++
 .../coderising/ood/ocp/logs/impl/SMSLog.java  | 13 ++++++++++++
 .../com/coderising/ood/ocp/util/DateUtil.java | 10 ++++++++++
 .../com/coderising/ood/ocp/util/MailUtil.java | 10 ++++++++++
 .../com/coderising/ood/ocp/util/SMSUtil.java  | 10 ++++++++++
 11 files changed, 135 insertions(+)
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
 create mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java

diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java b/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..689b130f0d
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+import com.coderising.ood.ocp.logs.ILogType;
+
+public class Logger {
+
+	private ILogType logType;
+	private ILogMethod logMethod;
+
+	public Logger(ILogType logType, ILogMethod logMethod) {
+		this.logType = logType;
+		this.logMethod = logMethod;
+	}
+
+	public void log(String msg) {
+		String logMsg = this.logType.formatMessage(msg);
+		this.logMethod.sendLog(logMsg);
+	}
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
new file mode 100644
index 0000000000..0dd74248e2
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.logs;
+
+public interface ILogMethod {
+	/**
+	 * 发送log信息
+	 * 
+	 * @param msg
+	 */
+	void sendLog(String msg);
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
new file mode 100644
index 0000000000..bdf07869ae
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.logs;
+
+public interface ILogType {
+
+	/**
+	 * 格式化log信息
+	 * 
+	 * @param msg
+	 * @return
+	 */
+	String formatMessage(String msg);
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
new file mode 100644
index 0000000000..8e185560a8
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+import com.coderising.ood.ocp.util.MailUtil;
+
+public class EmailLog implements ILogMethod {
+
+	@Override
+	public void sendLog(String msg) {
+		MailUtil.send(msg);
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
new file mode 100644
index 0000000000..81ad2e79ec
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+
+public class PrintLog implements ILogMethod {
+
+	@Override
+	public void sendLog(String msg) {
+		System.out.println(msg);
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
new file mode 100644
index 0000000000..a9aecfdfae
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogType;
+import com.coderising.ood.ocp.util.DateUtil;
+
+public class RowLog implements ILogType {
+
+	@Override
+	public String formatMessage(String msg) {
+		return DateUtil.getCurrentDateAsString() + ":" + msg;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
new file mode 100644
index 0000000000..423cea620a
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogType;
+
+public class RowLogWithDate implements ILogType {
+
+	@Override
+	public String formatMessage(String msg) {
+		return msg;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
new file mode 100644
index 0000000000..e0b2c4c3e0
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logs.impl;
+
+import com.coderising.ood.ocp.logs.ILogMethod;
+import com.coderising.ood.ocp.util.SMSUtil;
+
+public class SMSLog implements ILogMethod {
+
+	@Override
+	public void sendLog(String msg) {
+		SMSUtil.send(msg);
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
new file mode 100644
index 0000000000..df8d253d9b
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.util;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
new file mode 100644
index 0000000000..d95779b076
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.util;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
new file mode 100644
index 0000000000..ae2359de92
--- /dev/null
+++ b/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.util;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}

From 2a71732b538a2c585895b6dc6de6f0dc9fe69788 Mon Sep 17 00:00:00 2001
From: Xujie <jie.xu@coer-scnu.org>
Date: Mon, 19 Jun 2017 15:48:42 +0800
Subject: [PATCH 207/332] =?UTF-8?q?=E5=B9=BF=E5=B7=9E-=E8=AE=B8=E6=B4=81?=
 =?UTF-8?q?=EF=BC=9A=E7=AC=AC=E4=BA=8C=E6=AC=A1ood=E4=BD=9C=E4=B8=9Aocp?=
 =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E9=87=8D=E6=9E=8401?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

1、增加了LogType和LogMethod两个接口。
2、Logger类包含了LogType和LogMethod两个属性。
3、Logger类的log()方法直接调用LogType实例对象的getMsg()方法和LogMethod实例对象的send()方法。
---
 .../src/edu/coerscnu/basic/Iterator.java      |   9 ++
 .../basic/list/ArrayList/MyArrayList.java     | 127 +++++++++++++++
 .../basic/list/LinkedList/MyLinkedList.java   | 151 ++++++++++++++++++
 .../src/edu/coerscnu/basic/list/MyList.java   |  76 +++++++++
 .../src/edu/coerscnu/basic/queue/MyQueue.java | 112 +++++++++++++
 .../src/edu/coerscnu/basic/stack/MyStack.java |   5 +
 .../src/edu/coerscnu/client/Client.java       |  18 +++
 .../edu/coerscnu/ood/ocp/client/Client.java   |  16 ++
 .../edu/coerscnu/ood/ocp/logger/Logger.java   |  21 +++
 .../ood/ocp/logger/method/LogMethod.java      |  10 ++
 .../coerscnu/ood/ocp/logger/method/Mail.java  |  10 ++
 .../coerscnu/ood/ocp/logger/method/Print.java |   9 ++
 .../coerscnu/ood/ocp/logger/method/Sms.java   |  10 ++
 .../coerscnu/ood/ocp/logger/type/LogType.java |  11 ++
 .../edu/coerscnu/ood/ocp/logger/type/Raw.java |  10 ++
 .../ood/ocp/logger/type/RawWithDate.java      |  12 ++
 .../edu/coerscnu/ood/ocp/utils/DateUtil.java  |  16 ++
 .../edu/coerscnu/ood/srp/PromotionMail.java   |   4 +
 18 files changed, 627 insertions(+)
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java
 create mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java
 create mode 100644 students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java

diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java
new file mode 100644
index 0000000000..ed96cce2a6
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java
@@ -0,0 +1,9 @@
+package edu.coerscnu.basic;
+
+public interface Iterator<E> {
+	
+	public boolean hasNext();
+
+	public Object next();
+
+}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java
new file mode 100644
index 0000000000..9e494dd331
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java
@@ -0,0 +1,127 @@
+package edu.coerscnu.basic.list.ArrayList;
+
+import edu.coerscnu.basic.Iterator;
+import edu.coerscnu.basic.list.MyList;
+
+public class MyArrayList<E> implements MyList<E> {
+
+	private final static int DEFAULT_CAPACITY = 16;
+
+	private int capacity;
+
+	private int size;
+
+	private Object[] ele;
+
+	public MyArrayList(int capacity) {
+		if (capacity < 0)
+			throw new IllegalArgumentException("Illegal Capacity: " + capacity);
+		this.capacity = capacity;
+		ele = new Object[capacity];
+	}
+
+	public MyArrayList() {
+		this(DEFAULT_CAPACITY);
+	}
+
+	@Override
+	public boolean add(E e) {
+		add(size, e);
+		return true;
+	}
+
+	@Override
+	public boolean add(int index, E e) {
+		if (index < 0 || index > size)
+			throw new IndexOutOfBoundsException();
+		ensureCapacity(size + 1);
+		for (int i = size; i > index; i--) {
+			ele[i] = ele[i - 1];
+		}
+		size++;
+		ele[index] = e;
+		return true;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E set(int index, E e) {
+		if (index < 0 || index >= size)
+			throw new IndexOutOfBoundsException();
+		E old = (E) ele[index];
+		ele[index] = e;
+		return old;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E get(int index) {
+		if (index < 0 || index >= size)
+			throw new IndexOutOfBoundsException();
+		return (E) ele[index];
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public E remove(int index) {
+		if (index < 0 || index >= size)
+			throw new IndexOutOfBoundsException();
+		E old = (E) ele[index];
+		for (int i = index; i < size - 1; i++) {
+			ele[i] = ele[i + 1];
+		}
+		ele[--size] = null;
+		return old;
+	}
+
+	@Override
+	public boolean clear() {
+		for (int i = 0; i < size; i++) {
+			ele[i] = null;
+		}
+		size = 0;
+		return true;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	@Override
+	public int size() {
+		return size;
+	}
+
+	@Override
+	public Iterator<E> iterator() {
+		return new MyArrayListIterator();
+	}
+
+	private void ensureCapacity(int newCapacity) {
+		if (newCapacity < capacity)
+			return;
+		Object[] old = ele;
+		ele = new Object[capacity <<= 1];
+		for (int i = 0; i < size; i++) {
+			ele[i] = old[i];
+			old[i] = null;
+		}
+	}
+
+	private class MyArrayListIterator implements Iterator<E> {
+
+		private int current;
+
+		@Override
+		public boolean hasNext() {
+			return current < size;
+		}
+
+		@Override
+		public Object next() {
+			return ele[current++];
+		}
+
+	}
+}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java
new file mode 100644
index 0000000000..8641664595
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java
@@ -0,0 +1,151 @@
+package edu.coerscnu.basic.list.LinkedList;
+
+import edu.coerscnu.basic.Iterator;
+import edu.coerscnu.basic.list.MyList;
+
+public class MyLinkedList<E> implements MyList<E> {
+
+	// 链表大小
+	private int size;
+	// 头节点
+	private Node<E> firstNode;
+	// 尾节点
+	private Node<E> lastNode;
+
+	private static class Node<E> {
+
+		private Node<E> prev; // 前置节点
+
+		private Node<E> next; // 后置节点
+
+		private E ele; // 节点数据
+
+		public Node(E ele, Node<E> prev, Node<E> next) {
+			this.ele = ele;
+			this.prev = prev;
+			this.next = next;
+		}
+	}
+
+	public MyLinkedList() {
+		firstNode = new Node<E>(null, null, null);
+		lastNode = new Node<E>(null, firstNode, null);
+		firstNode.next = lastNode;
+		size = 0;
+	}
+
+	@Override
+	public boolean add(E e) {
+		return add(size, e);
+	}
+
+	@Override
+	public boolean add(int index, E e) {
+		return addBefore(getNode(index), e);
+	}
+
+	@Override
+	public E set(int index, E e) {
+		Node<E> node = getNode(index);
+		E old = node.ele;
+		node.ele = e;
+		return old;
+	}
+
+	@Override
+	public E get(int index) {
+		return getNode(index).ele;
+	}
+
+	@Override
+	public E remove(int index) {
+		return remove(getNode(index));
+	}
+
+	/**
+	 * 在指定节点前加入节点
+	 * 
+	 * @param node
+	 * @param e
+	 */
+	private boolean addBefore(Node<E> node, E e) {
+		Node<E> newNode = new Node<E>(e, node.prev, node);
+		newNode.prev.next = newNode;
+		node.prev = newNode;
+		size++;
+		return true;
+	}
+
+	private E remove(Node<E> node) {
+		node.prev.next = node.next;
+		node.next.prev = node.prev;
+		size--;
+		return node.ele;
+	}
+
+	/**
+	 * 获取指定位置的节点
+	 * 
+	 * @param index
+	 * @return
+	 */
+	private Node<E> getNode(int index) {
+		if (index < 0 || index > size)
+			throw new IndexOutOfBoundsException();
+		Node<E> node;
+		if (index < size / 2) {
+			node = firstNode;
+			for (int i = 0; i < index; i++) {
+				node = node.next;
+			}
+		} else {
+			node = lastNode;
+			for (int i = size; i > index; i--) {
+				node = node.prev;
+			}
+		}
+		return node;
+	}
+
+	@Override
+	public boolean clear() {
+		firstNode = new Node<E>(null, null, null);
+		lastNode = new Node<E>(null, firstNode, null);
+		firstNode.next = lastNode;
+		size = 0;
+		return true;
+	}
+
+	@Override
+	public boolean isEmpty() {
+		return size == 0;
+	}
+
+	@Override
+	public int size() {
+		return size;
+	}
+
+	@Override
+	public Iterator<E> iterator() {
+		return new MyLinkedListIterator();
+	}
+
+	private class MyLinkedListIterator implements Iterator<E> {
+
+		private Node<E> current = firstNode.next;
+
+		@Override
+		public boolean hasNext() {
+			return current != lastNode;
+		}
+
+		@Override
+		public Object next() {
+			E ele = current.ele;
+			current = current.next;
+			return ele;
+		}
+
+	}
+}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java
new file mode 100644
index 0000000000..42ef922391
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java
@@ -0,0 +1,76 @@
+package edu.coerscnu.basic.list;
+
+import edu.coerscnu.basic.Iterator;
+
+public interface MyList<E> {
+
+	/**
+	 * 在末尾添加元素
+	 * 
+	 * @param e
+	 * @return
+	 */
+	public boolean add(E e);
+
+	/**
+	 * 在指定位置添加元素
+	 * 
+	 * @param index
+	 * @param e
+	 * @return
+	 */
+	public boolean add(int index, E e);
+
+	/**
+	 * 在指定位置设置元素
+	 * 
+	 * @param index
+	 * @param e
+	 * @return
+	 */
+	public E set(int index, E e);
+
+	/**
+	 * 获取指定位置的元素
+	 * 
+	 * @param index
+	 * @return
+	 */
+	public E get(int index);
+
+	/**
+	 * 删除指定位置的元素
+	 * 
+	 * @param index
+	 * @return
+	 */
+	public E remove(int index);
+
+	/**
+	 * 删除整个列表
+	 * 
+	 * @return
+	 */
+	public boolean clear();
+
+	/**
+	 * 判断列表是否为空
+	 * 
+	 * @return
+	 */
+	public boolean isEmpty();
+
+	/**
+	 * 返回列表元素个数
+	 * 
+	 * @return
+	 */
+	public int size();
+
+	/**
+	 * 获得列表的迭代器
+	 * 
+	 * @return
+	 */
+	public Iterator<E> iterator();
+}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java
new file mode 100644
index 0000000000..43ab6d85eb
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java
@@ -0,0 +1,112 @@
+package edu.coerscnu.basic.queue;
+
+import edu.coerscnu.basic.Iterator;
+
+/**
+ * 链式队列
+ * 
+ * @author xujie
+ *
+ * @param <E>
+ */
+public class MyQueue<E> {
+
+	private static class Node<E> {
+
+		private Node<E> next; // 后置节点
+
+		private E ele; // 节点数据
+
+		public Node(E ele, Node<E> next) {
+			this.ele = ele;
+			this.next = next;
+		}
+	}
+
+	private int size;
+	
+	private Node<E> front;
+	
+	private Node<E> rear;
+	
+	public MyQueue() {
+		
+	}
+	
+	/**
+	 * 入队
+	 * @param e
+	 * @return
+	 */
+	public boolean enQueue(E e) {
+		if (front == null) {
+			front = new Node<E>(e, null);
+			rear = front;
+		} else {
+			Node<E> newNode = new Node<E>(e, null);
+			rear.next = newNode;
+			rear = newNode;
+		}
+		size++;
+		return true;
+	}
+	
+	/**
+	 * 出队
+	 * 
+	 * @return
+	 */
+	public E deQueue() {
+		if (isEmpty())
+			throw new IndexOutOfBoundsException("空队列异常");
+		Node<E> oldFront = front;
+		E ele = oldFront.ele;
+		front = front.next;
+		oldFront.ele = null;
+		oldFront.next = null;
+		size--;
+		return ele;
+	}
+	
+	public E element() {
+		if (isEmpty())
+			throw new IndexOutOfBoundsException("空队列异常");
+		return front.ele;
+	}
+	
+	public boolean clear() {
+		front = null;
+		rear = null;
+		size = 0;
+		return true;
+	}
+	
+	public boolean isEmpty() {
+		return size == 0;
+	}
+	
+	public int size() {
+		return size;
+	}
+	
+	public Iterator<E> iterator() {
+		return new MyQueueIterator();
+	}
+	
+	private class MyQueueIterator implements Iterator<E> {
+
+		private Node<E> current = front;
+		
+		@Override
+		public boolean hasNext() {
+			return current != rear.next;
+		}
+
+		@Override
+		public Object next() {
+			E ele = current.ele;
+			current = current.next;
+			return ele;
+		}
+	}
+}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java
new file mode 100644
index 0000000000..9ff4de9320
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java
@@ -0,0 +1,5 @@
+package edu.coerscnu.basic.stack;
+
+public class MyStack {
+
+}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java
new file mode 100644
index 0000000000..b9941b7ec3
--- /dev/null
+++ b/students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java
@@ -0,0 +1,18 @@
+package edu.coerscnu.client;
+
+import edu.coerscnu.basic.Iterator;
+import edu.coerscnu.basic.list.LinkedList.MyLinkedList;
+
+public class Client {
+
+	public static void main(String[] args) {
+		MyLinkedList<Integer> linkedList = new MyLinkedList<>();
+		for (int i = 0; i < 8; i++) {
+			linkedList.add(i);
+		}
+		Iterator<Integer> iterator = linkedList.iterator();
+		while (iterator.hasNext()) {
+			System.out.println(iterator.next());
+		}
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java
new file mode 100644
index 0000000000..90785c61a6
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/client/Client.java
@@ -0,0 +1,16 @@
+package edu.coerscnu.ood.ocp.client;
+
+import edu.coerscnu.ood.ocp.logger.Logger;
+import edu.coerscnu.ood.ocp.logger.method.Mail;
+import edu.coerscnu.ood.ocp.logger.method.LogMethod;
+import edu.coerscnu.ood.ocp.logger.type.RawWithDate;
+import edu.coerscnu.ood.ocp.logger.type.LogType;
+
+public class Client {
+	public static void main(String[] args) {
+		LogType type = new RawWithDate();
+		LogMethod method = new Mail();
+		Logger logger = new Logger(type, method);
+		logger.log("Hello World");
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java
new file mode 100644
index 0000000000..6db868df96
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/Logger.java
@@ -0,0 +1,21 @@
+package edu.coerscnu.ood.ocp.logger;
+
+import edu.coerscnu.ood.ocp.logger.method.LogMethod;
+import edu.coerscnu.ood.ocp.logger.type.LogType;
+
+public class Logger {
+
+	public LogType logType; // 日志类型
+	public LogMethod logMethod; // 日志方法
+
+	public Logger(LogType logType, LogMethod logMethod) {
+		this.logType = logType;
+		this.logMethod = logMethod;
+	}
+
+	public void log(String msg) {
+		String logMsg = msg;
+		logMsg = logMsg + logType.getMsg();
+		logMethod.send(logMsg);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java
new file mode 100644
index 0000000000..13f1e66a6a
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/LogMethod.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+/**
+ * 日志方法接口
+ * @author xujie
+ *
+ */
+public interface LogMethod {
+	public void send(String logMsg);
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java
new file mode 100644
index 0000000000..1468ef48f2
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Mail.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+public class Mail implements LogMethod{
+
+	@Override
+	public void send(String logMsg) {
+		System.out.println("Mail:" + logMsg);
+	}
+	
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java
new file mode 100644
index 0000000000..d8c7e08062
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Print.java
@@ -0,0 +1,9 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+public class Print implements LogMethod {
+
+	@Override
+	public void send(String logMsg) {
+		System.out.println("Print:" + logMsg);
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java
new file mode 100644
index 0000000000..8efc05ea7e
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/method/Sms.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.method;
+
+public class Sms implements LogMethod{
+
+	@Override
+	public void send(String logMsg) {
+		System.err.println("Sms:" + logMsg);
+	}
+	
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java
new file mode 100644
index 0000000000..99443d1a97
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/LogType.java
@@ -0,0 +1,11 @@
+package edu.coerscnu.ood.ocp.logger.type;
+
+/**
+ * 日志类型接口
+ * 
+ * @author xujie
+ *
+ */
+public interface LogType {
+	public String getMsg();
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java
new file mode 100644
index 0000000000..2053abd462
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/Raw.java
@@ -0,0 +1,10 @@
+package edu.coerscnu.ood.ocp.logger.type;
+
+public class Raw implements LogType{
+
+	@Override
+	public String getMsg() {
+		return "";
+	}
+
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java
new file mode 100644
index 0000000000..3c15b93dfb
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/logger/type/RawWithDate.java
@@ -0,0 +1,12 @@
+package edu.coerscnu.ood.ocp.logger.type;
+
+import edu.coerscnu.ood.ocp.utils.DateUtil;
+
+public class RawWithDate implements LogType{
+
+	@Override
+	public String getMsg() {
+		return " " + DateUtil.getCurrentDate();
+	}
+
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java
new file mode 100644
index 0000000000..1cfec691e3
--- /dev/null
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/ocp/utils/DateUtil.java
@@ -0,0 +1,16 @@
+package edu.coerscnu.ood.ocp.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 获取当前时间
+ * @author xujie
+ *
+ */
+public class DateUtil {
+	public static String getCurrentDate() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		return sdf.format(new Date());
+	}
+}
diff --git a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
index 14d80dcaf9..5a77a24067 100644
--- a/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
+++ b/students/617314917/ood/ood-assignment/assignment01/src/edu/coerscnu/ood/srp/PromotionMail.java
@@ -27,8 +27,11 @@ public class PromotionMail {
 
 	public static void main(String[] args) throws Exception {
 
+		// 降价产品文件路径
 		String path = "src/edu/coerscnu/ood/srp/product_promotion.txt";
+		// 获得降价产品列表
 		List<String[]> productList = FileUtil.readFile(path);
+		// 对于每个降价产品，挨个向关注该产品的用户发送邮件
 		for (String[] prod : productList) {
 			Product product = new Product(prod[0], prod[1]);
 			PromotionMail pm = new PromotionMail();
@@ -82,6 +85,7 @@ protected void sendMails(Product product) throws IOException {
 			while (iter.hasNext()) {
 				HashMap<String, String> user = iter.next();
 				String toAddress = (String) user.get(UserService.MAIL_KEY);
+				// 用户邮箱地址有效则设置邮件主题和正文，并发送
 				if (toAddress.length() > 0) {
 					setSubject("您关注的产品降价了");
 					setMessage(user, product);

From e48da5ae2fb6617632f763c37d729044bd576d1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BE=90=E9=98=B3=E9=98=B3?= <1425809544@qq.com>
Date: Mon, 19 Jun 2017 15:54:12 +0800
Subject: [PATCH 208/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=8F=91=E9=80=81?=
 =?UTF-8?q?=E7=94=B5=E5=AD=90=E9=82=AE=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1425809544/ood-assignment/pom.xml    | 32 ++++++++++
 .../coderising/ood/config/Configuration.java  | 23 +++++++
 .../ood/config/ConfigurationKeys.java         |  9 +++
 .../coderising/ood/file/product_promotion.txt |  4 ++
 .../java/com/coderising/ood/pojo/Email.java   | 49 +++++++++++++++
 .../ood/pojo/EmailServiceConfig.java          | 45 +++++++++++++
 .../java/com/coderising/ood/pojo/Product.java | 37 +++++++++++
 .../java/com/coderising/ood/pojo/User.java    | 29 +++++++++
 .../coderising/ood/service/EmailService.java  | 55 ++++++++++++++++
 .../ood/service/ProductService.java           | 52 +++++++++++++++
 .../coderising/ood/service/PromotionMail.java | 63 +++++++++++++++++++
 .../coderising/ood/service/UserService.java   | 44 +++++++++++++
 12 files changed, 442 insertions(+)
 create mode 100644 students/1425809544/ood-assignment/pom.xml
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
 create mode 100644 students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java

diff --git a/students/1425809544/ood-assignment/pom.xml b/students/1425809544/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/1425809544/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
new file mode 100644
index 0000000000..a3f51236bc
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.config;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<String,String>();
+	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/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..e7c449f10c
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.config;
+
+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/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/file/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/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
new file mode 100644
index 0000000000..ed92dfec0b
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Email.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:44
+ **/
+public class Email {
+
+
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Email() {
+    }
+
+    public Email(String toAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+
+    public Email setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+        return this;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public Email setSubject(String subject) {
+        this.subject = subject;
+        return this;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Email setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
new file mode 100644
index 0000000000..091583b3ed
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/EmailServiceConfig.java
@@ -0,0 +1,45 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 10:00
+ **/
+public class EmailServiceConfig {
+
+    private String smtpHost;
+    private String altSmtpHost;
+    private String fromAddress;
+
+    public EmailServiceConfig(String smtpHost, String altSmtpHost, String fromAddress) {
+        this.smtpHost = smtpHost;
+        this.altSmtpHost = altSmtpHost;
+        this.fromAddress = fromAddress;
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public EmailServiceConfig setSmtpHost(String smtpHost) {
+        this.smtpHost = smtpHost;
+        return this;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public EmailServiceConfig setAltSmtpHost(String altSmtpHost) {
+        this.altSmtpHost = altSmtpHost;
+        return this;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public EmailServiceConfig setFromAddress(String fromAddress) {
+        this.fromAddress = fromAddress;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
new file mode 100644
index 0000000000..f869bf1f12
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/Product.java
@@ -0,0 +1,37 @@
+package com.coderising.ood.pojo;
+
+/**
+ * 产品类
+ *
+ * @author xyy
+ * @create 2017-06-19 9:30
+ **/
+public class Product {
+
+
+    private String productID;
+    private String productDesc;
+
+
+
+
+
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public Product setProductID(String productID) {
+        this.productID = productID;
+        return this;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public Product setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
new file mode 100644
index 0000000000..69975f6cbd
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/pojo/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.pojo;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:48
+ **/
+public class User {
+
+    private String name;
+    private String email;
+
+    public String getName() {
+        return name;
+    }
+
+    public User setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public User setEmail(String email) {
+        this.email = email;
+        return this;
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
new file mode 100644
index 0000000000..2fece21ec2
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/EmailService.java
@@ -0,0 +1,55 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Email;
+import com.coderising.ood.pojo.EmailServiceConfig;
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.io.IOException;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:44
+ **/
+public class EmailService {
+
+
+    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());
+
+    }
+
+
+    public static Email configureEMail(User user, Product product) throws IOException {
+        String toAddress = user.getEmail();
+        String name = "";
+        if (toAddress.length() > 0) {
+            name = user.getName();
+        }
+        String subject = "您关注的产品降价了";
+        String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        Email email = new Email(toAddress, subject, message);
+        return email;
+    }
+
+    public static void sendEmail(EmailServiceConfig emailServiceConfig, Email email, boolean debug) {
+        try {
+            if (email.getToAddress().length() > 0) {
+                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getSmtpHost(), debug);
+            }
+        } catch (Exception e) {
+            try {
+                sendEmail(email.getToAddress(), emailServiceConfig.getFromAddress(), email.getSubject(), email.getMessage(), emailServiceConfig.getAltSmtpHost(), debug);
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
new file mode 100644
index 0000000000..ccacef7bce
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/ProductService.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:34
+ **/
+public class ProductService {
+
+
+    public static List<Product> getAllProductFromFile(File file) throws IOException {
+        List productList = new ArrayList();
+        BufferedReader br = null;
+
+        try {
+
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product();
+                product.setProductID(data[0]);
+                product.setProductDesc(data[1]);
+                System.out.println("产品ID = " + product.getProductID() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+                productList.add(product);
+            }
+
+            return productList;
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+        return null;
+    }
+
+}
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
new file mode 100644
index 0000000000..f89aff500a
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/PromotionMail.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.config.Configuration;
+import com.coderising.ood.config.ConfigurationKeys;
+import com.coderising.ood.pojo.Email;
+import com.coderising.ood.pojo.EmailServiceConfig;
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        File file = new File("D:\\product_promotion.txt");
+        //1.获得产品信息
+        ProductService productService = new ProductService();
+        List productList = productService.getAllProductFromFile(file);
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(productList, emailDebug);
+    }
+
+
+
+    public PromotionMail(List productList, boolean mailDebug) throws Exception {
+        //2.邮件服务器配置
+        Configuration config = new Configuration();
+        EmailServiceConfig emailServiceConfig = new EmailServiceConfig(config.getProperty(ConfigurationKeys.SMTP_SERVER), config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER), config.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+        //3.发送邮件
+        sendEMails(mailDebug, productList, emailServiceConfig);
+
+    }
+
+
+    public void sendEMails(boolean debug, List<Product> productList, EmailServiceConfig emailServiceConfig) throws Exception {
+        System.out.println("开始发送邮件");
+        if (productList != null) {
+            for (Product product : productList) {
+                List<User> userList = UserService.getSendEmailUser(product);
+                if (null != userList && userList.size() > 0) {
+                    for (User user : userList) {
+                        Email email = EmailService.configureEMail((user), product);
+                        if (email.getToAddress().length() > 0) {
+                            EmailService.sendEmail(emailServiceConfig,email,debug);
+                        }
+                    }
+                }
+            }
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+
+
+}
+
+
diff --git a/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
new file mode 100644
index 0000000000..a7c6d8fe38
--- /dev/null
+++ b/students/1425809544/ood-assignment/src/main/java/com/coderising/ood/service/UserService.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.service;
+
+import com.coderising.ood.pojo.Product;
+import com.coderising.ood.pojo.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xyy
+ * @create 2017-06-19 9:48
+ **/
+public class UserService {
+
+
+    public static List getSendEmailUser(Product product) throws Exception {
+
+
+        setLoadQuery(product);
+
+        List<User> userList = new ArrayList();
+
+        for (int i = 0; i < 3; i++) {
+            User user = new User();
+            user.setName("user" + i);
+            user.setEmail(user.getName() + "@qq.com");
+            userList.add(user);
+        }
+        return userList;
+    }
+
+
+    //通过产品id获取关注了产品的用户
+    public static void setLoadQuery(Product product) throws Exception {
+
+        String sql = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() + "' "
+                + "and send_mail=1 ";
+
+        System.out.println("loadQuery set");
+    }
+
+
+}

From e4b38c06f06c2e5bd5814b1eda2dbab882851e25 Mon Sep 17 00:00:00 2001
From: "wanghx@tjnetsec.net" <wanghx@tjnetsec.net>
Date: Mon, 19 Jun 2017 17:59:56 +0800
Subject: [PATCH 209/332] ood-srp-homeword

---
 students/251822722/srp/DBUtil.java            | 42 +++++++++
 students/251822722/srp/MailUtil.java          | 18 ++++
 students/251822722/srp/PromotionMailTest.java | 62 ++++++++++++
 students/251822722/srp/mail/Mail.java         | 15 +++
 .../251822722/srp/mail/PromotionMail.java     | 94 +++++++++++++++++++
 students/251822722/srp/product/Product.java   | 57 +++++++++++
 students/251822722/srp/product_promotion.txt  |  4 +
 .../251822722/srp/server/SmtpMailServer.java  | 42 +++++++++
 .../251822722/srp/setting/SystemSetting.java  | 26 +++++
 .../srp/setting/config/Configuration.java     | 27 ++++++
 .../srp/setting/config/ConfigurationKeys.java |  9 ++
 students/251822722/srp/user/User.java         | 41 ++++++++
 12 files changed, 437 insertions(+)
 create mode 100644 students/251822722/srp/DBUtil.java
 create mode 100644 students/251822722/srp/MailUtil.java
 create mode 100644 students/251822722/srp/PromotionMailTest.java
 create mode 100644 students/251822722/srp/mail/Mail.java
 create mode 100644 students/251822722/srp/mail/PromotionMail.java
 create mode 100644 students/251822722/srp/product/Product.java
 create mode 100644 students/251822722/srp/product_promotion.txt
 create mode 100644 students/251822722/srp/server/SmtpMailServer.java
 create mode 100644 students/251822722/srp/setting/SystemSetting.java
 create mode 100644 students/251822722/srp/setting/config/Configuration.java
 create mode 100644 students/251822722/srp/setting/config/ConfigurationKeys.java
 create mode 100644 students/251822722/srp/user/User.java

diff --git a/students/251822722/srp/DBUtil.java b/students/251822722/srp/DBUtil.java
new file mode 100644
index 0000000000..87eef49802
--- /dev/null
+++ b/students/251822722/srp/DBUtil.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.product.Product;
+
+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;
+    }
+
+
+    public static Product queryProduct(
+            String productDesc,
+
+            String productID) {
+
+        //TODO
+
+        return new Product();
+    }
+
+
+}
diff --git a/students/251822722/srp/MailUtil.java b/students/251822722/srp/MailUtil.java
new file mode 100644
index 0000000000..22b08893fa
--- /dev/null
+++ b/students/251822722/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
+                                 ) {
+        //假装发了一封邮件
+        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/251822722/srp/PromotionMailTest.java b/students/251822722/srp/PromotionMailTest.java
new file mode 100644
index 0000000000..3f70beac6a
--- /dev/null
+++ b/students/251822722/srp/PromotionMailTest.java
@@ -0,0 +1,62 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.product.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PromotionMailTest {
+
+
+    public static void main(String[] args) throws Exception {
+
+
+        //load change info
+        File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+        List<Product> products = getUpdateProduct(file);
+
+
+        //update message for user
+        products.stream().forEach(p -> {
+            p.notifyUserPriceChange();
+        });
+
+
+    }
+
+
+    protected static List<Product> getUpdateProduct(File file) throws IOException // @02C
+    {
+
+        List<Product> productMap = new ArrayList<Product>();
+
+
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+
+
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            Product product = DBUtil.queryProduct(data[0], data[1]);
+            productMap.add(product);
+
+            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 productMap;
+    }
+
+
+}
diff --git a/students/251822722/srp/mail/Mail.java b/students/251822722/srp/mail/Mail.java
new file mode 100644
index 0000000000..6e0d145c07
--- /dev/null
+++ b/students/251822722/srp/mail/Mail.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp.mail;
+
+import com.coderising.ood.srp.product.Product;
+import com.coderising.ood.srp.user.User;
+
+
+/**
+ * com.coderising.ood.srp
+ * Created by Eric Wang on 6/19/17.
+ */
+public interface Mail {
+
+
+    void sendPriceChangeEmail(User user, Product product);
+}
diff --git a/students/251822722/srp/mail/PromotionMail.java b/students/251822722/srp/mail/PromotionMail.java
new file mode 100644
index 0000000000..a6bbc98bf6
--- /dev/null
+++ b/students/251822722/srp/mail/PromotionMail.java
@@ -0,0 +1,94 @@
+package com.coderising.ood.srp.mail;
+
+import com.coderising.ood.srp.product.Product;
+import com.coderising.ood.srp.server.SmtpMailServer;
+import com.coderising.ood.srp.setting.SystemSetting;
+import com.coderising.ood.srp.user.User;
+
+import java.io.File;
+
+/**
+ * com.coderising.ood.srp.mail
+ * Created by Eric Wang on 6/19/17.
+ */
+public class PromotionMail implements Mail {
+
+    String form;
+    String to;
+    String subject;
+    String message;
+
+    SmtpMailServer smtpMailServer = new SmtpMailServer();
+
+
+    private void createPriceChangeEmailBody(User user, Product product) {
+
+
+            subject = "您关注的产品降价了";
+            message = "尊敬的 " + user.getUserName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+
+
+        }
+
+    @Override
+    public void sendPriceChangeEmail(User user, Product product) {
+
+        createPriceChangeEmailBody(user, product);
+        setFrom();
+        setTo(user);
+
+        smtpMailServer.sendEmail(this);
+
+
+
+    }
+
+    private void setTo(User user) {
+        to=user.getUserEmail();
+    }
+
+    private void setFrom() {
+        form= SystemSetting.getAdmin();
+    }
+
+
+    public String getForm() {
+        return form;
+    }
+
+    public void setForm(String form) {
+        this.form = form;
+    }
+
+    public String getTo() {
+        return to;
+    }
+
+    public void setTo(String to) {
+        this.to = to;
+    }
+
+    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 SmtpMailServer getSmtpMailServer() {
+        return smtpMailServer;
+    }
+
+    public void setSmtpMailServer(SmtpMailServer smtpMailServer) {
+        this.smtpMailServer = smtpMailServer;
+    }
+}
diff --git a/students/251822722/srp/product/Product.java b/students/251822722/srp/product/Product.java
new file mode 100644
index 0000000000..4aafee3637
--- /dev/null
+++ b/students/251822722/srp/product/Product.java
@@ -0,0 +1,57 @@
+package com.coderising.ood.srp.product;
+
+import com.coderising.ood.srp.DBUtil;
+import com.coderising.ood.srp.user.User;
+
+import java.util.List;
+
+/**
+ * com.coderising.ood.srp.product
+ * Created by Eric Wang on 6/19/17.
+ */
+public class Product {
+    String productDesc = null;
+
+    String productID = null;
+
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+
+    public void notifyUserPriceChange() {
+
+
+        List<User> userList = DBUtil.query(setLoadQuery(this.productID));
+
+        userList.stream().forEach(user -> {
+            user.sendPriceChangeEmail(this);
+        });
+
+    }
+
+    private String setLoadQuery(String productID) {
+
+        System.out.println("loadQuery set");
+
+        return "Select name from subscriptions "
+                + "where product_id= '" + productID + "' "
+                + "and send_mail=1 ";
+
+
+    }
+
+}
diff --git a/students/251822722/srp/product_promotion.txt b/students/251822722/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/251822722/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/251822722/srp/server/SmtpMailServer.java b/students/251822722/srp/server/SmtpMailServer.java
new file mode 100644
index 0000000000..d7ff260587
--- /dev/null
+++ b/students/251822722/srp/server/SmtpMailServer.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.server;
+
+import com.coderising.ood.srp.MailUtil;
+import com.coderising.ood.srp.mail.PromotionMail;
+import com.coderising.ood.srp.setting.SystemSetting;
+import com.coderising.ood.srp.setting.config.ConfigurationKeys;
+
+/**
+ * com.coderising.ood.srp
+ * Created by Eric Wang on 6/19/17.
+ */
+public class SmtpMailServer {
+
+
+    private static final String smtpHost = SystemSetting.getConfig().getProperty(ConfigurationKeys.SMTP_SERVER);
+    ;
+    private static final  String altSmtpHost = SystemSetting.getConfig().getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+
+    public void sendEmail(PromotionMail promotionMail) {
+
+
+        System.out.println("开始发送邮件");
+
+        try {
+            MailUtil.sendEmail(promotionMail.getTo(), promotionMail.getForm(), promotionMail.getSubject(), promotionMail.getMessage(), smtpHost);
+        } catch (Exception e) {
+
+            try {
+                MailUtil.sendEmail(promotionMail.getTo(), promotionMail.getForm(), promotionMail.getSubject(), promotionMail.getMessage(), altSmtpHost);
+
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+
+}
+
+
+
diff --git a/students/251822722/srp/setting/SystemSetting.java b/students/251822722/srp/setting/SystemSetting.java
new file mode 100644
index 0000000000..6e99d923fe
--- /dev/null
+++ b/students/251822722/srp/setting/SystemSetting.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.setting;
+
+import com.coderising.ood.srp.setting.config.Configuration;
+import com.coderising.ood.srp.setting.config.ConfigurationKeys;
+
+/**
+ * com.coderising.ood.srp.setting
+ * Created by Eric Wang on 6/19/17.
+ */
+public class SystemSetting {
+
+
+    private static Configuration config = new Configuration();
+
+
+
+    public static Configuration getConfig() {
+        return config;
+    }
+
+    public static String getAdmin() {
+
+        return config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+}
diff --git a/students/251822722/srp/setting/config/Configuration.java b/students/251822722/srp/setting/config/Configuration.java
new file mode 100644
index 0000000000..c81fc885ed
--- /dev/null
+++ b/students/251822722/srp/setting/config/Configuration.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.setting.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> configurations = new HashMap<String, String>();
+
+    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/251822722/srp/setting/config/ConfigurationKeys.java b/students/251822722/srp/setting/config/ConfigurationKeys.java
new file mode 100644
index 0000000000..3a5d230e78
--- /dev/null
+++ b/students/251822722/srp/setting/config/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.setting.config;
+
+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/251822722/srp/user/User.java b/students/251822722/srp/user/User.java
new file mode 100644
index 0000000000..da7d3ecbb5
--- /dev/null
+++ b/students/251822722/srp/user/User.java
@@ -0,0 +1,41 @@
+package com.coderising.ood.srp.user;
+
+import com.coderising.ood.srp.mail.Mail;
+import com.coderising.ood.srp.mail.PromotionMail;
+import com.coderising.ood.srp.product.Product;
+
+
+/**
+ * com.coderising.ood.srp.user
+ * Created by Eric Wang on 6/19/17.
+ */
+public class User {
+
+    Mail mail = new PromotionMail();
+
+    String userName ;
+
+    String userEmail;
+
+    public void sendPriceChangeEmail(Product product) {
+
+        mail.sendPriceChangeEmail(this, product);
+
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserEmail() {
+        return userEmail;
+    }
+
+    public void setUserEmail(String userEmail) {
+        this.userEmail = userEmail;
+    }
+}

From f6f23c0c4926607bb8956dab5ac7e252e7d2b6b2 Mon Sep 17 00:00:00 2001
From: zhangxin <zhangxin01@changingedu.com>
Date: Mon, 19 Jun 2017 20:32:55 +0800
Subject: [PATCH 210/332] srp

---
 .../82180735/ood/ood-assignment/README.md     |  6 +++
 students/82180735/ood/ood-assignment/pom.xml  | 12 +++++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++++
 .../java/com/coderising/ood/srp/Main.java     | 50 ++++++++++++++++++
 .../com/coderising/ood/srp/dao/UserDao.java   | 22 ++++++++
 .../ood/srp/domain/mail/MailConfigInfo.java   | 35 +++++++++++++
 .../ood/srp/domain/mail/MailInfo.java         | 35 +++++++++++++
 .../ood/srp/domain/product/ProductInfo.java   | 25 +++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 .../ood/srp/service/ProductInfoService.java   | 44 ++++++++++++++++
 .../ood/srp/service/PromotionMailService.java | 52 +++++++++++++++++++
 .../ood/srp/service/UserService.java          | 15 ++++++
 .../com/coderising/ood/srp/util/DBUtil.java   | 26 ++++++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 18 +++++++
 .../src/main/resources/product_promotion.txt  |  4 ++
 16 files changed, 380 insertions(+)
 create mode 100644 students/82180735/ood/ood-assignment/README.md
 create mode 100644 students/82180735/ood/ood-assignment/pom.xml
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 students/82180735/ood/ood-assignment/src/main/resources/product_promotion.txt

diff --git a/students/82180735/ood/ood-assignment/README.md b/students/82180735/ood/ood-assignment/README.md
new file mode 100644
index 0000000000..c425e51701
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/README.md
@@ -0,0 +1,6 @@
+
+[TOC]
+## 面向对象相关的作业
+
+### 第一周作业 重构一个发送邮件的程序，使之符合SRP
+
diff --git a/students/82180735/ood/ood-assignment/pom.xml b/students/82180735/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..b55d53ffe1
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>com.yue</groupId>
+	<artifactId>ood-assignment</artifactId>
+	<version>1.0-SNAPSHOT</version>
+
+
+</project>
\ No newline at end of file
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..d11d29787e
--- /dev/null
+++ b/students/82180735/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<String,String> configurations = new HashMap<String,String>();
+	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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/82180735/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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
new file mode 100644
index 0000000000..72dccf53ef
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
@@ -0,0 +1,50 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.domain.mail.MailConfigInfo;
+import com.coderising.ood.srp.domain.mail.MailInfo;
+import com.coderising.ood.srp.domain.product.ProductInfo;
+import com.coderising.ood.srp.service.ProductInfoService;
+import com.coderising.ood.srp.service.PromotionMailService;
+import com.coderising.ood.srp.service.UserService;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class Main {
+
+	public static void main(String[] args) {
+		//查询商品信息
+		ProductInfoService productInfoService = new ProductInfoService();
+		ProductInfo productInfo = productInfoService.selectProduct();
+
+		//查询用户信息
+		UserService userService = new UserService();
+		List<Map<String,String>> userList = userService.querySubscriptions(productInfo.getProductID());
+
+		//构造邮件配置及发件人信息
+		Configuration configuration = new Configuration();
+		MailConfigInfo mailConfigInfo = new MailConfigInfo();
+		mailConfigInfo.setSmtpHost(configuration.getProperty(ConfigurationKeys.SMTP_SERVER));
+		mailConfigInfo.setAltSmtpHost(configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER));
+		mailConfigInfo.setFromAddress(configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN));
+
+		//构造邮件内容及收件人信息
+		List<MailInfo> mailInfos = new ArrayList<MailInfo>(userList.size());
+		for (Map<String,String> map : userList) {
+			MailInfo mailInfo = new MailInfo();
+			mailInfo.setMessage("尊敬的 "+map.get("NAME")+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!");
+			mailInfo.setSubject("您关注的产品降价了");
+			mailInfo.setToAddress(map.get("EMAIL"));
+
+			mailInfos.add(mailInfo);
+		}
+
+		PromotionMailService promotionMailService = new PromotionMailService();
+
+		promotionMailService.sendEMails(mailConfigInfo,mailInfos,true);
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
new file mode 100644
index 0000000000..89137e35d8
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.srp.dao;
+
+import com.coderising.ood.srp.util.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class UserDao {
+
+	public List querySubscriptions(String productId) {
+
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productId +"' "
+				+ "and send_mail=1 ";
+
+
+		System.out.println("loadQuery set");
+		return DBUtil.query(sendMailQuery);
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java
new file mode 100644
index 0000000000..bcfd9aa857
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailConfigInfo.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.domain.mail;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class MailConfigInfo {
+	private String smtpHost;
+	private String altSmtpHost;
+	private String fromAddress;
+
+	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 fromAddress;
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java
new file mode 100644
index 0000000000..07aa58602a
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/mail/MailInfo.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.domain.mail;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class MailInfo {
+	private String toAddress;
+	private String subject;
+	private String message;
+
+
+	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 getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java
new file mode 100644
index 0000000000..2bc2be9d1e
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domain/product/ProductInfo.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.domain.product;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class ProductInfo {
+	private String productID;
+	private String 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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/82180735/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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java
new file mode 100644
index 0000000000..32b1733564
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/ProductInfoService.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.domain.product.ProductInfo;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class ProductInfoService {
+
+	public ProductInfo selectProduct() {
+//		File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		URL base = Thread.currentThread().getContextClassLoader().getResource("");
+		File file = new File(base.getFile(),"product_promotion.txt");
+		BufferedReader br = null;
+		ProductInfo productInfo = new ProductInfo();
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+
+			productInfo.setProductID(data[0]);
+			productInfo.setProductDesc(data[1]);
+
+			System.out.println("产品ID = " + productInfo.getProductID() + "\n");
+			System.out.println("产品描述 = " + productInfo.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+//			throw new IOException(e.getMessage());
+		} finally {
+			try {
+				br.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return productInfo;
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
new file mode 100644
index 0000000000..248d0b7a64
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/PromotionMailService.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.domain.mail.MailConfigInfo;
+import com.coderising.ood.srp.domain.mail.MailInfo;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by justin on 17/6/12.
+ */
+public class PromotionMailService {
+
+	public void sendEMails(MailConfigInfo mailConfigInfo, List<MailInfo> mailInfos, boolean debug)
+	{
+
+		System.out.println("开始发送邮件");
+
+
+		if (mailInfos != null) {
+			Iterator iter = mailInfos.iterator();
+			while (iter.hasNext()) {
+				MailInfo mailInfo = (MailInfo) iter.next();
+
+				try
+				{
+					if (mailInfo.getToAddress().length() > 0)
+						MailUtil.sendEmail(mailInfo.getToAddress(), mailConfigInfo.getFromAddress(), mailInfo.getSubject(), mailInfo.getMessage(),
+								mailConfigInfo.getSmtpHost(), debug);
+				}
+				catch (Exception e)
+				{
+					try {
+						MailUtil.sendEmail(mailInfo.getToAddress(), mailConfigInfo.getFromAddress(), mailInfo.getSubject(), mailInfo.getMessage(),
+								mailConfigInfo.getAltSmtpHost(), debug);
+
+					} catch (Exception e2)
+					{
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+					}
+				}
+			}
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 0000000000..bed06d4306
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.dao.UserDao;
+
+import java.util.List;
+
+/**
+ * Created by justin on 17/6/19.
+ */
+public class UserService {
+
+	public List querySubscriptions(String productId) {
+		return new UserDao().querySubscriptions(productId);
+	}
+}
diff --git a/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..f18e812954
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.util;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<Map<String,String>> 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/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..bb028c690c
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp.util;
+
+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/82180735/ood/ood-assignment/src/main/resources/product_promotion.txt b/students/82180735/ood/ood-assignment/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/82180735/ood/ood-assignment/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 8bdcd3610ea8e9a047eb81d0b08893b5b48f78c5 Mon Sep 17 00:00:00 2001
From: silencehe09 <silencehe09@gmail.com>
Date: Mon, 19 Jun 2017 21:21:31 +0800
Subject: [PATCH 211/332] To refactor the email service of product promotion.

---
 .../ood/srp/ConfigProductRepository.java      | 40 ++++++++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 ++++
 .../coderising/ood/srp/EmailServiceImpl.java  | 52 +++++++++++++++++++
 .../ood/srp/MockUserRepository.java           | 24 +++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 34 ++++++++++++
 .../coderising/ood/srp/domainlogic/Email.java | 47 +++++++++++++++++
 .../ood/srp/domainlogic/EmailService.java     | 11 ++++
 .../ood/srp/domainlogic/Product.java          | 29 +++++++++++
 .../srp/domainlogic/ProductRepository.java    |  8 +++
 .../domainlogic/PromotionEmailService.java    | 51 ++++++++++++++++++
 .../coderising/ood/srp/domainlogic/User.java  | 29 +++++++++++
 .../ood/srp/domainlogic/UserRepository.java   |  7 +++
 .../coderising/ood/srp/emailconfig.properties |  3 ++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 14 files changed, 348 insertions(+)
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties
 create mode 100644 students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java
new file mode 100644
index 0000000000..b31c6040a8
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigProductRepository.java
@@ -0,0 +1,40 @@
+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;
+
+import com.coderising.ood.srp.domainlogic.Product;
+import com.coderising.ood.srp.domainlogic.ProductRepository;
+
+public class ConfigProductRepository extends ProductRepository {
+
+	private static final String PRODUCT_PROMOTION_FILE = "com/coderising/ood/srp/product_promotion.txt";
+	@Override
+	public List<Product> getPromotionProducts() throws IOException {
+		BufferedReader br = null;
+		List<Product> products = new ArrayList<>();
+		try {
+			String fileName = Thread.currentThread().getContextClassLoader().getResource(PRODUCT_PROMOTION_FILE)
+					.getFile();
+			br = new BufferedReader(new FileReader(fileName));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			products.add(product);
+			System.out.println("产品ID = " + product.getProductID() + "\n");
+			System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+		return products;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..868a03ff83
--- /dev/null
+++ b/students/709960951/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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java
new file mode 100644
index 0000000000..b47406cc11
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailServiceImpl.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.domainlogic.Email;
+import com.coderising.ood.srp.domainlogic.EmailService;
+
+public class EmailServiceImpl implements EmailService {
+	private boolean debugMode = false; // 调试模式，默认关闭
+	private String priorSmtpHost;
+	private String altSmtpHost;
+
+	public EmailServiceImpl(String priorSmtpHost, String altSmtpHost) {
+		this.priorSmtpHost = priorSmtpHost;
+		this.altSmtpHost = altSmtpHost;
+	}
+
+	@Override
+	public void sendEmail(Email email) {
+
+		try {
+			sendEmail(email, priorSmtpHost);
+		} catch (Exception e) {
+
+			try {
+				sendEmail(email, altSmtpHost);
+			} catch (Exception e2) {
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+			}
+		}
+	}
+
+	private void sendEmail(Email email,String smtpHost)
+	{
+		// TODO: send email
+		if (isDebugMode()) {
+			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());
+		}
+	}
+
+	public boolean isDebugMode() {
+		return debugMode;
+	}
+
+	public void setDebugMode(boolean debugMode) {
+		this.debugMode = debugMode;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java
new file mode 100644
index 0000000000..98c70a6ff0
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MockUserRepository.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.domainlogic.User;
+import com.coderising.ood.srp.domainlogic.UserRepository;
+
+public class MockUserRepository extends UserRepository {
+
+	@Override
+	public List<User> getPromotionUsers() {
+		List<User> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.setEmail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..f57df29b3d
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.Properties;
+
+import com.coderising.ood.srp.domainlogic.PromotionEmailService;
+
+public class PromotionMail {
+
+	private static final String EMAIL_CONFIG = "com/coderising/ood/srp/emailconfig.properties";
+
+	public static void main(String[] args) throws Exception {
+		// 读取email配置文件
+		Properties emailConfig = new Properties();
+		emailConfig.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(EMAIL_CONFIG));
+		// 获取配置项
+		String priorSmtpHost = ConfigurationKeys.SMTP_SERVER;
+		String altSmtpHost = ConfigurationKeys.ALT_SMTP_SERVER;
+		String fromEmailAddress = ConfigurationKeys.SMTP_SERVER;
+		// 邮件服务的实现
+		EmailServiceImpl emailService = new EmailServiceImpl(priorSmtpHost, altSmtpHost);
+		emailService.setDebugMode(true);
+		// 从配置文件中获取产品信息
+		ConfigProductRepository configProductRepository = new ConfigProductRepository();
+		// 模拟生成邮件的目标用户
+		MockUserRepository mockUserRepository = new MockUserRepository();
+
+		// 促销邮件发送服务
+		PromotionEmailService pes = new PromotionEmailService(emailService, configProductRepository,
+				mockUserRepository);
+		pes.setFromAddress(fromEmailAddress);
+		System.out.println("开始发送邮件");
+		pes.sendEmail();
+	}
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java
new file mode 100644
index 0000000000..4c018874e5
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Email.java
@@ -0,0 +1,47 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * The Email domain model
+ * 
+ * @author silencehe09
+ *
+ */
+public class Email {
+	private String fromAddress;
+	private String toAddress;
+	private String subject;
+	private String message;
+
+	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 getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java
new file mode 100644
index 0000000000..9b8f9ac6ae
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/EmailService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * the interface of email service.
+ * 
+ * @author silencehe09
+ *
+ */
+public interface EmailService {
+	void sendEmail(Email email);
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java
new file mode 100644
index 0000000000..ae1d2353ce
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/Product.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * The Product domain model
+ * 
+ * @author silencehe09
+ *
+ */
+public class Product {
+	private String productID;
+	private String 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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java
new file mode 100644
index 0000000000..0d1e2d2ac7
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/ProductRepository.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.srp.domainlogic;
+
+import java.io.IOException;
+import java.util.List;
+
+public abstract class ProductRepository {
+	public abstract List<Product> getPromotionProducts() throws IOException;
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java
new file mode 100644
index 0000000000..e5b5852774
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/PromotionEmailService.java
@@ -0,0 +1,51 @@
+package com.coderising.ood.srp.domainlogic;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 促销邮件发送服务，实现具体的邮件发送业务逻辑
+ * 
+ * @author silencehe09
+ *
+ */
+public class PromotionEmailService {
+	private EmailService emailService;
+	private ProductRepository productRepository;
+	private UserRepository userRepository;
+	private String fromAddress;
+
+	public PromotionEmailService(EmailService emailService, ProductRepository productRepository,
+			UserRepository userRepository) {
+		this.emailService = emailService;
+		this.productRepository = productRepository;
+		this.userRepository = userRepository;
+	}
+
+	public void sendEmail() throws IOException {
+		List<User> users = userRepository.getPromotionUsers();
+		List<Product> products = productRepository.getPromotionProducts();
+		for (Product product : products) {
+			for (User user : users) {
+				Email email = new Email();
+				email.setFromAddress(fromAddress);
+				email.setToAddress(user.getEmail());
+				email.setSubject(getEmailSubject());
+				email.setMessage(getEmailMessage(user, product));
+				emailService.sendEmail(email);
+			}
+		}
+	}
+
+	public void setFromAddress(String fromAddress) {
+		this.fromAddress = fromAddress;
+	}
+
+	private String getEmailSubject() {
+		return "您关注的产品降价了";
+	}
+
+	private String getEmailMessage(User user, Product product) {
+		return "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+	}
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java
new file mode 100644
index 0000000000..1dbe849d39
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/User.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.domainlogic;
+
+/**
+ * The User domain model
+ * 
+ * @author silencehe09
+ *
+ */
+public class User {
+	private String name;
+	private String 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/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java
new file mode 100644
index 0000000000..55274b79f6
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/domainlogic/UserRepository.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.srp.domainlogic;
+
+import java.util.List;
+
+public abstract class UserRepository {
+	public abstract List<User> getPromotionUsers();
+}
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties
new file mode 100644
index 0000000000..6f5615d18b
--- /dev/null
+++ b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/emailconfig.properties
@@ -0,0 +1,3 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
\ No newline at end of file
diff --git a/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/709960951/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/709960951/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

From 31199da095b199d9281374e8070e5c2d602f92a8 Mon Sep 17 00:00:00 2001
From: cenkailun <cenkailun@meituan.com>
Date: Mon, 19 Jun 2017 21:32:05 +0800
Subject: [PATCH 212/332] =?UTF-8?q?=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...5\346\236\204_\346\200\235\350\267\257.md" |  72 +++++++
 .../ood_assignment/refactor_odd/pom.xml       |  36 ++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 198 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../refactor_odd/PromotionMail.java           |  64 ++++++
 .../refactor_odd/constant/Constant.java       |  12 ++
 .../refactor_odd/entity/EmailEntity.java      |  46 ++++
 .../refactor_odd/entity/ProductEntity.java    |  27 +++
 .../refactor_odd/entity/UserEntity.java       |  29 +++
 .../refactor_odd/handler/EmailHandler.java    |  51 +++++
 .../refactor_odd/handler/ProductHandler.java  |  50 +++++
 .../refactor_odd/handler/UserHandler.java     |  29 +++
 16 files changed, 693 insertions(+)
 create mode 100644 "students/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md"
 create mode 100644 students/406400373/ood_assignment/refactor_odd/pom.xml
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
 create mode 100644 students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java

diff --git "a/students/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md" "b/students/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md"
new file mode 100644
index 0000000000..32dab3b3dd
--- /dev/null
+++ "b/students/406400373/ood_assignment/refactor_odd/OOD_\351\207\215\346\236\204_\346\200\235\350\267\257.md"
@@ -0,0 +1,72 @@
+整个发送的流程主要是以下步骤
+1. 从配置文件中读取，生成要发送的产品信息。
+2. 设置邮件发送需要的SMTPHOST,ALTSMTPHOST,FROMADDRESS
+3. 查询出需要发送的用户列表
+4. 设置发送邮件需要的 信息，从用户列表中读取要发送去的地址，用产品信息拼凑出Message
+5. 发送邮件。
+其实Promotion就是一个job，衔接各个Handler，不自己做逻辑，完成发信的一个任务。
+
+所以我理解首先可以独立出来的一堆职责就是邮件发送的类，它能够被初始化，然后接受参数发送邮件。
+
+所以首先抽取出的职责就是和邮件发送相关的职责。EmailHandler。
+smtphost和altSmtpHost是定死的，应该设定成系统初始化时就设定好，至于From address在发送企业推送邮件时，也是统一的，也考虑封装在EmailHandler内部。
+在初始化一个EmailHandler时，即完成了邮件系统的相关设置。
+然后将发信的逻辑封装在EmailHandler内部。
+然后在PromotionMail中移除邮件系统相关的配置，引入EmailHandler。
+现在所有和发送相关以及邮件系统初始化的逻辑，全部移动到了EmailHandler内部。
+```java
+public PromotionMail(File file, boolean mailDebug) throws Exception {
+		// 读文件，获得要推送的商品信息
+		readFile(file);
+		// 查询用户
+		setLoadQuery();
+		// 初始化邮件发送Handler
+		EmailHandler emailHandler = new EmailHandler();
+		// 对私有函数增加一个参数。
+		sendEMails(mailDebug, loadMailingList(), emailHandler);
+	}
+```
+
+ok，接下来，邮件发送需要的主体信息是来自外部的，但它可以是一个纯数据类，存放着发送者，主题，message，一个pojo类，sendEMails应该只需要接受pojo的list，然后直接调emailHandler的发送函数即可，而不需要在里面还要进行取值的操作。
+```java
+		configureEMail((HashMap) iter.next());
+	    boolean result = emailHandler.sendMail(toAddress, subject, message, debug);
+```
+一个简单的pojo类，emailHandler应该接受这个作为参数，修改代码如下
+```java
+  private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+```
+新的发送邮件的函数
+```java
+private void sendEMails(boolean debug, List<EmailEntity> emailEntities, EmailHandler emailHandler)
+			throws IOException {
+
+		System.out.println("开始发送邮件");
+		if (CollectionUtils.isNotEmpty(emailEntities)) {
+			for (EmailEntity emailEntity : emailEntities) {
+				boolean result = emailHandler.sendMail(emailEntity, debug);
+				System.out.println("发送邮件结果: " + result);
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+```
+emailHandler直接和emailEntity交互。
+接下来就是说我们怎么去构造emailEntities这个list了。
+然后这个商品信息的文件读取出来是一个list，首先对原有的读文件函数进行改动，用一个pojo类去代表商品的信息。同样的，用户的返回我们也用一个pojo类存储，因为这些东西以后的加字段可能是比较高的，通过一个统一的实体来管理会比较好。
+然后在job类里少用this，通过传参的方式，首先改变查询用户的函数，传入参数查询语句，返回的是user的list。
+分别构造出用来查询商品和用来处理用户的私有方法，准备下一步的重构。
+将查询商品相关的处理，封装到ProductHandler内部，只对外暴露获得商品列表的接口。
+```java
+// 查询商品
+List<Product> products = new ProductHandler().fetchProducts();
+```
+用户是根据订阅了商品的来查的，所以处理用户的UserHandler接受一个sql语句查询，和商品之间解耦。
+
+最终总结就是通过三个处理器负责商品，用户，邮件的处理，原有的PromotionMail则相当于是衔接各个处理器的job，具体的业务逻辑放在各个handler内部完成处理。
+
+重构完毕。
diff --git a/students/406400373/ood_assignment/refactor_odd/pom.xml b/students/406400373/ood_assignment/refactor_odd/pom.xml
new file mode 100644
index 0000000000..ecba4bc53e
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>ood-assignment</groupId>
+    <artifactId>refactor-odd</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.5.1</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/Configuration.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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<String,String> 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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..b161fa4691
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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", "UserEntity" + i);
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..00b12fb448
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,198 @@
+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.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("/Users/cenkailun/codelab/coding2017/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
new file mode 100644
index 0000000000..bd08cd57af
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
@@ -0,0 +1,64 @@
+package com.coderising.refactor_odd;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.refactor_odd.entity.EmailEntity;
+import com.coderising.refactor_odd.entity.ProductEntity;
+import com.coderising.refactor_odd.entity.UserEntity;
+import com.coderising.refactor_odd.handler.EmailHandler;
+import com.coderising.refactor_odd.handler.ProductHandler;
+import com.coderising.refactor_odd.handler.UserHandler;
+import org.apache.commons.collections4.CollectionUtils;
+
+public class PromotionMail {
+
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+	}
+
+	public static void main(String[] args) throws Exception {
+		// 初始化处理器
+		EmailHandler emailHandler = new EmailHandler();
+		ProductHandler productHandler = new ProductHandler();
+		UserHandler userHandler = new UserHandler();
+
+		// 构造数据
+		List<EmailEntity> emailEntities = new ArrayList<>();
+		List<ProductEntity> products = productHandler.fetchProducts();
+		for (ProductEntity product : products) {
+			List<UserEntity> users = userHandler.fetchUser(buildUserQuery(product.getProductId()));
+			for (UserEntity user : users) {
+				EmailEntity emailEntity = new EmailEntity();
+				emailEntity.setToAddress(user.getEmail());
+				emailEntity.setSubject("您关注的产品降价了");
+				emailEntity.setMessage("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductName() + " 降价了，欢迎购买!");
+				emailEntities.add(emailEntity);
+			}
+		}
+		// 发送邮件
+		sendEMails(false, emailEntities, emailHandler);
+
+	}
+
+	private static String buildUserQuery(String productID) throws Exception {
+
+		return "Select name from subscriptions " + "where product_id= '" + productID + "' " + "and send_mail=1 ";
+	}
+
+	private static void sendEMails(boolean debug, List<EmailEntity> emailEntities, EmailHandler emailHandler)
+			throws IOException {
+
+		System.out.println("开始发送邮件");
+		if (CollectionUtils.isNotEmpty(emailEntities)) {
+			for (EmailEntity emailEntity : emailEntities) {
+				System.out.println("发送邮件:");
+				emailHandler.sendMail(emailEntity, debug);
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java
new file mode 100644
index 0000000000..4f4e9b5607
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/constant/Constant.java
@@ -0,0 +1,12 @@
+package com.coderising.refactor_odd.constant;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午9:01
+ */
+public class Constant {
+
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java
new file mode 100644
index 0000000000..1fb9278f43
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/EmailEntity.java
@@ -0,0 +1,46 @@
+package com.coderising.refactor_odd.entity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午8:43
+ */
+public class EmailEntity {
+
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java
new file mode 100644
index 0000000000..a92910a608
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/ProductEntity.java
@@ -0,0 +1,27 @@
+package com.coderising.refactor_odd.entity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午8:53
+ */
+public class ProductEntity {
+	private String ProductId;
+	private String ProductName;
+
+	public String getProductId() {
+		return ProductId;
+	}
+
+	public void setProductId(String productId) {
+		ProductId = productId;
+	}
+
+	public String getProductName() {
+		return ProductName;
+	}
+
+	public void setProductName(String productName) {
+		ProductName = productName;
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java
new file mode 100644
index 0000000000..b5d5f45d0a
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/entity/UserEntity.java
@@ -0,0 +1,29 @@
+package com.coderising.refactor_odd.entity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午8:55
+ */
+public class UserEntity {
+
+	private String name;
+
+	private String 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/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java
new file mode 100644
index 0000000000..b55997038e
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/EmailHandler.java
@@ -0,0 +1,51 @@
+package com.coderising.refactor_odd.handler;
+
+import com.coderising.refactor_odd.entity.EmailEntity;
+import org.apache.commons.lang3.StringUtils;
+
+import com.coderising.ood.srp.Configuration;
+import com.coderising.ood.srp.ConfigurationKeys;
+import com.coderising.ood.srp.MailUtil;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/16
+ * @Time 下午5:40
+ */
+public class EmailHandler {
+
+	private String smtpHost = null;
+	private String altSmtpHost = null;
+	private String fromAddress = null;
+
+	public EmailHandler() {
+		initEmailHandler();
+	}
+
+	private void initEmailHandler() {
+		Configuration configuration = new Configuration();
+		smtpHost = configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+		altSmtpHost = configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		fromAddress = configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+	}
+
+	public void sendMail(EmailEntity emailEntity, boolean debug) {
+		// TODO 校验
+		send(emailEntity.getToAddress(),
+				StringUtils.isEmpty(emailEntity.getFromAddress()) ? this.fromAddress : emailEntity.getFromAddress(),
+				emailEntity.getSubject(), emailEntity.getMessage(), debug);
+	}
+
+	private void send(String toAddress, String fromAddress, String subject, String message, boolean debug) {
+		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());
+			}
+		}
+	}
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
new file mode 100644
index 0000000000..9b3f9bd9bb
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
@@ -0,0 +1,50 @@
+package com.coderising.refactor_odd.handler;
+
+import com.coderising.refactor_odd.entity.ProductEntity;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午9:13
+ */
+public class ProductHandler {
+
+	private List<ProductEntity> products = new ArrayList<>();
+
+	public ProductHandler() throws IOException {
+		File f = new File(
+				"/Users/cenkailun/codelab/coding2017/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		initProducts(f);
+	}
+
+	private List<ProductEntity> initProducts(File file) throws IOException {
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = null;
+			while ((temp = br.readLine()) != null) {
+				String[] data = temp.split(" ");
+				ProductEntity product = new ProductEntity();
+				product.setProductId(data[0]);
+				product.setProductName(data[1]);
+				products.add(product);
+			}
+			return products;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	public List<ProductEntity> fetchProducts() {
+	    return products;
+    }
+}
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java
new file mode 100644
index 0000000000..b26439c5eb
--- /dev/null
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/UserHandler.java
@@ -0,0 +1,29 @@
+package com.coderising.refactor_odd.handler;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import com.coderising.ood.srp.DBUtil;
+import com.coderising.refactor_odd.constant.Constant;
+import com.coderising.refactor_odd.entity.UserEntity;
+
+/**
+ * @author cenkailun
+ * @Date 17/6/19
+ * @Time 下午9:18
+ */
+public class UserHandler {
+
+	public List<UserEntity> fetchUser(String sql) {
+		List<HashMap> temp = DBUtil.query(sql);
+		List<UserEntity> result = new ArrayList<>();
+		for (HashMap hashMap : temp) {
+			UserEntity user = new UserEntity();
+			user.setEmail((String) hashMap.get(Constant.EMAIL_KEY));
+			user.setName((String) hashMap.get(Constant.NAME_KEY));
+			result.add(user);
+		}
+		return result;
+	}
+}

From 50c5c068e7647a26d98f9b9ff78edbbb3abc49c1 Mon Sep 17 00:00:00 2001
From: Xujie <jie.xu@coer-scnu.org>
Date: Mon, 19 Jun 2017 21:36:40 +0800
Subject: [PATCH 213/332] =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=AC=AC=E4=B8=80?=
 =?UTF-8?q?=E5=AD=A3=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E5=B7=A5=E7=A8=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/edu/coerscnu/basic/Iterator.java      |   9 --
 .../basic/list/ArrayList/MyArrayList.java     | 127 ---------------
 .../basic/list/LinkedList/MyLinkedList.java   | 151 ------------------
 .../src/edu/coerscnu/basic/list/MyList.java   |  76 ---------
 .../src/edu/coerscnu/basic/queue/MyQueue.java | 112 -------------
 .../src/edu/coerscnu/basic/stack/MyStack.java |   5 -
 .../src/edu/coerscnu/client/Client.java       |  18 ---
 7 files changed, 498 deletions(-)
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java
 delete mode 100644 students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java

diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java
deleted file mode 100644
index ed96cce2a6..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/Iterator.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package edu.coerscnu.basic;
-
-public interface Iterator<E> {
-	
-	public boolean hasNext();
-
-	public Object next();
-
-}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java
deleted file mode 100644
index 9e494dd331..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/ArrayList/MyArrayList.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package edu.coerscnu.basic.list.ArrayList;
-
-import edu.coerscnu.basic.Iterator;
-import edu.coerscnu.basic.list.MyList;
-
-public class MyArrayList<E> implements MyList<E> {
-
-	private final static int DEFAULT_CAPACITY = 16;
-
-	private int capacity;
-
-	private int size;
-
-	private Object[] ele;
-
-	public MyArrayList(int capacity) {
-		if (capacity < 0)
-			throw new IllegalArgumentException("Illegal Capacity: " + capacity);
-		this.capacity = capacity;
-		ele = new Object[capacity];
-	}
-
-	public MyArrayList() {
-		this(DEFAULT_CAPACITY);
-	}
-
-	@Override
-	public boolean add(E e) {
-		add(size, e);
-		return true;
-	}
-
-	@Override
-	public boolean add(int index, E e) {
-		if (index < 0 || index > size)
-			throw new IndexOutOfBoundsException();
-		ensureCapacity(size + 1);
-		for (int i = size; i > index; i--) {
-			ele[i] = ele[i - 1];
-		}
-		size++;
-		ele[index] = e;
-		return true;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E set(int index, E e) {
-		if (index < 0 || index >= size)
-			throw new IndexOutOfBoundsException();
-		E old = (E) ele[index];
-		ele[index] = e;
-		return old;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E get(int index) {
-		if (index < 0 || index >= size)
-			throw new IndexOutOfBoundsException();
-		return (E) ele[index];
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E remove(int index) {
-		if (index < 0 || index >= size)
-			throw new IndexOutOfBoundsException();
-		E old = (E) ele[index];
-		for (int i = index; i < size - 1; i++) {
-			ele[i] = ele[i + 1];
-		}
-		ele[--size] = null;
-		return old;
-	}
-
-	@Override
-	public boolean clear() {
-		for (int i = 0; i < size; i++) {
-			ele[i] = null;
-		}
-		size = 0;
-		return true;
-	}
-
-	@Override
-	public boolean isEmpty() {
-		return size == 0;
-	}
-
-	@Override
-	public int size() {
-		return size;
-	}
-
-	@Override
-	public Iterator<E> iterator() {
-		return new MyArrayListIterator();
-	}
-
-	private void ensureCapacity(int newCapacity) {
-		if (newCapacity < capacity)
-			return;
-		Object[] old = ele;
-		ele = new Object[capacity <<= 1];
-		for (int i = 0; i < size; i++) {
-			ele[i] = old[i];
-			old[i] = null;
-		}
-	}
-
-	private class MyArrayListIterator implements Iterator<E> {
-
-		private int current;
-
-		@Override
-		public boolean hasNext() {
-			return current < size;
-		}
-
-		@Override
-		public Object next() {
-			return ele[current++];
-		}
-
-	}
-}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java
deleted file mode 100644
index 8641664595..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/LinkedList/MyLinkedList.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package edu.coerscnu.basic.list.LinkedList;
-
-import edu.coerscnu.basic.Iterator;
-import edu.coerscnu.basic.list.MyList;
-
-public class MyLinkedList<E> implements MyList<E> {
-
-	// 链表大小
-	private int size;
-	// 头节点
-	private Node<E> firstNode;
-	// 尾节点
-	private Node<E> lastNode;
-
-	private static class Node<E> {
-
-		private Node<E> prev; // 前置节点
-
-		private Node<E> next; // 后置节点
-
-		private E ele; // 节点数据
-
-		public Node(E ele, Node<E> prev, Node<E> next) {
-			this.ele = ele;
-			this.prev = prev;
-			this.next = next;
-		}
-	}
-
-	public MyLinkedList() {
-		firstNode = new Node<E>(null, null, null);
-		lastNode = new Node<E>(null, firstNode, null);
-		firstNode.next = lastNode;
-		size = 0;
-	}
-
-	@Override
-	public boolean add(E e) {
-		return add(size, e);
-	}
-
-	@Override
-	public boolean add(int index, E e) {
-		return addBefore(getNode(index), e);
-	}
-
-	@Override
-	public E set(int index, E e) {
-		Node<E> node = getNode(index);
-		E old = node.ele;
-		node.ele = e;
-		return old;
-	}
-
-	@Override
-	public E get(int index) {
-		return getNode(index).ele;
-	}
-
-	@Override
-	public E remove(int index) {
-		return remove(getNode(index));
-	}
-
-	/**
-	 * 在指定节点前加入节点
-	 * 
-	 * @param node
-	 * @param e
-	 */
-	private boolean addBefore(Node<E> node, E e) {
-		Node<E> newNode = new Node<E>(e, node.prev, node);
-		newNode.prev.next = newNode;
-		node.prev = newNode;
-		size++;
-		return true;
-	}
-
-	private E remove(Node<E> node) {
-		node.prev.next = node.next;
-		node.next.prev = node.prev;
-		size--;
-		return node.ele;
-	}
-
-	/**
-	 * 获取指定位置的节点
-	 * 
-	 * @param index
-	 * @return
-	 */
-	private Node<E> getNode(int index) {
-		if (index < 0 || index > size)
-			throw new IndexOutOfBoundsException();
-		Node<E> node;
-		if (index < size / 2) {
-			node = firstNode;
-			for (int i = 0; i < index; i++) {
-				node = node.next;
-			}
-		} else {
-			node = lastNode;
-			for (int i = size; i > index; i--) {
-				node = node.prev;
-			}
-		}
-		return node;
-	}
-
-	@Override
-	public boolean clear() {
-		firstNode = new Node<E>(null, null, null);
-		lastNode = new Node<E>(null, firstNode, null);
-		firstNode.next = lastNode;
-		size = 0;
-		return true;
-	}
-
-	@Override
-	public boolean isEmpty() {
-		return size == 0;
-	}
-
-	@Override
-	public int size() {
-		return size;
-	}
-
-	@Override
-	public Iterator<E> iterator() {
-		return new MyLinkedListIterator();
-	}
-
-	private class MyLinkedListIterator implements Iterator<E> {
-
-		private Node<E> current = firstNode.next;
-
-		@Override
-		public boolean hasNext() {
-			return current != lastNode;
-		}
-
-		@Override
-		public Object next() {
-			E ele = current.ele;
-			current = current.next;
-			return ele;
-		}
-
-	}
-}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java
deleted file mode 100644
index 42ef922391..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/list/MyList.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package edu.coerscnu.basic.list;
-
-import edu.coerscnu.basic.Iterator;
-
-public interface MyList<E> {
-
-	/**
-	 * 在末尾添加元素
-	 * 
-	 * @param e
-	 * @return
-	 */
-	public boolean add(E e);
-
-	/**
-	 * 在指定位置添加元素
-	 * 
-	 * @param index
-	 * @param e
-	 * @return
-	 */
-	public boolean add(int index, E e);
-
-	/**
-	 * 在指定位置设置元素
-	 * 
-	 * @param index
-	 * @param e
-	 * @return
-	 */
-	public E set(int index, E e);
-
-	/**
-	 * 获取指定位置的元素
-	 * 
-	 * @param index
-	 * @return
-	 */
-	public E get(int index);
-
-	/**
-	 * 删除指定位置的元素
-	 * 
-	 * @param index
-	 * @return
-	 */
-	public E remove(int index);
-
-	/**
-	 * 删除整个列表
-	 * 
-	 * @return
-	 */
-	public boolean clear();
-
-	/**
-	 * 判断列表是否为空
-	 * 
-	 * @return
-	 */
-	public boolean isEmpty();
-
-	/**
-	 * 返回列表元素个数
-	 * 
-	 * @return
-	 */
-	public int size();
-
-	/**
-	 * 获得列表的迭代器
-	 * 
-	 * @return
-	 */
-	public Iterator<E> iterator();
-}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java
deleted file mode 100644
index 43ab6d85eb..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/queue/MyQueue.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package edu.coerscnu.basic.queue;
-
-import edu.coerscnu.basic.Iterator;
-
-/**
- * 链式队列
- * 
- * @author xujie
- *
- * @param <E>
- */
-public class MyQueue<E> {
-
-	private static class Node<E> {
-
-		private Node<E> next; // 后置节点
-
-		private E ele; // 节点数据
-
-		public Node(E ele, Node<E> next) {
-			this.ele = ele;
-			this.next = next;
-		}
-	}
-
-	private int size;
-	
-	private Node<E> front;
-	
-	private Node<E> rear;
-	
-	public MyQueue() {
-		
-	}
-	
-	/**
-	 * 入队
-	 * @param e
-	 * @return
-	 */
-	public boolean enQueue(E e) {
-		if (front == null) {
-			front = new Node<E>(e, null);
-			rear = front;
-		} else {
-			Node<E> newNode = new Node<E>(e, null);
-			rear.next = newNode;
-			rear = newNode;
-		}
-		size++;
-		return true;
-	}
-	
-	/**
-	 * 出队
-	 * 
-	 * @return
-	 */
-	public E deQueue() {
-		if (isEmpty())
-			throw new IndexOutOfBoundsException("空队列异常");
-		Node<E> oldFront = front;
-		E ele = oldFront.ele;
-		front = front.next;
-		oldFront.ele = null;
-		oldFront.next = null;
-		size--;
-		return ele;
-	}
-	
-	public E element() {
-		if (isEmpty())
-			throw new IndexOutOfBoundsException("空队列异常");
-		return front.ele;
-	}
-	
-	public boolean clear() {
-		front = null;
-		rear = null;
-		size = 0;
-		return true;
-	}
-	
-	public boolean isEmpty() {
-		return size == 0;
-	}
-	
-	public int size() {
-		return size;
-	}
-	
-	public Iterator<E> iterator() {
-		return new MyQueueIterator();
-	}
-	
-	private class MyQueueIterator implements Iterator<E> {
-
-		private Node<E> current = front;
-		
-		@Override
-		public boolean hasNext() {
-			return current != rear.next;
-		}
-
-		@Override
-		public Object next() {
-			E ele = current.ele;
-			current = current.next;
-			return ele;
-		}
-	}
-}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java
deleted file mode 100644
index 9ff4de9320..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/basic/stack/MyStack.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package edu.coerscnu.basic.stack;
-
-public class MyStack {
-
-}
diff --git a/students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java b/students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java
deleted file mode 100644
index b9941b7ec3..0000000000
--- a/students/617314917/data-structure/assignment/src/edu/coerscnu/client/Client.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package edu.coerscnu.client;
-
-import edu.coerscnu.basic.Iterator;
-import edu.coerscnu.basic.list.LinkedList.MyLinkedList;
-
-public class Client {
-
-	public static void main(String[] args) {
-		MyLinkedList<Integer> linkedList = new MyLinkedList<>();
-		for (int i = 0; i < 8; i++) {
-			linkedList.add(i);
-		}
-		Iterator<Integer> iterator = linkedList.iterator();
-		while (iterator.hasNext()) {
-			System.out.println(iterator.next());
-		}
-	}
-}

From ec98ab356e861bf919690b06f0fd65928b40c19f Mon Sep 17 00:00:00 2001
From: cenkailun <cenkailun@meituan.com>
Date: Mon, 19 Jun 2017 21:43:14 +0800
Subject: [PATCH 214/332] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/refactor_odd/PromotionMail.java    |  4 ----
 .../refactor_odd/handler/ProductHandler.java          | 11 +++++------
 .../ood/srp => resources}/product_promotion.txt       |  0
 3 files changed, 5 insertions(+), 10 deletions(-)
 rename students/406400373/ood_assignment/refactor_odd/src/main/{java/com/coderising/ood/srp => resources}/product_promotion.txt (100%)

diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
index bd08cd57af..5f41aaad78 100644
--- a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/PromotionMail.java
@@ -15,10 +15,6 @@
 
 public class PromotionMail {
 
-	public PromotionMail(File file, boolean mailDebug) throws Exception {
-
-	}
-
 	public static void main(String[] args) throws Exception {
 		// 初始化处理器
 		EmailHandler emailHandler = new EmailHandler();
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
index 9b3f9bd9bb..03a5b74e2d 100644
--- a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
+++ b/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/refactor_odd/handler/ProductHandler.java
@@ -1,7 +1,5 @@
 package com.coderising.refactor_odd.handler;
 
-import com.coderising.refactor_odd.entity.ProductEntity;
-
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -9,6 +7,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import com.coderising.refactor_odd.entity.ProductEntity;
+
 /**
  * @author cenkailun
  * @Date 17/6/19
@@ -19,8 +19,7 @@ public class ProductHandler {
 	private List<ProductEntity> products = new ArrayList<>();
 
 	public ProductHandler() throws IOException {
-		File f = new File(
-				"/Users/cenkailun/codelab/coding2017/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		File f = new File(this.getClass().getClassLoader().getResource("product_promotion.txt").getFile());
 		initProducts(f);
 	}
 
@@ -45,6 +44,6 @@ private List<ProductEntity> initProducts(File file) throws IOException {
 	}
 
 	public List<ProductEntity> fetchProducts() {
-	    return products;
-    }
+		return products;
+	}
 }
diff --git a/students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/406400373/ood_assignment/refactor_odd/src/main/resources/product_promotion.txt
similarity index 100%
rename from students/406400373/ood_assignment/refactor_odd/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/406400373/ood_assignment/refactor_odd/src/main/resources/product_promotion.txt

From ce13e90b2e9b6c9ae834cb31708ec9e429a659a3 Mon Sep 17 00:00:00 2001
From: boxin <begin161109@163.com>
Date: Mon, 19 Jun 2017 22:52:01 +0800
Subject: [PATCH 215/332] SRP 2.0-version

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/Logger.java   | 38 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 10 +++++
 .../com/coderising/ood/srp/MailContent.java   | 13 ++-----
 .../com/coderising/ood/srp/PromotionMail.java | 22 ++++++++---
 .../com/coderising/ood/srp/test/MainTest.java |  6 +--
 .../com/coderising/ood/srp/util/MailUtil.java | 17 ++++++++-
 8 files changed, 108 insertions(+), 18 deletions(-)
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java

diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/349184132/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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/349184132/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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/349184132/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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/349184132/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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
index fbc4702737..ebc3788355 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailContent.java
@@ -17,12 +17,7 @@ public class MailContent {
 
     private String message;
 
-    public void setMailContent(String uName, String productDesc) {
-        setSMTPHost();
-        setAltSMTPHost();
-        setFromAddress();
-        setMessage(uName,productDesc);
-    }
+
 
     public String getSmtpHost() {
         return smtpHost;
@@ -44,17 +39,17 @@ public String getMessage() {
         return message;
     }
 
-    private void setSMTPHost() {
+    public void setSMTPHost() {
         smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
 
     }
 
-    private void setAltSMTPHost() {
+    public void setAltSMTPHost() {
         altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
     }
 
 
-    private void setFromAddress() {
+    public void setFromAddress() {
         fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
     }
 
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 2c8c71cfc6..75a52080ad 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,8 +1,8 @@
 package com.coderising.ood.srp;
 
-import com.coderising.ood.srp.util.MailUtil;
 import com.coderising.ood.srp.bean.ProductInfo;
 import com.coderising.ood.srp.bean.UserInfo;
+import com.coderising.ood.srp.util.MailUtil;
 
 import java.util.List;
 
@@ -38,25 +38,37 @@ public void sendEMail(){
     }
 
     public void sendEMail(boolean debug){
-        String productDesc = proInfo.get(0).getProductDesc();
 
+        String productDesc = proInfo.get(0).getProductDesc();
 
         System.out.println("开始发送邮件：");
         for(UserInfo u : userInfo) {
 
             String name = u.getName();
-            String toAddress = u.getEmail();
 
-            mailContent.setMailContent(name,productDesc);
+            setEmailContent(productDesc, name);
 
+            String toAddress = u.getEmail();
             String fromAddress = mailContent.getFromAddress();
             String subject = mailContent.getSubject();
             String message = mailContent.getMessage();
             String smtpHost = mailContent.getSmtpHost();
+            String altSmtpHost = mailContent.getAltSmtpHost();
 
+            if(message == "" && message == null){
+                return ;
+            }
+            MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, altSmtpHost, debug);
 
-            MailUtil.sendEmail(toAddress,fromAddress,subject,message,smtpHost,debug);
         }
         System.out.println("邮件发送完毕！");
     }
+
+    private void setEmailContent(String productDesc, String name) {
+        mailContent.setFromAddress();
+        mailContent.setSMTPHost();
+        mailContent.setAltSMTPHost();
+        mailContent.setMessage(name,productDesc);
+    }
+
 }
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java
index 9418141f28..e70cdbe80a 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/test/MainTest.java
@@ -17,7 +17,7 @@
 public class MainTest {
 
     @Test
-    public void readFile() {
+    public void testReadFile() {
         File f = new File("C:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
         ProductInfoDAO pDAO = new ProductInfoDAO();
         pDAO.readFile(f);
@@ -28,7 +28,7 @@ public void readFile() {
     }
 
     @Test
-    public void showUserInfo(){
+    public void testUserInfo(){
         File f = new File("C:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
         ProductInfoDAO pDAO = new ProductInfoDAO();
         pDAO.readFile(f);
@@ -42,7 +42,7 @@ public void showUserInfo(){
     }
 
     @Test
-    public void mailInfo(){
+    public void testSendMail(){
         File f = new File("C:\\Users\\wang\\Documents\\ood\\coding2017\\students\\349184132\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt");
         ProductInfoDAO pDAO = new ProductInfoDAO();
         pDAO.readFile(f);
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
index bb028c690c..bd8dcba4f2 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -2,6 +2,9 @@
 
 public class MailUtil {
 
+
+
+
 	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
 			boolean debug) {
 		//假装发了一封邮件
@@ -11,7 +14,19 @@ public static void sendEmail(String toAddress, String fromAddress, String subjec
 		buffer.append("Subject:").append(subject).append("\n");
 		buffer.append("Content:").append(message).append("\n");
 		System.out.println(buffer.toString());
-		
+
+	}
+
+	public static void sendEmail(String toAddress, String fromAddress, String subjuect, String message, String smtpHost, String altSmtpHost, boolean debug){
+		try{
+			sendEmail(toAddress, fromAddress, subjuect, message, smtpHost, debug);
+		}catch (Exception e){
+			try{
+				sendEmail(toAddress, fromAddress, subjuect, message, altSmtpHost ,debug);
+			}catch (Exception e1){
+				System.out.println("发送邮件失败！");
+			}
+		}
 	}
 
 	

From 8c21a20f5c498c65e34478d250cabb7a51a5670d Mon Sep 17 00:00:00 2001
From: palmshe <palmshe@foxmail.com>
Date: Mon, 19 Jun 2017 23:00:59 +0800
Subject: [PATCH 216/332] =?UTF-8?q?OCP=E7=BB=83=E4=B9=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/ocp/Logger.java   | 28 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/Main.java     | 11 ++++----
 .../ood/ocp/formatter/DateUtil.java           | 20 +++++++++++++
 .../ood/ocp/formatter/LogFormatter.java       | 15 ++++++++++
 .../ood/ocp/handler/LogHandler.java           | 17 +++++++++++
 .../coderising/ood/ocp/handler/MailUtil.java  |  9 ++++++
 .../coderising/ood/ocp/handler/PrintUtil.java | 21 ++++++++++++++
 .../coderising/ood/ocp/handler/SMSUtil.java   |  9 ++++++
 8 files changed, 124 insertions(+), 6 deletions(-)
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java
 create mode 100644 students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java

diff --git a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..9a4cbb0f0c
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java
index 1523ce8e35..9a072602b0 100644
--- a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java
+++ b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java
@@ -4,12 +4,11 @@
  */
 package com.coderising.ood.ocp;
 
-import com.coderising.ood.ocp.log.Logger;
-import com.coderising.ood.ocp.log.formatter.DateUtil;
-import com.coderising.ood.ocp.log.formatter.LogFormatter;
-import com.coderising.ood.ocp.log.handler.LogHandler;
-import com.coderising.ood.ocp.log.handler.MailUtil;
-import com.coderising.ood.ocp.log.handler.SMSUtil;
+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:
diff --git a/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java
new file mode 100644
index 0000000000..7b45fd15dd
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java
new file mode 100644
index 0000000000..0be87702f2
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java
new file mode 100644
index 0000000000..e86cebba24
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java
new file mode 100644
index 0000000000..e9fb2d90da
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java
new file mode 100644
index 0000000000..8f2ab2b697
--- /dev/null
+++ b/students/2842295913/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/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java b/students/2842295913/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java
new file mode 100644
index 0000000000..4bd916587d
--- /dev/null
+++ b/students/2842295913/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);
+	}
+
+}

From 62ed551bccd7a22910f83d2e585a788270b71a52 Mon Sep 17 00:00:00 2001
From: lanyuanxiaoyao <mingland87!@#>
Date: Mon, 19 Jun 2017 23:33:58 +0800
Subject: [PATCH 217/332] 2017.6.19

---
 .../ocp_restructure_1/LoggerUtil/Logger.java" | 25 +++++++++++++++++++
 .../MsgUtil/BaseMsgTool.java"                 |  5 ++++
 .../MsgUtil/HandleMsgWithDate.java"           |  9 +++++++
 .../MsgUtil/HandleMsgWithNone.java"           |  7 ++++++
 .../MsgUtil/IMsgHandle.java"                  |  7 ++++++
 .../ocp_restructure_1/Util/DateUtil.java"     |  7 ++++++
 .../ocp_restructure_1/Util/MailUtil.java"     |  7 ++++++
 .../ocp_restructure_1/Util/SMSUtil.java"      |  7 ++++++
 ...3\351\242\230\346\200\235\350\267\257.txt" |  1 +
 9 files changed, 75 insertions(+)
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/LoggerUtil/Logger.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/BaseMsgTool.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithDate.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithNone.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/IMsgHandle.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/DateUtil.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/MailUtil.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/SMSUtil.java"
 create mode 100644 "students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/\350\247\243\351\242\230\346\200\235\350\267\257.txt"

diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/LoggerUtil/Logger.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/LoggerUtil/Logger.java"
new file mode 100644
index 0000000000..63733b92e0
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/LoggerUtil/Logger.java"
@@ -0,0 +1,25 @@
+package com.coderising.ood.ocp.LoggerUtil;
+
+import com.coderising.ood.ocp.Log.BaseLog;
+import com.coderising.ood.ocp.Log.PrintLog;
+import com.coderising.ood.ocp.MsgUtil.BaseMsgTool;
+import com.coderising.ood.ocp.MsgUtil.HandleMsgWithNone;
+
+public class Logger {
+
+	private BaseMsgTool tool;
+	private BaseLog log;
+
+	public Logger(BaseMsgTool tool, BaseLog log) {
+		this.tool = tool;
+		this.log = log;
+	}
+
+	public void log(String msg) {
+		log.sendLog(tool.handleMsg(msg));
+	}
+	
+	public static void main(String[] args) {
+		new Logger(new HandleMsgWithNone(), new PrintLog()).log("Hello world");
+	}
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/BaseMsgTool.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/BaseMsgTool.java"
new file mode 100644
index 0000000000..412c02ba4b
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/BaseMsgTool.java"
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp.MsgUtil;
+
+public abstract class BaseMsgTool implements IMsgHandle{
+	
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithDate.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithDate.java"
new file mode 100644
index 0000000000..e3f6798d11
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithDate.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp.MsgUtil;
+
+import com.coderising.ood.ocp.Util.DateUtil;
+
+public class HandleMsgWithDate extends BaseMsgTool {
+	public String handleMsg(String msg) {
+		return DateUtil.getCurrentDateAsString() + ": " + msg;
+	}
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithNone.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithNone.java"
new file mode 100644
index 0000000000..ae1b936637
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/HandleMsgWithNone.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.MsgUtil;
+
+public class HandleMsgWithNone extends BaseMsgTool {
+	public String handleMsg(String msg) {
+		return msg;
+	}
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/IMsgHandle.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/IMsgHandle.java"
new file mode 100644
index 0000000000..e72a6672ea
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/MsgUtil/IMsgHandle.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.MsgUtil;
+
+public interface IMsgHandle {
+	
+	String handleMsg(String msg);
+	
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/DateUtil.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/DateUtil.java"
new file mode 100644
index 0000000000..26e947e622
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/DateUtil.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.Util;
+
+public class DateUtil {
+	public static String getCurrentDateAsString() {
+		return null;
+	}
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/MailUtil.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/MailUtil.java"
new file mode 100644
index 0000000000..d857e8ef56
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/MailUtil.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.Util;
+
+public class MailUtil {
+	public static void send(String logMsg) {
+		
+	}
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/SMSUtil.java" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/SMSUtil.java"
new file mode 100644
index 0000000000..1affb5938d
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/Util/SMSUtil.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp.Util;
+
+public class SMSUtil {
+	public static void send(String logMsg) {
+		
+	}
+}
diff --git "a/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/\350\247\243\351\242\230\346\200\235\350\267\257.txt" "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/\350\247\243\351\242\230\346\200\235\350\267\257.txt"
new file mode 100644
index 0000000000..bd6d6a03ba
--- /dev/null
+++ "b/students/949603184/homework02-\351\207\215\346\236\204\346\227\245\345\277\227\346\211\223\345\215\260/ocp_restructure_1/\350\247\243\351\242\230\346\200\235\350\267\257.txt"
@@ -0,0 +1 @@
+http://lanyuanxiaoyao.com/2017/06/19/ocp-homework/
\ No newline at end of file

From 3f84999c2816fe5592a7f8964092f89d7903f38f Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Mon, 19 Jun 2017 23:36:47 +0800
Subject: [PATCH 218/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A=20init2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 liuxin/ood/ood-assignment/pom.xml                   | 13 +++++++++++++
 .../java/com/coderising/ood/srp/PromotionMail.java  |  2 +-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/liuxin/ood/ood-assignment/pom.xml b/liuxin/ood/ood-assignment/pom.xml
index cac49a5328..9a28365d2a 100644
--- a/liuxin/ood/ood-assignment/pom.xml
+++ b/liuxin/ood/ood-assignment/pom.xml
@@ -10,6 +10,19 @@
   <name>ood-assignment</name>
   <url>http://maven.apache.org</url>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 781587a846..9d07330831 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -35,7 +35,7 @@ public class PromotionMail {
 
 	public static void main(String[] args) throws Exception {
 
-		File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+		File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
 		boolean emailDebug = false;
 
 		PromotionMail pe = new PromotionMail(f, emailDebug);

From 46f8aaec9e8fd061331a0fe2b6957a7261940c01 Mon Sep 17 00:00:00 2001
From: boxin <begin161109@163.com>
Date: Mon, 19 Jun 2017 23:42:20 +0800
Subject: [PATCH 219/332] OCP 1.0-version

---
 .../java/com/coderising/ood/ocp/Logger.java   | 38 -------------------
 .../coderising/ood/ocp/logtype/LogType.java   | 10 +++++
 .../ood/ocp/logtype/MailLogTypeImp.java       | 13 +++++++
 .../ood/ocp/logtype/PrintLogTypeImp.java      | 13 +++++++
 .../ood/ocp/logtype/SmsLogTypeImp.java        | 11 ++++++
 .../com/coderising/ood/ocp/newb/Logger.java   | 27 +++++++++++++
 .../ood/ocp/{ => util}/DateUtil.java          |  2 +-
 .../ood/ocp/{ => util}/MailUtil.java          |  2 +-
 .../ood/ocp/{ => util}/SMSUtil.java           |  2 +-
 9 files changed, 77 insertions(+), 41 deletions(-)
 delete mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/LogType.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/MailLogTypeImp.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/PrintLogTypeImp.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/SmsLogTypeImp.java
 create mode 100644 students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/newb/Logger.java
 rename students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/{ => util}/DateUtil.java (72%)
 rename students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/{ => util}/MailUtil.java (75%)
 rename students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/{ => util}/SMSUtil.java (75%)

diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
deleted file mode 100644
index 0357c4d912..0000000000
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
+++ /dev/null
@@ -1,38 +0,0 @@
-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/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/LogType.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/LogType.java
new file mode 100644
index 0000000000..e776ffaf22
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/LogType.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.logtype;
+
+/**
+ * Created by wang on 2017/6/19.
+ */
+public  interface LogType {
+
+
+     void Send(String msglog);
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/MailLogTypeImp.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/MailLogTypeImp.java
new file mode 100644
index 0000000000..0252b9d911
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/MailLogTypeImp.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logtype;
+
+import com.coderising.ood.ocp.util.MailUtil;
+
+/**
+ * Created by wang on 2017/6/19.
+ */
+public class MailLogTypeImp implements LogType {
+    @Override
+    public void Send(String msglog) {
+        MailUtil.send(msglog);
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/PrintLogTypeImp.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/PrintLogTypeImp.java
new file mode 100644
index 0000000000..44f69f9d79
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/PrintLogTypeImp.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.logtype;
+
+import com.coderising.ood.ocp.util.SMSUtil;
+
+/**
+ * Created by wang on 2017/6/19.
+ */
+public class PrintLogTypeImp implements LogType{
+    @Override
+    public void Send(String msglog) {
+        SMSUtil.send(msglog);
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/SmsLogTypeImp.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/SmsLogTypeImp.java
new file mode 100644
index 0000000000..2613a28f3f
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/logtype/SmsLogTypeImp.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.logtype;
+
+/**
+ * Created by wang on 2017/6/19.
+ */
+public class SmsLogTypeImp implements LogType {
+    @Override
+    public void Send(String msglog) {
+        System.out.println(msglog);
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/newb/Logger.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/newb/Logger.java
new file mode 100644
index 0000000000..d444796597
--- /dev/null
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/newb/Logger.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.ocp.newb;
+
+import com.coderising.ood.ocp.log.Log;
+import com.coderising.ood.ocp.logtype.LogType;
+
+/**
+ * Created by wang on 2017/6/19.
+ */
+public class Logger {
+
+    private Log log ;
+
+    private LogType logType;
+
+    public Logger(Log log, LogType logType) {
+        this.log = log;
+        this.logType = logType;
+    }
+
+    public void log(String msg){
+
+        String msglog = log.setMsgLog(msg);
+
+        logType.Send(msglog);
+
+    }
+}
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
similarity index 72%
rename from students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
rename to students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
index b6cf28c096..ca7b21a6dd 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.ood.ocp.util;
 
 public class DateUtil {
 
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
similarity index 75%
rename from students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
rename to students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
index ec54b839c5..9191303993 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.ood.ocp.util;
 
 public class MailUtil {
 
diff --git a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
similarity index 75%
rename from students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
rename to students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
index 13cf802418..9fab3d9430 100644
--- a/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
+++ b/students/349184132/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.ood.ocp.util;
 
 public class SMSUtil {
 

From 1e80f7c2611e1ae2c07b2105ba29d57ca6bd3ed0 Mon Sep 17 00:00:00 2001
From: Tony-Hu <tony.hu1213@gmail.com>
Date: Mon, 19 Jun 2017 13:31:49 -0700
Subject: [PATCH 220/332] Submit for homework

---
 liuxin/ood/ood-assignment/pom.xml             |   7 +-
 .../coderising/ood/srp/DO/ProductDetail.java  |  26 +++
 .../com/coderising/ood/srp/DO/UserInfo.java   |  29 +++
 .../com/coderising/ood/srp/PromotionMail.java | 218 +++---------------
 .../com/coderising/ood/srp/util/DBUtil.java   |  38 +++
 .../com/coderising/ood/srp/util/FileUtil.java |  49 ++++
 .../com/coderising/ood/srp/util/MailUtil.java |  97 ++++++++
 liuxin/ood/ood-assignment/test.txt            |   5 +
 8 files changed, 281 insertions(+), 188 deletions(-)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 liuxin/ood/ood-assignment/test.txt

diff --git a/liuxin/ood/ood-assignment/pom.xml b/liuxin/ood/ood-assignment/pom.xml
index cac49a5328..d1ed73a0bf 100644
--- a/liuxin/ood/ood-assignment/pom.xml
+++ b/liuxin/ood/ood-assignment/pom.xml
@@ -21,7 +21,12 @@
     	<artifactId>junit</artifactId>
     	<version>4.12</version>
     </dependency>
-    
+      <dependency>
+          <groupId>org.jetbrains</groupId>
+          <artifactId>annotations-java5</artifactId>
+          <version>RELEASE</version>
+      </dependency>
+
   </dependencies>
   <repositories>
         <repository>
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
new file mode 100644
index 0000000000..7b3041a000
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.DO;
+
+/**
+ * 产品信息数据类。
+ * @since 06.18.2017
+ */
+public class ProductDetail {
+    private String id;
+    private String description;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
new file mode 100644
index 0000000000..14eff3c68a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.DO;
+
+/**
+ * 用户数据类。
+ * @since 06.18.2017
+ */
+public class UserInfo {
+    private String name;
+    private String email;
+    private String productDesc;
+
+    public UserInfo(String name, String email, String productDesc){
+        this.name = name;
+        this.email = email;
+        this.productDesc = productDesc;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 781587a846..2ec66a4d47 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,199 +1,43 @@
 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 com.coderising.ood.srp.DO.ProductDetail;
+import com.coderising.ood.srp.DO.UserInfo;
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.FileNotFoundException;
 import java.util.List;
 
+/**
+ * 程序入口点。
+ * @since 06.19.2017
+ */
 public class PromotionMail {
 
+    public static void main(String[] args){
+        final String FILE_PATH = "test.txt";
+        FileUtil fileUtil;
 
-	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("开始发送邮件");
-	
+        //尝试打开促销文件
+        try {
+            fileUtil = new FileUtil(FILE_PATH);
+        } catch (FileNotFoundException e){
+            System.out.println("促销文件打开失败，请确认文件路径！");
+            return;
+        }
 
-		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()); 
-					}
-				}
-			}
-			
+        sendAllEMails(fileUtil);
 
-		}
+        fileUtil.close();
+    }
 
-		else {
-			System.out.println("没有邮件发送");
-			
-		}
 
-	}
+    private static void sendAllEMails(FileUtil fileUtil){
+        while (fileUtil.hasNext()) {
+            ProductDetail productDetail = fileUtil.getNextProduct();
+            List<UserInfo> usersList = DBUtil.query(productDetail);
+            MailUtil.sendEmails(usersList);
+        }
+    }
 }
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..e1e0012855
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp.util;
+import com.coderising.ood.srp.DO.ProductDetail;
+import com.coderising.ood.srp.DO.UserInfo;
+
+import java.util.*;
+
+/**
+ * 数据库操作类。
+ * 管理数据库连接，查询等操作。
+ * @since 06.19.2017
+ */
+public class DBUtil {
+
+	//TODO 此处添加数据库连接信息
+
+
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 给一个产品详情，返回一个Array List记载所有订阅该产品的用户信息（名字，邮箱，订阅的产品名称）。
+	 * @param productDetail 传产品详情。产品id用来查询数据库。产品名称用于和用户信息绑定
+	 * @return 返回数据库中所有的查询到的结果。
+	 */
+	public static List<UserInfo> query(ProductDetail productDetail){
+		if (productDetail == null || productDetail.getId() == null)
+			return new ArrayList<>();
+
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productDetail.getId() +"' "
+				+ "and send_mail=1 ";
+		//假装用sendMilQuery查了数据库，生成了userList作为查询结果
+		List<UserInfo> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			UserInfo newInfo = new UserInfo("User" + i,"aa@bb.com", productDetail.getDescription());
+			userList.add(newInfo);
+		}
+		return userList;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..991f81a537
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp.util;
+
+
+import com.coderising.ood.srp.DO.ProductDetail;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+/**
+ * 文件操作类。
+ * 负责文件句柄的维护。
+ * 此类会打开促销文件，促销文件默认按照：
+ * "id" 空格 "产品名称"
+ * 进行存储，每行一条促销信息。
+ * @since 06.19.2017
+ */
+public class FileUtil {
+    private Scanner scanner;
+
+
+    public FileUtil(String filePath) throws FileNotFoundException {
+       scanner = new Scanner(new File(filePath));
+    }
+
+    public ProductDetail getNextProduct(){
+        String wholeInfo;
+        ProductDetail nextProduct = new ProductDetail();
+        wholeInfo = scanner.nextLine();
+
+        String[] splitInfo = wholeInfo.split(" ");
+        if (splitInfo.length < 2)
+            return nextProduct;
+
+        //促销文件按照 - "id" 空格 "产品名称" 进行记录的
+        nextProduct.setId(splitInfo[0]);
+        nextProduct.setDescription(splitInfo[1]);
+
+        return nextProduct;
+    }
+
+    public boolean hasNext(){
+        return scanner.hasNextLine();
+    }
+
+    public void close(){
+        scanner.close();
+    }
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..065286d4f9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,97 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.DO.UserInfo;
+
+import java.util.List;
+
+
+/**
+ * 邮件发送类。
+ * 管理邮箱连接，发送等操作。
+ * @since 06.19.2017
+ */
+public class MailUtil {
+
+    /**
+     * SMTP连接失败异常。
+     * 可用getMessage()获得异常内容。
+     */
+    public static class SMTPConnectionFailedException extends Throwable{
+        public SMTPConnectionFailedException(String message){
+            super(message);
+        }
+    }
+
+    /**
+     * 主SMTP服务器地址
+     */
+	public static final String SMTP_SERVER = "smtp.163.com";
+
+    /**
+     * 备用SMTP服务器地址
+     */
+	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
+
+    /**
+     * 以哪个邮箱地址发送给用户
+     */
+	public static final String EMAIL_ADMIN = "admin@company.com";
+
+
+    /**
+     * 邮件发送操作。
+     * 将降价促销邮件逐个发送给用户信息表中对应的用户。
+     * 捕获SMTPConnectionFailedException。提示手动发送。并继续发送下一封邮件。
+     * @param usersList 用户信息表。包含用户姓名，邮箱和订阅产品名称。
+     */
+	public static void sendEmails(List<UserInfo> usersList){
+		if (usersList == null) {
+			System.out.println("没有邮件发送");
+			return;
+		}
+
+		for (UserInfo info : usersList){
+			if (!info.getEmail().isEmpty()) {
+				String emailInfo = generatePromotionEmail(info);
+				try {
+                    sendPromotionEmail(emailInfo);
+                } catch (SMTPConnectionFailedException e){
+                    System.out.println("SMTP主副服务器连接失败，请手动发送以下邮件： \n");
+                    System.out.println(e.getMessage());
+                }
+			}
+		}
+	}
+
+    /**
+     * 假装在发邮件。默认使用主SMTP发送，若发送失败则使用备用SMTP发送。
+     * 仍然失败，则抛出SMTPConnectFailException异常。
+     * @param emailInfo 要发送的邮件内容
+     * @throws SMTPConnectionFailedException 若主副SMTP服务器均连接失败，抛出异常。异常中包含完整的发送失败的邮件内容。可通过getMessage()方法获得邮件内容。
+     */
+	private static void sendPromotionEmail(String emailInfo) throws SMTPConnectionFailedException{
+		//默认以SMTP_SERVER 发送
+		//如果发送失败以ALT_SMTP_SERVER 重新发送
+		//如果还失败，throw new SMTPConnectionFailedException(emailInfo).
+	}
+
+    /**
+     * 根据用户信息生成促销邮件内容。
+     * @param userInfo 用户信息。
+     * @return 返回生成的邮件。
+     */
+	private static String generatePromotionEmail(UserInfo userInfo){
+		StringBuilder buffer = new StringBuilder();
+
+		buffer.append("From:").append(EMAIL_ADMIN).append("\n");
+		buffer.append("To:").append(userInfo.getEmail()).append("\n");
+		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+		buffer.append("Content:").append("尊敬的").append(userInfo.getName());
+		buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
+		buffer.append(" 降价了，欢迎购买!").append("\n");
+
+		System.out.println(buffer.toString());
+
+		return buffer.toString();
+	}
+}
diff --git a/liuxin/ood/ood-assignment/test.txt b/liuxin/ood/ood-assignment/test.txt
new file mode 100644
index 0000000000..cb2d21edc4
--- /dev/null
+++ b/liuxin/ood/ood-assignment/test.txt
@@ -0,0 +1,5 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
+p123

From 927e4ab3e51f94e69eb148cdcc00fc2d1e688f90 Mon Sep 17 00:00:00 2001
From: walker <597222089@qq.com>
Date: Tue, 20 Jun 2017 07:47:20 +0800
Subject: [PATCH 221/332] ood
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

ood作业
---
 students/597222089/ood/ood-assignment/pom.xml | 32 +++++++++
 .../ood/srp/refactor/Configuration.java       | 23 ++++++
 .../ood/srp/refactor/ConfigurationKeys.java   |  9 +++
 .../coderising/ood/srp/refactor/Consumer.java | 23 ++++++
 .../ood/srp/refactor/ConsumerUtils.java       | 39 ++++++++++
 .../coderising/ood/srp/refactor/Email.java    | 36 ++++++++++
 .../ood/srp/refactor/EmailUtils.java          | 68 ++++++++++++++++++
 .../coderising/ood/srp/refactor/MainSend.java | 16 +++++
 .../coderising/ood/srp/refactor/Phone.java    | 23 ++++++
 .../ood/srp/refactor/PhoneUtils.java          | 71 +++++++++++++++++++
 10 files changed, 340 insertions(+)
 create mode 100644 students/597222089/ood/ood-assignment/pom.xml
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Configuration.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConfigurationKeys.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Consumer.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConsumerUtils.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Email.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/EmailUtils.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/MainSend.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Phone.java
 create mode 100644 students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/PhoneUtils.java

diff --git a/students/597222089/ood/ood-assignment/pom.xml b/students/597222089/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Configuration.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Configuration.java
new file mode 100644
index 0000000000..80efc902d7
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.refactor;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConfigurationKeys.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConfigurationKeys.java
new file mode 100644
index 0000000000..5fa1f5fefb
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.refactor;
+
+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/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Consumer.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Consumer.java
new file mode 100644
index 0000000000..8bb8774dbd
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Consumer.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.refactor;
+
+/**
+ * Created by walker on 2017/6/20.
+ */
+
+public class Consumer {
+    private String name;
+    private String email;
+
+    public Consumer(String name, String email) {
+        this.name = name;
+        this.email = email;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+}
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConsumerUtils.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConsumerUtils.java
new file mode 100644
index 0000000000..ad0f4be3d8
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/ConsumerUtils.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.refactor;
+
+import com.coderising.ood.srp.DBUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by walker on 2017/6/20.
+ */
+
+public class ConsumerUtils {
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+    public static List<Consumer> getConsumers() {
+        List<Consumer> consumers = new ArrayList<>();
+
+        String sql = "";
+        List query = DBUtil.query(sql);
+
+        Iterator iter = query.iterator();
+        while (iter.hasNext()) {
+
+            HashMap<String, String> info = (HashMap<String, String>) iter.next();
+
+            String name = info.get(NAME_KEY);
+            String email = info.get(EMAIL_KEY);
+
+            Consumer consumer = new Consumer(name, email);
+
+            consumers.add(consumer);
+        }
+
+        return consumers;
+    }
+}
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Email.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Email.java
new file mode 100644
index 0000000000..6d3f1d71f1
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Email.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp.refactor;
+
+/**
+ * Created by walker on 2017/6/20.
+ */
+
+public class Email {
+    private String subject;
+    private String message;
+
+    private String fromAddress = null;
+    private String toAddress = null;
+
+    public Email(String subject, String message, String fromAddress, String toAddress) {
+        this.subject = subject;
+        this.message = message;
+        this.fromAddress = fromAddress;
+        this.toAddress = toAddress;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    public String getToAddress() {
+        return toAddress;
+    }
+}
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/EmailUtils.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/EmailUtils.java
new file mode 100644
index 0000000000..db90ca1ac6
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/EmailUtils.java
@@ -0,0 +1,68 @@
+package com.coderising.ood.srp.refactor;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by walker on 2017/6/20.
+ */
+
+public class EmailUtils {
+
+    private static final String SUBJECT = "您关注的产品降价了";
+    private static String smtpHost;
+    private static String altSmtpHost;
+    private static boolean debug = false;
+
+    private static List<Email> getEmails() {
+        List<Email> emails = new ArrayList<>();
+
+        List<Consumer> consumers = ConsumerUtils.getConsumers();
+        Iterator iter = consumers.iterator();
+
+        Configuration conf = new Configuration();
+
+        smtpHost = conf.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = conf.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+
+        while (iter.hasNext()) {
+            Consumer consumer = (Consumer) iter.next();
+            String message = PhoneUtils.getMessage(consumer.getName());
+            String fromAddress = conf.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+            String toAddress = consumer.getEmail();
+            Email email = new Email(SUBJECT, message, fromAddress, toAddress);
+            emails.add(email);
+        }
+
+        return emails;
+    }
+
+    private static void sendEmail(Email email, String smtpHost,
+                                 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());
+    }
+
+    public static void doSendEmail () {
+
+        List<Email> emails = getEmails();
+        for (Email email : emails) {
+            try {
+                sendEmail(email, smtpHost, debug);
+            } catch (Exception e) {
+                try {
+                    sendEmail(email, altSmtpHost, debug);
+
+                } catch (Exception e2) {
+                    System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                }
+            }
+        }
+    }
+}
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/MainSend.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/MainSend.java
new file mode 100644
index 0000000000..3ae14256b4
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/MainSend.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp.refactor;
+
+/**
+ * Created by walker on 2017/6/20.
+ */
+
+public class MainSend {
+
+
+    public static void main(String[] args) {
+        EmailUtils.doSendEmail();
+    }
+
+
+
+}
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Phone.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Phone.java
new file mode 100644
index 0000000000..3e0cf3ff32
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/Phone.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.refactor;
+
+/**
+ * Created by walker on 2017/6/19.
+ */
+
+public class Phone {
+    private String productID = null;
+    private String productDesc = null;
+
+    public Phone(String productID, String productDesc) {
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public String getProductID() {
+        return productID;
+    }
+}
diff --git a/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/PhoneUtils.java b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/PhoneUtils.java
new file mode 100644
index 0000000000..a128f6bfd1
--- /dev/null
+++ b/students/597222089/ood/ood-assignment/src/main/java/com/coderising/ood/srp/refactor/PhoneUtils.java
@@ -0,0 +1,71 @@
+package com.coderising.ood.srp.refactor;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+
+public class PhoneUtils {
+    private static Set<Phone> getPhones() {
+        Set<Phone> phones = new HashSet<>();
+
+//        Map<String, String> phoneInfos = readFile("file");
+//
+//        for (String id : phoneInfos.keySet()) {
+//            Phone photo = new Phone();
+//            photo.setProductID(id);
+//            photo.setProductDesc(phoneInfos.get(id));
+//            phones.add(photo);
+//        }
+        phones.add(new Phone("P8756", "iPhone8"));
+        phones.add(new Phone("P3946", "XiaoMi10"));
+        phones.add(new Phone("P8904", "Oppo_R15"));
+        phones.add(new Phone("P4955", "Vivo_X20"));
+
+        return phones;
+    }
+
+    public static String getMessage(String name) {
+        StringBuffer infos = new StringBuffer();
+
+        Set<Phone> phones = getPhones();
+        for (Phone phone : phones) {
+            infos.append("尊敬的 " + name + ", 您关注的产品 " + phone.getProductDesc() + " 降价了，欢迎购买!");
+        }
+        return infos.toString();
+    }
+
+    private static Map<String, String> readFile (String filePath) {
+        BufferedReader br = null;
+        Map<String, String> phoneMap = new HashMap<>();
+        try {
+            File file = new File(filePath);
+            br = new BufferedReader(new FileReader(file));
+
+            String temp;
+            while (null != (temp = br.readLine())) {
+                String[] data = temp.split(" ");
+
+                phoneMap.put(data[0], data[1]);
+                System.out.println("产品ID = " + data[0] + "\n");
+                System.out.println("产品描述 = " + data[1] + "\n");
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return phoneMap;
+    }
+}

From 4c068f59c4e4c0d69d82bec1b02e9404445a2267 Mon Sep 17 00:00:00 2001
From: jimmy <jimmy_kwong@qq.com>
Date: Tue, 20 Jun 2017 08:09:35 +0800
Subject: [PATCH 222/332] =?UTF-8?q?=E9=87=8D=E6=9E=84PromotionMail?=
 =?UTF-8?q?=E6=BB=A1=E8=B6=B3SRP?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/63072784/pom.xml                     | 12 ++++
 .../src/main/java/ood/srp/Configuration.java  | 29 +++++++++
 .../main/java/ood/srp/ConfigurationKeys.java  | 11 ++++
 .../src/main/java/ood/srp/DBUtil.java         | 23 +++++++
 .../63072784/src/main/java/ood/srp/Mail.java  | 50 +++++++++++++++
 .../src/main/java/ood/srp/MailAccount.java    | 42 ++++++++++++
 .../src/main/java/ood/srp/MailUtil.java       | 35 ++++++++++
 .../src/main/java/ood/srp/Product.java        | 54 ++++++++++++++++
 .../src/main/java/ood/srp/PromotionMail.java  | 64 +++++++++++++++++++
 .../src/main/java/ood/srp/UserInfo.java       | 41 ++++++++++++
 .../src/main/resources/product_promotion.txt  |  4 ++
 11 files changed, 365 insertions(+)
 create mode 100644 students/63072784/pom.xml
 create mode 100644 students/63072784/src/main/java/ood/srp/Configuration.java
 create mode 100644 students/63072784/src/main/java/ood/srp/ConfigurationKeys.java
 create mode 100644 students/63072784/src/main/java/ood/srp/DBUtil.java
 create mode 100644 students/63072784/src/main/java/ood/srp/Mail.java
 create mode 100644 students/63072784/src/main/java/ood/srp/MailAccount.java
 create mode 100644 students/63072784/src/main/java/ood/srp/MailUtil.java
 create mode 100644 students/63072784/src/main/java/ood/srp/Product.java
 create mode 100644 students/63072784/src/main/java/ood/srp/PromotionMail.java
 create mode 100644 students/63072784/src/main/java/ood/srp/UserInfo.java
 create mode 100644 students/63072784/src/main/resources/product_promotion.txt

diff --git a/students/63072784/pom.xml b/students/63072784/pom.xml
new file mode 100644
index 0000000000..42eddb8471
--- /dev/null
+++ b/students/63072784/pom.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.jimmykwong</groupId>
+    <artifactId>coding2017</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+
+</project>
\ No newline at end of file
diff --git a/students/63072784/src/main/java/ood/srp/Configuration.java b/students/63072784/src/main/java/ood/srp/Configuration.java
new file mode 100644
index 0000000000..eb315dd7e3
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/Configuration.java
@@ -0,0 +1,29 @@
+package ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> 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");
+        configurations.put(ConfigurationKeys.EMAIL_ADMIN_PASSWORD, "admin!");
+        configurations.put(ConfigurationKeys.EMAIL_PORT, "25");
+    }
+
+    /**
+     * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+     *
+     * @param key
+     * @return
+     */
+    public String getProperty(String key) {
+
+        return configurations.get(key);
+    }
+
+}
diff --git a/students/63072784/src/main/java/ood/srp/ConfigurationKeys.java b/students/63072784/src/main/java/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..168ee4a304
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,11 @@
+package 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";
+    public static final String EMAIL_PORT = "email.port";
+    public static final String EMAIL_ADMIN_PASSWORD = "email.admin.password";
+
+}
diff --git a/students/63072784/src/main/java/ood/srp/DBUtil.java b/students/63072784/src/main/java/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..86c9ab9102
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/DBUtil.java
@@ -0,0 +1,23 @@
+package ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DBUtil {
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     *
+     * @param sql
+     * @return
+     */
+    public static List<UserInfo> query(String sql) {
+        System.out.printf("执行sql=" + sql);
+        List<UserInfo> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            UserInfo userInfo = new UserInfo("User" + i, "aa@bb.com");
+            userList.add(userInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/63072784/src/main/java/ood/srp/Mail.java b/students/63072784/src/main/java/ood/srp/Mail.java
new file mode 100644
index 0000000000..db08647d9a
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/Mail.java
@@ -0,0 +1,50 @@
+package ood.srp;
+
+/**
+ * Created by jimmy on 6/20/2017.
+ */
+public class Mail {
+    private MailAccount mailAccount;
+    private String toAddress;
+    private String subject;
+    private String message;
+
+    public Mail(MailAccount mailAccount, String toAddress, String subject, String message) {
+        this.mailAccount = mailAccount;
+        this.toAddress = toAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public MailAccount getMailAccount() {
+        return mailAccount;
+    }
+
+    public void setMailAccount(MailAccount mailAccount) {
+        this.mailAccount = mailAccount;
+    }
+
+    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 getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/students/63072784/src/main/java/ood/srp/MailAccount.java b/students/63072784/src/main/java/ood/srp/MailAccount.java
new file mode 100644
index 0000000000..f0aaf3ee49
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/MailAccount.java
@@ -0,0 +1,42 @@
+package ood.srp;
+
+/**
+ * Created by jimmy on 6/20/2017.
+ */
+public class MailAccount {
+    private String smtpHost;
+    private String altSmtpHost;
+    private int port;
+    private String account;
+    private String password;
+
+    public static MailAccount buildAccount(Configuration config) {
+        MailAccount mailAccount = new MailAccount();
+        mailAccount.smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        mailAccount.altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        mailAccount.port = Integer.parseInt(config.getProperty(ConfigurationKeys.EMAIL_PORT));
+        mailAccount.account = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        mailAccount.password = config.getProperty(ConfigurationKeys.EMAIL_ADMIN_PASSWORD);
+        return mailAccount;
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+}
diff --git a/students/63072784/src/main/java/ood/srp/MailUtil.java b/students/63072784/src/main/java/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..0e4d135252
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/MailUtil.java
@@ -0,0 +1,35 @@
+package ood.srp;
+
+public class MailUtil {
+
+    public static void sendEmail(Mail mail, boolean debug) {
+        String toAddress = mail.getToAddress();
+        String fromAddress = mail.getMailAccount().getAccount();
+        String subject = mail.getSubject();
+        String message = mail.getMessage();
+        String smtpHost = mail.getMailAccount().getSmtpHost();
+        String altSmtpHost = mail.getMailAccount().getAltSmtpHost();
+        try {
+            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());
+            }
+        }
+
+    }
+
+    private 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/63072784/src/main/java/ood/srp/Product.java b/students/63072784/src/main/java/ood/srp/Product.java
new file mode 100644
index 0000000000..3e6b36b671
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/Product.java
@@ -0,0 +1,54 @@
+package ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by jimmy on 6/20/2017.
+ */
+public class Product {
+    private String productId;
+    private String productDesc;
+
+    public static Product getPromotionProduct(File file) throws Exception {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            String[] data = temp.split(" ");
+
+            String productId = data[0];
+            String productDesc = data[1];
+
+            System.out.println("产品ID = " + productId + "\n");
+            System.out.println("产品描述 = " + productDesc + "\n");
+
+            Product product = new Product();
+            product.productId = productId;
+            product.productDesc = productDesc;
+            return product;
+        } catch (IOException e) {
+            throw new IOException(e.getMessage());
+        } finally {
+            br.close();
+        }
+    }
+
+    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/63072784/src/main/java/ood/srp/PromotionMail.java b/students/63072784/src/main/java/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..abc97065e9
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/PromotionMail.java
@@ -0,0 +1,64 @@
+package ood.srp;
+
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+
+    private static final String SUBJECT = "您关注的商品降价了";
+
+    public static void main(String[] args) throws Exception {
+        //这里可以做成参数输入
+        File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+        boolean debug = true;
+        PromotionMail pe = new PromotionMail();
+        pe.sendEMails(f, debug);
+    }
+
+
+    public PromotionMail() {
+    }
+
+    private String buildMessage(UserInfo userInfo, Product product) {
+        return String.format("尊敬的 %s, 您关注的产品 %s 降价了，欢迎购买!", userInfo.getName(), product.getProductDesc());
+    }
+
+    private Mail buildMail(MailAccount mailAccount, UserInfo userInfo, Product product) {
+        //可以更加详细的检查
+        if (mailAccount == null || userInfo == null || product == null) {
+            return null;
+        } else {
+            String message = buildMessage(userInfo, product);
+            return new Mail(mailAccount, userInfo.getEmailAddress(), SUBJECT, message);
+        }
+    }
+
+
+    private void sendEMails(File file, boolean debug) throws Exception {
+
+        //构建发送邮件账号
+        MailAccount mailAccount = MailAccount.buildAccount(new Configuration());
+
+        //读取降价列表
+        Product product = Product.getPromotionProduct(file);
+
+        //获取订阅用户列表
+        List<UserInfo> userInfoList = UserInfo.getUserInfo(product.getProductId());
+
+        System.out.println("开始发送邮件");
+
+        if (userInfoList != null) {
+            for (UserInfo userInfo : userInfoList) {
+                Mail mail = buildMail(mailAccount, userInfo, product);
+                if (mail == null) {
+                    continue;
+                }
+                MailUtil.sendEmail(mail, debug);
+            }
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+    }
+}
diff --git a/students/63072784/src/main/java/ood/srp/UserInfo.java b/students/63072784/src/main/java/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..3387dcb1bc
--- /dev/null
+++ b/students/63072784/src/main/java/ood/srp/UserInfo.java
@@ -0,0 +1,41 @@
+package ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by jimmy on 6/20/2017.
+ */
+public class UserInfo {
+    private String name;
+    private String emailAddress;
+
+    public UserInfo(String name, String emailAddress) {
+        this.name = name;
+        this.emailAddress = emailAddress;
+    }
+
+    private static final String QUERY_PRODUCT = "Select name from subscriptions "
+            + "where product_id= '%s' "
+            + "and send_mail=1 ";
+
+    public static List<UserInfo> getUserInfo(String productId) {
+        System.out.println("loadQuery set");
+        return DBUtil.query(String.format(QUERY_PRODUCT, productId));
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEmailAddress() {
+        return emailAddress;
+    }
+
+    public void setEmailAddress(String emailAddress) {
+        this.emailAddress = emailAddress;
+    }
+}
diff --git a/students/63072784/src/main/resources/product_promotion.txt b/students/63072784/src/main/resources/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/63072784/src/main/resources/product_promotion.txt
@@ -0,0 +1,4 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
\ No newline at end of file

From 473e0e8a9d2e874a706eeb300cd08377370d5293 Mon Sep 17 00:00:00 2001
From: jimmy <jimmy_kwong@qq.com>
Date: Tue, 20 Jun 2017 08:19:11 +0800
Subject: [PATCH 223/332] =?UTF-8?q?=E9=87=8D=E6=9E=84PromotionMail?=
 =?UTF-8?q?=E6=BB=A1=E8=B6=B3SRP?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/63072784/pom.xml                                  | 4 ++++
 students/63072784/src/main/java/ood/srp/PromotionMail.java | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/students/63072784/pom.xml b/students/63072784/pom.xml
index 42eddb8471..4c78ba51ac 100644
--- a/students/63072784/pom.xml
+++ b/students/63072784/pom.xml
@@ -8,5 +8,9 @@
     <artifactId>coding2017</artifactId>
     <version>1.0-SNAPSHOT</version>
 
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
 
 </project>
\ No newline at end of file
diff --git a/students/63072784/src/main/java/ood/srp/PromotionMail.java b/students/63072784/src/main/java/ood/srp/PromotionMail.java
index abc97065e9..a41c7fe446 100644
--- a/students/63072784/src/main/java/ood/srp/PromotionMail.java
+++ b/students/63072784/src/main/java/ood/srp/PromotionMail.java
@@ -10,7 +10,7 @@ public class PromotionMail {
 
     public static void main(String[] args) throws Exception {
         //这里可以做成参数输入
-        File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+        File f = new File("product_promotion.txt");
         boolean debug = true;
         PromotionMail pe = new PromotionMail();
         pe.sendEMails(f, debug);

From bbafab3fbb001ec8ef76beda2c76630f58ed4cac Mon Sep 17 00:00:00 2001
From: jimmy <jimmy_kwong@qq.com>
Date: Tue, 20 Jun 2017 08:37:01 +0800
Subject: [PATCH 224/332] =?UTF-8?q?=E9=87=8D=E6=9E=84PromotionMail?=
 =?UTF-8?q?=E6=BB=A1=E8=B6=B3SRP?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/63072784/src/main/java/ood/srp/PromotionMail.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/63072784/src/main/java/ood/srp/PromotionMail.java b/students/63072784/src/main/java/ood/srp/PromotionMail.java
index a41c7fe446..f6646fac14 100644
--- a/students/63072784/src/main/java/ood/srp/PromotionMail.java
+++ b/students/63072784/src/main/java/ood/srp/PromotionMail.java
@@ -10,7 +10,7 @@ public class PromotionMail {
 
     public static void main(String[] args) throws Exception {
         //这里可以做成参数输入
-        File f = new File("product_promotion.txt");
+        File f = new File(PromotionMail.class.getClassLoader().getResource("product_promotion.txt").toURI());
         boolean debug = true;
         PromotionMail pe = new PromotionMail();
         pe.sendEMails(f, debug);

From eae3b01de2c0008744b412dbf1fa254879d7c628 Mon Sep 17 00:00:00 2001
From: GUK0 <1685605435@qq.com>
Date: Tue, 20 Jun 2017 10:13:54 +0800
Subject: [PATCH 225/332] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?=
 =?UTF-8?q?=EF=BC=8C=E5=B0=86=E5=8F=91=E9=80=81=E9=82=AE=E4=BB=B6=E7=9A=84?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=8B=86=E5=88=86=E6=88=903=E4=B8=AA?=
 =?UTF-8?q?=E7=B1=BB=E3=80=82=E5=B8=8C=E6=9C=9B=E8=80=81=E5=B8=88=E7=9C=8B?=
 =?UTF-8?q?=E7=9C=8B=E6=98=AF=E5=90=A6=E5=90=88=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/247565311/week00/Configuration.java  |  19 +++
 .../247565311/week00/ConfigurationKeys.java   |   6 +
 students/247565311/week00/DBUtil.java         |  21 +++
 students/247565311/week00/MailUtil.java       |  14 ++
 students/247565311/week00/PromotionMail.java  | 136 ++++++++++++++++++
 .../247565311/week00/product_promotion.txt    |   5 +
 6 files changed, 201 insertions(+)
 create mode 100644 students/247565311/week00/Configuration.java
 create mode 100644 students/247565311/week00/ConfigurationKeys.java
 create mode 100644 students/247565311/week00/DBUtil.java
 create mode 100644 students/247565311/week00/MailUtil.java
 create mode 100644 students/247565311/week00/PromotionMail.java
 create mode 100644 students/247565311/week00/product_promotion.txt

diff --git a/students/247565311/week00/Configuration.java b/students/247565311/week00/Configuration.java
new file mode 100644
index 0000000000..66f989efd0
--- /dev/null
+++ b/students/247565311/week00/Configuration.java
@@ -0,0 +1,19 @@
+package week00;
+import java.util.HashMap;
+import java.util.Map;
+public class Configuration {
+	static Map<String,String> 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/247565311/week00/ConfigurationKeys.java b/students/247565311/week00/ConfigurationKeys.java
new file mode 100644
index 0000000000..10da9ce88c
--- /dev/null
+++ b/students/247565311/week00/ConfigurationKeys.java
@@ -0,0 +1,6 @@
+package week00;
+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/247565311/week00/DBUtil.java b/students/247565311/week00/DBUtil.java
new file mode 100644
index 0000000000..903bdef223
--- /dev/null
+++ b/students/247565311/week00/DBUtil.java
@@ -0,0 +1,21 @@
+package week00;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+public class DBUtil {
+	/**
+	 * Ӧôݿ ǼΪֱɡ
+	 * @param sql
+	 * @return
+	 */
+	public static List<HashMap<String,String>> query(String sql){
+		List<HashMap<String,String>> userList = new ArrayList<HashMap<String,String>>();
+		for (int i = 1; i <= 3; i++) {
+			HashMap<String,String> userInfo = new HashMap<String,String>();
+			userInfo.put("NAME", "User" + i);			
+			userInfo.put("EMAIL", "aa@bb.com");
+			userList.add(userInfo);
+		}
+		return userList;
+	}
+}
diff --git a/students/247565311/week00/MailUtil.java b/students/247565311/week00/MailUtil.java
new file mode 100644
index 0000000000..01e6e32fc8
--- /dev/null
+++ b/students/247565311/week00/MailUtil.java
@@ -0,0 +1,14 @@
+package week00;
+
+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/247565311/week00/PromotionMail.java b/students/247565311/week00/PromotionMail.java
new file mode 100644
index 0000000000..a1e079f571
--- /dev/null
+++ b/students/247565311/week00/PromotionMail.java
@@ -0,0 +1,136 @@
+package week00;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+class ProductMessage{
+    public String productID;
+    public String productDesc;
+    public ProductMessage(String id,String desc){
+	productID = id;
+	productDesc = desc;
+    }
+}
+class ProductMessageIter{
+    BufferedReader reader = null;
+    boolean loadFileSuccess = false,readFinished = false;
+    public ProductMessageIter(File socFile){
+        try {
+    	    reader = new BufferedReader(new FileReader(socFile));
+        } catch (FileNotFoundException e) {
+    	    e.printStackTrace();
+    	    return;
+        }
+        loadFileSuccess = true;
+    }
+    public boolean hasNext(){
+	if(!loadFileSuccess || readFinished) return false;
+	try {
+	    reader.mark(10);
+	    String lineMsg = reader.readLine();
+	    reader.reset();
+	    if(lineMsg.equals("")) {
+		readFinished = true;
+		reader.close();
+		return false;
+	    }
+	} catch (IOException e) {
+	    e.printStackTrace();
+	}
+	return true;
+    }
+    public ProductMessage next(){
+	String lineMsg=null;
+	try {
+	    lineMsg = reader.readLine();
+	} catch (IOException e) {
+	    e.printStackTrace();
+	}
+	if(lineMsg == null) return null;
+	String [] msgs = lineMsg.split(" ");
+	ProductMessage msg = new ProductMessage(msgs[0],msgs[1]);
+        System.out.println("ƷID = " + msgs[0]);
+        System.out.println("Ʒ = " + msgs[1]);
+	return msg;
+    }
+}
+class EMailSender{
+    String fromAddress = null;
+    String smtpHost = null;
+    String altSmtpHost = null; 
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+    
+    public EMailSender(){
+	Configuration config = new Configuration();
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);  
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+    }
+    // ʼݣɹɻᷢʼ
+    public void configureAndSendEMail(HashMap<String,String> userInfo,ProductMessage prdMsg,boolean debug) throws IOException 
+    {
+	String toAddress = "",subject = "",message = "";
+        toAddress = (String) userInfo.get(EMAIL_KEY); 
+        if (toAddress.length() > 0) {
+            String name = (String) userInfo.get(NAME_KEY);
+            subject = "עĲƷ";
+            message = "𾴵 "+name+", עĲƷ " + prdMsg.productDesc + " ˣӭ!" ;   
+            System.out.println("ʼʼ");
+            sendEMail(toAddress,subject,message,debug);
+        }else {
+            System.out.println("ûʼ");
+        }
+    }
+    // ֪ͨʼ
+    void sendEMail(String toAddress,String subject,String message,boolean debug) throws IOException 
+    {
+        boolean sendSucceed = false;
+        try 
+        {
+            if (toAddress.length() > 0){
+                MailUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug);
+                sendSucceed = true;
+            }
+        } 
+        catch (Exception e) {}
+        if(!sendSucceed){
+            try {
+                MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
+            } catch (Exception e2) 
+            {
+                System.out.println("ͨ SMTPʼʧ: " + e2.getMessage()); 
+            }
+        }
+    }
+}
+public class PromotionMail {   
+    public static void main(String[] args) throws Exception {
+        File f = new File("J:\\gitstore\\coding2017\\students\\247565311\\week00\\product_promotion.txt");
+        boolean emailDebug = false;
+        PromotionMail pe = new PromotionMail(f, emailDebug);
+    }
+    // ̿
+    public PromotionMail(File file, boolean mailDebug) throws Exception {
+	ProductMessageIter iter = new ProductMessageIter(file);//ȡļ ļֻһÿո  P8756 iPhone8
+	while(iter.hasNext()){
+	    ProductMessage prdMsg = iter.next();
+	    List<HashMap<String,String>> userInfos = loadMailingList(prdMsg);
+	    for(HashMap<String,String> user : userInfos){
+		new EMailSender().configureAndSendEMail(user,prdMsg,mailDebug);
+	    }
+	}
+    }
+    // ȡûб
+    protected List<HashMap<String,String>> loadMailingList(ProductMessage prdMsg) throws Exception {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + prdMsg.productID +"' "
+                + "and send_mail=1 ";
+        System.out.println("ûб...");
+        return DBUtil.query(sendMailQuery);
+    }
+}
diff --git a/students/247565311/week00/product_promotion.txt b/students/247565311/week00/product_promotion.txt
new file mode 100644
index 0000000000..e98aea9f01
--- /dev/null
+++ b/students/247565311/week00/product_promotion.txt
@@ -0,0 +1,5 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
+

From 12d576619b8e2c1a6ba4ea27af7d5af5334ed941 Mon Sep 17 00:00:00 2001
From: fengdzh <ifengdzh@163.com>
Date: Tue, 20 Jun 2017 10:26:02 +0800
Subject: [PATCH 226/332] readme

---
 students/281918307 | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/281918307

diff --git a/students/281918307 b/students/281918307
new file mode 100644
index 0000000000..8178c76d62
--- /dev/null
+++ b/students/281918307
@@ -0,0 +1 @@
+readme

From 8a6bb2b216c54f1cd752d21d84ffdd3e130a6b2c Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Tue, 20 Jun 2017 10:34:32 +0800
Subject: [PATCH 227/332] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6?=
 =?UTF-8?q?=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/281918307 | 1 -
 1 file changed, 1 deletion(-)
 delete mode 100644 students/281918307

diff --git a/students/281918307 b/students/281918307
deleted file mode 100644
index 8178c76d62..0000000000
--- a/students/281918307
+++ /dev/null
@@ -1 +0,0 @@
-readme

From 09b0045aae10d3662fd218787278785116cbc52c Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Tue, 20 Jun 2017 10:37:51 +0800
Subject: [PATCH 228/332] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=88=9B?=
 =?UTF-8?q?=E5=BB=BA=E6=96=87=E4=BB=B6=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/281918307/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/281918307/readme.md

diff --git a/students/281918307/readme.md b/students/281918307/readme.md
new file mode 100644
index 0000000000..ea786ff2cf
--- /dev/null
+++ b/students/281918307/readme.md
@@ -0,0 +1 @@
+readme
\ No newline at end of file

From 8fbb80a7f3b43e26502778dca8512a1cb9c4ee3e Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Tue, 20 Jun 2017 11:16:56 +0800
Subject: [PATCH 229/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A=E5=8F=82=E8=80=83=E7=AD=94=E6=A1=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/ocp/good/Formatter.java |  7 +++++++
 .../ood/ocp/good/FormatterFactory.java         | 13 +++++++++++++
 .../coderising/ood/ocp/good/HtmlFormatter.java | 11 +++++++++++
 .../com/coderising/ood/ocp/good/Logger.java    | 18 ++++++++++++++++++
 .../coderising/ood/ocp/good/RawFormatter.java  | 11 +++++++++++
 .../com/coderising/ood/ocp/good/Sender.java    |  7 +++++++
 6 files changed, 67 insertions(+)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/liuxin/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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/liuxin/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);
+
+}

From 5c6cd6b96464d2c68ebb292eabca6add58631ee5 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Tue, 20 Jun 2017 11:19:11 +0800
Subject: [PATCH 230/332] remove unused code

---
 .../coderising/ood/srp/DO/ProductDetail.java  | 26 -----------------
 .../com/coderising/ood/srp/DO/UserInfo.java   | 29 -------------------
 2 files changed, 55 deletions(-)
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
deleted file mode 100644
index 7b3041a000..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.ood.srp.DO;
-
-/**
- * 产品信息数据类。
- * @since 06.18.2017
- */
-public class ProductDetail {
-    private String id;
-    private String description;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
deleted file mode 100644
index 14eff3c68a..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.coderising.ood.srp.DO;
-
-/**
- * 用户数据类。
- * @since 06.18.2017
- */
-public class UserInfo {
-    private String name;
-    private String email;
-    private String productDesc;
-
-    public UserInfo(String name, String email, String productDesc){
-        this.name = name;
-        this.email = email;
-        this.productDesc = productDesc;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public String getProductDesc() {
-        return productDesc;
-    }
-}

From 3f9efb788593ad59377beaf06c6fbabe60d2aae3 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Tue, 20 Jun 2017 11:31:30 +0800
Subject: [PATCH 231/332] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E8=A2=AB=E8=A6=86?=
 =?UTF-8?q?=E7=9B=96=E7=9A=84=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 liuxin/ood/ood-assignment/pom.xml             |   7 +-
 .../com/coderising/ood/course/bad/Course.java |  24 ++
 .../ood/course/bad/CourseOffering.java        |  26 +++
 .../ood/course/bad/CourseService.java         |  16 ++
 .../coderising/ood/course/bad/Student.java    |  14 ++
 .../coderising/ood/course/good/Course.java    |  18 ++
 .../ood/course/good/CourseOffering.java       |  34 +++
 .../ood/course/good/CourseService.java        |  10 +
 .../coderising/ood/course/good/Student.java   |  21 ++
 .../com/coderising/ood/srp/PromotionMail.java | 218 +++++++++++++++---
 .../coderising/ood/srp/product_promotion.txt  |   4 -
 students/2831099157/ood-assignment/pom.xml    |  32 ---
 .../com/coderising/ood/srp/PromotionMail.java |  21 --
 .../ood/srp/configure/Configuration.java      |  23 --
 .../ood/srp/configure/ConfigurationKeys.java  |   9 -
 .../com/coderising/ood/srp/dao/DBUtil.java    |  27 ---
 .../srp/interfaces/GetProductsFunction.java   |  13 --
 .../ood/srp/interfaces/SendMailFunction.java  |  13 --
 .../com/coderising/ood/srp/model/Mail.java    | 112 ---------
 .../com/coderising/ood/srp/model/Product.java |  46 ----
 .../com/coderising/ood/srp/model/User.java    |  25 --
 .../coderising/ood/srp/product_promotion.txt  |   4 -
 .../ood/srp/service/GetProductsFromFile.java  |  47 ----
 .../ood/srp/service/GoodsArrivalNotice.java   |  13 --
 .../coderising/ood/srp/service/Notice.java    |  25 --
 .../ood/srp/service/PricePromotion.java       |  12 -
 .../ood/srp/service/SendGoodsArrivalMail.java |  42 ----
 .../ood/srp/service/SendPriceMail.java        |  42 ----
 ...10\351\207\215\346\236\204\357\274\211.md" |  23 --
 students/550727632/pom.xml                    |  37 ---
 .../java/com/coderising/ood/ocp/Logger.java   |  20 --
 .../coderising/ood/ocp/logs/ILogMethod.java   |  10 -
 .../com/coderising/ood/ocp/logs/ILogType.java |  12 -
 .../ood/ocp/logs/impl/EmailLog.java           |  13 --
 .../ood/ocp/logs/impl/PrintLog.java           |  12 -
 .../coderising/ood/ocp/logs/impl/RowLog.java  |  13 --
 .../ood/ocp/logs/impl/RowLogWithDate.java     |  12 -
 .../coderising/ood/ocp/logs/impl/SMSLog.java  |  13 --
 .../com/coderising/ood/ocp/util/DateUtil.java |  10 -
 .../com/coderising/ood/ocp/util/MailUtil.java |  10 -
 .../com/coderising/ood/ocp/util/SMSUtil.java  |  10 -
 .../com/coderising/ood/srp/Configuration.java |  23 --
 .../coderising/ood/srp/ConfigurationKeys.java |   9 -
 .../java/com/coderising/ood/srp/DBUtil.java   |  31 ---
 .../java/com/coderising/ood/srp/FileUtil.java |  28 ---
 .../java/com/coderising/ood/srp/MailUtil.java |  56 -----
 .../java/com/coderising/ood/srp/Product.java  |  29 ---
 .../com/coderising/ood/srp/PromotionMail.java |  37 ---
 .../java/com/coderising/ood/srp/User.java     |  34 ---
 .../coderising/ood/srp/product_promotion.txt  |   4 -
 50 files changed, 351 insertions(+), 993 deletions(-)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java
 delete mode 100644 students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
 delete mode 100644 students/2831099157/ood-assignment/pom.xml
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
 delete mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
 delete mode 100644 "students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
 delete mode 100644 students/550727632/pom.xml
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/Product.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/User.java
 delete mode 100644 students/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/liuxin/ood/ood-assignment/pom.xml b/liuxin/ood/ood-assignment/pom.xml
index d1ed73a0bf..cac49a5328 100644
--- a/liuxin/ood/ood-assignment/pom.xml
+++ b/liuxin/ood/ood-assignment/pom.xml
@@ -21,12 +21,7 @@
     	<artifactId>junit</artifactId>
     	<version>4.12</version>
     </dependency>
-      <dependency>
-          <groupId>org.jetbrains</groupId>
-          <artifactId>annotations-java5</artifactId>
-          <version>RELEASE</version>
-      </dependency>
-
+    
   </dependencies>
   <repositories>
         <repository>
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java
new file mode 100644
index 0000000000..436d092f58
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
new file mode 100644
index 0000000000..ab8c764584
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+
+	public Course getCourse() {
+		return course;
+	}	
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
new file mode 100644
index 0000000000..8c34bad0c3
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
+		if(student.getCoursesAlreadyTaken().containsAll(
+				sc.getCourse().getPrerequisites())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+		
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java
new file mode 100644
index 0000000000..a651923ef5
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java
new file mode 100644
index 0000000000..aefc9692bb
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
new file mode 100644
index 0000000000..ae922572f7
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	/*public List<Student> getStudents() {
+		return students;
+	}*/
+	/*public int getMaxStudents() {
+		return maxStudents;
+	}*/
+	/*public Course getCourse() {
+		return course;
+	}*/
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
new file mode 100644
index 0000000000..49246a37ae
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		sc.addStudent(student);
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java
new file mode 100644
index 0000000000..1a153a0bc9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	/*public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	*/
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 2ec66a4d47..781587a846 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,43 +1,199 @@
 package com.coderising.ood.srp;
 
-import com.coderising.ood.srp.DO.ProductDetail;
-import com.coderising.ood.srp.DO.UserInfo;
-import com.coderising.ood.srp.util.DBUtil;
-import com.coderising.ood.srp.util.FileUtil;
-import com.coderising.ood.srp.util.MailUtil;
-
-import java.io.FileNotFoundException;
+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;
 
-/**
- * 程序入口点。
- * @since 06.19.2017
- */
 public class PromotionMail {
 
-    public static void main(String[] args){
-        final String FILE_PATH = "test.txt";
-        FileUtil fileUtil;
 
-        //尝试打开促销文件
-        try {
-            fileUtil = new FileUtil(FILE_PATH);
-        } catch (FileNotFoundException e){
-            System.out.println("促销文件打开失败，请确认文件路径！");
-            return;
-        }
+	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("开始发送邮件");
+	
 
-        sendAllEMails(fileUtil);
+		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()); 
+					}
+				}
+			}
+			
 
-        fileUtil.close();
-    }
+		}
 
+		else {
+			System.out.println("没有邮件发送");
+			
+		}
 
-    private static void sendAllEMails(FileUtil fileUtil){
-        while (fileUtil.hasNext()) {
-            ProductDetail productDetail = fileUtil.getNextProduct();
-            List<UserInfo> usersList = DBUtil.query(productDetail);
-            MailUtil.sendEmails(usersList);
-        }
-    }
+	}
 }
diff --git a/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
deleted file mode 100644
index b7a974adb3..0000000000
--- a/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-P8756 iPhone8
-P3946 XiaoMi10
-P8904 Oppo_R15
-P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/2831099157/ood-assignment/pom.xml b/students/2831099157/ood-assignment/pom.xml
deleted file mode 100644
index cac49a5328..0000000000
--- a/students/2831099157/ood-assignment/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>com.coderising</groupId>
-  <artifactId>ood-assignment</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  <packaging>jar</packaging>
-
-  <name>ood-assignment</name>
-  <url>http://maven.apache.org</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <dependencies>
-    
-    <dependency>
-    	<groupId>junit</groupId>
-    	<artifactId>junit</artifactId>
-    	<version>4.12</version>
-    </dependency>
-    
-  </dependencies>
-  <repositories>
-        <repository>
-            <id>aliyunmaven</id>
-            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
-        </repository>
-    </repositories>
-</project>
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index 9eb1b21f29..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.coderising.ood.srp;
-
-import com.coderising.ood.srp.service.GoodsArrivalNotice;
-import com.coderising.ood.srp.service.Notice;
-
-/**
- * 可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
- */
-public class PromotionMail {
-
-    public static void main(String[] args) throws Exception {
-        //降价促销
-//      Notice notice = new PricePromotion();
-        //到货通知
-        Notice notice = new GoodsArrivalNotice();
-        notice.sendMail(notice.getProducts());
-
-    }
-
-
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
deleted file mode 100644
index 5c0697782a..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.srp.configure;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
deleted file mode 100644
index c9cfba4974..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.coderising.ood.srp.configure;
-
-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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
deleted file mode 100644
index c0e7f6508d..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coderising.ood.srp.dao;
-import com.coderising.ood.srp.model.User;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-public class DBUtil {
-	
-	/**
-	 * 应该从数据库读， 但是简化为直接生成。
-	 * @param sql
-	 * @return
-	 */
-	public static List<User> query(String sql){
-		
-		List userList = new ArrayList();
-		for (int i = 1; i <= 3; i++) {
-			User user = new User();
-			user.setName("User" + i);
-			user.seteMail("aa@bb.com");
-			userList.add(user);
-		}
-
-		return userList;
-	}
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
deleted file mode 100644
index f0894ea3c7..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.ood.srp.interfaces;
-
-import com.coderising.ood.srp.model.Product;
-
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public interface GetProductsFunction {
-
-    List<Product> getProducts();
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
deleted file mode 100644
index cd27a45767..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.ood.srp.interfaces;
-
-import com.coderising.ood.srp.model.Product;
-
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public interface SendMailFunction {
-
-    void sendMail(List<Product> products);
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
deleted file mode 100644
index b94f27b29d..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package com.coderising.ood.srp.model;
-
-import com.coderising.ood.srp.configure.Configuration;
-import com.coderising.ood.srp.configure.ConfigurationKeys;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class Mail {
-    private String fromAddress;
-    private String toAddress;
-    private String subject;
-    private String content;
-    private String smtpHost = null;
-    private String altSmtpHost = null;
-
-    public Mail() {
-        Configuration config = new Configuration();
-        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
-        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
-        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
-    }
-
-    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;
-    }
-
-
-    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 void send() {
-        if(null==toAddress){
-            System.out.println("发送地址不能为空");
-            return;
-        }
-        try {
-            sendMailBySmtpHost();
-        } catch (Exception e) {
-            try {
-                sendMailBySmtpHost();
-            } catch (Exception e2) {
-                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
-            }
-
-        }
-    }
-
-    private void sendMailBySmtpHost() {
-        System.out.println("通过SMTP服务器开始发送邮件");
-        //假装发了一封邮件
-        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(content).append("\n");
-        System.out.println(buffer.toString());
-    }
-
-    private void sendMailByAlSmtpHost() {
-        System.out.println("通过备用SMTP服务器开始发送邮件");
-        //假装发了一封邮件
-        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(content).append("\n");
-        System.out.println(buffer.toString());
-    }
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
deleted file mode 100644
index f9f5b5a145..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.coderising.ood.srp.model;
-
-import com.coderising.ood.srp.dao.DBUtil;
-
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class Product {
-    String id;
-    String description;
-
-    public Product(String id, String descript) {
-        this.id = id;
-        this.description = descript;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public List<User> getSubscribers() {
-        List<User> userList = null;
-        String sendMailQuery = "Select name from subscriptions "
-                + "where product_id= '" + id + "' "
-                + "and send_mail=1 ";
-        userList = DBUtil.query(sendMailQuery);
-        return userList;
-
-    }
-
-
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
deleted file mode 100644
index 38bec29f59..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.coderising.ood.srp.model;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class User {
-    String name;
-    String 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
deleted file mode 100644
index b7a974adb3..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-P8756 iPhone8
-P3946 XiaoMi10
-P8904 Oppo_R15
-P4955 Vivo_X20
\ No newline at end of file
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
deleted file mode 100644
index 92a1090c5e..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.coderising.ood.srp.service;
-
-import com.coderising.ood.srp.interfaces.GetProductsFunction;
-import com.coderising.ood.srp.model.Product;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class GetProductsFromFile implements GetProductsFunction {
-    public String filePath = "E:\\StudyProjects\\Java\\Workspace\\HomeWork\\coding2017\\liuxin\\ood\\ood-assignment\\" +
-            "src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
-
-    @Override
-    public List<Product> getProducts() {
-        BufferedReader br = null;
-        List<Product> products = new ArrayList<>();
-        try {
-            File file = new File(filePath);
-            br = new BufferedReader(new FileReader(file));
-            String temp = null;
-            while ((temp = br.readLine()) != null) {
-                String[] data = temp.split(" ");
-                Product product = new Product(data[0], data[1]);
-                System.out.println("促销产品ID = " + product.getId());
-                System.out.println("促销产品描述 = " + product.getDescription());
-                products.add(product);
-            }
-
-        } catch (IOException e) {
-            System.out.println("读取文件失败");
-        } finally {
-            try {
-                br.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        return products;
-    }
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
deleted file mode 100644
index ee4723ec06..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.ood.srp.service;
-
-/**
- * Created by Iden on 2017/6/14.
- * 到货通知
- */
-public class GoodsArrivalNotice extends Notice {
-    public GoodsArrivalNotice() {
-        getProductsFunction = new GetProductsFromFile();
-        sendMailFunction = new SendGoodsArrivalMail();
-    }
-
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
deleted file mode 100644
index 6ac8e62402..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.coderising.ood.srp.service;
-
-import com.coderising.ood.srp.interfaces.GetProductsFunction;
-import com.coderising.ood.srp.interfaces.SendMailFunction;
-import com.coderising.ood.srp.model.Product;
-
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- * 各类通知（降价促销，抢购活动，到货通知等等）
- */
-public abstract class Notice {
-    GetProductsFunction getProductsFunction;
-    SendMailFunction sendMailFunction;
-
-    public List<Product> getProducts() {
-        return getProductsFunction.getProducts();
-    }
-
-    public void sendMail(List<Product> products) {
-        sendMailFunction.sendMail(products);
-    }
-
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
deleted file mode 100644
index ebb59571c0..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.coderising.ood.srp.service;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class PricePromotion extends Notice {
-    public PricePromotion() {
-        getProductsFunction = new GetProductsFromFile();
-        sendMailFunction = new SendPriceMail();
-    }
-
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
deleted file mode 100644
index 79f3a6985f..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coderising.ood.srp.service;
-
-import com.coderising.ood.srp.interfaces.SendMailFunction;
-import com.coderising.ood.srp.model.Mail;
-import com.coderising.ood.srp.model.Product;
-import com.coderising.ood.srp.model.User;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class SendGoodsArrivalMail implements SendMailFunction {
-
-
-    @Override
-    public void sendMail(List<Product> products) {
-        if (null == products || products.size() == 0) {
-            System.out.println("没有发现到货的产品");
-            return;
-        }
-        Iterator<Product> iterator = products.iterator();
-        while (iterator.hasNext()) {
-            Product product = iterator.next();
-            List<User> userList = product.getSubscribers();
-            if (null == userList || userList.size() == 0) {
-                System.out.println("没有人订阅" + product.getDescription() + " 信息");
-                continue;
-            }
-            Iterator iter = userList.iterator();
-            while (iter.hasNext()) {
-                User user = (User) iter.next();
-                Mail mail = new Mail();
-                mail.setSubject("您关注的产品到货了");
-                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 到货了，欢迎购买");
-                mail.setToAddress(user.geteMail());
-                mail.send();
-            }
-        }
-    }
-}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
deleted file mode 100644
index bae4803e3f..0000000000
--- a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coderising.ood.srp.service;
-
-import com.coderising.ood.srp.interfaces.SendMailFunction;
-import com.coderising.ood.srp.model.Mail;
-import com.coderising.ood.srp.model.Product;
-import com.coderising.ood.srp.model.User;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Created by Iden on 2017/6/14.
- */
-public class SendPriceMail implements SendMailFunction {
-
-
-    @Override
-    public void sendMail(List<Product> products) {
-        if (null == products || products.size() == 0) {
-            System.out.println("没有发现需要促销的产品");
-            return;
-        }
-        Iterator<Product> iterator = products.iterator();
-        while (iterator.hasNext()) {
-            Product product = iterator.next();
-            List<User> userList = product.getSubscribers();
-            if (null == userList || userList.size() == 0) {
-                System.out.println("没有人订阅 " + product.getDescription() + " 信息");
-                continue;
-            }
-            Iterator iter = userList.iterator();
-            while (iter.hasNext()) {
-                User user = (User) iter.next();
-                Mail mail = new Mail();
-                mail.setSubject("您关注的产品降价了");
-                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 降价了，欢迎购买");
-                mail.setToAddress(user.geteMail());
-                mail.send();
-            }
-        }
-    }
-}
diff --git "a/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md" "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
deleted file mode 100644
index 33634cb9a9..0000000000
--- "a/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
+++ /dev/null
@@ -1,23 +0,0 @@
-# 第一次OOD练习 #
-
-## 需求 ##
-### 原项目已经实现根据产品列表文件发送促销Mail，需求一直在变化，比如通过数据库获取促销产品或者促销活动改为到货通知，抢购等；为了应变各种变化，需重构代码。 ###
-## 需求分析 ##
-需求可变因素:</br>
-
-1. 促销产品列表文件可能会变更，或者变更获取方式（如通过数据库获取）
-2. 促销活动会根据运营情况变更
-## 重构方案 ##
-1. 提取GetProductsFunction，SendMailFunction接口
-2. 添加Notice抽象类，针对接口添加getProducts,sendMai方法 -------各类通知（降价促销，抢购活动，到货通知等等）
-3. 添加Mail,Product,User实体类
-4. Mail初始化设置smtpHost,alSmtpHost,fromAddress参数，添加sendMail功能
-5. Product添加getSubscribers功能
-6. 添加GetProductsFunction，SendMailFunction接口实现类
-7. 添加PricePromotion继承Promotion，实现降价促销功能，实例化GetProductsFunction，SendMailFunction接口    
-8. 主函数调用sendMail方法
-
-## 重构后 ##
-重构后项目，可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
-
-
diff --git a/students/550727632/pom.xml b/students/550727632/pom.xml
deleted file mode 100644
index 3483fcca18..0000000000
--- a/students/550727632/pom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>com.codering.ood</groupId>
-	<artifactId>coderising</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-
-	<name>ood-assignment</name>
-	<url>http://maven.apache.org</url>
-
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
-
-	<dependencies>
-
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.12</version>
-		</dependency>
-		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
-		<dependency>
-			<groupId>org.apache.commons</groupId>
-			<artifactId>commons-lang3</artifactId>
-			<version>3.4</version>
-		</dependency>
-
-
-	</dependencies>
-	<repositories>
-		<repository>
-			<id>aliyunmaven</id>
-			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
-		</repository>
-	</repositories>
-</project>
\ No newline at end of file
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java b/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
deleted file mode 100644
index 689b130f0d..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/Logger.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.coderising.ood.ocp;
-
-import com.coderising.ood.ocp.logs.ILogMethod;
-import com.coderising.ood.ocp.logs.ILogType;
-
-public class Logger {
-
-	private ILogType logType;
-	private ILogMethod logMethod;
-
-	public Logger(ILogType logType, ILogMethod logMethod) {
-		this.logType = logType;
-		this.logMethod = logMethod;
-	}
-
-	public void log(String msg) {
-		String logMsg = this.logType.formatMessage(msg);
-		this.logMethod.sendLog(logMsg);
-	}
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
deleted file mode 100644
index 0dd74248e2..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogMethod.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp.logs;
-
-public interface ILogMethod {
-	/**
-	 * 发送log信息
-	 * 
-	 * @param msg
-	 */
-	void sendLog(String msg);
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
deleted file mode 100644
index bdf07869ae..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/ILogType.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.coderising.ood.ocp.logs;
-
-public interface ILogType {
-
-	/**
-	 * 格式化log信息
-	 * 
-	 * @param msg
-	 * @return
-	 */
-	String formatMessage(String msg);
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
deleted file mode 100644
index 8e185560a8..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/EmailLog.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.ood.ocp.logs.impl;
-
-import com.coderising.ood.ocp.logs.ILogMethod;
-import com.coderising.ood.ocp.util.MailUtil;
-
-public class EmailLog implements ILogMethod {
-
-	@Override
-	public void sendLog(String msg) {
-		MailUtil.send(msg);
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
deleted file mode 100644
index 81ad2e79ec..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/PrintLog.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.coderising.ood.ocp.logs.impl;
-
-import com.coderising.ood.ocp.logs.ILogMethod;
-
-public class PrintLog implements ILogMethod {
-
-	@Override
-	public void sendLog(String msg) {
-		System.out.println(msg);
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
deleted file mode 100644
index a9aecfdfae..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLog.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.ood.ocp.logs.impl;
-
-import com.coderising.ood.ocp.logs.ILogType;
-import com.coderising.ood.ocp.util.DateUtil;
-
-public class RowLog implements ILogType {
-
-	@Override
-	public String formatMessage(String msg) {
-		return DateUtil.getCurrentDateAsString() + ":" + msg;
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
deleted file mode 100644
index 423cea620a..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/RowLogWithDate.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.coderising.ood.ocp.logs.impl;
-
-import com.coderising.ood.ocp.logs.ILogType;
-
-public class RowLogWithDate implements ILogType {
-
-	@Override
-	public String formatMessage(String msg) {
-		return msg;
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java b/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
deleted file mode 100644
index e0b2c4c3e0..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/logs/impl/SMSLog.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.ood.ocp.logs.impl;
-
-import com.coderising.ood.ocp.logs.ILogMethod;
-import com.coderising.ood.ocp.util.SMSUtil;
-
-public class SMSLog implements ILogMethod {
-
-	@Override
-	public void sendLog(String msg) {
-		SMSUtil.send(msg);
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
deleted file mode 100644
index df8d253d9b..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/util/DateUtil.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp.util;
-
-public class DateUtil {
-
-	public static String getCurrentDateAsString() {
-		
-		return null;
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
deleted file mode 100644
index d95779b076..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/util/MailUtil.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp.util;
-
-public class MailUtil {
-
-	public static void send(String logMsg) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java b/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
deleted file mode 100644
index ae2359de92..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/ocp/util/SMSUtil.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.ocp.util;
-
-public class SMSUtil {
-
-	public static void send(String logMsg) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java b/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java
deleted file mode 100644
index f328c1816a..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.srp;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> 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/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
deleted file mode 100644
index 8695aed644..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
deleted file mode 100644
index 3b73afe420..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.coderising.ood.srp;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DBUtil {
-
-	/**
-	 * 应该从数据库读， 但是简化为直接生成。
-	 * 
-	 * @param sql
-	 * @return
-	 */
-	public static List<User> query(String sql) {
-
-		List<User> userList = new ArrayList<>();
-		for (int i = 1; i <= 3; i++) {
-			User user = new User("User" + i, "aa@bb.com");
-			userList.add(user);
-		}
-
-		return userList;
-	}
-	
-	public static List<User> loadProductUsers(Product product){
-		String sql = "Select name from subscriptions "
-				+ "where product_id= '" + product.getProductID() +"' "
-				+ "and send_mail=1 ";
-		return query(sql);
-	}
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
deleted file mode 100644
index 0054feb8e0..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/FileUtil.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.ood.srp;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class FileUtil {
-
-	public static Product readProductFile(File file) throws IOException {
-		BufferedReader br = null;
-		Product product = new Product();
-		try {
-			br = new BufferedReader(new FileReader(file));
-			String temp = br.readLine();
-			String[] data = temp.split(" ");
-			product.setProductID(data[0]);
-			product.setProductDesc(data[1]);
-			System.out.println(product.toString());
-
-		} catch (IOException e) {
-			throw new IOException(e.getMessage());
-		} finally {
-			br.close();
-		}
-		return product;
-	}
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index a61ab7e52c..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.coderising.ood.srp;
-
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
-public class MailUtil {
-
-	private static String fromAddress;
-	private static String smtpHost;
-	private static String altSmtpHost;
-
-	static {
-		Configuration config = new Configuration();
-		fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
-		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
-		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
-	}
-
-	public static void sendPromotionEmail(PromotionMail mail, Product product, boolean debug) {
-		System.out.println("开始发送邮件");
-		List<User> userList = DBUtil.loadProductUsers(product);
-		if(userList != null && !userList.isEmpty()){
-			for (User user : userList) {
-				mail.setMessage(user, product);
-				if (StringUtils.isNotEmpty(user.getEmail())){
-					sendEmail(mail.getSubject(), mail.getMessage(), user.getEmail(), debug);
-				}
-			}
-		} else {
-			System.out.println("没有需要发送的邮件");
-		}
-	}
-	
-	public static void sendEmail(String subject, String message,String toAddress,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");
-		// 先用smtpHost发送
-		// 如果失败用altSmtpHost发送
-		// 如果还失败，则记录日志
-		try {
-			buffer.append("smtpHost:").append(smtpHost).append("\n");
-		} catch (Exception e) {
-			try {
-				buffer.append("smtpHost:").append(altSmtpHost).append("\n");
-			} catch (Exception e2) {
-				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
-			}
-		}
-		System.out.println(buffer.toString());
-	}
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/Product.java b/students/550727632/src/main/java/com/coderising/ood/srp/Product.java
deleted file mode 100644
index fd107fa4f4..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/Product.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.coderising.ood.srp;
-
-public class Product {
-
-	private String productID;
-	private String 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;
-	}
-
-	@Override
-	public String toString() {
-		return "Product [productID=" + productID + ", productDesc=" + productDesc + "]";
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index 23d48b0ae1..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.coderising.ood.srp;
-
-import java.io.File;
-
-public class PromotionMail {
-	private String subject;
-	private String message;
-
-	public PromotionMail() {
-		subject = "您关注的产品降价了";
-	}
-
-	public static void main(String[] args) throws Exception {
-		File f = new File("src/main/java/com/coderising/ood/srp/product_promotion.txt");
-		boolean emailDebug = false;
-		Product product = FileUtil.readProductFile(f);
-		PromotionMail mail = new PromotionMail();
-		MailUtil.sendPromotionEmail(mail, product, emailDebug);
-	}
-
-	public String getSubject() {
-		return subject;
-	}
-
-	public void setSubject(String subject) {
-		this.subject = subject;
-	}
-
-	public void setMessage(User user, Product product) {
-		message = "尊敬的 " + user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-}
diff --git a/students/550727632/src/main/java/com/coderising/ood/srp/User.java b/students/550727632/src/main/java/com/coderising/ood/srp/User.java
deleted file mode 100644
index b63f655e7c..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/User.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.ood.srp;
-
-public class User {
-
-	private String name;
-	private String email;
-
-	public User() {
-		super();
-	}
-
-	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/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt
deleted file mode 100644
index 0c0124cc61..0000000000
--- a/students/550727632/src/main/java/com/coderising/ood/srp/product_promotion.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-P8756 iPhone8
-P3946 XiaoMi10
-P8904 Oppo_R15
-P4955 Vivo_X20
\ No newline at end of file

From d124ab2642cc0d1d2cc5e905382aaf995ed7632c Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Tue, 20 Jun 2017 11:32:46 +0800
Subject: [PATCH 232/332] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E8=A2=AB=E5=88=A0?=
 =?UTF-8?q?=E9=99=A4=E7=9A=84=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/util/DBUtil.java   | 38 --------
 .../com/coderising/ood/srp/util/FileUtil.java | 49 ----------
 .../com/coderising/ood/srp/util/MailUtil.java | 97 -------------------
 3 files changed, 184 deletions(-)
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
deleted file mode 100644
index e1e0012855..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.coderising.ood.srp.util;
-import com.coderising.ood.srp.DO.ProductDetail;
-import com.coderising.ood.srp.DO.UserInfo;
-
-import java.util.*;
-
-/**
- * 数据库操作类。
- * 管理数据库连接，查询等操作。
- * @since 06.19.2017
- */
-public class DBUtil {
-
-	//TODO 此处添加数据库连接信息
-
-
-	/**
-	 * 应该从数据库读， 但是简化为直接生成。
-	 * 给一个产品详情，返回一个Array List记载所有订阅该产品的用户信息（名字，邮箱，订阅的产品名称）。
-	 * @param productDetail 传产品详情。产品id用来查询数据库。产品名称用于和用户信息绑定
-	 * @return 返回数据库中所有的查询到的结果。
-	 */
-	public static List<UserInfo> query(ProductDetail productDetail){
-		if (productDetail == null || productDetail.getId() == null)
-			return new ArrayList<>();
-
-		String sendMailQuery = "Select name from subscriptions "
-				+ "where product_id= '" + productDetail.getId() +"' "
-				+ "and send_mail=1 ";
-		//假装用sendMilQuery查了数据库，生成了userList作为查询结果
-		List<UserInfo> userList = new ArrayList<>();
-		for (int i = 1; i <= 3; i++) {
-			UserInfo newInfo = new UserInfo("User" + i,"aa@bb.com", productDetail.getDescription());
-			userList.add(newInfo);
-		}
-		return userList;
-	}
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
deleted file mode 100644
index 991f81a537..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.coderising.ood.srp.util;
-
-
-import com.coderising.ood.srp.DO.ProductDetail;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Scanner;
-
-/**
- * 文件操作类。
- * 负责文件句柄的维护。
- * 此类会打开促销文件，促销文件默认按照：
- * "id" 空格 "产品名称"
- * 进行存储，每行一条促销信息。
- * @since 06.19.2017
- */
-public class FileUtil {
-    private Scanner scanner;
-
-
-    public FileUtil(String filePath) throws FileNotFoundException {
-       scanner = new Scanner(new File(filePath));
-    }
-
-    public ProductDetail getNextProduct(){
-        String wholeInfo;
-        ProductDetail nextProduct = new ProductDetail();
-        wholeInfo = scanner.nextLine();
-
-        String[] splitInfo = wholeInfo.split(" ");
-        if (splitInfo.length < 2)
-            return nextProduct;
-
-        //促销文件按照 - "id" 空格 "产品名称" 进行记录的
-        nextProduct.setId(splitInfo[0]);
-        nextProduct.setDescription(splitInfo[1]);
-
-        return nextProduct;
-    }
-
-    public boolean hasNext(){
-        return scanner.hasNextLine();
-    }
-
-    public void close(){
-        scanner.close();
-    }
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
deleted file mode 100644
index 065286d4f9..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.coderising.ood.srp.util;
-
-import com.coderising.ood.srp.DO.UserInfo;
-
-import java.util.List;
-
-
-/**
- * 邮件发送类。
- * 管理邮箱连接，发送等操作。
- * @since 06.19.2017
- */
-public class MailUtil {
-
-    /**
-     * SMTP连接失败异常。
-     * 可用getMessage()获得异常内容。
-     */
-    public static class SMTPConnectionFailedException extends Throwable{
-        public SMTPConnectionFailedException(String message){
-            super(message);
-        }
-    }
-
-    /**
-     * 主SMTP服务器地址
-     */
-	public static final String SMTP_SERVER = "smtp.163.com";
-
-    /**
-     * 备用SMTP服务器地址
-     */
-	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
-
-    /**
-     * 以哪个邮箱地址发送给用户
-     */
-	public static final String EMAIL_ADMIN = "admin@company.com";
-
-
-    /**
-     * 邮件发送操作。
-     * 将降价促销邮件逐个发送给用户信息表中对应的用户。
-     * 捕获SMTPConnectionFailedException。提示手动发送。并继续发送下一封邮件。
-     * @param usersList 用户信息表。包含用户姓名，邮箱和订阅产品名称。
-     */
-	public static void sendEmails(List<UserInfo> usersList){
-		if (usersList == null) {
-			System.out.println("没有邮件发送");
-			return;
-		}
-
-		for (UserInfo info : usersList){
-			if (!info.getEmail().isEmpty()) {
-				String emailInfo = generatePromotionEmail(info);
-				try {
-                    sendPromotionEmail(emailInfo);
-                } catch (SMTPConnectionFailedException e){
-                    System.out.println("SMTP主副服务器连接失败，请手动发送以下邮件： \n");
-                    System.out.println(e.getMessage());
-                }
-			}
-		}
-	}
-
-    /**
-     * 假装在发邮件。默认使用主SMTP发送，若发送失败则使用备用SMTP发送。
-     * 仍然失败，则抛出SMTPConnectFailException异常。
-     * @param emailInfo 要发送的邮件内容
-     * @throws SMTPConnectionFailedException 若主副SMTP服务器均连接失败，抛出异常。异常中包含完整的发送失败的邮件内容。可通过getMessage()方法获得邮件内容。
-     */
-	private static void sendPromotionEmail(String emailInfo) throws SMTPConnectionFailedException{
-		//默认以SMTP_SERVER 发送
-		//如果发送失败以ALT_SMTP_SERVER 重新发送
-		//如果还失败，throw new SMTPConnectionFailedException(emailInfo).
-	}
-
-    /**
-     * 根据用户信息生成促销邮件内容。
-     * @param userInfo 用户信息。
-     * @return 返回生成的邮件。
-     */
-	private static String generatePromotionEmail(UserInfo userInfo){
-		StringBuilder buffer = new StringBuilder();
-
-		buffer.append("From:").append(EMAIL_ADMIN).append("\n");
-		buffer.append("To:").append(userInfo.getEmail()).append("\n");
-		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
-		buffer.append("Content:").append("尊敬的").append(userInfo.getName());
-		buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
-		buffer.append(" 降价了，欢迎购买!").append("\n");
-
-		System.out.println(buffer.toString());
-
-		return buffer.toString();
-	}
-}

From 40aacb9497d34a38539c837a2e7ce8bbeea40eaf Mon Sep 17 00:00:00 2001
From: Andy <14703250@qq.com>
Date: Tue, 20 Jun 2017 11:33:42 +0800
Subject: [PATCH 233/332] Delete test.txt

---
 liuxin/ood/ood-assignment/test.txt | 5 -----
 1 file changed, 5 deletions(-)
 delete mode 100644 liuxin/ood/ood-assignment/test.txt

diff --git a/liuxin/ood/ood-assignment/test.txt b/liuxin/ood/ood-assignment/test.txt
deleted file mode 100644
index cb2d21edc4..0000000000
--- a/liuxin/ood/ood-assignment/test.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-P8756 iPhone8
-P3946 XiaoMi10
-P8904 Oppo_R15
-P4955 Vivo_X20
-p123

From 4f161d36a88aa36e517f67a1a467a2b849a3d0da Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Tue, 20 Jun 2017 11:35:12 +0800
Subject: [PATCH 234/332] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/course/bad/Course.java | 24 -------------
 .../ood/course/bad/CourseOffering.java        | 26 --------------
 .../ood/course/bad/CourseService.java         | 16 ---------
 .../coderising/ood/course/bad/Student.java    | 14 --------
 .../coderising/ood/course/good/Course.java    | 18 ----------
 .../ood/course/good/CourseOffering.java       | 34 -------------------
 .../ood/course/good/CourseService.java        | 10 ------
 .../coderising/ood/course/good/Student.java   | 21 ------------
 8 files changed, 163 deletions(-)
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
 delete mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java
deleted file mode 100644
index 436d092f58..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Course.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.coderising.ood.course.bad;
-
-import java.util.List;
-
-public class Course {
-	private String id;
-	private String desc;
-	private int duration ;
-	
-	List<Course> prerequisites;
-	
-	public List<Course> getPrerequisites() {
-		return prerequisites;
-	}
-	
-	
-	public boolean equals(Object o){
-		if(o == null || !(o instanceof Course)){
-			return false;
-		}
-		Course c = (Course)o;
-		return (c != null) && c.id.equals(id);
-	}
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
deleted file mode 100644
index ab8c764584..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.coderising.ood.course.bad;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class CourseOffering {
-	private Course course;
-	private String location;
-	private String teacher;
-	private int maxStudents;
-	
-	List<Student> students = new ArrayList<Student>();
-	
-	public int getMaxStudents() {
-		return maxStudents;
-	}
-	
-	public List<Student> getStudents() {
-		return students;
-	}
-
-	public Course getCourse() {
-		return course;
-	}	
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
deleted file mode 100644
index 8c34bad0c3..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.coderising.ood.course.bad;
-
-
-
-public class CourseService {
-	
-	public void chooseCourse(Student student, CourseOffering sc){		
-		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程
-		if(student.getCoursesAlreadyTaken().containsAll(
-				sc.getCourse().getPrerequisites())
-				&& sc.getMaxStudents() > sc.getStudents().size()){
-			sc.getStudents().add(student);
-		}
-		
-	}
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java
deleted file mode 100644
index a651923ef5..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/bad/Student.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.coderising.ood.course.bad;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Student {
-	private String id;
-	private String name;
-	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
-	
-	public List<Course> getCoursesAlreadyTaken() {
-		return coursesAlreadyTaken;
-	}
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java
deleted file mode 100644
index aefc9692bb..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Course.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.coderising.ood.course.good;
-
-import java.util.List;
-
-public class Course {
-	private String id;
-	private String desc;
-	private int duration ;
-	
-	List<Course> prerequisites;
-	
-	public List<Course> getPrerequisites() {
-		return prerequisites;
-	}
-	
-}
-
-
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
deleted file mode 100644
index ae922572f7..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.ood.course.good;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CourseOffering {
-	private Course course;
-	private String location;
-	private String teacher;
-	private int maxStudents;
-	
-	List<Student> students = new ArrayList<Student>();
-	
-	/*public List<Student> getStudents() {
-		return students;
-	}*/
-	/*public int getMaxStudents() {
-		return maxStudents;
-	}*/
-	/*public Course getCourse() {
-		return course;
-	}*/
-	
-	
-	// 第二步：　把主要逻辑移动到CourseOffering 中
-	public void addStudent(Student student){
-		
-		if(student.canAttend(course) 
-				&& this.maxStudents > students.size()){
-			students.add(student);
-		}
-	}
-	// 第三步： 重构CourseService
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
deleted file mode 100644
index 49246a37ae..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/CourseService.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.coderising.ood.course.good;
-
-
-
-public class CourseService {
-	
-	public void chooseCourse(Student student, CourseOffering sc){		
-		sc.addStudent(student);
-	}
-}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java
deleted file mode 100644
index 1a153a0bc9..0000000000
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/course/good/Student.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.coderising.ood.course.good;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Student {
-	private String id;
-	private String name;
-	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
-	
-	/*public List<Course> getCoursesAlreadyTaken() {
-		return coursesAlreadyTaken;
-	}	
-	*/
-	public boolean canAttend(Course course){
-		return this.coursesAlreadyTaken.containsAll(
-				course.getPrerequisites());
-	}
-}
-
-

From 80fb48c5042731f2e6cfc8be1349007f86d168a2 Mon Sep 17 00:00:00 2001
From: Ken-W-P-Huang <kenhuang@Huawei-Honer.local>
Date: Tue, 20 Jun 2017 11:36:49 +0800
Subject: [PATCH 235/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/395860968/OCP/AbstractNotifier.java    | 10 ++++++++++
 students/395860968/OCP/ConsoleUtil.java         | 11 +++++++++++
 students/395860968/OCP/DateFormatter.java       | 13 +++++++++++++
 students/395860968/OCP/DateUtil.java            | 10 ++++++++++
 students/395860968/OCP/Formatter.java           | 10 ++++++++++
 students/395860968/OCP/Logger.java              | 15 +++++++++++++++
 students/395860968/OCP/MailUtil.java            | 11 +++++++++++
 students/395860968/OCP/Main.java                | 17 +++++++++++++++++
 students/395860968/OCP/SMSUtil.java             | 10 ++++++++++
 .../{ood-assignment => SRP}/Configuration.java  |  0
 .../ConfigurationKeys.java                      |  0
 .../{ood-assignment => SRP}/DBUtil.java         |  0
 .../{ood-assignment => SRP}/FileUtil.java       |  0
 .../{ood-assignment => SRP}/MailUtil.java       |  0
 .../{ood-assignment => SRP}/Product.java        |  0
 .../{ood-assignment => SRP}/PromotionMail.java  |  0
 .../product_promotion.txt                       |  0
 students/395860968/{ood-assignment => SRP}/src  |  0
 18 files changed, 107 insertions(+)
 create mode 100644 students/395860968/OCP/AbstractNotifier.java
 create mode 100644 students/395860968/OCP/ConsoleUtil.java
 create mode 100644 students/395860968/OCP/DateFormatter.java
 create mode 100644 students/395860968/OCP/DateUtil.java
 create mode 100644 students/395860968/OCP/Formatter.java
 create mode 100644 students/395860968/OCP/Logger.java
 create mode 100644 students/395860968/OCP/MailUtil.java
 create mode 100644 students/395860968/OCP/Main.java
 create mode 100644 students/395860968/OCP/SMSUtil.java
 rename students/395860968/{ood-assignment => SRP}/Configuration.java (100%)
 rename students/395860968/{ood-assignment => SRP}/ConfigurationKeys.java (100%)
 rename students/395860968/{ood-assignment => SRP}/DBUtil.java (100%)
 rename students/395860968/{ood-assignment => SRP}/FileUtil.java (100%)
 rename students/395860968/{ood-assignment => SRP}/MailUtil.java (100%)
 rename students/395860968/{ood-assignment => SRP}/Product.java (100%)
 rename students/395860968/{ood-assignment => SRP}/PromotionMail.java (100%)
 rename students/395860968/{ood-assignment => SRP}/product_promotion.txt (100%)
 rename students/395860968/{ood-assignment => SRP}/src (100%)

diff --git a/students/395860968/OCP/AbstractNotifier.java b/students/395860968/OCP/AbstractNotifier.java
new file mode 100644
index 0000000000..4aaffa4dc3
--- /dev/null
+++ b/students/395860968/OCP/AbstractNotifier.java
@@ -0,0 +1,10 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public abstract class AbstractNotifier {
+    public  void send(String logMsg) {
+
+    }
+}
diff --git a/students/395860968/OCP/ConsoleUtil.java b/students/395860968/OCP/ConsoleUtil.java
new file mode 100644
index 0000000000..e7a1e5e0ad
--- /dev/null
+++ b/students/395860968/OCP/ConsoleUtil.java
@@ -0,0 +1,11 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public class ConsoleUtil extends AbstractNotifier {
+    public void send(String logMsg) {
+        // TODO Auto-generated method stub
+        System.out.println("Console send: " + logMsg);
+    }
+}
diff --git a/students/395860968/OCP/DateFormatter.java b/students/395860968/OCP/DateFormatter.java
new file mode 100644
index 0000000000..37719ae800
--- /dev/null
+++ b/students/395860968/OCP/DateFormatter.java
@@ -0,0 +1,13 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public class DateFormatter extends Formatter {
+    @Override
+    public String formatMessage(String msg) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        return txtDate + " : " + msg;
+
+    }
+}
diff --git a/students/395860968/OCP/DateUtil.java b/students/395860968/OCP/DateUtil.java
new file mode 100644
index 0000000000..5d0e77a475
--- /dev/null
+++ b/students/395860968/OCP/DateUtil.java
@@ -0,0 +1,10 @@
+package com.company;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		
+		return "20170101";
+	}
+
+}
diff --git a/students/395860968/OCP/Formatter.java b/students/395860968/OCP/Formatter.java
new file mode 100644
index 0000000000..453d2a98d9
--- /dev/null
+++ b/students/395860968/OCP/Formatter.java
@@ -0,0 +1,10 @@
+package com.company;
+
+/**
+ * Created by kenhuang on 2017/6/20.
+ */
+public class Formatter {
+    public String formatMessage(String msg) {
+        return msg;
+    }
+}
diff --git a/students/395860968/OCP/Logger.java b/students/395860968/OCP/Logger.java
new file mode 100644
index 0000000000..29b4396cb4
--- /dev/null
+++ b/students/395860968/OCP/Logger.java
@@ -0,0 +1,15 @@
+package com.company;
+
+public class Logger {
+	private AbstractNotifier notifier;
+	private Formatter formatter;
+	public Logger(Formatter formatter, AbstractNotifier notifier){
+		this.formatter = formatter;
+		this.notifier = notifier;
+	}
+	public void log(String msg){
+		String logMsg = this.formatter.formatMessage(msg);
+		notifier.send(logMsg);
+	}
+}
+
diff --git a/students/395860968/OCP/MailUtil.java b/students/395860968/OCP/MailUtil.java
new file mode 100644
index 0000000000..3b38eb1630
--- /dev/null
+++ b/students/395860968/OCP/MailUtil.java
@@ -0,0 +1,11 @@
+package com.company;
+
+public class MailUtil extends AbstractNotifier {
+
+	@Override
+	public void send(String logMsg) {
+		// TODO Auto-generated method stub
+		System.out.println("Mail send: " + logMsg);
+	}
+
+}
diff --git a/students/395860968/OCP/Main.java b/students/395860968/OCP/Main.java
new file mode 100644
index 0000000000..cee3424004
--- /dev/null
+++ b/students/395860968/OCP/Main.java
@@ -0,0 +1,17 @@
+package com.company;
+
+public class Main {
+
+    public static void main(String[] args) {
+	// write your code here
+        ConsoleUtil consoleUtil = new ConsoleUtil();
+        Formatter formatter = new Formatter();
+        Logger logger = new Logger(formatter,consoleUtil);
+        logger.log("abc");
+        MailUtil mailUtil = new MailUtil();
+        DateFormatter dateformatter = new DateFormatter();
+        Logger logger2 = new Logger(dateformatter,mailUtil);
+        logger2.log("efg");
+
+    }
+}
diff --git a/students/395860968/OCP/SMSUtil.java b/students/395860968/OCP/SMSUtil.java
new file mode 100644
index 0000000000..1bd29a0613
--- /dev/null
+++ b/students/395860968/OCP/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.company;
+
+public class SMSUtil extends AbstractNotifier {
+
+	public  void send(String logMsg) {
+		// TODO Auto-generated method stub
+		System.out.println("SMS send: " + logMsg);
+	}
+
+}
diff --git a/students/395860968/ood-assignment/Configuration.java b/students/395860968/SRP/Configuration.java
similarity index 100%
rename from students/395860968/ood-assignment/Configuration.java
rename to students/395860968/SRP/Configuration.java
diff --git a/students/395860968/ood-assignment/ConfigurationKeys.java b/students/395860968/SRP/ConfigurationKeys.java
similarity index 100%
rename from students/395860968/ood-assignment/ConfigurationKeys.java
rename to students/395860968/SRP/ConfigurationKeys.java
diff --git a/students/395860968/ood-assignment/DBUtil.java b/students/395860968/SRP/DBUtil.java
similarity index 100%
rename from students/395860968/ood-assignment/DBUtil.java
rename to students/395860968/SRP/DBUtil.java
diff --git a/students/395860968/ood-assignment/FileUtil.java b/students/395860968/SRP/FileUtil.java
similarity index 100%
rename from students/395860968/ood-assignment/FileUtil.java
rename to students/395860968/SRP/FileUtil.java
diff --git a/students/395860968/ood-assignment/MailUtil.java b/students/395860968/SRP/MailUtil.java
similarity index 100%
rename from students/395860968/ood-assignment/MailUtil.java
rename to students/395860968/SRP/MailUtil.java
diff --git a/students/395860968/ood-assignment/Product.java b/students/395860968/SRP/Product.java
similarity index 100%
rename from students/395860968/ood-assignment/Product.java
rename to students/395860968/SRP/Product.java
diff --git a/students/395860968/ood-assignment/PromotionMail.java b/students/395860968/SRP/PromotionMail.java
similarity index 100%
rename from students/395860968/ood-assignment/PromotionMail.java
rename to students/395860968/SRP/PromotionMail.java
diff --git a/students/395860968/ood-assignment/product_promotion.txt b/students/395860968/SRP/product_promotion.txt
similarity index 100%
rename from students/395860968/ood-assignment/product_promotion.txt
rename to students/395860968/SRP/product_promotion.txt
diff --git a/students/395860968/ood-assignment/src b/students/395860968/SRP/src
similarity index 100%
rename from students/395860968/ood-assignment/src
rename to students/395860968/SRP/src

From 5fd8ae3b07b89c74373e7294924ca8fa8151e6d7 Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Tue, 20 Jun 2017 11:50:43 +0800
Subject: [PATCH 236/332] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=8C=85?=
 =?UTF-8?q?=E7=BB=93=E6=9E=84=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/281918307/.gitignore                 | 153 ++++++++++++++++++
 students/281918307/ood-ocp/pom.xml            |  32 ++++
 .../main/java/com/ood/ocp/Application.java    |  14 ++
 .../src/main/resources/log4j.properties       |   8 +
 students/281918307/pom.xml                    |  52 ++++++
 students/281918307/readme.md                  |   3 +-
 6 files changed, 261 insertions(+), 1 deletion(-)
 create mode 100644 students/281918307/.gitignore
 create mode 100644 students/281918307/ood-ocp/pom.xml
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java
 create mode 100644 students/281918307/ood-ocp/src/main/resources/log4j.properties
 create mode 100644 students/281918307/pom.xml

diff --git a/students/281918307/.gitignore b/students/281918307/.gitignore
new file mode 100644
index 0000000000..15a7d78fcb
--- /dev/null
+++ b/students/281918307/.gitignore
@@ -0,0 +1,153 @@
+/target/
+/.idea
+/*.iml
+/**/*.iml
+/.setting
+/*.project
+.DS_Store
+thrid-chongwu/.DS_Store
+thrid-chongwu/src/.DS_Store
+thrid-chongwu/src/main/.DS_Store
+thrid-chongwu/src/main/assembly/.DS_Store
+thrid-chongwu/src/main/resources/.DS_Store
+thrid-chongwu/src/main/resources/templates/.DS_Store
+thrid-chongwu/src/main/webapp/
+thrid-chongwu/src/test/
+thrid-chongwu/target/
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff:
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/dictionaries
+
+# Sensitive or high-churn files:
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.xml
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+
+# Gradle:
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Mongo Explorer plugin:
+.idea/**/mongoSettings.xml
+
+## File-based project format:
+*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+### macOS template
+*.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+### Windows template
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+### Archives template
+# It's better to unpack these files and commit the raw source because
+# git has its own built in compression methods.
+*.7z
+*.gz
+*.bzip
+*.bz2
+*.xz
+*.lzma
+
+#packing-only formats
+*.iso
+*.tar
+
+#package management formats
+*.dmg
+*.xpi
+*.gem
+*.egg
+*.deb
+*.rpm
+### SVN template
+.svn/
diff --git a/students/281918307/ood-ocp/pom.xml b/students/281918307/ood-ocp/pom.xml
new file mode 100644
index 0000000000..9daf351b12
--- /dev/null
+++ b/students/281918307/ood-ocp/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.ood</groupId>
+        <artifactId>ood-application</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>ood-ocp</artifactId>
+    <packaging>jar</packaging>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+        </dependency>
+    </dependencies>
+
+
+    
+</project>
\ No newline at end of file
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java
new file mode 100644
index 0000000000..843af308ec
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java
@@ -0,0 +1,14 @@
+package com.ood.ocp;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public class Application {
+    static final Logger logger = Logger.getLogger(Application.class);
+
+    public static void main(String [] args) {
+        logger.error("Application running ...");
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/resources/log4j.properties b/students/281918307/ood-ocp/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..508df51466
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/resources/log4j.properties
@@ -0,0 +1,8 @@
+log4j.rootLogger=debug, stdout
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %l - %m%n
+
+# Third party loggers
+ log4j.logger.com.ood=debug
diff --git a/students/281918307/pom.xml b/students/281918307/pom.xml
new file mode 100644
index 0000000000..9b7eac3299
--- /dev/null
+++ b/students/281918307/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.ood</groupId>
+    <artifactId>ood-application</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <modules>
+        <module>ood-ocp</module>
+    </modules>
+
+
+    <properties>
+        <encoding>UTF-8</encoding>
+        <compile.version>1.8</compile.version>
+    </properties>
+
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>4.12</version>
+                <scope>test</scope>
+            </dependency>
+            <!--log tools start-->
+            <dependency>
+                <groupId>log4j</groupId>
+                <artifactId>log4j</artifactId>
+                <version>1.2.16</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>1.6.1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-log4j12</artifactId>
+                <version>1.6.1</version>
+            </dependency>
+            <!--log tools end-->
+        </dependencies>
+    </dependencyManagement>
+
+
+</project>
\ No newline at end of file
diff --git a/students/281918307/readme.md b/students/281918307/readme.md
index ea786ff2cf..fdf99a9b89 100644
--- a/students/281918307/readme.md
+++ b/students/281918307/readme.md
@@ -1 +1,2 @@
-readme
\ No newline at end of file
+ood application
+

From 104ac6a7712cf556cca47e88c2a0bb2823f48325 Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Tue, 20 Jun 2017 11:56:38 +0800
Subject: [PATCH 237/332] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ocp=E3=80=81srp=20mod?=
 =?UTF-8?q?ule?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/281918307/ood-srp/pom.xml            | 31 +++++++++++++++++++
 .../main/java/com/ood/srp/Application.java    | 14 +++++++++
 .../src/main/resources/log4j.properties       |  8 +++++
 students/281918307/pom.xml                    |  1 +
 4 files changed, 54 insertions(+)
 create mode 100644 students/281918307/ood-srp/pom.xml
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java
 create mode 100644 students/281918307/ood-srp/src/main/resources/log4j.properties

diff --git a/students/281918307/ood-srp/pom.xml b/students/281918307/ood-srp/pom.xml
new file mode 100644
index 0000000000..cfd98a73b1
--- /dev/null
+++ b/students/281918307/ood-srp/pom.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>com.ood</groupId>
+        <artifactId>ood-application</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>ood-srp</artifactId>
+    <packaging>jar</packaging>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+        </dependency>
+    </dependencies>
+
+    
+</project>
\ No newline at end of file
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java
new file mode 100644
index 0000000000..f8b7fdd190
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java
@@ -0,0 +1,14 @@
+package com.ood.srp;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public class Application {
+    static final Logger logger = Logger.getLogger(Application.class);
+
+    public static void main(String [] args) {
+        logger.error("Application running ...");
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/resources/log4j.properties b/students/281918307/ood-srp/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..508df51466
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/resources/log4j.properties
@@ -0,0 +1,8 @@
+log4j.rootLogger=debug, stdout
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %l - %m%n
+
+# Third party loggers
+ log4j.logger.com.ood=debug
diff --git a/students/281918307/pom.xml b/students/281918307/pom.xml
index 9b7eac3299..cfbb6af460 100644
--- a/students/281918307/pom.xml
+++ b/students/281918307/pom.xml
@@ -11,6 +11,7 @@
 
     <modules>
         <module>ood-ocp</module>
+        <module>ood-srp</module>
     </modules>
 
 

From 899f5296ce91dff60f08c15932a1c0553816096a Mon Sep 17 00:00:00 2001
From: johnChnia <zhouqiang847@gmail.com>
Date: Tue, 20 Jun 2017 14:38:09 +0800
Subject: [PATCH 238/332] =?UTF-8?q?=E5=AE=8C=E6=88=90ocp=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 13 ++++++++++++
 .../com/coderising/ood/ocp/FormatByDate.java  | 12 +++++++++++
 .../com/coderising/ood/ocp/FormatByRaw.java   | 11 ++++++++++
 .../com/coderising/ood/ocp/FormatLog.java     |  9 ++++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 21 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 12 +++++++++++
 .../java/com/coderising/ood/ocp/README.md     |  4 ++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 11 ++++++++++
 .../java/com/coderising/ood/ocp/SendLog.java  |  8 +++++++
 .../com/coderising/ood/ocp/SendLogByMail.java | 11 ++++++++++
 .../coderising/ood/ocp/SendLogByPrint.java    | 11 ++++++++++
 .../com/coderising/ood/ocp/SendLogBySMS.java  | 11 ++++++++++
 .../java/com/coderising/ood/srp/README.md     |  4 ++++
 13 files changed, 138 insertions(+)
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByDate.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByRaw.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatLog.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/README.md
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLog.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByMail.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByPrint.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogBySMS.java
 create mode 100644 students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/README.md

diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..ba80f9de7d
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class DateUtil {
+
+    public static String getCurrentDateAsString() {
+
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByDate.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByDate.java
new file mode 100644
index 0000000000..8fcc9464cf
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByDate.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class FormatByDate implements FormatLog {
+    @Override
+    public String format(String msg) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        return txtDate + ": " + msg;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByRaw.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByRaw.java
new file mode 100644
index 0000000000..7f66cf725f
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatByRaw.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class FormatByRaw implements FormatLog {
+    @Override
+    public String format(String msg) {
+        return msg;
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatLog.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatLog.java
new file mode 100644
index 0000000000..6349f02b13
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/FormatLog.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public interface FormatLog {
+
+    String format(String msg);
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..e107cfd906
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class Logger {
+    private FormatLog formatLog;
+    private SendLog sendLog;
+
+    public Logger(FormatLog f, SendLog s) {
+        this.formatLog = f;
+        this.sendLog = s;
+    }
+
+    public void log(String msg) {
+
+        String logMsg = formatLog.format(msg);
+        sendLog.send(logMsg);
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..42657a6066
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class MailUtil {
+
+    public static void send(String logMsg) {
+        // TODO Auto-generated method stub
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/README.md b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/README.md
new file mode 100644
index 0000000000..35b2240cbd
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/README.md
@@ -0,0 +1,4 @@
+ocp(开闭原则)：
+一个软件实体如类、模块和函数应该对扩展开放，对修改关闭。
+
+
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..3b2add666c
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class SMSUtil {
+    public static void send(String logMsg) {
+        // TODO Auto-generated method stub
+
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLog.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLog.java
new file mode 100644
index 0000000000..e9a2ed4c30
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLog.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public interface SendLog {
+    void send(String msg);
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByMail.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByMail.java
new file mode 100644
index 0000000000..047aab0bd9
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByMail.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class SendLogByMail implements SendLog {
+    @Override
+    public void send(String msg) {
+        MailUtil.send(msg);
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByPrint.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByPrint.java
new file mode 100644
index 0000000000..86be0bc442
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogByPrint.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class SendLogByPrint implements SendLog {
+    @Override
+    public void send(String msg) {
+        System.out.println(msg);
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogBySMS.java b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogBySMS.java
new file mode 100644
index 0000000000..0898cb2f27
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SendLogBySMS.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by john on 2017/6/20.
+ */
+public class SendLogBySMS implements SendLog {
+    @Override
+    public void send(String msg) {
+        SMSUtil.send(msg);
+    }
+}
diff --git a/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/README.md b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/README.md
new file mode 100644
index 0000000000..34afa8edb8
--- /dev/null
+++ b/students/315863321/ood/ood-assignment/src/main/java/com/coderising/ood/srp/README.md
@@ -0,0 +1,4 @@
+srp（单一职责原则）：
+应该有且仅有一个原因引起类的变更,也就是接口或类和职责的关系是一一对应的。
+
+

From b1d7d953e51a74e51acd4c753596554e77b53e8a Mon Sep 17 00:00:00 2001
From: Tony-Hu <tony.hu1213@gmail.com>
Date: Tue, 20 Jun 2017 00:33:30 -0700
Subject: [PATCH 239/332] SRP

---
 students/370677080/ood-assignment/pom.xml     | 37 +++++++
 .../coderising/ood/srp/DO/ProductDetail.java  | 26 +++++
 .../com/coderising/ood/srp/DO/UserInfo.java   | 29 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 43 ++++++++
 .../com/coderising/ood/srp/util/DBUtil.java   | 38 ++++++++
 .../com/coderising/ood/srp/util/FileUtil.java | 49 ++++++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 97 +++++++++++++++++++
 students/370677080/ood-assignment/test.txt    |  5 +
 8 files changed, 324 insertions(+)
 create mode 100644 students/370677080/ood-assignment/pom.xml
 create mode 100644 students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
 create mode 100644 students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
 create mode 100644 students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 create mode 100644 students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 students/370677080/ood-assignment/test.txt

diff --git a/students/370677080/ood-assignment/pom.xml b/students/370677080/ood-assignment/pom.xml
new file mode 100644
index 0000000000..d1ed73a0bf
--- /dev/null
+++ b/students/370677080/ood-assignment/pom.xml
@@ -0,0 +1,37 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+      <dependency>
+          <groupId>org.jetbrains</groupId>
+          <artifactId>annotations-java5</artifactId>
+          <version>RELEASE</version>
+      </dependency>
+
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
new file mode 100644
index 0000000000..7b3041a000
--- /dev/null
+++ b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/ProductDetail.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.DO;
+
+/**
+ * 产品信息数据类。
+ * @since 06.18.2017
+ */
+public class ProductDetail {
+    private String id;
+    private String description;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff --git a/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
new file mode 100644
index 0000000000..14eff3c68a
--- /dev/null
+++ b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/DO/UserInfo.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.DO;
+
+/**
+ * 用户数据类。
+ * @since 06.18.2017
+ */
+public class UserInfo {
+    private String name;
+    private String email;
+    private String productDesc;
+
+    public UserInfo(String name, String email, String productDesc){
+        this.name = name;
+        this.email = email;
+        this.productDesc = productDesc;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..2ec66a4d47
--- /dev/null
+++ b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,43 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.DO.ProductDetail;
+import com.coderising.ood.srp.DO.UserInfo;
+import com.coderising.ood.srp.util.DBUtil;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+
+/**
+ * 程序入口点。
+ * @since 06.19.2017
+ */
+public class PromotionMail {
+
+    public static void main(String[] args){
+        final String FILE_PATH = "test.txt";
+        FileUtil fileUtil;
+
+        //尝试打开促销文件
+        try {
+            fileUtil = new FileUtil(FILE_PATH);
+        } catch (FileNotFoundException e){
+            System.out.println("促销文件打开失败，请确认文件路径！");
+            return;
+        }
+
+        sendAllEMails(fileUtil);
+
+        fileUtil.close();
+    }
+
+
+    private static void sendAllEMails(FileUtil fileUtil){
+        while (fileUtil.hasNext()) {
+            ProductDetail productDetail = fileUtil.getNextProduct();
+            List<UserInfo> usersList = DBUtil.query(productDetail);
+            MailUtil.sendEmails(usersList);
+        }
+    }
+}
diff --git a/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..e1e0012855
--- /dev/null
+++ b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp.util;
+import com.coderising.ood.srp.DO.ProductDetail;
+import com.coderising.ood.srp.DO.UserInfo;
+
+import java.util.*;
+
+/**
+ * 数据库操作类。
+ * 管理数据库连接，查询等操作。
+ * @since 06.19.2017
+ */
+public class DBUtil {
+
+	//TODO 此处添加数据库连接信息
+
+
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * 给一个产品详情，返回一个Array List记载所有订阅该产品的用户信息（名字，邮箱，订阅的产品名称）。
+	 * @param productDetail 传产品详情。产品id用来查询数据库。产品名称用于和用户信息绑定
+	 * @return 返回数据库中所有的查询到的结果。
+	 */
+	public static List<UserInfo> query(ProductDetail productDetail){
+		if (productDetail == null || productDetail.getId() == null)
+			return new ArrayList<>();
+
+		String sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productDetail.getId() +"' "
+				+ "and send_mail=1 ";
+		//假装用sendMilQuery查了数据库，生成了userList作为查询结果
+		List<UserInfo> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			UserInfo newInfo = new UserInfo("User" + i,"aa@bb.com", productDetail.getDescription());
+			userList.add(newInfo);
+		}
+		return userList;
+	}
+}
diff --git a/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..991f81a537
--- /dev/null
+++ b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp.util;
+
+
+import com.coderising.ood.srp.DO.ProductDetail;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+/**
+ * 文件操作类。
+ * 负责文件句柄的维护。
+ * 此类会打开促销文件，促销文件默认按照：
+ * "id" 空格 "产品名称"
+ * 进行存储，每行一条促销信息。
+ * @since 06.19.2017
+ */
+public class FileUtil {
+    private Scanner scanner;
+
+
+    public FileUtil(String filePath) throws FileNotFoundException {
+       scanner = new Scanner(new File(filePath));
+    }
+
+    public ProductDetail getNextProduct(){
+        String wholeInfo;
+        ProductDetail nextProduct = new ProductDetail();
+        wholeInfo = scanner.nextLine();
+
+        String[] splitInfo = wholeInfo.split(" ");
+        if (splitInfo.length < 2)
+            return nextProduct;
+
+        //促销文件按照 - "id" 空格 "产品名称" 进行记录的
+        nextProduct.setId(splitInfo[0]);
+        nextProduct.setDescription(splitInfo[1]);
+
+        return nextProduct;
+    }
+
+    public boolean hasNext(){
+        return scanner.hasNextLine();
+    }
+
+    public void close(){
+        scanner.close();
+    }
+}
diff --git a/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..065286d4f9
--- /dev/null
+++ b/students/370677080/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,97 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.DO.UserInfo;
+
+import java.util.List;
+
+
+/**
+ * 邮件发送类。
+ * 管理邮箱连接，发送等操作。
+ * @since 06.19.2017
+ */
+public class MailUtil {
+
+    /**
+     * SMTP连接失败异常。
+     * 可用getMessage()获得异常内容。
+     */
+    public static class SMTPConnectionFailedException extends Throwable{
+        public SMTPConnectionFailedException(String message){
+            super(message);
+        }
+    }
+
+    /**
+     * 主SMTP服务器地址
+     */
+	public static final String SMTP_SERVER = "smtp.163.com";
+
+    /**
+     * 备用SMTP服务器地址
+     */
+	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
+
+    /**
+     * 以哪个邮箱地址发送给用户
+     */
+	public static final String EMAIL_ADMIN = "admin@company.com";
+
+
+    /**
+     * 邮件发送操作。
+     * 将降价促销邮件逐个发送给用户信息表中对应的用户。
+     * 捕获SMTPConnectionFailedException。提示手动发送。并继续发送下一封邮件。
+     * @param usersList 用户信息表。包含用户姓名，邮箱和订阅产品名称。
+     */
+	public static void sendEmails(List<UserInfo> usersList){
+		if (usersList == null) {
+			System.out.println("没有邮件发送");
+			return;
+		}
+
+		for (UserInfo info : usersList){
+			if (!info.getEmail().isEmpty()) {
+				String emailInfo = generatePromotionEmail(info);
+				try {
+                    sendPromotionEmail(emailInfo);
+                } catch (SMTPConnectionFailedException e){
+                    System.out.println("SMTP主副服务器连接失败，请手动发送以下邮件： \n");
+                    System.out.println(e.getMessage());
+                }
+			}
+		}
+	}
+
+    /**
+     * 假装在发邮件。默认使用主SMTP发送，若发送失败则使用备用SMTP发送。
+     * 仍然失败，则抛出SMTPConnectFailException异常。
+     * @param emailInfo 要发送的邮件内容
+     * @throws SMTPConnectionFailedException 若主副SMTP服务器均连接失败，抛出异常。异常中包含完整的发送失败的邮件内容。可通过getMessage()方法获得邮件内容。
+     */
+	private static void sendPromotionEmail(String emailInfo) throws SMTPConnectionFailedException{
+		//默认以SMTP_SERVER 发送
+		//如果发送失败以ALT_SMTP_SERVER 重新发送
+		//如果还失败，throw new SMTPConnectionFailedException(emailInfo).
+	}
+
+    /**
+     * 根据用户信息生成促销邮件内容。
+     * @param userInfo 用户信息。
+     * @return 返回生成的邮件。
+     */
+	private static String generatePromotionEmail(UserInfo userInfo){
+		StringBuilder buffer = new StringBuilder();
+
+		buffer.append("From:").append(EMAIL_ADMIN).append("\n");
+		buffer.append("To:").append(userInfo.getEmail()).append("\n");
+		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+		buffer.append("Content:").append("尊敬的").append(userInfo.getName());
+		buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
+		buffer.append(" 降价了，欢迎购买!").append("\n");
+
+		System.out.println(buffer.toString());
+
+		return buffer.toString();
+	}
+}
diff --git a/students/370677080/ood-assignment/test.txt b/students/370677080/ood-assignment/test.txt
new file mode 100644
index 0000000000..cb2d21edc4
--- /dev/null
+++ b/students/370677080/ood-assignment/test.txt
@@ -0,0 +1,5 @@
+P8756 iPhone8
+P3946 XiaoMi10
+P8904 Oppo_R15
+P4955 Vivo_X20
+p123

From c0972747432c9672b62658ebf453a2069bdb0474 Mon Sep 17 00:00:00 2001
From: "wangxg922@chinaunincom.cn" <wangxg922@chinaunincom.cn>
Date: Tue, 20 Jun 2017 15:49:03 +0800
Subject: [PATCH 240/332] =?UTF-8?q?Signed-off-by:=20=E4=B8=A4=E6=AC=A1ood?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=8F=90=E4=BA=A4996108220@qq.com?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/com/coderising/ood/ocp/DateUtil.java  | 11 +++
 .../src/com/coderising/ood/ocp/EmailLog.java  | 11 +++
 .../src/com/coderising/ood/ocp/LogMethod.java |  6 ++
 .../src/com/coderising/ood/ocp/LogType.java   |  6 ++
 .../src/com/coderising/ood/ocp/Logger.java    | 19 +++++
 .../src/com/coderising/ood/ocp/MailUtil.java  | 10 +++
 .../src/com/coderising/ood/ocp/PrintLog.java  | 11 +++
 .../src/com/coderising/ood/ocp/RawLog.java    | 10 +++
 .../coderising/ood/ocp/RawLogWithData.java    | 12 +++
 .../src/com/coderising/ood/ocp/SMSUtil.java   | 10 +++
 .../src/com/coderising/ood/ocp/SmsLog.java    | 10 +++
 .../coderising/ood/ocp/good/Formatter.java    |  7 ++
 .../ood/ocp/good/FormatterFactory.java        | 13 ++++
 .../ood/ocp/good/HtmlFormatter.java           | 11 +++
 .../com/coderising/ood/ocp/good/Logger.java   | 18 +++++
 .../coderising/ood/ocp/good/RawFormatter.java | 11 +++
 .../com/coderising/ood/ocp/good/Sender.java   |  7 ++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../src/com/coderising/ood/srp/DBUtil.java    | 38 ++++++++++
 .../src/com/coderising/ood/srp/MailUtil.java  | 74 +++++++++++++++++++
 .../com/coderising/ood/srp/ProductUtil.java   | 39 ++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 49 ++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 24 files changed, 419 insertions(+)
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/EmailLog.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/LogMethod.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/LogType.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/PrintLog.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/RawLog.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/SmsLog.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/good/Formatter.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/good/FormatterFactory.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/good/HtmlFormatter.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/good/Logger.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/good/RawFormatter.java
 create mode 100644 students/996108220/src/com/coderising/ood/ocp/good/Sender.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/ProductUtil.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/996108220/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/996108220/src/com/coderising/ood/ocp/DateUtil.java b/students/996108220/src/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..13369f5684
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/DateUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class DateUtil {
+
+	
+	public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/EmailLog.java b/students/996108220/src/com/coderising/ood/ocp/EmailLog.java
new file mode 100644
index 0000000000..20eb93ac9d
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/EmailLog.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class EmailLog implements LogMethod{
+	int method = 1;
+	@Override
+	public void logBehavior(String logMsg) {
+		
+		MailUtil.send(logMsg);
+	}
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/LogMethod.java b/students/996108220/src/com/coderising/ood/ocp/LogMethod.java
new file mode 100644
index 0000000000..69677d8c89
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/LogMethod.java
@@ -0,0 +1,6 @@
+package com.coderising.ood.ocp;
+
+public interface LogMethod {
+	int method = 0;
+	public abstract void logBehavior(String logMsg);
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/LogType.java b/students/996108220/src/com/coderising/ood/ocp/LogType.java
new file mode 100644
index 0000000000..bd6de81087
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/LogType.java
@@ -0,0 +1,6 @@
+package com.coderising.ood.ocp;
+
+public interface LogType {
+	int type = 0;
+	public abstract String getLogMsg(String msg) ;
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/Logger.java b/students/996108220/src/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..e0105f9b23
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+	
+	public LogType logType;
+	public LogMethod logMethod;
+			
+	public Logger(LogType logType, LogMethod logMethod){
+		this.logType = logType;
+		this.logMethod = logMethod;		
+	}
+	public void log(String msg){
+		
+		String logMsg = logType.getLogMsg(msg);
+		logMethod.logBehavior(logMsg);
+		
+	}
+}
+
diff --git a/students/996108220/src/com/coderising/ood/ocp/MailUtil.java b/students/996108220/src/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/PrintLog.java b/students/996108220/src/com/coderising/ood/ocp/PrintLog.java
new file mode 100644
index 0000000000..b2391ecd52
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/PrintLog.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class PrintLog implements LogMethod{
+	int method = 3;
+	@Override
+	public void logBehavior(String logMsg) {
+		System.out.println(logMsg);
+		
+	}
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/RawLog.java b/students/996108220/src/com/coderising/ood/ocp/RawLog.java
new file mode 100644
index 0000000000..0ac45244c8
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/RawLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class RawLog implements LogType{
+	int type = 1;
+	@Override
+	public String getLogMsg(String msg) {
+		return msg;
+	}
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java b/students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java
new file mode 100644
index 0000000000..280fb3b54f
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/RawLogWithData.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class RawLogWithData implements LogType{
+	int type = 2;
+	@Override
+	public String getLogMsg(String msg) {
+		String txtDate = DateUtil.getCurrentDateAsString();
+		String logMsg = txtDate + ": " + msg;
+		return logMsg;
+	}
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/SMSUtil.java b/students/996108220/src/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/SmsLog.java b/students/996108220/src/com/coderising/ood/ocp/SmsLog.java
new file mode 100644
index 0000000000..e61938d844
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/ocp/SmsLog.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class SmsLog implements LogMethod{
+	int method = 2;
+	@Override
+	public void logBehavior(String logMsg) {
+		SMSUtil.send(logMsg);
+	}
+
+}
diff --git a/students/996108220/src/com/coderising/ood/ocp/good/Formatter.java b/students/996108220/src/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/good/FormatterFactory.java b/students/996108220/src/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/996108220/src/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/good/Logger.java b/students/996108220/src/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/good/RawFormatter.java b/students/996108220/src/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/ocp/good/Sender.java b/students/996108220/src/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/srp/Configuration.java b/students/996108220/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/996108220/src/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<String,String> 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/996108220/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/996108220/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/996108220/src/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/996108220/src/com/coderising/ood/srp/DBUtil.java b/students/996108220/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..683ce1712e
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	static ProductUtil productUtil=new ProductUtil();
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @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;
+	}
+	protected static List loadMailingList() throws Exception {
+		
+		String sendMailQuery = LoadQuery();		
+		return DBUtil.query(sendMailQuery);
+	}
+	protected static String LoadQuery() throws Exception {
+		String productID = productUtil.getProductID();
+		System.out.println("loadQuery set");
+		return "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";		
+		
+	}
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/MailUtil.java b/students/996108220/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..38ad395d83
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,74 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MailUtil {
+	
+	private static Configuration config=new Configuration(); ;
+	private static ProductUtil productUtil = new ProductUtil();
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	protected static void sendEmail(String userName,String toAddress,String smtpHost,Boolean debug) throws IOException 
+	{
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 "+userName+", 您关注的产品 " + productUtil.getProductDesc() + " 降价了，欢迎购买!" ;
+		String fromAddress=config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+		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);
+	}
+	
+
+
+	private static void sendEmail(String userName,String toAddress,Boolean debug) {
+		try 
+		{
+			String smtpHost=config.getProperty(ConfigurationKeys.SMTP_SERVER);
+			sendEmail( userName,toAddress,smtpHost, debug);
+		} 
+		catch (Exception e) 
+		{
+			
+			try {
+				String altSmtpHost=config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+				sendEmail( userName,toAddress,altSmtpHost, debug);
+				
+			} catch (Exception e2) 
+			{
+				System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+			}
+		}
+	}
+
+	protected static void  sendEMails(boolean debug,List mailingList) throws IOException 
+	{
+
+		System.out.println("开始发送邮件");
+	
+       
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				HashMap<String, String> userInfo = (HashMap<String, String>)iter.next();
+				String userName = userInfo.get(NAME_KEY);
+				String toAddress = userInfo.get(EMAIL_KEY);
+				sendEmail( userName, toAddress, debug);
+			}	
+		}
+
+		else {
+			System.out.println("没有邮件发送");	
+		}
+
+	}
+
+	
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/ProductUtil.java b/students/996108220/src/com/coderising/ood/srp/ProductUtil.java
new file mode 100644
index 0000000000..be40fd203c
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/ProductUtil.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductUtil {
+	private String productConfigPath="D:\\JavaCoding\\students\\996108220\\src"
+			+ "\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+	private String[] readFile() throws IOException // @02C
+	{
+		File file=new File(productConfigPath);
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");;
+			return data;
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+
+	public String getProductID() throws IOException {
+		String[] data= readFile();
+		return data[0];
+	}
+
+	public String getProductDesc() throws IOException {
+		String[] data= readFile();
+		return data[1];
+	}
+	
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/PromotionMail.java b/students/996108220/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..2795a54b2a
--- /dev/null
+++ b/students/996108220/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,49 @@
+ package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class PromotionMail {
+
+	//读取用户信息
+	
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+		
+
+	public static void main(String[] args) throws Exception {
+
+		boolean emailDebug = false;
+		PromotionMail pe = new PromotionMail();
+		List userInfo = DBUtil.loadMailingList();
+		List mailingList = pe.filterUserInfo(userInfo);
+		MailUtil.sendEMails(emailDebug, mailingList);	
+	}
+
+	
+
+
+	protected List filterUserInfo(List userList) throws IOException 
+	{
+	
+		if (userList != null) {
+			Iterator iter = userList.iterator();
+			while (iter.hasNext()) {
+				HashMap<String, String> userInfo = (HashMap<String, String>)iter.next();
+				String userName = userInfo.get(NAME_KEY);
+				String toAddress = userInfo.get(EMAIL_KEY);
+				if (toAddress.length() <= 0) 
+					userInfo.remove(userInfo);
+			}	
+		}
+		return userList;
+		
+	}
+
+
+	
+	
+}
diff --git a/students/996108220/src/com/coderising/ood/srp/product_promotion.txt b/students/996108220/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/996108220/src/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

From c795b439753c8a8805c6c55f6557aa10c43a327d Mon Sep 17 00:00:00 2001
From: zhizx <zhizx@bbtree.com>
Date: Tue, 20 Jun 2017 18:11:48 +0800
Subject: [PATCH 241/332] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/919442958/README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/919442958/README.md

diff --git a/students/919442958/README.md b/students/919442958/README.md
new file mode 100644
index 0000000000..60472c8281
--- /dev/null
+++ b/students/919442958/README.md
@@ -0,0 +1 @@
+这是919442958的作业。 
\ No newline at end of file

From 6a71fd336dddb0944256090a25d011fcd922f837 Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Tue, 20 Jun 2017 18:35:12 +0800
Subject: [PATCH 242/332] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=B4=A3=E4=BB=BB?=
 =?UTF-8?q?=E5=8C=85=EF=BC=8C=E6=8E=A5=E5=8F=A3=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/281918307/ood-srp/pom.xml            | 58 +++++++++--
 .../main/java/com/ood/srp/Application.java    | 18 ++--
 .../java/com/ood/srp/file/FileService.java    | 18 ++++
 .../java/com/ood/srp/mail/Configuration.java  | 23 +++++
 .../com/ood/srp/mail/ConfigurationKeys.java   |  9 ++
 .../java/com/ood/srp/mail/MailService.java    |  8 ++
 .../com/ood/srp/product/ProductDetail.java    | 26 +++++
 .../ood/srp/product/ProductDetailService.java |  9 ++
 .../ood/srp/promotion/PromotionService.java   | 31 ++++++
 .../main/java/com/ood/srp/user/UserInfo.java  | 29 ++++++
 .../com/ood/srp/user/UserInfoService.java     |  9 ++
 .../main/java/com/ood/srp/util/DBUtil.java    | 43 ++++++++
 .../main/java/com/ood/srp/util/FileUtil.java  | 50 ++++++++++
 .../main/java/com/ood/srp/util/MailUtil.java  | 97 +++++++++++++++++++
 .../src/main/resources/application.properties |  2 +
 students/281918307/pom.xml                    | 27 ++++++
 16 files changed, 443 insertions(+), 14 deletions(-)
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java
 create mode 100644 students/281918307/ood-srp/src/main/resources/application.properties

diff --git a/students/281918307/ood-srp/pom.xml b/students/281918307/ood-srp/pom.xml
index cfd98a73b1..13db2a5ad0 100644
--- a/students/281918307/ood-srp/pom.xml
+++ b/students/281918307/ood-srp/pom.xml
@@ -14,18 +14,62 @@
     <artifactId>ood-srp</artifactId>
     <packaging>jar</packaging>
 
-
     <dependencies>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
         <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
         </dependency>
     </dependencies>
 
-    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.dajia.customization.Application</mainClass>
+                    <jvmArguments>-Dfile.encoding=${project.build.sourceEncoding}</jvmArguments>
+                    <!-- fork :  如果没有该项配置，肯呢个devtools不会起作用，即应用不会restart  -->
+                    <fork>true</fork>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java
index f8b7fdd190..bc76120dd9 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/Application.java
@@ -1,14 +1,18 @@
 package com.ood.srp;
 
-import org.apache.log4j.Logger;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.ComponentScan;
 
 /**
- * Created by ajaxfeng on 2017/6/20.
+ * Created by ajaxfeng on 2017/4/28.
  */
+@SpringBootApplication
+@EnableConfigurationProperties
+@ComponentScan("com.ood.srp")
 public class Application {
-    static final Logger logger = Logger.getLogger(Application.class);
-
-    public static void main(String [] args) {
-        logger.error("Application running ...");
+    public static void main(String[] args) throws Exception {
+        SpringApplication.run(Application.class, args);
     }
-}
+}
\ No newline at end of file
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java
new file mode 100644
index 0000000000..301bb6d845
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java
@@ -0,0 +1,18 @@
+package com.ood.srp.file;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * 读取文件内容
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public interface FileService {
+
+    /**
+     * 读取文件内容，放到List内
+     * @param file
+     * @return
+     */
+    List<String> readFile(File file);
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java
new file mode 100644
index 0000000000..48ea71dec5
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java
@@ -0,0 +1,23 @@
+package com.ood.srp.mail;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java
new file mode 100644
index 0000000000..74cc19304a
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.ood.srp.mail;
+
+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/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java
new file mode 100644
index 0000000000..55ddcffc56
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java
@@ -0,0 +1,8 @@
+package com.ood.srp.mail;
+
+/**
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public interface MailService {
+
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java
new file mode 100644
index 0000000000..edcce88eee
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java
@@ -0,0 +1,26 @@
+package com.ood.srp.product;
+
+/**
+ * 产品信息数据类。
+ * @since 06.18.2017
+ */
+public class ProductDetail {
+    private String id;
+    private String description;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java
new file mode 100644
index 0000000000..1bc54a563a
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java
@@ -0,0 +1,9 @@
+package com.ood.srp.product;
+
+/**
+ * 产品信息
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public interface ProductDetailService {
+
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java
new file mode 100644
index 0000000000..9ce8a39fe0
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java
@@ -0,0 +1,31 @@
+package com.ood.srp.promotion;
+
+import com.ood.srp.product.ProductDetail;
+import com.ood.srp.user.UserInfo;
+
+import java.util.List;
+
+/**
+ * 促销处理类
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public interface PromotionService {
+    /**
+     * 获取产品信息
+     * @return
+     */
+    List<ProductDetail> getPromotionProduct();
+
+    /**
+     * 获取用户信息
+     * @return
+     */
+    List<UserInfo> getPromotionUserInfo();
+
+    /**
+     * 发送促销信息
+     * @return
+     */
+    List<String> sendPromotionInfo();
+
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java
new file mode 100644
index 0000000000..65cc00ea39
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java
@@ -0,0 +1,29 @@
+package com.ood.srp.user;
+
+/**
+ * 用户数据类。
+ * @since 06.18.2017
+ */
+public class UserInfo {
+    private String name;
+    private String email;
+    private String productDesc;
+
+    public UserInfo(String name, String email, String productDesc){
+        this.name = name;
+        this.email = email;
+        this.productDesc = productDesc;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java
new file mode 100644
index 0000000000..e828597d4d
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java
@@ -0,0 +1,9 @@
+package com.ood.srp.user;
+
+/**
+ * 用户逻辑
+ * Created by ajaxfeng on 2017/6/20.
+ */
+public interface UserInfoService {
+
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java
new file mode 100644
index 0000000000..820bbb5dcf
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java
@@ -0,0 +1,43 @@
+package com.ood.srp.util;
+
+
+import com.ood.srp.product.ProductDetail;
+import com.ood.srp.user.UserInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 数据库操作类。
+ * 管理数据库连接，查询等操作。
+ *
+ * @since 06.19.2017
+ */
+public class DBUtil {
+
+    //TODO 此处添加数据库连接信息
+
+
+    /**
+     * 应该从数据库读， 但是简化为直接生成。
+     * 给一个产品详情，返回一个Array List记载所有订阅该产品的用户信息（名字，邮箱，订阅的产品名称）。
+     *
+     * @param productDetail 传产品详情。产品id用来查询数据库。产品名称用于和用户信息绑定
+     * @return 返回数据库中所有的查询到的结果。
+     */
+    public static List<UserInfo> query(ProductDetail productDetail) {
+        if (productDetail == null || productDetail.getId() == null)
+            return new ArrayList<>();
+
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productDetail.getId() + "' "
+                + "and send_mail=1 ";
+        //假装用sendMilQuery查了数据库，生成了userList作为查询结果
+        List<UserInfo> userList = new ArrayList<>();
+        for (int i = 1; i <= 3; i++) {
+            UserInfo newInfo = new UserInfo("User" + i, "aa@bb.com", productDetail.getDescription());
+            userList.add(newInfo);
+        }
+        return userList;
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..060ef0287a
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java
@@ -0,0 +1,50 @@
+package com.ood.srp.util;
+
+
+
+import com.ood.srp.product.ProductDetail;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+/**
+ * 文件操作类。
+ * 负责文件句柄的维护。
+ * 此类会打开促销文件，促销文件默认按照：
+ * "id" 空格 "产品名称"
+ * 进行存储，每行一条促销信息。
+ * @since 06.19.2017
+ */
+public class FileUtil {
+    private Scanner scanner;
+
+
+    public FileUtil(String filePath) throws FileNotFoundException {
+       scanner = new Scanner(new File(filePath));
+    }
+
+    public ProductDetail getNextProduct(){
+        String wholeInfo;
+        ProductDetail nextProduct = new ProductDetail();
+        wholeInfo = scanner.nextLine();
+
+        String[] splitInfo = wholeInfo.split(" ");
+        if (splitInfo.length < 2)
+            return nextProduct;
+
+        //促销文件按照 - "id" 空格 "产品名称" 进行记录的
+        nextProduct.setId(splitInfo[0]);
+        nextProduct.setDescription(splitInfo[1]);
+
+        return nextProduct;
+    }
+
+    public boolean hasNext(){
+        return scanner.hasNextLine();
+    }
+
+    public void close(){
+        scanner.close();
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..2f3463e1d8
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java
@@ -0,0 +1,97 @@
+package com.ood.srp.util;
+
+
+import com.ood.srp.user.UserInfo;
+
+import java.util.List;
+
+/**
+ * 邮件发送类。
+ * 管理邮箱连接，发送等操作。
+ * @since 06.19.2017
+ */
+public class MailUtil {
+
+    /**
+     * SMTP连接失败异常。
+     * 可用getMessage()获得异常内容。
+     */
+    public static class SMTPConnectionFailedException extends Throwable{
+        public SMTPConnectionFailedException(String message){
+            super(message);
+        }
+    }
+
+    /**
+     * 主SMTP服务器地址
+     */
+	public static final String SMTP_SERVER = "smtp.163.com";
+
+    /**
+     * 备用SMTP服务器地址
+     */
+	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
+
+    /**
+     * 以哪个邮箱地址发送给用户
+     */
+	public static final String EMAIL_ADMIN = "admin@company.com";
+
+
+    /**
+     * 邮件发送操作。
+     * 将降价促销邮件逐个发送给用户信息表中对应的用户。
+     * 捕获SMTPConnectionFailedException。提示手动发送。并继续发送下一封邮件。
+     * @param usersList 用户信息表。包含用户姓名，邮箱和订阅产品名称。
+     */
+	public static void sendEmails(List<UserInfo> usersList){
+		if (usersList == null) {
+			System.out.println("没有邮件发送");
+			return;
+		}
+
+		for (UserInfo info : usersList){
+			if (!info.getEmail().isEmpty()) {
+				String emailInfo = generatePromotionEmail(info);
+				try {
+                    sendPromotionEmail(emailInfo);
+                } catch (SMTPConnectionFailedException e){
+                    System.out.println("SMTP主副服务器连接失败，请手动发送以下邮件： \n");
+                    System.out.println(e.getMessage());
+                }
+			}
+		}
+	}
+
+    /**
+     * 假装在发邮件。默认使用主SMTP发送，若发送失败则使用备用SMTP发送。
+     * 仍然失败，则抛出SMTPConnectFailException异常。
+     * @param emailInfo 要发送的邮件内容
+     * @throws SMTPConnectionFailedException 若主副SMTP服务器均连接失败，抛出异常。异常中包含完整的发送失败的邮件内容。可通过getMessage()方法获得邮件内容。
+     */
+	private static void sendPromotionEmail(String emailInfo) throws SMTPConnectionFailedException{
+		//默认以SMTP_SERVER 发送
+		//如果发送失败以ALT_SMTP_SERVER 重新发送
+		//如果还失败，throw new SMTPConnectionFailedException(emailInfo).
+	}
+
+    /**
+     * 根据用户信息生成促销邮件内容。
+     * @param userInfo 用户信息。
+     * @return 返回生成的邮件。
+     */
+	private static String generatePromotionEmail(UserInfo userInfo){
+		StringBuilder buffer = new StringBuilder();
+
+		buffer.append("From:").append(EMAIL_ADMIN).append("\n");
+		buffer.append("To:").append(userInfo.getEmail()).append("\n");
+		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+		buffer.append("Content:").append("尊敬的").append(userInfo.getName());
+		buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
+		buffer.append(" 降价了，欢迎购买!").append("\n");
+
+		System.out.println(buffer.toString());
+
+		return buffer.toString();
+	}
+}
diff --git a/students/281918307/ood-srp/src/main/resources/application.properties b/students/281918307/ood-srp/src/main/resources/application.properties
new file mode 100644
index 0000000000..a7e97d369d
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+server.port=8080
+spring.application.name=ood-srp
diff --git a/students/281918307/pom.xml b/students/281918307/pom.xml
index cfbb6af460..61717fdeb7 100644
--- a/students/281918307/pom.xml
+++ b/students/281918307/pom.xml
@@ -15,14 +15,41 @@
     </modules>
 
 
+    <repositories>
+        <repository>
+            <id>aliyun maven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+        </repository>
+        <repository>
+            <id>maven.nuxeo.org</id>
+            <url>http://maven.nuxeo.org/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+
+
     <properties>
+        <!-- define encoding for source, resources and javadoc-->
         <encoding>UTF-8</encoding>
+        <!-- define java compile level-->
         <compile.version>1.8</compile.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <spring.boot.version>1.5.3.RELEASE</spring.boot.version>
     </properties>
 
 
     <dependencyManagement>
+
         <dependencies>
+
+            <dependency>
+                <!-- Import dependency management from Spring Boot -->
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring.boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>

From 5d605f40ceb1e9e25847b0164a8da74618cd701b Mon Sep 17 00:00:00 2001
From: mac_ck <chenkai19950130@126.com>
Date: Tue, 20 Jun 2017 21:58:21 +0800
Subject: [PATCH 243/332] finish srp and ocp homework

---
 students/471398827/ood-assignment/pom.xml     | 32 +++++++++
 .../java/com/coderising/ood/ocp/Config.java   | 12 ++++
 .../com/coderising/ood/ocp/DateMessage.java   | 11 ++++
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++
 .../java/com/coderising/ood/ocp/ILog.java     |  8 +++
 .../java/com/coderising/ood/ocp/IMessage.java |  8 +++
 .../com/coderising/ood/ocp/LogFactory.java    | 25 +++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 22 +++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++
 .../coderising/ood/ocp/MessageFactory.java    | 20 ++++++
 .../com/coderising/ood/ocp/PrintUtil.java     | 11 ++++
 .../com/coderising/ood/ocp/RawMessage.java    | 11 ++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 11 ++++
 .../com/coderising/ood/srp/Configuration.java | 26 ++++++++
 .../coderising/ood/srp/ConfigurationKeys.java | 10 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 +++++++
 .../java/com/coderising/ood/srp/Mail.java     | 18 +++++
 .../java/com/coderising/ood/srp/MailUtil.java | 53 +++++++++++++++
 .../java/com/coderising/ood/srp/Message.java  | 65 +++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  | 33 ++++++++++
 .../coderising/ood/srp/ProductFactory.java    | 36 ++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 51 +++++++++++++++
 .../java/com/coderising/ood/srp/User.java     | 32 +++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 24 files changed, 544 insertions(+)
 create mode 100644 students/471398827/ood-assignment/pom.xml
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/471398827/ood-assignment/pom.xml b/students/471398827/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/471398827/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
new file mode 100644
index 0000000000..13520f693c
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Config {
+    public static final int RAW_LOG = 1;
+    public static final int RAW_LOG_WITH_DATE = 2;
+    public static final int EMAIL_LOG = 1;
+    public static final int SMS_LOG = 2;
+    public static final int PRINT_LOG = 3;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
new file mode 100644
index 0000000000..cac875e053
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class DateMessage implements IMessage{
+    @Override
+    public String getMessage(String msg) {
+        return DateUtil.getCurrentDateAsString() + msg;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..e9d919c378
--- /dev/null
+++ b/students/471398827/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 "date : 8/20 ";
+	}
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
new file mode 100644
index 0000000000..40a34666b8
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public interface ILog {
+    public void printLog(String msg);
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
new file mode 100644
index 0000000000..2ec8103863
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public interface IMessage {
+    public String getMessage(String msg);
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
new file mode 100644
index 0000000000..8ba78c7b1d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.srp.Mail;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class LogFactory {
+
+    static ILog produce(int logMethod) {
+        ILog log = null;
+        switch (logMethod) {
+            case Config.EMAIL_LOG:
+                log = new MailUtil();
+                break;
+            case Config.SMS_LOG:
+                log = new SMSUtil();
+                break;
+            case Config.PRINT_LOG:
+                log = new PrintUtil();
+                break;
+        }
+        return log;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..c0579975de
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+	ILog myLog;
+	IMessage myMessage;
+			
+	public Logger(int logType, int logMethod){
+		myMessage = MessageFactory.produce(logType);
+		myLog = LogFactory.produce(logMethod);
+	}
+	public void log(String msg){
+
+		myLog.printLog(myMessage.getMessage(msg));
+
+	}
+
+	public static void main(String[] args) {
+		Logger logger = new Logger(Config.RAW_LOG_WITH_DATE, Config.EMAIL_LOG);
+		logger.log("this is a log message");
+	}
+}
+
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..76d830742a
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil implements ILog{
+
+	@Override
+	public void printLog(String msg) {
+		msg = "Mail..." + "\n" + msg;
+		System.out.println(msg);
+	}
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
new file mode 100644
index 0000000000..10faf8f6d0
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class MessageFactory {
+
+    static IMessage produce(int messageType) {
+        IMessage msg = null;
+        switch (messageType) {
+            case Config.RAW_LOG:
+                msg = new RawMessage();
+                break;
+            case Config.RAW_LOG_WITH_DATE:
+                msg = new DateMessage();
+                break;
+        }
+        return msg;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
new file mode 100644
index 0000000000..4e337a3d42
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class PrintUtil implements ILog{
+    @Override
+    public void printLog(String msg) {
+        System.out.println(msg);
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
new file mode 100644
index 0000000000..0d6c48a796
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class RawMessage implements IMessage{
+    @Override
+    public String getMessage(String msg) {
+        return msg;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..c85286a465
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil implements ILog{
+
+	@Override
+	public void printLog(String msg) {
+	    msg = "SMS..." + "\n" + msg;
+		System.out.println(msg);
+	}
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..bd0db32d2a
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String, String> configurations = new HashMap<>();
+	static boolean MAIL_DEBUG = false;
+	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");
+		configurations.put(ConfigurationKeys.FILE_PATH, "/Users/szf/git/coding2017/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+	}
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public static String getProperty(String key) {
+		
+		return configurations.get(key);
+
+	}
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..d4acd3240f
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+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";
+	public static final String FILE_PATH = "file.path";
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..140d505a65
--- /dev/null
+++ b/students/471398827/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++) {
+			String userName = "User" + i;
+			String email = "aa@bb.com";
+			User user = new User(userName, email);
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..231947248d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Mail {
+    private String host;
+
+    public Mail(String host) {
+        this.host = host;
+    }
+
+    public boolean send(Message msg) throws Exception {
+        System.out.println("Host: " + this.host);
+        msg.print();
+        return true;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..502a7d96f0
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+    private static Mail firstSMPTHost, secondSMPTHost;
+
+    static {
+		String host1 = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+		String host2 = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		firstSMPTHost = new Mail(host1);
+		secondSMPTHost = new Mail(host2);
+	}
+
+
+	public static void sendEmail(Message msg) throws Exception{
+		//假装发了一封邮件
+
+		if (msg != null) {
+
+			System.out.println("开始发送邮件");
+
+			if (msg.checkFormat()) {
+
+				System.out.println("发送邮件...");
+
+				try {
+
+					firstSMPTHost.send(msg);
+
+					System.out.println("发送邮件成功");
+
+				} catch (Exception e) {
+					try {
+
+						secondSMPTHost.send(msg);
+
+					} catch (Exception e2) {
+
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+
+					}
+				}
+			} else {
+
+				System.out.println("邮件格式不对");
+
+			}
+		} else {
+
+			System.out.println("没有邮件发送");
+
+		}
+	}
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 0000000000..a0a16d2756
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,65 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Message {
+    private String toAddress;
+    private String fromAddress;
+    private String subject;
+    private String message;
+
+    public Message(String toAddress, String fromAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.fromAddress = fromAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public void print() {
+        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());
+    }
+
+    public boolean checkFormat() {
+        return true;
+    }
+
+    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;
+    }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..5662ace67d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Product {
+    public String getProductId() {
+        return productId;
+    }
+
+    public Product(String productId, String productDesc) {
+        this.productId = productId;
+        this.productDesc = productDesc;
+    }
+
+    public Product() {
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+
+    private String productId;
+    private String productDesc;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
new file mode 100644
index 0000000000..f7366c27e4
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class ProductFactory {
+    List getNewProdcuts(File file) throws IOException {
+            BufferedReader br = null;
+            List newProducts = new ArrayList<>();
+            try {
+                br = new BufferedReader(new FileReader(file));
+                String temp = br.readLine();
+                String[] data = temp.split(" ");
+
+                Product product = new Product(data[0], data[1]);
+                newProducts.add(product);
+
+                System.out.println("产品ID = " + product.getProductId() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+            } catch (IOException e) {
+                throw new IOException(e.getMessage());
+            } finally {
+                br.close();
+            }
+            return newProducts;
+    }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..fa90f9a539
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,51 @@
+package com.coderising.ood.srp;
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) throws Exception {
+
+		PromotionMail pe = new PromotionMail();
+
+	}
+
+
+	public PromotionMail() throws Exception {
+
+		if (Configuration.MAIL_DEBUG) {
+			System.out.println("debugging...");
+		}
+
+		ProductFactory factory = new ProductFactory();
+
+		File file = new File(Configuration.getProperty(ConfigurationKeys.FILE_PATH));
+        List<Product> products = factory.getNewProdcuts(file);
+
+        String productID = "1";
+        String sql = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+
+        List<User> users = DBUtil.query(sql);
+
+
+		for (User user : users) {
+			for (Product product : products) {
+
+				String to_address = user.getEmail();
+				String from_address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+				String subject = "您关注的产品降价了";
+				String message = "尊敬的 "+ user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+
+				Message msg = new Message(to_address, from_address, subject, message);
+
+				MailUtil.sendEmail(msg);
+			}
+
+		}
+	}
+
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..225f98b727
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class User {
+    private String Name;
+
+    public User(String name, String email) {
+        Name = name;
+        Email = email;
+    }
+
+    public String getName() {
+
+        return Name;
+    }
+
+    public void setName(String name) {
+        Name = name;
+    }
+
+    public String getEmail() {
+        return Email;
+    }
+
+    public void setEmail(String email) {
+        Email = email;
+    }
+
+    private String Email;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/471398827/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

From ded54f42b79548eba9c956c76598f9e2ccaf6c89 Mon Sep 17 00:00:00 2001
From: mac_ck <chenkai19950130@126.com>
Date: Tue, 20 Jun 2017 21:58:21 +0800
Subject: [PATCH 244/332] finish srp and ocp homework

---
 students/471398827/ood-assignment/pom.xml     | 32 +++++++++
 .../java/com/coderising/ood/ocp/Config.java   | 12 ++++
 .../com/coderising/ood/ocp/DateMessage.java   | 11 ++++
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++
 .../java/com/coderising/ood/ocp/ILog.java     |  8 +++
 .../java/com/coderising/ood/ocp/IMessage.java |  8 +++
 .../com/coderising/ood/ocp/LogFactory.java    | 25 +++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 22 +++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++
 .../coderising/ood/ocp/MessageFactory.java    | 20 ++++++
 .../com/coderising/ood/ocp/PrintUtil.java     | 11 ++++
 .../com/coderising/ood/ocp/RawMessage.java    | 11 ++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 11 ++++
 .../com/coderising/ood/srp/Configuration.java | 26 ++++++++
 .../coderising/ood/srp/ConfigurationKeys.java | 10 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 +++++++
 .../java/com/coderising/ood/srp/Mail.java     | 18 +++++
 .../java/com/coderising/ood/srp/MailUtil.java | 53 +++++++++++++++
 .../java/com/coderising/ood/srp/Message.java  | 65 +++++++++++++++++++
 .../java/com/coderising/ood/srp/Product.java  | 33 ++++++++++
 .../coderising/ood/srp/ProductFactory.java    | 36 ++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 51 +++++++++++++++
 .../java/com/coderising/ood/srp/User.java     | 32 +++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 24 files changed, 544 insertions(+)
 create mode 100644 students/471398827/ood-assignment/pom.xml
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
 create mode 100644 students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/471398827/ood-assignment/pom.xml b/students/471398827/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/471398827/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
new file mode 100644
index 0000000000..13520f693c
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Config.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Config {
+    public static final int RAW_LOG = 1;
+    public static final int RAW_LOG_WITH_DATE = 2;
+    public static final int EMAIL_LOG = 1;
+    public static final int SMS_LOG = 2;
+    public static final int PRINT_LOG = 3;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
new file mode 100644
index 0000000000..cac875e053
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateMessage.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class DateMessage implements IMessage{
+    @Override
+    public String getMessage(String msg) {
+        return DateUtil.getCurrentDateAsString() + msg;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..e9d919c378
--- /dev/null
+++ b/students/471398827/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 "date : 8/20 ";
+	}
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
new file mode 100644
index 0000000000..40a34666b8
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/ILog.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public interface ILog {
+    public void printLog(String msg);
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
new file mode 100644
index 0000000000..2ec8103863
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/IMessage.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public interface IMessage {
+    public String getMessage(String msg);
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
new file mode 100644
index 0000000000..8ba78c7b1d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/LogFactory.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.srp.Mail;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class LogFactory {
+
+    static ILog produce(int logMethod) {
+        ILog log = null;
+        switch (logMethod) {
+            case Config.EMAIL_LOG:
+                log = new MailUtil();
+                break;
+            case Config.SMS_LOG:
+                log = new SMSUtil();
+                break;
+            case Config.PRINT_LOG:
+                log = new PrintUtil();
+                break;
+        }
+        return log;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..c0579975de
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.ocp;
+
+public class Logger {
+	ILog myLog;
+	IMessage myMessage;
+			
+	public Logger(int logType, int logMethod){
+		myMessage = MessageFactory.produce(logType);
+		myLog = LogFactory.produce(logMethod);
+	}
+	public void log(String msg){
+
+		myLog.printLog(myMessage.getMessage(msg));
+
+	}
+
+	public static void main(String[] args) {
+		Logger logger = new Logger(Config.RAW_LOG_WITH_DATE, Config.EMAIL_LOG);
+		logger.log("this is a log message");
+	}
+}
+
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..76d830742a
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class MailUtil implements ILog{
+
+	@Override
+	public void printLog(String msg) {
+		msg = "Mail..." + "\n" + msg;
+		System.out.println(msg);
+	}
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
new file mode 100644
index 0000000000..10faf8f6d0
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/MessageFactory.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class MessageFactory {
+
+    static IMessage produce(int messageType) {
+        IMessage msg = null;
+        switch (messageType) {
+            case Config.RAW_LOG:
+                msg = new RawMessage();
+                break;
+            case Config.RAW_LOG_WITH_DATE:
+                msg = new DateMessage();
+                break;
+        }
+        return msg;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
new file mode 100644
index 0000000000..4e337a3d42
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class PrintUtil implements ILog{
+    @Override
+    public void printLog(String msg) {
+        System.out.println(msg);
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
new file mode 100644
index 0000000000..0d6c48a796
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/RawMessage.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class RawMessage implements IMessage{
+    @Override
+    public String getMessage(String msg) {
+        return msg;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..c85286a465
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SMSUtil implements ILog{
+
+	@Override
+	public void printLog(String msg) {
+	    msg = "SMS..." + "\n" + msg;
+		System.out.println(msg);
+	}
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..bd0db32d2a
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String, String> configurations = new HashMap<>();
+	static boolean MAIL_DEBUG = false;
+	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");
+		configurations.put(ConfigurationKeys.FILE_PATH, "/Users/szf/git/coding2017/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+	}
+	/**
+	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
+	 * @param key
+	 * @return
+	 */
+	public static String getProperty(String key) {
+		
+		return configurations.get(key);
+
+	}
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..d4acd3240f
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,10 @@
+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";
+	public static final String FILE_PATH = "file.path";
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..140d505a65
--- /dev/null
+++ b/students/471398827/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++) {
+			String userName = "User" + i;
+			String email = "aa@bb.com";
+			User user = new User(userName, email);
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..231947248d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Mail {
+    private String host;
+
+    public Mail(String host) {
+        this.host = host;
+    }
+
+    public boolean send(Message msg) throws Exception {
+        System.out.println("Host: " + this.host);
+        msg.print();
+        return true;
+    }
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..502a7d96f0
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+    private static Mail firstSMPTHost, secondSMPTHost;
+
+    static {
+		String host1 = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);
+		String host2 = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+		firstSMPTHost = new Mail(host1);
+		secondSMPTHost = new Mail(host2);
+	}
+
+
+	public static void sendEmail(Message msg) throws Exception{
+		//假装发了一封邮件
+
+		if (msg != null) {
+
+			System.out.println("开始发送邮件");
+
+			if (msg.checkFormat()) {
+
+				System.out.println("发送邮件...");
+
+				try {
+
+					firstSMPTHost.send(msg);
+
+					System.out.println("发送邮件成功");
+
+				} catch (Exception e) {
+					try {
+
+						secondSMPTHost.send(msg);
+
+					} catch (Exception e2) {
+
+						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+
+					}
+				}
+			} else {
+
+				System.out.println("邮件格式不对");
+
+			}
+		} else {
+
+			System.out.println("没有邮件发送");
+
+		}
+	}
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
new file mode 100644
index 0000000000..a0a16d2756
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Message.java
@@ -0,0 +1,65 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Message {
+    private String toAddress;
+    private String fromAddress;
+    private String subject;
+    private String message;
+
+    public Message(String toAddress, String fromAddress, String subject, String message) {
+        this.toAddress = toAddress;
+        this.fromAddress = fromAddress;
+        this.subject = subject;
+        this.message = message;
+    }
+
+    public void print() {
+        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());
+    }
+
+    public boolean checkFormat() {
+        return true;
+    }
+
+    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;
+    }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..5662ace67d
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class Product {
+    public String getProductId() {
+        return productId;
+    }
+
+    public Product(String productId, String productDesc) {
+        this.productId = productId;
+        this.productDesc = productDesc;
+    }
+
+    public Product() {
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
+    public String getProductDesc() {
+        return productDesc;
+    }
+
+    public void setProductDesc(String productDesc) {
+        this.productDesc = productDesc;
+    }
+
+    private String productId;
+    private String productDesc;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
new file mode 100644
index 0000000000..f7366c27e4
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFactory.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class ProductFactory {
+    List getNewProdcuts(File file) throws IOException {
+            BufferedReader br = null;
+            List newProducts = new ArrayList<>();
+            try {
+                br = new BufferedReader(new FileReader(file));
+                String temp = br.readLine();
+                String[] data = temp.split(" ");
+
+                Product product = new Product(data[0], data[1]);
+                newProducts.add(product);
+
+                System.out.println("产品ID = " + product.getProductId() + "\n");
+                System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+
+            } catch (IOException e) {
+                throw new IOException(e.getMessage());
+            } finally {
+                br.close();
+            }
+            return newProducts;
+    }
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..fa90f9a539
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,51 @@
+package com.coderising.ood.srp;
+import java.io.File;
+import java.util.List;
+
+public class PromotionMail {
+
+
+	public static void main(String[] args) throws Exception {
+
+		PromotionMail pe = new PromotionMail();
+
+	}
+
+
+	public PromotionMail() throws Exception {
+
+		if (Configuration.MAIL_DEBUG) {
+			System.out.println("debugging...");
+		}
+
+		ProductFactory factory = new ProductFactory();
+
+		File file = new File(Configuration.getProperty(ConfigurationKeys.FILE_PATH));
+        List<Product> products = factory.getNewProdcuts(file);
+
+        String productID = "1";
+        String sql = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+
+        List<User> users = DBUtil.query(sql);
+
+
+		for (User user : users) {
+			for (Product product : products) {
+
+				String to_address = user.getEmail();
+				String from_address = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+				String subject = "您关注的产品降价了";
+				String message = "尊敬的 "+ user.getName() + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!" ;
+
+				Message msg = new Message(to_address, from_address, subject, message);
+
+				MailUtil.sendEmail(msg);
+			}
+
+		}
+	}
+
+
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..225f98b727
--- /dev/null
+++ b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by szf on 6/20/17.
+ */
+public class User {
+    private String Name;
+
+    public User(String name, String email) {
+        Name = name;
+        Email = email;
+    }
+
+    public String getName() {
+
+        return Name;
+    }
+
+    public void setName(String name) {
+        Name = name;
+    }
+
+    public String getEmail() {
+        return Email;
+    }
+
+    public void setEmail(String email) {
+        Email = email;
+    }
+
+    private String Email;
+}
diff --git a/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/471398827/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/471398827/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

From 2729efd262313688e2a6590be016a8942358d66b Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Tue, 20 Jun 2017 23:05:25 +0800
Subject: [PATCH 245/332] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=87=AA=E5=B7=B1?=
 =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/812350401/pom.xml                    |  45 ++++
 .../java/com/coderising/ood/ocp/DateUtil.java |  10 +
 .../java/com/coderising/ood/ocp/Logger.java   |  38 ++++
 .../java/com/coderising/ood/ocp/MailUtil.java |  10 +
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  10 +
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../com/coderising/ood/srp/EmailParam.java    |   8 +
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 12 files changed, 399 insertions(+)
 create mode 100644 students/812350401/pom.xml
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/812350401/pom.xml b/students/812350401/pom.xml
new file mode 100644
index 0000000000..9a28365d2a
--- /dev/null
+++ b/students/812350401/pom.xml
@@ -0,0 +1,45 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/students/812350401/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/812350401/src/main/java/com/coderising/ood/ocp/Logger.java b/students/812350401/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..aca173e665
--- /dev/null
+++ b/students/812350401/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/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/812350401/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/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/812350401/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/812350401/src/main/java/com/coderising/ood/srp/Configuration.java b/students/812350401/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/812350401/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<String,String> 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/812350401/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/812350401/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/812350401/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/812350401/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..fee83a770d
--- /dev/null
+++ b/students/812350401/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" + i);
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java b/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
new file mode 100644
index 0000000000..934ff2139b
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.srp;
+
+/**
+ * Created by thomas_young on 20/6/2017.
+ */
+public class EmailParam {
+    protected String smtpHost = null;
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/812350401/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/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..b359f3aa6f
--- /dev/null
+++ b/students/812350401/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("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/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/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/812350401/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

From 96a90f260d5e0ca1d6c5effd4684c8ef1018b9e8 Mon Sep 17 00:00:00 2001
From: chengyu <chengyu@mogujie.com>
Date: Tue, 20 Jun 2017 23:35:57 +0800
Subject: [PATCH 246/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=82=AE=E4=BB=B6?=
 =?UTF-8?q?=E7=B3=BB=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++
 .../java/com/coderising/ood/ocp/Logger.java   | 38 ++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 10 +++
 .../coderising/ood/ocp/good/Formatter.java    |  7 ++
 .../ood/ocp/good/FormatterFactory.java        | 13 ++++
 .../ood/ocp/good/HtmlFormatter.java           | 11 +++
 .../com/coderising/ood/ocp/good/Logger.java   | 18 +++++
 .../coderising/ood/ocp/good/RawFormatter.java | 11 +++
 .../com/coderising/ood/ocp/good/Sender.java   |  7 ++
 .../com/coderising/ood/srp/Configuration.java | 23 ++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 +++++++
 .../java/com/coderising/ood/srp/Mail.java     | 44 ++++++++++++
 .../java/com/coderising/ood/srp/Product.java  | 49 +++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 72 +++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 17 files changed, 361 insertions(+)
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/good/Formatter.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/good/Logger.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/ocp/good/Sender.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/Mail.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/583884851/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/583884851/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/583884851/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/Logger.java b/students/583884851/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..aca173e665
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/583884851/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/583884851/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/Logger.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/ocp/good/Sender.java b/students/583884851/src/main/java/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/Configuration.java b/students/583884851/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/583884851/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<String,String> 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/583884851/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/583884851/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/583884851/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/583884851/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/583884851/src/main/java/com/coderising/ood/srp/Mail.java b/students/583884851/src/main/java/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..f195417dac
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+/**
+ * 邮件类
+ *
+ * @author chengyu
+ * @version 17/6/20
+ */
+public class Mail {
+    protected String smtpHost = null;
+    protected String altSmtpHost = null;
+    protected String fromAddress = null;
+    protected String toAddress = null;
+    protected String subject = null;
+    protected String message = null;
+
+    public Mail() {
+
+    }
+
+    public Mail(Configuration config) {
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    public void send() {
+        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());
+    }
+
+    public void setToAddress(String toAddress) {
+        this.toAddress = toAddress;
+    }
+
+    public void setContent(String subject, String message) {
+        this.subject = subject;
+        this.message = message;
+    }
+}
diff --git a/students/583884851/src/main/java/com/coderising/ood/srp/Product.java b/students/583884851/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..da05192e51
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * @author chengyu
+ * @version 17/6/20
+ */
+public class Product {
+    protected String productID = null;
+    protected String productDesc = null;
+
+    public Product() {
+    }
+
+    public Product(String productID, String productDesc) {
+        this.productID = productID;
+        this.productDesc = productDesc;
+    }
+
+    public static Product of(File file) throws IOException {
+        BufferedReader br;
+        br = new BufferedReader(new FileReader(file));
+        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]);
+    }
+
+    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/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..307cfd3dd9
--- /dev/null
+++ b/students/583884851/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,72 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class PromotionMail {
+
+    private Product product;
+
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+
+    public PromotionMail() {
+        File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
+        try {
+            product = Product.of(f);
+        } catch (IOException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        PromotionMail pe = new PromotionMail();
+        List emailList = pe.loadMailingList();
+        pe.sendEMails(emailList);
+    }
+
+
+    protected List loadMailingList() throws Exception {
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + product.getProductID() + "' "
+                + "and send_mail=1 ";
+        return DBUtil.query(sendMailQuery);
+    }
+
+
+    protected void sendEMails(List mailingList) throws IOException {
+
+        System.out.println("开始发送邮件");
+        Mail mail = new Mail(new Configuration());
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                HashMap userInfo = (HashMap) iter.next();
+                mail.setToAddress((String) userInfo.get(EMAIL_KEY));
+                setContent(mail, userInfo, product);
+                try {
+                    mail.send();
+                } catch (Exception e) {
+                    try {
+                        mail.send();
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+        } else {
+            System.out.println("没有邮件发送");
+        }
+    }
+
+    private void setContent(Mail mail, HashMap userInfo, Product product) {
+        String subject = "您关注的产品降价了";
+        String name = (String) userInfo.get(NAME_KEY);
+        String message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+        mail.setContent(subject, message);
+    }
+}
diff --git a/students/583884851/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/583884851/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/583884851/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

From 288861eaa6c90326492e27c539aed5c41a0afcfd Mon Sep 17 00:00:00 2001
From: Star <294022181@qq.com>
Date: Wed, 21 Jun 2017 00:41:14 +0800
Subject: [PATCH 247/332] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=97=A5=E5=BF=97?=
 =?UTF-8?q?=E6=89=93=E5=8D=B0=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ocp/EmailLogPrinter.java   | 10 ++++++++
 .../src/com/coderising/ocp/LogPrinter.java    |  5 ++++
 .../src/com/coderising/ocp/LogProcessor.java  |  5 ++++
 .../coderising/ocp/LogWithDateProcessor.java  | 12 ++++++++++
 .../src/com/coderising/ocp/Logger.java        | 23 +++++++++++++++++++
 .../com/coderising/ocp/NormalLogPrinter.java  | 10 ++++++++
 .../com/coderising/ocp/RawLogProcessor.java   | 10 ++++++++
 .../src/com/coderising/ocp/SmsLogPrinter.java | 10 ++++++++
 8 files changed, 85 insertions(+)
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java
 create mode 100644 students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java

diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java
new file mode 100644
index 0000000000..d0d5fbe7e2
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/EmailLogPrinter.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class EmailLogPrinter implements LogPrinter {
+
+	@Override
+	public void print(String log) {
+		//MailUtil.send(log);
+	}
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java
new file mode 100644
index 0000000000..f7f50226fb
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogPrinter.java
@@ -0,0 +1,5 @@
+package com.coderising.ocp;
+
+public interface LogPrinter {
+	void print(String log);
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java
new file mode 100644
index 0000000000..e5343c7d25
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogProcessor.java
@@ -0,0 +1,5 @@
+package com.coderising.ocp;
+
+public interface LogProcessor {
+	String process(String msg);
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java
new file mode 100644
index 0000000000..f4c574e9fc
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/LogWithDateProcessor.java
@@ -0,0 +1,12 @@
+package com.coderising.ocp;
+
+import java.util.Date;
+
+public class LogWithDateProcessor implements LogProcessor {
+
+	@Override
+	public String process(String msg) {
+		String txtDate = new Date().toString();
+		return txtDate + ": " + msg;
+	}
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java
new file mode 100644
index 0000000000..071bb88a63
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/Logger.java
@@ -0,0 +1,23 @@
+package com.coderising.ocp;
+
+public class Logger {
+	private LogProcessor processor;
+	private LogPrinter printer;
+	
+	public Logger(LogProcessor processor, LogPrinter printer) {
+		this.processor = processor;
+		this.printer = printer;
+	}
+	
+	public void log(String msg) {
+		String logMsg = msg;
+		
+		if (processor != null) {
+			logMsg = processor.process(logMsg);
+		}
+		
+		if (printer != null) {
+			printer.print(logMsg);
+		}
+	}
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java
new file mode 100644
index 0000000000..dce3556358
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/NormalLogPrinter.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class NormalLogPrinter implements LogPrinter {
+
+	@Override
+	public void print(String log) {
+		System.out.println(log);
+	}
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java
new file mode 100644
index 0000000000..4aa5badd37
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/RawLogProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class RawLogProcessor implements LogProcessor {
+
+	@Override
+	public String process(String msg) {
+		return msg;
+	}
+
+}
diff --git a/students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java b/students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java
new file mode 100644
index 0000000000..88a0913761
--- /dev/null
+++ b/students/294022181/ocp-assignment/src/com/coderising/ocp/SmsLogPrinter.java
@@ -0,0 +1,10 @@
+package com.coderising.ocp;
+
+public class SmsLogPrinter implements LogPrinter {
+
+	@Override
+	public void print(String log) {
+		//SMSUtil.send(log);
+	}
+
+}

From 79ec6e023a56f625b50caddb9ddecb3722633c30 Mon Sep 17 00:00:00 2001
From: yangzhm <yangzhm@hualu.com.cn>
Date: Wed, 21 Jun 2017 08:09:00 +0800
Subject: [PATCH 248/332] push base source for SRP

---
 students/495232796/OOD/ood-assignment/pom.xml |  32 +++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 7 files changed, 310 insertions(+)
 create mode 100644 students/495232796/OOD/ood-assignment/pom.xml
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/495232796/OOD/ood-assignment/pom.xml b/students/495232796/OOD/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/495232796/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<String,String> 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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/495232796/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

From 4bab040b57ab2cdd02932139fea9f12e2c26799d Mon Sep 17 00:00:00 2001
From: MIMIEYES <haolllllllll@qq.com>
Date: Wed, 21 Jun 2017 10:12:57 +0800
Subject: [PATCH 249/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/402246209/learning/pom.xml           | 47 +++++++++++++++++++
 .../odd/ocp/config/LoggerConstant.java        | 26 ++++++++++
 .../odd/ocp/logger/Impl/LoggerImpl.java       | 36 ++++++++++++++
 .../odd/ocp/logger/LoggerInterface.java       |  8 ++++
 .../com/mimieye/odd/ocp/main/LoggerMain.java  | 24 ++++++++++
 .../odd/ocp/method/Impl/MailMethodImpl.java   | 14 ++++++
 .../odd/ocp/method/Impl/PrintMethodImpl.java  | 15 ++++++
 .../odd/ocp/method/Impl/SMSMethodImpl.java    | 16 +++++++
 .../odd/ocp/method/MethodInterface.java       |  8 ++++
 .../odd/ocp/type/Impl/RawLogTypeImpl.java     | 16 +++++++
 .../ocp/type/Impl/RawLogWithDateTypeImpl.java | 18 +++++++
 .../mimieye/odd/ocp/type/TypeInterface.java   |  8 ++++
 .../com/mimieye/odd/ocp/util/DateUtil.java    | 12 +++++
 .../com/mimieye/odd/ocp/util/MailUtil.java    |  9 ++++
 .../com/mimieye/odd/ocp/util/SMSUtil.java     |  9 ++++
 15 files changed, 266 insertions(+)
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java

diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml
index 129bccd496..435c8fd478 100644
--- a/students/402246209/learning/pom.xml
+++ b/students/402246209/learning/pom.xml
@@ -10,4 +10,51 @@
     <packaging>jar</packaging>
 
 
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <build>
+
+        <plugins>
+            <plugin>
+                <!-- 设置编码 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>3.0.2</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <!-- 指定编码格式，否则在DOS下运行mvn命令时当发生文件资源copy时将使用系统默认使用GBK编码 -->
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- jdk 版本 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.6.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <!-- 指定编码格式，否则在DOS下运行mvn compile命令时会出现莫名的错误，因为系统默认使用GBK编码 -->
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.6</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>com.mimieye.odd.srp.main.PromotionEmailMain</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+
 </project>
\ No newline at end of file
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java
new file mode 100644
index 0000000000..2f19e884c5
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/config/LoggerConstant.java
@@ -0,0 +1,26 @@
+package com.mimieye.odd.ocp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class LoggerConstant {
+    public static final int RAW_LOG = 1;
+    public static final int RAW_LOG_WITH_DATE = 2;
+    public static final int EMAIL_LOG = 1;
+    public static final int SMS_LOG = 2;
+    public static final int PRINT_LOG = 3;
+
+    public static final Map<Integer, String> TPYE_MAP = new HashMap<>();
+    public static final Map<Integer, String> METHOD_MAP = new HashMap<>();
+
+    static {
+        TPYE_MAP.put(1, "com.mimieye.odd.ocp.type.Impl.RawLogTypeImpl");
+        TPYE_MAP.put(2, "com.mimieye.odd.ocp.type.Impl.RawLogWithDateTypeImpl");
+        METHOD_MAP.put(1, "com.mimieye.odd.ocp.method.Impl.MailMethodImpl");
+        METHOD_MAP.put(2, "com.mimieye.odd.ocp.method.Impl.SMSMethodImpl");
+        METHOD_MAP.put(3, "com.mimieye.odd.ocp.method.Impl.PrintMethodImpl");
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java
new file mode 100644
index 0000000000..869aa45227
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/Impl/LoggerImpl.java
@@ -0,0 +1,36 @@
+package com.mimieye.odd.ocp.logger.Impl;
+
+import com.mimieye.odd.ocp.config.LoggerConstant;
+import com.mimieye.odd.ocp.logger.LoggerInterface;
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.type.TypeInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+import com.mimieye.odd.ocp.util.SMSUtil;
+
+public class LoggerImpl implements LoggerInterface{
+	
+	private TypeInterface type;
+	private MethodInterface method;
+	private Integer typeInt;
+	private Integer methodInt;
+
+	public LoggerImpl(int typeInt, int methodInt) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
+		this.typeInt = typeInt;
+		this.methodInt = methodInt;
+		init();
+	}
+
+	private void init() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
+		String typeClass = LoggerConstant.TPYE_MAP.get(typeInt);
+		String methodClass = LoggerConstant.METHOD_MAP.get(methodInt);
+		TypeInterface typeInterface = (TypeInterface)Class.forName(typeClass).newInstance();
+		MethodInterface methodInterface = (MethodInterface)Class.forName(methodClass).newInstance();
+		this.type = typeInterface;
+		this.method = methodInterface;
+	}
+
+	public void log(String msg){
+		method.execute(type.getMsg(msg));
+	}
+}
+
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java
new file mode 100644
index 0000000000..43519090bf
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/logger/LoggerInterface.java
@@ -0,0 +1,8 @@
+package com.mimieye.odd.ocp.logger;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public interface LoggerInterface {
+    void log(String msg);
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java
new file mode 100644
index 0000000000..e8bdeb2f51
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/main/LoggerMain.java
@@ -0,0 +1,24 @@
+package com.mimieye.odd.ocp.main;
+
+import com.mimieye.odd.ocp.config.LoggerConstant;
+import com.mimieye.odd.ocp.logger.Impl.LoggerImpl;
+import com.mimieye.odd.ocp.logger.LoggerInterface;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class LoggerMain {
+    public static void main(String[] args) {
+        try {
+            LoggerInterface logger = new LoggerImpl(LoggerConstant.RAW_LOG, LoggerConstant.EMAIL_LOG);
+            String msg = "log content.";
+            logger.log(msg);
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java
new file mode 100644
index 0000000000..dda6d6c5d3
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/MailMethodImpl.java
@@ -0,0 +1,14 @@
+package com.mimieye.odd.ocp.method.Impl;
+
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class MailMethodImpl implements MethodInterface {
+    @Override
+    public void execute(String logMsg) {
+        MailUtil.send(logMsg);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java
new file mode 100644
index 0000000000..04d67545fe
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/PrintMethodImpl.java
@@ -0,0 +1,15 @@
+package com.mimieye.odd.ocp.method.Impl;
+
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class PrintMethodImpl implements MethodInterface {
+
+    @Override
+    public void execute(String logMsg) {
+        System.out.println("print console msg - " + logMsg);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java
new file mode 100644
index 0000000000..14a8fe0c34
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/Impl/SMSMethodImpl.java
@@ -0,0 +1,16 @@
+package com.mimieye.odd.ocp.method.Impl;
+
+import com.mimieye.odd.ocp.method.MethodInterface;
+import com.mimieye.odd.ocp.util.MailUtil;
+import com.mimieye.odd.ocp.util.SMSUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class SMSMethodImpl implements MethodInterface {
+
+    @Override
+    public void execute(String logMsg) {
+        SMSUtil.send(logMsg);
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java
new file mode 100644
index 0000000000..9134e8eeae
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/method/MethodInterface.java
@@ -0,0 +1,8 @@
+package com.mimieye.odd.ocp.method;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public interface MethodInterface {
+    void execute(String logMsg);
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java
new file mode 100644
index 0000000000..0f912ec56a
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogTypeImpl.java
@@ -0,0 +1,16 @@
+package com.mimieye.odd.ocp.type.Impl;
+
+import com.mimieye.odd.ocp.config.LoggerConstant;
+import com.mimieye.odd.ocp.type.TypeInterface;
+import com.mimieye.odd.ocp.util.DateUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class RawLogTypeImpl implements TypeInterface {
+
+    @Override
+    public String getMsg(String msg) {
+        return msg;
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java
new file mode 100644
index 0000000000..876e48a830
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/Impl/RawLogWithDateTypeImpl.java
@@ -0,0 +1,18 @@
+package com.mimieye.odd.ocp.type.Impl;
+
+import com.mimieye.odd.ocp.type.TypeInterface;
+import com.mimieye.odd.ocp.util.DateUtil;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public class RawLogWithDateTypeImpl implements TypeInterface {
+
+    @Override
+    public String getMsg(String msg) {
+        String logMsg = msg;
+        String txtDate = DateUtil.getCurrentDateAsString();
+        logMsg = txtDate + ": " + msg;
+        return logMsg;
+    }
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java
new file mode 100644
index 0000000000..2ed457c68d
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/type/TypeInterface.java
@@ -0,0 +1,8 @@
+package com.mimieye.odd.ocp.type;
+
+/**
+ * Created by Pierreluo on 2017/6/20.
+ */
+public interface TypeInterface {
+    String getMsg(String msg);
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java
new file mode 100644
index 0000000000..a55ad2d667
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/DateUtil.java
@@ -0,0 +1,12 @@
+package com.mimieye.odd.ocp.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+	}
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java
new file mode 100644
index 0000000000..2b75360ea2
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/MailUtil.java
@@ -0,0 +1,9 @@
+package com.mimieye.odd.ocp.util;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		System.out.println("send email msg - " + logMsg);
+	}
+
+}
diff --git a/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java
new file mode 100644
index 0000000000..c07f9b46bc
--- /dev/null
+++ b/students/402246209/learning/src/main/java/com/mimieye/odd/ocp/util/SMSUtil.java
@@ -0,0 +1,9 @@
+package com.mimieye.odd.ocp.util;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		System.out.println("send SMS msg - " + logMsg);
+	}
+
+}

From 8b1c73cb86e834f98eeff649a07043496c120216 Mon Sep 17 00:00:00 2001
From: MIMIEYES <haolllllllll@qq.com>
Date: Wed, 21 Jun 2017 10:15:02 +0800
Subject: [PATCH 250/332] Create readme.md

---
 students/402246209/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/402246209/readme.md

diff --git a/students/402246209/readme.md b/students/402246209/readme.md
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/students/402246209/readme.md
@@ -0,0 +1 @@
+

From c63b5810ff94645b478d452cf092849a78062ed0 Mon Sep 17 00:00:00 2001
From: yangzhm <yangzhm@hualu.com.cn>
Date: Wed, 21 Jun 2017 11:16:55 +0800
Subject: [PATCH 251/332] modify project structure according to SRP rule

---
 .../ood/srp => config}/product_promotion.txt  |   0
 ...ConfigurationKeys.java => CommonKeys.java} |   5 +-
 .../com/coderising/ood/srp/Configuration.java |   6 +-
 .../java/com/coderising/ood/srp/DBUtil.java   |   4 +-
 .../java/com/coderising/ood/srp/MailAddr.java |  42 ++++
 .../java/com/coderising/ood/srp/MailMsg.java  |  19 ++
 .../java/com/coderising/ood/srp/MailUtil.java |  14 +-
 .../com/coderising/ood/srp/ProductInfo.java   |  49 +++++
 .../com/coderising/ood/srp/PromotionMail.java | 194 ++++--------------
 9 files changed, 165 insertions(+), 168 deletions(-)
 rename students/495232796/OOD/ood-assignment/{src/main/java/com/coderising/ood/srp => config}/product_promotion.txt (100%)
 rename students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/{ConfigurationKeys.java => CommonKeys.java} (63%)
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java

diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/495232796/OOD/ood-assignment/config/product_promotion.txt
similarity index 100%
rename from students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/495232796/OOD/ood-assignment/config/product_promotion.txt
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/CommonKeys.java
similarity index 63%
rename from students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/CommonKeys.java
index 8695aed644..2980cc40ca 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/CommonKeys.java
@@ -1,9 +1,10 @@
 package com.coderising.ood.srp;
 
-public class ConfigurationKeys {
+public class CommonKeys {
 
 	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";
-
+	public static final String NAME_KEY = "NAME";
+	public static final String EMAIL_KEY = "EMAIL";
 }
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
index f328c1816a..13cc1b5890 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
@@ -6,9 +6,9 @@ public class Configuration {
 
 	static Map<String,String> 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");
+		configurations.put(CommonKeys.SMTP_SERVER, "smtp.163.com");
+		configurations.put(CommonKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+		configurations.put(CommonKeys.EMAIL_ADMIN, "admin@company.com");
 	}
 	/**
 	 * 应该从配置文件读， 但是这里简化为直接从一个map 中去读
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
index 82e9261d18..ff8215b4d2 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
@@ -15,8 +15,8 @@ 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");
+			userInfo.put(CommonKeys.NAME_KEY, "User" + i);			
+			userInfo.put(CommonKeys.EMAIL_KEY, "aa@bb.com");
 			userList.add(userInfo);
 		}
 
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java
new file mode 100644
index 0000000000..239166dd11
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailAddr.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp;
+
+public class MailAddr {
+	protected String smtpHost = null;
+	protected String altSmtpHost = null; 
+	protected String fromAddress = null;
+	protected String toAddress = null;
+	
+	public MailAddr(Configuration config) {
+		reloadconfig(config);
+	}
+	
+	public void reloadconfig(Configuration config) {
+		smtpHost = config.getProperty(CommonKeys.SMTP_SERVER); 
+		altSmtpHost = config.getProperty(CommonKeys.ALT_SMTP_SERVER); 
+		fromAddress = config.getProperty(CommonKeys.EMAIL_ADMIN); 
+	}
+	
+	public void setToAddress(String address) {
+		toAddress = address;
+	}
+	
+	public String getToAddress() {
+		return toAddress;
+	}
+	
+	public boolean checkToAddress() {
+		return toAddress.length() > 0;
+	}
+	
+	public String getSmtpHost() {
+		return smtpHost;
+	}
+
+	public String getAltSmtpHost() {
+		return altSmtpHost;
+	}
+	
+	public String getFromAddress() {
+		return fromAddress;
+	}
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java
new file mode 100644
index 0000000000..dd834ccfef
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailMsg.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp;
+
+public class MailMsg {
+	protected String subject = null;
+	protected String message = null;
+	
+	public MailMsg(String sub, String msg) {
+		this.subject = sub;
+		this.message = msg;
+	}
+	
+	public String getSubject() {
+		return subject;
+	}
+	
+	public String getMessage() {
+		return message;
+	}
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
index 9f9e749af7..cfb2cffa7c 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -2,17 +2,13 @@
 
 public class MailUtil {
 
-	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
-			boolean debug) {
+	public static void sendEmail(MailAddr mailAddr, MailMsg mailMsg, 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");
+		buffer.append("From:").append(mailAddr.getFromAddress()).append("\n");
+		buffer.append("To:").append(mailAddr.getToAddress()).append("\n");
+		buffer.append("Subject:").append(mailMsg.getSubject()).append("\n");
+		buffer.append("Content:").append(mailMsg.getMessage()).append("\n");
 		System.out.println(buffer.toString());
-		
 	}
-
-	
 }
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..ad68f0a7eb
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ProductInfo {
+	protected String productID = null;
+	protected String productDesc = null;
+	
+	public ProductInfo(String path) {
+		try {
+			readFile(path);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	protected void readFile(String path) throws IOException
+	{
+		File f = new File(path);
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(f));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			
+			this.productID = data[0];
+			this.productDesc = data[1];
+			
+			System.out.println("产品ID = " + productID + "\n");
+			System.out.println("产品描述 = " + productDesc + "\n");
+
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+	
+	public String getProductID() {
+		return productID;
+	}
+	
+	public String getProductDesc() {
+		return productDesc;
+	}
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 781587a846..808caab9f8 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -1,198 +1,88 @@
 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";
-	
+	protected boolean emailDebug = false;
+	protected ProductInfo productInfo = null;
+	protected MailAddr mailAddr = null;
+	private static Configuration config;
 
 	public static void main(String[] args) throws Exception {
+		String path = "D:\\projects\\OOD\\project\\ood-assignment\\config\\product_promotion.txt";
 
-		File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
-		boolean emailDebug = false;
-
-		PromotionMail pe = new PromotionMail(f, emailDebug);
-
+		PromotionMail pe = new PromotionMail(path, false);
+		pe.sendEmails();
 	}
 
-	
-	public PromotionMail(File file, boolean mailDebug) throws Exception {
-		
-		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
-		readFile(file);
-
-		
+	public PromotionMail(String path, boolean mailDebug) throws Exception {
+		this.emailDebug = mailDebug;
+		productInfo = new ProductInfo(path);
 		config = new Configuration();
-		
-		setSMTPHost();
-		setAltSMTPHost(); 
-	
-
-		setFromAddress();
-
-		
-		setLoadQuery();
-		
-		sendEMails(mailDebug, loadMailingList()); 
-
-		
+		mailAddr = new MailAddr(config);
 	}
 
-
-
-
-	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 ";
-		
-		
+		sendMailQuery = "Select name from subscriptions " + "where product_id= '" + this.productInfo.getProductID()
+				+ "' " + "and send_mail=1 ";
+
 		System.out.println("loadQuery set");
 	}
 
-	
-	protected void setSMTPHost() 
-	{
-		smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); 
-	}
+	protected MailMsg setMessage(HashMap userInfo) throws IOException {
 
-	
-	protected void setAltSMTPHost() 
-	{
-		altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+		String name = (String) userInfo.get(CommonKeys.NAME_KEY);
 
-	}
+		String subject = "您关注的产品降价了";
+		String message = "尊敬的 " + name + ", 您关注的产品 " + this.productInfo.getProductDesc() + " 降价了，欢迎购买!";
 
-	
-	protected void setFromAddress() 
-	{
-			fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+		return new MailMsg(subject, message);
 	}
 
-	protected void setMessage(HashMap userInfo) throws IOException 
-	{
-		
-		String name = (String) userInfo.get(NAME_KEY);
-		
-		subject = "您关注的产品降价了";
-		message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了，欢迎购买!" ;		
-				
-		
-
+	protected List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
 	}
-
 	
-	protected void readFile(File file) throws IOException // @02C
-	{
-		BufferedReader br = null;
+	public void sendEmails() {
 		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");
-
+			setLoadQuery();
+			sendEMails(emailDebug, loadMailingList());
 		} catch (IOException e) {
-			throw new IOException(e.getMessage());
-		} finally {
-			br.close();
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
 		}
 	}
 
-	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 
-	{
-
+	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) 
-				{
-					
+				HashMap userInfo = (HashMap) iter.next();
+				mailAddr.setToAddress((String) userInfo.get(CommonKeys.EMAIL_KEY));
+				if (mailAddr.checkToAddress()) {
+					MailMsg mailmsg = setMessage(userInfo);
 					try {
-						MailUtil.sendEmail(toAddress, fromAddress, subject, message, altSmtpHost, debug); 
-						
-					} catch (Exception e2) 
-					{
-						System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+						MailUtil.sendEmail(mailAddr, mailmsg, debug);
+					} catch (Exception e) {
+						try {
+							MailUtil.sendEmail(mailAddr, mailmsg, debug);
+						} catch (Exception e2) {
+							System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+						}
 					}
 				}
 			}
-			
-
-		}
-
-		else {
+		} else {
 			System.out.println("没有邮件发送");
-			
 		}
 
 	}

From e052e162418d050ed30edf79acdd758cc4f355e6 Mon Sep 17 00:00:00 2001
From: zhizx <zhizx@ming800.com>
Date: Wed, 21 Jun 2017 12:16:23 +0800
Subject: [PATCH 252/332] s

---
 students/919442958/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/919442958/README.md b/students/919442958/README.md
index 60472c8281..e4a5485e97 100644
--- a/students/919442958/README.md
+++ b/students/919442958/README.md
@@ -1 +1 @@
-这是919442958的作业。 
\ No newline at end of file
+这是919442958的作业。1234 
\ No newline at end of file

From 14181b6df1f344c80cb6205e2748825a8b9258a8 Mon Sep 17 00:00:00 2001
From: zhizx <zhizx@ming800.com>
Date: Wed, 21 Jun 2017 12:52:28 +0800
Subject: [PATCH 253/332] 123

---
 students/919442958/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/919442958/README.md b/students/919442958/README.md
index e4a5485e97..d96760c4ae 100644
--- a/students/919442958/README.md
+++ b/students/919442958/README.md
@@ -1 +1 @@
-这是919442958的作业。1234 
\ No newline at end of file
+这是919442958的作业。1234 12
\ No newline at end of file

From aef65cd25a8325d6830c810c79f02c2b2ff33175 Mon Sep 17 00:00:00 2001
From: ShiningChenCode <chenhui2study@163.com>
Date: Wed, 21 Jun 2017 13:36:58 +0800
Subject: [PATCH 254/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A=EF=BC=88=E6=89=BE=E5=9B=9E=E7=AC=AC=E4=B8=80=E6=AC=A1?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 students/2831099157/ood-assignment/pom.xml    |  32 +++++
 .../java/com/coderising/ood/ocp/Logger.java   |  20 ++++
 .../java/com/coderising/ood/ocp/MainTest.java |  20 ++++
 .../ood/ocp/formatter/Formatter.java          |   9 ++
 .../ood/ocp/formatter/FormatterFactory.java   |  21 ++++
 .../ocp/formatter/OnlyStringFormatter.java    |  12 ++
 .../formatter/WithCurrentDateFormatter.java   |  16 +++
 .../ood/ocp/sender/EmailSender.java           |  11 ++
 .../ood/ocp/sender/PrintSender.java           |  11 ++
 .../coderising/ood/ocp/sender/SMSSender.java  |  11 ++
 .../com/coderising/ood/ocp/sender/Sender.java |   9 ++
 .../ood/ocp/sender/SenderFactory.java         |  30 +++++
 .../coderising/ood/ocp/utils/DateUtil.java    |  13 ++
 .../coderising/ood/ocp/utils/MailUtil.java    |  10 ++
 .../com/coderising/ood/ocp/utils/SMSUtil.java |  10 ++
 .../com/coderising/ood/srp/PromotionMail.java |  21 ++++
 .../ood/srp/configure/Configuration.java      |  23 ++++
 .../ood/srp/configure/ConfigurationKeys.java  |   9 ++
 .../com/coderising/ood/srp/dao/DBUtil.java    |  27 +++++
 .../srp/interfaces/GetProductsFunction.java   |  13 ++
 .../ood/srp/interfaces/SendMailFunction.java  |  13 ++
 .../com/coderising/ood/srp/model/Mail.java    | 112 ++++++++++++++++++
 .../com/coderising/ood/srp/model/Product.java |  46 +++++++
 .../com/coderising/ood/srp/model/User.java    |  25 ++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../ood/srp/service/GetProductsFromFile.java  |  47 ++++++++
 .../ood/srp/service/GoodsArrivalNotice.java   |  13 ++
 .../coderising/ood/srp/service/Notice.java    |  25 ++++
 .../ood/srp/service/PricePromotion.java       |  12 ++
 .../ood/srp/service/SendGoodsArrivalMail.java |  42 +++++++
 .../ood/srp/service/SendPriceMail.java        |  42 +++++++
 ...10\351\207\215\346\236\204\357\274\211.md" |  23 ++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 34 files changed, 740 insertions(+)
 create mode 100644 students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/2831099157/ood-assignment/pom.xml
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/MainTest.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/Formatter.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/FormatterFactory.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/OnlyStringFormatter.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/WithCurrentDateFormatter.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/EmailSender.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/PrintSender.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SMSSender.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/Sender.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SenderFactory.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/DateUtil.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/MailUtil.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/SMSUtil.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
 create mode 100644 students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
 create mode 100644 "students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
 create mode 100644 students/2831099157/out/production/main/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/out/production/main/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/2831099157/ood-assignment/out/production/main/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/2831099157/ood-assignment/pom.xml b/students/2831099157/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/2831099157/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..cd49152e09
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.ocp.formatter.Formatter;
+import com.coderising.ood.ocp.sender.Sender;
+
+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/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/MainTest.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/MainTest.java
new file mode 100644
index 0000000000..cfa756a14e
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/MainTest.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+import com.coderising.ood.ocp.formatter.FormatterFactory;
+import com.coderising.ood.ocp.sender.SenderFactory;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class MainTest {
+    public static void main(String[] args) {
+
+        Logger logger = new Logger(FormatterFactory.createFormatter(FormatterFactory.ONLY_STRING),
+                SenderFactory.createSender(SenderFactory.ENAIL));
+        logger.log("Messge 1");
+
+        Logger logger2 = new Logger(FormatterFactory.createFormatter(FormatterFactory.WITH_CURRENT_DATA),
+                SenderFactory.createSender(SenderFactory.SMS));
+        logger2.log("Messge 2");
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/Formatter.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/Formatter.java
new file mode 100644
index 0000000000..aee4b86da5
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/Formatter.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp.formatter;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public interface Formatter {
+
+    String format(String msg);
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/FormatterFactory.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/FormatterFactory.java
new file mode 100644
index 0000000000..8a1b99fe6a
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/FormatterFactory.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.ocp.formatter;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class FormatterFactory {
+
+    public static final int ONLY_STRING = 1;
+    public static final int WITH_CURRENT_DATA = 2;
+
+    public static Formatter createFormatter(int type) {
+        if (type == ONLY_STRING) {
+            return new OnlyStringFormatter();
+        }
+        if (type == WITH_CURRENT_DATA) {
+            return new WithCurrentDateFormatter();
+        }
+        return null;
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/OnlyStringFormatter.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/OnlyStringFormatter.java
new file mode 100644
index 0000000000..312a2c8d90
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/OnlyStringFormatter.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.formatter;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class OnlyStringFormatter implements Formatter{
+
+    @Override
+    public String format(String msg) {
+        return msg;
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/WithCurrentDateFormatter.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/WithCurrentDateFormatter.java
new file mode 100644
index 0000000000..bec30c2b15
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/WithCurrentDateFormatter.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.ocp.formatter;
+
+import com.coderising.ood.ocp.utils.DateUtil;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class WithCurrentDateFormatter implements Formatter{
+
+    @Override
+    public String format(String msg) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        String logMsg = txtDate + ": " + msg;
+        return logMsg;
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/EmailSender.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/EmailSender.java
new file mode 100644
index 0000000000..921003ba6f
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/EmailSender.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.sender;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class EmailSender implements Sender {
+    @Override
+    public void send(String msg) {
+        System.out.println("Email发送，内容为："+msg);
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/PrintSender.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/PrintSender.java
new file mode 100644
index 0000000000..af3ce1dc57
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/PrintSender.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.sender;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class PrintSender implements Sender {
+    @Override
+    public void send(String msg) {
+        System.out.println("Print发送，内容为："+msg);
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SMSSender.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SMSSender.java
new file mode 100644
index 0000000000..6dabed6969
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SMSSender.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.sender;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class SMSSender implements Sender {
+    @Override
+    public void send(String msg) {
+        System.out.println("SMS发送，内容为："+ msg);
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/Sender.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/Sender.java
new file mode 100644
index 0000000000..7187f23f6a
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/Sender.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp.sender;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public interface Sender {
+
+    void send(String msg);
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SenderFactory.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SenderFactory.java
new file mode 100644
index 0000000000..ff2346ce58
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/sender/SenderFactory.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.ocp.sender;
+
+import com.coderising.ood.ocp.formatter.Formatter;
+import com.coderising.ood.ocp.formatter.OnlyStringFormatter;
+import com.coderising.ood.ocp.formatter.WithCurrentDateFormatter;
+
+/**
+ * Created by Iden on 2017/6/21.
+ */
+public class SenderFactory {
+
+    public static final int ENAIL = 1;
+    public static final int SMS = 2;
+    public static final int PRINT = 3;
+
+
+    public static Sender createSender(int type) {
+        if (type == ENAIL) {
+            return new EmailSender();
+        }
+        if (type == SMS) {
+            return new SMSSender();
+        }
+        if (type == PRINT) {
+            return new PrintSender();
+        }
+        return null;
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/DateUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/DateUtil.java
new file mode 100644
index 0000000000..4b1cf6c78d
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/DateUtil.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		
+		return SimpleDateFormat.getInstance().format(new Date());
+	}
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/MailUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/MailUtil.java
new file mode 100644
index 0000000000..7214e763b5
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.utils;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/SMSUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/SMSUtil.java
new file mode 100644
index 0000000000..d59b7e6644
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/ocp/utils/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.utils;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..9eb1b21f29
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp;
+
+import com.coderising.ood.srp.service.GoodsArrivalNotice;
+import com.coderising.ood.srp.service.Notice;
+
+/**
+ * 可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
+ */
+public class PromotionMail {
+
+    public static void main(String[] args) throws Exception {
+        //降价促销
+//      Notice notice = new PricePromotion();
+        //到货通知
+        Notice notice = new GoodsArrivalNotice();
+        notice.sendMail(notice.getProducts());
+
+    }
+
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
new file mode 100644
index 0000000000..5c0697782a
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.configure;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
new file mode 100644
index 0000000000..c9cfba4974
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/configure/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.configure;
+
+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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
new file mode 100644
index 0000000000..c0e7f6508d
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/dao/DBUtil.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.srp.dao;
+import com.coderising.ood.srp.model.User;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class DBUtil {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public static List<User> query(String sql){
+		
+		List userList = new ArrayList();
+		for (int i = 1; i <= 3; i++) {
+			User user = new User();
+			user.setName("User" + i);
+			user.seteMail("aa@bb.com");
+			userList.add(user);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
new file mode 100644
index 0000000000..f0894ea3c7
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/GetProductsFunction.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.interfaces;
+
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public interface GetProductsFunction {
+
+    List<Product> getProducts();
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
new file mode 100644
index 0000000000..cd27a45767
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/interfaces/SendMailFunction.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.interfaces;
+
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public interface SendMailFunction {
+
+    void sendMail(List<Product> products);
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
new file mode 100644
index 0000000000..b94f27b29d
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Mail.java
@@ -0,0 +1,112 @@
+package com.coderising.ood.srp.model;
+
+import com.coderising.ood.srp.configure.Configuration;
+import com.coderising.ood.srp.configure.ConfigurationKeys;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class Mail {
+    private String fromAddress;
+    private String toAddress;
+    private String subject;
+    private String content;
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+
+    public Mail() {
+        Configuration config = new Configuration();
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
+
+    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;
+    }
+
+
+    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 void send() {
+        if(null==toAddress){
+            System.out.println("发送地址不能为空");
+            return;
+        }
+        try {
+            sendMailBySmtpHost();
+        } catch (Exception e) {
+            try {
+                sendMailBySmtpHost();
+            } catch (Exception e2) {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+
+        }
+    }
+
+    private void sendMailBySmtpHost() {
+        System.out.println("通过SMTP服务器开始发送邮件");
+        //假装发了一封邮件
+        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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+
+    private void sendMailByAlSmtpHost() {
+        System.out.println("通过备用SMTP服务器开始发送邮件");
+        //假装发了一封邮件
+        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(content).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
new file mode 100644
index 0000000000..f9f5b5a145
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/Product.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp.model;
+
+import com.coderising.ood.srp.dao.DBUtil;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class Product {
+    String id;
+    String description;
+
+    public Product(String id, String descript) {
+        this.id = id;
+        this.description = descript;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public List<User> getSubscribers() {
+        List<User> userList = null;
+        String sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + id + "' "
+                + "and send_mail=1 ";
+        userList = DBUtil.query(sendMailQuery);
+        return userList;
+
+    }
+
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
new file mode 100644
index 0000000000..38bec29f59
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/model/User.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.model;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class User {
+    String name;
+    String 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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/2831099157/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/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
new file mode 100644
index 0000000000..92a1090c5e
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GetProductsFromFile.java
@@ -0,0 +1,47 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.GetProductsFunction;
+import com.coderising.ood.srp.model.Product;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class GetProductsFromFile implements GetProductsFunction {
+    public String filePath = "E:\\StudyProjects\\Java\\Workspace\\HomeWork\\coding2017\\liuxin\\ood\\ood-assignment\\" +
+            "src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+
+    @Override
+    public List<Product> getProducts() {
+        BufferedReader br = null;
+        List<Product> products = new ArrayList<>();
+        try {
+            File file = new File(filePath);
+            br = new BufferedReader(new FileReader(file));
+            String temp = null;
+            while ((temp = br.readLine()) != null) {
+                String[] data = temp.split(" ");
+                Product product = new Product(data[0], data[1]);
+                System.out.println("促销产品ID = " + product.getId());
+                System.out.println("促销产品描述 = " + product.getDescription());
+                products.add(product);
+            }
+
+        } catch (IOException e) {
+            System.out.println("读取文件失败");
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return products;
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
new file mode 100644
index 0000000000..ee4723ec06
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/GoodsArrivalNotice.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.service;
+
+/**
+ * Created by Iden on 2017/6/14.
+ * 到货通知
+ */
+public class GoodsArrivalNotice extends Notice {
+    public GoodsArrivalNotice() {
+        getProductsFunction = new GetProductsFromFile();
+        sendMailFunction = new SendGoodsArrivalMail();
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
new file mode 100644
index 0000000000..6ac8e62402
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/Notice.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.GetProductsFunction;
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Product;
+
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ * 各类通知（降价促销，抢购活动，到货通知等等）
+ */
+public abstract class Notice {
+    GetProductsFunction getProductsFunction;
+    SendMailFunction sendMailFunction;
+
+    public List<Product> getProducts() {
+        return getProductsFunction.getProducts();
+    }
+
+    public void sendMail(List<Product> products) {
+        sendMailFunction.sendMail(products);
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
new file mode 100644
index 0000000000..ebb59571c0
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/PricePromotion.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.service;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class PricePromotion extends Notice {
+    public PricePromotion() {
+        getProductsFunction = new GetProductsFromFile();
+        sendMailFunction = new SendPriceMail();
+    }
+
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
new file mode 100644
index 0000000000..79f3a6985f
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendGoodsArrivalMail.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.User;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class SendGoodsArrivalMail implements SendMailFunction {
+
+
+    @Override
+    public void sendMail(List<Product> products) {
+        if (null == products || products.size() == 0) {
+            System.out.println("没有发现到货的产品");
+            return;
+        }
+        Iterator<Product> iterator = products.iterator();
+        while (iterator.hasNext()) {
+            Product product = iterator.next();
+            List<User> userList = product.getSubscribers();
+            if (null == userList || userList.size() == 0) {
+                System.out.println("没有人订阅" + product.getDescription() + " 信息");
+                continue;
+            }
+            Iterator iter = userList.iterator();
+            while (iter.hasNext()) {
+                User user = (User) iter.next();
+                Mail mail = new Mail();
+                mail.setSubject("您关注的产品到货了");
+                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 到货了，欢迎购买");
+                mail.setToAddress(user.geteMail());
+                mail.send();
+            }
+        }
+    }
+}
diff --git a/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
new file mode 100644
index 0000000000..bae4803e3f
--- /dev/null
+++ b/students/2831099157/ood-assignment/src/main/java/com/coderising/ood/srp/service/SendPriceMail.java
@@ -0,0 +1,42 @@
+package com.coderising.ood.srp.service;
+
+import com.coderising.ood.srp.interfaces.SendMailFunction;
+import com.coderising.ood.srp.model.Mail;
+import com.coderising.ood.srp.model.Product;
+import com.coderising.ood.srp.model.User;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by Iden on 2017/6/14.
+ */
+public class SendPriceMail implements SendMailFunction {
+
+
+    @Override
+    public void sendMail(List<Product> products) {
+        if (null == products || products.size() == 0) {
+            System.out.println("没有发现需要促销的产品");
+            return;
+        }
+        Iterator<Product> iterator = products.iterator();
+        while (iterator.hasNext()) {
+            Product product = iterator.next();
+            List<User> userList = product.getSubscribers();
+            if (null == userList || userList.size() == 0) {
+                System.out.println("没有人订阅 " + product.getDescription() + " 信息");
+                continue;
+            }
+            Iterator iter = userList.iterator();
+            while (iter.hasNext()) {
+                User user = (User) iter.next();
+                Mail mail = new Mail();
+                mail.setSubject("您关注的产品降价了");
+                mail.setContent("尊敬的 " + user.getName() + ", 您关注的产品 " + product.getDescription() + " 降价了，欢迎购买");
+                mail.setToAddress(user.geteMail());
+                mail.send();
+            }
+        }
+    }
+}
diff --git "a/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md" "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
new file mode 100644
index 0000000000..33634cb9a9
--- /dev/null
+++ "b/students/2831099157/ood-assignment/\344\277\203\351\224\200Mail\345\217\221\351\200\201\347\273\203\344\271\240\357\274\210\351\207\215\346\236\204\357\274\211.md"
@@ -0,0 +1,23 @@
+# 第一次OOD练习 #
+
+## 需求 ##
+### 原项目已经实现根据产品列表文件发送促销Mail，需求一直在变化，比如通过数据库获取促销产品或者促销活动改为到货通知，抢购等；为了应变各种变化，需重构代码。 ###
+## 需求分析 ##
+需求可变因素:</br>
+
+1. 促销产品列表文件可能会变更，或者变更获取方式（如通过数据库获取）
+2. 促销活动会根据运营情况变更
+## 重构方案 ##
+1. 提取GetProductsFunction，SendMailFunction接口
+2. 添加Notice抽象类，针对接口添加getProducts,sendMai方法 -------各类通知（降价促销，抢购活动，到货通知等等）
+3. 添加Mail,Product,User实体类
+4. Mail初始化设置smtpHost,alSmtpHost,fromAddress参数，添加sendMail功能
+5. Product添加getSubscribers功能
+6. 添加GetProductsFunction，SendMailFunction接口实现类
+7. 添加PricePromotion继承Promotion，实现降价促销功能，实例化GetProductsFunction，SendMailFunction接口    
+8. 主函数调用sendMail方法
+
+## 重构后 ##
+重构后项目，可以根据不同运营方案，添加GetProductsFunction，SendMailFunction接口实现类及Notice子类，向订阅者发送通告
+
+
diff --git a/students/2831099157/out/production/main/com/coderising/ood/srp/product_promotion.txt b/students/2831099157/out/production/main/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/2831099157/out/production/main/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

From 19d62a21db181e24d7092c485474d3d3f95746c7 Mon Sep 17 00:00:00 2001
From: ifengdzh <ifengdzh@163.com>
Date: Wed, 21 Jun 2017 15:12:22 +0800
Subject: [PATCH 255/332] =?UTF-8?q?srp=20=E5=8E=9F=E5=88=99=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/281918307/ood-ocp/pom.xml            |  1 -
 .../main/java/com/ood/ocp/Application.java    |  2 +-
 .../src/main/resources/log4j.properties       |  4 +-
 students/281918307/ood-srp/pom.xml            |  8 ++
 .../java/com/ood/srp/file/FileService.java    |  6 +-
 .../ood/srp/file/impl/FileServiceImpl.java    | 35 +++++++++
 .../java/com/ood/srp/mail/Configuration.java  | 34 ++++----
 .../com/ood/srp/mail/ConfigurationKeys.java   |  6 +-
 .../java/com/ood/srp/mail/MailService.java    | 21 +++++
 .../ood/srp/mail/impl/MailServiceImpl.java    | 62 +++++++++++++++
 .../com/ood/srp/product/ProductDetail.java    |  1 +
 .../ood/srp/product/ProductDetailService.java | 10 ++-
 .../impl/ProductDetailServiceImpl.java        | 43 ++++++++++
 .../ood/srp/promotion/PromotionService.java   | 21 +----
 .../promotion/impl/PromotionServiceImpl.java  | 63 +++++++++++++++
 .../main/java/com/ood/srp/user/UserInfo.java  |  3 +-
 .../com/ood/srp/user/UserInfoService.java     | 16 ++++
 .../srp/user/impl/UserInfoServiceImpl.java    | 31 ++++++++
 .../main/java/com/ood/srp/util/DBUtil.java    | 11 ++-
 .../main/java/com/ood/srp/util/FileUtil.java  | 27 ++-----
 .../main/java/com/ood/srp/util/MailUtil.java  | 78 +++----------------
 .../src/main/resources/log4j.properties       |  4 +-
 22 files changed, 343 insertions(+), 144 deletions(-)
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/file/impl/FileServiceImpl.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/mail/impl/MailServiceImpl.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/product/impl/ProductDetailServiceImpl.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/impl/PromotionServiceImpl.java
 create mode 100644 students/281918307/ood-srp/src/main/java/com/ood/srp/user/impl/UserInfoServiceImpl.java

diff --git a/students/281918307/ood-ocp/pom.xml b/students/281918307/ood-ocp/pom.xml
index 9daf351b12..284a8b4939 100644
--- a/students/281918307/ood-ocp/pom.xml
+++ b/students/281918307/ood-ocp/pom.xml
@@ -28,5 +28,4 @@
     </dependencies>
 
 
-    
 </project>
\ No newline at end of file
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java
index 843af308ec..5fc79ba891 100644
--- a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/Application.java
@@ -8,7 +8,7 @@
 public class Application {
     static final Logger logger = Logger.getLogger(Application.class);
 
-    public static void main(String [] args) {
+    public static void main(String[] args) {
         logger.error("Application running ...");
     }
 }
diff --git a/students/281918307/ood-ocp/src/main/resources/log4j.properties b/students/281918307/ood-ocp/src/main/resources/log4j.properties
index 508df51466..e70566ce70 100644
--- a/students/281918307/ood-ocp/src/main/resources/log4j.properties
+++ b/students/281918307/ood-ocp/src/main/resources/log4j.properties
@@ -1,8 +1,6 @@
 log4j.rootLogger=debug, stdout
-
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %l - %m%n
-
 # Third party loggers
- log4j.logger.com.ood=debug
+log4j.logger.com.ood=debug
diff --git a/students/281918307/ood-srp/pom.xml b/students/281918307/ood-srp/pom.xml
index 13db2a5ad0..e2c51f2ab2 100644
--- a/students/281918307/ood-srp/pom.xml
+++ b/students/281918307/ood-srp/pom.xml
@@ -68,6 +68,14 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
 
         </plugins>
     </build>
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java
index 301bb6d845..17da5e5add 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/file/FileService.java
@@ -1,6 +1,5 @@
 package com.ood.srp.file;
 
-import java.io.File;
 import java.util.List;
 
 /**
@@ -11,8 +10,9 @@ public interface FileService {
 
     /**
      * 读取文件内容，放到List内
-     * @param file
+     *
+     * @param filePath
      * @return
      */
-    List<String> readFile(File file);
+    List<String> readFile(String filePath) throws Exception;
 }
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/file/impl/FileServiceImpl.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/file/impl/FileServiceImpl.java
new file mode 100644
index 0000000000..71385b81ad
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/file/impl/FileServiceImpl.java
@@ -0,0 +1,35 @@
+package com.ood.srp.file.impl;
+
+import com.ood.srp.file.FileService;
+import com.ood.srp.util.FileUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 文件处理类
+ * Created by yuxia on 2017/6/21.
+ */
+@Service
+public class FileServiceImpl implements FileService {
+
+
+    /**
+     * 获取信息
+     *
+     * @param filePath
+     * @return
+     * @throws Exception
+     */
+    public List<String> readFile(String filePath) throws Exception {
+        List<String> lineList = new ArrayList<>();
+        FileUtil fileUtil = new FileUtil(filePath);
+        while (fileUtil.hasNext()) {
+            String s = fileUtil.readLine();
+            lineList.add(s);
+        }
+        fileUtil.close();
+        return lineList;
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java
index 48ea71dec5..88eb7af347 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/Configuration.java
@@ -1,23 +1,27 @@
 package com.ood.srp.mail;
+
 import java.util.HashMap;
 import java.util.Map;
 
 public class Configuration {
 
-	static Map<String,String> 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);
-	}
+    static Map<String, String> 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/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java
index 74cc19304a..8199bf780d 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/ConfigurationKeys.java
@@ -2,8 +2,8 @@
 
 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";
+    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/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java
index 55ddcffc56..c85740e19e 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/MailService.java
@@ -1,8 +1,29 @@
 package com.ood.srp.mail;
 
+import com.ood.srp.user.UserInfo;
+
+import java.util.List;
+
 /**
  * Created by ajaxfeng on 2017/6/20.
  */
 public interface MailService {
 
+    /**
+     * 主SMTP服务器地址
+     */
+    public static final String SMTP_SERVER = "smtp.163.com";
+
+    /**
+     * 备用SMTP服务器地址
+     */
+    public static final String ALT_SMTP_SERVER = "smtp1.163.com";
+
+    /**
+     * 以哪个邮箱地址发送给用户
+     */
+    public static final String EMAIL_ADMIN = "admin@company.com";
+
+
+    public String sendEmail(List<UserInfo> userInfoList);
 }
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/impl/MailServiceImpl.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/impl/MailServiceImpl.java
new file mode 100644
index 0000000000..e633f94a55
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/mail/impl/MailServiceImpl.java
@@ -0,0 +1,62 @@
+package com.ood.srp.mail.impl;
+
+import com.ood.srp.mail.MailService;
+import com.ood.srp.user.UserInfo;
+import com.ood.srp.util.MailUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by yuxia on 2017/6/21.
+ */
+@Service
+public class MailServiceImpl implements MailService {
+
+    /**
+     * 发送邮件
+     *
+     * @param userInfoList
+     * @return
+     */
+    @Override
+    public String sendEmail(List<UserInfo> userInfoList) {
+        if (userInfoList == null) {
+            System.out.println("没有邮件发送");
+            return "none";
+        }
+
+        for (UserInfo info : userInfoList) {
+            if (!info.getEmail().isEmpty()) {
+                String emailInfo = generatePromotionEmail(info);
+                try {
+                    MailUtil.sendPromotionEmail(emailInfo);
+                } catch (Exception e) {
+                    System.out.println(e.getMessage());
+                }
+            }
+        }
+        return "success";
+    }
+
+    /**
+     * 根据用户信息生成促销邮件内容。
+     *
+     * @param userInfo 用户信息。
+     * @return 返回生成的邮件。
+     */
+    private static String generatePromotionEmail(UserInfo userInfo) {
+        StringBuilder buffer = new StringBuilder();
+
+        buffer.append("From:").append(EMAIL_ADMIN).append("\n");
+        buffer.append("To:").append(userInfo.getEmail()).append("\n");
+        buffer.append("Subject:").append("您关注的产品降价了").append("\n");
+        buffer.append("Content:").append("尊敬的").append(userInfo.getName());
+        buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
+        buffer.append(" 降价了，欢迎购买!").append("\n");
+
+        System.out.println(buffer.toString());
+
+        return buffer.toString();
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java
index edcce88eee..71bfc3e52c 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetail.java
@@ -2,6 +2,7 @@
 
 /**
  * 产品信息数据类。
+ *
  * @since 06.18.2017
  */
 public class ProductDetail {
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java
index 1bc54a563a..0ed1920a18 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/ProductDetailService.java
@@ -1,9 +1,17 @@
 package com.ood.srp.product;
 
+import java.util.List;
+
 /**
  * 产品信息
  * Created by ajaxfeng on 2017/6/20.
  */
 public interface ProductDetailService {
-
+    /**
+     * 获取产品详情
+     *
+     * @param lineList
+     * @return
+     */
+    public List<ProductDetail> getProductDetailList(List<String> lineList);
 }
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/product/impl/ProductDetailServiceImpl.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/impl/ProductDetailServiceImpl.java
new file mode 100644
index 0000000000..9e5f4434a1
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/product/impl/ProductDetailServiceImpl.java
@@ -0,0 +1,43 @@
+package com.ood.srp.product.impl;
+
+import com.ood.srp.product.ProductDetail;
+import com.ood.srp.product.ProductDetailService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 商品信息逻辑
+ * Created by yuxia on 2017/6/21.
+ */
+@Service
+public class ProductDetailServiceImpl implements ProductDetailService {
+
+    /**
+     * 获取商品信息
+     *
+     * @param lineList
+     * @return
+     */
+    public List<ProductDetail> getProductDetailList(List<String> lineList) {
+        List<ProductDetail> productDetailList = new ArrayList<>();
+        lineList.forEach(line -> {
+            String[] splitInfo = line.split(" ");
+            if (splitInfo.length >= 2) {
+                String id = splitInfo[0];
+                String description = splitInfo[1];
+                ProductDetail productDetail = getProductDetail(id, description);
+                productDetailList.add(productDetail);
+            }
+        });
+        return productDetailList;
+    }
+
+    private ProductDetail getProductDetail(String id, String description) {
+        ProductDetail productDetail = new ProductDetail();
+        productDetail.setId(id);
+        productDetail.setDescription(description);
+        return productDetail;
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java
index 9ce8a39fe0..1653a981c6 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/PromotionService.java
@@ -1,31 +1,16 @@
 package com.ood.srp.promotion;
 
-import com.ood.srp.product.ProductDetail;
-import com.ood.srp.user.UserInfo;
-
-import java.util.List;
-
 /**
  * 促销处理类
  * Created by ajaxfeng on 2017/6/20.
  */
 public interface PromotionService {
-    /**
-     * 获取产品信息
-     * @return
-     */
-    List<ProductDetail> getPromotionProduct();
-
-    /**
-     * 获取用户信息
-     * @return
-     */
-    List<UserInfo> getPromotionUserInfo();
 
     /**
-     * 发送促销信息
+     * 发布促销信息
+     *
      * @return
      */
-    List<String> sendPromotionInfo();
+    String promotion() throws Exception;
 
 }
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/impl/PromotionServiceImpl.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/impl/PromotionServiceImpl.java
new file mode 100644
index 0000000000..c7e104dde5
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/promotion/impl/PromotionServiceImpl.java
@@ -0,0 +1,63 @@
+package com.ood.srp.promotion.impl;
+
+import com.ood.srp.file.FileService;
+import com.ood.srp.mail.MailService;
+import com.ood.srp.product.ProductDetail;
+import com.ood.srp.product.ProductDetailService;
+import com.ood.srp.promotion.PromotionService;
+import com.ood.srp.user.UserInfo;
+import com.ood.srp.user.UserInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 发布促销信息
+ * Created by yuxia on 2017/6/21.
+ */
+public class PromotionServiceImpl implements PromotionService {
+
+    private static final String FILE_PATH = "pro.text";
+
+    @Autowired
+    FileService fileService;
+    @Autowired
+    ProductDetailService productDetailService;
+    @Autowired
+    UserInfoService userInfoService;
+    @Autowired
+    MailService mailService;
+
+    /**
+     * <h1>促销</h1><br>
+     * 1. 获取文件内容<br>
+     * 2. 根据文件内容，获取商品信息<br>
+     * 3. 根据商品信息，获得用户信息<br>
+     * 4. 针对用户信息，进行邮件发送<br>
+     * 可扩展行：
+     *  1. 发送促销信息，可抽象一个接口：具体可以通过邮件、短信等手段发送
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String promotion() throws Exception {
+        List<String> strings = fileService.readFile(FILE_PATH);
+        List<ProductDetail> productDetailList =
+                productDetailService.getProductDetailList(strings);
+        List<String> idList = productDetailList2IDList(productDetailList);
+        List<UserInfo> userInfoList = userInfoService.listUserInfo(idList);
+        String s = mailService.sendEmail(userInfoList);
+        System.out.println(s);
+        return s;
+    }
+
+    List<String> productDetailList2IDList(List<ProductDetail> productDetails) {
+        List<String> idList = new ArrayList<>();
+        for (ProductDetail productDetail : productDetails) {
+            idList.add(productDetail.getId());
+        }
+        return idList;
+    }
+
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java
index 65cc00ea39..14c363fa43 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfo.java
@@ -2,6 +2,7 @@
 
 /**
  * 用户数据类。
+ *
  * @since 06.18.2017
  */
 public class UserInfo {
@@ -9,7 +10,7 @@ public class UserInfo {
     private String email;
     private String productDesc;
 
-    public UserInfo(String name, String email, String productDesc){
+    public UserInfo(String name, String email, String productDesc) {
         this.name = name;
         this.email = email;
         this.productDesc = productDesc;
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java
index e828597d4d..da206c4a5a 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/UserInfoService.java
@@ -1,9 +1,25 @@
 package com.ood.srp.user;
 
+import java.util.List;
+
 /**
  * 用户逻辑
  * Created by ajaxfeng on 2017/6/20.
  */
 public interface UserInfoService {
+    /**
+     * 获取用户信息
+     *
+     * @param productID
+     * @return
+     */
+    public List<UserInfo> listUserInfo(String productID);
 
+    /**
+     * 获取用户信息
+     *
+     * @param productID
+     * @return
+     */
+    public List<UserInfo> listUserInfo(List<String> productID);
 }
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/user/impl/UserInfoServiceImpl.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/impl/UserInfoServiceImpl.java
new file mode 100644
index 0000000000..5ddd5f6a45
--- /dev/null
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/user/impl/UserInfoServiceImpl.java
@@ -0,0 +1,31 @@
+package com.ood.srp.user.impl;
+
+import com.ood.srp.user.UserInfo;
+import com.ood.srp.user.UserInfoService;
+import com.ood.srp.util.DBUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by yuxia on 2017/6/21.
+ */
+@Service
+public class UserInfoServiceImpl implements UserInfoService {
+    @Override
+    public List<UserInfo> listUserInfo(String productID) {
+        List<UserInfo> userInfoList = DBUtil.query(productID);
+        return userInfoList;
+    }
+
+    @Override
+    public List<UserInfo> listUserInfo(List<String> productIDList) {
+        List<UserInfo> userInfoAll = new ArrayList<>();
+        for (String id : productIDList) {
+            List<UserInfo> userInfoList = listUserInfo(id);
+            userInfoAll.addAll(userInfoList);
+        }
+        return userInfoAll;
+    }
+}
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java
index 820bbb5dcf..dc9affd22f 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/DBUtil.java
@@ -1,7 +1,6 @@
 package com.ood.srp.util;
 
 
-import com.ood.srp.product.ProductDetail;
 import com.ood.srp.user.UserInfo;
 
 import java.util.ArrayList;
@@ -22,20 +21,20 @@ public class DBUtil {
      * 应该从数据库读， 但是简化为直接生成。
      * 给一个产品详情，返回一个Array List记载所有订阅该产品的用户信息（名字，邮箱，订阅的产品名称）。
      *
-     * @param productDetail 传产品详情。产品id用来查询数据库。产品名称用于和用户信息绑定
+     * @param productID 传产品详情。产品id用来查询数据库。产品名称用于和用户信息绑定
      * @return 返回数据库中所有的查询到的结果。
      */
-    public static List<UserInfo> query(ProductDetail productDetail) {
-        if (productDetail == null || productDetail.getId() == null)
+    public static List<UserInfo> query(String productID) {
+        if (productID == null)
             return new ArrayList<>();
 
         String sendMailQuery = "Select name from subscriptions "
-                + "where product_id= '" + productDetail.getId() + "' "
+                + "where product_id= '" + productID + "' "
                 + "and send_mail=1 ";
         //假装用sendMilQuery查了数据库，生成了userList作为查询结果
         List<UserInfo> userList = new ArrayList<>();
         for (int i = 1; i <= 3; i++) {
-            UserInfo newInfo = new UserInfo("User" + i, "aa@bb.com", productDetail.getDescription());
+            UserInfo newInfo = new UserInfo("User" + i, "aa@bb.com", "");
             userList.add(newInfo);
         }
         return userList;
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java
index 060ef0287a..05aa9d9c5b 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/FileUtil.java
@@ -1,9 +1,6 @@
 package com.ood.srp.util;
 
 
-
-import com.ood.srp.product.ProductDetail;
-
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.Scanner;
@@ -14,6 +11,7 @@
  * 此类会打开促销文件，促销文件默认按照：
  * "id" 空格 "产品名称"
  * 进行存储，每行一条促销信息。
+ *
  * @since 06.19.2017
  */
 public class FileUtil {
@@ -21,30 +19,19 @@ public class FileUtil {
 
 
     public FileUtil(String filePath) throws FileNotFoundException {
-       scanner = new Scanner(new File(filePath));
+        scanner = new Scanner(new File(filePath));
     }
 
-    public ProductDetail getNextProduct(){
-        String wholeInfo;
-        ProductDetail nextProduct = new ProductDetail();
-        wholeInfo = scanner.nextLine();
-
-        String[] splitInfo = wholeInfo.split(" ");
-        if (splitInfo.length < 2)
-            return nextProduct;
-
-        //促销文件按照 - "id" 空格 "产品名称" 进行记录的
-        nextProduct.setId(splitInfo[0]);
-        nextProduct.setDescription(splitInfo[1]);
-
-        return nextProduct;
+    public String readLine() {
+        String wholeInfo = scanner.nextLine();
+        return wholeInfo;
     }
 
-    public boolean hasNext(){
+    public boolean hasNext() {
         return scanner.hasNextLine();
     }
 
-    public void close(){
+    public void close() {
         scanner.close();
     }
 }
diff --git a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java
index 2f3463e1d8..a6953d5306 100644
--- a/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java
+++ b/students/281918307/ood-srp/src/main/java/com/ood/srp/util/MailUtil.java
@@ -1,13 +1,10 @@
 package com.ood.srp.util;
 
 
-import com.ood.srp.user.UserInfo;
-
-import java.util.List;
-
 /**
  * 邮件发送类。
  * 管理邮箱连接，发送等操作。
+ *
  * @since 06.19.2017
  */
 public class MailUtil {
@@ -16,82 +13,25 @@ public class MailUtil {
      * SMTP连接失败异常。
      * 可用getMessage()获得异常内容。
      */
-    public static class SMTPConnectionFailedException extends Throwable{
-        public SMTPConnectionFailedException(String message){
+    public static class SMTPConnectionFailedException extends Throwable {
+        public SMTPConnectionFailedException(String message) {
             super(message);
         }
     }
 
-    /**
-     * 主SMTP服务器地址
-     */
-	public static final String SMTP_SERVER = "smtp.163.com";
-
-    /**
-     * 备用SMTP服务器地址
-     */
-	public static final String ALT_SMTP_SERVER = "smtp1.163.com";
-
-    /**
-     * 以哪个邮箱地址发送给用户
-     */
-	public static final String EMAIL_ADMIN = "admin@company.com";
-
-
-    /**
-     * 邮件发送操作。
-     * 将降价促销邮件逐个发送给用户信息表中对应的用户。
-     * 捕获SMTPConnectionFailedException。提示手动发送。并继续发送下一封邮件。
-     * @param usersList 用户信息表。包含用户姓名，邮箱和订阅产品名称。
-     */
-	public static void sendEmails(List<UserInfo> usersList){
-		if (usersList == null) {
-			System.out.println("没有邮件发送");
-			return;
-		}
-
-		for (UserInfo info : usersList){
-			if (!info.getEmail().isEmpty()) {
-				String emailInfo = generatePromotionEmail(info);
-				try {
-                    sendPromotionEmail(emailInfo);
-                } catch (SMTPConnectionFailedException e){
-                    System.out.println("SMTP主副服务器连接失败，请手动发送以下邮件： \n");
-                    System.out.println(e.getMessage());
-                }
-			}
-		}
-	}
 
     /**
      * 假装在发邮件。默认使用主SMTP发送，若发送失败则使用备用SMTP发送。
      * 仍然失败，则抛出SMTPConnectFailException异常。
+     *
      * @param emailInfo 要发送的邮件内容
      * @throws SMTPConnectionFailedException 若主副SMTP服务器均连接失败，抛出异常。异常中包含完整的发送失败的邮件内容。可通过getMessage()方法获得邮件内容。
      */
-	private static void sendPromotionEmail(String emailInfo) throws SMTPConnectionFailedException{
-		//默认以SMTP_SERVER 发送
-		//如果发送失败以ALT_SMTP_SERVER 重新发送
-		//如果还失败，throw new SMTPConnectionFailedException(emailInfo).
-	}
-
-    /**
-     * 根据用户信息生成促销邮件内容。
-     * @param userInfo 用户信息。
-     * @return 返回生成的邮件。
-     */
-	private static String generatePromotionEmail(UserInfo userInfo){
-		StringBuilder buffer = new StringBuilder();
-
-		buffer.append("From:").append(EMAIL_ADMIN).append("\n");
-		buffer.append("To:").append(userInfo.getEmail()).append("\n");
-		buffer.append("Subject:").append("您关注的产品降价了").append("\n");
-		buffer.append("Content:").append("尊敬的").append(userInfo.getName());
-		buffer.append(", 您关注的产品 ").append(userInfo.getProductDesc());
-		buffer.append(" 降价了，欢迎购买!").append("\n");
+    public static void sendPromotionEmail(String emailInfo) throws Exception {
+        //默认以SMTP_SERVER 发送
+        //如果发送失败以ALT_SMTP_SERVER 重新发送
+        //如果还失败，throw new SMTPConnectionFailedException(emailInfo).
+    }
 
-		System.out.println(buffer.toString());
 
-		return buffer.toString();
-	}
 }
diff --git a/students/281918307/ood-srp/src/main/resources/log4j.properties b/students/281918307/ood-srp/src/main/resources/log4j.properties
index 508df51466..e70566ce70 100644
--- a/students/281918307/ood-srp/src/main/resources/log4j.properties
+++ b/students/281918307/ood-srp/src/main/resources/log4j.properties
@@ -1,8 +1,6 @@
 log4j.rootLogger=debug, stdout
-
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %l - %m%n
-
 # Third party loggers
- log4j.logger.com.ood=debug
+log4j.logger.com.ood=debug

From bc4a9256568e2390efa6acf41eb0a6e616e9a0b1 Mon Sep 17 00:00:00 2001
From: EricWang <wanghuanxi@gmail.com>
Date: Wed, 21 Jun 2017 16:03:24 +0800
Subject: [PATCH 256/332] ood-ocp-homework

---
 students/251822722/ocp/logType/LogType.java   | 12 ++++
 students/251822722/ocp/logType/RawLog.java    | 21 +++++++
 .../251822722/ocp/logType/RawLogWithDate.java | 26 ++++++++
 students/251822722/ocp/logger/DateLogger.java | 23 +++++++
 students/251822722/ocp/logger/Logger.java     | 60 +++++++++++++++++++
 students/251822722/ocp/logger/MailLogger.java | 24 ++++++++
 students/251822722/ocp/logger/SMSLogger.java  | 24 ++++++++
 students/251822722/ocp/util/DateUtil.java     | 10 ++++
 students/251822722/ocp/util/MailUtil.java     | 10 ++++
 students/251822722/ocp/util/SMSUtil.java      | 10 ++++
 10 files changed, 220 insertions(+)
 create mode 100644 students/251822722/ocp/logType/LogType.java
 create mode 100644 students/251822722/ocp/logType/RawLog.java
 create mode 100644 students/251822722/ocp/logType/RawLogWithDate.java
 create mode 100644 students/251822722/ocp/logger/DateLogger.java
 create mode 100644 students/251822722/ocp/logger/Logger.java
 create mode 100644 students/251822722/ocp/logger/MailLogger.java
 create mode 100644 students/251822722/ocp/logger/SMSLogger.java
 create mode 100644 students/251822722/ocp/util/DateUtil.java
 create mode 100644 students/251822722/ocp/util/MailUtil.java
 create mode 100644 students/251822722/ocp/util/SMSUtil.java

diff --git a/students/251822722/ocp/logType/LogType.java b/students/251822722/ocp/logType/LogType.java
new file mode 100644
index 0000000000..a5e4774518
--- /dev/null
+++ b/students/251822722/ocp/logType/LogType.java
@@ -0,0 +1,12 @@
+package ocp.logType;
+
+/**
+ * ocp.ocp
+ * Created by Eric Wang on 6/21/17.
+ */
+public interface LogType {
+
+    void  setMessage(String message);
+
+    String getMessage();
+}
diff --git a/students/251822722/ocp/logType/RawLog.java b/students/251822722/ocp/logType/RawLog.java
new file mode 100644
index 0000000000..cdbd4931fe
--- /dev/null
+++ b/students/251822722/ocp/logType/RawLog.java
@@ -0,0 +1,21 @@
+package ocp.logType;
+
+/**
+ * ocp.ocp.logType
+ * Created by Eric Wang on 6/21/17.
+ */
+public class RawLog implements LogType{
+
+    private  String logMsg;
+
+    @Override
+    public void setMessage(String message) {
+        logMsg = message;
+
+    }
+
+    @Override
+    public String getMessage() {
+        return logMsg;
+    }
+}
diff --git a/students/251822722/ocp/logType/RawLogWithDate.java b/students/251822722/ocp/logType/RawLogWithDate.java
new file mode 100644
index 0000000000..03044c7229
--- /dev/null
+++ b/students/251822722/ocp/logType/RawLogWithDate.java
@@ -0,0 +1,26 @@
+package ocp.logType;
+
+import ocp.util.DateUtil;
+
+/**
+ * ocp.ocp.logType
+ * Created by Eric Wang on 6/21/17.
+ */
+public class RawLogWithDate implements LogType {
+
+
+    private  String logMsg;
+
+    @Override
+    public void setMessage(String message) {
+
+        String txtDate = DateUtil.getCurrentDateAsString();
+        logMsg = txtDate + ": " + message;
+
+    }
+
+    @Override
+    public String getMessage() {
+        return logMsg;
+    }
+}
diff --git a/students/251822722/ocp/logger/DateLogger.java b/students/251822722/ocp/logger/DateLogger.java
new file mode 100644
index 0000000000..ddffbc0d91
--- /dev/null
+++ b/students/251822722/ocp/logger/DateLogger.java
@@ -0,0 +1,23 @@
+package ocp.logger;
+
+import ocp.logType.LogType;
+
+/**
+ * ocp.ocp.logger
+ * Created by Eric Wang on 6/21/17.
+ */
+public class DateLogger extends Logger {
+
+    LogType logType;
+
+    public DateLogger(LogType logType) {
+        this.logType = logType;
+    }
+
+
+    public void log(String msg) {
+
+        this.logType.setMessage(msg);
+        System.out.println(logType.getMessage());
+    }
+}
diff --git a/students/251822722/ocp/logger/Logger.java b/students/251822722/ocp/logger/Logger.java
new file mode 100644
index 0000000000..2c72f293de
--- /dev/null
+++ b/students/251822722/ocp/logger/Logger.java
@@ -0,0 +1,60 @@
+package ocp.logger;
+
+import ocp.logType.LogType;
+import ocp.logType.RawLog;
+import ocp.logType.RawLogWithDate;
+
+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;
+
+    public Logger(){
+
+    }
+
+
+
+    public Logger getLogger(int logType, int logMethod) {
+
+        LogType logTypeClass;
+        Logger logger;
+
+
+        switch (logType) {
+            case RAW_LOG:
+                logTypeClass = new RawLog();
+                break;
+            case RAW_LOG_WITH_DATE:
+                logTypeClass = new RawLogWithDate();
+                break;
+            default:
+                logTypeClass = new RawLog();
+
+        }
+
+
+        switch (logMethod) {
+            case EMAIL_LOG:
+                logger = new MailLogger(logTypeClass);
+                break;
+            case SMS_LOG:
+                logger = new SMSLogger(logTypeClass);
+                break;
+            case PRINT_LOG:
+                logger = new DateLogger(logTypeClass);
+                break;
+            default:
+                logger = new MailLogger(logTypeClass);
+
+        }
+
+        return logger;
+
+
+    }
+}
+
diff --git a/students/251822722/ocp/logger/MailLogger.java b/students/251822722/ocp/logger/MailLogger.java
new file mode 100644
index 0000000000..02878d1172
--- /dev/null
+++ b/students/251822722/ocp/logger/MailLogger.java
@@ -0,0 +1,24 @@
+package ocp.logger;
+
+import ocp.util.MailUtil;
+import ocp.logType.LogType;
+
+/**
+ * ocp.ocp.logger
+ * Created by Eric Wang on 6/21/17.
+ */
+public class MailLogger extends Logger {
+
+    LogType logType;
+
+    public MailLogger(LogType logType) {
+        this.logType = logType;
+    }
+
+
+    public void log(String msg) {
+
+        this.logType.setMessage(msg);
+        MailUtil.send(logType.getMessage());
+    }
+}
diff --git a/students/251822722/ocp/logger/SMSLogger.java b/students/251822722/ocp/logger/SMSLogger.java
new file mode 100644
index 0000000000..d9c5ca30f7
--- /dev/null
+++ b/students/251822722/ocp/logger/SMSLogger.java
@@ -0,0 +1,24 @@
+package ocp.logger;
+
+import ocp.util.SMSUtil;
+import ocp.logType.LogType;
+
+/**
+ * ocp.ocp.logger
+ * Created by Eric Wang on 6/21/17.
+ */
+public class SMSLogger extends Logger {
+
+    LogType logType;
+
+    public SMSLogger(LogType logType) {
+        this.logType = logType;
+    }
+
+
+    public void log(String msg) {
+
+        this.logType.setMessage(msg);
+        SMSUtil.send(logType.getMessage());
+    }
+}
diff --git a/students/251822722/ocp/util/DateUtil.java b/students/251822722/ocp/util/DateUtil.java
new file mode 100644
index 0000000000..a4361d96c0
--- /dev/null
+++ b/students/251822722/ocp/util/DateUtil.java
@@ -0,0 +1,10 @@
+package ocp.util;
+
+public class DateUtil {
+
+    public static String getCurrentDateAsString() {
+
+        return null;
+    }
+
+}
diff --git a/students/251822722/ocp/util/MailUtil.java b/students/251822722/ocp/util/MailUtil.java
new file mode 100644
index 0000000000..63c497f111
--- /dev/null
+++ b/students/251822722/ocp/util/MailUtil.java
@@ -0,0 +1,10 @@
+package ocp.util;
+
+public class MailUtil {
+
+    public static void send(String logMsg) {
+        // TODO Auto-generated method stub
+
+    }
+
+}
diff --git a/students/251822722/ocp/util/SMSUtil.java b/students/251822722/ocp/util/SMSUtil.java
new file mode 100644
index 0000000000..a31e93837c
--- /dev/null
+++ b/students/251822722/ocp/util/SMSUtil.java
@@ -0,0 +1,10 @@
+package ocp.util;
+
+public class SMSUtil {
+
+    public static void send(String logMsg) {
+        // TODO Auto-generated method stub
+
+    }
+
+}

From 9804e978ae0915af4b7ecf7e3c6c537217c50815 Mon Sep 17 00:00:00 2001
From: javmin <jianming@PC201608291017>
Date: Wed, 21 Jun 2017 16:18:59 +0800
Subject: [PATCH 257/332] =?UTF-8?q?ood=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/641013587/ood/ood-assignment/pom.xml | 47 ++++++++++++++
 .../com/coderising/ood/srp/Configuration.java | 23 +++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../ood/srp/constant/CommonConstant.java      | 14 +++++
 .../com/coderising/ood/srp/dao/UserDao.java   | 26 ++++++++
 .../com/coderising/ood/srp/entity/Msg.java    | 50 +++++++++++++++
 .../coderising/ood/srp/entity/Product.java    | 21 +++++++
 .../com/coderising/ood/srp/entity/User.java   | 20 ++++++
 .../ood/srp/main/PromotionMail.java           | 33 ++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 .../ood/srp/service/EmailService.java         | 61 +++++++++++++++++++
 .../ood/srp/service/UserService.java          | 17 ++++++
 .../com/coderising/ood/srp/util/FileUtil.java | 32 ++++++++++
 .../com/coderising/ood/srp/util/MailUtil.java | 20 ++++++
 .../ood/srp/util/PropertiesUtil.java          | 39 ++++++++++++
 .../com/coderising/ood/srp/values.properties  |  3 +
 16 files changed, 419 insertions(+)
 create mode 100644 students/641013587/ood/ood-assignment/pom.xml
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java
 create mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties

diff --git a/students/641013587/ood/ood-assignment/pom.xml b/students/641013587/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..65607712c0
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/pom.xml
@@ -0,0 +1,47 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+    <build>
+    	<plugins>
+    		 <!-- java编译插件 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.2</version>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+    	</plugins>
+    </build>
+</project>
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/641013587/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<String,String> 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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/641013587/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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java
new file mode 100644
index 0000000000..fcba3fc9c2
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/constant/CommonConstant.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp.constant;
+
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+
+public class CommonConstant {
+
+	public static final String SUBJECT = "您关注的产品降价了";
+	
+	public static String getProductMessage(User user,Product product){
+		return "尊敬的 "+user.getName()+", 您关注的产品 " + product.getProductDesc() + " 降价了，欢迎购买!";
+	}
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
new file mode 100644
index 0000000000..6b3d11c41b
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/dao/UserDao.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.dao;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.srp.entity.User;
+
+public class UserDao {
+	
+	/**
+	 * 应该从数据库读， 但是简化为直接生成。
+	 * @param sql
+	 * @return
+	 */
+	public  List<User> query(String sql){
+		
+		List<User> userList = new ArrayList<>();
+		for (int i = 1; i <= 3; i++) {
+			User userInfo = new User();
+			userInfo.setName("User" + i);
+			userInfo.setEmail("aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java
new file mode 100644
index 0000000000..8b1bc8b132
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Msg.java
@@ -0,0 +1,50 @@
+package com.coderising.ood.srp.entity;
+
+public class Msg {
+	
+	private String smtpHost ;
+	private String altSmtpHost;
+	private String fromAddress;
+	private String toAddress;
+	private String subject ;
+	private String message ;
+	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 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 getMessage() {
+		return message;
+	}
+	public void setMessage(String message) {
+		this.message = message;
+	}
+	
+	
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java
new file mode 100644
index 0000000000..a721930d75
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/Product.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.srp.entity;
+
+public class Product {
+	private String productID;
+	private String 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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java
new file mode 100644
index 0000000000..78f83b38a1
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/entity/User.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp.entity;
+
+public class User {
+	private String name;
+	private String 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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
new file mode 100644
index 0000000000..45191dc71d
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
@@ -0,0 +1,33 @@
+package com.coderising.ood.srp.main;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.Configuration;
+import com.coderising.ood.srp.ConfigurationKeys;
+import com.coderising.ood.srp.dao.UserDao;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.service.EmailService;
+import com.coderising.ood.srp.service.UserService;
+import com.coderising.ood.srp.util.FileUtil;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.util.PropertiesUtil;
+
+public class PromotionMail {
+
+	public static void main(String[] args) throws Exception {
+		EmailService emailService = new EmailService();
+		UserService userService = new UserService();
+		Product product = FileUtil.readRecommendProduct();
+		List<User> subscribeUsers = userService.getSubscribeUsers(product);
+		emailService.sendEMails(false, subscribeUsers, product);
+
+	}
+
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/641013587/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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
new file mode 100644
index 0000000000..0e46bf5c66
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
@@ -0,0 +1,61 @@
+package com.coderising.ood.srp.service;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import com.coderising.ood.srp.constant.CommonConstant;
+import com.coderising.ood.srp.entity.Msg;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+import com.coderising.ood.srp.util.MailUtil;
+import com.coderising.ood.srp.util.PropertiesUtil;
+
+public class EmailService {
+	public static void sendEmail(
+			boolean debug,Msg msg) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(msg.getFromAddress()).append("\n");
+		buffer.append("To:").append(msg.getToAddress()).append("\n");
+		buffer.append("Subject:").append(msg.getSubject()).append("\n");
+		buffer.append("Content:").append(msg.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+	
+	
+	public boolean sendEMails(boolean debug, List<User> mailingList, Product product) throws IOException 
+	{
+
+		System.out.println("开始发送邮件");
+		Msg basemsg = PropertiesUtil.BASEMSG;
+		for (User user : mailingList) {
+			try 
+			{
+				basemsg.setToAddress(user.getEmail());
+				basemsg.setSubject(CommonConstant.SUBJECT);
+				basemsg.setMessage(CommonConstant.getProductMessage(user, product));
+				if (basemsg.getToAddress().length() > 0)
+					MailUtil.sendEmail(debug,PropertiesUtil.BASEMSG);
+			} 
+			catch (Exception e) 
+			{
+				
+				try {
+					MailUtil.sendEmail(debug,PropertiesUtil.BASEMSG);
+					
+				} catch (Exception e2) 
+				{
+					System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); 
+				}
+				return false;
+			}
+			
+		}
+		return true;
+		
+	}
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
new file mode 100644
index 0000000000..214442bdcd
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/UserService.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.service;
+
+import java.util.List;
+
+import com.coderising.ood.srp.dao.UserDao;
+import com.coderising.ood.srp.entity.Product;
+import com.coderising.ood.srp.entity.User;
+
+public class UserService {
+
+	private UserDao userDao= new UserDao();
+	
+	public List<User> getSubscribeUsers(Product product){
+		return userDao.query("Select name from subscriptions where product_id= '" + product.getProductID() +"' and send_mail=1");
+	}
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
new file mode 100644
index 0000000000..4f2908a2c6
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.srp.util;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+import com.coderising.ood.srp.entity.Product;
+
+public class FileUtil {
+	
+	public static final String FILE_URL="C:\\Users\\Administrator\\git\\coding2017\\students\\641013587\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt";
+	
+	public static Product readRecommendProduct() throws IOException{
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(FILE_URL));
+			String temp = br.readLine();
+			String[] data = temp.split(" ");
+			Product product = new Product();
+			product.setProductID(data[0]);
+			product.setProductDesc(data[1]);
+			System.out.println("产品ID = " + product.getProductID() + "\n");
+			System.out.println("产品描述 = " + product.getProductDesc() + "\n");
+			return product;
+		} catch (IOException e) {
+			throw new IOException(e.getMessage());
+		} finally {
+			br.close();
+		}
+	}
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
new file mode 100644
index 0000000000..4387e6e73b
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.srp.util;
+
+import com.coderising.ood.srp.entity.Msg;
+
+public class MailUtil {
+
+	public static void sendEmail(
+			boolean debug,Msg msg) {
+		//假装发了一封邮件
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(msg.getFromAddress()).append("\n");
+		buffer.append("To:").append(msg.getToAddress()).append("\n");
+		buffer.append("Subject:").append(msg.getSubject()).append("\n");
+		buffer.append("Content:").append(msg.getMessage()).append("\n");
+		System.out.println(buffer.toString());
+		
+	}
+
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java
new file mode 100644
index 0000000000..7033920b35
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/util/PropertiesUtil.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.util;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import com.coderising.ood.srp.entity.Msg;
+
+public class PropertiesUtil {
+	public static final Properties pro;
+	public static final Msg BASEMSG = new Msg();
+	
+	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";
+	
+	
+	static{
+		pro = new Properties();
+		FileInputStream in = null ;
+		try {
+			in= new FileInputStream("C:\\Users\\Administrator\\git\\coding2017\\students\\641013587\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\values.properties");
+			pro.load(in);
+			BASEMSG.setAltSmtpHost(pro.getProperty(ALT_SMTP_SERVER));
+			BASEMSG.setSmtpHost(SMTP_SERVER);
+			BASEMSG.setFromAddress(EMAIL_ADMIN);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}finally {
+			try {
+				in.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	
+}
diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties
new file mode 100644
index 0000000000..1f67810743
--- /dev/null
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/values.properties
@@ -0,0 +1,3 @@
+smtp.server = smtp.163.com
+alt.smtp.server = smtp1.163.com
+email.admin = admin@company.com
\ No newline at end of file

From 4e2a19f13d5f7a2abcdb48771764aa715a94c4a0 Mon Sep 17 00:00:00 2001
From: javmin <jianming@PC201608291017>
Date: Wed, 21 Jun 2017 16:27:21 +0800
Subject: [PATCH 258/332] =?UTF-8?q?ood=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/Configuration.java | 23 -------------------
 .../coderising/ood/srp/ConfigurationKeys.java |  9 --------
 .../ood/srp/main/PromotionMail.java           |  2 --
 3 files changed, 34 deletions(-)
 delete mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 delete mode 100644 students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java

diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
deleted file mode 100644
index f328c1816a..0000000000
--- a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.coderising.ood.srp;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Configuration {
-
-	static Map<String,String> 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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
deleted file mode 100644
index 8695aed644..0000000000
--- a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
index 45191dc71d..217a42ceb1 100644
--- a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/main/PromotionMail.java
@@ -8,8 +8,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import com.coderising.ood.srp.Configuration;
-import com.coderising.ood.srp.ConfigurationKeys;
 import com.coderising.ood.srp.dao.UserDao;
 import com.coderising.ood.srp.entity.Product;
 import com.coderising.ood.srp.entity.User;

From 6a4b51197ca4559f648db44d723a365d60692152 Mon Sep 17 00:00:00 2001
From: yangzhm <yangzhm@hualu.com.cn>
Date: Wed, 21 Jun 2017 16:27:44 +0800
Subject: [PATCH 259/332] pull base source of OCP

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/Logger.java   | 38 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 10 +++++
 .../coderising/ood/ocp/good/Formatter.java    |  7 ++++
 .../ood/ocp/good/FormatterFactory.java        | 13 +++++++
 .../ood/ocp/good/HtmlFormatter.java           | 11 ++++++
 .../com/coderising/ood/ocp/good/Logger.java   | 18 +++++++++
 .../coderising/ood/ocp/good/RawFormatter.java | 11 ++++++
 .../com/coderising/ood/ocp/good/Sender.java   |  7 ++++
 10 files changed, 135 insertions(+)
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java

diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/495232796/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/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/495232796/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);
+
+}

From 5af33a4bb6af88de966bdc62d5884bda09e9be68 Mon Sep 17 00:00:00 2001
From: yangzhm <yangzhm@hualu.com.cn>
Date: Wed, 21 Jun 2017 16:29:48 +0800
Subject: [PATCH 260/332] modify project according to OCP rule

---
 .../com/coderising/ood/ocp/ComSender.java     |  7 +++++++
 .../java/com/coderising/ood/ocp/LogType.java  |  9 +++++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 19 +++----------------
 .../java/com/coderising/ood/ocp/MailUtil.java |  4 ++--
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  4 ++--
 .../java/com/coderising/ood/ocp/Sender.java   |  5 +++++
 .../com/coderising/ood/ocp/SenderFactory.java | 15 +++++++++++++++
 7 files changed, 43 insertions(+), 20 deletions(-)
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
 create mode 100644 students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java

diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java
new file mode 100644
index 0000000000..19f2c796b0
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/ComSender.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp;
+
+public class ComSender implements Sender {
+	public void send(String msg) {
+		System.out.println(msg);
+	}
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java
new file mode 100644
index 0000000000..d33d7d0240
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/LogType.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class LogType {
+	public static final int RAW_LOG = 1;
+	public static final int RAW_LOG_WITH_DATE = 2;
+	public static final int EMAIL_LOG = 1;
+	public static final int SMS_LOG = 2;
+	public static final int PRINT_LOG = 3;
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
index 0357c4d912..45525df9ba 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -1,13 +1,6 @@
 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;
 			
@@ -19,20 +12,14 @@ public void log(String msg){
 		
 		String logMsg = msg;
 		
-		if(this.type == RAW_LOG){
+		if(this.type == LogType.RAW_LOG){
 			logMsg = msg;
-		} else if(this.type == RAW_LOG_WITH_DATE){
+		} else if(this.type == LogType.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);
-		}
+		SenderFactory.createSender(type).send(logMsg);
 	}
 }
 
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
index ec54b839c5..dff0eb9748 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -1,8 +1,8 @@
 package com.coderising.ood.ocp;
 
-public class MailUtil {
+public class MailUtil implements Sender{
 
-	public static void send(String logMsg) {
+	public void send(String logMsg) {
 		// TODO Auto-generated method stub
 		
 	}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
index 13cf802418..be47b2c084 100644
--- a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -1,8 +1,8 @@
 package com.coderising.ood.ocp;
 
-public class SMSUtil {
+public class SMSUtil implements Sender {
 
-	public static void send(String logMsg) {
+	public void send(String logMsg) {
 		// TODO Auto-generated method stub
 		
 	}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
new file mode 100644
index 0000000000..4bb54aa1e8
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface Sender {
+	public void send(String msg);
+}
diff --git a/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java
new file mode 100644
index 0000000000..6915ff2992
--- /dev/null
+++ b/students/495232796/OOD/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.ocp;
+
+public class SenderFactory {
+	public static Sender createSender(int type) {
+		if(type == LogType.EMAIL_LOG){
+			return new MailUtil();
+		} else if(type == LogType.SMS_LOG){
+			return new SMSUtil();
+		} else if(type == LogType.PRINT_LOG){
+			return new ComSender();
+		}
+		
+		return new ComSender();
+	}
+}

From d5e10f962ed71bdbc4f9abc77a7d0f2a45736efb Mon Sep 17 00:00:00 2001
From: javmin <jianming@PC201608291017>
Date: Wed, 21 Jun 2017 16:42:36 +0800
Subject: [PATCH 261/332] bug

---
 .../coderising/ood/srp/service/EmailService.java | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
index 0e46bf5c66..0bd0841517 100644
--- a/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
+++ b/students/641013587/ood/ood-assignment/src/main/java/com/coderising/ood/srp/service/EmailService.java
@@ -13,18 +13,6 @@
 import com.coderising.ood.srp.util.PropertiesUtil;
 
 public class EmailService {
-	public static void sendEmail(
-			boolean debug,Msg msg) {
-		//假装发了一封邮件
-		StringBuilder buffer = new StringBuilder();
-		buffer.append("From:").append(msg.getFromAddress()).append("\n");
-		buffer.append("To:").append(msg.getToAddress()).append("\n");
-		buffer.append("Subject:").append(msg.getSubject()).append("\n");
-		buffer.append("Content:").append(msg.getMessage()).append("\n");
-		System.out.println(buffer.toString());
-		
-	}
-	
 	
 	public boolean sendEMails(boolean debug, List<User> mailingList, Product product) throws IOException 
 	{
@@ -38,13 +26,13 @@ public boolean sendEMails(boolean debug, List<User> mailingList, Product product
 				basemsg.setSubject(CommonConstant.SUBJECT);
 				basemsg.setMessage(CommonConstant.getProductMessage(user, product));
 				if (basemsg.getToAddress().length() > 0)
-					MailUtil.sendEmail(debug,PropertiesUtil.BASEMSG);
+					MailUtil.sendEmail(debug,basemsg);
 			} 
 			catch (Exception e) 
 			{
 				
 				try {
-					MailUtil.sendEmail(debug,PropertiesUtil.BASEMSG);
+					MailUtil.sendEmail(debug,basemsg);
 					
 				} catch (Exception e2) 
 				{

From 988a409828c6b1b5e749929861758524e361dc58 Mon Sep 17 00:00:00 2001
From: GordenChow <513274874@qq.com>
Date: Wed, 21 Jun 2017 16:44:03 +0800
Subject: [PATCH 262/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=AD=A3=E7=AC=AC?=
 =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

第二季第二次作业
---
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/Logger.java   | 39 +++++++++++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 10 +++++
 .../com/coderising/ood/ocp/mine/Fomatter.java |  8 ++++
 .../com/coderising/ood/ocp/mine/Logger.java   | 19 +++++++++
 .../ood/ocp/mine/MailProcessor.java           | 10 +++++
 .../ood/ocp/mine/PrintProcessor.java          | 10 +++++
 .../coderising/ood/ocp/mine/Processor.java    |  8 ++++
 .../ood/ocp/mine/RawLogFormatter.java         | 11 ++++++
 .../ood/ocp/mine/RawWithDateLogFormatter.java | 13 +++++++
 .../coderising/ood/ocp/mine/SMSProcessor.java | 10 +++++
 12 files changed, 158 insertions(+)
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java
 create mode 100644 students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java

diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..0d0d01098f
--- /dev/null
+++ b/students/513274874/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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..e404d9e702
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,39 @@
+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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..59d77649a2
--- /dev/null
+++ b/students/513274874/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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..fab4cd01b7
--- /dev/null
+++ b/students/513274874/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/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java
new file mode 100644
index 0000000000..6d107d54e9
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Fomatter.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public interface Fomatter {
+    public String format(String message);
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java
new file mode 100644
index 0000000000..e25da9ca4b
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Logger.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class Logger {
+
+    private Fomatter fomatter;
+    private Processor processor;
+
+    public Logger(Fomatter fomatter, Processor processor) {
+        this.fomatter = fomatter;
+        this.processor = processor;
+    }
+
+    public void log(String message){
+        processor.process(fomatter.format(message));
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java
new file mode 100644
index 0000000000..c3ce50d5ec
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/MailProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class MailProcessor implements Processor {
+    public void process(String message) {
+        System.out.println("Mail sending message :"+message);
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java
new file mode 100644
index 0000000000..13b983064d
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/PrintProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class PrintProcessor implements Processor {
+    public void process(String message) {
+        System.out.println("Printing message :"+message);
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java
new file mode 100644
index 0000000000..4cca74572f
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/Processor.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public interface Processor {
+    public void process(String message);
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java
new file mode 100644
index 0000000000..550361b511
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawLogFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class RawLogFormatter implements Fomatter {
+
+    public String format(String message) {
+        return message;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java
new file mode 100644
index 0000000000..80da623d5d
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/RawWithDateLogFormatter.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.ocp.mine;
+
+import java.util.Date;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class RawWithDateLogFormatter implements Fomatter {
+    public String format(String message) {
+        String txtDate = new Date().toString();
+        return txtDate + ":" + message;
+    }
+}
diff --git a/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java
new file mode 100644
index 0000000000..946c14dea0
--- /dev/null
+++ b/students/513274874/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/mine/SMSProcessor.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.mine;
+
+/**
+ * Created by guodongchow on 2017/6/21.
+ */
+public class SMSProcessor implements Processor {
+    public void process(String message) {
+        System.out.println("SMS sending message :" + message);
+    }
+}

From 3e1703a7763bea71581892b0deaa044f4a247163 Mon Sep 17 00:00:00 2001
From: skomefen <1072760797@qq.com>
Date: Wed, 21 Jun 2017 19:16:58 +0800
Subject: [PATCH 263/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=AD=A3=E7=AC=AC?=
 =?UTF-8?q?=E4=B8=80=E6=AC=A1=E5=A4=A7=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/com/coderising/ood/ocp/DateUtil.java  | 10 +++
 .../src/com/coderising/ood/ocp/Logger.java    | 38 +++++++++
 .../src/com/coderising/ood/ocp/MailUtil.java  | 10 +++
 .../src/com/coderising/ood/ocp/SMSUtil.java   | 10 +++
 .../coderising/ood/ocp/good/Formatter.java    |  7 ++
 .../ood/ocp/good/FormatterFactory.java        | 13 ++++
 .../ood/ocp/good/HtmlFormatter.java           | 11 +++
 .../com/coderising/ood/ocp/good/Logger.java   | 18 +++++
 .../coderising/ood/ocp/good/RawFormatter.java | 11 +++
 .../com/coderising/ood/ocp/good/Sender.java   |  7 ++
 .../com/coderising/ood/srp/Configuration.java | 58 ++++++++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../coderising/ood/srp/ConfigureEmail.java    | 58 ++++++++++++++
 .../src/com/coderising/ood/srp/DBUtil.java    | 27 +++++++
 .../src/com/coderising/ood/srp/EmailBean.java | 50 ++++++++++++
 .../src/com/coderising/ood/srp/MailUtil.java  | 24 ++++++
 .../com/coderising/ood/srp/MailingDao.java    | 23 ++++++
 .../src/com/coderising/ood/srp/Product.java   | 62 +++++++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 77 +++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +
 20 files changed, 527 insertions(+)
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/good/Formatter.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/good/FormatterFactory.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/good/HtmlFormatter.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/good/Logger.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/good/RawFormatter.java
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/good/Sender.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/ConfigureEmail.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/EmailBean.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/MailingDao.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/Product.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1072760797/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1072760797/src/com/coderising/ood/ocp/DateUtil.java b/students/1072760797/src/com/coderising/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/Logger.java b/students/1072760797/src/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/MailUtil.java b/students/1072760797/src/com/coderising/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/SMSUtil.java b/students/1072760797/src/com/coderising/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/good/Formatter.java b/students/1072760797/src/com/coderising/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..b6e2ccbc16
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/good/FormatterFactory.java b/students/1072760797/src/com/coderising/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..3c2009a674
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/good/HtmlFormatter.java b/students/1072760797/src/com/coderising/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..3d375f5acc
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/good/Logger.java b/students/1072760797/src/com/coderising/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..f206472d0d
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/good/RawFormatter.java b/students/1072760797/src/com/coderising/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..7f1cb4ae30
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/ocp/good/Sender.java b/students/1072760797/src/com/coderising/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..aaa46c1fb7
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/srp/Configuration.java b/students/1072760797/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..c458c8774a
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,58 @@
+package com.coderising.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	private static Map<String,String> configurations = new HashMap<>();
+	private static String smtpHost;
+	private static String altSmtpHost;
+	private static String fromAddress;
+	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 Configuration(){
+		setSMTPHost();
+		setAltSMTPHost();
+		setFromAddress();
+	}
+	public String getProperty(String key) {
+		
+		return configurations.get(key);
+	}
+
+	protected void setSMTPHost() 
+	{
+		smtpHost = this.getProperty(ConfigurationKeys.SMTP_SERVER); 
+	}
+	
+	protected void setAltSMTPHost() 
+	{
+		altSmtpHost = this.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); 
+
+	}
+	
+	protected void setFromAddress() 
+	{
+			fromAddress = this.getProperty(ConfigurationKeys.EMAIL_ADMIN); 
+	}
+	
+	public static String getSmtpHost() {
+		return smtpHost;
+	}
+	public static String getAltSmtpHost() {
+		return altSmtpHost;
+	}
+	public static String getFromAddress() {
+		return fromAddress;
+	}
+
+	
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/1072760797/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/1072760797/src/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/1072760797/src/com/coderising/ood/srp/ConfigureEmail.java b/students/1072760797/src/com/coderising/ood/srp/ConfigureEmail.java
new file mode 100644
index 0000000000..87af1e42db
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/ConfigureEmail.java
@@ -0,0 +1,58 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+public class ConfigureEmail {
+
+	private static final String NAME_KEY = "NAME";
+	private static final String EMAIL_KEY = "EMAIL";
+
+	private Configuration config = null;
+	private EmailBean email = new EmailBean();
+	private Product product;
+
+	private String message;
+	private String subject;
+	private String toAddress;
+
+	public ConfigureEmail(Configuration config, Product product,
+			HashMap userInfo) {
+
+		this.config = config;
+		this.product = product;
+
+		setMessage(userInfo);
+		setToAddress(userInfo);
+
+		setBean();
+
+	}
+
+	private void setBean() {
+
+		email.setFromAddress(config.getFromAddress());
+		email.setMessage(message);
+		email.setSmtpHost(config.getSmtpHost());
+		email.setSubject(subject);
+		email.setToAddress(toAddress);
+	}
+
+	public EmailBean getEmail() {
+		return email;
+	}
+
+	public void setMessage(HashMap userInfo) {
+
+		String name = (String) userInfo.get(NAME_KEY);
+
+		subject = "您关注的产品降价了";
+		message = "尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc()
+				+ " 降价了，欢迎购买!";
+	}
+
+	protected void setToAddress(HashMap userInfo) {
+		toAddress = (String) userInfo.get(EMAIL_KEY);
+	}
+
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/DBUtil.java b/students/1072760797/src/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..7597905da1
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/DBUtil.java
@@ -0,0 +1,27 @@
+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/1072760797/src/com/coderising/ood/srp/EmailBean.java b/students/1072760797/src/com/coderising/ood/srp/EmailBean.java
new file mode 100644
index 0000000000..d5923b9f28
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/EmailBean.java
@@ -0,0 +1,50 @@
+package com.coderising.ood.srp;
+
+public class EmailBean {
+	private String toAddress;
+	private String fromAddress;
+	private String subject;
+	private String message;
+	private String smtpHost;
+
+	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;
+	}
+
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/MailUtil.java b/students/1072760797/src/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..508a11f3d8
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,24 @@
+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());
+
+	}
+
+	public static void sendEmail(EmailBean email, boolean debug) {
+		// TODO Auto-generated method stub
+		sendEmail(email.getToAddress(), email.getFromAddress(),
+				email.getSubject(), email.getMessage(), email.getSmtpHost(),
+				debug);
+	}
+
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/MailingDao.java b/students/1072760797/src/com/coderising/ood/srp/MailingDao.java
new file mode 100644
index 0000000000..cb5924f604
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/MailingDao.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class MailingDao {
+
+	private String sendMailQuery;
+	public List getQuery(String productID) throws Exception {
+		
+		sendMailQuery = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		
+		
+		System.out.println("loadQuery set");
+		
+		return loadMailingList();
+	}
+
+	private List loadMailingList() throws Exception {
+		return DBUtil.query(this.sendMailQuery);
+	}
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/Product.java b/students/1072760797/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..7b5abd3c88
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,62 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class Product {
+	
+	private File file = null;
+	private	String productID;
+	private String productDesc;
+	public Product(){}
+	public Product(File file) throws IOException{
+		this.file = file;
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		readFile(file);
+	}
+	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();
+		}
+	}
+	
+	public void setFile(File file) throws IOException {
+		this.file = file;
+		readFile(file);
+	}
+	public String getProductID() {
+		if(productID.isEmpty()){
+			throw new RuntimeException("no productID");
+		}
+		return productID;
+	}
+	public void setProductID(String productID) {
+		this.productID = productID;
+	}
+	public String getProductDesc() {
+		if(productDesc.isEmpty()){
+			throw new RuntimeException("no productDesc");
+		}
+		return productDesc;
+	}
+	public void setProductDesc(String productDesc) {
+		this.productDesc = productDesc;
+	}
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/PromotionMail.java b/students/1072760797/src/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..b2713840e0
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/srp/PromotionMail.java
@@ -0,0 +1,77 @@
+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 {
+
+	List mailingList = null;
+	private static Configuration config;
+
+	private Product product = null;
+
+	public static void main(String[] args) throws Exception {
+		File f = new File("src/com/coderising/ood/srp/product_promotion.txt");
+		boolean emailDebug = false;
+
+		PromotionMail pe = new PromotionMail(f, emailDebug);
+
+	}
+
+	public PromotionMail(File file, boolean mailDebug) throws Exception {
+
+		init(file, mailDebug);
+
+	}
+
+	private void init(File file, boolean mailDebug) throws Exception {
+		product = new Product(file);
+		config = new Configuration();
+		MailingDao dao = new MailingDao();
+		mailingList = dao.getQuery(product.getProductID());
+
+		sendEMails(mailDebug, mailingList);
+
+	}
+
+	protected void sendEMails(boolean debug, List mailingList)
+			throws IOException {
+
+		System.out.println("开始发送邮件");
+
+		if (mailingList != null) {
+			Iterator iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				ConfigureEmail ce = new ConfigureEmail(config, product,
+						(HashMap) iter.next());
+				EmailBean email = ce.getEmail();
+				try {
+					if (email.getToAddress().length() > 0)
+						MailUtil.sendEmail(email, debug);
+				} catch (Exception e) {
+
+					try {
+						MailUtil.sendEmail(email, debug);
+
+					} catch (Exception e2) {
+						System.out.println("通过备用 SMTP服务器发送邮件失败: "
+								+ e2.getMessage());
+					}
+				}
+			}
+
+		}
+
+		else {
+			System.out.println("没有邮件发送");
+
+		}
+
+	}
+}
diff --git a/students/1072760797/src/com/coderising/ood/srp/product_promotion.txt b/students/1072760797/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/1072760797/src/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

From af065578cd2fb97b12d79d5a53a09a0e7889bbdf Mon Sep 17 00:00:00 2001
From: skomefen <1072760797@qq.com>
Date: Wed, 21 Jun 2017 20:13:23 +0800
Subject: [PATCH 264/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=AD=A3=E7=AC=AC?=
 =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E5=B0=8F=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/com/coderising/ood/ocp/Logger.java    | 39 +++++--------------
 .../com/coderising/ood/ocp/RAW_Logger.java    | 18 +++++++++
 2 files changed, 27 insertions(+), 30 deletions(-)
 create mode 100644 students/1072760797/src/com/coderising/ood/ocp/RAW_Logger.java

diff --git a/students/1072760797/src/com/coderising/ood/ocp/Logger.java b/students/1072760797/src/com/coderising/ood/ocp/Logger.java
index 0357c4d912..b89d355fef 100644
--- a/students/1072760797/src/com/coderising/ood/ocp/Logger.java
+++ b/students/1072760797/src/com/coderising/ood/ocp/Logger.java
@@ -1,38 +1,17 @@
 package com.coderising.ood.ocp;
 
-public class Logger {
+public abstract 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){
+				
+		setMsg(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);
-		}
+		sendMsg(msg);
 	}
+	
+	public abstract void setMsg(String msg);
+	public abstract void sendMsg(String logMsg);
+
 }
 
diff --git a/students/1072760797/src/com/coderising/ood/ocp/RAW_Logger.java b/students/1072760797/src/com/coderising/ood/ocp/RAW_Logger.java
new file mode 100644
index 0000000000..c3e684e735
--- /dev/null
+++ b/students/1072760797/src/com/coderising/ood/ocp/RAW_Logger.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.ocp;
+
+public class RAW_Logger extends Logger {
+
+	@Override
+	public void setMsg(String msg) {
+		// TODO Auto-generated method stub
+		String logMsg = msg;
+		logMsg = msg;
+	}
+
+	@Override
+	public void sendMsg(String logMsg) {
+		// TODO Auto-generated method stub
+		MailUtil.send(logMsg);
+	}
+
+}

From 4e650533c4cd08f1dc4e4d8b7d10cdc8482174ba Mon Sep 17 00:00:00 2001
From: YouHmilyForProgramming <706097141@qq.com>
Date: Wed, 21 Jun 2017 20:38:51 +0800
Subject: [PATCH 265/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ocp/DateUtil.java"                               | 10 ++++++++++
 .../ocp/EmailLogger.java"                            |  9 +++++++++
 .../ocp/LogOutput.java"                              |  8 ++++++++
 .../ocp/Logger.java"                                 |  7 +++++++
 .../ocp/MailUtil.java"                               | 10 ++++++++++
 .../ocp/PrintLogger.java"                            |  9 +++++++++
 .../ocp/RawLogOutput.java"                           |  9 +++++++++
 .../ocp/RawLogWithDateOutput.java"                   | 12 ++++++++++++
 .../ocp/SMSUtil.java"                                | 10 ++++++++++
 .../ocp/SmsLogger.java"                              | 11 +++++++++++
 10 files changed, 95 insertions(+)
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/DateUtil.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/MailUtil.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SMSUtil.java"
 create mode 100644 "students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java"

diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/DateUtil.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/DateUtil.java"
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/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/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java"
new file mode 100644
index 0000000000..7a51f98c23
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/EmailLogger.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class EmailLogger extends Logger{
+	
+	public void log(String msg){
+		MailUtil.send(msg);
+	}
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java"
new file mode 100644
index 0000000000..caf9986293
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/LogOutput.java"
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp;
+
+public abstract class LogOutput {
+	
+	
+	public abstract void logOutput(String msg,Logger logger);
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java"
new file mode 100644
index 0000000000..8913377e5a
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/Logger.java"
@@ -0,0 +1,7 @@
+package com.coderising.ood.ocp;
+
+public abstract class Logger {
+	
+	public abstract void log(String msg);
+}
+
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/MailUtil.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/MailUtil.java"
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/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/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java"
new file mode 100644
index 0000000000..6960fb9af3
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/PrintLogger.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class PrintLogger extends Logger{
+	
+public void log(String msg){
+		System.out.println(msg);
+	}
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java"
new file mode 100644
index 0000000000..9603d16687
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogOutput.java"
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp;
+
+public class RawLogOutput extends LogOutput{
+
+	public void logOutput(String msg,Logger logger) {
+		logger.log(msg);
+	}
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java"
new file mode 100644
index 0000000000..5f414d992d
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/RawLogWithDateOutput.java"
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class RawLogWithDateOutput extends LogOutput{
+
+	@Override
+	public void logOutput(String msg,Logger logger) {
+		String txtDate = DateUtil.getCurrentDateAsString();
+		String logMsg = txtDate + ": " + msg;
+		logger.log(logMsg);
+	}
+
+}
diff --git "a/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SMSUtil.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SMSUtil.java"
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/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/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java" "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java"
new file mode 100644
index 0000000000..8a22e52e78
--- /dev/null
+++ "b/students/706097141/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/ocp/SmsLogger.java"
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SmsLogger extends Logger{
+
+	
+   public void log(String msg){
+		
+		SMSUtil.send(msg);
+	}
+
+}

From 2235a2e8e886a715119a5b480521ea90d03fe67f Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Thu, 22 Jun 2017 08:11:38 +0800
Subject: [PATCH 266/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9Av2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/EmailParam.java    |  43 +++-
 .../com/coderising/ood/srp/MailService.java   | 116 +++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java |   4 +-
 .../com/coderising/ood/srp/ProductInfo.java   |  65 ++++++
 .../com/coderising/ood/srp/PromotionMail.java | 186 +-----------------
 .../java/com/coderising/ood/srp/UserDao.java  |  26 +++
 6 files changed, 254 insertions(+), 186 deletions(-)
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/MailService.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java

diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java b/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
index 934ff2139b..3a9fd4f2f0 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
@@ -1,8 +1,49 @@
 package com.coderising.ood.srp;
 
+
 /**
  * Created by thomas_young on 20/6/2017.
  */
 public class EmailParam {
-    protected String smtpHost = null;
+    private String smtpHost = null;
+    private String altSmtpHost = null;
+    private static Configuration config = new Configuration();
+    private String fromAddress = null;
+
+    protected void setFromAddress()
+    {
+        fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
+    }
+
+    private void loadEmailConfig() {
+        setFromAddress();
+        setSMTPHost();
+        setAltSMTPHost();
+    }
+
+    public EmailParam() {
+        loadEmailConfig();
+    }
+
+    public String getSmtpHost() {
+        return smtpHost;
+    }
+
+    private void setSMTPHost()
+    {
+        smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
+    }
+
+    public String getAltSmtpHost() {
+        return altSmtpHost;
+    }
+
+    public String getFromAddress() {
+        return fromAddress;
+    }
+
+    private void setAltSMTPHost()
+    {
+        altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
+    }
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/MailService.java b/students/812350401/src/main/java/com/coderising/ood/srp/MailService.java
new file mode 100644
index 0000000000..7b01d47575
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/MailService.java
@@ -0,0 +1,116 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Created by thomas_young on 20/6/2017.
+ */
+public class MailService {
+    private static final String NAME_KEY = "NAME";
+    private static final String EMAIL_KEY = "EMAIL";
+    private static String fromAddress;
+    private static EmailParam emailParam;
+
+    static {
+        emailParam = new EmailParam();
+        fromAddress = emailParam.getFromAddress();
+    }
+
+    public void sendMails(boolean debug) throws Exception {
+        ProductInfo productInfo = new ProductInfo();
+        UserDao userDao = new UserDao();
+        List userInfos = userDao.loadMailingList(productInfo.getProductID());
+        List<MailInfo> mailInfos = convertToMails(userInfos, productInfo);
+        System.out.println("开始发送邮件");
+        for (MailInfo mail: mailInfos) {
+            sendOneMail(mail, debug);
+        }
+
+    }
+
+    private void sendOneMail(MailInfo mail, boolean debug) {
+        try {
+            MailUtil.sendEmail(
+                    mail.getToAddress(),
+                    fromAddress,
+                    mail.getSubject(),
+                    mail.getMessage(),
+                    emailParam.getSmtpHost(), debug);
+        } catch (Exception e) {
+
+            try {
+                MailUtil.sendEmail(mail.getToAddress(),
+                        fromAddress,
+                        mail.getSubject(),
+                        mail.getMessage(),
+                        emailParam.getAltSmtpHost(),
+                        debug);
+            } catch (Exception e2)
+            {
+                System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+            }
+        }
+    }
+
+    public static class MailInfo {
+
+        public String getFromAddress() {
+            return fromAddress;
+        }
+
+        public String getToAddress() {
+            return toAddress;
+        }
+
+        public String getSubject() {
+            return subject;
+        }
+
+        public String getMessage() {
+            return message;
+        }
+
+        private String fromAddress = null;
+        private String toAddress = null;
+        private String subject = null;
+        private String message = null;
+
+
+        public MailInfo(String fromAddress, String toAddress, String subject, String message) {
+            this.fromAddress = fromAddress;
+            this.toAddress = toAddress;
+            this.subject = subject;
+            this.message = message;
+        }
+    }
+
+    private List<MailInfo> convertToMails(List userInfos, ProductInfo productInfo) throws IOException {
+        List<MailInfo> mailInfos = new LinkedList<>();
+        if (userInfos != null) {
+            Iterator iter = userInfos.iterator();
+            while (iter.hasNext()) {
+                MailInfo mailInfo = configureEMail((HashMap) iter.next(), productInfo);
+                if (mailInfo != null) {
+                    mailInfos.add(mailInfo);
+                }
+            }
+        }
+        return mailInfos;
+    }
+
+    private MailInfo configureEMail(HashMap userInfo, ProductInfo productInfo) throws IOException
+    {
+        String toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0) {
+            String name = (String) userInfo.get(NAME_KEY);
+            String subject = "您关注的产品降价了";
+            String message = "尊敬的 "+name+", 您关注的产品 " + productInfo.getProductDesc() + " 降价了，欢迎购买!" ;
+            return new MailInfo(fromAddress, toAddress, subject, message);
+        }
+        return null;
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
index 9f9e749af7..3e81821544 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -1,5 +1,8 @@
 package com.coderising.ood.srp;
 
+
+import java.util.concurrent.atomic.AtomicInteger;
+
 public class MailUtil {
 
 	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
@@ -11,7 +14,6 @@ public static void sendEmail(String toAddress, String fromAddress, String subjec
 		buffer.append("Subject:").append(subject).append("\n");
 		buffer.append("Content:").append(message).append("\n");
 		System.out.println(buffer.toString());
-		
 	}
 
 	
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java
new file mode 100644
index 0000000000..6d74acb3bf
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java
@@ -0,0 +1,65 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Created by thomas_young on 20/6/2017.
+ */
+public class ProductInfo {
+    private String productID = null;
+    private String productDesc = null;
+
+    private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+
+    public ProductInfo() {
+        try {
+            readFileSetProperty();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+     * @throws IOException
+     */
+    private void readFileSetProperty() throws IOException
+    {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(f));
+            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();
+        }
+    }
+
+    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/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
index b359f3aa6f..bd635ea702 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -10,190 +10,8 @@
 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("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/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("没有邮件发送");
-			
-		}
-
+        MailService mailService = new MailService();
+        mailService.sendMails(true);
 	}
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java b/students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java
new file mode 100644
index 0000000000..49a0ce4040
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * Created by thomas_young on 21/6/2017.
+ */
+public class UserDao {
+    private String sendMailQuery = null;
+
+    private void setLoadQuery(String productID) throws Exception {
+
+        sendMailQuery = "Select name from subscriptions "
+                + "where product_id= '" + productID +"' "
+                + "and send_mail=1 ";
+
+
+        System.out.println("loadQuery set");
+    }
+
+    public List loadMailingList(String productID) throws Exception {
+        setLoadQuery(productID);
+        return DBUtil.query(this.sendMailQuery);
+    }
+
+}

From a84bcec61bae01daa8e33d85c8405733ef478cb4 Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Thu, 22 Jun 2017 08:12:52 +0800
Subject: [PATCH 267/332] =?UTF-8?q?Revert=20"=E7=AC=AC=E4=B8=80=E6=AC=A1?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A=20init2"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This reverts commit 3f84999c2816fe5592a7f8964092f89d7903f38f.
---
 liuxin/ood/ood-assignment/pom.xml                   | 13 -------------
 .../java/com/coderising/ood/srp/PromotionMail.java  |  2 +-
 2 files changed, 1 insertion(+), 14 deletions(-)

diff --git a/liuxin/ood/ood-assignment/pom.xml b/liuxin/ood/ood-assignment/pom.xml
index 9a28365d2a..cac49a5328 100644
--- a/liuxin/ood/ood-assignment/pom.xml
+++ b/liuxin/ood/ood-assignment/pom.xml
@@ -10,19 +10,6 @@
   <name>ood-assignment</name>
   <url>http://maven.apache.org</url>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
index 9d07330831..781587a846 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
@@ -35,7 +35,7 @@ public class PromotionMail {
 
 	public static void main(String[] args) throws Exception {
 
-		File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+		File f = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt");
 		boolean emailDebug = false;
 
 		PromotionMail pe = new PromotionMail(f, emailDebug);

From 04778833b4bdcd7197780072ec1d45bddb2bc420 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Thu, 22 Jun 2017 08:57:06 +0800
Subject: [PATCH 268/332] srp homework refactor

---
 .../srp/good/template/MailBodyTemplate.java   |  5 +++
 .../good/template/TextMailBodyTemplate.java   | 19 ++++++++++
 .../ood/srp/good1/Configuration.java          | 23 ++++++++++++
 .../ood/srp/good1/ConfigurationKeys.java      |  9 +++++
 .../com/coderising/ood/srp/good1/Mail.java    | 29 +++++++++++++++
 .../coderising/ood/srp/good1/MailSender.java  | 35 +++++++++++++++++++
 .../com/coderising/ood/srp/good1/Product.java | 14 ++++++++
 .../ood/srp/good1/ProductService.java         |  9 +++++
 .../ood/srp/good1/PromotionJob.java           | 24 +++++++++++++
 .../com/coderising/ood/srp/good1/User.java    | 24 +++++++++++++
 .../coderising/ood/srp/good1/UserService.java | 11 ++++++
 .../ood/srp/good2/ProductService.java         | 12 +++++++
 .../coderising/ood/srp/good2/UserService.java | 13 +++++++
 13 files changed, 227 insertions(+)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/MailBodyTemplate.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/TextMailBodyTemplate.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ConfigurationKeys.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/MailBodyTemplate.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/MailBodyTemplate.java
new file mode 100644
index 0000000000..e5df642be9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/MailBodyTemplate.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.srp.good.template;
+
+public interface MailBodyTemplate {
+	public String render();
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/TextMailBodyTemplate.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/TextMailBodyTemplate.java
new file mode 100644
index 0000000000..38793717a8
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good/template/TextMailBodyTemplate.java
@@ -0,0 +1,19 @@
+package com.coderising.ood.srp.good.template;
+
+import java.util.Map;
+
+public class TextMailBodyTemplate implements MailBodyTemplate {
+	
+	private Map<String,String >paramMap ;
+	
+	public TextMailBodyTemplate(Map<String,String> map){
+		paramMap = map;
+	}
+	
+	@Override
+	public String render() {
+		//使用某种模板技术实现Render
+		return null;
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java
new file mode 100644
index 0000000000..55f0fad677
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Configuration.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.srp.good1;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ConfigurationKeys.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ConfigurationKeys.java
new file mode 100644
index 0000000000..945db9004a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.good1;
+
+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/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java
new file mode 100644
index 0000000000..83099ed16a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Mail.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.good1;
+
+import java.util.List;
+
+import com.coderising.ood.srp.good.template.MailBodyTemplate;
+
+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<Product> products = user.getSubscribedProducts();
+		//.... 实现略...
+		return null;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
new file mode 100644
index 0000000000..0503d1a88b
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.good1;
+
+public class MailSender {
+	
+	private String fromAddress ;
+	private String smtpHost;
+	private String altSmtpHost;
+	
+	public MailSender(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();
+		//发送邮件
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java
new file mode 100644
index 0000000000..55617461cd
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/Product.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp.good1;
+
+
+
+public class Product {
+	
+	private String id;
+	private String desc;
+	public String getDescription(){
+		return desc;
+	}
+	
+	
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java
new file mode 100644
index 0000000000..4109bfa9dc
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/ProductService.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.good1;
+
+
+public class ProductService {
+	public Product getPromotionProduct(){
+		//从文本文件中读取文件列表
+		return null;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java
new file mode 100644
index 0000000000..8e41069bd9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/PromotionJob.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp.good1;
+
+import java.util.List;
+
+public class PromotionJob {
+	
+	private ProductService productService = null ; //获取production service
+	private UserService userService = null ;// 获取UserService
+	
+	public void run(){
+		
+		Configuration cfg = new Configuration();
+		
+		Product p = productService.getPromotionProduct();
+		
+		List<User> users = userService.getUsers(p);
+		
+		MailSender mailSender = new MailSender(cfg);
+		
+		for(User user : users){
+			mailSender.sendMail(new Mail(user));
+		}
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java
new file mode 100644
index 0000000000..114476bb64
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/User.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp.good1;
+
+import java.util.List;
+
+
+
+public class User {
+	
+	private String name;
+	private String emailAddress;
+	
+	private List<Product> subscribedProducts; 
+	
+	public String getName(){
+		return name;
+	}
+	public String getEMailAddress() {		
+		return emailAddress;
+	}
+	public List<Product> getSubscribedProducts(){
+		return this.subscribedProducts;
+	}
+	
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java
new file mode 100644
index 0000000000..1e08138cff
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/UserService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp.good1;
+
+import java.util.List;
+
+public class UserService {
+	
+	public List<User> getUsers(Product product){
+		//调用DAO相关的类从数据库中读取订阅产品的用户列表
+		return null;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java
new file mode 100644
index 0000000000..5ca5636291
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/ProductService.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.srp.good2;
+
+import java.util.List;
+
+import com.coderising.ood.srp.good1.Product;
+
+public class ProductService {
+	public List<Product> getPromotionProducts(){
+		//从文本文件中读取文件列表
+		return null;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java
new file mode 100644
index 0000000000..f86307e701
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good2/UserService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp.good2;
+
+import java.util.List;
+
+import com.coderising.ood.srp.good1.Product;
+import com.coderising.ood.srp.good1.User;
+
+public class UserService {
+	public List<User> getUsers(List<Product> products){
+		//调用DAO相关的类从数据库中读取订阅产品的用户列表
+		return null;
+	}
+}

From fbd64c7a8f27cedbdbdba7a0b4be5b3eb5c29bf7 Mon Sep 17 00:00:00 2001
From: Harry <chenhaowei93@163.com>
Date: Thu, 22 Jun 2017 23:24:31 +0800
Subject: [PATCH 269/332] add ocp refactor
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

20170622 完成ocp重构
---
 .../src/com/coderising/ood/ocp/Formatter.java |  5 +++++
 .../coderising/ood/ocp/FormatterFactory.java  | 14 +++++++++++++
 .../com/coderising/ood/ocp/HtmlFormatter.java | 11 ++++++++++
 .../com/coderising/ood/ocp/LogTestDrive.java  | 20 +++++++++++++++++++
 .../src/com/coderising/ood/ocp/Logger.java    | 15 ++++++++++++++
 .../com/coderising/ood/ocp/MailSenderImp.java | 12 +++++++++++
 .../coderising/ood/ocp/PrintSenderImp.java    | 11 ++++++++++
 .../com/coderising/ood/ocp/RawFormatter.java  | 10 ++++++++++
 .../com/coderising/ood/ocp/SMSSenderImp.java  | 11 ++++++++++
 .../src/com/coderising/ood/ocp/Sender.java    |  5 +++++
 .../com/coderising/ood/ocp/SenderFactory.java | 17 ++++++++++++++++
 11 files changed, 131 insertions(+)
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/Formatter.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/RawFormatter.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/Sender.java
 create mode 100644 students/727171008/src/com/coderising/ood/ocp/SenderFactory.java

diff --git a/students/727171008/src/com/coderising/ood/ocp/Formatter.java b/students/727171008/src/com/coderising/ood/ocp/Formatter.java
new file mode 100644
index 0000000000..07391dacab
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/Formatter.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface Formatter {
+    String formate(String msg);
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java b/students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java
new file mode 100644
index 0000000000..4d6cc9603e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/FormatterFactory.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.ocp;
+
+public class FormatterFactory {
+    public Formatter createFormatter(int type) {
+	Formatter formatter = null;
+	if (type == 1) {
+	    formatter = new RawFormatter();
+	}
+	if (type == 2) {
+	    formatter = new HtmlFormatter();
+	}
+	return formatter;
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java b/students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java
new file mode 100644
index 0000000000..6d3d76f58e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/HtmlFormatter.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class HtmlFormatter implements Formatter {
+
+    @Override
+    public String formate(String msg) {
+	
+	return null;
+    }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java b/students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java
new file mode 100644
index 0000000000..d96987e6d4
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/LogTestDrive.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.ocp;
+
+public class LogTestDrive {
+
+    public static void main(String[] args) {
+	FormatterFactory ff = new FormatterFactory();
+	SenderFactory sf = new SenderFactory();
+	
+	Formatter formatter = ff.createFormatter(1);
+	Sender sender = sf.createSender(1);
+	
+	Logger logger = new Logger(formatter, sender);
+	String msg = "此处应该从文本读取？或者html读取？";
+	logger.log(msg);
+	
+	System.out.println("end");
+
+    }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/Logger.java b/students/727171008/src/com/coderising/ood/ocp/Logger.java
new file mode 100644
index 0000000000..a02cf8658c
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/Logger.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.ocp;
+
+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.formate(msg));
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java b/students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java
new file mode 100644
index 0000000000..ab79fe070b
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/MailSenderImp.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp;
+
+public class MailSenderImp implements Sender {
+
+    @Override
+    public String send(String msg) {
+
+	return "Raw data ";
+
+    }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java b/students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java
new file mode 100644
index 0000000000..22a4c8db2b
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/PrintSenderImp.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class PrintSenderImp implements Sender {
+
+    @Override
+    public String send(String msg) {
+
+	return "print ";
+    }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/RawFormatter.java b/students/727171008/src/com/coderising/ood/ocp/RawFormatter.java
new file mode 100644
index 0000000000..762917e981
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/RawFormatter.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp;
+
+public class RawFormatter implements Formatter {
+
+    @Override
+    public String formate(String msg) {
+	return null;
+    }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java b/students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java
new file mode 100644
index 0000000000..6aaa16f23e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/SMSSenderImp.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp;
+
+public class SMSSenderImp implements Sender {
+
+    @Override
+    public String send(String msg) {
+	
+	return "SMS data ";
+    }
+
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/Sender.java b/students/727171008/src/com/coderising/ood/ocp/Sender.java
new file mode 100644
index 0000000000..4c54985454
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/Sender.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.ocp;
+
+public interface Sender {
+    String send(String msg);
+}
diff --git a/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java b/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
new file mode 100644
index 0000000000..7708250e10
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.ocp;
+
+public class SenderFactory {
+    public Sender createSender(int type) {
+	Sender sender = null;
+	if (type == 1) {
+	    sender = new MailSenderImp();
+	}
+	if (type == 2) {
+	    sender = new SMSSenderImp();
+	}
+	if (type == 3) {
+	    sender = new PrintSenderImp();
+	}
+	return sender;
+    }
+}

From 4cd3a7847841a1102047ed14549827b58cc84125 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Fri, 23 Jun 2017 09:40:17 +0800
Subject: [PATCH 270/332] =?UTF-8?q?=E6=96=B0=E5=BB=BAknowledge-point?=
 =?UTF-8?q?=E7=9B=AE=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 liuxin/knowledge-point/pom.xml                | 32 ++++++++++++++++
 .../src/main/java/cas/CASSequence.java        | 18 +++++++++
 .../src/main/java/cas/NoBlockingStack.java    | 34 +++++++++++++++++
 .../src/main/java/cas/Sequence.java           | 11 ++++++
 .../src/main/java/threadlocal/Context.java    | 20 ++++++++++
 .../java/threadlocal/TransactionManager.java  | 22 +++++++++++
 .../main/java/threadpool/BlockingQueue.java   | 35 ++++++++++++++++++
 .../src/main/java/threadpool/Task.java        |  5 +++
 .../src/main/java/threadpool/ThreadPool.java  | 37 +++++++++++++++++++
 .../main/java/threadpool/WorkerThread.java    | 33 +++++++++++++++++
 10 files changed, 247 insertions(+)
 create mode 100644 liuxin/knowledge-point/pom.xml
 create mode 100644 liuxin/knowledge-point/src/main/java/cas/CASSequence.java
 create mode 100644 liuxin/knowledge-point/src/main/java/cas/NoBlockingStack.java
 create mode 100644 liuxin/knowledge-point/src/main/java/cas/Sequence.java
 create mode 100644 liuxin/knowledge-point/src/main/java/threadlocal/Context.java
 create mode 100644 liuxin/knowledge-point/src/main/java/threadlocal/TransactionManager.java
 create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/BlockingQueue.java
 create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/Task.java
 create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/ThreadPool.java
 create mode 100644 liuxin/knowledge-point/src/main/java/threadpool/WorkerThread.java

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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>knowledge-point</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>knowledge-point</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
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<E> {
+	static class Node<E> {
+        final E item;
+        Node<E> next;
+        public Node(E item) { this.item = item; }
+    }
+  
+    AtomicReference<Node<E>> head = new AtomicReference<Node<E>>();
+    
+    public void push(E item) {
+        Node<E> newHead = new Node<E>(item);
+        Node<E> oldHead;
+        do {
+            oldHead = head.get();
+            newHead.next = oldHead;
+        } while (!head.compareAndSet(oldHead, newHead));
+    }
+    public E pop() {
+        Node<E> oldHead;
+        Node<E> 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<String> txThreadLocal 
+		= new ThreadLocal<String>();
+	
+	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<String> context = new ThreadLocal<String>();
+
+	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<WorkerThread> threads = new ArrayList<WorkerThread>();
+    private boolean isStopped = false;
+
+    public ThreadPool(int numOfThreads, int maxNumOfTasks){
+        taskQueue = new BlockingQueue(maxNumOfTasks);
+
+        for(int i=0; i<numOfThreads; i++){
+            threads.add(new WorkerThread(taskQueue));
+        }
+        for(WorkerThread thread : threads){
+            thread.start();
+        }
+    }
+
+    public synchronized void  execute(Task task) throws Exception{
+        if(this.isStopped) throw
+            new IllegalStateException("ThreadPool is stopped");
+
+        this.taskQueue.enqueue(task);
+    }
+
+    public synchronized void stop(){
+        this.isStopped = true;
+        for(WorkerThread thread : threads){
+           thread.doStop();
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/liuxin/knowledge-point/src/main/java/threadpool/WorkerThread.java b/liuxin/knowledge-point/src/main/java/threadpool/WorkerThread.java
new file mode 100644
index 0000000000..f99edeef1d
--- /dev/null
+++ b/liuxin/knowledge-point/src/main/java/threadpool/WorkerThread.java
@@ -0,0 +1,33 @@
+package threadpool;
+
+
+public class WorkerThread extends Thread {
+
+    private BlockingQueue taskQueue = null;
+    private boolean       isStopped = false;
+
+    public WorkerThread(BlockingQueue queue){
+        taskQueue = queue;
+    }
+
+    public void run(){
+        while(!isStopped()){
+            try{
+                Task task = (Task) taskQueue.dequeue();
+                task.execute();
+            } catch(Exception e){
+                //log or otherwise report exception,
+                //but keep pool thread alive.
+            }
+        }
+    }
+
+    public synchronized void doStop(){
+        isStopped = true;
+        this.interrupt(); //break pool thread out of dequeue() call.
+    }
+
+    public synchronized boolean isStopped(){
+        return isStopped;
+    }
+}
\ No newline at end of file

From 3f6b591142ccc7a71ecc5b08fdc65f3e72ee334b Mon Sep 17 00:00:00 2001
From: Harry <chenhaowei93@163.com>
Date: Fri, 23 Jun 2017 10:04:15 +0800
Subject: [PATCH 271/332] update  SenderFactory

---
 .../727171008/src/com/coderising/ood/ocp/SenderFactory.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java b/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
index 7708250e10..96663989cf 100644
--- a/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
+++ b/students/727171008/src/com/coderising/ood/ocp/SenderFactory.java
@@ -3,7 +3,7 @@
 public class SenderFactory {
     public Sender createSender(int type) {
 	Sender sender = null;
-	if (type == 1) {
+	if(type == 1) {
 	    sender = new MailSenderImp();
 	}
 	if (type == 2) {

From 3e26f6dca3e333b8197935914f9de805aba1f9c1 Mon Sep 17 00:00:00 2001
From: yyglider <yaoyuan0120@126.com>
Date: Fri, 23 Jun 2017 10:50:23 +0800
Subject: [PATCH 272/332] update

update
---
 .../src/main/java/work02/ocp/DateUtil.java    | 10 +++++++
 .../src/main/java/work02/ocp/Formatter.java   |  7 +++++
 .../src/main/java/work02/ocp/Logger.java      | 29 +++++++++++++++++++
 .../src/main/java/work02/ocp/MailSender.java  |  7 +++++
 .../src/main/java/work02/ocp/MailUtil.java    | 10 +++++++
 .../main/java/work02/ocp/PrinterSender.java   |  8 +++++
 .../java/work02/ocp/RawDateFormatter.java     |  9 ++++++
 .../main/java/work02/ocp/RawFormatter.java    |  8 +++++
 .../src/main/java/work02/ocp/SMSSender.java   |  8 +++++
 .../src/main/java/work02/ocp/SMSUtil.java     | 10 +++++++
 .../src/main/java/work02/ocp/Sender.java      |  8 +++++
 11 files changed, 114 insertions(+)
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/Formatter.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/Logger.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/MailSender.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java
 create mode 100644 students/769232552/season_two/src/main/java/work02/ocp/Sender.java

diff --git a/students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java b/students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java
new file mode 100644
index 0000000000..ab721d91aa
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package work02.ocp;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/Formatter.java b/students/769232552/season_two/src/main/java/work02/ocp/Formatter.java
new file mode 100644
index 0000000000..ce705806b5
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/Formatter.java
@@ -0,0 +1,7 @@
+package work02.ocp;
+
+public interface Formatter {
+
+	String formatMsg(String msg);
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/Logger.java b/students/769232552/season_two/src/main/java/work02/ocp/Logger.java
new file mode 100644
index 0000000000..0f0ecd7ae0
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/Logger.java
@@ -0,0 +1,29 @@
+package work02.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;		
+	}
+
+	Sender sender;
+	Formatter formatter;
+
+	public void log(String msg){
+
+		String logMsg = formatter.formatMsg(msg);
+		sender.send(logMsg);
+
+	}
+}
+
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/MailSender.java b/students/769232552/season_two/src/main/java/work02/ocp/MailSender.java
new file mode 100644
index 0000000000..1d13f449eb
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/MailSender.java
@@ -0,0 +1,7 @@
+package work02.ocp;
+
+public class MailSender implements Sender {
+    public void send(String msg) {
+        MailUtil.send(msg);
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java b/students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java
new file mode 100644
index 0000000000..62e26c25be
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package work02.ocp;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java b/students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java
new file mode 100644
index 0000000000..7511b9652f
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/PrinterSender.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+
+public class PrinterSender implements Sender {
+    public void send(String msg) {
+        System.out.println(msg);
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java b/students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java
new file mode 100644
index 0000000000..16db075e51
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/RawDateFormatter.java
@@ -0,0 +1,9 @@
+package work02.ocp;
+
+public class RawDateFormatter implements Formatter {
+
+    public String formatMsg(String msg) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        return  txtDate + ": " + msg;
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java b/students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java
new file mode 100644
index 0000000000..9ff801b9de
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/RawFormatter.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+public class RawFormatter implements Formatter {
+
+    public String formatMsg(String msg) {
+        return msg;
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java b/students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java
new file mode 100644
index 0000000000..9fa42a752f
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/SMSSender.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+
+public class SMSSender implements Sender{
+    public void send(String msg) {
+        SMSUtil.send(msg);
+    }
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java b/students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java
new file mode 100644
index 0000000000..435e07300a
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package work02.ocp;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/769232552/season_two/src/main/java/work02/ocp/Sender.java b/students/769232552/season_two/src/main/java/work02/ocp/Sender.java
new file mode 100644
index 0000000000..746ffdffb5
--- /dev/null
+++ b/students/769232552/season_two/src/main/java/work02/ocp/Sender.java
@@ -0,0 +1,8 @@
+package work02.ocp;
+
+
+public interface Sender {
+
+    void send(String msg);
+
+}
\ No newline at end of file

From 697cd574c848bac3afe3dfa006e1fbe430e48f2b Mon Sep 17 00:00:00 2001
From: Harry <chenhaowei93@163.com>
Date: Fri, 23 Jun 2017 11:05:25 +0800
Subject: [PATCH 273/332] add srp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

20170623 重构srp：促销邮件发送。
---
 .../com/coderising/ood/srp/Configuration.java | 26 ++++++++++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++++
 .../src/com/coderising/ood/srp/Mail.java      | 34 ++++++++++++++++++
 .../com/coderising/ood/srp/MailSender.java    | 35 +++++++++++++++++++
 .../src/com/coderising/ood/srp/Product.java   | 10 ++++++
 .../coderising/ood/srp/ProductService.java    | 16 +++++++++
 .../com/coderising/ood/srp/PromotionJob.java  | 24 +++++++++++++
 .../src/com/coderising/ood/srp/User.java      | 26 ++++++++++++++
 .../com/coderising/ood/srp/UserService.java   | 11 ++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 +++
 10 files changed, 195 insertions(+)
 create mode 100644 students/727171008/src/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/Mail.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/MailSender.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/Product.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/ProductService.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/PromotionJob.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/User.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/UserService.java
 create mode 100644 students/727171008/src/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/727171008/src/com/coderising/ood/srp/Configuration.java b/students/727171008/src/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..5a52efee25
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+    static Map<String, String> 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/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java b/students/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..945db9004a
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.good1;
+
+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/727171008/src/com/coderising/ood/srp/Mail.java b/students/727171008/src/com/coderising/ood/srp/Mail.java
new file mode 100644
index 0000000000..8ecea4a35e
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/Mail.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class Mail {
+    private User user;
+
+    public Mail(User user) {
+	this.user = user;
+    }
+
+    public String getAddress() {
+	return user.getEMailAddress();
+    }
+
+    public String getSubjcet() {
+	return "您关注的商品降价了！";
+    }
+
+    public String getBody() {
+	return "尊敬的用户: " + user.getName() + ", 您关注的商品： " + this.buildProductDescList();
+    }
+
+    private String buildProductDescList() {
+	List<Product> products = user.getSubscribedProducts();
+
+	return null;
+    }
+
+    public String getSubject() {
+
+	return null;
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/MailSender.java b/students/727171008/src/com/coderising/ood/srp/MailSender.java
new file mode 100644
index 0000000000..48c29ac877
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/MailSender.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp;
+
+public class MailSender {
+
+    private String fromAddress;
+    private String smtpHost;
+    private String altSmtpHost;
+
+    public MailSender(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();
+	// 发送邮件
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/Product.java b/students/727171008/src/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..d04cdb97f4
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/Product.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.srp;
+
+public class Product {
+    private String id;
+    private String desc;
+
+    public String getDesc() {
+	return desc;
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/ProductService.java b/students/727171008/src/com/coderising/ood/srp/ProductService.java
new file mode 100644
index 0000000000..5eea405243
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/ProductService.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.srp;
+
+import java.io.File;
+
+public class ProductService {
+    public Product getPromotionProduct() {
+	File f = new File("F:\\coding2017\\com\\codering\\ood\\src\\product_promotion.txt");
+	Product product = readFile(f);
+	return product;
+    }
+
+    private Product readFile(File file) {
+
+	return null;
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/PromotionJob.java b/students/727171008/src/com/coderising/ood/srp/PromotionJob.java
new file mode 100644
index 0000000000..616335aa05
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/PromotionJob.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class PromotionJob {
+
+    private ProductService productService = null; // 获取production service
+    private UserService userService = null;// 获取UserService
+
+    public void run() {
+
+	Configuration cfg = new Configuration();
+
+	Product p = productService.getPromotionProduct();
+
+	List<User> users = userService.getUsers(p);   //一次只读取了一件商品
+
+	MailSender mailSender = new MailSender(cfg);
+
+	for (User user : users) {
+	    mailSender.sendMail(new Mail(user));
+	}
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/User.java b/students/727171008/src/com/coderising/ood/srp/User.java
new file mode 100644
index 0000000000..a79bc5c97a
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/User.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class User {
+
+    private String name;
+    private String emailAddress;
+
+    private List<Product> subscribedProducts;
+
+    public String getName() {
+
+	return name;
+    }
+
+    public String getEMailAddress() {
+
+	return emailAddress;
+    }
+
+    public List<Product> getSubscribedProducts() {
+
+	return this.subscribedProducts;
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/UserService.java b/students/727171008/src/com/coderising/ood/srp/UserService.java
new file mode 100644
index 0000000000..9bc682a229
--- /dev/null
+++ b/students/727171008/src/com/coderising/ood/srp/UserService.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+public class UserService {
+
+    public List<User> getUsers(Product product) {
+	// 调用DAO相关的类从数据库中读取订阅产品的用户列表
+	return null;
+    }
+}
diff --git a/students/727171008/src/com/coderising/ood/srp/product_promotion.txt b/students/727171008/src/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/727171008/src/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

From a5c9da9cd4c02fa8f6403e1bd7f3acacb08370bb Mon Sep 17 00:00:00 2001
From: ThomsonTang <guiketang@gmail.com>
Date: Fri, 23 Jun 2017 23:28:03 +0800
Subject: [PATCH 274/332] refactor the sample of SRP in OOD.

---
 .../com/coderising/ood/srp/Configuration.java |  22 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../com/coderising/ood/srp/EmailMessage.java  |  36 ++++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../java/com/coderising/ood/srp/Product.java  |  44 ++++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../java/com/coderising/ood/srp/UserInfo.java |  46 ++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 9 files changed, 403 insertions(+)
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

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<String, String> 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/EmailMessage.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
new file mode 100644
index 0000000000..48d90a624f
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.srp;
+
+/**
+ * the email message content will be sent to user.
+ *
+ * @author Thomson Tang
+ * @version Created: 23/06/2017.
+ */
+public class EmailMessage {
+    private String subject;
+    private String message;
+
+    public EmailMessage() {
+    }
+
+    public EmailMessage(String subject, String message) {
+        this.subject = subject;
+        this.message = message;
+    }
+
+    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;
+    }
+}
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/Product.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
new file mode 100644
index 0000000000..471863d48e
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
@@ -0,0 +1,44 @@
+package com.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/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/coderising/ood/srp/UserInfo.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
new file mode 100644
index 0000000000..f680c0ecd8
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
@@ -0,0 +1,46 @@
+package com.coderising.ood.srp;
+
+/**
+ * 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;
+
+    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;
+    }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/395135865/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

From 592e60bb315eae752606291947a696ee3855786b Mon Sep 17 00:00:00 2001
From: ThomsonTang <guiketang@gmail.com>
Date: Fri, 23 Jun 2017 23:31:19 +0800
Subject: [PATCH 275/332] refactor the sample

---
 students/395135865/ood/ood-assignment/pom.xml | 32 +++++++++++++++++++
 1 file changed, 32 insertions(+)
 create mode 100644 students/395135865/ood/ood-assignment/pom.xml

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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>

From 38a98482b32e4f2abcabdb9f1cb57d3edb3bf451 Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Sat, 24 Jun 2017 16:26:43 +0800
Subject: [PATCH 276/332] =?UTF-8?q?=E5=8F=91=E9=82=AE=E4=BB=B6=EF=BC=8C?=
 =?UTF-8?q?=E9=87=8D=E6=9E=842?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/srp/MailUtil.java |  2 -
 .../ood/srp/goodSrp/Configuration.java        | 26 +++++++++++++
 .../ood/srp/goodSrp/ConfigurationKeys.java    |  9 +++++
 .../coderising/ood/srp/goodSrp/DBUtil.java    | 25 ++++++++++++
 .../com/coderising/ood/srp/goodSrp/Mail.java  | 29 ++++++++++++++
 .../ood/srp/goodSrp/MailSender.java           | 35 +++++++++++++++++
 .../coderising/ood/srp/goodSrp/MailUtil.java  | 17 ++++++++
 .../coderising/ood/srp/goodSrp/Product.java   | 34 ++++++++++++++++
 .../ood/srp/goodSrp/ProductService.java       | 38 ++++++++++++++++++
 .../ood/srp/goodSrp/PromotionJob.java         | 29 ++++++++++++++
 .../com/coderising/ood/srp/goodSrp/User.java  | 39 +++++++++++++++++++
 .../ood/srp/goodSrp/UserService.java          | 26 +++++++++++++
 .../goodSrp/template/MailBodyTemplate.java    |  5 +++
 .../template/TextMailBodyTemplate.java        | 25 ++++++++++++
 14 files changed, 337 insertions(+), 2 deletions(-)
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java

diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
index 3e81821544..aa931433a9 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -1,8 +1,6 @@
 package com.coderising.ood.srp;
 
 
-import java.util.concurrent.atomic.AtomicInteger;
-
 public class MailUtil {
 
 	public static void sendEmail(String toAddress, String fromAddress, String subject, String message, String smtpHost,
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java
new file mode 100644
index 0000000000..a9a4d3f207
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.goodSrp;
+
+import com.coderising.ood.srp.ConfigurationKeys;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> configurations = new HashMap<>();
+	static{
+		configurations.put(com.coderising.ood.srp.ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+		configurations.put(com.coderising.ood.srp.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/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java
new file mode 100644
index 0000000000..c39f1fcff9
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.srp.goodSrp;
+
+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/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java
new file mode 100644
index 0000000000..53631cfa7f
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.goodSrp;
+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" + i);
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
new file mode 100644
index 0000000000..cbac40d547
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.goodSrp;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+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<Product> products = user.getSubscribedProducts();
+		//.... 实现略...
+		return products.stream().map(Object::toString)
+				.collect(Collectors.joining(", "));
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java
new file mode 100644
index 0000000000..8ef8769291
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.srp.goodSrp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class MailSender {
+    private String fromAddress ;
+    private String smtpHost;
+    private String altSmtpHost;
+
+    public MailSender(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){
+        //发送邮件
+        System.out.println("开始发送邮件");
+        MailUtil.sendEmail(mail, smtpHost, fromAddress);
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
new file mode 100644
index 0000000000..a1fb0ceb73
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.srp.goodSrp;
+
+
+import com.coderising.ood.srp.goodSrp.template.MailBodyTemplate;
+import com.coderising.ood.srp.goodSrp.template.TextMailBodyTemplate;
+
+public class MailUtil {
+
+	public static void sendEmail(Mail mail, String smtpHost, String fromAddress) {
+		//假装发了一封邮件
+		System.out.println("使用smtpHost为"+smtpHost);
+		MailBodyTemplate template = new TextMailBodyTemplate(mail, fromAddress);
+		System.out.println(template.render());
+	}
+
+	
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java
new file mode 100644
index 0000000000..dba13425c1
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.srp.goodSrp;
+
+
+
+public class Product {
+	
+	private String id;
+	private String desc;
+	public String getDescription(){
+		return 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;
+	}
+
+	@Override
+	public String toString() {
+		return desc;
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
new file mode 100644
index 0000000000..a787d00eb3
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.srp.goodSrp;
+
+
+import java.io.*;
+import java.util.LinkedList;
+import java.util.List;
+
+public class ProductService {
+	private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+	public List<Product> getPromotionProducts() {
+		//从文本文件中读取文件列表
+		String line;
+		List<Product> products = new LinkedList<>();
+		try (BufferedReader br = new BufferedReader(new FileReader(f))) {
+			while ((line = br.readLine()) != null) {
+				Product p =parseGenProduct(line);
+				products.add(p);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return products;
+	}
+
+	private Product parseGenProduct(String line) {
+		String[] data = line.split(" ");
+		String productID = data[0];
+		String productDesc = data[1];
+		System.out.println("产品ID = " + productID + "\n");
+		System.out.println("产品描述 = " + productDesc + "\n");
+		Product p = new Product();
+		p.setDesc(productDesc);
+		p.setId(productID);
+		return p;
+	}
+
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java
new file mode 100644
index 0000000000..59db8cdada
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java
@@ -0,0 +1,29 @@
+package com.coderising.ood.srp.goodSrp;
+
+import java.util.List;
+
+public class PromotionJob {
+	
+	private ProductService productService = new ProductService() ; //获取production service
+	private UserService userService = new UserService() ;// 获取UserService
+	
+	public void run(){
+		
+		Configuration cfg = new Configuration();
+		
+		List<Product> ps = productService.getPromotionProducts();
+		
+		List<User> users = userService.getUsers(ps);
+
+		
+		MailSender mailSender = new MailSender(cfg);
+		
+		for(User user : users){
+			mailSender.sendMail(new Mail(user));
+		}
+	}
+
+    public static void main(String[] args) {
+        new PromotionJob().run();
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java
new file mode 100644
index 0000000000..295345ae38
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.srp.goodSrp;
+
+import java.util.List;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class User {
+    private String name;
+    private String emailAddress;
+
+    private List<Product> subscribedProducts;
+
+    public String getName(){
+        return name;
+    }
+    public String getEMailAddress() {
+        return emailAddress;
+    }
+    public List<Product> getSubscribedProducts(){
+        return this.subscribedProducts;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEmailAddress() {
+        return emailAddress;
+    }
+
+    public void setEmailAddress(String emailAddress) {
+        this.emailAddress = emailAddress;
+    }
+
+    public void setSubscribedProducts(List<Product> subscribedProducts) {
+        this.subscribedProducts = subscribedProducts;
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
new file mode 100644
index 0000000000..635f9fe140
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
@@ -0,0 +1,26 @@
+package com.coderising.ood.srp.goodSrp;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class UserService {
+
+    public List<User> getUsers(List<Product> ps) {
+        List<User> users = new LinkedList<>();
+        String sql = "Select name from subscriptions where send_mail=1";
+        System.out.println("loadQuery set");
+        List userInfoList = DBUtil.query(sql);
+        for (Object userInfo: userInfoList) {
+            User user = new User();
+            user.setName(((Map<String, String>)userInfo).get("NAME"));
+            user.setEmailAddress(((Map<String, String>)userInfo).get("EMAIL"));
+            user.setSubscribedProducts(ps);
+            users.add(user);
+        }
+        return users;
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
new file mode 100644
index 0000000000..1852b6155a
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
@@ -0,0 +1,5 @@
+package com.coderising.ood.srp.goodSrp.template;
+
+public interface MailBodyTemplate {
+	public String render();
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
new file mode 100644
index 0000000000..b7906c6bf2
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.srp.goodSrp.template;
+
+import com.coderising.ood.srp.goodSrp.Mail;
+
+
+public class TextMailBodyTemplate implements MailBodyTemplate {
+	private Mail mail;
+	String fromAdress;
+	public TextMailBodyTemplate(Mail mail, String fromAdress){
+		this.mail = mail;
+		this.fromAdress = fromAdress;
+	}
+	
+	@Override
+	public String render() {
+		//使用某种模板技术实现Render
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(fromAdress).append("\n");
+		buffer.append("To:").append(mail.getAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getBody()).append("\n");
+		return buffer.toString();
+	}
+
+}

From 636f71c2fb35ae819e80546a6c2588709f369fb0 Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Sat, 24 Jun 2017 19:12:31 +0800
Subject: [PATCH 277/332] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A=EF=BC=9A=E6=89=93=E5=8D=B0=E4=B8=8D=E5=90=8C=E7=9A=84?=
 =?UTF-8?q?=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/coderising/ood/ocp/MailUtil.java |  2 +-
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  2 +-
 .../com/coderising/ood/ocp/myocp/DateMsg.java | 14 +++++
 .../coderising/ood/ocp/myocp/DateUtil.java    | 17 ++++++
 .../coderising/ood/ocp/myocp/EmailMethod.java | 12 +++++
 .../coderising/ood/ocp/myocp/LogDrive.java    | 18 +++++++
 .../coderising/ood/ocp/myocp/LogFactory.java  | 52 +++++++++++++++++++
 .../com/coderising/ood/ocp/myocp/Logger.java  | 16 ++++++
 .../coderising/ood/ocp/myocp/MailUtil.java    | 10 ++++
 .../com/coderising/ood/ocp/myocp/Method.java  |  8 +++
 .../com/coderising/ood/ocp/myocp/Msg.java     |  9 ++++
 .../coderising/ood/ocp/myocp/PrintMethod.java | 11 ++++
 .../com/coderising/ood/ocp/myocp/RawMsg.java  | 12 +++++
 .../com/coderising/ood/ocp/myocp/SMSUtil.java | 10 ++++
 .../coderising/ood/ocp/myocp/SmsMethod.java   | 12 +++++
 15 files changed, 203 insertions(+), 2 deletions(-)
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java

diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
index 59d77649a2..88cd252cf4 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
@@ -4,7 +4,7 @@ public class MailUtil {
 
 	public static void send(String logMsg) {
 		// TODO Auto-generated method stub
-		
+		System.out.println("email "+logMsg);
 	}
 
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
index fab4cd01b7..8e955ab085 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
@@ -4,7 +4,7 @@ public class SMSUtil {
 
 	public static void send(String logMsg) {
 		// TODO Auto-generated method stub
-		
+		System.out.println("sms "+logMsg);
 	}
 
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java
new file mode 100644
index 0000000000..7484827d5f
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.ocp.myocp;
+
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class DateMsg implements Msg {
+
+    @Override
+    public String msg(String msg) {
+        String txtDate = DateUtil.getCurrentDateAsString();
+        return txtDate + ": " + msg;
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java
new file mode 100644
index 0000000000..d207c1d3c0
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.ocp.myocp;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+
+		return new SimpleDateFormat("dd-MM-yyyy").format(new Date());
+	}
+
+	public static void main(String[] args) {
+		System.out.println(DateUtil.getCurrentDateAsString());
+	}
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java
new file mode 100644
index 0000000000..fd73f99924
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.myocp;
+
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class EmailMethod implements Method {
+    @Override
+    public void action(String msg) {
+        MailUtil.send(msg);
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java
new file mode 100644
index 0000000000..f0f8f3cf1e
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.ocp.myocp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class LogDrive {
+
+    public static void main(String[] args) {
+        LogFactory logFactory = new LogFactory();
+        Logger logger;
+        for (int i = 1; i<=2; i++) {
+            for (int j = 1; j<=3; j++ ) {
+                logger = logFactory.createLogger(i, j);
+                logger.log("haha");
+            }
+        }
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
new file mode 100644
index 0000000000..f9fa56ef35
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.ocp.myocp;
+
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class LogFactory {
+    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;
+
+    public Logger createLogger(int logType, int logMethod) {
+        Msg msg = genMsg(logType);
+        Method method = genMethod(logMethod);
+        return new Logger(msg, method);
+    }
+
+    private Method genMethod(int logMethod) {
+        Method method;
+        switch (logMethod) {
+            case EMAIL_LOG:
+                method = new EmailMethod();
+                break;
+            case SMS_LOG:
+                method = new SmsMethod();
+                break;
+            case PRINT_LOG:
+                method = new PrintMethod();
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid logMethod " + logMethod);
+        }
+        return method;
+    }
+
+    private Msg genMsg(int logType) {
+        Msg msg;
+        switch (logType) {
+            case RAW_LOG:
+                msg = new RawMsg();
+                break;
+            case RAW_LOG_WITH_DATE:
+                msg = new DateMsg();
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid logType " + logType);
+        }
+        return msg;
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
new file mode 100644
index 0000000000..9889d0a9b0
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
@@ -0,0 +1,16 @@
+package com.coderising.ood.ocp.myocp;
+
+public class Logger {
+
+	Method method;
+	Msg msg;
+			
+	public Logger(Msg aMsg, Method aMethod){
+		msg= aMsg;
+		method = aMethod;
+	}
+	public void log(String message){
+        method.action(msg.msg(message));
+	}
+}
+
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
new file mode 100644
index 0000000000..6bd1a1f27a
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.myocp;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		System.out.println("email "+logMsg);
+	}
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java
new file mode 100644
index 0000000000..49ff988579
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java
@@ -0,0 +1,8 @@
+package com.coderising.ood.ocp.myocp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public interface Method {
+    public void action(String msg);
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java
new file mode 100644
index 0000000000..f479dbecff
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java
@@ -0,0 +1,9 @@
+package com.coderising.ood.ocp.myocp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public interface Msg {
+    public String msg(String msg);
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java
new file mode 100644
index 0000000000..a88a229bb3
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java
@@ -0,0 +1,11 @@
+package com.coderising.ood.ocp.myocp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class PrintMethod implements Method {
+    @Override
+    public void action(String msg) {
+        System.out.println(msg);
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java
new file mode 100644
index 0000000000..363746b9e9
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.myocp;
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class RawMsg implements Msg {
+
+    @Override
+    public String msg(String msg) {
+        return msg;
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
new file mode 100644
index 0000000000..214f583c4c
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.coderising.ood.ocp.myocp;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		System.out.println("sms "+logMsg);
+	}
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java
new file mode 100644
index 0000000000..63cce66a2e
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.ocp.myocp;
+
+
+/**
+ * Created by thomas_young on 24/6/2017.
+ */
+public class SmsMethod implements Method {
+    @Override
+    public void action(String msg) {
+        SMSUtil.send(msg);
+    }
+}

From 18a6b2d316d60391338ab49c6ddfafd5640dfeed Mon Sep 17 00:00:00 2001
From: thomas_young <yk_ecust_2007@163.com>
Date: Sat, 24 Jun 2017 19:39:11 +0800
Subject: [PATCH 278/332] =?UTF-8?q?=E6=89=93=E6=97=A5=E5=BF=97=EF=BC=9A?=
 =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../{DateMsg.java => DateFormatter.java}      |  4 +-
 .../{EmailMethod.java => EmailSender.java}    |  4 +-
 .../ocp/myocp/{Method.java => Formatter.java} |  4 +-
 .../ood/ocp/myocp/FormatterFactory.java       | 21 ++++++++
 .../coderising/ood/ocp/myocp/LogFactory.java  | 50 +++----------------
 .../com/coderising/ood/ocp/myocp/Logger.java  | 12 ++---
 .../coderising/ood/ocp/myocp/MailUtil.java    |  2 +-
 .../{PrintMethod.java => PrintSender.java}    |  4 +-
 .../myocp/{RawMsg.java => RawFormatter.java}  |  4 +-
 .../com/coderising/ood/ocp/myocp/SMSUtil.java |  2 +-
 .../ood/ocp/myocp/{Msg.java => Sender.java}   |  5 +-
 .../ood/ocp/myocp/SenderFactory.java          | 25 ++++++++++
 .../myocp/{SmsMethod.java => SmsSender.java}  |  4 +-
 13 files changed, 75 insertions(+), 66 deletions(-)
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{DateMsg.java => DateFormatter.java} (70%)
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{EmailMethod.java => EmailSender.java} (62%)
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{Method.java => Formatter.java} (59%)
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{PrintMethod.java => PrintSender.java} (63%)
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{RawMsg.java => RawFormatter.java} (59%)
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{Msg.java => Sender.java} (60%)
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java
 rename students/812350401/src/main/java/com/coderising/ood/ocp/myocp/{SmsMethod.java => SmsSender.java} (63%)

diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateFormatter.java
similarity index 70%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateFormatter.java
index 7484827d5f..b9c3f7b026 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateMsg.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateFormatter.java
@@ -4,10 +4,10 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public class DateMsg implements Msg {
+public class DateFormatter implements Formatter {
 
     @Override
-    public String msg(String msg) {
+    public String format(String msg) {
         String txtDate = DateUtil.getCurrentDateAsString();
         return txtDate + ": " + msg;
     }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailSender.java
similarity index 62%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailSender.java
index fd73f99924..bc91dc2d58 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailMethod.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailSender.java
@@ -4,9 +4,9 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public class EmailMethod implements Method {
+public class EmailSender implements Sender {
     @Override
-    public void action(String msg) {
+    public void send(String msg) {
         MailUtil.send(msg);
     }
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Formatter.java
similarity index 59%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Formatter.java
index 49ff988579..c831fcb369 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Method.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Formatter.java
@@ -3,6 +3,6 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public interface Method {
-    public void action(String msg);
+public interface Formatter {
+    String format(String msg);
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java
new file mode 100644
index 0000000000..6c08688f5f
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.ocp.myocp;
+
+public class FormatterFactory {
+    public final int RAW_LOG = 1;
+    public final int RAW_LOG_WITH_DATE = 2;
+
+    public Formatter createFormatter(int logType) {
+        Formatter formatter;
+        switch (logType) {
+            case RAW_LOG:
+                formatter = new RawFormatter();
+                break;
+            case RAW_LOG_WITH_DATE:
+                formatter = new DateFormatter();
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid logType " + logType);
+        }
+        return formatter;
+    }
+}
\ No newline at end of file
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
index f9fa56ef35..9d2bde495e 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
@@ -1,52 +1,16 @@
 package com.coderising.ood.ocp.myocp;
-
+// 有几个问题： Msg和Method起名不好，建议起Formatter和Sender
+// 其次，可以建FormatterFactory和SenderFactory来分别建工厂
 
 /**
  * Created by thomas_young on 24/6/2017.
  */
 public class LogFactory {
-    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;
-
     public Logger createLogger(int logType, int logMethod) {
-        Msg msg = genMsg(logType);
-        Method method = genMethod(logMethod);
-        return new Logger(msg, method);
-    }
-
-    private Method genMethod(int logMethod) {
-        Method method;
-        switch (logMethod) {
-            case EMAIL_LOG:
-                method = new EmailMethod();
-                break;
-            case SMS_LOG:
-                method = new SmsMethod();
-                break;
-            case PRINT_LOG:
-                method = new PrintMethod();
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid logMethod " + logMethod);
-        }
-        return method;
-    }
-
-    private Msg genMsg(int logType) {
-        Msg msg;
-        switch (logType) {
-            case RAW_LOG:
-                msg = new RawMsg();
-                break;
-            case RAW_LOG_WITH_DATE:
-                msg = new DateMsg();
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid logType " + logType);
-        }
-        return msg;
+        SenderFactory senderFactory = new SenderFactory();
+        FormatterFactory formatterFactory = new FormatterFactory();
+        Formatter formatter = formatterFactory.createFormatter(logType);
+        Sender sender = senderFactory.createSender(logMethod);
+        return new Logger(formatter, sender);
     }
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
index 9889d0a9b0..94cbab377c 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
@@ -2,15 +2,15 @@
 
 public class Logger {
 
-	Method method;
-	Msg msg;
+	Sender sender;
+	Formatter formatter;
 			
-	public Logger(Msg aMsg, Method aMethod){
-		msg= aMsg;
-		method = aMethod;
+	public Logger(Formatter aFormatter, Sender aSender){
+		formatter = aFormatter;
+		sender = aSender;
 	}
 	public void log(String message){
-        method.action(msg.msg(message));
+        sender.send(formatter.format(message));
 	}
 }
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
index 6bd1a1f27a..b6ce02902c 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
@@ -3,7 +3,7 @@
 public class MailUtil {
 
 	public static void send(String logMsg) {
-		// TODO Auto-generated method stub
+		// TODO Auto-generated sender stub
 		System.out.println("email "+logMsg);
 	}
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintSender.java
similarity index 63%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintSender.java
index a88a229bb3..67a545f6fd 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintMethod.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintSender.java
@@ -3,9 +3,9 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public class PrintMethod implements Method {
+public class PrintSender implements Sender {
     @Override
-    public void action(String msg) {
+    public void send(String msg) {
         System.out.println(msg);
     }
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawFormatter.java
similarity index 59%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawFormatter.java
index 363746b9e9..f2218bf59d 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawMsg.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawFormatter.java
@@ -3,10 +3,10 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public class RawMsg implements Msg {
+public class RawFormatter implements Formatter {
 
     @Override
-    public String msg(String msg) {
+    public String format(String msg) {
         return msg;
     }
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
index 214f583c4c..c127e204b8 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
@@ -3,7 +3,7 @@
 public class SMSUtil {
 
 	public static void send(String logMsg) {
-		// TODO Auto-generated method stub
+		// TODO Auto-generated sender stub
 		System.out.println("sms "+logMsg);
 	}
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Sender.java
similarity index 60%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Sender.java
index f479dbecff..939409612a 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Msg.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Sender.java
@@ -3,7 +3,6 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public interface Msg {
-    public String msg(String msg);
-
+public interface Sender {
+    void send(String msg);
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java
new file mode 100644
index 0000000000..e068685b35
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java
@@ -0,0 +1,25 @@
+package com.coderising.ood.ocp.myocp;
+
+public class SenderFactory {
+    public final int EMAIL_LOG = 1;
+    public final int SMS_LOG = 2;
+    public final int PRINT_LOG = 3;
+
+    public Sender createSender(int logMethod) {
+        Sender sender;
+        switch (logMethod) {
+            case EMAIL_LOG:
+                sender = new EmailSender();
+                break;
+            case SMS_LOG:
+                sender = new SmsSender();
+                break;
+            case PRINT_LOG:
+                sender = new PrintSender();
+                break;
+            default:
+                throw new IllegalArgumentException("Invalid logMethod " + logMethod);
+        }
+        return sender;
+    }
+}
\ No newline at end of file
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsSender.java
similarity index 63%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java
rename to students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsSender.java
index 63cce66a2e..47f6b1a412 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsMethod.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsSender.java
@@ -4,9 +4,9 @@
 /**
  * Created by thomas_young on 24/6/2017.
  */
-public class SmsMethod implements Method {
+public class SmsSender implements Sender {
     @Override
-    public void action(String msg) {
+    public void send(String msg) {
         SMSUtil.send(msg);
     }
 }

From b04dcdf683a976203b51186df329d6c44d7d76ae Mon Sep 17 00:00:00 2001
From: Thomas Young <miniyk2012@users.noreply.github.com>
Date: Sat, 24 Jun 2017 19:57:38 +0800
Subject: [PATCH 279/332] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?=
 =?UTF-8?q?=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java  | 2 --
 1 file changed, 2 deletions(-)

diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
index 9d2bde495e..63b2d1b8e4 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
+++ b/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
@@ -1,6 +1,4 @@
 package com.coderising.ood.ocp.myocp;
-// 有几个问题： Msg和Method起名不好，建议起Formatter和Sender
-// 其次，可以建FormatterFactory和SenderFactory来分别建工厂
 
 /**
  * Created by thomas_young on 24/6/2017.

From 7082e05e4413a640250b1b7b0ced527d9227fcd8 Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Sun, 25 Jun 2017 00:15:37 +0800
Subject: [PATCH 280/332] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=B4=A3=E4=BB=BB?=
 =?UTF-8?q?=E5=8C=85=EF=BC=8C=E6=8E=A5=E5=8F=A3=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 liuxin/ood/ood-assignment/pom.xml             | 14 +++-
 students/281918307/ood-ocp/pom.xml            | 64 +++++++++++++++++--
 .../main/java/com/ood/ocp/util/DateUtil.java  | 10 +++
 .../main/java/com/ood/ocp/util/MailUtil.java  | 10 +++
 .../main/java/com/ood/ocp/util/SMSUtil.java   | 10 +++
 5 files changed, 101 insertions(+), 7 deletions(-)
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/DateUtil.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/MailUtil.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/SMSUtil.java

diff --git a/liuxin/ood/ood-assignment/pom.xml b/liuxin/ood/ood-assignment/pom.xml
index d1ed73a0bf..84315c8139 100644
--- a/liuxin/ood/ood-assignment/pom.xml
+++ b/liuxin/ood/ood-assignment/pom.xml
@@ -5,7 +5,19 @@
   <groupId>com.coderising</groupId>
   <artifactId>ood-assignment</artifactId>
   <version>0.0.1-SNAPSHOT</version>
-  <packaging>jar</packaging>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <packaging>jar</packaging>
 
   <name>ood-assignment</name>
   <url>http://maven.apache.org</url>
diff --git a/students/281918307/ood-ocp/pom.xml b/students/281918307/ood-ocp/pom.xml
index 284a8b4939..60ad55a370 100644
--- a/students/281918307/ood-ocp/pom.xml
+++ b/students/281918307/ood-ocp/pom.xml
@@ -14,18 +14,70 @@
     <artifactId>ood-ocp</artifactId>
     <packaging>jar</packaging>
 
-
     <dependencies>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>provided</scope>
+            <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
         </dependency>
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.dajia.customization.Application</mainClass>
+                    <jvmArguments>-Dfile.encoding=${project.build.sourceEncoding}</jvmArguments>
+                    <!-- fork :  如果没有该项配置，肯呢个devtools不会起作用，即应用不会restart  -->
+                    <fork>true</fork>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
 
 </project>
\ No newline at end of file
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/DateUtil.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/DateUtil.java
new file mode 100644
index 0000000000..927250a6c5
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/DateUtil.java
@@ -0,0 +1,10 @@
+package com.ood.ocp.util;
+
+public class DateUtil {
+
+    public static String getCurrentDateAsString() {
+
+        return null;
+    }
+
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/MailUtil.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/MailUtil.java
new file mode 100644
index 0000000000..d2be222460
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/MailUtil.java
@@ -0,0 +1,10 @@
+package com.ood.ocp.util;
+
+public class MailUtil {
+
+    public static void send(String logMsg) {
+        // TODO Auto-generated method stub
+
+    }
+
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/SMSUtil.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/SMSUtil.java
new file mode 100644
index 0000000000..30851cbb40
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/util/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.ood.ocp.util;
+
+public class SMSUtil {
+
+    public static void send(String logMsg) {
+        // TODO Auto-generated method stub
+
+    }
+
+}

From 178a3627620b9e416cc8805ba83be29f8463b4ef Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Sun, 25 Jun 2017 00:31:49 +0800
Subject: [PATCH 281/332] ocp commit

---
 .../com/ood/ocp/logs/config/LoggerConfig.java | 25 +++++++
 .../ood/ocp/logs/config/LoggerConfigImpl.java | 71 +++++++++++++++++++
 .../ood/ocp/logs/content/ContentService.java  |  9 +++
 .../logs/content/DateContentServiceImpl.java  | 17 +++++
 .../content/DefaultContentServiceImpl.java    | 14 ++++
 .../ood/ocp/logs/logger/LoggerService.java    | 10 +++
 .../ocp/logs/logger/LoggerServiceImpl.java    | 35 +++++++++
 .../ocp/logs/sender/ConsoleLoggerSender.java  | 15 ++++
 .../com/ood/ocp/logs/sender/LoggerSender.java | 11 +++
 .../ood/ocp/logs/sender/MailLoggerSender.java | 17 +++++
 .../ood/ocp/logs/sender/SMSLoggerSender.java  | 17 +++++
 11 files changed, 241 insertions(+)
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/ContentService.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DateContentServiceImpl.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DefaultContentServiceImpl.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerService.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/ConsoleLoggerSender.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSender.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/MailLoggerSender.java
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/SMSLoggerSender.java

diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java
new file mode 100644
index 0000000000..66f82210ba
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java
@@ -0,0 +1,25 @@
+package com.ood.ocp.logs.config;
+
+import com.ood.ocp.logs.content.ContentService;
+import com.ood.ocp.logs.sender.LoggerSender;
+
+/**
+ * Created by ajaxfeng on 2017/6/24.
+ */
+public interface LoggerConfig {
+
+    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;
+
+    public ContentService getContentService();
+
+    public LoggerSender getLoggerSender();
+
+    public void setContentType(int contentType);
+
+    public void setSendType(int sendType);
+
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java
new file mode 100644
index 0000000000..f5b26cba56
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java
@@ -0,0 +1,71 @@
+package com.ood.ocp.logs.config;
+
+import com.ood.ocp.logs.content.ContentService;
+import com.ood.ocp.logs.sender.LoggerSender;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by ajaxfeng on 2017/6/24.
+ */
+@Service
+public class LoggerConfigImpl implements LoggerConfig {
+
+    private int contentType;
+
+    private int sendType;
+    @Autowired
+    private LoggerSender mailLoggerSender;
+    @Autowired
+    private LoggerSender smsLoggerSender;
+    @Autowired
+    private LoggerSender consoleLoggerSender;
+    @Autowired
+    private ContentService contentService;
+    @Autowired
+    private ContentService dateContentService;
+
+
+    @Override
+    public ContentService getContentService() {
+        if (RAW_LOG == contentType) {
+            return contentService;
+        }
+        if (RAW_LOG_WITH_DATE == contentType) {
+            return dateContentService;
+        }
+
+        return contentService;
+    }
+
+    @Override
+    public LoggerSender getLoggerSender() {
+        if (EMAIL_LOG == sendType) {
+            return mailLoggerSender;
+        }
+        if (SMS_LOG == sendType) {
+            return smsLoggerSender;
+        }
+        if (PRINT_LOG == sendType) {
+            return consoleLoggerSender;
+        }
+        return mailLoggerSender;
+    }
+
+
+    public int getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(int contentType) {
+        this.contentType = contentType;
+    }
+
+    public int getSendType() {
+        return sendType;
+    }
+
+    public void setSendType(int sendType) {
+        this.sendType = sendType;
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/ContentService.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/ContentService.java
new file mode 100644
index 0000000000..b10fedb33a
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/ContentService.java
@@ -0,0 +1,9 @@
+package com.ood.ocp.logs.content;
+
+/**
+ * Created by ajaxfeng on 2017/6/24.
+ */
+public interface ContentService {
+
+    public String getConteng(String logMsg);
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DateContentServiceImpl.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DateContentServiceImpl.java
new file mode 100644
index 0000000000..a088d537a0
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DateContentServiceImpl.java
@@ -0,0 +1,17 @@
+package com.ood.ocp.logs.content;
+
+import com.ood.ocp.util.DateUtil;
+import org.springframework.stereotype.Service;
+
+/**
+ * 日期+log
+ * Created by ajaxfeng on 2017/6/24.
+ */
+@Service("dateContentService")
+public class DateContentServiceImpl implements ContentService {
+
+    @Override
+    public String getConteng(String logMsg) {
+        return DateUtil.getCurrentDateAsString() + ":" + logMsg;
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DefaultContentServiceImpl.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DefaultContentServiceImpl.java
new file mode 100644
index 0000000000..2fee453d79
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/content/DefaultContentServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ood.ocp.logs.content;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by ajaxfeng on 2017/6/24.
+ */
+@Service("contentService")
+public class DefaultContentServiceImpl implements ContentService {
+    @Override
+    public String getConteng(String logMsg) {
+        return logMsg;
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerService.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerService.java
new file mode 100644
index 0000000000..07cda40042
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerService.java
@@ -0,0 +1,10 @@
+package com.ood.ocp.logs.logger;
+
+/**
+ * 发送日志
+ * Created by ajaxfeng on 2017/6/24.
+ */
+public interface LoggerService {
+
+    public String logger(String logMsg);
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java
new file mode 100644
index 0000000000..fa9c4e7d44
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java
@@ -0,0 +1,35 @@
+package com.ood.ocp.logs.logger;
+
+import com.ood.ocp.logs.config.LoggerConfig;
+import com.ood.ocp.logs.content.ContentService;
+import com.ood.ocp.logs.sender.LoggerSender;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by ajaxfeng on 2017/6/24.
+ */
+@Service
+public class LoggerServiceImpl implements LoggerService {
+
+    @Autowired
+    LoggerConfig loggerConfig;
+
+
+    @Override
+    public String logger(String logMsg) {
+
+        loggerConfig.setContentType(1);
+        loggerConfig.setSendType(1);
+
+
+        ContentService contentService = loggerConfig.getContentService();
+        String conteng = contentService.getConteng(logMsg);
+
+
+        LoggerSender loggerSender = loggerConfig.getLoggerSender();
+        loggerSender.sendLog(conteng);
+
+        return "success";
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/ConsoleLoggerSender.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/ConsoleLoggerSender.java
new file mode 100644
index 0000000000..ec20cb1229
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/ConsoleLoggerSender.java
@@ -0,0 +1,15 @@
+package com.ood.ocp.logs.sender;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * Created by ajaxfeng on 2017/6/25.
+ */
+@Service("consoleLoggerSender")
+public class ConsoleLoggerSender implements LoggerSender {
+    @Override
+    public String sendLog(String logMsg) {
+        System.out.println(logMsg);
+        return null;
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSender.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSender.java
new file mode 100644
index 0000000000..1aee4b6ae1
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSender.java
@@ -0,0 +1,11 @@
+package com.ood.ocp.logs.sender;
+
+/**
+ * 日志发送
+ * Created by ajaxfeng on 2017/6/24.
+ */
+public interface LoggerSender {
+
+    public String sendLog(String logMsg);
+
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/MailLoggerSender.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/MailLoggerSender.java
new file mode 100644
index 0000000000..513f352ff1
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/MailLoggerSender.java
@@ -0,0 +1,17 @@
+package com.ood.ocp.logs.sender;
+
+import com.ood.ocp.util.MailUtil;
+import org.springframework.stereotype.Service;
+
+/**
+ * 邮件实现类
+ * Created by ajaxfeng on 2017/6/24.
+ */
+@Service("mailLoggerSender")
+public class MailLoggerSender implements LoggerSender {
+    @Override
+    public String sendLog(String logMsg) {
+        MailUtil.send(logMsg);
+        return "success";
+    }
+}
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/SMSLoggerSender.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/SMSLoggerSender.java
new file mode 100644
index 0000000000..3d6f8f3ea9
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/SMSLoggerSender.java
@@ -0,0 +1,17 @@
+package com.ood.ocp.logs.sender;
+
+import com.ood.ocp.util.SMSUtil;
+import org.springframework.stereotype.Service;
+
+/**
+ * 短信
+ * Created by ajaxfeng on 2017/6/24.
+ */
+@Service("smsLoggerSender")
+public class SMSLoggerSender implements LoggerSender {
+    @Override
+    public String sendLog(String logMsg) {
+        SMSUtil.send(logMsg);
+        return null;
+    }
+}

From d5f27cf7fea73c9e1f00e8653a9ae7410ef2e0ed Mon Sep 17 00:00:00 2001
From: Yangming Xie <yangmingxiework@gmail.com>
Date: Sat, 24 Jun 2017 12:47:11 -0400
Subject: [PATCH 282/332] change the courseWork, add homework 2 and prepare to
 change

---
 .../2_assignment/course/bad/Course.java       | 24 ++++++++++++
 .../course/bad/CourseOffering.java            | 24 ++++++++++++
 .../course/bad/CourseService.java             | 12 ++++++
 .../2_assignment/course/bad/Student.java      | 20 ++++++++++
 .../2_assignment/course/good/Course.java      | 18 +++++++++
 .../course/good/CourseOffering.java           | 34 +++++++++++++++++
 .../course/good/CourseService.java            | 14 +++++++
 .../2_assignment/course/good/Student.java     | 21 ++++++++++
 .../702282822/2_assignment/ocp/DateUtil.java  | 10 +++++
 .../702282822/2_assignment/ocp/Logger.java    | 38 +++++++++++++++++++
 .../702282822/2_assignment/ocp/MailUtil.java  | 10 +++++
 .../702282822/2_assignment/ocp/SMSUtil.java   | 10 +++++
 12 files changed, 235 insertions(+)
 create mode 100644 students/702282822/2_assignment/course/bad/Course.java
 create mode 100644 students/702282822/2_assignment/course/bad/CourseOffering.java
 create mode 100644 students/702282822/2_assignment/course/bad/CourseService.java
 create mode 100644 students/702282822/2_assignment/course/bad/Student.java
 create mode 100644 students/702282822/2_assignment/course/good/Course.java
 create mode 100644 students/702282822/2_assignment/course/good/CourseOffering.java
 create mode 100644 students/702282822/2_assignment/course/good/CourseService.java
 create mode 100644 students/702282822/2_assignment/course/good/Student.java
 create mode 100644 students/702282822/2_assignment/ocp/DateUtil.java
 create mode 100644 students/702282822/2_assignment/ocp/Logger.java
 create mode 100644 students/702282822/2_assignment/ocp/MailUtil.java
 create mode 100644 students/702282822/2_assignment/ocp/SMSUtil.java

diff --git a/students/702282822/2_assignment/course/bad/Course.java b/students/702282822/2_assignment/course/bad/Course.java
new file mode 100644
index 0000000000..436d092f58
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/Course.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+	
+	public boolean equals(Object o){
+		if(o == null || !(o instanceof Course)){
+			return false;
+		}
+		Course c = (Course)o;
+		return (c != null) && c.id.equals(id);
+	}
+}
diff --git a/students/702282822/2_assignment/course/bad/CourseOffering.java b/students/702282822/2_assignment/course/bad/CourseOffering.java
new file mode 100644
index 0000000000..e24bcd2062
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/CourseOffering.java
@@ -0,0 +1,24 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();	
+	
+	public void addStudent(Student st)
+	{
+		if(st.canAttend(course) && maxStudents > students.size())
+		{
+			students.add(st);
+		}
+	}
+	
+	
+}
diff --git a/students/702282822/2_assignment/course/bad/CourseService.java b/students/702282822/2_assignment/course/bad/CourseService.java
new file mode 100644
index 0000000000..3d06149ca2
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/CourseService.java
@@ -0,0 +1,12 @@
+package com.coderising.ood.course.bad;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//如果学生上过该科目的先修科目，并且该课程还未满， 则学生可以加入该课程		
+		sc.addStudent(student);			
+	}
+	
+}
diff --git a/students/702282822/2_assignment/course/bad/Student.java b/students/702282822/2_assignment/course/bad/Student.java
new file mode 100644
index 0000000000..6629b60bfb
--- /dev/null
+++ b/students/702282822/2_assignment/course/bad/Student.java
@@ -0,0 +1,20 @@
+package com.coderising.ood.course.bad;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}
+	public boolean canAttend(Course course){
+		return getCoursesAlreadyTaken().containsAll(
+				course.getPrerequisites());		
+	}
+		
+	
+}
diff --git a/students/702282822/2_assignment/course/good/Course.java b/students/702282822/2_assignment/course/good/Course.java
new file mode 100644
index 0000000000..aefc9692bb
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/Course.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.course.good;
+
+import java.util.List;
+
+public class Course {
+	private String id;
+	private String desc;
+	private int duration ;
+	
+	List<Course> prerequisites;
+	
+	public List<Course> getPrerequisites() {
+		return prerequisites;
+	}
+	
+}
+
+
diff --git a/students/702282822/2_assignment/course/good/CourseOffering.java b/students/702282822/2_assignment/course/good/CourseOffering.java
new file mode 100644
index 0000000000..8660ec8109
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/CourseOffering.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CourseOffering {
+	private Course course;
+	private String location;
+	private String teacher;
+	private int maxStudents;
+	
+	List<Student> students = new ArrayList<Student>();
+	
+	public List<Student> getStudents() {
+		return students;
+	}
+	public int getMaxStudents() {
+		return maxStudents;
+	}
+	public Course getCourse() {
+		return course;
+	}
+	
+	
+	// 第二步：　把主要逻辑移动到CourseOffering 中
+	public void addStudent(Student student){
+		
+		if(student.canAttend(course) 
+				&& this.maxStudents > students.size()){
+			students.add(student);
+		}
+	}
+	// 第三步： 重构CourseService
+}
diff --git a/students/702282822/2_assignment/course/good/CourseService.java b/students/702282822/2_assignment/course/good/CourseService.java
new file mode 100644
index 0000000000..22ba4a5450
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/CourseService.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.course.good;
+
+
+
+public class CourseService {
+	
+	public void chooseCourse(Student student, CourseOffering sc){		
+		//第一步：重构： canAttend ， 但是还有问题
+		if(student.canAttend(sc.getCourse())
+				&& sc.getMaxStudents() > sc.getStudents().size()){
+			sc.getStudents().add(student);
+		}
+	}
+}
diff --git a/students/702282822/2_assignment/course/good/Student.java b/students/702282822/2_assignment/course/good/Student.java
new file mode 100644
index 0000000000..2c7e128b2a
--- /dev/null
+++ b/students/702282822/2_assignment/course/good/Student.java
@@ -0,0 +1,21 @@
+package com.coderising.ood.course.good;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Student {
+	private String id;
+	private String name;
+	private List<Course> coursesAlreadyTaken = new ArrayList<Course>();
+	
+	public List<Course> getCoursesAlreadyTaken() {
+		return coursesAlreadyTaken;
+	}	
+	
+	public boolean canAttend(Course course){
+		return this.coursesAlreadyTaken.containsAll(
+				course.getPrerequisites());
+	}
+}
+
+
diff --git a/students/702282822/2_assignment/ocp/DateUtil.java b/students/702282822/2_assignment/ocp/DateUtil.java
new file mode 100644
index 0000000000..b6cf28c096
--- /dev/null
+++ b/students/702282822/2_assignment/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/702282822/2_assignment/ocp/Logger.java b/students/702282822/2_assignment/ocp/Logger.java
new file mode 100644
index 0000000000..0357c4d912
--- /dev/null
+++ b/students/702282822/2_assignment/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/702282822/2_assignment/ocp/MailUtil.java b/students/702282822/2_assignment/ocp/MailUtil.java
new file mode 100644
index 0000000000..ec54b839c5
--- /dev/null
+++ b/students/702282822/2_assignment/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/702282822/2_assignment/ocp/SMSUtil.java b/students/702282822/2_assignment/ocp/SMSUtil.java
new file mode 100644
index 0000000000..13cf802418
--- /dev/null
+++ b/students/702282822/2_assignment/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
+		
+	}
+
+}

From ad51dedc75c0ca5aaf032a5ef0dcd6337f067a72 Mon Sep 17 00:00:00 2001
From: Yangming Xie <yangmingxiework@gmail.com>
Date: Sun, 25 Jun 2017 01:18:40 -0400
Subject: [PATCH 283/332] refactor second homework, refert to the good one

---
 .../702282822/2_assignment/ocp/Deliver.java   |  5 +++
 .../2_assignment/ocp/DeliveryFactory.java     | 20 ++++++++++
 .../2_assignment/ocp/Email_Deliver.java       |  9 +++++
 .../702282822/2_assignment/ocp/Formatter.java |  4 ++
 .../2_assignment/ocp/FormatterFactory.java    | 14 +++++++
 .../702282822/2_assignment/ocp/Logger.java    | 40 +++++--------------
 .../2_assignment/ocp/Print_Deliver.java       |  8 ++++
 .../702282822/2_assignment/ocp/Raw_log.java   |  8 ++++
 .../2_assignment/ocp/Raw_log_withDate.java    | 12 ++++++
 .../2_assignment/ocp/SMS_Deliver.java         | 10 +++++
 10 files changed, 100 insertions(+), 30 deletions(-)
 create mode 100644 students/702282822/2_assignment/ocp/Deliver.java
 create mode 100644 students/702282822/2_assignment/ocp/DeliveryFactory.java
 create mode 100644 students/702282822/2_assignment/ocp/Email_Deliver.java
 create mode 100644 students/702282822/2_assignment/ocp/Formatter.java
 create mode 100644 students/702282822/2_assignment/ocp/FormatterFactory.java
 create mode 100644 students/702282822/2_assignment/ocp/Print_Deliver.java
 create mode 100644 students/702282822/2_assignment/ocp/Raw_log.java
 create mode 100644 students/702282822/2_assignment/ocp/Raw_log_withDate.java
 create mode 100644 students/702282822/2_assignment/ocp/SMS_Deliver.java

diff --git a/students/702282822/2_assignment/ocp/Deliver.java b/students/702282822/2_assignment/ocp/Deliver.java
new file mode 100644
index 0000000000..377fcf3a64
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Deliver.java
@@ -0,0 +1,5 @@
+
+public interface Dilever
+{
+	public void process(string str);
+}
diff --git a/students/702282822/2_assignment/ocp/DeliveryFactory.java b/students/702282822/2_assignment/ocp/DeliveryFactory.java
new file mode 100644
index 0000000000..daf562759e
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/DeliveryFactory.java
@@ -0,0 +1,20 @@
+
+public interface DeliveryFactory 
+{
+	public static Deliver createDelivery(int type)
+	{
+		if(type == 1)
+		{
+			return new Email_Deliver();			
+		}
+		else if(type == 2)
+		{
+			return new SMS_Deliver();			
+		}
+		else if(type == 3)
+		{			
+			return new Print_Deliver();
+		}		
+	}
+	
+}
diff --git a/students/702282822/2_assignment/ocp/Email_Deliver.java b/students/702282822/2_assignment/ocp/Email_Deliver.java
new file mode 100644
index 0000000000..c4eee88ded
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Email_Deliver.java
@@ -0,0 +1,9 @@
+
+public class Email_Deliver implements dileverMsg
+{
+	public void process(string str)
+	{
+		MailUtil.send(logMsg);
+	}
+	
+}
diff --git a/students/702282822/2_assignment/ocp/Formatter.java b/students/702282822/2_assignment/ocp/Formatter.java
new file mode 100644
index 0000000000..35cf0bf4e3
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Formatter.java
@@ -0,0 +1,4 @@
+public interface Formatter 
+{	
+	public string format(string msg);
+}
diff --git a/students/702282822/2_assignment/ocp/FormatterFactory.java b/students/702282822/2_assignment/ocp/FormatterFactory.java
new file mode 100644
index 0000000000..1f9ef348fd
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/FormatterFactory.java
@@ -0,0 +1,14 @@
+
+public class FormatterFactory {
+	public static Formatter createFormate(int type)
+	{
+		if(type == 1)
+		{
+			return new Raw_log();
+		}
+		else if(type == 2)
+		{
+			return new Raw_log_withDate();		
+		}		
+	} 
+}
diff --git a/students/702282822/2_assignment/ocp/Logger.java b/students/702282822/2_assignment/ocp/Logger.java
index 0357c4d912..839c8d74cd 100644
--- a/students/702282822/2_assignment/ocp/Logger.java
+++ b/students/702282822/2_assignment/ocp/Logger.java
@@ -2,37 +2,17 @@
 
 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;		
+	private Formatter formatter;
+	private Dilever deliver;
+	public Logger(Formatter formatter, Dilever deliver)
+	{
+		this.formatter = formatter;
+		this.deliver = deliver;		
 	}
-	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);
-		}
+	public void log(String msg)
+	{		
+		String message = formatter.formate(msg);
+		deliver.process(message);
 	}
 }
 
diff --git a/students/702282822/2_assignment/ocp/Print_Deliver.java b/students/702282822/2_assignment/ocp/Print_Deliver.java
new file mode 100644
index 0000000000..10c31ba398
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Print_Deliver.java
@@ -0,0 +1,8 @@
+
+public class Print_Deliver 
+{
+	public void process(string str)
+	{
+		System.out.print(str);
+	}	
+}
diff --git a/students/702282822/2_assignment/ocp/Raw_log.java b/students/702282822/2_assignment/ocp/Raw_log.java
new file mode 100644
index 0000000000..5f6af6cf2c
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Raw_log.java
@@ -0,0 +1,8 @@
+
+public class Raw_log implements Formatter
+{
+	public string format(string msg)
+	{
+		return msg;		
+	}
+}
diff --git a/students/702282822/2_assignment/ocp/Raw_log_withDate.java b/students/702282822/2_assignment/ocp/Raw_log_withDate.java
new file mode 100644
index 0000000000..3458923e3f
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/Raw_log_withDate.java
@@ -0,0 +1,12 @@
+
+public class Raw_log_withDate implements Raw_log 
+{
+	public string format(string msg)
+	{
+		string msg = super.format(msg); 
+		String txtDate = DateUtil.getCurrentDateAsString();
+		return txtDate + ": " + msg;	
+	}
+	
+
+}
diff --git a/students/702282822/2_assignment/ocp/SMS_Deliver.java b/students/702282822/2_assignment/ocp/SMS_Deliver.java
new file mode 100644
index 0000000000..047cf55b28
--- /dev/null
+++ b/students/702282822/2_assignment/ocp/SMS_Deliver.java
@@ -0,0 +1,10 @@
+
+public class SMS_Deliver implements dileverMsg
+{
+	public void process(string str)
+	{
+		SMSUtil.send(str);
+	}
+	
+	
+}

From 3a5dd120bf3ab4d4c5ced4eb02c9413dd67c99c2 Mon Sep 17 00:00:00 2001
From: ISmallBlack <1132643730@qq.com>
Date: Sun, 25 Jun 2017 21:00:17 +0800
Subject: [PATCH 284/332] first

---
 students/1132643730/readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 students/1132643730/readme.md

diff --git a/students/1132643730/readme.md b/students/1132643730/readme.md
new file mode 100644
index 0000000000..793aa682b0
--- /dev/null
+++ b/students/1132643730/readme.md
@@ -0,0 +1 @@
+This is a test
\ No newline at end of file

From c6249796be9fcbdaddafc8635dfbc319fce4dadf Mon Sep 17 00:00:00 2001
From: ISmallBlack <1132643730@qq.com>
Date: Sun, 25 Jun 2017 21:15:42 +0800
Subject: [PATCH 285/332] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=BC=96=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1132643730/readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/1132643730/readme.md b/students/1132643730/readme.md
index 793aa682b0..a9142ea24d 100644
--- a/students/1132643730/readme.md
+++ b/students/1132643730/readme.md
@@ -1 +1 @@
-This is a test
\ No newline at end of file
+This is a test 斤斤计较
\ No newline at end of file

From bf6493be2511272a1d8f6ed203106e241ced52b4 Mon Sep 17 00:00:00 2001
From: ISmallBlack <1132643730@qq.com>
Date: Sun, 25 Jun 2017 22:00:32 +0800
Subject: [PATCH 286/332] =?UTF-8?q?=E5=89=8D=E9=9D=A2=E7=9A=84=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/1132643730/ood-assignment/pom.xml    | 32 ++++++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 28 ++++++++
 .../java/com/coderising/ood/ocp/Main.java     | 29 +++++++++
 .../ood/ocp/formatter/DateUtil.java           | 20 ++++++
 .../ood/ocp/formatter/LogFormatter.java       | 15 +++++
 .../ood/ocp/handler/LogHandler.java           | 17 +++++
 .../coderising/ood/ocp/handler/MailUtil.java  |  9 +++
 .../coderising/ood/ocp/handler/PrintUtil.java | 21 ++++++
 .../coderising/ood/ocp/handler/SMSUtil.java   |  9 +++
 .../com/coderising/ood/srp/Configuration.java | 23 +++++++
 .../coderising/ood/srp/ConfigurationKeys.java |  9 +++
 .../java/com/coderising/ood/srp/DBUtil.java   | 25 ++++++++
 .../com/coderising/ood/srp/DataGenerator.java | 64 +++++++++++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java | 41 ++++++++++++
 .../java/com/coderising/ood/srp/Main.java     | 34 ++++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 26 ++++++++
 .../coderising/ood/srp/product_promotion.txt  |  4 ++
 students/1132643730/readme.md                 |  2 +-
 18 files changed, 407 insertions(+), 1 deletion(-)
 create mode 100644 students/1132643730/ood-assignment/pom.xml
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/Main.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/DateUtil.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/formatter/LogFormatter.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/LogHandler.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/MailUtil.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/PrintUtil.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/ocp/handler/SMSUtil.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/DataGenerator.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/Main.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/1132643730/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

diff --git a/students/1132643730/ood-assignment/pom.xml b/students/1132643730/ood-assignment/pom.xml
new file mode 100644
index 0000000000..cac49a5328
--- /dev/null
+++ b/students/1132643730/ood-assignment/pom.xml
@@ -0,0 +1,32 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
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<String,String> configurations = new HashMap<String,String>();
+	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
index a9142ea24d..fdae662c31 100644
--- a/students/1132643730/readme.md
+++ b/students/1132643730/readme.md
@@ -1 +1 @@
-This is a test 斤斤计较
\ No newline at end of file
+### 学着使用git
\ No newline at end of file

From 1f5e3e33061985d291055499f07f88bb9e09f0b7 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Mon, 26 Jun 2017 00:27:25 +0800
Subject: [PATCH 287/332] =?UTF-8?q?=E5=8F=91=E9=82=AE=E4=BB=B6=E7=9A=84?=
 =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/coderising/ood/srp/goodSrp/Mail.java  |  9 +++++---
 .../coderising/ood/srp/goodSrp/MailUtil.java  | 15 +++++++------
 .../ood/srp/goodSrp/ProductService.java       |  2 +-
 .../ood/srp/goodSrp/UserService.java          |  2 +-
 .../goodSrp/template/MailBodyTemplate.java    |  2 +-
 .../template/TextMailBodyTemplate.java        | 21 +++++++------------
 6 files changed, 24 insertions(+), 27 deletions(-)

diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
index cbac40d547..858c154713 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
@@ -1,12 +1,15 @@
 package com.coderising.ood.srp.goodSrp;
 
+import com.coderising.ood.srp.goodSrp.template.MailBodyTemplate;
+import com.coderising.ood.srp.goodSrp.template.TextMailBodyTemplate;
+
 import java.util.List;
 import java.util.stream.Collectors;
 
 public class Mail {
 
 	private User user;
-	
+	MailBodyTemplate mailBodyTemplate;
 	public Mail(User u){
 		this.user = u;	
 	}
@@ -17,8 +20,8 @@ public String getSubject(){
 		return "您关注的产品降价了";
 	}
 	public String getBody(){
-		
-		return "尊敬的 "+user.getName()+", 您关注的产品 " + this.buildProductDescList() + " 降价了，欢迎购买!" ;		
+		mailBodyTemplate = new TextMailBodyTemplate(user.getName(), buildProductDescList(), getAddress());
+		return mailBodyTemplate.render();
 	}
 	private String buildProductDescList() {
 		List<Product> products = user.getSubscribedProducts();
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
index a1fb0ceb73..132ca6be87 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
@@ -1,17 +1,16 @@
 package com.coderising.ood.srp.goodSrp;
 
-
-import com.coderising.ood.srp.goodSrp.template.MailBodyTemplate;
-import com.coderising.ood.srp.goodSrp.template.TextMailBodyTemplate;
-
 public class MailUtil {
 
 	public static void sendEmail(Mail mail, String smtpHost, String fromAddress) {
 		//假装发了一封邮件
 		System.out.println("使用smtpHost为"+smtpHost);
-		MailBodyTemplate template = new TextMailBodyTemplate(mail, fromAddress);
-		System.out.println(template.render());
-	}
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("From:").append(fromAddress).append("\n");
+		buffer.append("To:").append(mail.getAddress()).append("\n");
+		buffer.append("Subject:").append(mail.getSubject()).append("\n");
+		buffer.append("Content:").append(mail.getBody()).append("\n");
 
-	
+		System.out.println(buffer.toString());
+	}
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
index a787d00eb3..12ad38262e 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
@@ -26,7 +26,7 @@ private Product parseGenProduct(String line) {
 		String[] data = line.split(" ");
 		String productID = data[0];
 		String productDesc = data[1];
-		System.out.println("产品ID = " + productID + "\n");
+		System.out.println("产品ID = " + productID);
 		System.out.println("产品描述 = " + productDesc + "\n");
 		Product p = new Product();
 		p.setDesc(productDesc);
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
index 635f9fe140..a2bd152896 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
@@ -12,7 +12,7 @@ public class UserService {
     public List<User> getUsers(List<Product> ps) {
         List<User> users = new LinkedList<>();
         String sql = "Select name from subscriptions where send_mail=1";
-        System.out.println("loadQuery set");
+        System.out.println("loadQuery set\n");
         List userInfoList = DBUtil.query(sql);
         for (Object userInfo: userInfoList) {
             User user = new User();
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
index 1852b6155a..95eeff723f 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
@@ -1,5 +1,5 @@
 package com.coderising.ood.srp.goodSrp.template;
 
 public interface MailBodyTemplate {
-	public String render();
+	String render();
 }
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
index b7906c6bf2..4dd174a3ce 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
+++ b/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
@@ -1,25 +1,20 @@
 package com.coderising.ood.srp.goodSrp.template;
 
-import com.coderising.ood.srp.goodSrp.Mail;
-
 
 public class TextMailBodyTemplate implements MailBodyTemplate {
-	private Mail mail;
-	String fromAdress;
-	public TextMailBodyTemplate(Mail mail, String fromAdress){
-		this.mail = mail;
-		this.fromAdress = fromAdress;
+	String productDescription;
+	String name;
+	String toAdress;
+	public TextMailBodyTemplate(String name, String productDescription, String toAdress){
+		this.productDescription = productDescription;
+		this.name = name;
+		this.toAdress = toAdress;
 	}
 	
 	@Override
 	public String render() {
 		//使用某种模板技术实现Render
-		StringBuilder buffer = new StringBuilder();
-		buffer.append("From:").append(fromAdress).append("\n");
-		buffer.append("To:").append(mail.getAddress()).append("\n");
-		buffer.append("Subject:").append(mail.getSubject()).append("\n");
-		buffer.append("Content:").append(mail.getBody()).append("\n");
-		return buffer.toString();
+        return "尊敬的 "+ name +", 您关注的产品 " + productDescription + " 降价了，欢迎购买!" ;
 	}
 
 }

From 23bcc0e21b61ef5831a69ed5ec44d865a1d09c8d Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Mon, 26 Jun 2017 00:49:09 +0800
Subject: [PATCH 288/332] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=A4=9A=E7=BA=BF?=
 =?UTF-8?q?=E7=A8=8B=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../myknowledgepoint/cas/CASSequence.java     | 18 +++++++++
 .../myknowledgepoint/cas/NoBlockingStack.java | 34 +++++++++++++++++
 .../myknowledgepoint/cas/Sequence.java        | 11 ++++++
 .../myknowledgepoint/threadlocal/Context.java | 21 ++++++++++
 .../threadlocal/TransactionManager.java       | 22 +++++++++++
 .../threadpool/BlockingQueue.java             | 36 ++++++++++++++++++
 .../myknowledgepoint/threadpool/Task.java     |  5 +++
 .../threadpool/ThreadPool.java                | 38 +++++++++++++++++++
 .../threadpool/WorkerThread.java              | 32 ++++++++++++++++
 9 files changed, 217 insertions(+)
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java

diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java
new file mode 100644
index 0000000000..144aa264ff
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/CASSequence.java
@@ -0,0 +1,18 @@
+package com.coderising.myknowledgepoint.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/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java
new file mode 100644
index 0000000000..c03c096c78
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/NoBlockingStack.java
@@ -0,0 +1,34 @@
+package com.coderising.myknowledgepoint.cas;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public class NoBlockingStack<E> {
+	static class Node<E> {
+        final E item;
+        Node<E> next;
+        public Node(E item) { this.item = item; }
+    }
+  
+    AtomicReference<Node<E>> head = new AtomicReference<Node<E>>();
+    
+    public void push(E item) {
+        Node<E> newHead = new Node<E>(item);
+        Node<E> oldHead;
+        do {
+            oldHead = head.get();
+            newHead.next = oldHead;
+        } while (!head.compareAndSet(oldHead, newHead));
+    }
+    public E pop() {
+        Node<E> oldHead;
+        Node<E> newHead;
+        do {
+            oldHead = head.get();
+            if (oldHead == null) 
+                return null;
+            newHead = oldHead.next;
+        } while (!head.compareAndSet(oldHead,newHead));
+        return oldHead.item;
+    }
+    
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java
new file mode 100644
index 0000000000..25909d0dd9
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/cas/Sequence.java
@@ -0,0 +1,11 @@
+package com.coderising.myknowledgepoint.cas;
+
+public class Sequence{
+
+	private int value;
+
+	public int next(){
+		return value ++;
+	}
+	
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java
new file mode 100644
index 0000000000..a9b18ddaf4
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/Context.java
@@ -0,0 +1,21 @@
+package com.coderising.myknowledgepoint.threadlocal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Context {
+	
+	private static final ThreadLocal<String> txThreadLocal 
+		= new ThreadLocal<String>();
+	
+	public static void setTransactionID(String txID) {		
+		txThreadLocal.set(txID); 
+	
+	}
+	
+	public static String getTransactionId() {
+		return txThreadLocal.get();
+	}	
+
+}
+
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java
new file mode 100644
index 0000000000..2cf9170578
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadlocal/TransactionManager.java
@@ -0,0 +1,22 @@
+package com.coderising.myknowledgepoint.threadlocal;
+
+public class TransactionManager {
+	private static final ThreadLocal<String> context = new ThreadLocal<String>();
+
+	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/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java
new file mode 100644
index 0000000000..d6e9ec5104
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/BlockingQueue.java
@@ -0,0 +1,36 @@
+package com.coderising.myknowledgepoint.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/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
new file mode 100644
index 0000000000..be844e09f3
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
@@ -0,0 +1,5 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+public interface Task {
+	public void execute();
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
new file mode 100644
index 0000000000..267c3fb9f5
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
@@ -0,0 +1,38 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ThreadPool {
+
+    private BlockingQueue taskQueue = null;
+    private List<WorkerThread> threads = new ArrayList<WorkerThread>();
+    private boolean isStopped = false;
+
+    public ThreadPool(int numOfThreads, int maxNumOfTasks){
+        taskQueue = new BlockingQueue(maxNumOfTasks);
+
+        for(int i=0; i<numOfThreads; i++){
+            threads.add(new WorkerThread(taskQueue));
+        }
+        for(WorkerThread thread : threads){
+            thread.start();
+        }
+    }
+
+    public synchronized void  execute(Task task) throws Exception{
+        if(this.isStopped) throw
+            new IllegalStateException("ThreadPool is stopped");
+
+        this.taskQueue.enqueue(task);
+    }
+
+    public synchronized void stop(){
+        this.isStopped = true;
+        for(WorkerThread thread : threads){
+           thread.doStop();
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java
new file mode 100644
index 0000000000..1f1b08f55e
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java
@@ -0,0 +1,32 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+public class WorkerThread extends Thread {
+
+    private BlockingQueue taskQueue = null;
+    private boolean       isStopped = false;
+
+    public WorkerThread(BlockingQueue queue){
+        taskQueue = queue;
+    }
+
+    public void run(){
+        while(!isStopped()){
+            try{
+                Task task = (Task) taskQueue.dequeue();
+                task.execute();
+            } catch(Exception e){
+                //log or otherwise report exception,
+                //but keep pool thread alive.
+            }
+        }
+    }
+
+    public synchronized void doStop(){
+        isStopped = true;
+        this.interrupt(); //break pool thread out of dequeue() call.
+    }
+
+    public synchronized boolean isStopped(){
+        return isStopped;
+    }
+}
\ No newline at end of file

From de9cb62cb19482dbb6a0ca9d8de84e3a8a6b39a3 Mon Sep 17 00:00:00 2001
From: yangzhm <yangzhm@hualu.com.cn>
Date: Mon, 26 Jun 2017 15:50:53 +0800
Subject: [PATCH 289/332] add homework for UML

---
 students/495232796/OOD/UML/DiceGame-class.jpg   | Bin 0 -> 60971 bytes
 .../495232796/OOD/UML/DiceGame-sequence.jpg     | Bin 0 -> 71663 bytes
 students/495232796/OOD/UML/ShoppingSite.jpg     | Bin 0 -> 74258 bytes
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 students/495232796/OOD/UML/DiceGame-class.jpg
 create mode 100644 students/495232796/OOD/UML/DiceGame-sequence.jpg
 create mode 100644 students/495232796/OOD/UML/ShoppingSite.jpg

diff --git a/students/495232796/OOD/UML/DiceGame-class.jpg b/students/495232796/OOD/UML/DiceGame-class.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..869d72dd5e3c11b168d4b32d3540e9cd953ffc29
GIT binary patch
literal 60971
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
SJc31&{5Igmzu{gp@Ba^9#&8}0

literal 0
HcmV?d00001

diff --git a/students/495232796/OOD/UML/DiceGame-sequence.jpg b/students/495232796/OOD/UML/DiceGame-sequence.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8d6b90e9b3b858f5ea6421b98f39ffba4cb7897b
GIT binary patch
literal 71663
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

literal 0
HcmV?d00001

diff --git a/students/495232796/OOD/UML/ShoppingSite.jpg b/students/495232796/OOD/UML/ShoppingSite.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5e05336f627ef4fb76a38ebd31d59556bff1983e
GIT binary patch
literal 74258
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
Pw~xu{UXIqfw$}C&ox<u0

literal 0
HcmV?d00001


From c73d55cefea03f26202066ed7d68336acd7f24d6 Mon Sep 17 00:00:00 2001
From: fengdz <fengdz@dajiashequ.com>
Date: Mon, 26 Jun 2017 19:52:48 +0800
Subject: [PATCH 290/332] =?UTF-8?q?ocp=20commit,=20=E6=94=AF=E6=8C=81?=
 =?UTF-8?q?=E8=A7=82=E5=AF=9F=E8=80=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/ood/ocp/logs/config/LoggerConfig.java | 18 ++++++---
 .../ood/ocp/logs/config/LoggerConfigImpl.java | 37 +++++++++++-------
 .../ocp/logs/logger/LoggerServiceImpl.java    | 22 +++++++----
 .../ocp/logs/sender/LoggerSenderWacher.java   | 39 +++++++++++++++++++
 4 files changed, 88 insertions(+), 28 deletions(-)
 create mode 100644 students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSenderWacher.java

diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java
index 66f82210ba..fac6f09e8c 100644
--- a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfig.java
@@ -1,7 +1,8 @@
 package com.ood.ocp.logs.config;
 
 import com.ood.ocp.logs.content.ContentService;
-import com.ood.ocp.logs.sender.LoggerSender;
+
+import java.util.List;
 
 /**
  * Created by ajaxfeng on 2017/6/24.
@@ -14,12 +15,17 @@ public interface LoggerConfig {
     public final int SMS_LOG = 2;
     public final int PRINT_LOG = 3;
 
+    /**
+     *
+     * @return
+     */
     public ContentService getContentService();
 
-    public LoggerSender getLoggerSender();
-
-    public void setContentType(int contentType);
-
-    public void setSendType(int sendType);
+    /**
+     * 设置类型
+     *
+     * @param sendTypeList
+     */
+    public void setSendTypeList(List<Integer> sendTypeList);
 
 }
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java
index f5b26cba56..f8ef1661cd 100644
--- a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/config/LoggerConfigImpl.java
@@ -2,18 +2,23 @@
 
 import com.ood.ocp.logs.content.ContentService;
 import com.ood.ocp.logs.sender.LoggerSender;
+import com.ood.ocp.logs.sender.LoggerSenderWacher;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * Created by ajaxfeng on 2017/6/24.
  */
 @Service
 public class LoggerConfigImpl implements LoggerConfig {
+    @Autowired
+    private LoggerSenderWacher loggerSenderWacher;
 
     private int contentType;
 
-    private int sendType;
+    private List<Integer> sendTypeList;
     @Autowired
     private LoggerSender mailLoggerSender;
     @Autowired
@@ -38,21 +43,18 @@ public ContentService getContentService() {
         return contentService;
     }
 
-    @Override
-    public LoggerSender getLoggerSender() {
-        if (EMAIL_LOG == sendType) {
-            return mailLoggerSender;
+    private void initLoggerWacher(){
+        if(sendTypeList.contains(EMAIL_LOG)){
+            loggerSenderWacher.addLoggerSender(mailLoggerSender);
         }
-        if (SMS_LOG == sendType) {
-            return smsLoggerSender;
+         if(sendTypeList.contains(SMS_LOG)){
+            loggerSenderWacher.addLoggerSender(smsLoggerSender);
         }
-        if (PRINT_LOG == sendType) {
-            return consoleLoggerSender;
+         if(sendTypeList.contains(PRINT_LOG)){
+            loggerSenderWacher.addLoggerSender(consoleLoggerSender);
         }
-        return mailLoggerSender;
     }
 
-
     public int getContentType() {
         return contentType;
     }
@@ -61,11 +63,16 @@ public void setContentType(int contentType) {
         this.contentType = contentType;
     }
 
-    public int getSendType() {
-        return sendType;
+    public List<Integer> getSendTypeList() {
+        return sendTypeList;
     }
 
-    public void setSendType(int sendType) {
-        this.sendType = sendType;
+    /**
+     * 设置类型
+     * @param sendTypeList
+     */
+    public void setSendTypeList(List<Integer> sendTypeList) {
+        this.sendTypeList = sendTypeList;
+        initLoggerWacher();
     }
 }
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java
index fa9c4e7d44..b1d370e4c6 100644
--- a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/logger/LoggerServiceImpl.java
@@ -3,9 +3,13 @@
 import com.ood.ocp.logs.config.LoggerConfig;
 import com.ood.ocp.logs.content.ContentService;
 import com.ood.ocp.logs.sender.LoggerSender;
+import com.ood.ocp.logs.sender.LoggerSenderWacher;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Created by ajaxfeng on 2017/6/24.
  */
@@ -14,22 +18,26 @@ public class LoggerServiceImpl implements LoggerService {
 
     @Autowired
     LoggerConfig loggerConfig;
+    @Autowired
+    LoggerSenderWacher loggerSenderWacher;
 
 
     @Override
     public String logger(String logMsg) {
 
-        loggerConfig.setContentType(1);
-        loggerConfig.setSendType(1);
+        List<Integer> typeList=new ArrayList();
+        typeList.add(1);
+        typeList.add(2);
+        typeList.add(3);
 
+        loggerConfig.setSendTypeList(typeList);
 
+        //构造内容
         ContentService contentService = loggerConfig.getContentService();
-        String conteng = contentService.getConteng(logMsg);
-
-
-        LoggerSender loggerSender = loggerConfig.getLoggerSender();
-        loggerSender.sendLog(conteng);
+        String content = contentService.getConteng(logMsg);
 
+        //推送消息
+        loggerSenderWacher.watch(content);
         return "success";
     }
 }
diff --git a/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSenderWacher.java b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSenderWacher.java
new file mode 100644
index 0000000000..72f5c8013a
--- /dev/null
+++ b/students/281918307/ood-ocp/src/main/java/com/ood/ocp/logs/sender/LoggerSenderWacher.java
@@ -0,0 +1,39 @@
+package com.ood.ocp.logs.sender;
+
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 日志观察者
+ * Created by ajaxfeng on 2017/6/26.
+ */
+@Service
+public class LoggerSenderWacher {
+    private List<LoggerSender> loggerSenders;
+
+    public List<LoggerSender> getLoggerSenders() {
+        return loggerSenders;
+    }
+
+    public void addLoggerSender(LoggerSender loggerSender){
+         if(!loggerSenders.contains(loggerSender)){
+             loggerSenders.add(loggerSender);
+         }
+    }
+
+    public void setLoggerSenders(List<LoggerSender> loggerSenders) {
+        this.loggerSenders = loggerSenders;
+    }
+
+    /**
+     * 调用观察者发送消息
+     * @param content
+     */
+    public void watch(String content){
+        for(LoggerSender loggerSender:loggerSenders){
+            loggerSender.sendLog(content);
+        }
+    }
+
+}

From f6588e44bcd46f8ca695616483b5b50a1316fd11 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Mon, 26 Jun 2017 22:55:05 +0800
Subject: [PATCH 291/332] =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E4=BD=BF?=
 =?UTF-8?q?=E7=94=A81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../threadpool/DriveThreadPool.java           | 25 +++++++++++++++++++
 .../myknowledgepoint/threadpool/Task.java     |  2 +-
 .../threadpool/ThreadPool.java                | 14 +++++++++--
 .../threadpool/WorkerThread.java              |  3 ++-
 4 files changed, 40 insertions(+), 4 deletions(-)
 create mode 100644 students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java

diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java
new file mode 100644
index 0000000000..015317af41
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/DriveThreadPool.java
@@ -0,0 +1,25 @@
+package com.coderising.myknowledgepoint.threadpool;
+
+/**
+ * Created by thomas_young on 26/6/2017.
+ */
+public class DriveThreadPool {
+
+    public static void main(String[] args) throws Exception {
+        Task task = ()-> {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                System.out.println("I'm killed!");
+            }
+            System.out.println("haha");
+        };
+
+        ThreadPool pool = new ThreadPool(5, 2);
+        for (int i=1; i<10; i++) {
+            pool.execute(task);
+        }
+        pool.stop();
+
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
index be844e09f3..418d672f78 100644
--- a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/Task.java
@@ -1,5 +1,5 @@
 package com.coderising.myknowledgepoint.threadpool;
 
 public interface Task {
-	public void execute();
+	void execute();
 }
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
index 267c3fb9f5..96472822e2 100644
--- a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/ThreadPool.java
@@ -7,9 +7,14 @@
 public class ThreadPool {
 
     private BlockingQueue taskQueue = null;
-    private List<WorkerThread> threads = new ArrayList<WorkerThread>();
+    private List<WorkerThread> threads = new ArrayList<>();
     private boolean isStopped = false;
 
+    /**
+     * 线程池实例化的时候，线程就都启动了
+     * @param numOfThreads
+     * @param maxNumOfTasks
+     */
     public ThreadPool(int numOfThreads, int maxNumOfTasks){
         taskQueue = new BlockingQueue(maxNumOfTasks);
 
@@ -21,7 +26,12 @@ public ThreadPool(int numOfThreads, int maxNumOfTasks){
         }
     }
 
-    public synchronized void  execute(Task task) throws Exception{
+    /**
+     * 往阻塞队列里面加task
+     * @param task
+     * @throws Exception
+     */
+    public synchronized void execute(Task task) throws Exception{
         if(this.isStopped) throw
             new IllegalStateException("ThreadPool is stopped");
 
diff --git a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java
index 1f1b08f55e..790e2a463f 100644
--- a/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java
+++ b/students/812350401/src/main/java/com/coderising/myknowledgepoint/threadpool/WorkerThread.java
@@ -17,13 +17,14 @@ public void run(){
             } catch(Exception e){
                 //log or otherwise report exception,
                 //but keep pool thread alive.
+                System.out.println("doStop");
             }
         }
     }
 
     public synchronized void doStop(){
         isStopped = true;
-        this.interrupt(); //break pool thread out of dequeue() call.
+        this.interrupt();  //break pool thread out of dequeue() call，可以令waiting状态的线程抛出异常从而跳出
     }
 
     public synchronized boolean isStopped(){

From 0738eb4a60d14ef6af37817e31c50d7f5c2bf448 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Tue, 27 Jun 2017 00:49:46 +0800
Subject: [PATCH 292/332] =?UTF-8?q?=E6=8A=95=E9=AA=B0=E5=AD=90-=E4=BB=A3?=
 =?UTF-8?q?=E7=A0=81=E9=83=A8=E5=88=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/812350401/pom.xml                    |  7 ++-
 .../java/com/coderising/ood/uml/Dice.java     | 17 +++++++
 .../java/com/coderising/ood/uml/DiceGame.java | 44 +++++++++++++++++++
 .../java/com/coderising/ood/uml/GameTest.java | 15 +++++++
 .../java/com/coderising/ood/uml/Player.java   | 23 ++++++++++
 5 files changed, 105 insertions(+), 1 deletion(-)
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java
 create mode 100644 students/812350401/src/main/java/com/coderising/ood/uml/Player.java

diff --git a/students/812350401/pom.xml b/students/812350401/pom.xml
index 9a28365d2a..8f2f890209 100644
--- a/students/812350401/pom.xml
+++ b/students/812350401/pom.xml
@@ -34,7 +34,12 @@
     	<artifactId>junit</artifactId>
     	<version>4.12</version>
     </dependency>
-    
+      <dependency>
+          <groupId>com.google.collections</groupId>
+          <artifactId>google-collections</artifactId>
+          <version>1.0</version>
+      </dependency>
+
   </dependencies>
   <repositories>
         <repository>
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java b/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
new file mode 100644
index 0000000000..a6b49c7edf
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.uml;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.Random;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class Dice {
+
+    private ImmutableList<Integer> values = ImmutableList.of(0, 1, 2, 3, 4, 5, 6);
+
+    public int roll() {
+       return values.get(new Random().nextInt(values.size()));
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java b/students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java
new file mode 100644
index 0000000000..afa322f909
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.uml;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class DiceGame {
+    private Player player1, player2;
+    private Dice dice1, dice2;
+    private static int WIN_POINT = 7;
+
+    public void start() {
+        assert player1 != null;
+        assert player2 != null;
+        assert dice1 != null;
+        assert dice2 != null;
+        int player1Point;
+        int player2Point;
+        do {
+            player1Point = player1.roll(dice1, dice2);
+            player2Point = player2.roll(dice1, dice2);
+            System.out.print(player1 + " roll " + player1Point + ", ");
+            System.out.println(player2 + " roll " + player2Point + ".");
+            if (player1Point == player2Point) {
+                continue;
+            }
+            if (player1Point == WIN_POINT) {
+                System.out.println(player1 + " win!");
+                break;
+            }
+            if (player2Point == WIN_POINT) {
+                System.out.println(player2 + " win!");
+                break;
+            }
+        } while (true);
+    }
+
+    public DiceGame(Player aPlayer1, Player aPlayer2, Dice aDice1, Dice aDice2) {
+        player1 = aPlayer1;
+        player2 = aPlayer2;
+        dice1 = aDice1;
+        dice2 = aDice2;
+    }
+
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java b/students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java
new file mode 100644
index 0000000000..75906c3661
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.uml;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class GameTest {
+    public static void main(String[] args) {
+        Player player1 = new Player("player1");
+        Player player2 = new Player("player2");
+        Dice dice1 = new Dice();
+        Dice dice2 = new Dice();
+        DiceGame game = new DiceGame(player1, player2, dice1, dice2);
+        game.start();
+    }
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/Player.java b/students/812350401/src/main/java/com/coderising/ood/uml/Player.java
new file mode 100644
index 0000000000..c51d5e0868
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/ood/uml/Player.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.uml;
+
+/**
+ * Created by thomas_young on 27/6/2017.
+ */
+public class Player {
+    private String name;
+
+    public Player(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+    public int roll(Dice dice1, Dice dice2) {
+        int first = dice1.roll();
+        int second = dice2.roll();
+        return first + second;
+    }
+}

From 2e94530b6620f2650ad010d509263c5ab3747ee9 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Tue, 27 Jun 2017 00:51:32 +0800
Subject: [PATCH 293/332] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=AA=B0=E5=AD=90?=
 =?UTF-8?q?=E7=9A=84=E7=82=B9=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../812350401/src/main/java/com/coderising/ood/uml/Dice.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java b/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
index a6b49c7edf..b805b44d68 100644
--- a/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
+++ b/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
@@ -9,7 +9,7 @@
  */
 public class Dice {
 
-    private ImmutableList<Integer> values = ImmutableList.of(0, 1, 2, 3, 4, 5, 6);
+    private ImmutableList<Integer> values = ImmutableList.of(1, 2, 3, 4, 5, 6);
 
     public int roll() {
        return values.get(new Random().nextInt(values.size()));

From 68400304da7ea5ba0a7a046099690ba79ce43348 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Tue, 27 Jun 2017 07:43:35 +0800
Subject: [PATCH 294/332] =?UTF-8?q?=E6=8A=95=E9=AA=B0=E5=AD=90uml=E5=9B=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...20\346\227\266\345\272\217\345\233\276.png" | Bin 0 -> 137601 bytes
 ...60\345\255\220\347\261\273\345\233\276.png" | Bin 0 -> 102615 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 "students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png"
 create mode 100644 "students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"

diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png"
new file mode 100644
index 0000000000000000000000000000000000000000..578894269daf55c28a5e15c719f441d3d405c262
GIT binary patch
literal 137601
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
Y)Ix<}mpET8_}|90Th~OdvN-vF07zcKr2qf`

literal 0
HcmV?d00001

diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"
new file mode 100644
index 0000000000000000000000000000000000000000..4973c14277ba5c597fc3c8ce49914e5660595602
GIT binary patch
literal 102615
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
N`T0_Os`o|z{4Z`k3Hbm3

literal 0
HcmV?d00001


From cf5b22c11b309ea06270ef5404c4814421dfaa8c Mon Sep 17 00:00:00 2001
From: sheng <1158154002@qq.com>
Date: Tue, 27 Jun 2017 08:10:47 +0800
Subject: [PATCH 295/332] uml homework01

---
 dicegame.png | Bin 0 -> 15130 bytes
 shopping.png | Bin 0 -> 12840 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dicegame.png
 create mode 100644 shopping.png

diff --git a/dicegame.png b/dicegame.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c1a40821ae9979ac0ab745a54fde3b2c9a462a7
GIT binary patch
literal 15130
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

literal 0
HcmV?d00001

diff --git a/shopping.png b/shopping.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ef672f5f9b500242c3cf915dafc8d3ba40e84ee
GIT binary patch
literal 12840
zcmeHuc{r49*!RtZWGg+9h>{_DQ6!?0FhgqWI~hs|S+W~SRMue-vOQU|hKKA^3S+X3
z7P4p0Hul|o*RAJy-}m{x<2&AezvKAcKQhOC-RE`Q*L7akd7i&>>G{nY>TCy&9e^N+
zO;h6<27(xFLJ<AQ{q$f&<P+lx_@Q&fs9%K&+xVuy!@fILw68$W+enseYX<Pl?5ttz
z3PJ1*@ISgHryMK<ovqcpc16$AVz&Rm?KjO_3?2O6kKb&J>Fgu*y|2msbe)Akjp3<F
zfx!Gz-A{&BqDy1k)^IcgV3v4_3Vtp>+2;=)?nV(gzz-YeIvoV1U7=S259c(7m>?*C
zk$D?Dbesqj06)is{%6wvQ-U}{#>v}qLQpZ!54R!A)orrN1qd2C>^6E?D68m%2sp9<
zjZ^G{Qt8`STD79OPAz&6WaYQ%v~Hm}Y$G$mpwJPd1+JgL>)GI<n9qL52JvR*LhMlp
zG71dlt<!K>z1cV*n9bJ$Mv6}t$oYnToJKJYNM#p+s|OiHDD(b^*E1&()yFVmJYXa)
zts%G(skMgb4>L26)(1<m{c-=Ufs7jx!5b5r2T$@0Y&`aZFxiK8Z*WPk)uV#~?o7Q&
zzrx&Ft0ylV--|v1NM6JpGl_WzNJLyZ_eh$iveQMGTWa+@knsb1BvE$9e&C-0k`Ncf
z9*O#7M*1P<CO{%y(Fv2h)aGRi*N~CI{HW~H!UGwdNs>Ee5@lqT@g=Aavo{dQf9#QT
z;5&`nla+4;kw7wxZ0BYyD9+Vh7b--+O(&i@*HP^B{DT^*l{9-q6zIm<WQz4*^b=E^
z50xZ%#*lD<?2HkoGaggzk_xNM=hyDR$I<k=5v;FFj{t45;s*r!Kb`QHX_pEam>|t5
zxE8g#leL`0%LNlK`T>HHB3J>#I^`Rrkn8@I%dHQ{K<%6(vv?kf<{H9^D10~3IzHN)
z0jR6h<9`q1IK3*ky=lAKYZGghat1L;@f&ntWyfV_bQb3ppRWzhr@sBDtk}e|ZR+MJ
zrmli3WrK(n9cLSM3EPhdv!C<=RYVtt+UMubHVN#C$c$X@ip#_?Ml~GRmW7pn5Y@!G
zrMuXBtDIYwbvrvvd1WCs=}9Q5Ri10T+NiE^(On(hNL?h6<2PA+l-|*ef;u8iZo`Ke
zs7t`u{_SEFWc_hlpR*Oa8MMJ%O6$uV?w!!=Za#N%Ag#uGqI&-R&ZGJOoIlM%YRvw9
zV}vfvIn8_j6D5_Li4#Ds#P5gJt>aNarV7;WZ<jVlM*1$Q^4pBr8)Oc6@$}aUV0~=f
z6!(+qmrvRDL`=s<7OkFMn&+QrPaO{0wI6Mc2Uaei=oGa<%AH4wH&j8Gq?)t6w&k<^
z7gaPn(%<)0600%ixPnfc(#5JJnJOQZ=GAh-rwh{RAH3vBR|ebX(|n`wOPKx(H*f_1
zGrCPo(iL>jIzPS23?_cK<n2o__tldwAJ5cBYAa#MI2sq*#$T^8;(uM&%I~#ry|J;C
z7BTdd!d(&Js!)+?77-tr7orzQ4^g%E`FCe>4#(|m*WP$h+t94Bay9;Hj94V^nuiyr
z^7A2{-TeHYnO(Q{gHxypCvsHl3HIG8w_IJDIJm!Ep|&kkRX;jR>gKmwWhHK(KU+6p
z8)I4PCq(FX4ulPQ2z<r)OWiS_^O(M{bL%<+S8t>8!%4^N5HRzHfh?<7J)&l9`5J~5
zuJczgiY~kq5AjmbER}oZ{Oavp%4g#@yzQ%DL=~}^IN4fZzg1-^jh%<L<_*RNFSU7P
z%KoKjfEz`JDl<aR>gAyjbJR1_^Hc%8Xl%W?%V=$fQLCk<;})K`oxMxONg+O=`o?<p
z`5DBH{rfg%T=979OyZ(fCQ~3S?Z^CtQ~ksFp0}?`hR`h!=^*}$@BniZyOAQ`)_`3T
z2uOOixN^g9NcyDf?cMuT)ymDQr%EPbSuIJ<()y<tO?*uX86m4M3p%-zty?TEY4K)^
zyG!%0A`9t#{XKjOIo8?-SjKl<YF;}?4>xvJxqg))u90|)nJRBX0jeA^G$v)Sf=w{*
z4zecRa{%Xy|Ee=Kk{S|!ZZMMLI%+Im%WSfpRISU0^|4hjMk2cGZrF@eO{|yk*(xZ^
zmAd=^4Q)*#tPWFN)}LUyXX3b`Dz7+E(?1s8!dfoYZeKpLYG0YyQ^E^TkNeJt^lLOI
z3(F?Pnf8yij<?v69hXa_oGcSwxd+dH75(HXK|mc+gY(u*loTCuP1cyfnsaGohkb&_
z*y`PeD&F~wvaDBASz7(|eeK!_2cUCJ6<*zC%OkO!Kd;Ew>jR6FSxfrLEox43##20+
zFRfwBO(K*}#+bxcCr4>Qm&JWOLc&o9Ww%@P0}dF+B8}Wz@Ema-Da^gAj=Ax_uDW!b
zO<3@Aq1nhFpl+4H@7AsqHxAqUW38)3nP)3&i%2IcoXUA?quwTyTbD6@+7a%^1|vb}
zZsPo8vE<ZW;ykA@Vwl9!a;M}CGM4*GxKw$nqlb4S%%v*gf9bkBOAk9MeE%HbEM%4H
zD;-jxfiovvMj{MVbGby%pRCZ!xQ0Z_)?VP@Z|OD|6Z6Sc7W84a4dW@n#<D_?&q(zJ
zUkmSFD8^tJgA6^=WzzyLN6i6GgE*(tHinLob-Er%k=(YZ<1YxF+6JW>%uqMSVEu3m
zMcq*5jIgZmI5uCye!@jo4W%SLZIt1LY^c>!5#sJduViV>X13ffNd#^rAeq|At9)v9
z>1Jai_Bx&t%gQY}YvA}=<9V!YrBAK}iMrX2%$~};crwO2w<IXv9{4yb4&RAj5A=5>
z!dv@<HH{ffd*G7PP&Mdpe%@oUW+dVPm&X=w3}wtRK2l2R)KCy{e50JrDb~L-IxtCQ
z<voc>bQUF5tMOctRGNz&LIqp;L?~R7{)%FJK`>G`sDyVSH&{BXO%XPfan`Zp7VVGe
z`P*5>7PPn~`eR^;ohrE_{Z%ki5c!SpmlTE`lKU+0U}Ro3f?^yeDYwsk)%@*mdrFna
z>0#yxvfeJ{Gh#JY3~FHhVuJ<NYW6QeWaM;KMKOtz)%r5UXDi>K81Jg3+=s;wnV?{O
zh~`h@V_ye8rkttjy-%Y@Tis!G<#!&`;gqJHuBK!72HJM(>R{^hleR~Ff5me`#hP{c
z4Pq1)4%?YSJxfmuFK+z<4C-_S0-9`TPu(g#4cP0#Iz0N4QWo&Kk=Ug|HzgzGV`r5p
ze+JTq-g)33KvprndBIOJS->8jl(^z4;2xnEmBr#QB*;>t=mW3@uAEQiQD;(ae2<mV
zZBO+6a%YZ-9%s0|amn15XPW(Hn}sl6Xlc=(o41HcJ$dkU`3JMDHK%amJf0}_w>MRi
zZS-ZRj}-inh%>@Yq?ezKKDf)(@dO^On$I4MZU|Y5*s_>aP^7Niky6~=aP7M<Lroo{
zW_MZeE%P)X{^((Z%A3~gjjmrDL@}nszWzhBRw9JArQ39rpvv<k=~qSO)_Pj6uQA0r
z_0LF!^@|5RVvXCXSJVsX{c*2Ci~SN6(o>b+g{9WpmWH`Ay*#ije!=20yl)@h)L_HR
zi304<d4+EWTHPXi{()zXEz^`d@%|vgSBtLkkvf62<%Rd3oJMq0d2_ZJ+|<3CCzvP5
zHQehuYaV1*!<b}0K?E^)Lz%4|U7<*Li<Iyuns`t}6P6$I-MuROUfauDjC;j#$-b20
zJn_fo{H*Kl6tU*D<@P!2II@GvFTqcdyBWio0xEoK5+!VqL*#rHHEg+3m8Un!Y)3o6
zTQ_Tfkn5~7@G?D2|8<YQCU=6m>)O|w^oyR?>R$Pc5V>!JTvD8QlsxA8O~!d;VN8ck
zO6t}SQ-IUx);T2!ZAT=+Cr;5=`vyXO%)K&t*y4>Es=d1HEB9uzGACKxY~QZ2ah0M=
z)}!yP2e$hc-tasjuWu+MXXL3IS#STY)cdf)0_fE0x-uJwhL0(*3ocI5<YBAenscf=
zyfHkX47;756^~wY<ooGzq*mIDZ?f^BG+Tt%k0RyE=TCiqn9onpv@K1-WTl4QA+0vt
z^LP=OP|CL^4(~MD>FXJ^cQ1;uPIYc0OY14q7{jra?y}F~7;g->x6@I()r3Hm4exjJ
zg!gB4LUJSJy}rrheyJ9<-K_MCW4WlebjxWpZ4KKFkmBAgR-}A2kb!C>QuSh4Kf{)4
zU`SBPQuKLs>N)B8$m2_Ytlyt-7>IPoQB>~9P_wD|F4TXt6JzotJ&X?BJfV-L096Nn
z=AN#Vy55*u<srAOIE|8P5+2fizRYg;(xljaG$pgQrY7<2?K$_E4+73g*QCJ$8hjgq
z4^7<(kztgW_|%?1=ei`M{|&D{mw5nkc<I#bEZXXTL=aa;OUvTL(B#ck3<Ff&y5?{J
zEn-T7imf-?3a|l4thPA7`Eu<Q4=$j1;qk*8U;br1lbqt^%A@J5oE8;;!2?zmHhBK)
zyRB;|4n@LQs|sH!>E_$?#KH}!Hu+yB-7Gwaw2AwtpqWIcQQu^#f$uUPM(8+rD?~cl
z*OCNvl=*&$B!v|bknf_cAuF1%<%D=fcmWn#KejQN8l_o4?!VD21f?CRtL}PN_7*sb
zK`~2~EL#h47sD<Y4(M)#)6zNd<e8g|ke$$Q%)i{M{msN4Ak#3C;ftP<-t4h^z#&6K
z4{B}dw~RdS39A&}Sx<wAk{rHGQH6aF)o+=u>{RUoBm$Cd<|gbkyCWb=9n;G!lu>Y~
z#Sy**8)aqySRbvW--=7Ah^7nRAaTDQ8+`{s9F*(DhW0@~^u=r&KlCyHGpS9ERgqfY
zXQ1+vmPv5%<jK9mq!`m!2`08S$7fr-fuQ+J7HfIR1w+7|XJb*11VO}J`)l2SZmnRW
z4w`jWSHK~yADrEv6jun(lO!4Dpa3LOR#*RUJ=2!I<tQ<3R9p`@sQ{g>_+kb71b7L^
zjRX2HE5^Ip-En1~|7N8R1YgW^?2mFmNmsB%-WX{N>~<ZV^FM7z*PD?bV&iD29(V)w
zzSae9Rhq+=)yig3?M=KGL^PN(Tn}3&tMVYaU;5(TfH=>pp-jT}^5z&=PPvF>ws$T)
z<dD+%v;wuqYISsakCjiF2k>hW@CG$EFkeB~W~JhGCSR)61$-!pAgvECVdjOfT^Ge3
z7?~sj8ib-m;W4y6yr<)o76&yG^3&0@)R^g`f4_iNxRsH#@v<z&39nm+ZZiQ(HyF#?
zn{lbDtH#uu#8cA1+G7nsSK_NIAhv=Q!#r4Qk8YSQ2~P=T+YSIAWS>y+iVr@;f8Hjh
zRT`UDHJ?p*TlZ=nc<C76HDJAX3=8wJ__F+cO`0dNK_EKxUGy-M?F6`54*GQ_uv|O1
z%-h5$SJ`bH5H43#d6Go7Sb^{w78&w@@GgfgUt~eE7?Z%hIK_G1iRuCs>n`?v4~sGF
z){o>*8Mu6`)sjnPEUOvG8SJk&uE-dUc@wjyjIWzCTfC``M$c#dK>r0+`+)pCAKr^e
z_Pm$=W)q6>(P{ac31aj!SL+=1ZVP)=YJA4inanEJ$^_<weKm&4h}39R--JG2SaO!C
zh~=8Hs9L?GDAQvtM~h2*TM8sZ?&~?0z{ecl$#_ZB9E-=ey7;J}hzAz!VR-w%bJM%Z
zC)XB4!&{R<DR`-p-@p<%WV?~!eQnhj#lG-tX5(b#GbZU%TY5kq)PiMI4)iJGj4x$<
z_wbxlg0CRJG~#5^9BD?r<#{N<u9+P^dEc{=oi-E=E>XY0K4(1V8B=AiEZYH)Yyf{Z
zUFv%7e4c^#T9?u|NjHTICDdJatkz(DCz^W3M#cuD7r@`+3hH=@cES&EwF0jCoHP6Z
z0IzgRk~D_Ca5M(1WjBM8^3$@D5DQ6pNc{{aC<0R0?c>T~)KHe9=$je)mKQ4@A{!Lr
zlYnPJjy{u(NbrJ1f0QE98l8nPwHLM0QWg)E`Sz-B;AW#m6yk_zI4KNX)Vn|RtE9DU
z@f2?I)jvevbCX3HZZ-nwf4rp|Aeba3QW&h^S{-Nl<G*2Cd&n+E2kT6g*@9(O&%5-h
z^7vd^mB1WpF@g_8t4p>Y4~P^9YHuZc^L**`WT>$v`+yIL>lc3X*$7Uw%ylaC;~8~B
zf77JaY{s(s)=H=&5o_2-cnpjtK}O`tk{kM%mgM+LiSSRuNu!zbnJ6T>3r4`TiLdU#
zZ0x$O_D9R<zE%)M+dN!9<~8DzD<gdW3))@Fj&%Z{ZeW}vJJhsMNyac(*Ui`$-V!>1
zj!h~ts?{sPzDtb?M;S6fL(JZ}n)Y&kC3Tftj(e6hCOMzk!fIS%@g|maS+ys}%^iYL
zUMD9K{B@fYBw4V}?;2Vx2qO6jW8!f5074b0=Cba2QS%9|t+sj<+RoaNJg)$Ofs)vj
zQ!@wvJTlZM<DA4d8CHl$E;AURcyftKPQC1&-&)#|UXtF~+Ht+V9`2Is?UooLU#;<+
z8!H-02>x^fh`{La+&wez_P?sy^DH|B4m520hb>Q_nAg{QN0}gn3c2L+QGlL*+8TEN
z-GGQL%SI!VKu1yP;5P5>@Unc1jQuxzje#jaBv-WU@fcvWCDbF&OC8T4;&kFPOK*rT
zUgZ{jn<Fs?hiAn5%lab}_d=fa`NQkOvwN?~^5>O$n4o~Bsm#XAE;Cu`7MqHL_Q1Fx
z(jW>cRVXg+7DETU)TEu0>K}`vr<v2M)SPxIUGwrYo)pZqc(aC;gP^Wutr5zt!lUaU
z3)?q_>Nn}$BkPAl49E0WW$Mv!TjP)KG?slvfS}mX-prd6TSYRiFD}B_;#QV`W68W%
z-BVf9q=w3uAe#e6MEtYNc!UyE_$Ana_F;F`X+4rx9`~N6U@W|IQ89k4J89d(*p18%
z6|+D1ma&{J?)GO>4Q_#DD=Cm>gDb-6aA}mb?e2ZrkgFfWulcG;=SBS{e<t7E@Yy8~
zevf3_)%xKu@IAllSxwWxs7^D*)E5dkGWk|Gli9qAtsvSrlVf`<n+|W>RL?|R+b;g|
z{~(jZYzC<g4BGXzQ-C5Vk6p4D(w_6jt_@{7^h|wIZc5!`<HIR+C*S)OiDTrZ%;M(f
zgBC{`J!lG@3$N75=|G;6e>!eC{bJ`?<71%>ZDW_DFx~_1LpouFW<tMo6H_C$ZBZ(|
zeHZv{%ghTf?QZX0veYQF+N35Yba8no*#qzdasBze3aOnV=cX0c__Ns6E7H<GrpTWS
zx4cxrKCXN6lCh7Bg9ufCR<t#!QeSU#N1W*bfBu2(owr2<@=Lzj;<-pV7fwqpkRi=_
zUv<ha=Z4$q(A&n{^))Tzn$P9|%8esZw04&5H9?yG(EOJeX&t36=8eN2o8E7irPYPK
z^6xiNnf06#>;)I@+7oy6&6~-SH@QBQ6yv;N<Gm89%XU16RFJ!!?_Kiqh_ofs)hUd3
z1#Ni5kz!Rn`1#Z5!LJEbs#zTm+|>PIMwmk#5K!?!wr_s+YUf{rV1*%_*(-^gbsMR$
zR#}N2Fn?L7!vE{~3w(}wgg(=*N<Gt8m8?_*U!?E)37X+?ai-HW+)>G-Y;toYldF!Y
z(?ca|5U%WrNV?$eKL#&l?19Co-&~37bBdp1A!>zsQ+}g8HM*v#iA+61rA_NlyB@@;
z8u~oS{&m|Y!RrUIl6I~#$qVh??LMkhmjO1a{p38l>efz9W}1RmI=nnPk;r!D?dN?>
z{Z+M6cZ70)xH-1_i`KSA?rfD=MtB-rZ?TRLNLD_o%SirI)4C9}clgg3@5i~l{>Ppx
z#&df=H>@J}G+5?+KUu%Kp25<c9n}ATeS%=J7CFPQyR&U;!0x?09We5!&1ct#*5Ik|
z$o*meg3AYVKZ90y;ZM&Ge;>nn!()`coyp@JvSRH=)8u0F5^vf<GI8+J^p(0f)DvU%
z{x+tj%IxsKd#Pdr+&$^y1X(_n&pi`4Mb7pLPo*Uw2;F6M>BJ>_Jmq`ygEh=kz{osf
zIYW7bL$2`khC-Z(laB4ym7NO}w3XdY?Af|{E7n8p&r1~es=u_F%MNlJZ~um7h60}6
zE#{9YFVmP}84WJN9(^Pwy&PKPrrF|mQ~BwyxhGODEOEX^27DS)83?2&J5q>^p;4y(
zGR%eJztZ>${t#~K)u~t7^^Uj$hdr>><3PKbz~1>+kk;c%<lgNcTfVF<O)vXIHn6`O
zOWCKJBCGW-@l=KGTUn})S7BG58u83>W8|sj*nV<YzbhNzC$9;T)^`K>r+KDyLJ7xW
zlV-xXII1qr=ndF7Es9{LB$XlJfn_5dR4Dk)t3C@n28oDeC9;npSC7^IhbdX9IR~Oa
zHd6SWTeWyoEbsNCwqZV2tzrg(raSCvg=+6ff89$)CC7Pz`TnE*l9=1J#&d9To-4D}
zTmJ`eeJ}<h5m|fE<Hcsw2h5%3tFe`m7a-z2Hxm|(E)x>5aFim>^Ab*bKt53w<r>ew
zV$(wjz+EKXxPR8(T%4!7#tg)%I;4|gJXWQP0@2kw0?(@-P%UvjTDztX=eOpG{WlAR
zFt-_uf5KljNb4~%^6o}4%8AAsk%(lMcNT9PVu+Ta+^&QNz|xmDLy&lvlcaR=Of0L@
zWvNM2Fn9D51DVTDj<Iet!5+jBE>KK&I29mw00~Y*>L)7LFzWC!CiDF4zTGD-m++h{
zq!KPrlPEqW`MrwL9YG4KXch%2;6#@!6l3?Z_o>UN@{66FXTl8;Ot$&#+wsi1o2f^S
z@@-tCW@D6AWP`qs&44tO1d9pm1`^%OouY+3OvWXJn1Cpq2!{=2h)ryqUiAyv>?;#W
z%B)-Jz?NTZGnCocTo)j1E4WMRTSR3_fK-!}?Xe;cbc3Smqn9TYL0qdW#C?kdrJm<n
z*I}+{pXj%%cRw&p^T!Ds*p3gW@2=~Xf1Rybt6mv|<{1$+{s;@~TlU)K%X9Sru{)|3
z=0?*g+e+Y5Id@JxnHX8Ja(XmWul%8TLE1dk38^p`r1kTPaUDEs;Of?2%u`RfV^y8>
z3jsnEI7yB4W49w#Z$6eVhT+VB8dJIX6#h;#yH8AB5jH?RNnl;pD08D;MIR%8-Sodv
z-#$dm9^r`Wc1mWa$&Ho4*RWQvQZy8fMFQk0K?~NJV8AQ;;|xz={eejl!$2Bg{S<At
zp4CDiEoQ`W#>cIW;O>5h+!*V)ETk`tO@Koks>S9RW$A>pXu5$BJP~(p|CqVo!S!i9
z+-dXUZ(Fuia9iO^3wgtTUR-J#i}udNkSNO-2Dol#<Dj;91&Js|dMS$Yta}?rz_@Mw
zARA9_bXo`ch@7zWT_j>qEbk_a#8O|2*tl|Xi}8TKuNTA*@uXG|NkPQysn6Xx*Fr4b
zP~X+4s-eiFhaocGfG&ez6Y6H%;pvTK1?TfQW-Ti^Fmr5DmFNBqN03B?gFUJ60(1(f
zD`$<F=VGn26}n<s=gl0)QNeT|YgT(qG0F<e)M^f;pjRYaT0kr$Ub%cWfewxUySu}K
z0P-C|S>W4ig%oyzw0;zuO~U0xtKQ`YGg|cO()ve#v{iT3=E!3Q7)Kvx+44h>VtSwr
zj#C-z;Q@KeTgR?QLZn)x6nyPuE1ys71q%Ae>ItV=kmM_MA;5Wb$R{h$rioKqjAw}D
z+|tKt-k!&12O+4SWB9EPvv@3PM~>3CU}pK~fI%EUQXNv41j03*O=Y4?7u|qB=_`k`
zM*+DnPxy&hjd!`&0O8Se0~snvRU06n0CDeYCNaxh=-3_dVM)wYV8N^s`SFZM2-t;I
zlK31FK-(AmcsnE`7+@ojXIB{a1{#s9E10JSqphos2*_D2Qe!JR1ndad^4Wsl6i#@(
zFX$t{ESDJ`+xt$P#^YN^gm2=Vg|azq<z@iumY1LTCVza5Vq6bWdIHce{;yJR2r}zD
zwHO{91-5&5kyYtwHg+~2NX-z?7L8`07|VqW<xC&-#wJ^=UUzHXIROAdN7t#v+2}a$
zT>l$|HYXKM&$h&@=F@?AL_G)}mK^9oGB%8h>5Nk{Z|B}y$+M4H7H{siBsjKw0cjBJ
zgw4dvh=$OrJKj;isZUNF8kQjCMhB{mbsUzlKdAr?)Z1(|^<hv#m#0a^2PTmH3`pTW
zB!yG~In)xqIbfyYV$4ZYhn@lr`>VpFKkv72nu4&ZaPp9~8Aea~>z%RFAiAl3<$u~n
z78{aOjlC|d|F=a1d;O5HFBiqgkG~WmvwEwNkRH}g$nA=e?L)`9V`B?s_jc~A{uA)=
zD$zkAlJMj=SgWhT{jcJ91Sd_g1qDEmKse5pocc(Fye)7J+AT-}8E0gJywk+$Y4R`r
zrYisure&)KRYvED@qkd>;!RRKc{bC86yQ*a^b+C+{TYA*HQ*Y^35fAbW>y`poV0jT
zt7l7YZC;{YgP^0YwSz*CHY*rO5Uu=3@4JkroG~4Ljgk+MC;u|VK~Uq}!^4`ICZF_d
z>s@$1xsP3y4_qT7sQZ6Uoj^LozKf0Y?hi62C-)I@eKq)>FaZrZ`an?P)cd@>BE?~u
z=aDT9R8Y%@KgJ;BegrO%oD-H^&rxEH1UL2Uk84JkF@~;{;vVN!9}U%(Y<>fERxs+R
zFKCFzsJhrJVFd<|(~e^xRs}2!kuI%l<~W?p&S?Am;NV_NwRT~9eyu%q5NA8yX)Rlt
z<yKuFD)PqhOs}EL=W1+!ff5ASls%`uxmGB0)sV8?J~$Tw;r#uh=cb!g3VNpx2hy$v
zhY~zPC8}(JqJ+sEvWTu(x%~5D*0xlJ$auUnZnG9Ahr4ra*Mk8#EPM4HJKjY-CGOwy
zL6S_D4jZP<(6*=ilW;B5e!eO@hj7<#s2q5Cf{J^qbflf(_kJ`Nzu7#`BU5qyIO$Sf
znr?uX=z!CDy+z843Hm*u)d+b_2Yz(lWLhirO9v(Ogi|`7TtQv^_kzwVK3u^SsWdcO
zLRv{{MH@aQZGuLQTK}5;{^R+L>W%3@>&&eknnJ%oxnaa+^2qr={`UpvG3?@KyY7Ff
zo)zG8m)-o(9LV)8dE!K`gX({>6T?sAJM`7o&KlC~E_19-SVGRun`>JIG~V4gC8i!b
z*+na*W4}e9|J;ltxKL{8yZz2$`-)<J&8|9>t?<3NXu>l~u-D-_f0#OGK>*jHMhp+G
zMewf2O7`Hm<q^(Rruw-eSN}&w3d;gIo#^MS%}*BY{>N2mZ8kT*ooXAkyd}WI_Z4wU
zMcBwdVe?jbPqY%R4hTK}zB+i!VHdO-%0V+FJp1=&e&0Tti^}4t!PtW5Ww;+f_=5~*
z%?rXKDS6$DkBy`MF?u_?7L1Bl+{*a4I?C*I{WoniXFV7NU@POJ@YqQ&5bnSnK136}
zbLXx}RmF>$#!ifC(m`jgC+#Pr_fKb5c~$lSWMsr28^W-+)qFvP{OG`f7X4L>ZSP{4
zlJuUatkpDaVp$zD3-jZ}e4_4*=l*6fjXDA9EPLr7e%?6sG3(#M^HD}}gtrysDa$Ct
zg1r}i3Q#=wA}cfBF_ft(dF23%qCjlO@I%lN0v0kK_e}0&OkB)JMCH-h@$Yc4&|(27
z#)1auM#!YTt5?wxNbg;#Pp$76$aG;*hb`U<xkJjr#<N*k$&%F|bJegRS{qKJmHd~t
z(&-Ou6?$$qz96h#8;S%0*JZV&{k+l3<vD!bCgaT8ih7R2r-8M;2?UgdY;TS02SzV@
zt@iA4^nZ`s*2rHEfR+GQxD{w@4bQq$n6gt;^H#WudydM)f_1lw_c`kKhjr0Y-<t;2
z#@jRh3-w-B2~QDhq^F4nu5Hxx&Q#nuxji^PuNp{Oq;mIiZ`m!o<+O?!`VoNr&$)Xz
zP_gnXkbceG{|h3!?~)ETz5odm^ZQ=%)aqHDq}B@?iq0aSGgq?re-4jG(92kUu@R{9
zL_d+XrHfp-k~KfEyv53nySPhzw)1U@T76S$0~W@a4BdVF=tbG={`i-dPEif%c1Fdh
zshqgcL0bI#X@r~0cBo%uTYSl_%C?^NpXmStox8lm#OH2LJ<;n#)fiGa7PMHXynoyM
zjS8VK!pL?vwSK2@WBsf1tz@qxm*gdW<1APbgV(?$B>RD&Ej*Ll2;SBL#@d!JCnS3v
z-+oIKdRh1O=@Y$&WpY9JC15^{hKPvXA4*7B+&uI$*YwvD2T+oL@n>By*TH9_ACUC4
zE9J)8T;ATfvSu)tmhWVs$KO3obs~j-nh9nvxkT7&FRBZ>e(-{+n81OA&`ExEkxUdL
z+<Yf|cOPB3IKEZ`6yRG^8TeoZYn?3g4knL%@EAO0nS-7kfb1c0dnUSasfAjPTQhQs
zqHs47wZJV1Qj9t{2-gCiIB>&5pUypnwxUks#=Oh&K%#YQ`6*F^IVbX$LH;B2c`<-|
z6#Pz7H8pc&ew`}8)`p_wL2FT2Fi`}Vv5FZ>$^Rb93cL%E!`JN3dq_kd;S-#Mh7Pa^
zQoWe-V_DBgik}DNd+6YL;H-unC<vwJw~ds5(;vJ-V{$;3*h_zPiq$vLZQBQ3b}jQJ
zjte~p$=mS0)rrxI0DG#`9xuLS8Ld*?>#MQqYqpBJwz?0p3OVNr2}CLR0q`e!r)m%U
zaa`gfZV6oiO%UxQcP%pTL~=UQj5CzF=sVo8*;vZz=%z3h9GYpS4dRh#y6e(gSwjV3
z+0_$<O2Pmnz)-aq{X9tx1-i~a2ZCSAB{R|)K>jBhkY6c{4rFU)V6)9XQke&`^iVO|
zrmR&H=Q#inqs%_uY&0P#?sdGSX2~K}B}Gf)fAx+ngM4a8A6yxMd?Qj=?_R--hq&0a
zf!;THQt}?^4!PSL@Tf)w`-oH?7YL*PcV`AvbiJTc5`A7CFJ=JRRCt%Ip>~b9*-Vu5
zG(fg{0S29=_51Fg<G+OT8?oVgu>;o+=^=5Uhjp(MTnQF$w8$tpZ*S%2EuH2^N{nSy
zI<2?{AC(~-;22~r(ATN`v_m46u&H~XQ5+7)w5z0ss+G7eRM%b<U3iyo1z+&IP8T}M
ziO#YfhA%gM_dtM)c5&Gh@(@Znki$Z{XQBfI#7<Q}j+%0kn4jm3TmOz^=`U1kr1#s2
zAmgIWOTygkFG>cKVmqR*F5T)3FG<UHfZ2yq?C4%013<$@rmbJW8Nj;C7($TJVp)sJ
z@||D`a;FVlm<H>SYld<9<!vAU?y#XVLotGQ{kZWM{4J1Vqkl($#2(kFefx0_0cU_1
zoJHyM_W6b8yTcsN9p-ebLf!{bod`!N#^G=N_s_489$caYQ}a4)?%x5{$-d;j%dfn?
zwk4u^YO_aujL$ZHz}*(n;x1sz3kAg67eH;C7gdfZ#{8VFu}}=z&U-hoGdbkl)Frjk
z5pLtFCxrr0fl<V_149z&uCD`WlNZJ&=Ie3Xve)Tp3O@#m6TYNQ9|GNQaj*ZPzkr_H
z_8n5$w;ocmjvZ1tp4qF^KDl}jy#0~+`>pfPJR7cS5V`ysPmlr)ht8V!8Jy!fDxVKh
zxf?#?cz(7EBWTBgdA(d+W&qt`PEO_6o(R7pj8mefjz3D8;PG$ZfI2P~93dKCoe-v{
zHJ5`nLZYvUctB}TTLH)uSUUjH!IOY>8G4VkamMnEQ-QcizI6`fdiLp40K`>H7w`zU
z*KEUSts1TS3}>SHD#wVHtRm)&yN*6_Y}?T)hJwJFOQ1Z!yU9utad2WMkD2FPY=5<A
zmkN44W8^Px;1#WytHc8WueCqe4W_LpZ7tnRrH!l>{Q@0}0Zy;0>5pnGOJHtm8&AVW
z9hX)Oj(S-X_wS=F(|8VW{$A$g86%6;HJO}0s!H-p+!;YXDnEF>eHYIOYSVjZ557xW
z#CJlsjNQ%~TZ*&732N{h)G3IJi;3O4rni1b1Za{#=1=0}{k<Fq#mxk&5Q^mzT_};r
zK{7x_F?K9N5m?<Rx0C;Q+25V&0js!Udwg#dA^t2wbwXc&X2l=bOLd$#kqR)5)&;ot
z+P6a3JDi`Yg2quMpa>2s9D5oARMPXZ%zbJ7EZa<2p^KGkxrsK>W`CDbfZA7d_|qv#
zY=C;5m~kRp2C4~VXC2aHE~(XfD+3CwX&eYo3r<jJ{wLCR%07bd)c^B=^w;^At$9$f
zCjx5&aYcohl8B(uYtQ~nOp+k3m}1ZY0a{Vv>KWDkqHMrZ<U0Gm3|)Y}&^}8N)p1NN
zScVZI#!XTn1HxrsHvg;fB>v)z5c#*6^-RT%f&L~Cl<ieU#_jtd<r7mIDW5HL+uU^Q
zKt@@>`$B*YDkVj-`jWVMf@C!?tg49$0R<Y(yKrF~Qp|pf=q|iQJwFD3;W_m@reaym
zUm&Fh5*+l2z=!-#7yAFS<NyEjUkq9|25Gw-T1e{K%x@jK;PykBYB#PGUbTAszW_te
BpThtE

literal 0
HcmV?d00001


From b9dcd702ec4102d08c1047f72821488e8f0f7fb2 Mon Sep 17 00:00:00 2001
From: Liu Zengzeng <liuzengzeng@cmhi.chinamobile.com>
Date: Tue, 27 Jun 2017 10:33:56 +0800
Subject: [PATCH 296/332] srp homework

---
 .../2816977791/ood/ood-assignment/pom.xml     |  32 +++++
 .../com/coderising/ood/srp/Configuration.java |  23 +++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ++++
 .../java/com/coderising/ood/srp/FileUtil.java |  28 ++++
 .../com/coderising/ood/srp/MailService.java   |  44 ++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  14 ++
 .../com/coderising/ood/srp/PromotionMail.java | 131 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 9 files changed, 310 insertions(+)
 create mode 100644 students/2816977791/ood/ood-assignment/pom.xml
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
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<String,String> 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..eeb6d38d46
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.srp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * @author nvarchar
+ *         date 2017/6/26
+ */
+public class FileUtil {
+
+    protected static String[] readFile(File file) throws IOException // @02C
+    {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(file));
+            String temp = br.readLine();
+            return temp.split(" ");
+
+        } 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/MailService.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java
new file mode 100644
index 0000000000..36195d18ff
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailService.java
@@ -0,0 +1,44 @@
+package com.coderising.ood.srp;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 发送邮件
+ *
+ * @author nvarchar
+ *         date 2017/6/26
+ */
+public class MailService {
+    protected static void sendEMails(boolean debug, List mailingList, PromotionMail promotionMail) throws IOException {
+
+        System.out.println("开始发送邮件");
+
+        if (mailingList != null) {
+            Iterator iter = mailingList.iterator();
+            while (iter.hasNext()) {
+                promotionMail.configureEMail((HashMap) iter.next());
+                try {
+                    if (promotionMail.hasValidToAddress())
+                        MailUtil.sendEmail(promotionMail, debug);
+                } catch (Exception e) {
+
+                    try {
+                        MailUtil.sendEmail(promotionMail, debug);
+
+                    } catch (Exception e2) {
+                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
+                    }
+                }
+            }
+
+
+        } else {
+            System.out.println("没有邮件发送");
+
+        }
+
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..16866bf3f7
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.srp;
+
+public class MailUtil {
+
+    public static void sendEmail(PromotionMail promotionMail, boolean debug) {
+        //假装发了一封邮件
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("From:").append(promotionMail.fromAddress).append("\n");
+        buffer.append("To:").append(promotionMail.toAddress).append("\n");
+        buffer.append("Subject:").append(promotionMail.subject).append("\n");
+        buffer.append("Content:").append(promotionMail.message).append("\n");
+        System.out.println(buffer.toString());
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..ea151ddfc9
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/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.HashMap;
+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("/Users/nvarchar/Documents/github/coding2017-2/" +
+                "students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+        boolean emailDebug = false;
+
+        PromotionMail pe = new PromotionMail(f);
+
+        MailService.sendEMails(emailDebug, pe.loadMailingList(), pe);
+    }
+
+
+    public PromotionMail(File file) throws Exception {
+
+        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+        String[] data = FileUtil.readFile(file);
+
+        setProductID(data[0]);
+        setProductDesc(data[1]);
+
+        config = new Configuration();
+
+        setSMTPHost();
+
+        setAltSMTPHost();
+
+        setFromAddress();
+
+        setLoadQuery();
+
+    }
+
+
+    protected void setProductID(String productID) {
+        this.productID = productID;
+        System.out.println("产品ID = " + productID + "\n");
+    }
+
+    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 + " 降价了，欢迎购买!";
+
+    }
+
+    private void setProductDesc(String desc) {
+        this.productDesc = desc;
+        System.out.println("产品描述 = " + productDesc + "\n");
+    }
+
+
+    public void configureEMail(HashMap userInfo) throws IOException {
+        toAddress = (String) userInfo.get(EMAIL_KEY);
+        if (toAddress.length() > 0)
+            setMessage(userInfo);
+    }
+
+    protected boolean hasValidToAddress() {
+        if (toAddress.length() > 0) {
+            return true;
+        }
+        return false;
+    }
+
+    protected List loadMailingList() throws Exception {
+        return DBUtil.query(this.sendMailQuery);
+    }
+
+
+}
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

From 46f1749369fc1ec2342319c2325f0598b39c77a3 Mon Sep 17 00:00:00 2001
From: ThomsonTang <guiketang@gmail.com>
Date: Tue, 27 Jun 2017 23:49:47 +0800
Subject: [PATCH 297/332] read the file and resolve a line to a product.

---
 .../com/coderising/ood/srp/EmailMessage.java  | 36 ++++++++++----
 .../ood/srp/ProductFileServiceImpl.java       | 47 +++++++++++++++++++
 .../coderising/ood/srp/ProductService.java    | 13 +++++
 3 files changed, 88 insertions(+), 8 deletions(-)
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java

diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
index 48d90a624f..1872552c29 100644
--- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
@@ -1,21 +1,41 @@
 package com.coderising.ood.srp;
 
 /**
- * the email message content will be sent to user.
+ * the email message entity class.
  *
  * @author Thomson Tang
  * @version Created: 23/06/2017.
  */
 public class EmailMessage {
+    private String fromAddress;
+    private String toAddress;
     private String subject;
-    private String message;
+    private String content;
 
     public EmailMessage() {
     }
 
-    public EmailMessage(String subject, String message) {
+    public EmailMessage(String fromAddress, String toAddress, String subject, String content) {
+        this.fromAddress = fromAddress;
+        this.toAddress = toAddress;
         this.subject = subject;
-        this.message = message;
+        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() {
@@ -26,11 +46,11 @@ public void setSubject(String subject) {
         this.subject = subject;
     }
 
-    public String getMessage() {
-        return message;
+    public String getContent() {
+        return content;
     }
 
-    public void setMessage(String message) {
-        this.message = message;
+    public void setContent(String content) {
+        this.content = content;
     }
 }
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java
new file mode 100644
index 0000000000..024afaf705
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java
@@ -0,0 +1,47 @@
+package com.coderising.ood.srp;
+
+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<Product> listProduct() throws Exception {
+        List<Product> products = new ArrayList<>();
+        Path path = Paths.get(getClass().getResource(fileName).toURI());
+        Stream<String> lines = Files.lines(path);
+        lines.forEach(line -> products.add(resolveProduct(line)));
+        return products;
+    }
+
+    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/coderising/ood/srp/ProductService.java b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
new file mode 100644
index 0000000000..2cfce64b10
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
@@ -0,0 +1,13 @@
+package com.coderising.ood.srp;
+
+import java.util.List;
+
+/**
+ * the business service of product.
+ *
+ * @author Thomson Tang
+ * @version Created: 23/06/2017.
+ */
+public interface ProductService {
+    List<Product> listProduct() throws Exception;
+}

From 8bfc3ed12371413e9c6398e0e325d55cc362e374 Mon Sep 17 00:00:00 2001
From: ThomsonTang <guiketang@gmail.com>
Date: Tue, 27 Jun 2017 23:53:41 +0800
Subject: [PATCH 298/332] add a resource directory.

---
 .../com/coderising/ood/srp/product_promotion.txt                  | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename students/395135865/ood/ood-assignment/src/main/{java => resources}/com/coderising/ood/srp/product_promotion.txt (100%)

diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt
similarity index 100%
rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/395135865/ood/ood-assignment/src/main/resources/com/coderising/ood/srp/product_promotion.txt

From 7bd719e13359d33e680e29d0bfb4a30de48db4aa Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Wed, 28 Jun 2017 00:42:46 +0800
Subject: [PATCH 299/332] =?UTF-8?q?=E8=B4=AD=E7=89=A9=E7=BD=91=E7=AB=99?=
 =?UTF-8?q?=E7=94=A8=E4=BE=8B=E5=9B=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...31\347\224\250\344\276\213\345\233\276.png" | Bin 0 -> 216240 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 "students/812350401/src/main/java/com/coderising/ood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png"

diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/ood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png"
new file mode 100644
index 0000000000000000000000000000000000000000..46addc04089fc81cb0a967f5118884f08c5c1dfb
GIT binary patch
literal 216240
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
GUjIMxw7RVT

literal 0
HcmV?d00001


From f4f6ef8f36a12f724cb0dbaaebfaf1c7fc53a350 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Wed, 28 Jun 2017 00:52:46 +0800
Subject: [PATCH 300/332] =?UTF-8?q?=E6=94=BE=E5=A4=A7=E7=B1=BB=E5=9B=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...0\345\255\220\347\261\273\345\233\276.png" | Bin 102615 -> 285103 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"
index 4973c14277ba5c597fc3c8ce49914e5660595602..587726bd6182f3d7d9c983eb94876e6a78180bda 100644
GIT binary patch
literal 285103
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%0AK
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
F{}0NquJix^

literal 102615
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
N`T0_Os`o|z{4Z`k3Hbm3


From adea855d8e3203bd81ea3f7e1c823474fd3f146b Mon Sep 17 00:00:00 2001
From: Liu Zengzeng <liuzengzeng@cmhi.chinamobile.com>
Date: Wed, 28 Jun 2017 14:07:02 +0800
Subject: [PATCH 301/332] ocp homework

---
 .../java/com/coderising/ood/ocp/DateUtil.java | 10 +++++++++
 .../com/coderising/ood/ocp/LogMsgConvert.java |  9 ++++++++
 .../java/com/coderising/ood/ocp/Logger.java   | 22 +++++++++++++++++++
 .../com/coderising/ood/ocp/MailSender.java    | 12 ++++++++++
 .../java/com/coderising/ood/ocp/MailUtil.java | 10 +++++++++
 .../com/coderising/ood/ocp/PrintSender.java   | 12 ++++++++++
 .../java/com/coderising/ood/ocp/RawLog.java   | 14 ++++++++++++
 .../com/coderising/ood/ocp/RawLogFactory.java | 17 ++++++++++++++
 .../coderising/ood/ocp/RawLogWtihDate.java    | 15 +++++++++++++
 .../com/coderising/ood/ocp/SMSSender.java     | 12 ++++++++++
 .../java/com/coderising/ood/ocp/SMSUtil.java  | 10 +++++++++
 .../java/com/coderising/ood/ocp/Sender.java   |  9 ++++++++
 .../com/coderising/ood/ocp/SenderFactory.java | 19 ++++++++++++++++
 13 files changed, 171 insertions(+)
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/LogMsgConvert.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailSender.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/PrintSender.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLog.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogFactory.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/RawLogWtihDate.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSSender.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Sender.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SenderFactory.java

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;
+    }
+}

From 171e3488e63d5b48c22639e0a450ab6243b3ae4f Mon Sep 17 00:00:00 2001
From: MIMIEYES <haolllllllll@qq.com>
Date: Wed, 28 Jun 2017 16:36:35 +0800
Subject: [PATCH 302/332] =?UTF-8?q?UML=E4=BD=9C=E4=B8=9A(dice=20game=20/?=
 =?UTF-8?q?=20shopping)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/402246209/learning/pom.xml           |  20 +++-----
 .../java/com/mimieye/odd/uml/dice/Dice.java   |  37 ++++++++++++++
 .../com/mimieye/odd/uml/dice/DiceGame.java    |  25 ++++++++++
 .../java/com/mimieye/odd/uml/dice/Player.java |  47 ++++++++++++++++++
 .../com/mimieye/odd/uml/dice/diceClass.jpg    | Bin 0 -> 63872 bytes
 .../com/mimieye/odd/uml/dice/diceSequence.jpg | Bin 0 -> 35679 bytes
 .../odd/uml/shopping/shoppingUseCase.jpg      | Bin 0 -> 45811 bytes
 7 files changed, 117 insertions(+), 12 deletions(-)
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Dice.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/DiceGame.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/Player.java
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceClass.jpg
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/dice/diceSequence.jpg
 create mode 100644 students/402246209/learning/src/main/java/com/mimieye/odd/uml/shopping/shoppingUseCase.jpg

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 @@
                 </configuration>
             </plugin>
 
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <version>2.6</version>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <mainClass>com.mimieye.odd.srp.main.PromotionEmailMain</mainClass>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
         </plugins>
+
     </build>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+    </dependencies>
 
 
 </project>
\ 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 0000000000000000000000000000000000000000..845c31c1caab3448de599c3ffc5298febc65f5a5
GIT binary patch
literal 63872
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

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..168baadc21ead4f80185cc1a029a54387109affb
GIT binary patch
literal 35679
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

literal 0
HcmV?d00001

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 0000000000000000000000000000000000000000..33e6ac55ae6a6b713da34b1bc975ed2074e517fc
GIT binary patch
literal 45811
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
H`#SVL2E8LY

literal 0
HcmV?d00001


From a0496c3be5e8a6e1468cf23c6923e6d5f94a99b8 Mon Sep 17 00:00:00 2001
From: Liu Zengzeng <liuzengzeng@cmhi.chinamobile.com>
Date: Thu, 29 Jun 2017 14:12:16 +0800
Subject: [PATCH 303/332] refactor srp

---
 .../java/com/coderising/ood/srp/FileUtil.java |  14 +-
 .../java/com/coderising/ood/srp/Mail.java     |  33 +++++
 .../com/coderising/ood/srp/MailService.java   |  58 ++++----
 .../java/com/coderising/ood/srp/MailUtil.java |  14 --
 .../java/com/coderising/ood/srp/Product.java  |  31 +++++
 .../coderising/ood/srp/ProductService.java    |  32 +++++
 .../com/coderising/ood/srp/PromotionMail.java | 131 ------------------
 .../com/coderising/ood/srp/PromotionMain.java |  39 ++++++
 .../java/com/coderising/ood/srp/User.java     |  27 ++++
 .../com/coderising/ood/srp/UserService.java   |  15 ++
 10 files changed, 208 insertions(+), 186 deletions(-)
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java
 delete mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
 delete mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMain.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/User.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java

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
index eeb6d38d46..eb8896e527 100644
--- 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
@@ -1,8 +1,6 @@
 package com.coderising.ood.srp;
 
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
 
 /**
@@ -13,16 +11,6 @@ public class FileUtil {
 
     protected static String[] readFile(File file) throws IOException // @02C
     {
-        BufferedReader br = null;
-        try {
-            br = new BufferedReader(new FileReader(file));
-            String temp = br.readLine();
-            return temp.split(" ");
-
-        } catch (IOException e) {
-            throw new IOException(e.getMessage());
-        } finally {
-            br.close();
-        }
+        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<Product> 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
index 36195d18ff..3e6788915d 100644
--- 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
@@ -1,10 +1,5 @@
 package com.coderising.ood.srp;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * 发送邮件
  *
@@ -12,33 +7,40 @@
  *         date 2017/6/26
  */
 public class MailService {
-    protected static void sendEMails(boolean debug, List mailingList, PromotionMail promotionMail) throws IOException {
-
-        System.out.println("开始发送邮件");
-
-        if (mailingList != null) {
-            Iterator iter = mailingList.iterator();
-            while (iter.hasNext()) {
-                promotionMail.configureEMail((HashMap) iter.next());
-                try {
-                    if (promotionMail.hasValidToAddress())
-                        MailUtil.sendEmail(promotionMail, debug);
-                } catch (Exception e) {
-
-                    try {
-                        MailUtil.sendEmail(promotionMail, debug);
+    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);
+    }
 
-                    } catch (Exception e2) {
-                        System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage());
-                    }
-                }
+    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());
             }
 
-
-        } else {
-            System.out.println("没有邮件发送");
-
         }
+    }
 
+    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/MailUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
deleted file mode 100644
index 16866bf3f7..0000000000
--- a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.coderising.ood.srp;
-
-public class MailUtil {
-
-    public static void sendEmail(PromotionMail promotionMail, boolean debug) {
-        //假装发了一封邮件
-        StringBuilder buffer = new StringBuilder();
-        buffer.append("From:").append(promotionMail.fromAddress).append("\n");
-        buffer.append("To:").append(promotionMail.toAddress).append("\n");
-        buffer.append("Subject:").append(promotionMail.subject).append("\n");
-        buffer.append("Content:").append(promotionMail.message).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<Product> getProductLists(String filePath) throws IOException {
+        List<Product> 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/PromotionMail.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index ea151ddfc9..0000000000
--- a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.coderising.ood.srp;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-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("/Users/nvarchar/Documents/github/coding2017-2/" +
-                "students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt");
-        boolean emailDebug = false;
-
-        PromotionMail pe = new PromotionMail(f);
-
-        MailService.sendEMails(emailDebug, pe.loadMailingList(), pe);
-    }
-
-
-    public PromotionMail(File file) throws Exception {
-
-        //读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
-        String[] data = FileUtil.readFile(file);
-
-        setProductID(data[0]);
-        setProductDesc(data[1]);
-
-        config = new Configuration();
-
-        setSMTPHost();
-
-        setAltSMTPHost();
-
-        setFromAddress();
-
-        setLoadQuery();
-
-    }
-
-
-    protected void setProductID(String productID) {
-        this.productID = productID;
-        System.out.println("产品ID = " + productID + "\n");
-    }
-
-    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 + " 降价了，欢迎购买!";
-
-    }
-
-    private void setProductDesc(String desc) {
-        this.productDesc = desc;
-        System.out.println("产品描述 = " + productDesc + "\n");
-    }
-
-
-    public void configureEMail(HashMap userInfo) throws IOException {
-        toAddress = (String) userInfo.get(EMAIL_KEY);
-        if (toAddress.length() > 0)
-            setMessage(userInfo);
-    }
-
-    protected boolean hasValidToAddress() {
-        if (toAddress.length() > 0) {
-            return true;
-        }
-        return false;
-    }
-
-    protected List loadMailingList() throws Exception {
-        return DBUtil.query(this.sendMailQuery);
-    }
-
-
-}
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<Product> productList = productService.getProductLists(filepath);
+
+        Set<User> users = new HashSet<>();
+        for (Product product : productList) {
+            List<User> 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<Product> products;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getEMailAddress() {
+        return emailAddress;
+    }
+
+    public List<Product> 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<User> getUsers(Product product){
+        //调用DAO相关的类从数据库中读取订阅产品的用户列表
+        return null;
+    }
+}

From 0ab140ff4026aed00b83f8e6feb32d967dba9c80 Mon Sep 17 00:00:00 2001
From: ThomsonTang <guiketang@gmail.com>
Date: Thu, 29 Jun 2017 23:56:24 +0800
Subject: [PATCH 304/332] refactor the promotion email project.

---
 .../coderising/ood/srp/Email.java}            |  8 ++--
 .../coderising/ood/srp/Product.java           |  2 +-
 .../coderising/ood/srp/UserInfo.java          | 15 +++++++-
 .../ood/srp/service/EmailService.java         | 13 +++++++
 .../ood/srp/service}/ProductService.java      |  4 +-
 .../ood/srp/service/UserService.java          | 15 ++++++++
 .../srp/service/impl/EmailServiceImpl.java    | 37 +++++++++++++++++++
 .../service/impl}/ProductFileServiceImpl.java |  5 ++-
 .../ood/srp/service/impl/UserServiceImpl.java | 26 +++++++++++++
 9 files changed, 117 insertions(+), 8 deletions(-)
 rename students/395135865/ood/ood-assignment/src/main/java/com/{coderising/ood/srp/EmailMessage.java => thomsom/coderising/ood/srp/Email.java} (84%)
 rename students/395135865/ood/ood-assignment/src/main/java/com/{ => thomsom}/coderising/ood/srp/Product.java (95%)
 rename students/395135865/ood/ood-assignment/src/main/java/com/{ => thomsom}/coderising/ood/srp/UserInfo.java (73%)
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java
 rename students/395135865/ood/ood-assignment/src/main/java/com/{coderising/ood/srp => thomsom/coderising/ood/srp/service}/ProductService.java (69%)
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/UserService.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java
 rename students/395135865/ood/ood-assignment/src/main/java/com/{coderising/ood/srp => thomsom/coderising/ood/srp/service/impl}/ProductFileServiceImpl.java (88%)
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/UserServiceImpl.java

diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java
similarity index 84%
rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java
index 1872552c29..7943a5581a 100644
--- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/EmailMessage.java
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Email.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.thomsom.coderising.ood.srp;
 
 /**
  * the email message entity class.
@@ -6,16 +6,16 @@
  * @author Thomson Tang
  * @version Created: 23/06/2017.
  */
-public class EmailMessage {
+public class Email {
     private String fromAddress;
     private String toAddress;
     private String subject;
     private String content;
 
-    public EmailMessage() {
+    public Email() {
     }
 
-    public EmailMessage(String fromAddress, String toAddress, String subject, String content) {
+    public Email(String fromAddress, String toAddress, String subject, String content) {
         this.fromAddress = fromAddress;
         this.toAddress = toAddress;
         this.subject = subject;
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java
similarity index 95%
rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java
index 471863d48e..9fca6b61db 100644
--- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/Product.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.thomsom.coderising.ood.srp;
 
 /**
  * Product entity class.
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java
similarity index 73%
rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java
index f680c0ecd8..bf653eb20d 100644
--- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfo.java
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/UserInfo.java
@@ -1,4 +1,7 @@
-package com.coderising.ood.srp;
+package com.thomsom.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * the user info entity class.
@@ -11,6 +14,8 @@ public class UserInfo {
     private String userName;
     private String email;
 
+    List<Product> products = new ArrayList<>();
+
     public UserInfo() {
     }
 
@@ -43,4 +48,12 @@ public String getEmail() {
     public void setEmail(String email) {
         this.email = email;
     }
+
+    public List<Product> getProducts() {
+        return products;
+    }
+
+    public void setProducts(List<Product> 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..c6211eb49f
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java
@@ -0,0 +1,13 @@
+package com.thomsom.coderising.ood.srp.service;
+
+import com.thomsom.coderising.ood.srp.Email;
+
+/**
+ *
+ *
+ * @author Thomson Tang
+ * @version Created: 29/06/2017.
+ */
+public interface EmailService {
+    Email newEmail() throws Exception;
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java
similarity index 69%
rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java
index 2cfce64b10..2d4b10e14f 100644
--- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/ProductService.java
@@ -1,4 +1,6 @@
-package com.coderising.ood.srp;
+package com.thomsom.coderising.ood.srp.service;
+
+import com.thomsom.coderising.ood.srp.Product;
 
 import java.util.List;
 
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<UserInfo> 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..4e5f1a90b4
--- /dev/null
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/EmailServiceImpl.java
@@ -0,0 +1,37 @@
+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.EmailService;
+import com.thomsom.coderising.ood.srp.service.UserService;
+
+import java.util.List;
+
+/**
+ * 类说明
+ *
+ * @author Thomson Tang
+ * @version Created: 29/06/2017.
+ */
+public class EmailServiceImpl implements EmailService {
+
+    private UserService userService;
+
+    @Override
+    public Email newEmail() throws Exception {
+        List<UserInfo> userInfoList = userService.listUser();
+        for (UserInfo userInfo : userInfoList) {
+            Email email = new Email();
+            email.setToAddress(userInfo.getEmail());
+            email.setSubject("您关注的产品降价了...");
+            email.setContent("");
+        }
+
+        return null;
+    }
+
+    private String generateContent(UserInfo userInfo, Product product) {
+        return String.format("尊敬的%s，您关注的产品%s降价了，欢迎购买！", userInfo.getUserName(), product.getProductName());
+    }
+}
diff --git a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java
similarity index 88%
rename from students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java
rename to students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java
index 024afaf705..f8625cb2ea 100644
--- a/students/395135865/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ProductFileServiceImpl.java
+++ b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/ProductFileServiceImpl.java
@@ -1,4 +1,7 @@
-package com.coderising.ood.srp;
+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;
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<UserInfo> listUser() throws Exception {
+        List<UserInfo> 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;
+    }
+}

From 2bc74afaa65159a2332859a1d08a253e3df8678b Mon Sep 17 00:00:00 2001
From: unknown <j00313496@CYA141213119-T.china.huawei.com>
Date: Sat, 1 Jul 2017 00:28:18 +0800
Subject: [PATCH 305/332] =?UTF-8?q?=E5=8D=95=E4=B8=80=E8=81=8C=E8=B4=A3?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/282692248/ood/ood-assignment/pom.xml |  32 +++
 .../java/com/coderising/ood/ocp/DateUtil.java |  10 +
 .../java/com/coderising/ood/ocp/Logger.java   |  38 ++++
 .../java/com/coderising/ood/ocp/MailUtil.java |  10 +
 .../java/com/coderising/ood/ocp/SMSUtil.java  |  10 +
 .../coderising/ood/ocp/good/Formatter.java    |   7 +
 .../ood/ocp/good/FormatterFactory.java        |  13 ++
 .../ood/ocp/good/HtmlFormatter.java           |  11 +
 .../com/coderising/ood/ocp/good/Logger.java   |  18 ++
 .../coderising/ood/ocp/good/RawFormatter.java |  11 +
 .../com/coderising/ood/ocp/good/Sender.java   |   7 +
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../ood/srp/chasing/Configuration.java        |  23 ++
 .../ood/srp/chasing/ConfigurationKeys.java    |   9 +
 .../ood/srp/chasing/PromotionMail.java        |  45 ++++
 .../ood/srp/chasing/model/Product.java        |  27 +++
 .../ood/srp/chasing/model/User.java           |  25 +++
 .../ood/srp/chasing/product_promotion.txt     |   4 +
 .../ood/srp/chasing/service/MailService.java  |  62 ++++++
 .../srp/chasing/service/ProductService.java   |  32 +++
 .../srp/chasing/service/PromotionService.java |  18 ++
 .../ood/srp/chasing/service/UserService.java  |  18 ++
 .../ood/srp/chasing/util/DBUtil.java          |  21 ++
 .../ood/srp/chasing/util/MailUtil.java        |  14 ++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 29 files changed, 743 insertions(+)
 create mode 100644 students/282692248/ood/ood-assignment/pom.xml
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/Logger.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Formatter.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/FormatterFactory.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/HtmlFormatter.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Logger.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/RawFormatter.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/good/Sender.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/Configuration.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/ConfigurationKeys.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/PromotionMail.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/Product.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/model/User.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/product_promotion.txt
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/MailService.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/ProductService.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/PromotionService.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/service/UserService.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/DBUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/chasing/util/MailUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
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/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<String,String> 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<String,String> 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<User> 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<User> 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<User> query(String sql){
+		List<User> 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

From 52f16e2338e7d7d5787bb7eb51c32530d2491740 Mon Sep 17 00:00:00 2001
From: unknown <j00313496@CYA141213119-T.china.huawei.com>
Date: Sat, 1 Jul 2017 09:39:08 +0800
Subject: [PATCH 306/332] =?UTF-8?q?=E5=BC=80=E9=97=AD=E5=8E=9F=E5=88=99?=
 =?UTF-8?q?=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../coderising/ood/ocp/chasing/DateUtil.java  | 10 ++++++++++
 .../coderising/ood/ocp/chasing/Logger.java    | 19 +++++++++++++++++++
 .../coderising/ood/ocp/chasing/MailUtil.java  | 10 ++++++++++
 .../coderising/ood/ocp/chasing/SMSUtil.java   | 10 ++++++++++
 .../ocp/chasing/formatter/ILogFormatter.java  |  5 +++++
 .../formatter/LogWithDateFormatter.java       | 12 ++++++++++++
 .../ood/ocp/chasing/formatter/RawLog.java     | 10 ++++++++++
 .../ood/ocp/chasing/sender/ILogSender.java    |  5 +++++
 .../ood/ocp/chasing/sender/MailSender.java    | 12 ++++++++++++
 .../ood/ocp/chasing/sender/SMSSender.java     | 10 ++++++++++
 .../ood/ocp/chasing/sender/StdoutSender.java  | 12 ++++++++++++
 11 files changed, 115 insertions(+)
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/DateUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/Logger.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/MailUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/SMSUtil.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/ILogFormatter.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/LogWithDateFormatter.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/formatter/RawLog.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/ILogSender.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/MailSender.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/SMSSender.java
 create mode 100644 students/282692248/ood/ood-assignment/src/main/java/com/coderising/ood/ocp/chasing/sender/StdoutSender.java

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);
+	}
+
+}

From 8d716de2496be733e19e6fb4107003cbf5c5740d Mon Sep 17 00:00:00 2001
From: ThomsonTang <guiketang@gmail.com>
Date: Sun, 2 Jul 2017 18:31:11 +0800
Subject: [PATCH 307/332] refactor the promotion email project.

---
 .../coderising/ood/srp/PromotionTask.java     | 24 +++++++++++++
 .../ood/srp/service/EmailService.java         | 19 ++++++++--
 .../ood/srp/service/MailSender.java           | 20 +++++++++++
 .../ood/srp/service/ProductService.java       | 16 ++++++++-
 .../srp/service/impl/EmailServiceImpl.java    | 32 ++++++++++++-----
 .../ood/srp/service/impl/MailSenderImpl.java  | 35 +++++++++++++++++++
 .../service/impl/ProductFileServiceImpl.java  |  5 +++
 7 files changed, 140 insertions(+), 11 deletions(-)
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/PromotionTask.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/MailSender.java
 create mode 100644 students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/impl/MailSenderImpl.java

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<Email> 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/service/EmailService.java b/students/395135865/ood/ood-assignment/src/main/java/com/thomsom/coderising/ood/srp/service/EmailService.java
index c6211eb49f..d922b9fe0f 100644
--- 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
@@ -2,12 +2,27 @@
 
 import com.thomsom.coderising.ood.srp.Email;
 
+import java.util.List;
+
 /**
- *
+ * 邮件服务
  *
  * @author Thomson Tang
  * @version Created: 29/06/2017.
  */
 public interface EmailService {
-    Email newEmail() throws Exception;
+    /**
+     * 创建要发送的邮件，相当于写邮件
+     *
+     * @return 返回若干邮件
+     * @throws Exception if error
+     */
+    List<Email> createEmails() throws Exception;
+
+    /**
+     * 发送邮件
+     * @param emails 要发送的邮件
+     * @throws Exception if error occurs
+     */
+    void sendEmails(List<Email> 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<Email> 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
index 2d4b10e14f..da39ee967e 100644
--- 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
@@ -5,11 +5,25 @@
 import java.util.List;
 
 /**
- * the business service of product.
+ * 商品业务逻辑接口
  *
  * @author Thomson Tang
  * @version Created: 23/06/2017.
  */
 public interface ProductService {
+    /**
+     * 查询所有的商品
+     *
+     * @return 商品列表
+     * @throws Exception if error
+     */
     List<Product> listProduct() throws Exception;
+
+    /**
+     * 根据用户查询该用户关注的商品
+     *
+     * @param userId 用户标示符
+     * @return 用户关注的商品
+     */
+    List<Product> listSubscriptProduct(String userId);
 }
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
index 4e5f1a90b4..4906b714e3 100644
--- 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
@@ -3,13 +3,16 @@
 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.
@@ -17,21 +20,34 @@
 public class EmailServiceImpl implements EmailService {
 
     private UserService userService;
+    private ProductService productService;
+    private MailSender mailSender;
 
     @Override
-    public Email newEmail() throws Exception {
+    public List<Email> createEmails() throws Exception {
+        List<Email> emailList = new ArrayList<>();
         List<UserInfo> userInfoList = userService.listUser();
-        for (UserInfo userInfo : userInfoList) {
+        userInfoList.forEach(userInfo -> {
             Email email = new Email();
             email.setToAddress(userInfo.getEmail());
             email.setSubject("您关注的产品降价了...");
-            email.setContent("");
-        }
+            productService.listSubscriptProduct(userInfo.getUserId());
+            email.setContent(buildContent(userInfo));
+            emailList.add(email);
+        });
 
-        return null;
+        return emailList;
     }
 
-    private String generateContent(UserInfo userInfo, Product product) {
-        return String.format("尊敬的%s，您关注的产品%s降价了，欢迎购买！", userInfo.getUserName(), product.getProductName());
+    @Override
+    public void sendEmails(List<Email> emails) throws Exception {
+        mailSender.sendMail(emails);
+    }
+
+    private String buildContent(UserInfo userInfo) {
+        List<Product> 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<Email> 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
index f8625cb2ea..1434d92967 100644
--- 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
@@ -32,6 +32,11 @@ public List<Product> listProduct() throws Exception {
         return products;
     }
 
+    @Override
+    public List<Product> listSubscriptProduct(String userId) {
+        return null;
+    }
+
     private Product resolveProduct(String line) {
         String[] items = line.split(" ");
         if (items.length > 2) {

From f69a583f4fa55f4bbc4562d0dff86db9a387056a Mon Sep 17 00:00:00 2001
From: LiuWen <imliuwen@gmail.com>
Date: Sun, 2 Jul 2017 21:49:48 +0800
Subject: [PATCH 308/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1srp=E9=87=8D?=
 =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 students/2756638003/srp/pom.xml               |  32 +++++
 .../com/coderising/ood/srp/PromotionMail.java | 131 ++++++++++++++++++
 .../ood/srp/conf/Configuration.java           |  29 ++++
 .../ood/srp/conf/ConfigurationKeys.java       |   9 ++
 .../coderising/ood/srp/conf/EmailStatus.java  |  31 +++++
 .../ood/srp/conf/product_promotion.txt        |   4 +
 .../coderising/ood/srp/domain/Product.java    |  43 ++++++
 .../coderising/ood/srp/domain/Subscriber.java |  74 ++++++++++
 .../coderising/ood/srp/util/ConfigUtil.java   |  33 +++++
 .../com/coderising/ood/srp/util/DBUtil.java   |  25 ++++
 .../com/coderising/ood/srp/util/Email.java    |  75 ++++++++++
 .../com/coderising/ood/srp/util/MailUtil.java |  17 +++
 .../ood/srp/util/SubscriberUtil.java          |  17 +++
 13 files changed, 520 insertions(+)
 create mode 100644 students/2756638003/srp/pom.xml
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/Configuration.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/ConfigurationKeys.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/EmailStatus.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/conf/product_promotion.txt
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Product.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/domain/Subscriber.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/ConfigUtil.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/DBUtil.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/Email.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/MailUtil.java
 create mode 100644 students/2756638003/srp/src/main/java/com/coderising/ood/srp/util/SubscriberUtil.java

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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ds-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ds-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
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<Product> loadFile(File file) throws IOException {
+		Map<String, String> conf = ConfigUtil.readTextFile(file);
+		List<Product> productList = new ArrayList<Product>(16);
+		Set<Entry<String, String>> entrySet = conf.entrySet();
+		for (Entry<String, String> entry : entrySet) {
+			productList.add(new Product(entry.getKey(), entry.getValue()));
+		}
+		return productList;
+	}
+
+	/**
+	 * 根据商品查询订阅的用户信息
+	 */
+	private List<Subscriber> querySubscribersFormFile(List<Product> 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<Product> productList = loadFile(file);
+		// 根据商品查询订阅的用户信息
+		List<Subscriber> subscriberList = querySubscribersFormFile(productList);
+		// 发送邮件
+		sendEMails(mailDebug, subscriberList);
+	}
+
+	/**
+	 * 发送邮件
+	 */
+	protected void sendEMails(boolean debug, List<Subscriber> subscriberList)
+			throws IOException {
+		System.out.println("开始发送邮件");
+		if (subscriberList != null && subscriberList.size() > 0) {
+			Iterator<Subscriber> 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<String, String> 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<String, String> readTextFile(File file)
+			throws IOException {
+		Map<String, String> conf = new HashMap<String, String>();
+		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<Subscriber> query(String sql, Object... args) {
+		List<Subscriber> list = new ArrayList<Subscriber>(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<Subscriber> loadSubscriberList(String sql,
+			Object... args) {
+		return DBUtil.query(sql);
+	}
+
+}

From 6d58113cbc2e545d4542b57105a18d493f577b48 Mon Sep 17 00:00:00 2001
From: eulerlcs <eulerlcs@gmail.com>
Date: Sun, 2 Jul 2017 23:38:39 +0900
Subject: [PATCH 309/332] add regular expression project

---
 .../2.code/jmr-71-regularexpression/pom.xml   | 111 ++++++++++++++++
 .../regularexpression/ClassLoaderTree.java    |  12 ++
 .../eulerlcs/regularexpression/Utils.java     |  27 ++++
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 +++
 .../src/test/java/.gitkeep                    |   0
 .../ClassLoaderTreeTest.java                  | 119 ++++++++++++++++++
 .../src/test/resources/.gitkeep               |   0
 .../src/test/resources/01_01.txt              |   5 +
 9 files changed, 290 insertions(+)
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/pom.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/.gitkeep
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01_01.txt

diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/pom.xml b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/pom.xml
new file mode 100644
index 0000000000..86657499f5
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/pom.xml
@@ -0,0 +1,111 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.github.eulerlcs</groupId>
+	<artifactId>jmr-71-regularexpression</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<description>eulerlcs regular expression</description>
+
+
+	<properties>
+		<slf4j.version>1.7.24</slf4j.version>
+		<junit.version>4.12</junit.version>
+		<maven.surefire.plugin.version>2.17</maven.surefire.plugin.version>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
+	</properties>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>1.16.14</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>${slf4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>${slf4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-source-plugin</artifactId>
+					<version>3.0.1</version>
+					<executions>
+						<execution>
+							<id>attach-source</id>
+							<goals>
+								<goal>jar-no-fork</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<version>3.6.1</version>
+					<configuration>
+						<source>${maven.compiler.source}</source>
+						<target>${maven.compiler.target}</target>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-jar-plugin</artifactId>
+					<version>3.0.2</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<version>2.10.4</version>
+					<configuration>
+						<author>true</author>
+						<source>1.8</source>
+						<show>protected</show>
+						<encoding>UTF-8</encoding>
+						<charset>UTF-8</charset>
+						<docencoding>UTF-8</docencoding>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-plugin</artifactId>
+					<version>2.19.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-report-plugin</artifactId>
+					<version>2.19.1</version>
+					<configuration>
+						<aggregate>true</aggregate>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java
new file mode 100644
index 0000000000..2ea7809504
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java
@@ -0,0 +1,12 @@
+package com.github.eulerlcs.regularexpression;
+
+public class ClassLoaderTree {
+
+	public static void main(String[] args) {
+		ClassLoader loader = ClassLoaderTree.class.getClassLoader();
+		while (loader != null) {
+			System.out.println(loader.toString());
+			loader = loader.getParent();
+		}
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
new file mode 100644
index 0000000000..aa5e45c5ed
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
@@ -0,0 +1,27 @@
+package com.github.eulerlcs.regularexpression;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class Utils {
+
+	public static String readAllFromResouce(String resourceName) {
+		byte[] fileContentBytes;
+		try {
+			Path path = Paths.get(ClassLoader.getSystemResource(resourceName).toURI());
+			fileContentBytes = Files.readAllBytes(path);
+			String fileContentStr = new String(fileContentBytes, StandardCharsets.UTF_8);
+
+			return fileContentStr;
+		} catch (IOException | URISyntaxException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return "";
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%m%n" />
+		</layout>
+	</appender>
+
+	<root>
+		<!-- <level value="warm" /> -->
+		<appender-ref ref="stdout" />
+	</root>
+</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java
new file mode 100644
index 0000000000..2e0b955bad
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java
@@ -0,0 +1,119 @@
+package com.github.eulerlcs.regularexpression;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+public class ClassLoaderTreeTest {
+
+	@Test
+	public void test01_01() {
+		String text = Utils.readAllFromResouce("01_01.txt");
+		System.out.println("--orignal text start--");
+		System.out.print(text);
+		System.out.println("--orignal text  end --");
+
+		// 统一换行符
+		String result = text.replaceAll("(\r\n)|\r", "\n");
+		System.out.println("--统一换行符 start--");
+		System.out.print(result);
+		System.out.println("--统一换行符   end --");
+
+		// 行单位前后trim
+		result = result.replaceAll("(?m)^\\s*(.*?)\\s*$", "$1");
+		System.out.println("--行单位前后trim start--");
+		System.out.print(result);
+		System.out.println("--行单位前后trim   end --");
+
+		assertFalse(result.equals(text));
+	}
+
+	@Test
+	public void test01_02() {
+
+		// ^ $ \A \E (?m)
+		String text = "123\r\nabc def";
+		String regex = "\\Aabc";
+		// Pattern p = Pattern.compile(regex);
+		Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
+
+		Matcher m = p.matcher(text);
+
+		boolean result = m.find();
+		if (result) {
+			System.out.println("found");
+		} else {
+			System.out.println("not found");
+		}
+		assertTrue(result);
+	}
+
+	@Test
+	public void test01_03_dotall() {
+		Pattern p = null;
+		Matcher m = null;
+
+		String text1 = "width height";
+		String text2 = "width\nheight";
+		// Pattern p = Pattern.compile("(?s)width.height");
+		p = Pattern.compile("width.height", Pattern.DOTALL);
+
+		m = p.matcher(text1);
+		boolean result1 = m.find();
+
+		m = p.matcher(text2);
+		boolean result2 = m.find();
+		if (result2) {
+			System.out.println("found");
+		} else {
+			System.out.println("not found");
+		}
+
+		assertTrue(result1);
+		assertTrue(result2);
+	}
+
+	@Test
+	public void test01_04_Zz() {
+		Pattern p = null;
+		Matcher m = null;
+		boolean result1 = false;
+		boolean result2 = false;
+		boolean result3 = false;
+
+		String text1 = "abc def";
+		String text2 = "def abc";
+		String text3 = "def abc\n";
+
+		p = Pattern.compile("abc\\z");
+
+		m = p.matcher(text1);
+		result1 = m.find();
+
+		m = p.matcher(text2);
+		result2 = m.find();
+
+		m = p.matcher(text3);
+		result3 = m.find();
+
+		p = Pattern.compile("abc\\Z");
+
+		m = p.matcher(text1);
+		result1 = m.find();
+
+		m = p.matcher(text2);
+		result2 = m.find();
+
+		m = p.matcher(text3);
+		result3 = m.find();
+
+		assertFalse(result1);
+		assertTrue(result2);
+		assertTrue(result3);
+	}
+
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01_01.txt b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01_01.txt
new file mode 100644
index 0000000000..be72da22ea
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01_01.txt
@@ -0,0 +1,5 @@
+  abc  		
+def   
+   
+gh
+

From 431217dc60fc052eaa600f6ff75a8b213df4104f Mon Sep 17 00:00:00 2001
From: Vito <em14Vito@users.noreply.github.com>
Date: Sun, 2 Jul 2017 22:49:38 +0800
Subject: [PATCH 310/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../729693763/1.ood/ood-assignment/pom.xml    |  32 ++++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 ++
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 ++++
 .../java/com/coderising/ood/srp/FileUtil.java |  64 +++++++++++
 .../java/com/coderising/ood/srp/MailUtil.java |  48 ++++++++
 .../com/coderising/ood/srp/PromotionMail.java | 108 ++++++++++++++++++
 .../com/coderising/ood/srp/ServerDAO.java     |  31 +++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 9 files changed, 344 insertions(+)
 create mode 100644 students/729693763/1.ood/ood-assignment/pom.xml
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java
 create mode 100644 students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt

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 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    
+  </dependencies>
+  <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories>
+</project>
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<String,String> 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<String[]> parseToString(File file, String regex) {
+		List<String[]> list = new ArrayList<String[]>();
+		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<String[]> products = new ArrayList<String[]>();
+
+	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<Map<String, String>> list = pe.loadMailingList(data[0]);
+			if (list != null && list.size() > 0) {
+				pe.sendEMails(list, data[1]);
+			}
+		}
+		
+		
+
+	}
+
+	/**
+	 * 构造器，初始化应该加载商品的详细信息。
+	 * @param file
+	 * @throws IOException 
+	 */
+	public PromotionMail(File file) throws IOException {
+		//读取配置文件， 文件中只有一行用空格隔开， 例如 P8756 iPhone8
+		readFile(file);
+	}
+	
+//	/**
+//	 * 促销邮件；
+//	 * @param file
+//	 * @param mailDebug
+//	 * @throws Exception
+//	 */
+//	public PromotionMail(File file, boolean mailDebug) throws Exception {
+//		
+//		setLoadQuery();
+//		
+//		sendEMails(mailDebug, loadMailingList()); 		
+//	}
+//	
+	
+	protected void setMessage(String name, String productDesc) throws IOException {
+		this.subject = "您关注的产品降价了";
+		this.message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了，欢迎购买!";
+	}
+	
+	protected void readFile(File file) throws IOException // @02C
+	{
+		List<String[] > list = FileUtil.parseToString(file, " ");
+		if(list != null && !list.isEmpty()){
+			products = list;
+			for (String[] data: products) {
+				System.out.println("产品ID = " + data[0] + "\n");
+				System.out.println("产品描述 = " + data[1] + "\n");
+			}
+		}
+	}
+
+	
+
+	protected List loadMailingList(String productID) throws Exception {
+		return server.getList(productID);
+	}
+	
+	
+	protected void sendEMails(List<Map<String, String>> mailingList,String productDesc) throws IOException 
+	{
+		System.out.println("开始发送邮件");
+	
+		if (mailingList != null) {
+			Iterator<Map<String, String>> iter = mailingList.iterator();
+			while (iter.hasNext()) {
+				Map<String, String> map = iter.next();
+				String toAddress = (String) map.get("EMAIL");
+				String name = (String) map.get("NAME");
+				setMessage(name, productDesc);
+				if (toAddress != null && toAddress.length() > 0)
+					MailUtil.sendEmail(toAddress, subject, message);
+			}
+		} else {
+			System.out.println("没有邮件发送");
+		}
+	}
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java
new file mode 100644
index 0000000000..30a4c5bdde
--- /dev/null
+++ b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/ServerDAO.java
@@ -0,0 +1,31 @@
+
+package com.coderising.ood.srp;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/** 
+ * @author  作者 Denny
+ * @date 创建时间：Jun 25, 2017 2:20:04 PM 
+ * @version 1.0 
+ * @parameter  
+ * @since  
+ * @return  */
+public class ServerDAO {
+	public List<Map<String, String>> getList(String productID) {
+		// TODO Auto-generated method stub
+		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
+		String sql = "Select name from subscriptions " + "where product_id= '" + productID + "' "
+				+ "and send_mail=1 ";
+
+		System.out.println("loadQuery set");
+		try {
+			list = DBUtil.query(sql);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return list;
+	}
+}
diff --git a/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/729693763/1.ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..0c0124cc61
--- /dev/null
+++ b/students/729693763/1.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

From 616cf8d9aee4a04c13015f5c6b25e5e9c0662519 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Tue, 4 Jul 2017 09:29:39 +0800
Subject: [PATCH 311/332] payroll

---
 .../com/coderising/payroll/Affiliation.java   |  5 +++
 .../java/com/coderising/payroll/Employee.java | 42 +++++++++++++++++++
 .../java/com/coderising/payroll/Paycheck.java | 35 ++++++++++++++++
 .../payroll/PaymentClassification.java        |  5 +++
 .../com/coderising/payroll/PaymentMethod.java |  5 +++
 .../coderising/payroll/PaymentSchedule.java   |  8 ++++
 .../com/coderising/payroll/SalesReceipt.java  | 14 +++++++
 .../java/com/coderising/payroll/TimeCard.java | 15 +++++++
 8 files changed, 129 insertions(+)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java
new file mode 100644
index 0000000000..091165a2af
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java
@@ -0,0 +1,5 @@
+package com.coderising.payroll;
+
+public interface Affiliation {
+	public double calculateDeductions(Paycheck pc);
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java
new file mode 100644
index 0000000000..923297c91a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java
@@ -0,0 +1,42 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class Employee {
+	String id;
+	String name;
+	String address;
+	Affiliation affiliation;
+	
+
+	PaymentClassification classification;
+	PaymentSchedule schedule;
+	PaymentMethod paymentMethod;
+
+	public Employee(String name, String address){
+		this.name = name;
+		this.address = address;
+	}
+	public boolean isPayDay(Date d) {
+		return false;
+	}
+
+	public Date getPayPeriodStartDate(Date d) {
+		return null;
+	}
+
+	public void payDay(Paycheck pc){
+		 
+	}
+	
+	public void setClassification(PaymentClassification classification) {
+		this.classification = classification;
+	}
+	public void setSchedule(PaymentSchedule schedule) {
+		this.schedule = schedule;
+	}
+	public void setPaymentMethod(PaymentMethod paymentMethod) {
+		this.paymentMethod = paymentMethod;
+	}
+}
+
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java
new file mode 100644
index 0000000000..802c8b5c45
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java
@@ -0,0 +1,35 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+public class Paycheck {
+	private Date payPeriodStart;
+	private Date payPeriodEnd;
+	private double grossPay;
+	private double netPay;
+	private double deductions;
+	
+	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
+		this.payPeriodStart = payPeriodStart;
+		this.payPeriodEnd = payPeriodEnd;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+		
+	}
+	public void setDeductions(double deductions) {
+		this.deductions  = deductions;		
+	}
+	public void setNetPay(double netPay){
+		this.netPay = netPay;
+	}
+	public Date getPayPeriodEndDate() {
+		
+		return this.payPeriodEnd;
+	}
+	public Date getPayPeriodStartDate() {
+		
+		return this.payPeriodStart;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java
new file mode 100644
index 0000000000..f2bf2e26e9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java
@@ -0,0 +1,5 @@
+package com.coderising.payroll;
+
+public interface PaymentClassification {
+	public double calculatePay(Paycheck pc); 
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java
new file mode 100644
index 0000000000..5e549916b6
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java
@@ -0,0 +1,5 @@
+package com.coderising.payroll;
+
+public interface PaymentMethod {
+	public void pay(Paycheck pc);
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java
new file mode 100644
index 0000000000..500d72404d
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java
@@ -0,0 +1,8 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+	public boolean isPayDate(Date date);
+	public Date getPayPeriodStartDate( Date payPeriodEndDate);
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java
new file mode 100644
index 0000000000..fcd3b506fc
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java
@@ -0,0 +1,14 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date saleDate;
+	private double amount;
+	public Date getSaleDate() {
+		return saleDate;
+	}
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java
new file mode 100644
index 0000000000..735cc17ac1
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java
@@ -0,0 +1,15 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int hours;
+	
+	public Date getDate() {
+		return date;
+	}
+	public int getHours() {
+		return hours;
+	}
+}

From e01d178dc45c21efd306d77f6d75c57cf6a55e3a Mon Sep 17 00:00:00 2001
From: yangzhm <yangzhm@hualu.com.cn>
Date: Tue, 4 Jul 2017 21:02:12 +0800
Subject: [PATCH 312/332] add project of payment

---
 .../payment/src/Affiliation/Affiliation.java  |  7 ++++
 .../src/Affiliation/NonAffiliation.java       | 12 ++++++
 .../src/Affiliation/ServiceCharge.java        | 20 +++++++++
 .../src/Affiliation/UnionAffiliation.java     | 27 ++++++++++++
 .../OOD/payment/src/DateUtil/DateUtil.java    | 37 +++++++++++++++++
 .../OOD/payment/src/Employ/Employee.java      | 41 +++++++++++++++++++
 .../OOD/payment/src/PayCheck/PayCheck.java    | 36 ++++++++++++++++
 .../CommissionClassification.java             | 23 +++++++++++
 .../HourlyClassification.java                 | 38 +++++++++++++++++
 .../PaymentClassification.java                |  7 ++++
 .../SalariedClassification.java               | 12 ++++++
 .../PaymentClassification/SalesReceipt.java   | 20 +++++++++
 .../src/PaymentClassification/TimeCard.java   | 21 ++++++++++
 .../payment/src/PaymentMethod/BankMethod.java | 13 ++++++
 .../payment/src/PaymentMethod/HoldMethod.java | 13 ++++++
 .../payment/src/PaymentMethod/MailMethod.java | 13 ++++++
 .../src/PaymentMethod/PaymentMethod.java      |  7 ++++
 .../src/PaymentSchedule/BiWeeklySchedule.java | 19 +++++++++
 .../src/PaymentSchedule/MothlySchedule.java   | 19 +++++++++
 .../src/PaymentSchedule/PaymentSchedule.java  | 10 +++++
 .../src/PaymentSchedule/WeeklySchedule.java   | 18 ++++++++
 21 files changed, 413 insertions(+)
 create mode 100644 students/495232796/OOD/payment/src/Affiliation/Affiliation.java
 create mode 100644 students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java
 create mode 100644 students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java
 create mode 100644 students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java
 create mode 100644 students/495232796/OOD/payment/src/DateUtil/DateUtil.java
 create mode 100644 students/495232796/OOD/payment/src/Employ/Employee.java
 create mode 100644 students/495232796/OOD/payment/src/PayCheck/PayCheck.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java
 create mode 100644 students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java

diff --git a/students/495232796/OOD/payment/src/Affiliation/Affiliation.java b/students/495232796/OOD/payment/src/Affiliation/Affiliation.java
new file mode 100644
index 0000000000..5e2dac8fa0
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/Affiliation.java
@@ -0,0 +1,7 @@
+package Affiliation;
+
+import PayCheck.PayCheck;
+
+public abstract class Affiliation {
+	public abstract double calculateDeduction(PayCheck pc);
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java b/students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java
new file mode 100644
index 0000000000..d37c1e35ff
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/NonAffiliation.java
@@ -0,0 +1,12 @@
+package Affiliation;
+
+import PayCheck.PayCheck;
+
+public class NonAffiliation extends Affiliation{
+
+	@Override
+	public double calculateDeduction(PayCheck pc) {
+		return 0.0;
+	}
+
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java b/students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java
new file mode 100644
index 0000000000..a7faa67adb
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/ServiceCharge.java
@@ -0,0 +1,20 @@
+package Affiliation;
+
+import java.util.Date;
+
+public class ServiceCharge {
+	private Date date;
+	private double amount;
+	public double getAmount() {
+		return amount;
+	}
+	public void setAmount(double amount) {
+		this.amount = amount;
+	}
+	public Date getDate() {
+		return date;
+	}
+	public void setDate(Date date) {
+		this.date = date;
+	}
+}
diff --git a/students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java b/students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java
new file mode 100644
index 0000000000..02e645ef1f
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Affiliation/UnionAffiliation.java
@@ -0,0 +1,27 @@
+package Affiliation;
+
+import java.util.Date;
+import java.util.Map;
+
+import PayCheck.PayCheck;
+import DateUtil.DateUtil;
+
+public class UnionAffiliation extends Affiliation{
+	private String memId;
+	private double weeklyDue;
+	private Map<Date, ServiceCharge> serviceCharges;
+	@Override
+	public double calculateDeduction(PayCheck pc) {
+		int fridays = DateUtil.getFridays(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate());
+		double totalDue = fridays*this.weeklyDue;
+		
+		double totalCharges = 0.0;
+		for (ServiceCharge sc : serviceCharges.values()) {
+			if (DateUtil.between(sc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				totalCharges += sc.getAmount();
+			}
+		}
+		return totalDue+totalCharges;
+	}
+
+}
diff --git a/students/495232796/OOD/payment/src/DateUtil/DateUtil.java b/students/495232796/OOD/payment/src/DateUtil/DateUtil.java
new file mode 100644
index 0000000000..6ed884bfa8
--- /dev/null
+++ b/students/495232796/OOD/payment/src/DateUtil/DateUtil.java
@@ -0,0 +1,37 @@
+package DateUtil;
+
+import java.util.Date;
+
+public class DateUtil {
+	public static boolean isFriday(Date d) {
+		return true;
+	}
+	
+	public static Date add(Date d, int days) {
+		return new Date();
+	}
+	
+	public static boolean isLastDayofMonth(Date d) {
+		return false;
+	}
+	
+	public static Date getFirstDay(Date d) {
+		return new Date();
+	}
+	
+	public static long getDaysBetween(Date start, Date end) {
+		return 0;
+	}
+	
+	public static Date parseDay(String dayStr) {
+		return new Date();
+	}
+	
+	public static boolean between(Date d, Date start, Date end) {
+		return true;
+	}
+	
+	public static int getFridays(Date start, Date end) {
+		return 0;
+	}
+}
diff --git a/students/495232796/OOD/payment/src/Employ/Employee.java b/students/495232796/OOD/payment/src/Employ/Employee.java
new file mode 100644
index 0000000000..b21eec7869
--- /dev/null
+++ b/students/495232796/OOD/payment/src/Employ/Employee.java
@@ -0,0 +1,41 @@
+package Employ;
+
+import java.util.Date;
+
+import Affiliation.Affiliation;
+import PayCheck.PayCheck;
+import PaymentClassification.PaymentClassification;
+import PaymentMethod.PaymentMethod;
+import PaymentSchedule.PaymentSchedule;
+
+public class Employee {
+	private String id;
+	private String name;
+	private String address;
+	PaymentClassification payment;
+	PaymentSchedule paySch;
+	PaymentMethod payMethod;
+	Affiliation af;
+	
+	public Employee(String name, String address) {
+		this.name = name;
+		this.address = address;
+	}
+	public boolean isPayDay(Date d) {
+		return this.paySch.isPayDay(d);
+	}
+	
+	public Date getPayPeriodStartDate(Date d) {
+		return this.paySch.getPayPeriodStartDate(d);
+	}
+	
+	public void payDay(PayCheck pc) {
+		double grossPay = payment.calculatePay(pc);
+		double dedutions = af.calculateDeduction(pc);
+		double netPay = grossPay - dedutions;
+		pc.setGrossPay(grossPay);
+		pc.setDeductions(dedutions);
+		pc.setNetPay(netPay);
+		payMethod.pay(pc);
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PayCheck/PayCheck.java b/students/495232796/OOD/payment/src/PayCheck/PayCheck.java
new file mode 100644
index 0000000000..ceea1e41fe
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PayCheck/PayCheck.java
@@ -0,0 +1,36 @@
+package PayCheck;
+
+import java.util.Date;
+
+public class PayCheck {
+	private int payPeriodStart;
+	private int payPeriodEnd;
+	private double grossPay;
+	private double deductions;
+	private double netPay;
+	public double getGrossPay() {
+		return grossPay;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+	}
+	public double getDeductions() {
+		return deductions;
+	}
+	public void setDeductions(double deductions) {
+		this.deductions = deductions;
+	}
+	public double getNetPay() {
+		return netPay;
+	}
+	public void setNetPay(double netPay) {
+		this.netPay = netPay;
+	}
+	
+	public Date getPayPeriodStartDate() {
+		return new Date();
+	}
+	public Date getPayPeriodEndDate() {
+		return new Date();
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java
new file mode 100644
index 0000000000..e1b9edab23
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/CommissionClassification.java
@@ -0,0 +1,23 @@
+package PaymentClassification;
+
+import java.util.Date;
+import java.util.Map;
+
+import PayCheck.PayCheck;
+import DateUtil.DateUtil;
+
+public class CommissionClassification extends PaymentClassification{
+	private double rate = 0.0;
+	private double salary = 0.0;
+	private Map<Date, SalesReceipt> receipts;
+	@Override
+	public double calculatePay(PayCheck pc) {
+		double commission = 0.0;
+		for (SalesReceipt sr : receipts.values()) {
+			if (DateUtil.between(sr.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				commission += sr.getAmount()*rate;
+			}
+		}
+		return commission+salary;
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java
new file mode 100644
index 0000000000..00ae430777
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/HourlyClassification.java
@@ -0,0 +1,38 @@
+package PaymentClassification;
+
+import java.util.Date;
+import java.util.Map;
+
+import DateUtil.DateUtil;
+import PayCheck.PayCheck;
+
+public class HourlyClassification extends PaymentClassification{
+	private double hourlyRate = 0.0;
+	private Map<Date, TimeCard> timeCards;
+	
+	public void addTimeCard(TimeCard tc) {
+		timeCards.put(tc.getDate(), tc);
+	}
+
+	@Override
+	public double calculatePay(PayCheck pc) {
+		double total = 0.0;
+		
+		for (TimeCard tc : timeCards.values()) {
+			if (DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				total += calculatePayForTimeCard(tc);
+			}
+		}
+		
+		return total;
+	}
+	
+	private double calculatePayForTimeCard(TimeCard tc) {
+		int hours = tc.getHours();
+		if (hours > 8) {
+			return 8*this.hourlyRate + (hours - 8)*this.hourlyRate*1.5;
+		} else {
+			return 8*this.hourlyRate;
+		}
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java
new file mode 100644
index 0000000000..f9b06d744f
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/PaymentClassification.java
@@ -0,0 +1,7 @@
+package PaymentClassification;
+
+import PayCheck.PayCheck;
+
+public abstract class PaymentClassification {
+	public abstract double calculatePay(PayCheck pc);
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java b/students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java
new file mode 100644
index 0000000000..941bde9869
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/SalariedClassification.java
@@ -0,0 +1,12 @@
+package PaymentClassification;
+
+import PayCheck.PayCheck;
+
+public class SalariedClassification extends PaymentClassification {
+	private double salary = 0.0;
+
+	@Override
+	public double calculatePay(PayCheck pc) {
+		return salary;
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java b/students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java
new file mode 100644
index 0000000000..a9f07140bd
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/SalesReceipt.java
@@ -0,0 +1,20 @@
+package PaymentClassification;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date date;
+	private double amount;
+	public Date getDate() {
+		return date;
+	}
+	public void setDate(Date date) {
+		this.date = date;
+	}
+	public double getAmount() {
+		return amount;
+	}
+	public void setAmount(double amount) {
+		this.amount = amount;
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java b/students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java
new file mode 100644
index 0000000000..e4396ee603
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentClassification/TimeCard.java
@@ -0,0 +1,21 @@
+package PaymentClassification;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int startTime;
+	private int endTime;
+	
+	public Date getDate() {
+		return date;
+	}
+	public void setDate(Date date) {
+		this.date = date;
+	}
+	
+	public int getHours() {
+		return endTime - startTime;
+	}
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java
new file mode 100644
index 0000000000..1ef31f13ba
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/BankMethod.java
@@ -0,0 +1,13 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public class BankMethod extends PaymentMethod{
+	private String bank;
+	private double account;
+	@Override
+	public void pay(PayCheck pc) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java
new file mode 100644
index 0000000000..62d9b4439c
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/HoldMethod.java
@@ -0,0 +1,13 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public class HoldMethod extends PaymentMethod{
+
+	@Override
+	public void pay(PayCheck pc) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java
new file mode 100644
index 0000000000..f8a98e5113
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/MailMethod.java
@@ -0,0 +1,13 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public class MailMethod extends PaymentMethod{
+	private String address;
+
+	@Override
+	public void pay(PayCheck pc) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java b/students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java
new file mode 100644
index 0000000000..67093ae1a0
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentMethod/PaymentMethod.java
@@ -0,0 +1,7 @@
+package PaymentMethod;
+
+import PayCheck.PayCheck;
+
+public abstract class PaymentMethod {
+	public abstract void pay(PayCheck pc);
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java
new file mode 100644
index 0000000000..ced0eb1d15
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/BiWeeklySchedule.java
@@ -0,0 +1,19 @@
+package PaymentSchedule;
+
+import java.util.Date;
+import DateUtil.DateUtil;
+
+public class BiWeeklySchedule implements PaymentSchedule{
+	Date firstFriday = DateUtil.parseDay("2017-01-01");
+	@Override
+	public boolean isPayDay(Date date) {
+		long interval = DateUtil.getDaysBetween(firstFriday, date);
+		return interval%14 == 0;
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date date) {
+		return DateUtil.add(date, -13);
+	}
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java
new file mode 100644
index 0000000000..edac34d480
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/MothlySchedule.java
@@ -0,0 +1,19 @@
+package PaymentSchedule;
+
+import java.util.Date;
+
+import DateUtil.DateUtil;
+
+public class MothlySchedule implements PaymentSchedule{
+
+	@Override
+	public boolean isPayDay(Date date) {
+		return DateUtil.isLastDayofMonth(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date date) {
+		return DateUtil.getFirstDay(date);
+	}
+
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java
new file mode 100644
index 0000000000..e1dea539f8
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/PaymentSchedule.java
@@ -0,0 +1,10 @@
+package PaymentSchedule;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+
+	public boolean isPayDay(Date date);
+	
+	public Date getPayPeriodStartDate(Date date);
+}
diff --git a/students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java b/students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java
new file mode 100644
index 0000000000..9e8e4dfe9f
--- /dev/null
+++ b/students/495232796/OOD/payment/src/PaymentSchedule/WeeklySchedule.java
@@ -0,0 +1,18 @@
+package PaymentSchedule;
+
+import java.util.Date;
+import DateUtil.DateUtil;
+
+public class WeeklySchedule implements PaymentSchedule{
+
+	@Override
+	public boolean isPayDay(Date date) {
+		return DateUtil.isFriday(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date date) {
+		return DateUtil.add(date, -6);
+	}
+
+}

From b714cf009cbe6bdec3a38ed4183a30088a675436 Mon Sep 17 00:00:00 2001
From: Thomas Young <yk_ecust_2007@163.com>
Date: Tue, 4 Jul 2017 21:46:41 +0800
Subject: [PATCH 313/332] Payroll init

---
 .../{ood => myood}/ocp/DateUtil.java          |   2 +-
 .../coderising/{ood => myood}/ocp/Logger.java |   2 +-
 .../{ood => myood}/ocp/MailUtil.java          |   2 +-
 .../{ood => myood}/ocp/SMSUtil.java           |   2 +-
 .../ocp/myocp/DateFormatter.java              |   2 +-
 .../{ood => myood}/ocp/myocp/DateUtil.java    |   2 +-
 .../{ood => myood}/ocp/myocp/EmailSender.java |   2 +-
 .../{ood => myood}/ocp/myocp/Formatter.java   |   2 +-
 .../ocp/myocp/FormatterFactory.java           |   2 +-
 .../{ood => myood}/ocp/myocp/LogDrive.java    |   2 +-
 .../{ood => myood}/ocp/myocp/LogFactory.java  |   2 +-
 .../{ood => myood}/ocp/myocp/Logger.java      |   2 +-
 .../{ood => myood}/ocp/myocp/MailUtil.java    |   2 +-
 .../{ood => myood}/ocp/myocp/PrintSender.java |   2 +-
 .../ocp/myocp/RawFormatter.java               |   2 +-
 .../{ood => myood}/ocp/myocp/SMSUtil.java     |   2 +-
 .../{ood => myood}/ocp/myocp/Sender.java      |   2 +-
 .../ocp/myocp/SenderFactory.java              |   2 +-
 .../{ood => myood}/ocp/myocp/SmsSender.java   |   2 +-
 .../coderising/myood/payroll/Affiliation.java |   5 +++
 .../coderising/myood/payroll/Employee.java    |  42 ++++++++++++++++++
 .../coderising/myood/payroll/Paycheck.java    |  34 ++++++++++++++
 .../myood/payroll/PaymentClassification.java  |   5 +++
 .../myood/payroll/PaymentMethod.java          |   5 +++
 .../myood/payroll/PaymentSchedule.java        |   8 ++++
 .../myood/payroll/SalesReceipt.java           |  14 ++++++
 .../coderising/myood/payroll/TimeCard.java    |  15 +++++++
 .../{ood => myood}/srp/Configuration.java     |   2 +-
 .../{ood => myood}/srp/ConfigurationKeys.java |   2 +-
 .../coderising/{ood => myood}/srp/DBUtil.java |   2 +-
 .../{ood => myood}/srp/EmailParam.java        |   2 +-
 .../{ood => myood}/srp/MailService.java       |   2 +-
 .../{ood => myood}/srp/MailUtil.java          |   2 +-
 .../{ood => myood}/srp/ProductInfo.java       |   4 +-
 .../coderising/myood/srp/PromotionMail.java   |   8 ++++
 .../{ood => myood}/srp/UserDao.java           |   2 +-
 .../srp/goodSrp/Configuration.java            |   8 ++--
 .../srp/goodSrp/ConfigurationKeys.java        |   2 +-
 .../{ood => myood}/srp/goodSrp/DBUtil.java    |   2 +-
 .../{ood => myood}/srp/goodSrp/Mail.java      |   6 +--
 .../srp/goodSrp/MailSender.java               |   2 +-
 .../{ood => myood}/srp/goodSrp/MailUtil.java  |   2 +-
 .../{ood => myood}/srp/goodSrp/Product.java   |   2 +-
 .../srp/goodSrp/ProductService.java           |   4 +-
 .../srp/goodSrp/PromotionJob.java             |   2 +-
 .../{ood => myood}/srp/goodSrp/User.java      |   2 +-
 .../srp/goodSrp/UserService.java              |   2 +-
 .../goodSrp/template/MailBodyTemplate.java    |   2 +-
 .../template/TextMailBodyTemplate.java        |   2 +-
 .../{ood => myood}/srp/product_promotion.txt  |   0
 .../coderising/{ood => myood}/uml/Dice.java   |   2 +-
 .../{ood => myood}/uml/DiceGame.java          |   2 +-
 .../{ood => myood}/uml/GameTest.java          |   2 +-
 .../coderising/{ood => myood}/uml/Player.java |   2 +-
 ...0\346\227\266\345\272\217\345\233\276.png" | Bin
 ...0\345\255\220\347\261\273\345\233\276.png" | Bin
 ...1\347\224\250\344\276\213\345\233\276.png" | Bin
 .../com/coderising/ood/srp/PromotionMail.java |  17 -------
 58 files changed, 187 insertions(+), 68 deletions(-)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/DateUtil.java (69%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/Logger.java (91%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/MailUtil.java (77%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/SMSUtil.java (76%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/DateFormatter.java (86%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/DateUtil.java (84%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/EmailSender.java (81%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/Formatter.java (73%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/FormatterFactory.java (93%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/LogDrive.java (90%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/LogFactory.java (91%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/Logger.java (82%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/MailUtil.java (75%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/PrintSender.java (82%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/RawFormatter.java (81%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/SMSUtil.java (74%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/Sender.java (72%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/SenderFactory.java (94%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/ocp/myocp/SmsSender.java (81%)
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/Affiliation.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/Employee.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/Paycheck.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/PaymentClassification.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/PaymentMethod.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/PaymentSchedule.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/SalesReceipt.java
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/payroll/TimeCard.java
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/Configuration.java (94%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/ConfigurationKeys.java (86%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/DBUtil.java (93%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/EmailParam.java (96%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/MailService.java (99%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/MailUtil.java (93%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/ProductInfo.java (94%)
 create mode 100644 students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/UserDao.java (94%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/Configuration.java (60%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/ConfigurationKeys.java (83%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/DBUtil.java (92%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/Mail.java (79%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/MailSender.java (96%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/MailUtil.java (92%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/Product.java (90%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/ProductService.java (91%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/PromotionJob.java (93%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/User.java (95%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/UserService.java (94%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/template/MailBodyTemplate.java (52%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/goodSrp/template/TextMailBodyTemplate.java (90%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/srp/product_promotion.txt (100%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/uml/Dice.java (90%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/uml/DiceGame.java (97%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/uml/GameTest.java (91%)
 rename students/812350401/src/main/java/com/coderising/{ood => myood}/uml/Player.java (92%)
 rename "students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png" => "students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png" (100%)
 rename "students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" => "students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" (100%)
 rename "students/812350401/src/main/java/com/coderising/ood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png" => "students/812350401/src/main/java/com/coderising/myood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png" (100%)
 delete mode 100644 students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java

diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/812350401/src/main/java/com/coderising/myood/ocp/DateUtil.java
similarity index 69%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/DateUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/DateUtil.java
index 0d0d01098f..d8997edc1f 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/DateUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/DateUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.myood.ocp;
 
 public class DateUtil {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/Logger.java b/students/812350401/src/main/java/com/coderising/myood/ocp/Logger.java
similarity index 91%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/Logger.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/Logger.java
index aca173e665..1cdaba8482 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/Logger.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/Logger.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.myood.ocp;
 
 public class Logger {
 	
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/812350401/src/main/java/com/coderising/myood/ocp/MailUtil.java
similarity index 77%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/MailUtil.java
index 88cd252cf4..3c1fcb650c 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.myood.ocp;
 
 public class MailUtil {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/812350401/src/main/java/com/coderising/myood/ocp/SMSUtil.java
similarity index 76%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/SMSUtil.java
index 8e955ab085..f91558bfbf 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/SMSUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/SMSUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp;
+package com.coderising.myood.ocp;
 
 public class SMSUtil {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateFormatter.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/DateFormatter.java
similarity index 86%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateFormatter.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/DateFormatter.java
index b9c3f7b026..3e5145409a 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateFormatter.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/DateFormatter.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 
 /**
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/DateUtil.java
similarity index 84%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/DateUtil.java
index d207c1d3c0..5f14aee788 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/DateUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/DateUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailSender.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/EmailSender.java
similarity index 81%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailSender.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/EmailSender.java
index bc91dc2d58..7ce76f3563 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/EmailSender.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/EmailSender.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 
 /**
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Formatter.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Formatter.java
similarity index 73%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Formatter.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Formatter.java
index c831fcb369..4bca0709d4 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Formatter.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Formatter.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/FormatterFactory.java
similarity index 93%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/FormatterFactory.java
index 6c08688f5f..ab085a9022 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/FormatterFactory.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/FormatterFactory.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 public class FormatterFactory {
     public final int RAW_LOG = 1;
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/LogDrive.java
similarity index 90%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/LogDrive.java
index f0f8f3cf1e..c18bbd588a 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogDrive.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/LogDrive.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/LogFactory.java
similarity index 91%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/LogFactory.java
index 63b2d1b8e4..056243c17f 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/LogFactory.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/LogFactory.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Logger.java
similarity index 82%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Logger.java
index 94cbab377c..0a410f1350 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Logger.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Logger.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 public class Logger {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/MailUtil.java
similarity index 75%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/MailUtil.java
index b6ce02902c..49198f0ccc 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 public class MailUtil {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintSender.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/PrintSender.java
similarity index 82%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintSender.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/PrintSender.java
index 67a545f6fd..ad289c5113 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/PrintSender.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/PrintSender.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawFormatter.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/RawFormatter.java
similarity index 81%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawFormatter.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/RawFormatter.java
index f2218bf59d..6fcc3119bb 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/RawFormatter.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/RawFormatter.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SMSUtil.java
similarity index 74%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SMSUtil.java
index c127e204b8..fef42b1ab4 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SMSUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SMSUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 public class SMSUtil {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Sender.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Sender.java
similarity index 72%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Sender.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Sender.java
index 939409612a..3420b17756 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/Sender.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/Sender.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SenderFactory.java
similarity index 94%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SenderFactory.java
index e068685b35..f5e2b38eb1 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SenderFactory.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SenderFactory.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 public class SenderFactory {
     public final int EMAIL_LOG = 1;
diff --git a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsSender.java b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SmsSender.java
similarity index 81%
rename from students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsSender.java
rename to students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SmsSender.java
index 47f6b1a412..9ef0b9df1f 100644
--- a/students/812350401/src/main/java/com/coderising/ood/ocp/myocp/SmsSender.java
+++ b/students/812350401/src/main/java/com/coderising/myood/ocp/myocp/SmsSender.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.ocp.myocp;
+package com.coderising.myood.ocp.myocp;
 
 
 /**
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/Affiliation.java b/students/812350401/src/main/java/com/coderising/myood/payroll/Affiliation.java
new file mode 100644
index 0000000000..0761abe820
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/Affiliation.java
@@ -0,0 +1,5 @@
+package com.coderising.myood.payroll;
+
+public interface Affiliation {
+	public double calculateDeductions(Paycheck pc);
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/Employee.java b/students/812350401/src/main/java/com/coderising/myood/payroll/Employee.java
new file mode 100644
index 0000000000..a8c1e19725
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/Employee.java
@@ -0,0 +1,42 @@
+package com.coderising.myood.payroll;
+
+import java.util.Date;
+
+public class Employee {
+	String id;
+	String name;
+	String address;
+	Affiliation affiliation;
+	
+
+	PaymentClassification classification;
+	PaymentSchedule schedule;
+	PaymentMethod paymentMethod;
+
+	public Employee(String name, String address){
+		this.name = name;
+		this.address = address;
+	}
+	public boolean isPayDay(Date d) {
+		return false;
+	}
+
+	public Date getPayPeriodStartDate(Date d) {
+		return null;
+	}
+
+	public void payDay(Paycheck pc){
+		 
+	}
+	
+	public void setClassification(PaymentClassification classification) {
+		this.classification = classification;
+	}
+	public void setSchedule(PaymentSchedule schedule) {
+		this.schedule = schedule;
+	}
+	public void setPaymentMethod(PaymentMethod paymentMethod) {
+		this.paymentMethod = paymentMethod;
+	}
+}
+
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/Paycheck.java b/students/812350401/src/main/java/com/coderising/myood/payroll/Paycheck.java
new file mode 100644
index 0000000000..97a54a1bb4
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/Paycheck.java
@@ -0,0 +1,34 @@
+package com.coderising.myood.payroll;
+
+import java.util.Date;
+
+public class Paycheck {
+	private Date payPeriodStart;
+	private Date payPeriodEnd;
+	private double grossPay;
+	private double netPay;
+	private double deductions;
+	
+	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
+		this.payPeriodStart = payPeriodStart;
+		this.payPeriodEnd = payPeriodEnd;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+		
+	}
+	public void setDeductions(double deductions) {
+		this.deductions  = deductions;		
+	}
+	public void setNetPay(double netPay){
+		this.netPay = netPay;
+	}
+	public Date getPayPeriodEndDate() {
+		
+		return this.payPeriodEnd;
+	}
+	public Date getPayPeriodStartDate() {
+		
+		return this.payPeriodStart;
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentClassification.java b/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentClassification.java
new file mode 100644
index 0000000000..c2faa50d53
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentClassification.java
@@ -0,0 +1,5 @@
+package com.coderising.myood.payroll;
+
+public interface PaymentClassification {
+	public double calculatePay(Paycheck pc); 
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentMethod.java b/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentMethod.java
new file mode 100644
index 0000000000..1e1c6421cd
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentMethod.java
@@ -0,0 +1,5 @@
+package com.coderising.myood.payroll;
+
+public interface PaymentMethod {
+	public void pay(Paycheck pc);
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentSchedule.java b/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentSchedule.java
new file mode 100644
index 0000000000..71c36e3fd7
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/PaymentSchedule.java
@@ -0,0 +1,8 @@
+package com.coderising.myood.payroll;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+	public boolean isPayDate(Date date);
+	public Date getPayPeriodStartDate(Date payPeriodEndDate);
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/SalesReceipt.java b/students/812350401/src/main/java/com/coderising/myood/payroll/SalesReceipt.java
new file mode 100644
index 0000000000..176bb89807
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/SalesReceipt.java
@@ -0,0 +1,14 @@
+package com.coderising.myood.payroll;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date saleDate;
+	private double amount;
+	public Date getSaleDate() {
+		return saleDate;
+	}
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/myood/payroll/TimeCard.java b/students/812350401/src/main/java/com/coderising/myood/payroll/TimeCard.java
new file mode 100644
index 0000000000..30ce0e6661
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/payroll/TimeCard.java
@@ -0,0 +1,15 @@
+package com.coderising.myood.payroll;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int hours;
+	
+	public Date getDate() {
+		return date;
+	}
+	public int getHours() {
+		return hours;
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/Configuration.java b/students/812350401/src/main/java/com/coderising/myood/srp/Configuration.java
similarity index 94%
rename from students/812350401/src/main/java/com/coderising/ood/srp/Configuration.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/Configuration.java
index f328c1816a..ff38f5a1b3 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/Configuration.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/Configuration.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 import java.util.HashMap;
 import java.util.Map;
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/812350401/src/main/java/com/coderising/myood/srp/ConfigurationKeys.java
similarity index 86%
rename from students/812350401/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/ConfigurationKeys.java
index 8695aed644..0ec546beee 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/ConfigurationKeys.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 
 public class ConfigurationKeys {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/DBUtil.java
similarity index 93%
rename from students/812350401/src/main/java/com/coderising/ood/srp/DBUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/DBUtil.java
index fee83a770d..bf0db8a811 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/DBUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/DBUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java b/students/812350401/src/main/java/com/coderising/myood/srp/EmailParam.java
similarity index 96%
rename from students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/EmailParam.java
index 3a9fd4f2f0..71b5d30b40 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/EmailParam.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/EmailParam.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 
 
 /**
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/MailService.java b/students/812350401/src/main/java/com/coderising/myood/srp/MailService.java
similarity index 99%
rename from students/812350401/src/main/java/com/coderising/ood/srp/MailService.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/MailService.java
index 7b01d47575..ec5809ba74 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/MailService.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/MailService.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 
 import java.io.IOException;
 import java.util.HashMap;
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/MailUtil.java
similarity index 93%
rename from students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/MailUtil.java
index aa931433a9..25a0f64583 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 
 
 public class MailUtil {
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/812350401/src/main/java/com/coderising/myood/srp/ProductInfo.java
similarity index 94%
rename from students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/ProductInfo.java
index 6d74acb3bf..1cca0338ec 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/ProductInfo.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/ProductInfo.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -12,7 +12,7 @@ public class ProductInfo {
     private String productID = null;
     private String productDesc = null;
 
-    private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+    private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt");
 
     public ProductInfo() {
         try {
diff --git a/students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java b/students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java
new file mode 100644
index 0000000000..b6ecd6fc41
--- /dev/null
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/PromotionMail.java
@@ -0,0 +1,8 @@
+package com.coderising.myood.srp;
+
+public class PromotionMail {
+	public static void main(String[] args) throws Exception {
+        MailService mailService = new MailService();
+        mailService.sendMails(true);
+	}
+}
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java b/students/812350401/src/main/java/com/coderising/myood/srp/UserDao.java
similarity index 94%
rename from students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/UserDao.java
index 49a0ce4040..d5f421a952 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/UserDao.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/UserDao.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp;
+package com.coderising.myood.srp;
 
 import java.util.List;
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Configuration.java
similarity index 60%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Configuration.java
index a9a4d3f207..b187686fc0 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Configuration.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Configuration.java
@@ -1,6 +1,6 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
-import com.coderising.ood.srp.ConfigurationKeys;
+import com.coderising.myood.srp.ConfigurationKeys;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -9,8 +9,8 @@ public class Configuration {
 
 	static Map<String,String> configurations = new HashMap<>();
 	static{
-		configurations.put(com.coderising.ood.srp.ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
-		configurations.put(com.coderising.ood.srp.ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
+		configurations.put(com.coderising.myood.srp.ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
+		configurations.put(com.coderising.myood.srp.ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
 		configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
 	}
 	/**
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ConfigurationKeys.java
similarity index 83%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ConfigurationKeys.java
index c39f1fcff9..c69fa86cbf 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ConfigurationKeys.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ConfigurationKeys.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 public class ConfigurationKeys {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/DBUtil.java
similarity index 92%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/DBUtil.java
index 53631cfa7f..4d8403d525 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/DBUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/DBUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Mail.java
similarity index 79%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Mail.java
index 858c154713..04472df8bc 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Mail.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Mail.java
@@ -1,7 +1,7 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
-import com.coderising.ood.srp.goodSrp.template.MailBodyTemplate;
-import com.coderising.ood.srp.goodSrp.template.TextMailBodyTemplate;
+import com.coderising.myood.srp.goodSrp.template.MailBodyTemplate;
+import com.coderising.myood.srp.goodSrp.template.TextMailBodyTemplate;
 
 import java.util.List;
 import java.util.stream.Collectors;
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailSender.java
similarity index 96%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailSender.java
index 8ef8769291..70d2595e47 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailSender.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailSender.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 /**
  * Created by thomas_young on 24/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailUtil.java
similarity index 92%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailUtil.java
index 132ca6be87..77a26d8318 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/MailUtil.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/MailUtil.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 public class MailUtil {
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Product.java
similarity index 90%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Product.java
index dba13425c1..9373690bd7 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/Product.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/Product.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ProductService.java
similarity index 91%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ProductService.java
index 12ad38262e..26853bc4d3 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/ProductService.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/ProductService.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 
 import java.io.*;
@@ -6,7 +6,7 @@
 import java.util.List;
 
 public class ProductService {
-	private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt");
+	private static File f = new File("/Users/thomas_young/Documents/code/liuxintraining/coding2017/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt");
 	public List<Product> getPromotionProducts() {
 		//从文本文件中读取文件列表
 		String line;
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/PromotionJob.java
similarity index 93%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/PromotionJob.java
index 59db8cdada..5b3ce7a1de 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/PromotionJob.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/PromotionJob.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 import java.util.List;
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/User.java
similarity index 95%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/User.java
index 295345ae38..65383587d1 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/User.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/User.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 import java.util.List;
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/UserService.java
similarity index 94%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/UserService.java
index a2bd152896..152d253ae3 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/UserService.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/UserService.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp;
+package com.coderising.myood.srp.goodSrp;
 
 import java.util.LinkedList;
 import java.util.List;
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/MailBodyTemplate.java
similarity index 52%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/MailBodyTemplate.java
index 95eeff723f..2ff179ac7c 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/MailBodyTemplate.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/MailBodyTemplate.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp.template;
+package com.coderising.myood.srp.goodSrp.template;
 
 public interface MailBodyTemplate {
 	String render();
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/TextMailBodyTemplate.java
similarity index 90%
rename from students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
rename to students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/TextMailBodyTemplate.java
index 4dd174a3ce..b43561a04d 100644
--- a/students/812350401/src/main/java/com/coderising/ood/srp/goodSrp/template/TextMailBodyTemplate.java
+++ b/students/812350401/src/main/java/com/coderising/myood/srp/goodSrp/template/TextMailBodyTemplate.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.srp.goodSrp.template;
+package com.coderising.myood.srp.goodSrp.template;
 
 
 public class TextMailBodyTemplate implements MailBodyTemplate {
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt
similarity index 100%
rename from students/812350401/src/main/java/com/coderising/ood/srp/product_promotion.txt
rename to students/812350401/src/main/java/com/coderising/myood/srp/product_promotion.txt
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java b/students/812350401/src/main/java/com/coderising/myood/uml/Dice.java
similarity index 90%
rename from students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
rename to students/812350401/src/main/java/com/coderising/myood/uml/Dice.java
index b805b44d68..a48f7114ee 100644
--- a/students/812350401/src/main/java/com/coderising/ood/uml/Dice.java
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/Dice.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.uml;
+package com.coderising.myood.uml;
 
 import com.google.common.collect.ImmutableList;
 
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java b/students/812350401/src/main/java/com/coderising/myood/uml/DiceGame.java
similarity index 97%
rename from students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java
rename to students/812350401/src/main/java/com/coderising/myood/uml/DiceGame.java
index afa322f909..386550fd67 100644
--- a/students/812350401/src/main/java/com/coderising/ood/uml/DiceGame.java
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/DiceGame.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.uml;
+package com.coderising.myood.uml;
 
 /**
  * Created by thomas_young on 27/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java b/students/812350401/src/main/java/com/coderising/myood/uml/GameTest.java
similarity index 91%
rename from students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java
rename to students/812350401/src/main/java/com/coderising/myood/uml/GameTest.java
index 75906c3661..ee36709326 100644
--- a/students/812350401/src/main/java/com/coderising/ood/uml/GameTest.java
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/GameTest.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.uml;
+package com.coderising.myood.uml;
 
 /**
  * Created by thomas_young on 27/6/2017.
diff --git a/students/812350401/src/main/java/com/coderising/ood/uml/Player.java b/students/812350401/src/main/java/com/coderising/myood/uml/Player.java
similarity index 92%
rename from students/812350401/src/main/java/com/coderising/ood/uml/Player.java
rename to students/812350401/src/main/java/com/coderising/myood/uml/Player.java
index c51d5e0868..2add582970 100644
--- a/students/812350401/src/main/java/com/coderising/ood/uml/Player.java
+++ b/students/812350401/src/main/java/com/coderising/myood/uml/Player.java
@@ -1,4 +1,4 @@
-package com.coderising.ood.uml;
+package com.coderising.myood.uml;
 
 /**
  * Created by thomas_young on 27/6/2017.
diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png"
similarity index 100%
rename from "students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png"
rename to "students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\346\227\266\345\272\217\345\233\276.png"
diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"
similarity index 100%
rename from "students/812350401/src/main/java/com/coderising/ood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"
rename to "students/812350401/src/main/java/com/coderising/myood/uml/\346\212\225\351\252\260\345\255\220\347\261\273\345\233\276.png"
diff --git "a/students/812350401/src/main/java/com/coderising/ood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png" "b/students/812350401/src/main/java/com/coderising/myood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png"
similarity index 100%
rename from "students/812350401/src/main/java/com/coderising/ood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png"
rename to "students/812350401/src/main/java/com/coderising/myood/uml/\350\264\255\347\211\251\347\275\221\347\253\231\347\224\250\344\276\213\345\233\276.png"
diff --git a/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
deleted file mode 100644
index bd635ea702..0000000000
--- a/students/812350401/src/main/java/com/coderising/ood/srp/PromotionMail.java
+++ /dev/null
@@ -1,17 +0,0 @@
-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 {
-	public static void main(String[] args) throws Exception {
-        MailService mailService = new MailService();
-        mailService.sendMails(true);
-	}
-}

From 16fbe95c285389186e80c67668cae8593a3027d7 Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 16:49:30 +0800
Subject: [PATCH 314/332] desktop commit

commit from github desktop first!
---
 .../coding2017/basic/ood/ocp/DateUtil.java    |  10 +
 .../coding2017/basic/ood/ocp/Logger.java      |  38 ++++
 .../coding2017/basic/ood/ocp/MailUtil.java    |  10 +
 .../coding2017/basic/ood/ocp/SMSUtil.java     |  10 +
 .../basic/ood/ocp/good/Formatter.java         |   7 +
 .../basic/ood/ocp/good/FormatterFactory.java  |  13 ++
 .../basic/ood/ocp/good/HtmlFormatter.java     |  11 +
 .../coding2017/basic/ood/ocp/good/Logger.java |  18 ++
 .../basic/ood/ocp/good/RawFormatter.java      |  11 +
 .../coding2017/basic/ood/ocp/good/Sender.java |   7 +
 .../basic/ood/payroll/Affiliation.java        |   5 +
 .../basic/ood/payroll/Employee.java           |  42 ++++
 .../basic/ood/payroll/Paycheck.java           |  35 +++
 .../ood/payroll/PaymentClassification.java    |   5 +
 .../basic/ood/payroll/PaymentMethod.java      |   5 +
 .../basic/ood/payroll/PaymentSchedule.java    |   8 +
 .../basic/ood/payroll/SalesReceipt.java       |  14 ++
 .../basic/ood/payroll/TimeCard.java           |  15 ++
 .../basic/ood/srp/Configuration.java          |  23 ++
 .../basic/ood/srp/ConfigurationKeys.java      |   9 +
 .../coding2017/basic/ood/srp/DBUtil.java      |  25 +++
 .../coding2017/basic/ood/srp/MailUtil.java    |  18 ++
 .../basic/ood/srp/PromotionMail.java          | 199 ++++++++++++++++++
 .../srp/good/template/MailBodyTemplate.java   |   5 +
 .../good/template/TextMailBodyTemplate.java   |  19 ++
 .../basic/ood/srp/good1/Configuration.java    |  23 ++
 .../ood/srp/good1/ConfigurationKeys.java      |   9 +
 .../coding2017/basic/ood/srp/good1/Mail.java  |  27 +++
 .../basic/ood/srp/good1/MailSender.java       |  35 +++
 .../basic/ood/srp/good1/Product.java          |  14 ++
 .../basic/ood/srp/good1/ProductService.java   |   9 +
 .../basic/ood/srp/good1/PromotionJob.java     |  24 +++
 .../coding2017/basic/ood/srp/good1/User.java  |  24 +++
 .../basic/ood/srp/good1/UserService.java      |  11 +
 .../basic/ood/srp/good2/ProductService.java   |  12 ++
 .../basic/ood/srp/good2/UserService.java      |  13 ++
 .../basic/ood/srp/product_promotion.txt       |   4 +
 37 files changed, 767 insertions(+)
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
new file mode 100644
index 0000000000..df610e556d
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
@@ -0,0 +1,10 @@
+package com.github.wluqing.coding2017.basic.ood.ocp;
+
+public class DateUtil {
+
+	public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java
new file mode 100644
index 0000000000..34907a0ed9
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/Logger.java
@@ -0,0 +1,38 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java
new file mode 100644
index 0000000000..d2b51e3abd
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/MailUtil.java
@@ -0,0 +1,10 @@
+package com.github.wluqing.coding2017.basic.ood.ocp;
+
+public class MailUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java
new file mode 100644
index 0000000000..b499c47efb
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/SMSUtil.java
@@ -0,0 +1,10 @@
+package com.github.wluqing.coding2017.basic.ood.ocp;
+
+public class SMSUtil {
+
+	public static void send(String logMsg) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java
new file mode 100644
index 0000000000..642fbb35d6
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Formatter.java
@@ -0,0 +1,7 @@
+package com.github.wluqing.coding2017.basic.ood.ocp.good;
+
+public interface Formatter {
+
+	String format(String msg);
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java
new file mode 100644
index 0000000000..e0542f7be6
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/FormatterFactory.java
@@ -0,0 +1,13 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java
new file mode 100644
index 0000000000..d901191524
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/HtmlFormatter.java
@@ -0,0 +1,11 @@
+package com.github.wluqing.coding2017.basic.ood.ocp.good;
+
+public class HtmlFormatter implements Formatter {
+
+	@Override
+	public String format(String msg) {
+		
+		return null;
+	}
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java
new file mode 100644
index 0000000000..8b0dce72b6
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Logger.java
@@ -0,0 +1,18 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java
new file mode 100644
index 0000000000..ecc8daff9e
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/RawFormatter.java
@@ -0,0 +1,11 @@
+package com.github.wluqing.coding2017.basic.ood.ocp.good;
+
+public class RawFormatter implements Formatter {
+
+	@Override
+	public String format(String msg) {
+		
+		return null;
+	}
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java
new file mode 100644
index 0000000000..407ac9f2c2
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/good/Sender.java
@@ -0,0 +1,7 @@
+package com.github.wluqing.coding2017.basic.ood.ocp.good;
+
+public interface Sender {
+
+	void send(String msg);
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java
new file mode 100644
index 0000000000..587ce68f29
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Affiliation.java
@@ -0,0 +1,5 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+public interface Affiliation {
+	public double calculateDeductions(Paycheck pc);
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java
new file mode 100644
index 0000000000..8c7ee3a469
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Employee.java
@@ -0,0 +1,42 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+import java.util.Date;
+
+public class Employee {
+	String id;
+	String name;
+	String address;
+	Affiliation affiliation;
+	
+
+	PaymentClassification classification;
+	PaymentSchedule schedule;
+	PaymentMethod paymentMethod;
+
+	public Employee(String name, String address){
+		this.name = name;
+		this.address = address;
+	}
+	public boolean isPayDay(Date d) {
+		return false;
+	}
+
+	public Date getPayPeriodStartDate(Date d) {
+		return null;
+	}
+
+	public void payDay(Paycheck pc){
+		 
+	}
+	
+	public void setClassification(PaymentClassification classification) {
+		this.classification = classification;
+	}
+	public void setSchedule(PaymentSchedule schedule) {
+		this.schedule = schedule;
+	}
+	public void setPaymentMethod(PaymentMethod paymentMethod) {
+		this.paymentMethod = paymentMethod;
+	}
+}
+
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java
new file mode 100644
index 0000000000..c6ed31d5e3
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/Paycheck.java
@@ -0,0 +1,35 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+public class Paycheck {
+	private Date payPeriodStart;
+	private Date payPeriodEnd;
+	private double grossPay;
+	private double netPay;
+	private double deductions;
+	
+	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
+		this.payPeriodStart = payPeriodStart;
+		this.payPeriodEnd = payPeriodEnd;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+		
+	}
+	public void setDeductions(double deductions) {
+		this.deductions  = deductions;		
+	}
+	public void setNetPay(double netPay){
+		this.netPay = netPay;
+	}
+	public Date getPayPeriodEndDate() {
+		
+		return this.payPeriodEnd;
+	}
+	public Date getPayPeriodStartDate() {
+		
+		return this.payPeriodStart;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java
new file mode 100644
index 0000000000..af249d9557
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentClassification.java
@@ -0,0 +1,5 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+public interface PaymentClassification {
+	public double calculatePay(Paycheck pc); 
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java
new file mode 100644
index 0000000000..9b25d28fed
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentMethod.java
@@ -0,0 +1,5 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+public interface PaymentMethod {
+	public void pay(Paycheck pc);
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java
new file mode 100644
index 0000000000..63791efbb8
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/PaymentSchedule.java
@@ -0,0 +1,8 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+	public boolean isPayDate(Date date);
+	public Date getPayPeriodStartDate( Date payPeriodEndDate);
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java
new file mode 100644
index 0000000000..79c0d8882b
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/SalesReceipt.java
@@ -0,0 +1,14 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date saleDate;
+	private double amount;
+	public Date getSaleDate() {
+		return saleDate;
+	}
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java
new file mode 100644
index 0000000000..7860212a4d
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/payroll/TimeCard.java
@@ -0,0 +1,15 @@
+package com.github.wluqing.coding2017.basic.ood.payroll;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int hours;
+	
+	public Date getDate() {
+		return date;
+	}
+	public int getHours() {
+		return hours;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java
new file mode 100644
index 0000000000..d431224c09
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/Configuration.java
@@ -0,0 +1,23 @@
+package com.github.wluqing.coding2017.basic.ood.srp;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..87749f5066
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..d4df5ad069
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/DBUtil.java
@@ -0,0 +1,25 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..82c1a3279a
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/MailUtil.java
@@ -0,0 +1,18 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..0dba90c8ec
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/PromotionMail.java
@@ -0,0 +1,199 @@
+package com.github.wluqing.coding2017.basic.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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java
new file mode 100644
index 0000000000..87ef5a8c8b
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/MailBodyTemplate.java
@@ -0,0 +1,5 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good.template;
+
+public interface MailBodyTemplate {
+	public String render();
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java
new file mode 100644
index 0000000000..e515229473
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good/template/TextMailBodyTemplate.java
@@ -0,0 +1,19 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good.template;
+
+import java.util.Map;
+
+public class TextMailBodyTemplate implements MailBodyTemplate {
+	
+	private Map<String,String >paramMap ;
+	
+	public TextMailBodyTemplate(Map<String,String> map){
+		paramMap = map;
+	}
+	
+	@Override
+	public String render() {
+		//使用某种模板技术实现Render
+		return null;
+	}
+
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java
new file mode 100644
index 0000000000..71a78aae1e
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Configuration.java
@@ -0,0 +1,23 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Configuration {
+
+	static Map<String,String> 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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java
new file mode 100644
index 0000000000..928978a1b8
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ConfigurationKeys.java
@@ -0,0 +1,9 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+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/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java
new file mode 100644
index 0000000000..3d10b3d64a
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Mail.java
@@ -0,0 +1,27 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+import java.util.List;
+
+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<Product> products = user.getSubscribedProducts();
+		//.... 实现略...
+		return null;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java
new file mode 100644
index 0000000000..02487cbbd9
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/MailSender.java
@@ -0,0 +1,35 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+public class MailSender {
+	
+	private String fromAddress ;
+	private String smtpHost;
+	private String altSmtpHost;
+	
+	public MailSender(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();
+		//发送邮件
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java
new file mode 100644
index 0000000000..1f19b2fe65
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/Product.java
@@ -0,0 +1,14 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+
+
+public class Product {
+	
+	private String id;
+	private String desc;
+	public String getDescription(){
+		return desc;
+	}
+	
+	
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java
new file mode 100644
index 0000000000..0b3e061f51
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/ProductService.java
@@ -0,0 +1,9 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+
+public class ProductService {
+	public Product getPromotionProduct(){
+		//从文本文件中读取文件列表
+		return null;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java
new file mode 100644
index 0000000000..4dbe9fdd29
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/PromotionJob.java
@@ -0,0 +1,24 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+import java.util.List;
+
+public class PromotionJob {
+	
+	private ProductService productService = null ; //获取production service
+	private UserService userService = null ;// 获取UserService
+	
+	public void run(){
+		
+		Configuration cfg = new Configuration();
+		
+		Product p = productService.getPromotionProduct();
+		
+		List<User> users = userService.getUsers(p);
+		
+		MailSender mailSender = new MailSender(cfg);
+		
+		for(User user : users){
+			mailSender.sendMail(new Mail(user));
+		}
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java
new file mode 100644
index 0000000000..b5193a4755
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/User.java
@@ -0,0 +1,24 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+import java.util.List;
+
+
+
+public class User {
+	
+	private String name;
+	private String emailAddress;
+	
+	private List<Product> subscribedProducts; 
+	
+	public String getName(){
+		return name;
+	}
+	public String getEMailAddress() {		
+		return emailAddress;
+	}
+	public List<Product> getSubscribedProducts(){
+		return this.subscribedProducts;
+	}
+	
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java
new file mode 100644
index 0000000000..aaa6a58a0d
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good1/UserService.java
@@ -0,0 +1,11 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good1;
+
+import java.util.List;
+
+public class UserService {
+	
+	public List<User> getUsers(Product product){
+		//调用DAO相关的类从数据库中读取订阅产品的用户列表
+		return null;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java
new file mode 100644
index 0000000000..c5439cac5e
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/ProductService.java
@@ -0,0 +1,12 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good2;
+
+import java.util.List;
+
+import com.github.wluqing.coding2017.basic.ood.srp.good1.Product;
+
+public class ProductService {
+	public List<Product> getPromotionProducts(){
+		//从文本文件中读取文件列表
+		return null;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java
new file mode 100644
index 0000000000..7813fb663c
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/good2/UserService.java
@@ -0,0 +1,13 @@
+package com.github.wluqing.coding2017.basic.ood.srp.good2;
+
+import java.util.List;
+
+import com.github.wluqing.coding2017.basic.ood.srp.good1.Product;
+import com.github.wluqing.coding2017.basic.ood.srp.good1.User;
+
+public class UserService {
+	public List<User> getUsers(List<Product> products){
+		//调用DAO相关的类从数据库中读取订阅产品的用户列表
+		return null;
+	}
+}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/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

From 731e7e1e7a357e275b3ff9389508dc93234ce65a Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 17:28:01 +0800
Subject: [PATCH 315/332] commit test

---
 .../coding2017/basic/ood/ocp/DateUtil.java    | 21 ++++++++++---------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
index df610e556d..6693aa91b3 100644
--- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
@@ -1,10 +1,11 @@
-package com.github.wluqing.coding2017.basic.ood.ocp;
-
-public class DateUtil {
-
-	public static String getCurrentDateAsString() {
-		
-		return null;
-	}
-
-}
+package com.github.wluqing.coding2017.basic.ood.ocp;
+
+public class DateUtil {
+	
+	public static String getCurrentDateAsString() {
+		
+		return null;
+	}
+
+}
+//commit test
\ No newline at end of file

From f20bea2809f823671694bb20eb39ab27a157132f Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 17:29:53 +0800
Subject: [PATCH 316/332] commit test2

---
 .../com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
index 6693aa91b3..bbbb4aef06 100644
--- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
@@ -3,7 +3,7 @@
 public class DateUtil {
 	
 	public static String getCurrentDateAsString() {
-		
+		// commit test
 		return null;
 	}
 

From f03f7ba8d9382e290a4c97a8c43fc115f1dc3e12 Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 17:30:31 +0800
Subject: [PATCH 317/332] commit test undo

---
 .../github/wluqing/coding2017/basic/ood/ocp/DateUtil.java    | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
index bbbb4aef06..8defe31480 100644
--- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/DateUtil.java
@@ -1,11 +1,10 @@
 package com.github.wluqing.coding2017.basic.ood.ocp;
 
 public class DateUtil {
-	
+
 	public static String getCurrentDateAsString() {
-		// commit test
+		
 		return null;
 	}
 
 }
-//commit test
\ No newline at end of file

From 9c5a25dc366e37d4d40d8e80c5c95e9581dccc1f Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 17:33:54 +0800
Subject: [PATCH 318/332] commit test

---
 .../wluqing/coding2017/basic/ood/ocp/CommitTest.java      | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java
new file mode 100644
index 0000000000..6734e098e9
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java
@@ -0,0 +1,8 @@
+package com.github.wluqing.coding2017.basic.ood.ocp;
+
+public class CommitTest {
+
+	public static void main(String[] args) {
+		System.out.println("commit test");
+	}
+}

From 048230a67e32d373a7b11afec0a4ad10829fc240 Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 17:35:23 +0800
Subject: [PATCH 319/332] commit and push test

---
 .../wluqing/coding2017/basic/ood/ocp/CommitTest2.java     | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java
new file mode 100644
index 0000000000..79dc87ed0e
--- /dev/null
+++ b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java
@@ -0,0 +1,8 @@
+package com.github.wluqing.coding2017.basic.ood.ocp;
+
+public class CommitTest2 {
+
+	public static void main(String[] args) {
+		System.out.println("commit and push test");
+	}
+}

From fd74ffc69eea0b8d31867f8ea5911cb2e64301c6 Mon Sep 17 00:00:00 2001
From: Michael <wangluqing.cs@gmail.com>
Date: Wed, 5 Jul 2017 17:37:08 +0800
Subject: [PATCH 320/332] undo commit

---
 .../wluqing/coding2017/basic/ood/ocp/CommitTest.java      | 8 --------
 .../wluqing/coding2017/basic/ood/ocp/CommitTest2.java     | 8 --------
 2 files changed, 16 deletions(-)
 delete mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java
 delete mode 100644 students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java

diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java
deleted file mode 100644
index 6734e098e9..0000000000
--- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.github.wluqing.coding2017.basic.ood.ocp;
-
-public class CommitTest {
-
-	public static void main(String[] args) {
-		System.out.println("commit test");
-	}
-}
diff --git a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java b/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java
deleted file mode 100644
index 79dc87ed0e..0000000000
--- a/students/962040254/src/com/github/wluqing/coding2017/basic/ood/ocp/CommitTest2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.github.wluqing.coding2017.basic.ood.ocp;
-
-public class CommitTest2 {
-
-	public static void main(String[] args) {
-		System.out.println("commit and push test");
-	}
-}

From 5be0c63f09c5889380815534bee31a487c7e30ab Mon Sep 17 00:00:00 2001
From: sheng <1158154002@qq.com>
Date: Sun, 9 Jul 2017 10:05:26 +0800
Subject: [PATCH 321/332] payroll

---
 .../AddCommissionEmployeeTransaction.java     | 28 ++++++++
 .../payroll/AddHourlyEmployeeTransaction.java | 27 ++++++++
 .../AddSalariedEmployeeTransaction.java       | 27 ++++++++
 .../com/coderising/payroll/BankMethod.java    | 15 +++++
 .../coderising/payroll/BiWeeklySchedule.java  | 22 +++++++
 .../payroll/CommissionClassification.java     | 34 ++++++++++
 .../java/com/coderising/payroll/Employee.java | 55 ++++++++++++++++
 .../com/coderising/payroll/HoldMethod.java    | 12 ++++
 .../payroll/HourlyClassification.java         | 42 ++++++++++++
 .../com/coderising/payroll/MailMethod.java    | 13 ++++
 .../coderising/payroll/MonthlySchedule.java   | 20 ++++++
 .../coderising/payroll/NonAffiliation.java    | 12 ++++
 .../java/com/coderising/payroll/Paycheck.java | 34 ++++++++++
 .../payroll/SalariedClassification.java       | 18 ++++++
 .../com/coderising/payroll/SalesReceipt.java  | 14 ++++
 .../com/coderising/payroll/ServiceCharge.java | 16 +++++
 .../java/com/coderising/payroll/TimeCard.java | 15 +++++
 .../coderising/payroll/UnionAffiliation.java  | 35 ++++++++++
 .../coderising/payroll/WeeklySchedule.java    | 21 ++++++
 .../payroll/api/AddEmployeeTransaction.java   | 34 ++++++++++
 .../coderising/payroll/api/Affiliation.java   |  7 ++
 .../payroll/api/PaymentClassification.java    |  7 ++
 .../coderising/payroll/api/PaymentMethod.java |  7 ++
 .../payroll/api/PaymentSchedule.java          |  8 +++
 .../payroll/service/PayrollService.java       | 30 +++++++++
 .../com/coderising/payroll/util/DateUtil.java | 64 +++++++++++++++++++
 26 files changed, 617 insertions(+)
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/Employee.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java

diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
new file mode 100644
index 0000000000..45b30ab31b
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
@@ -0,0 +1,28 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.AddEmployeeTransaction;
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class AddCommissionEmployeeTransaction extends AddEmployeeTransaction{
+	private double rate;
+	private double salary;
+	public AddCommissionEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
+			Affiliation affiliation) {
+		super(name, address, paymentMethod, affiliation);
+		this.rate=rate;
+	}
+
+	@Override
+	public PaymentClassification getClassification() {
+		return new CommissionClassification(rate,salary);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		return new WeeklySchedule();
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
new file mode 100644
index 0000000000..c7b92eafd3
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
@@ -0,0 +1,27 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.AddEmployeeTransaction;
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class AddHourlyEmployeeTransaction extends AddEmployeeTransaction{
+	private double rate;
+	public AddHourlyEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
+			Affiliation affiliation) {
+		super(name, address, paymentMethod, affiliation);
+		this.rate=rate;
+	}
+
+	@Override
+	public PaymentClassification getClassification() {
+		return new HourlyClassification(rate);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		return new WeeklySchedule();
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
new file mode 100644
index 0000000000..4edfbd0d1e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
@@ -0,0 +1,27 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.AddEmployeeTransaction;
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class AddSalariedEmployeeTransaction extends AddEmployeeTransaction{
+	private double salary;
+	public AddSalariedEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
+			Affiliation affiliation) {
+		super(name, address, paymentMethod, affiliation);
+		this.salary=salary;
+	}
+
+	@Override
+	public PaymentClassification getClassification() {
+		return new SalariedClassification(salary);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		return new MonthlySchedule();
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
new file mode 100644
index 0000000000..2a37417717
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
@@ -0,0 +1,15 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentMethod;
+
+public class BankMethod implements PaymentMethod{
+	
+	private String bank;
+	private String account;
+	
+	@Override
+	public void pay(Paycheck pc) {
+		System.out.println("BankMethod");
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
new file mode 100644
index 0000000000..39ab695425
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
@@ -0,0 +1,22 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class BiWeeklySchedule implements PaymentSchedule {
+	Date firstPayableFriday = DateUtil.parseDate("2017-06-02");
+
+	@Override
+	public boolean isPayDate(Date date) {
+		int interval = DateUtil.getDaysBetween(firstPayableFriday, date);
+		return interval % 14 == 0;
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.add(payPeriodEndDate, -13);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
new file mode 100644
index 0000000000..758e5e8ba8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
@@ -0,0 +1,34 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.util.DateUtil;
+
+public class CommissionClassification implements PaymentClassification{
+	private double salary;
+	private double rate;
+	private Map<Date,SalesReceipt> receipts;
+	
+	public CommissionClassification(double rate, double salary) {
+		this.rate=rate;
+		this.salary=salary;
+	}
+	
+	public void addSalesReceipt(SalesReceipt sr) {
+		receipts.put(sr.getSaleDate(), sr);
+	}
+
+	@Override
+	public double calculatePay(Paycheck pc) {
+		double commission=0;
+		for (SalesReceipt sr : receipts.values()) {
+			if (DateUtil.between(sr.getSaleDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				commission+=sr.getAmount()*rate;
+			}
+		}
+		return salary+commission;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/Employee.java b/students/1158154002/src/main/java/com/coderising/payroll/Employee.java
new file mode 100644
index 0000000000..45f503ab4a
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/Employee.java
@@ -0,0 +1,55 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class Employee {
+	String id;
+	String name;
+	String address;
+	
+	Affiliation affiliation;
+	PaymentClassification classification;
+	PaymentSchedule schedule;
+	PaymentMethod paymentMethod;
+
+	public Employee(String name, String address){
+		this.name = name;
+		this.address = address;
+	}
+	public boolean isPayDay(Date d) {
+		return schedule.isPayDate(d);
+	}
+
+	public Date getPayPeriodStartDate(Date d) {
+		return schedule.getPayPeriodStartDate(d);
+	}
+
+	public void payDay(Paycheck pc){
+		 double grossPay=classification.calculatePay(pc);
+		 double deductions=affiliation.calculateDeductions(pc);
+		 double netPay=grossPay-deductions;
+		 pc.setGrossPay(grossPay);
+		 pc.setDeductions(deductions);
+		 pc.setNetPay(netPay);
+		 paymentMethod.pay(pc);
+	}
+	
+	public void setClassification(PaymentClassification classification) {
+		this.classification = classification;
+	}
+	public void setSchedule(PaymentSchedule schedule) {
+		this.schedule = schedule;
+	}
+	public void setPaymentMethod(PaymentMethod paymentMethod) {
+		this.paymentMethod = paymentMethod;
+	}
+	
+	public void setAffiliation(Affiliation affiliation) {
+		this.affiliation = affiliation;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
new file mode 100644
index 0000000000..ec0892eb6a
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
@@ -0,0 +1,12 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentMethod;
+
+public class HoldMethod implements PaymentMethod{
+
+	@Override
+	public void pay(Paycheck pc) {
+		System.out.println("HoldMethod");
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
new file mode 100644
index 0000000000..6d61cae25e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
@@ -0,0 +1,42 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.util.DateUtil;
+
+public class HourlyClassification implements PaymentClassification {
+
+	private double rate;
+	private Map<Date, TimeCard> timeCards;
+
+	public HourlyClassification(double rate) {
+		this.rate=rate;
+	}
+	
+	public void addTimeCard(TimeCard tc) {
+		timeCards.put(tc.getDate(), tc);
+	}
+
+	@Override
+	public double calculatePay(Paycheck pc) {
+		double totalPay = 0;
+		for (TimeCard tc : timeCards.values()) {
+			if (DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				totalPay+=calculatePayForTimeCard(tc);	
+			}
+		}
+		return totalPay;
+	}
+
+	private double calculatePayForTimeCard(TimeCard tc) {
+		int hours = tc.getHours();
+		if (hours > 8) {
+			return 8 * rate + (hours - 8) * 1.5 * rate;
+		} else {
+			return 8 * rate;
+		}
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
new file mode 100644
index 0000000000..8cbcf755e0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
@@ -0,0 +1,13 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentMethod;
+
+public class MailMethod implements PaymentMethod{
+	private String address;
+	
+	@Override
+	public void pay(Paycheck pc) {
+		System.out.println("MailMethod");
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
new file mode 100644
index 0000000000..4b96edd28e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
@@ -0,0 +1,20 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class MonthlySchedule implements PaymentSchedule{
+
+	@Override
+	public boolean isPayDate(Date date) {
+		return DateUtil.isLasyDayOfMonth(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.getFirstDay(payPeriodEndDate);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
new file mode 100644
index 0000000000..ec8b6bc5a4
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
@@ -0,0 +1,12 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.Affiliation;
+
+public class NonAffiliation implements Affiliation{
+
+	@Override
+	public double calculateDeductions(Paycheck pc) {
+		return 0;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java b/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
new file mode 100644
index 0000000000..5a7f0f87e0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
@@ -0,0 +1,34 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class Paycheck {
+	private Date payPeriodStart;
+	private Date payPeriodEnd;
+	private double grossPay;
+	private double netPay;
+	private double deductions;
+	
+	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
+		this.payPeriodStart = payPeriodStart;
+		this.payPeriodEnd = payPeriodEnd;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+		
+	}
+	public void setDeductions(double deductions) {
+		this.deductions  = deductions;		
+	}
+	public void setNetPay(double netPay){
+		this.netPay = netPay;
+	}
+	public Date getPayPeriodEndDate() {
+		
+		return this.payPeriodEnd;
+	}
+	public Date getPayPeriodStartDate() {
+		
+		return this.payPeriodStart;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
new file mode 100644
index 0000000000..8bc025e1d8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
@@ -0,0 +1,18 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentClassification;
+
+public class SalariedClassification implements PaymentClassification{
+	private double salary;
+	
+	public SalariedClassification(double salary) {
+		this.salary=salary;
+	}
+
+	@Override
+	public double calculatePay(Paycheck pc) {
+		// TODO Auto-generated method stub
+		return salary;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java b/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
new file mode 100644
index 0000000000..25bbcd81bc
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
@@ -0,0 +1,14 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date saleDate;
+	private double amount;
+	public Date getSaleDate() {
+		return saleDate;
+	}
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java b/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
new file mode 100644
index 0000000000..58acbc3701
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
@@ -0,0 +1,16 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class ServiceCharge {
+	private Date date;
+	private double amount;
+	
+	public Date getDate() {
+		return date;
+	}
+	
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java b/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
new file mode 100644
index 0000000000..0ee88399c5
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
@@ -0,0 +1,15 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int hours;
+	
+	public Date getDate() {
+		return date;
+	}
+	public int getHours() {
+		return hours;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
new file mode 100644
index 0000000000..7505b585a8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
@@ -0,0 +1,35 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.util.DateUtil;
+
+public class UnionAffiliation implements Affiliation{
+	private String memberID;
+	private double weeklyDue;
+	private Map<Date, ServiceCharge> serviceCharges;
+	
+	public void addServiceCharge(ServiceCharge sc){
+		serviceCharges.put(sc.getDate(), sc);
+	}
+	
+	@Override
+	public double calculateDeductions(Paycheck pc) {
+		double totalPay = 0;
+		for (ServiceCharge sc : serviceCharges.values()) {
+			if (DateUtil.between(sc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				totalPay+=sc.getAmount();	
+			}
+		}
+		return totalPay+calculatePayForWeeklyDue(pc);
+	}
+
+	private double calculatePayForWeeklyDue(Paycheck pc) {
+		int interval=DateUtil.getDaysBetween( pc.getPayPeriodStartDate(),pc.getPayPeriodEndDate());
+		return interval/7*weeklyDue;
+	}
+
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
new file mode 100644
index 0000000000..93e96d2412
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
@@ -0,0 +1,21 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class WeeklySchedule implements PaymentSchedule{
+
+	@Override
+	public boolean isPayDate(Date date) {
+		
+		return DateUtil.isFriday(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.add(payPeriodEndDate, -6);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
new file mode 100644
index 0000000000..8537092b94
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
@@ -0,0 +1,34 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Employee;
+
+public abstract class AddEmployeeTransaction {
+	private String name;
+	private String address;
+	private PaymentMethod paymentMethod;
+	private Affiliation affiliation;
+
+	
+	public AddEmployeeTransaction(String name, String address, PaymentMethod paymentMethod, Affiliation affiliation) {
+		super();
+		this.name = name;
+		this.address = address;
+		this.paymentMethod = paymentMethod;
+		this.affiliation = affiliation;
+	}
+
+	public abstract PaymentClassification getClassification();
+	
+	public abstract PaymentSchedule getSchedule();
+	
+	public void execute(){
+		PaymentClassification pc=getClassification();
+		PaymentSchedule ps=getSchedule();
+		Employee e=new Employee(name, address);
+		e.setClassification(pc);
+		e.setSchedule(ps);
+		e.setPaymentMethod(paymentMethod);
+		e.setAffiliation(affiliation);
+	}
+	
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
new file mode 100644
index 0000000000..9a28cd1c46
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
@@ -0,0 +1,7 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Paycheck;
+
+public interface Affiliation {
+	public double calculateDeductions(Paycheck pc);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
new file mode 100644
index 0000000000..66e1c6704f
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
@@ -0,0 +1,7 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Paycheck;
+
+public interface PaymentClassification {
+	public double calculatePay(Paycheck pc); 
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
new file mode 100644
index 0000000000..2be20094b0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
@@ -0,0 +1,7 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Paycheck;
+
+public interface PaymentMethod {
+	public void pay(Paycheck pc);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
new file mode 100644
index 0000000000..520b6a2e98
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
@@ -0,0 +1,8 @@
+package com.coderising.payroll.api;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+	public boolean isPayDate(Date date);
+	public Date getPayPeriodStartDate( Date payPeriodEndDate);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java b/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
new file mode 100644
index 0000000000..07e3ff6c4d
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
@@ -0,0 +1,30 @@
+package com.coderising.payroll.service;
+
+import java.util.Date;
+import java.util.List;
+
+import com.coderising.payroll.Employee;
+import com.coderising.payroll.Paycheck;
+
+public class PayrollService {
+	
+	public List<Employee> getAllEmployees(){
+		return null;
+	}
+	
+	public void savePayCheck(Paycheck pc){}
+	
+	public static void main(String[] args) {
+		PayrollService payrollService=new PayrollService();
+		Date date=new Date();
+		List<Employee> employees=payrollService.getAllEmployees();
+		for (Employee e : employees) {
+			if (e.isPayDay(date)) {
+				Paycheck pc=new Paycheck(e.getPayPeriodStartDate(date), date);
+				e.payDay(pc);
+				payrollService.savePayCheck(pc);
+			}
+		}
+		
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java b/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java
new file mode 100644
index 0000000000..607088f9ee
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java
@@ -0,0 +1,64 @@
+package com.coderising.payroll.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateUtil {
+	public static boolean isLasyDayOfMonth(Date date) {
+		Calendar b = Calendar.getInstance();
+		b.setTime(date);
+		int lastDay = b.getActualMaximum(Calendar.DAY_OF_MONTH);
+		int now = b.get(Calendar.DAY_OF_MONTH);
+		return now == lastDay;
+	}
+
+	public static Date getFirstDay(Date payPeriodEndDate) {
+		Calendar c = Calendar.getInstance();
+		c.add(Calendar.MONTH, 0);
+		c.set(Calendar.DAY_OF_MONTH, 1);
+		return c.getTime();
+	}
+
+	public static Date add(Date date, int num) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		c.add(Calendar.DATE, num);
+		return c.getTime();
+	}
+
+	public static Date parseDate(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date time = null;
+		try {
+			time = sdf.parse(date);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return time;
+	}
+
+	public static boolean isFriday(Date date) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		return c.get(Calendar.DAY_OF_WEEK) == 6;
+	}
+
+	public static int getDaysBetween(Date start, Date end) {
+		Calendar aCalendar = Calendar.getInstance();
+		aCalendar.setTime(end);
+
+		int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
+		aCalendar.setTime(start);
+
+		int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
+
+		return day1 - day2;
+	}
+	
+	public static boolean between(Date date,Date start,Date end){
+		return date.getTime()>=start.getTime()&&date.getTime()<=end.getTime();
+	}
+}

From b5f9d4892385c46aa9d5b5129e734bfe72b4672e Mon Sep 17 00:00:00 2001
From: sheng <1158154002@qq.com>
Date: Sun, 9 Jul 2017 10:35:34 +0800
Subject: [PATCH 322/332] Revert "payroll"

This reverts commit 5be0c63f09c5889380815534bee31a487c7e30ab.
---
 .../AddCommissionEmployeeTransaction.java     | 28 --------
 .../payroll/AddHourlyEmployeeTransaction.java | 27 --------
 .../AddSalariedEmployeeTransaction.java       | 27 --------
 .../com/coderising/payroll/BankMethod.java    | 15 -----
 .../coderising/payroll/BiWeeklySchedule.java  | 22 -------
 .../payroll/CommissionClassification.java     | 34 ----------
 .../java/com/coderising/payroll/Employee.java | 55 ----------------
 .../com/coderising/payroll/HoldMethod.java    | 12 ----
 .../payroll/HourlyClassification.java         | 42 ------------
 .../com/coderising/payroll/MailMethod.java    | 13 ----
 .../coderising/payroll/MonthlySchedule.java   | 20 ------
 .../coderising/payroll/NonAffiliation.java    | 12 ----
 .../java/com/coderising/payroll/Paycheck.java | 34 ----------
 .../payroll/SalariedClassification.java       | 18 ------
 .../com/coderising/payroll/SalesReceipt.java  | 14 ----
 .../com/coderising/payroll/ServiceCharge.java | 16 -----
 .../java/com/coderising/payroll/TimeCard.java | 15 -----
 .../coderising/payroll/UnionAffiliation.java  | 35 ----------
 .../coderising/payroll/WeeklySchedule.java    | 21 ------
 .../payroll/api/AddEmployeeTransaction.java   | 34 ----------
 .../coderising/payroll/api/Affiliation.java   |  7 --
 .../payroll/api/PaymentClassification.java    |  7 --
 .../coderising/payroll/api/PaymentMethod.java |  7 --
 .../payroll/api/PaymentSchedule.java          |  8 ---
 .../payroll/service/PayrollService.java       | 30 ---------
 .../com/coderising/payroll/util/DateUtil.java | 64 -------------------
 26 files changed, 617 deletions(-)
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/Employee.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
 delete mode 100644 students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java

diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
deleted file mode 100644
index 45b30ab31b..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.AddEmployeeTransaction;
-import com.coderising.payroll.api.Affiliation;
-import com.coderising.payroll.api.PaymentClassification;
-import com.coderising.payroll.api.PaymentMethod;
-import com.coderising.payroll.api.PaymentSchedule;
-
-public class AddCommissionEmployeeTransaction extends AddEmployeeTransaction{
-	private double rate;
-	private double salary;
-	public AddCommissionEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
-			Affiliation affiliation) {
-		super(name, address, paymentMethod, affiliation);
-		this.rate=rate;
-	}
-
-	@Override
-	public PaymentClassification getClassification() {
-		return new CommissionClassification(rate,salary);
-	}
-
-	@Override
-	public PaymentSchedule getSchedule() {
-		return new WeeklySchedule();
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
deleted file mode 100644
index c7b92eafd3..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.AddEmployeeTransaction;
-import com.coderising.payroll.api.Affiliation;
-import com.coderising.payroll.api.PaymentClassification;
-import com.coderising.payroll.api.PaymentMethod;
-import com.coderising.payroll.api.PaymentSchedule;
-
-public class AddHourlyEmployeeTransaction extends AddEmployeeTransaction{
-	private double rate;
-	public AddHourlyEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
-			Affiliation affiliation) {
-		super(name, address, paymentMethod, affiliation);
-		this.rate=rate;
-	}
-
-	@Override
-	public PaymentClassification getClassification() {
-		return new HourlyClassification(rate);
-	}
-
-	@Override
-	public PaymentSchedule getSchedule() {
-		return new WeeklySchedule();
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
deleted file mode 100644
index 4edfbd0d1e..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.AddEmployeeTransaction;
-import com.coderising.payroll.api.Affiliation;
-import com.coderising.payroll.api.PaymentClassification;
-import com.coderising.payroll.api.PaymentMethod;
-import com.coderising.payroll.api.PaymentSchedule;
-
-public class AddSalariedEmployeeTransaction extends AddEmployeeTransaction{
-	private double salary;
-	public AddSalariedEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
-			Affiliation affiliation) {
-		super(name, address, paymentMethod, affiliation);
-		this.salary=salary;
-	}
-
-	@Override
-	public PaymentClassification getClassification() {
-		return new SalariedClassification(salary);
-	}
-
-	@Override
-	public PaymentSchedule getSchedule() {
-		return new MonthlySchedule();
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
deleted file mode 100644
index 2a37417717..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.PaymentMethod;
-
-public class BankMethod implements PaymentMethod{
-	
-	private String bank;
-	private String account;
-	
-	@Override
-	public void pay(Paycheck pc) {
-		System.out.println("BankMethod");
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
deleted file mode 100644
index 39ab695425..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-import com.coderising.payroll.api.PaymentSchedule;
-import com.coderising.payroll.util.DateUtil;
-
-public class BiWeeklySchedule implements PaymentSchedule {
-	Date firstPayableFriday = DateUtil.parseDate("2017-06-02");
-
-	@Override
-	public boolean isPayDate(Date date) {
-		int interval = DateUtil.getDaysBetween(firstPayableFriday, date);
-		return interval % 14 == 0;
-	}
-
-	@Override
-	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
-		return DateUtil.add(payPeriodEndDate, -13);
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
deleted file mode 100644
index 758e5e8ba8..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-import java.util.Map;
-
-import com.coderising.payroll.api.PaymentClassification;
-import com.coderising.payroll.util.DateUtil;
-
-public class CommissionClassification implements PaymentClassification{
-	private double salary;
-	private double rate;
-	private Map<Date,SalesReceipt> receipts;
-	
-	public CommissionClassification(double rate, double salary) {
-		this.rate=rate;
-		this.salary=salary;
-	}
-	
-	public void addSalesReceipt(SalesReceipt sr) {
-		receipts.put(sr.getSaleDate(), sr);
-	}
-
-	@Override
-	public double calculatePay(Paycheck pc) {
-		double commission=0;
-		for (SalesReceipt sr : receipts.values()) {
-			if (DateUtil.between(sr.getSaleDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
-				commission+=sr.getAmount()*rate;
-			}
-		}
-		return salary+commission;
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/Employee.java b/students/1158154002/src/main/java/com/coderising/payroll/Employee.java
deleted file mode 100644
index 45f503ab4a..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/Employee.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-import com.coderising.payroll.api.Affiliation;
-import com.coderising.payroll.api.PaymentClassification;
-import com.coderising.payroll.api.PaymentMethod;
-import com.coderising.payroll.api.PaymentSchedule;
-
-public class Employee {
-	String id;
-	String name;
-	String address;
-	
-	Affiliation affiliation;
-	PaymentClassification classification;
-	PaymentSchedule schedule;
-	PaymentMethod paymentMethod;
-
-	public Employee(String name, String address){
-		this.name = name;
-		this.address = address;
-	}
-	public boolean isPayDay(Date d) {
-		return schedule.isPayDate(d);
-	}
-
-	public Date getPayPeriodStartDate(Date d) {
-		return schedule.getPayPeriodStartDate(d);
-	}
-
-	public void payDay(Paycheck pc){
-		 double grossPay=classification.calculatePay(pc);
-		 double deductions=affiliation.calculateDeductions(pc);
-		 double netPay=grossPay-deductions;
-		 pc.setGrossPay(grossPay);
-		 pc.setDeductions(deductions);
-		 pc.setNetPay(netPay);
-		 paymentMethod.pay(pc);
-	}
-	
-	public void setClassification(PaymentClassification classification) {
-		this.classification = classification;
-	}
-	public void setSchedule(PaymentSchedule schedule) {
-		this.schedule = schedule;
-	}
-	public void setPaymentMethod(PaymentMethod paymentMethod) {
-		this.paymentMethod = paymentMethod;
-	}
-	
-	public void setAffiliation(Affiliation affiliation) {
-		this.affiliation = affiliation;
-	}
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
deleted file mode 100644
index ec0892eb6a..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.PaymentMethod;
-
-public class HoldMethod implements PaymentMethod{
-
-	@Override
-	public void pay(Paycheck pc) {
-		System.out.println("HoldMethod");
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
deleted file mode 100644
index 6d61cae25e..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-import java.util.Map;
-
-import com.coderising.payroll.api.PaymentClassification;
-import com.coderising.payroll.util.DateUtil;
-
-public class HourlyClassification implements PaymentClassification {
-
-	private double rate;
-	private Map<Date, TimeCard> timeCards;
-
-	public HourlyClassification(double rate) {
-		this.rate=rate;
-	}
-	
-	public void addTimeCard(TimeCard tc) {
-		timeCards.put(tc.getDate(), tc);
-	}
-
-	@Override
-	public double calculatePay(Paycheck pc) {
-		double totalPay = 0;
-		for (TimeCard tc : timeCards.values()) {
-			if (DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
-				totalPay+=calculatePayForTimeCard(tc);	
-			}
-		}
-		return totalPay;
-	}
-
-	private double calculatePayForTimeCard(TimeCard tc) {
-		int hours = tc.getHours();
-		if (hours > 8) {
-			return 8 * rate + (hours - 8) * 1.5 * rate;
-		} else {
-			return 8 * rate;
-		}
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
deleted file mode 100644
index 8cbcf755e0..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.PaymentMethod;
-
-public class MailMethod implements PaymentMethod{
-	private String address;
-	
-	@Override
-	public void pay(Paycheck pc) {
-		System.out.println("MailMethod");
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
deleted file mode 100644
index 4b96edd28e..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-import com.coderising.payroll.api.PaymentSchedule;
-import com.coderising.payroll.util.DateUtil;
-
-public class MonthlySchedule implements PaymentSchedule{
-
-	@Override
-	public boolean isPayDate(Date date) {
-		return DateUtil.isLasyDayOfMonth(date);
-	}
-
-	@Override
-	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
-		return DateUtil.getFirstDay(payPeriodEndDate);
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
deleted file mode 100644
index ec8b6bc5a4..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.Affiliation;
-
-public class NonAffiliation implements Affiliation{
-
-	@Override
-	public double calculateDeductions(Paycheck pc) {
-		return 0;
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java b/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
deleted file mode 100644
index 5a7f0f87e0..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-public class Paycheck {
-	private Date payPeriodStart;
-	private Date payPeriodEnd;
-	private double grossPay;
-	private double netPay;
-	private double deductions;
-	
-	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
-		this.payPeriodStart = payPeriodStart;
-		this.payPeriodEnd = payPeriodEnd;
-	}
-	public void setGrossPay(double grossPay) {
-		this.grossPay = grossPay;
-		
-	}
-	public void setDeductions(double deductions) {
-		this.deductions  = deductions;		
-	}
-	public void setNetPay(double netPay){
-		this.netPay = netPay;
-	}
-	public Date getPayPeriodEndDate() {
-		
-		return this.payPeriodEnd;
-	}
-	public Date getPayPeriodStartDate() {
-		
-		return this.payPeriodStart;
-	}
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
deleted file mode 100644
index 8bc025e1d8..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.coderising.payroll;
-
-import com.coderising.payroll.api.PaymentClassification;
-
-public class SalariedClassification implements PaymentClassification{
-	private double salary;
-	
-	public SalariedClassification(double salary) {
-		this.salary=salary;
-	}
-
-	@Override
-	public double calculatePay(Paycheck pc) {
-		// TODO Auto-generated method stub
-		return salary;
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java b/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
deleted file mode 100644
index 25bbcd81bc..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-public class SalesReceipt {
-	private Date saleDate;
-	private double amount;
-	public Date getSaleDate() {
-		return saleDate;
-	}
-	public double getAmount() {
-		return amount;
-	}
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java b/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
deleted file mode 100644
index 58acbc3701..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-public class ServiceCharge {
-	private Date date;
-	private double amount;
-	
-	public Date getDate() {
-		return date;
-	}
-	
-	public double getAmount() {
-		return amount;
-	}
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java b/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
deleted file mode 100644
index 0ee88399c5..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-public class TimeCard {
-	private Date date;
-	private int hours;
-	
-	public Date getDate() {
-		return date;
-	}
-	public int getHours() {
-		return hours;
-	}
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
deleted file mode 100644
index 7505b585a8..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-import java.util.Map;
-
-import com.coderising.payroll.api.Affiliation;
-import com.coderising.payroll.util.DateUtil;
-
-public class UnionAffiliation implements Affiliation{
-	private String memberID;
-	private double weeklyDue;
-	private Map<Date, ServiceCharge> serviceCharges;
-	
-	public void addServiceCharge(ServiceCharge sc){
-		serviceCharges.put(sc.getDate(), sc);
-	}
-	
-	@Override
-	public double calculateDeductions(Paycheck pc) {
-		double totalPay = 0;
-		for (ServiceCharge sc : serviceCharges.values()) {
-			if (DateUtil.between(sc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
-				totalPay+=sc.getAmount();	
-			}
-		}
-		return totalPay+calculatePayForWeeklyDue(pc);
-	}
-
-	private double calculatePayForWeeklyDue(Paycheck pc) {
-		int interval=DateUtil.getDaysBetween( pc.getPayPeriodStartDate(),pc.getPayPeriodEndDate());
-		return interval/7*weeklyDue;
-	}
-
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
deleted file mode 100644
index 93e96d2412..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.coderising.payroll;
-
-import java.util.Date;
-
-import com.coderising.payroll.api.PaymentSchedule;
-import com.coderising.payroll.util.DateUtil;
-
-public class WeeklySchedule implements PaymentSchedule{
-
-	@Override
-	public boolean isPayDate(Date date) {
-		
-		return DateUtil.isFriday(date);
-	}
-
-	@Override
-	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
-		return DateUtil.add(payPeriodEndDate, -6);
-	}
-
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
deleted file mode 100644
index 8537092b94..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.coderising.payroll.api;
-
-import com.coderising.payroll.Employee;
-
-public abstract class AddEmployeeTransaction {
-	private String name;
-	private String address;
-	private PaymentMethod paymentMethod;
-	private Affiliation affiliation;
-
-	
-	public AddEmployeeTransaction(String name, String address, PaymentMethod paymentMethod, Affiliation affiliation) {
-		super();
-		this.name = name;
-		this.address = address;
-		this.paymentMethod = paymentMethod;
-		this.affiliation = affiliation;
-	}
-
-	public abstract PaymentClassification getClassification();
-	
-	public abstract PaymentSchedule getSchedule();
-	
-	public void execute(){
-		PaymentClassification pc=getClassification();
-		PaymentSchedule ps=getSchedule();
-		Employee e=new Employee(name, address);
-		e.setClassification(pc);
-		e.setSchedule(ps);
-		e.setPaymentMethod(paymentMethod);
-		e.setAffiliation(affiliation);
-	}
-	
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
deleted file mode 100644
index 9a28cd1c46..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.coderising.payroll.api;
-
-import com.coderising.payroll.Paycheck;
-
-public interface Affiliation {
-	public double calculateDeductions(Paycheck pc);
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
deleted file mode 100644
index 66e1c6704f..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.coderising.payroll.api;
-
-import com.coderising.payroll.Paycheck;
-
-public interface PaymentClassification {
-	public double calculatePay(Paycheck pc); 
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
deleted file mode 100644
index 2be20094b0..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.coderising.payroll.api;
-
-import com.coderising.payroll.Paycheck;
-
-public interface PaymentMethod {
-	public void pay(Paycheck pc);
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
deleted file mode 100644
index 520b6a2e98..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.coderising.payroll.api;
-
-import java.util.Date;
-
-public interface PaymentSchedule {
-	public boolean isPayDate(Date date);
-	public Date getPayPeriodStartDate( Date payPeriodEndDate);
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java b/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
deleted file mode 100644
index 07e3ff6c4d..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.coderising.payroll.service;
-
-import java.util.Date;
-import java.util.List;
-
-import com.coderising.payroll.Employee;
-import com.coderising.payroll.Paycheck;
-
-public class PayrollService {
-	
-	public List<Employee> getAllEmployees(){
-		return null;
-	}
-	
-	public void savePayCheck(Paycheck pc){}
-	
-	public static void main(String[] args) {
-		PayrollService payrollService=new PayrollService();
-		Date date=new Date();
-		List<Employee> employees=payrollService.getAllEmployees();
-		for (Employee e : employees) {
-			if (e.isPayDay(date)) {
-				Paycheck pc=new Paycheck(e.getPayPeriodStartDate(date), date);
-				e.payDay(pc);
-				payrollService.savePayCheck(pc);
-			}
-		}
-		
-	}
-}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java b/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java
deleted file mode 100644
index 607088f9ee..0000000000
--- a/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.coderising.payroll.util;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-
-public class DateUtil {
-	public static boolean isLasyDayOfMonth(Date date) {
-		Calendar b = Calendar.getInstance();
-		b.setTime(date);
-		int lastDay = b.getActualMaximum(Calendar.DAY_OF_MONTH);
-		int now = b.get(Calendar.DAY_OF_MONTH);
-		return now == lastDay;
-	}
-
-	public static Date getFirstDay(Date payPeriodEndDate) {
-		Calendar c = Calendar.getInstance();
-		c.add(Calendar.MONTH, 0);
-		c.set(Calendar.DAY_OF_MONTH, 1);
-		return c.getTime();
-	}
-
-	public static Date add(Date date, int num) {
-		Calendar c = Calendar.getInstance();
-		c.setTime(date);
-		c.add(Calendar.DATE, num);
-		return c.getTime();
-	}
-
-	public static Date parseDate(String date) {
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-		Date time = null;
-		try {
-			time = sdf.parse(date);
-		} catch (ParseException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return time;
-	}
-
-	public static boolean isFriday(Date date) {
-		Calendar c = Calendar.getInstance();
-		c.setTime(date);
-		return c.get(Calendar.DAY_OF_WEEK) == 6;
-	}
-
-	public static int getDaysBetween(Date start, Date end) {
-		Calendar aCalendar = Calendar.getInstance();
-		aCalendar.setTime(end);
-
-		int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
-		aCalendar.setTime(start);
-
-		int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
-
-		return day1 - day2;
-	}
-	
-	public static boolean between(Date date,Date start,Date end){
-		return date.getTime()>=start.getTime()&&date.getTime()<=end.getTime();
-	}
-}

From aba6c8605d0a97095ee312d2ba05de650c67b1ad Mon Sep 17 00:00:00 2001
From: sheng <1158154002@qq.com>
Date: Sun, 9 Jul 2017 10:55:23 +0800
Subject: [PATCH 323/332] payroll

---
 .../AddCommissionEmployeeTransaction.java     | 28 ++++++++
 .../payroll/AddEmployeeTransaction.java       | 37 +++++++++++
 .../payroll/AddHourlyEmployeeTransaction.java | 27 ++++++++
 .../AddSalariedEmployeeTransaction.java       | 27 ++++++++
 .../com/coderising/payroll/BankMethod.java    | 15 +++++
 .../coderising/payroll/BiWeeklySchedule.java  | 22 +++++++
 .../payroll/CommissionClassification.java     | 34 ++++++++++
 .../java/com/coderising/payroll/Employee.java | 55 ++++++++++++++++
 .../com/coderising/payroll/HoldMethod.java    | 12 ++++
 .../payroll/HourlyClassification.java         | 42 ++++++++++++
 .../com/coderising/payroll/MailMethod.java    | 13 ++++
 .../coderising/payroll/MonthlySchedule.java   | 20 ++++++
 .../coderising/payroll/NonAffiliation.java    | 12 ++++
 .../java/com/coderising/payroll/Paycheck.java | 34 ++++++++++
 .../payroll/SalariedClassification.java       | 18 +++++
 .../com/coderising/payroll/SalesReceipt.java  | 14 ++++
 .../com/coderising/payroll/ServiceCharge.java | 22 +++++++
 .../java/com/coderising/payroll/TimeCard.java | 15 +++++
 .../coderising/payroll/UnionAffiliation.java  | 35 ++++++++++
 .../coderising/payroll/WeeklySchedule.java    | 21 ++++++
 .../payroll/api/AddEmployeeTransaction.java   | 34 ++++++++++
 .../coderising/payroll/api/Affiliation.java   |  7 ++
 .../payroll/api/PaymentClassification.java    |  7 ++
 .../coderising/payroll/api/PaymentMethod.java |  7 ++
 .../payroll/api/PaymentSchedule.java          |  8 +++
 .../com/coderising/payroll/package-info.java  |  8 +++
 .../payroll/service/PayrollService.java       | 29 +++++++++
 .../com/coderising/payroll/util/DateUtil.java | 65 +++++++++++++++++++
 28 files changed, 668 insertions(+)
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/Employee.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/package-info.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
 create mode 100644 students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java

diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
new file mode 100644
index 0000000000..45b30ab31b
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddCommissionEmployeeTransaction.java
@@ -0,0 +1,28 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.AddEmployeeTransaction;
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class AddCommissionEmployeeTransaction extends AddEmployeeTransaction{
+	private double rate;
+	private double salary;
+	public AddCommissionEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
+			Affiliation affiliation) {
+		super(name, address, paymentMethod, affiliation);
+		this.rate=rate;
+	}
+
+	@Override
+	public PaymentClassification getClassification() {
+		return new CommissionClassification(rate,salary);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		return new WeeklySchedule();
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddEmployeeTransaction.java
new file mode 100644
index 0000000000..9a5ed30b31
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddEmployeeTransaction.java
@@ -0,0 +1,37 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public abstract class AddEmployeeTransaction {
+	private String name;
+	private String address;
+	private PaymentMethod paymentMethod;
+	private Affiliation affiliation;
+
+	
+	public AddEmployeeTransaction(String name, String address, PaymentMethod paymentMethod, Affiliation affiliation) {
+		super();
+		this.name = name;
+		this.address = address;
+		this.paymentMethod = paymentMethod;
+		this.affiliation = affiliation;
+	}
+
+	public abstract PaymentClassification getClassification();
+	
+	public abstract PaymentSchedule getSchedule();
+	
+	public void execute(){
+		PaymentClassification pc=getClassification();
+		PaymentSchedule ps=getSchedule();
+		Employee e=new Employee(name, address);
+		e.setClassification(pc);
+		e.setSchedule(ps);
+		e.setPaymentMethod(paymentMethod);
+		e.setAffiliation(affiliation);
+	}
+	
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
new file mode 100644
index 0000000000..c7b92eafd3
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddHourlyEmployeeTransaction.java
@@ -0,0 +1,27 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.AddEmployeeTransaction;
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class AddHourlyEmployeeTransaction extends AddEmployeeTransaction{
+	private double rate;
+	public AddHourlyEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
+			Affiliation affiliation) {
+		super(name, address, paymentMethod, affiliation);
+		this.rate=rate;
+	}
+
+	@Override
+	public PaymentClassification getClassification() {
+		return new HourlyClassification(rate);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		return new WeeklySchedule();
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
new file mode 100644
index 0000000000..4edfbd0d1e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/AddSalariedEmployeeTransaction.java
@@ -0,0 +1,27 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.AddEmployeeTransaction;
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class AddSalariedEmployeeTransaction extends AddEmployeeTransaction{
+	private double salary;
+	public AddSalariedEmployeeTransaction(String name, String address, PaymentMethod paymentMethod,
+			Affiliation affiliation) {
+		super(name, address, paymentMethod, affiliation);
+		this.salary=salary;
+	}
+
+	@Override
+	public PaymentClassification getClassification() {
+		return new SalariedClassification(salary);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		return new MonthlySchedule();
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
new file mode 100644
index 0000000000..2a37417717
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/BankMethod.java
@@ -0,0 +1,15 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentMethod;
+
+public class BankMethod implements PaymentMethod{
+	
+	private String bank;
+	private String account;
+	
+	@Override
+	public void pay(Paycheck pc) {
+		System.out.println("BankMethod");
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
new file mode 100644
index 0000000000..39ab695425
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/BiWeeklySchedule.java
@@ -0,0 +1,22 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class BiWeeklySchedule implements PaymentSchedule {
+	Date firstPayableFriday = DateUtil.parseDate("2017-06-02");
+
+	@Override
+	public boolean isPayDate(Date date) {
+		int interval = DateUtil.getDaysBetween(firstPayableFriday, date);
+		return interval % 14 == 0;
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.add(payPeriodEndDate, -13);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
new file mode 100644
index 0000000000..758e5e8ba8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/CommissionClassification.java
@@ -0,0 +1,34 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.util.DateUtil;
+
+public class CommissionClassification implements PaymentClassification{
+	private double salary;
+	private double rate;
+	private Map<Date,SalesReceipt> receipts;
+	
+	public CommissionClassification(double rate, double salary) {
+		this.rate=rate;
+		this.salary=salary;
+	}
+	
+	public void addSalesReceipt(SalesReceipt sr) {
+		receipts.put(sr.getSaleDate(), sr);
+	}
+
+	@Override
+	public double calculatePay(Paycheck pc) {
+		double commission=0;
+		for (SalesReceipt sr : receipts.values()) {
+			if (DateUtil.between(sr.getSaleDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				commission+=sr.getAmount()*rate;
+			}
+		}
+		return salary+commission;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/Employee.java b/students/1158154002/src/main/java/com/coderising/payroll/Employee.java
new file mode 100644
index 0000000000..45f503ab4a
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/Employee.java
@@ -0,0 +1,55 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.api.PaymentMethod;
+import com.coderising.payroll.api.PaymentSchedule;
+
+public class Employee {
+	String id;
+	String name;
+	String address;
+	
+	Affiliation affiliation;
+	PaymentClassification classification;
+	PaymentSchedule schedule;
+	PaymentMethod paymentMethod;
+
+	public Employee(String name, String address){
+		this.name = name;
+		this.address = address;
+	}
+	public boolean isPayDay(Date d) {
+		return schedule.isPayDate(d);
+	}
+
+	public Date getPayPeriodStartDate(Date d) {
+		return schedule.getPayPeriodStartDate(d);
+	}
+
+	public void payDay(Paycheck pc){
+		 double grossPay=classification.calculatePay(pc);
+		 double deductions=affiliation.calculateDeductions(pc);
+		 double netPay=grossPay-deductions;
+		 pc.setGrossPay(grossPay);
+		 pc.setDeductions(deductions);
+		 pc.setNetPay(netPay);
+		 paymentMethod.pay(pc);
+	}
+	
+	public void setClassification(PaymentClassification classification) {
+		this.classification = classification;
+	}
+	public void setSchedule(PaymentSchedule schedule) {
+		this.schedule = schedule;
+	}
+	public void setPaymentMethod(PaymentMethod paymentMethod) {
+		this.paymentMethod = paymentMethod;
+	}
+	
+	public void setAffiliation(Affiliation affiliation) {
+		this.affiliation = affiliation;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
new file mode 100644
index 0000000000..ec0892eb6a
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/HoldMethod.java
@@ -0,0 +1,12 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentMethod;
+
+public class HoldMethod implements PaymentMethod{
+
+	@Override
+	public void pay(Paycheck pc) {
+		System.out.println("HoldMethod");
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
new file mode 100644
index 0000000000..6d61cae25e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/HourlyClassification.java
@@ -0,0 +1,42 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.api.PaymentClassification;
+import com.coderising.payroll.util.DateUtil;
+
+public class HourlyClassification implements PaymentClassification {
+
+	private double rate;
+	private Map<Date, TimeCard> timeCards;
+
+	public HourlyClassification(double rate) {
+		this.rate=rate;
+	}
+	
+	public void addTimeCard(TimeCard tc) {
+		timeCards.put(tc.getDate(), tc);
+	}
+
+	@Override
+	public double calculatePay(Paycheck pc) {
+		double totalPay = 0;
+		for (TimeCard tc : timeCards.values()) {
+			if (DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				totalPay+=calculatePayForTimeCard(tc);	
+			}
+		}
+		return totalPay;
+	}
+
+	private double calculatePayForTimeCard(TimeCard tc) {
+		int hours = tc.getHours();
+		if (hours > 8) {
+			return 8 * rate + (hours - 8) * 1.5 * rate;
+		} else {
+			return 8 * rate;
+		}
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
new file mode 100644
index 0000000000..8cbcf755e0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/MailMethod.java
@@ -0,0 +1,13 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentMethod;
+
+public class MailMethod implements PaymentMethod{
+	private String address;
+	
+	@Override
+	public void pay(Paycheck pc) {
+		System.out.println("MailMethod");
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
new file mode 100644
index 0000000000..4b96edd28e
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/MonthlySchedule.java
@@ -0,0 +1,20 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class MonthlySchedule implements PaymentSchedule{
+
+	@Override
+	public boolean isPayDate(Date date) {
+		return DateUtil.isLasyDayOfMonth(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.getFirstDay(payPeriodEndDate);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
new file mode 100644
index 0000000000..ec8b6bc5a4
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/NonAffiliation.java
@@ -0,0 +1,12 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.Affiliation;
+
+public class NonAffiliation implements Affiliation{
+
+	@Override
+	public double calculateDeductions(Paycheck pc) {
+		return 0;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java b/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
new file mode 100644
index 0000000000..5a7f0f87e0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/Paycheck.java
@@ -0,0 +1,34 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class Paycheck {
+	private Date payPeriodStart;
+	private Date payPeriodEnd;
+	private double grossPay;
+	private double netPay;
+	private double deductions;
+	
+	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
+		this.payPeriodStart = payPeriodStart;
+		this.payPeriodEnd = payPeriodEnd;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+		
+	}
+	public void setDeductions(double deductions) {
+		this.deductions  = deductions;		
+	}
+	public void setNetPay(double netPay){
+		this.netPay = netPay;
+	}
+	public Date getPayPeriodEndDate() {
+		
+		return this.payPeriodEnd;
+	}
+	public Date getPayPeriodStartDate() {
+		
+		return this.payPeriodStart;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
new file mode 100644
index 0000000000..8bc025e1d8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/SalariedClassification.java
@@ -0,0 +1,18 @@
+package com.coderising.payroll;
+
+import com.coderising.payroll.api.PaymentClassification;
+
+public class SalariedClassification implements PaymentClassification{
+	private double salary;
+	
+	public SalariedClassification(double salary) {
+		this.salary=salary;
+	}
+
+	@Override
+	public double calculatePay(Paycheck pc) {
+		// TODO Auto-generated method stub
+		return salary;
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java b/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
new file mode 100644
index 0000000000..25bbcd81bc
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/SalesReceipt.java
@@ -0,0 +1,14 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date saleDate;
+	private double amount;
+	public Date getSaleDate() {
+		return saleDate;
+	}
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java b/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
new file mode 100644
index 0000000000..4630f71f17
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/ServiceCharge.java
@@ -0,0 +1,22 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class ServiceCharge {
+	private Date date;
+	private double amount;
+	public Date getDate() {
+		return date;
+	}
+	public void setDate(Date date) {
+		this.date = date;
+	}
+	public double getAmount() {
+		return amount;
+	}
+	public void setAmount(double amount) {
+		this.amount = amount;
+	}
+	
+	
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java b/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
new file mode 100644
index 0000000000..0ee88399c5
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/TimeCard.java
@@ -0,0 +1,15 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int hours;
+	
+	public Date getDate() {
+		return date;
+	}
+	public int getHours() {
+		return hours;
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
new file mode 100644
index 0000000000..7505b585a8
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/UnionAffiliation.java
@@ -0,0 +1,35 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.api.Affiliation;
+import com.coderising.payroll.util.DateUtil;
+
+public class UnionAffiliation implements Affiliation{
+	private String memberID;
+	private double weeklyDue;
+	private Map<Date, ServiceCharge> serviceCharges;
+	
+	public void addServiceCharge(ServiceCharge sc){
+		serviceCharges.put(sc.getDate(), sc);
+	}
+	
+	@Override
+	public double calculateDeductions(Paycheck pc) {
+		double totalPay = 0;
+		for (ServiceCharge sc : serviceCharges.values()) {
+			if (DateUtil.between(sc.getDate(), pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate())) {
+				totalPay+=sc.getAmount();	
+			}
+		}
+		return totalPay+calculatePayForWeeklyDue(pc);
+	}
+
+	private double calculatePayForWeeklyDue(Paycheck pc) {
+		int interval=DateUtil.getDaysBetween( pc.getPayPeriodStartDate(),pc.getPayPeriodEndDate());
+		return interval/7*weeklyDue;
+	}
+
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
new file mode 100644
index 0000000000..93e96d2412
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/WeeklySchedule.java
@@ -0,0 +1,21 @@
+package com.coderising.payroll;
+
+import java.util.Date;
+
+import com.coderising.payroll.api.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class WeeklySchedule implements PaymentSchedule{
+
+	@Override
+	public boolean isPayDate(Date date) {
+		
+		return DateUtil.isFriday(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.add(payPeriodEndDate, -6);
+	}
+
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java b/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
new file mode 100644
index 0000000000..8537092b94
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/AddEmployeeTransaction.java
@@ -0,0 +1,34 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Employee;
+
+public abstract class AddEmployeeTransaction {
+	private String name;
+	private String address;
+	private PaymentMethod paymentMethod;
+	private Affiliation affiliation;
+
+	
+	public AddEmployeeTransaction(String name, String address, PaymentMethod paymentMethod, Affiliation affiliation) {
+		super();
+		this.name = name;
+		this.address = address;
+		this.paymentMethod = paymentMethod;
+		this.affiliation = affiliation;
+	}
+
+	public abstract PaymentClassification getClassification();
+	
+	public abstract PaymentSchedule getSchedule();
+	
+	public void execute(){
+		PaymentClassification pc=getClassification();
+		PaymentSchedule ps=getSchedule();
+		Employee e=new Employee(name, address);
+		e.setClassification(pc);
+		e.setSchedule(ps);
+		e.setPaymentMethod(paymentMethod);
+		e.setAffiliation(affiliation);
+	}
+	
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java b/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
new file mode 100644
index 0000000000..9a28cd1c46
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/Affiliation.java
@@ -0,0 +1,7 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Paycheck;
+
+public interface Affiliation {
+	public double calculateDeductions(Paycheck pc);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
new file mode 100644
index 0000000000..66e1c6704f
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentClassification.java
@@ -0,0 +1,7 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Paycheck;
+
+public interface PaymentClassification {
+	public double calculatePay(Paycheck pc); 
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
new file mode 100644
index 0000000000..2be20094b0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentMethod.java
@@ -0,0 +1,7 @@
+package com.coderising.payroll.api;
+
+import com.coderising.payroll.Paycheck;
+
+public interface PaymentMethod {
+	public void pay(Paycheck pc);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
new file mode 100644
index 0000000000..520b6a2e98
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/api/PaymentSchedule.java
@@ -0,0 +1,8 @@
+package com.coderising.payroll.api;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+	public boolean isPayDate(Date date);
+	public Date getPayPeriodStartDate( Date payPeriodEndDate);
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/package-info.java b/students/1158154002/src/main/java/com/coderising/payroll/package-info.java
new file mode 100644
index 0000000000..149c6a9f42
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+/**
+ * @author Administrator
+ *
+ */
+package com.coderising.payroll;
\ No newline at end of file
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java b/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
new file mode 100644
index 0000000000..188bca74b0
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/service/PayrollService.java
@@ -0,0 +1,29 @@
+package com.coderising.payroll.service;
+
+import java.util.Date;
+import java.util.List;
+
+import com.coderising.payroll.Employee;
+import com.coderising.payroll.Paycheck;
+
+public class PayrollService {
+	public List<Employee> getAllEmployees(){
+		return null;
+	}
+	
+	public void savePayCheck(Paycheck pc){}
+	
+	public static void main(String[] args) {
+		PayrollService payrollService=new PayrollService();
+		Date date=new Date();
+		List<Employee> employees=payrollService.getAllEmployees();
+		for (Employee e : employees) {
+			if (e.isPayDay(date)) {
+				Paycheck pc=new Paycheck(e.getPayPeriodStartDate(date), date);
+				e.payDay(pc);
+				payrollService.savePayCheck(pc);
+			}
+		}
+		
+	}
+}
diff --git a/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java b/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java
new file mode 100644
index 0000000000..f2a3269b63
--- /dev/null
+++ b/students/1158154002/src/main/java/com/coderising/payroll/util/DateUtil.java
@@ -0,0 +1,65 @@
+package com.coderising.payroll.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateUtil {
+	public static boolean isLasyDayOfMonth(Date date) {
+		Calendar b = Calendar.getInstance();
+		b.setTime(date);
+		int lastDay = b.getActualMaximum(Calendar.DAY_OF_MONTH);
+		int now = b.get(Calendar.DAY_OF_MONTH);
+		return now == lastDay;
+	}
+
+	public static Date getFirstDay(Date payPeriodEndDate) {
+		Calendar c = Calendar.getInstance();
+		c.add(Calendar.MONTH, 0);
+		c.set(Calendar.DAY_OF_MONTH, 1);
+		return c.getTime();
+	}
+
+	public static Date add(Date date, int num) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		c.add(Calendar.DATE, num);
+		return c.getTime();
+	}
+
+	public static Date parseDate(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date time = null;
+		try {
+			time = sdf.parse(date);
+		} catch (ParseException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return time;
+	}
+
+	public static boolean isFriday(Date date) {
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		return c.get(Calendar.DAY_OF_WEEK) == 6;
+	}
+
+	public static int getDaysBetween(Date start, Date end) {
+		Calendar aCalendar = Calendar.getInstance();
+		aCalendar.setTime(end);
+
+		int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
+		aCalendar.setTime(start);
+
+		int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
+
+		return day1 - day2;
+	}
+
+	public static boolean between(Date saleDate, Date payPeriodStartDate, Date payPeriodEndDate) {
+		
+		return saleDate.getTime()>=payPeriodStartDate.getTime()&&saleDate.getTime()<=payPeriodEndDate.getTime();
+	}
+}

From c5cdc2183a0cb1a527f52563905989d7139bb41f Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 10 Jul 2017 15:23:37 +0800
Subject: [PATCH 324/332] payroll code

---
 .../payroll/affiliation/NonAffiliation.java   | 10 ++++
 .../payroll/affiliation/UnionAffiliation.java | 14 +++++
 .../CommissionedClassification.java           | 31 ++++++++++
 .../classification/HourlyClassification.java  | 43 ++++++++++++++
 .../SalariedClassification.java               | 16 ++++++
 .../payroll/{ => domain}/Affiliation.java     |  2 +-
 .../payroll/{ => domain}/Employee.java        | 14 +++--
 .../coderising/payroll/domain/HoldMethod.java | 11 ++++
 .../payroll/{ => domain}/Paycheck.java        |  4 +-
 .../payroll/domain/PaydayTransaction.java     | 21 +++++++
 .../{ => domain}/PaymentClassification.java   |  2 +-
 .../payroll/{ => domain}/PaymentMethod.java   |  2 +-
 .../payroll/{ => domain}/PaymentSchedule.java |  2 +-
 .../payroll/domain/PayrollService.java        | 46 +++++++++++++++
 .../payroll/{ => domain}/SalesReceipt.java    |  2 +-
 .../payroll/{ => domain}/TimeCard.java        |  2 +-
 .../payroll/schedule/BiweeklySchedule.java    | 38 +++++++++++++
 .../payroll/schedule/MonthlySchedule.java     | 20 +++++++
 .../payroll/schedule/WeeklySchedule.java      | 19 +++++++
 .../com/coderising/payroll/util/DateUtil.java | 56 +++++++++++++++++++
 .../transaction/AddEmployeeTransaction.java   | 29 ++++++++++
 .../AddHourlyEmployeeTransaction.java         | 25 +++++++++
 22 files changed, 397 insertions(+), 12 deletions(-)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/NonAffiliation.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/UnionAffiliation.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/CommissionedClassification.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/HourlyClassification.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/SalariedClassification.java
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/Affiliation.java (68%)
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/Employee.java (65%)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/HoldMethod.java
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/Paycheck.java (90%)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/PaymentClassification.java (69%)
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/PaymentMethod.java (63%)
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/PaymentSchedule.java (80%)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/SalesReceipt.java (83%)
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{ => domain}/TimeCard.java (82%)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/BiweeklySchedule.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/MonthlySchedule.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/WeeklySchedule.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/util/DateUtil.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/NonAffiliation.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/NonAffiliation.java
new file mode 100644
index 0000000000..3cb6228aa4
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/NonAffiliation.java
@@ -0,0 +1,10 @@
+package com.coderising.payroll.affiliation;
+
+import com.coderising.payroll.domain.Affiliation;
+import com.coderising.payroll.domain.Paycheck;
+
+public class NonAffiliation implements Affiliation{
+	public double calculateDeductions(Paycheck pc){
+		return 0.0;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/UnionAffiliation.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/UnionAffiliation.java
new file mode 100644
index 0000000000..bbce4fa317
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/affiliation/UnionAffiliation.java
@@ -0,0 +1,14 @@
+package com.coderising.payroll.affiliation;
+
+import com.coderising.payroll.domain.Affiliation;
+import com.coderising.payroll.domain.Paycheck;
+
+public class UnionAffiliation implements Affiliation {
+
+	@Override
+	public double calculateDeductions(Paycheck pc) {
+		
+		return 0;
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/CommissionedClassification.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/CommissionedClassification.java
new file mode 100644
index 0000000000..f6a7ab4a63
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/CommissionedClassification.java
@@ -0,0 +1,31 @@
+package com.coderising.payroll.classification;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.domain.Paycheck;
+import com.coderising.payroll.domain.PaymentClassification;
+import com.coderising.payroll.domain.SalesReceipt;
+import com.coderising.payroll.util.DateUtil;
+
+public class CommissionedClassification implements PaymentClassification {
+	double salary;
+	double rate;
+	public CommissionedClassification(double salary , double rate){
+		this.salary = salary;
+		this.rate = rate;
+	}
+	Map<Date, SalesReceipt> receipts;
+	@Override
+	public double calculatePay(Paycheck pc) {
+		double commission = 0.0;
+		for(SalesReceipt sr : receipts.values()){
+			if(DateUtil.between(sr.getSaleDate(), pc.getPayPeriodStartDate(), 
+					pc.getPayPeriodEndDate())){
+				commission += sr.getAmount() * rate;
+			}
+		}
+		return salary + commission;
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/HourlyClassification.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/HourlyClassification.java
new file mode 100644
index 0000000000..1238ac84a6
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/HourlyClassification.java
@@ -0,0 +1,43 @@
+package com.coderising.payroll.classification;
+
+import java.util.Date;
+import java.util.Map;
+
+import com.coderising.payroll.domain.Paycheck;
+import com.coderising.payroll.domain.PaymentClassification;
+import com.coderising.payroll.domain.TimeCard;
+import com.coderising.payroll.util.DateUtil;
+
+public class HourlyClassification implements PaymentClassification {
+	private double rate;
+	private Map<Date, TimeCard> timeCards;
+	
+	public HourlyClassification(double hourlyRate) {
+		this.rate = hourlyRate;
+	}
+	public void addTimeCard(TimeCard tc){
+		timeCards.put(tc.getDate(), tc);
+	}
+	@Override
+	public double calculatePay(Paycheck pc) {
+		double totalPay = 0;
+		for(TimeCard tc : timeCards.values()){
+			if(DateUtil.between(tc.getDate(), pc.getPayPeriodStartDate(), 
+					pc.getPayPeriodEndDate())){
+				totalPay += calculatePayForTimeCard(tc);
+			}
+		}		
+		return totalPay;
+		
+	}
+	private double calculatePayForTimeCard(TimeCard  tc) {
+	    int hours = tc.getHours();
+	    
+	    if(hours > 8){
+	    	return 8*rate + (hours-8) * rate * 1.5;
+	    } else{
+	    	return 8*rate;
+	    }
+	}
+}
+
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/SalariedClassification.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/SalariedClassification.java
new file mode 100644
index 0000000000..796aae93f1
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/classification/SalariedClassification.java
@@ -0,0 +1,16 @@
+package com.coderising.payroll.classification;
+
+import com.coderising.payroll.domain.Paycheck;
+import com.coderising.payroll.domain.PaymentClassification;
+
+public class SalariedClassification implements PaymentClassification {
+	private double salary;
+	public SalariedClassification(double salary){
+		this.salary = salary;
+	}
+	@Override
+	public double calculatePay(Paycheck pc) {		
+		return salary;
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Affiliation.java
similarity index 68%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Affiliation.java
index 091165a2af..74a6b404bc 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Affiliation.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Affiliation.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 public interface Affiliation {
 	public double calculateDeductions(Paycheck pc);
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java
similarity index 65%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java
index 923297c91a..9eb9af15f3 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Employee.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 import java.util.Date;
 
@@ -18,15 +18,21 @@ public Employee(String name, String address){
 		this.address = address;
 	}
 	public boolean isPayDay(Date d) {
-		return false;
+		return this.schedule.isPayDate(d);
 	}
 
 	public Date getPayPeriodStartDate(Date d) {
-		return null;
+		return this.schedule.getPayPeriodStartDate(d);
 	}
 
 	public void payDay(Paycheck pc){
-		 
+		 double grossPay = classification.calculatePay(pc);
+		 double deductions = affiliation.calculateDeductions(pc);
+		 double netPay = grossPay - deductions;
+		 pc.setGrossPay(grossPay);
+		 pc.setDeductions(deductions);
+		 pc.setNetPay(netPay);
+		 paymentMethod.pay(pc);
 	}
 	
 	public void setClassification(PaymentClassification classification) {
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/HoldMethod.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/HoldMethod.java
new file mode 100644
index 0000000000..0ce19e2291
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/HoldMethod.java
@@ -0,0 +1,11 @@
+package com.coderising.payroll.domain;
+
+public class HoldMethod implements PaymentMethod {
+
+	@Override
+	public void pay(Paycheck pc) {
+		
+
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Paycheck.java
similarity index 90%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Paycheck.java
index 802c8b5c45..6f1ff99413 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/Paycheck.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Paycheck.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 import java.util.Date;
 import java.util.Map;
@@ -9,7 +9,7 @@ public class Paycheck {
 	private double grossPay;
 	private double netPay;
 	private double deductions;
-	
+	private Map<String, String> itsFields;
 	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
 		this.payPeriodStart = payPeriodStart;
 		this.payPeriodEnd = payPeriodEnd;
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java
new file mode 100644
index 0000000000..2774b16b69
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java
@@ -0,0 +1,21 @@
+package com.coderising.payroll.domain;
+
+import java.util.Date;
+import java.util.List;
+
+public class PaydayTransaction {
+	private Date date;
+	private PayrollService payrollService;
+	
+	public void execute(){
+		List<Employee> employees = payrollService.getAllEmployees();
+		for(Employee e : employees){
+			if(e.isPayDay(date)){
+				Paycheck pc = new Paycheck(e.getPayPeriodStartDate(date),date);
+				e.payDay(pc);
+				payrollService.savePaycheck(pc);
+			}
+		}
+	}
+}
+
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentClassification.java
similarity index 69%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentClassification.java
index f2bf2e26e9..b6f2120bdb 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentClassification.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentClassification.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 public interface PaymentClassification {
 	public double calculatePay(Paycheck pc); 
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentMethod.java
similarity index 63%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentMethod.java
index 5e549916b6..f07cc5354b 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentMethod.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentMethod.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 public interface PaymentMethod {
 	public void pay(Paycheck pc);
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentSchedule.java
similarity index 80%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentSchedule.java
index 500d72404d..96788f4f80 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PaymentSchedule.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaymentSchedule.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 import java.util.Date;
 
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java
new file mode 100644
index 0000000000..a6d244bbe0
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java
@@ -0,0 +1,46 @@
+package com.coderising.payroll.domain;
+
+import java.util.List;
+
+import com.coderising.payroll.classification.CommissionedClassification;
+import com.coderising.payroll.classification.HourlyClassification;
+import com.coderising.payroll.classification.SalariedClassification;
+import com.coderising.payroll.schedule.BiweeklySchedule;
+import com.coderising.payroll.schedule.MonthlySchedule;
+import com.coderising.payroll.schedule.WeeklySchedule;
+
+public class PayrollService {
+	public   List<Employee> getAllEmployees(){
+		return null;
+	}
+	public void savePaycheck(Paycheck pc){
+		
+	}
+	
+	public Employee addHourlyEmployee(String name, String address, double hourlyRate){
+		Employee e = new Employee(name, address);	
+		e.setClassification(new HourlyClassification(hourlyRate));		
+		e.setSchedule(new WeeklySchedule());	
+		e.setPaymentMethod(new HoldMethod());
+		//保存员工到数据库.. 略		
+		return e;		
+	}
+	
+	public Employee addSalariedEmployee(String name, String address, double salary){
+		Employee e = new Employee(name, address);		
+		e.setClassification(new SalariedClassification(salary));		
+		e.setSchedule(new MonthlySchedule());	
+		e.setPaymentMethod(new HoldMethod());
+		//保存员工到数据库.. 略		
+		return e;	
+	}
+	
+	public Employee addCommissionedEmployee(String name, String address, double salary, double saleRate){
+		Employee e = new Employee(name, address);		
+		e.setClassification(new CommissionedClassification(salary, saleRate));		
+		e.setSchedule(new BiweeklySchedule());		
+		e.setPaymentMethod(new HoldMethod());
+		//保存员工到数据库.. 略		
+		return e;	
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/SalesReceipt.java
similarity index 83%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/SalesReceipt.java
index fcd3b506fc..a7b0ba41ad 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/SalesReceipt.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/SalesReceipt.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 import java.util.Date;
 
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/TimeCard.java
similarity index 82%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/TimeCard.java
index 735cc17ac1..ebf6e17a4c 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/TimeCard.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/TimeCard.java
@@ -1,4 +1,4 @@
-package com.coderising.payroll;
+package com.coderising.payroll.domain;
 
 import java.util.Date;
 
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/BiweeklySchedule.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/BiweeklySchedule.java
new file mode 100644
index 0000000000..35ec65c49c
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/BiweeklySchedule.java
@@ -0,0 +1,38 @@
+package com.coderising.payroll.schedule;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.coderising.payroll.domain.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class BiweeklySchedule implements PaymentSchedule {
+	Date firstPayableFriday = DateUtil.parseDate("2017-6-2");
+	
+	@Override
+	public boolean isPayDate(Date date) {
+		
+		long interval = DateUtil.getDaysBetween(firstPayableFriday, date);
+		return interval % 14 == 0;
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+		return DateUtil.add(payPeriodEndDate, -13);
+		
+	}
+	
+	public static void main(String [] args) throws Exception{
+		BiweeklySchedule schedule = new BiweeklySchedule();
+		
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
+		Date d = sdf.parse("2017-06-30");
+		
+		System.out.println(schedule.isPayDate(d));
+		
+		System.out.println(DateUtil.isFriday(d));		
+		
+		System.out.println(schedule.getPayPeriodStartDate(d));
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/MonthlySchedule.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/MonthlySchedule.java
new file mode 100644
index 0000000000..dbbe732d2f
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/MonthlySchedule.java
@@ -0,0 +1,20 @@
+package com.coderising.payroll.schedule;
+
+import java.util.Date;
+
+import com.coderising.payroll.domain.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class MonthlySchedule implements PaymentSchedule {
+
+	@Override
+	public boolean isPayDate(Date date) {		
+		return DateUtil.isLastDayOfMonth(date);
+	}
+
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {		
+		return DateUtil.getFirstDay(payPeriodEndDate);
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/WeeklySchedule.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/WeeklySchedule.java
new file mode 100644
index 0000000000..54a22ab7db
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/schedule/WeeklySchedule.java
@@ -0,0 +1,19 @@
+package com.coderising.payroll.schedule;
+
+import java.util.Date;
+
+import com.coderising.payroll.domain.PaymentSchedule;
+import com.coderising.payroll.util.DateUtil;
+
+public class WeeklySchedule implements PaymentSchedule {
+
+	@Override
+	public boolean isPayDate(Date date) {		
+		return DateUtil.isFriday(date);
+	}
+	@Override
+	public Date getPayPeriodStartDate(Date payPeriodEndDate) {		
+		return DateUtil.add(payPeriodEndDate, -6);
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/util/DateUtil.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/util/DateUtil.java
new file mode 100644
index 0000000000..ffc26f31a1
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/util/DateUtil.java
@@ -0,0 +1,56 @@
+package com.coderising.payroll.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateUtil {
+	public static long getDaysBetween(Date d1, Date d2){
+		
+		return (d2.getTime() - d1.getTime())/(24*60*60*1000);		
+	}
+	
+	public static Date parseDate(String txtDate){
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");		
+		try {
+			return  sdf.parse(txtDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+			return null;
+		}		
+	}
+	public static boolean isFriday(Date d){
+		 Calendar   calendar   =   Calendar.getInstance();    
+         return calendar.get(Calendar.DAY_OF_WEEK) == 5;    
+	}
+	
+	public static Date add(Date d, int days){
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(d);
+		calendar.add(Calendar.DATE, days);
+		return calendar.getTime();
+	}
+	
+	public static boolean isLastDayOfMonth(Date d){
+		Calendar calendar=Calendar.getInstance();
+		calendar.setTime(d);
+        return calendar.get(Calendar.DATE)==calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+	}
+	public static Date getFirstDay(Date d){
+		Calendar calendar=Calendar.getInstance();
+		calendar.setTime(d);
+		int day = calendar.get(Calendar.DATE);
+		calendar.add(Calendar.DATE, -(day-1));
+		return calendar.getTime();
+	}
+	public static void main(String [] args) throws Exception{
+		System.out.println(DateUtil.isLastDayOfMonth(DateUtil.parseDate("2017-6-29")));
+		
+		System.out.println(DateUtil.getFirstDay(DateUtil.parseDate("2017-6-30")));
+	}
+	
+	public static boolean between(Date d, Date date1, Date date2){
+		return d.after(date1) && d.before(date2);
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java b/liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java
new file mode 100644
index 0000000000..944f0deb78
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java
@@ -0,0 +1,29 @@
+package transaction;
+
+import com.coderising.payroll.domain.Employee;
+import com.coderising.payroll.domain.HoldMethod;
+import com.coderising.payroll.domain.PaymentClassification;
+import com.coderising.payroll.domain.PaymentMethod;
+import com.coderising.payroll.domain.PaymentSchedule;
+
+public abstract class AddEmployeeTransaction {
+	private String name;
+	private String address;
+	public AddEmployeeTransaction(String name,String address){
+		this.name = name;
+		this.address = address;
+	}
+	public abstract PaymentClassification getClassification();
+	public abstract PaymentSchedule getSchedule();
+	
+	public void execute(){
+		PaymentClassification pc = getClassification();
+		PaymentSchedule ps = getSchedule();
+		PaymentMethod  pm = new HoldMethod();
+		Employee  e = new Employee(name, address);
+		e.setClassification(pc);
+		e.setSchedule(ps);
+		e.setPaymentMethod(pm);		
+		//保存到数据库, 略
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java b/liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java
new file mode 100644
index 0000000000..1c0ab3c57b
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java
@@ -0,0 +1,25 @@
+package transaction;
+
+import com.coderising.payroll.classification.HourlyClassification;
+import com.coderising.payroll.domain.PaymentClassification;
+import com.coderising.payroll.domain.PaymentSchedule;
+import com.coderising.payroll.schedule.WeeklySchedule;
+
+public class AddHourlyEmployeeTransaction extends AddEmployeeTransaction{
+	private double rate;
+	AddHourlyEmployeeTransaction(String name, String address, double hourlyRate) {
+		super(name, address);
+		this.rate = hourlyRate;
+	}
+	@Override
+	public PaymentClassification getClassification() {		
+		return new HourlyClassification(rate);
+	}
+
+	@Override
+	public PaymentSchedule getSchedule() {
+		
+		return new WeeklySchedule();
+	}	
+}
+

From 323a02aa6dd75df1b2e6e53f48f69bb76dc312a7 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 10 Jul 2017 15:26:10 +0800
Subject: [PATCH 325/332] payroll code

---
 .../coderising/payroll}/transaction/AddEmployeeTransaction.java | 2 +-
 .../payroll}/transaction/AddHourlyEmployeeTransaction.java      | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
 rename liuxin/ood/ood-assignment/src/main/java/{ => com/coderising/payroll}/transaction/AddEmployeeTransaction.java (95%)
 rename liuxin/ood/ood-assignment/src/main/java/{ => com/coderising/payroll}/transaction/AddHourlyEmployeeTransaction.java (93%)

diff --git a/liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/transaction/AddEmployeeTransaction.java
similarity index 95%
rename from liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/transaction/AddEmployeeTransaction.java
index 944f0deb78..39b268486b 100644
--- a/liuxin/ood/ood-assignment/src/main/java/transaction/AddEmployeeTransaction.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/transaction/AddEmployeeTransaction.java
@@ -1,4 +1,4 @@
-package transaction;
+package com.coderising.payroll.transaction;
 
 import com.coderising.payroll.domain.Employee;
 import com.coderising.payroll.domain.HoldMethod;
diff --git a/liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/transaction/AddHourlyEmployeeTransaction.java
similarity index 93%
rename from liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/transaction/AddHourlyEmployeeTransaction.java
index 1c0ab3c57b..2039734479 100644
--- a/liuxin/ood/ood-assignment/src/main/java/transaction/AddHourlyEmployeeTransaction.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/transaction/AddHourlyEmployeeTransaction.java
@@ -1,4 +1,4 @@
-package transaction;
+package com.coderising.payroll.transaction;
 
 import com.coderising.payroll.classification.HourlyClassification;
 import com.coderising.payroll.domain.PaymentClassification;

From 22d8938cccf95b0bf770f3cd836535ec0e9036ec Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 10 Jul 2017 15:27:24 +0800
Subject: [PATCH 326/332] paroll code

---
 .../com/coderising/payroll/{domain => }/PayrollService.java  | 5 ++++-
 .../com/coderising/payroll/domain/PaydayTransaction.java     | 2 ++
 2 files changed, 6 insertions(+), 1 deletion(-)
 rename liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/{domain => }/PayrollService.java (89%)

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PayrollService.java
similarity index 89%
rename from liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java
rename to liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PayrollService.java
index a6d244bbe0..b0b4fec82f 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PayrollService.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/PayrollService.java
@@ -1,10 +1,13 @@
-package com.coderising.payroll.domain;
+package com.coderising.payroll;
 
 import java.util.List;
 
 import com.coderising.payroll.classification.CommissionedClassification;
 import com.coderising.payroll.classification.HourlyClassification;
 import com.coderising.payroll.classification.SalariedClassification;
+import com.coderising.payroll.domain.Employee;
+import com.coderising.payroll.domain.HoldMethod;
+import com.coderising.payroll.domain.Paycheck;
 import com.coderising.payroll.schedule.BiweeklySchedule;
 import com.coderising.payroll.schedule.MonthlySchedule;
 import com.coderising.payroll.schedule.WeeklySchedule;
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java
index 2774b16b69..e066e46263 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/PaydayTransaction.java
@@ -3,6 +3,8 @@
 import java.util.Date;
 import java.util.List;
 
+import com.coderising.payroll.PayrollService;
+
 public class PaydayTransaction {
 	private Date date;
 	private PayrollService payrollService;

From 3aa27a392f54d440c342abb80a69a66719011946 Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 10 Jul 2017 16:05:38 +0800
Subject: [PATCH 327/332] payroll code

---
 .../com/coderising/dp/builder/TagBuilder.java | 37 +++++++++
 .../coderising/dp/builder/TagBuilderTest.java | 40 +++++++++
 .../com/coderising/dp/builder/TagNode.java    | 82 +++++++++++++++++++
 .../com/coderising/dp/decorator/Email.java    |  6 ++
 .../dp/decorator/EmailDecorator.java          |  5 ++
 .../coderising/dp/decorator/EmailImpl.java    | 12 +++
 .../coderising/ood/srp/good1/MailSender.java  |  1 +
 .../coderising/ood/srp/product_promotion.txt  |  5 ++
 .../coderising/payroll/domain/Employee.java   | 14 ++--
 9 files changed, 195 insertions(+), 7 deletions(-)
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilderTest.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/Email.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailDecorator.java
 create mode 100644 liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailImpl.java

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java
new file mode 100644
index 0000000000..daa431f139
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java
@@ -0,0 +1,37 @@
+package com.coderising.dp.builder;
+
+public class TagBuilder {
+	private TagNode rootNode;
+	private TagNode currentNode;
+	private TagNode parentNode;
+	public TagBuilder(String rootTagName){
+		rootNode = new TagNode(rootTagName);
+		currentNode = rootNode;
+		parentNode = null;
+	}
+	
+	public TagBuilder addChild(String childTagName){
+		parentNode = this.currentNode;
+		this.currentNode = new TagNode(childTagName);
+		parentNode.add(currentNode);
+		return this;
+	}
+	public TagBuilder addSibling(String siblingTagName){
+	
+		this.currentNode = new TagNode(siblingTagName);
+		parentNode.add(this.currentNode);
+		return this;
+		
+	}
+	public TagBuilder setAttribute(String name, String value){
+		this.currentNode.setAttribute(name, value);
+		return this;
+	}
+	public TagBuilder setText(String value){
+		this.currentNode.setValue(value);
+		return this;
+	}
+	public String toXML(){
+		return this.rootNode.toXML();
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilderTest.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilderTest.java
new file mode 100644
index 0000000000..e30d20285b
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilderTest.java
@@ -0,0 +1,40 @@
+package com.coderising.dp.builder;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TagBuilderTest {
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testToXML() {
+		
+		TagBuilder builder = new TagBuilder("order");
+		
+		String xml = builder.addChild("line-items")
+			.addChild("line-item").setAttribute("pid", "P3677").setAttribute("qty", "3")
+			.addSibling("line-item").setAttribute("pid", "P9877").setAttribute("qty", "10")
+			.toXML();
+		
+		String expected = "<order>"
+				+ "<line-items>"
+				+ "<line-item pid=\"P3677\" qty=\"3\"/>"
+				+ "<line-item pid=\"P9877\" qty=\"10\"/>"
+				+ "</line-items>"
+				+ "</order>";
+		
+		System.out.println(xml);
+		assertEquals(expected, xml);
+	}
+
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java
new file mode 100644
index 0000000000..7763ee9d0a
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagNode.java
@@ -0,0 +1,82 @@
+package com.coderising.dp.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TagNode {
+	private String tagName;	
+	private String tagValue;
+	private List<TagNode> children = new ArrayList<>();	
+	private List<Attribute> attributes = new ArrayList<>();
+	
+	public TagNode(String name){
+		this.tagName = name;
+	}
+	public void add(TagNode child){
+		this.children.add(child);
+	}
+	public void setAttribute(String name, String value) {
+		Attribute attr = findAttribute(name);
+		if(attr != null){
+			attr.value = value;
+		}
+		
+		attributes.add(new Attribute(name,value));
+	}
+	private Attribute findAttribute(String name){
+		for(Attribute attr : attributes){
+			if(attr.name.equals(name)){
+				return attr;
+			}
+		}
+		return null;
+	}
+	public void setValue(String value) {
+		this.tagValue = value;
+		
+	}
+	public String getTagName() {
+		return tagName;
+	}
+	public List<TagNode> getChildren() {
+		return children;
+	}
+	
+	private static class Attribute{
+		public Attribute(String name, String value) {
+			this.name = name;
+			this.value = value;
+		}
+		String name;
+		String value;
+		
+	}
+	public String toXML(){
+		return toXML(this);
+	}
+	private String toXML(TagNode node){
+		StringBuilder buffer = new StringBuilder();
+		buffer.append("<").append(node.tagName);
+		if(node.attributes.size()> 0){
+			for(int i=0;i<node.attributes.size();i++){
+				Attribute attr = node.attributes.get(i);
+				buffer.append(" ").append(toXML(attr));				
+			}
+		}
+		if(node.children.size()== 0){
+			buffer.append("/>");
+			return buffer.toString();
+		}
+		buffer.append(">");		
+		for(TagNode childNode : node.children){
+			buffer.append(toXML(childNode));
+		}
+		buffer.append("</").append(node.tagName).append(">");
+		
+		
+		return buffer.toString();
+	}
+	private String toXML(Attribute attr){
+		return attr.name+"=\""+attr.value + "\"";
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/Email.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/Email.java
new file mode 100644
index 0000000000..064de1e837
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/Email.java
@@ -0,0 +1,6 @@
+package com.coderising.dp.decorator;
+
+public interface Email {
+	public String getContent();
+}
+
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailDecorator.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailDecorator.java
new file mode 100644
index 0000000000..d5379b0dd9
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailDecorator.java
@@ -0,0 +1,5 @@
+package com.coderising.dp.decorator;
+
+public abstract class EmailDecorator implements Email{
+	
+}
\ No newline at end of file
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailImpl.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailImpl.java
new file mode 100644
index 0000000000..640aef6da3
--- /dev/null
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/decorator/EmailImpl.java
@@ -0,0 +1,12 @@
+package com.coderising.dp.decorator;
+
+public class EmailImpl implements Email {
+	private String content;
+
+	public EmailImpl(String content) {
+		this.content = content;
+	}
+	public String getContent()   {
+		return content;
+	}
+}
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
index 0503d1a88b..ffd0543e22 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/good1/MailSender.java
@@ -1,5 +1,6 @@
 package com.coderising.ood.srp.good1;
 
+
 public class MailSender {
 	
 	private String fromAddress ;
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
index 0c0124cc61..618f02b102 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
@@ -1,3 +1,8 @@
+
+
+
+
+
 P8756 iPhone8
 P3946 XiaoMi10
 P8904 Oppo_R15
diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java
index 9eb9af15f3..204180a672 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/payroll/domain/Employee.java
@@ -3,15 +3,15 @@
 import java.util.Date;
 
 public class Employee {
-	String id;
-	String name;
-	String address;
-	Affiliation affiliation;
+	private String id;
+	private String name;
+	private String address;
+	private Affiliation affiliation;
 	
 
-	PaymentClassification classification;
-	PaymentSchedule schedule;
-	PaymentMethod paymentMethod;
+	private PaymentClassification classification;
+	private PaymentSchedule schedule;
+	private PaymentMethod paymentMethod;
 
 	public Employee(String name, String address){
 		this.name = name;

From a98dea43a6c2e380ac86b5fc00c24f16194689bb Mon Sep 17 00:00:00 2001
From: onlyliuxin <14703250@qq.com>
Date: Mon, 10 Jul 2017 16:10:13 +0800
Subject: [PATCH 328/332] tag builder

---
 .../com/coderising/dp/builder/TagBuilder.java | 29 +++++++------------
 1 file changed, 11 insertions(+), 18 deletions(-)

diff --git a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java
index daa431f139..fe8673ec30 100644
--- a/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java
+++ b/liuxin/ood/ood-assignment/src/main/java/com/coderising/dp/builder/TagBuilder.java
@@ -1,37 +1,30 @@
 package com.coderising.dp.builder;
 
 public class TagBuilder {
-	private TagNode rootNode;
-	private TagNode currentNode;
-	private TagNode parentNode;
+	
 	public TagBuilder(String rootTagName){
-		rootNode = new TagNode(rootTagName);
-		currentNode = rootNode;
-		parentNode = null;
+		
 	}
 	
 	public TagBuilder addChild(String childTagName){
-		parentNode = this.currentNode;
-		this.currentNode = new TagNode(childTagName);
-		parentNode.add(currentNode);
-		return this;
+		
+		return null;
 	}
 	public TagBuilder addSibling(String siblingTagName){
 	
-		this.currentNode = new TagNode(siblingTagName);
-		parentNode.add(this.currentNode);
-		return this;
+		
+		return null;
 		
 	}
 	public TagBuilder setAttribute(String name, String value){
-		this.currentNode.setAttribute(name, value);
-		return this;
+		
+		return null;
 	}
 	public TagBuilder setText(String value){
-		this.currentNode.setValue(value);
-		return this;
+		
+		return null;
 	}
 	public String toXML(){
-		return this.rootNode.toXML();
+		return null;
 	}
 }

From e69f85c05753d876dd21a0f6e5f0045bbaafbd6b Mon Sep 17 00:00:00 2001
From: readke <xianlin.ke@qq.com>
Date: Tue, 11 Jul 2017 01:31:03 +0800
Subject: [PATCH 329/332] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?=
 =?UTF-8?q?=E4=B8=9Alinxin=E7=9B=AE=E5=BD=95=E4=B8=8B=E6=96=87=E4=BB=B6?=
 =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=AF=E6=8F=90=E4=BA=A4=EF=BC=8C=E7=8E=B0?=
 =?UTF-8?q?=E5=9C=A8=E9=87=8D=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../724222786/ood/ood-assignment/.gitignore   |   4 +
 students/724222786/ood/ood-assignment/pom.xml |  38 ++++
 .../java/com/coderising/ood/answer/Test.java  |  23 ++
 .../ood/answer/config/config.properties       |   5 +
 .../ood/answer/config/product_promotion.txt   |   4 +
 .../ood/answer/entity/MailMessage.java        |  63 ++++++
 .../coderising/ood/answer/entity/Product.java |  38 ++++
 .../coderising/ood/answer/entity/User.java    |  35 +++
 .../ood/answer/service/MailService.java       |  27 +++
 .../ood/answer/utils/ConfigUtils.java         |  48 +++++
 .../coderising/ood/answer/utils/DBUtils.java  |  32 +++
 .../ood/answer/utils/FileUtils.java           |  39 ++++
 .../ood/answer/utils/MailUtils.java           |  49 +++++
 .../ood/answer/utils/ProductUtils.java        |  52 +++++
 .../com/coderising/ood/srp/Configuration.java |  23 ++
 .../coderising/ood/srp/ConfigurationKeys.java |   9 +
 .../java/com/coderising/ood/srp/DBUtil.java   |  25 +++
 .../java/com/coderising/ood/srp/MailUtil.java |  18 ++
 .../com/coderising/ood/srp/PromotionMail.java | 199 ++++++++++++++++++
 .../coderising/ood/srp/product_promotion.txt  |   4 +
 .../ood-assignment/src/main/java/log4j2.xml   |  13 ++
 21 files changed, 748 insertions(+)
 create mode 100644 students/724222786/ood/ood-assignment/.gitignore
 create mode 100644 students/724222786/ood/ood-assignment/pom.xml
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/product_promotion.txt
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
 create mode 100644 students/724222786/ood/ood-assignment/src/main/java/log4j2.xml

diff --git a/students/724222786/ood/ood-assignment/.gitignore b/students/724222786/ood/ood-assignment/.gitignore
new file mode 100644
index 0000000000..c948edfead
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/.gitignore
@@ -0,0 +1,4 @@
+.settings\
+target\
+.classpath
+.project
\ No newline at end of file
diff --git a/students/724222786/ood/ood-assignment/pom.xml b/students/724222786/ood/ood-assignment/pom.xml
new file mode 100644
index 0000000000..a4d92e7f05
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/pom.xml
@@ -0,0 +1,38 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.coderising</groupId>
+  <artifactId>ood-assignment</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>ood-assignment</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <dependencies>
+    
+    <dependency>
+    	<groupId>junit</groupId>
+    	<artifactId>junit</artifactId>
+    	<version>4.12</version>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
+	<dependency>
+	    <groupId>org.apache.logging.log4j</groupId>
+	    <artifactId>log4j-core</artifactId>
+	    <version>2.8.2</version>
+	</dependency>
+
+  </dependencies>
+  <!-- <repositories>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+        </repository>
+    </repositories> -->
+</project>
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java
new file mode 100644
index 0000000000..8dc90b701e
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/Test.java
@@ -0,0 +1,23 @@
+package com.coderising.ood.answer;
+
+import java.util.List;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.coderising.ood.answer.entity.Product;
+import com.coderising.ood.answer.service.MailService;
+import com.coderising.ood.answer.utils.FileUtils;
+import com.coderising.ood.answer.utils.ProductUtils;
+
+public class Test {
+	private static final Logger log = LogManager.getLogger(Test.class);
+	public static void main(String[] args) {
+		MailService service = new MailService();
+		List<Product> list = ProductUtils.getList(FileUtils.readFile());
+		service.sendMail(list);
+		
+	}
+	
+	
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties
new file mode 100644
index 0000000000..b798e9274a
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/config.properties
@@ -0,0 +1,5 @@
+smtp.server=smtp.163.com
+alt.smtp.server=smtp1.163.com
+email.admin=admin@company.com
+
+product.txt=com/coderising/ood/answer/config/product_promotion.txt
\ No newline at end of file
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/product_promotion.txt b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/config/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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java
new file mode 100644
index 0000000000..cb95f6296c
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/MailMessage.java
@@ -0,0 +1,63 @@
+package com.coderising.ood.answer.entity;
+
+import java.io.Serializable;
+
+import com.coderising.ood.answer.utils.ConfigUtils;
+
+/**
+ * 邮件类
+ * @author readke
+ *
+ */
+public class MailMessage implements Serializable{
+	
+	private static final long serialVersionUID = -3221160075625357827L;
+	
+	private String toAddr;
+	private String fromAddr;
+	private String subject;
+	private String content;
+	
+	public static MailMessage getMessage(String from,String subject,String content,Product p,User u){
+		MailMessage m = new MailMessage();
+		if(content != null && !content.isEmpty())
+		content = "尊敬的 "+u.getName()+", 您关注的产品 " + p.getpDec() + " 降价了，欢迎购买!" ;
+		if(subject != null && !subject.isEmpty()){
+			subject = "您关注的产品降价了";
+		}
+		if(from != null && !from.isEmpty()){
+			from = ConfigUtils.getProperty("smtp.server");
+		}
+		m.setFromAddr(from);
+		m.setToAddr(u.getEmail());
+		m.setSubject(subject);
+		m.setContent(content);
+		return m;
+	}
+	
+	public String getToAddr() {
+		return toAddr;
+	}
+	public void setToAddr(String toAddr) {
+		this.toAddr = toAddr;
+	}
+	public String getFromAddr() {
+		return fromAddr;
+	}
+	public void setFromAddr(String fromAddr) {
+		this.fromAddr = fromAddr;
+	}
+	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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java
new file mode 100644
index 0000000000..2b4a81535e
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/Product.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.answer.entity;
+
+import java.io.Serializable;
+
+/**
+ * 产品类
+ * @author readke
+ *
+ */
+public class Product implements Serializable{
+	private static final long serialVersionUID = 409352331475497580L;
+	
+	private String pId;
+	private String pDec;
+	
+	public Product() {
+		
+	}
+	public Product(String pId, String pDec) {
+		super();
+		this.pId = pId;
+		this.pDec = pDec;
+	}
+	public String getpId() {
+		return pId;
+	}
+	public void setpId(String pId) {
+		this.pId = pId;
+	}
+	public String getpDec() {
+		return pDec;
+	}
+	public void setpDec(String pDec) {
+		this.pDec = pDec;
+	}
+	
+	
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java
new file mode 100644
index 0000000000..dd71a8e26f
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/entity/User.java
@@ -0,0 +1,35 @@
+package com.coderising.ood.answer.entity;
+
+import java.io.Serializable;
+
+/**
+ * 用户类
+ * @author readke
+ *
+ */
+public class User implements Serializable{
+	private static final long serialVersionUID = -7916484660512326120L;
+	
+	private String id;
+	private String name;
+	private String email;
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java
new file mode 100644
index 0000000000..cb63b8a2d1
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/service/MailService.java
@@ -0,0 +1,27 @@
+package com.coderising.ood.answer.service;
+
+import java.util.List;
+
+import com.coderising.ood.answer.entity.MailMessage;
+import com.coderising.ood.answer.entity.Product;
+import com.coderising.ood.answer.entity.User;
+import com.coderising.ood.answer.utils.DBUtils;
+import com.coderising.ood.answer.utils.MailUtils;
+
+/**
+ * 邮件发送服务
+ * @author readke
+ *
+ */
+public class MailService {
+	public void sendMail(List<Product> list){
+		
+		for(Product p: list){
+			List<User> uList = DBUtils.queryByProductID(p.getpId());
+			for(User u : uList){
+				MailMessage m = MailMessage.getMessage("","", "", p, u);
+				MailUtils.sendMail(m);
+			}
+		}
+	}
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java
new file mode 100644
index 0000000000..3b67cbf5fb
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ConfigUtils.java
@@ -0,0 +1,48 @@
+package com.coderising.ood.answer.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * 配置文件读取工具
+ * @author readke
+ *
+ */
+public class ConfigUtils {
+	
+	private static final Logger log = LogManager.getLogger(ConfigUtils.class);
+	private static Properties prop =  null;
+	
+	static {
+		InputStream in = ConfigUtils.class.getResourceAsStream("../config/config.properties");
+		prop = new Properties();
+		//System.out.println(in);
+		try {
+			prop.load(in);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}finally {
+			if(in != null){
+				try {
+					in.close();
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	public static String getProperty(String key){
+		return prop.getProperty(key);
+	}
+	
+	public static void main(String[] args) {
+		log.info(ConfigUtils.getProperty("smtp.server"));
+	}
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java
new file mode 100644
index 0000000000..757098ef6c
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/DBUtils.java
@@ -0,0 +1,32 @@
+package com.coderising.ood.answer.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.coderising.ood.answer.entity.User;
+
+/**
+ * db工具
+ * @author readke
+ *
+ */
+public class DBUtils {
+	
+	public static List<User> queryByProductID(String productID){
+		/**
+		 * sql = "Select name from subscriptions "
+				+ "where product_id= '" + productID +"' "
+				+ "and send_mail=1 ";
+		 */
+		List<User> userList = new ArrayList<User>();
+		
+		for (int i = 1; i <= 3; i++) {
+			User userInfo = new User();
+			userInfo.setName("User" + i);			
+			userInfo.setEmail("aa@bb.com");
+			userList.add(userInfo);
+		}
+
+		return userList;
+	}
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java
new file mode 100644
index 0000000000..03dfcfe66d
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/FileUtils.java
@@ -0,0 +1,39 @@
+package com.coderising.ood.answer.utils;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * 文件读取工具
+ * @author readke
+ *
+ */
+public class FileUtils {
+	private static final Logger log = LogManager.getLogger(FileUtils.class);
+	public static File readFile(){
+		
+		File file = null;
+		BufferedReader br = null;
+		
+		try {
+			URL url = FileUtils.class.getClassLoader().getResource(ConfigUtils.getProperty("product.txt"));
+			log.info(url.getPath());
+			URI uri = url.toURI();
+			file = new File(uri);
+			
+		}catch (Exception e) {
+			// TODO: handle exception
+			e.printStackTrace();
+		}
+		return file;
+	}
+	
+	public static void main(String[] args) {
+		readFile();
+	}
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java
new file mode 100644
index 0000000000..6d08cd7968
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/MailUtils.java
@@ -0,0 +1,49 @@
+package com.coderising.ood.answer.utils;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.coderising.ood.answer.entity.MailMessage;
+
+/**
+ * 邮件发送工具
+ * @author readke
+ *
+ */
+public class MailUtils {
+	private static final Logger log = LogManager.getLogger(MailUtils.class);
+	
+	private static final String SMTP_SERVER = ConfigUtils.getProperty("smtp.server"); 
+	private static final String ALT_SMTP_SERVER = ConfigUtils.getProperty("alt.smtp.server"); 
+	
+	public static void sendMail(MailMessage email){
+		try{
+			sendMail(email, SMTP_SERVER);
+			log.info("使用主服务器发送邮件");
+			log.info("发送成功");
+		}catch (Exception e) {
+			try{
+				sendMail(email, ALT_SMTP_SERVER);
+				log.info("使用备用服务器发送邮件");
+			}catch (Exception e1){
+				log.error("发送失败");
+			}
+		}
+	}
+	
+	public static void sendMail(MailMessage email,String server) throws Exception{
+		sendMail(email.getFromAddr(), email.getToAddr(),
+				server, email.getSubject(), email.getContent());
+	}
+	
+	public static void sendMail(String from,String to,String server,String subject,String content)  throws Exception{
+		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(content).append("\n");
+		System.out.println(buffer.toString());
+	}
+	
+	
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java
new file mode 100644
index 0000000000..1b854bfeb7
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/answer/utils/ProductUtils.java
@@ -0,0 +1,52 @@
+package com.coderising.ood.answer.utils;
+
+import java.io.BufferedInputStream;
+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.List;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.coderising.ood.answer.entity.Product;
+
+/**
+ * 产品工具
+ * @author readke
+ *
+ */
+public class ProductUtils {
+	private static final Logger log = LogManager.getLogger(ProductUtils.class);
+	
+	public static List<Product> getList(File file){
+		List<Product> list = null;
+		BufferedReader br = null;
+		
+		try {
+			list = new ArrayList<>();
+			br = new BufferedReader(new FileReader(file));
+			while(br.ready()){
+				Product p = new Product();
+				String temp = br.readLine();
+				String[] data = temp.split(" ");
+				p.setpId(data[0]);
+				p.setpDec(data[1]);
+				list.add(p);
+			}
+			
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		return list;
+	}
+	
+}
diff --git a/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java
new file mode 100644
index 0000000000..f328c1816a
--- /dev/null
+++ b/students/724222786/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<String,String> 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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java
new file mode 100644
index 0000000000..8695aed644
--- /dev/null
+++ b/students/724222786/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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java
new file mode 100644
index 0000000000..82e9261d18
--- /dev/null
+++ b/students/724222786/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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java
new file mode 100644
index 0000000000..9f9e749af7
--- /dev/null
+++ b/students/724222786/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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java
new file mode 100644
index 0000000000..781587a846
--- /dev/null
+++ b/students/724222786/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/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/724222786/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt
new file mode 100644
index 0000000000..b7a974adb3
--- /dev/null
+++ b/students/724222786/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/724222786/ood/ood-assignment/src/main/java/log4j2.xml b/students/724222786/ood/ood-assignment/src/main/java/log4j2.xml
new file mode 100644
index 0000000000..6fc38d8b1b
--- /dev/null
+++ b/students/724222786/ood/ood-assignment/src/main/java/log4j2.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="info">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{6} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="info">
+      <AppenderRef ref="Console"/>
+    </Root>
+  </Loggers>
+</Configuration>
\ No newline at end of file

From 34e00d5da5e410edeaedaaa0e125a59e74bcf30c Mon Sep 17 00:00:00 2001
From: Liu Zengzeng <liuzengzeng@cmhi.chinamobile.com>
Date: Tue, 11 Jul 2017 12:51:04 +0800
Subject: [PATCH 330/332] uml homework pay homework

---
 .../com/coderising/ood/payroll/Employee.java  |    64 +
 .../com/coderising/ood/payroll/Paycheck.java  |    34 +
 .../ood/payroll/affiliation/Affiliation.java  |     7 +
 .../payroll/affiliation/NonAffiliation.java   |    15 +
 .../payroll/affiliation/ServiceCharge.java    |    28 +
 .../payroll/affiliation/UnionAffiliation.java |    53 +
 .../CommissionClassification.java             |    17 +
 .../classfication/HourlyClassification.java   |    36 +
 .../classfication/PaymentClassification.java  |     7 +
 .../classfication/SalariedClassification.java |    30 +
 .../payroll/classfication/SalesReceipt.java   |    14 +
 .../ood/payroll/classfication/TimeCard.java   |    15 +
 .../com/coderising/ood/payroll/db/MockDB.java |    38 +
 .../ood/payroll/method/BankMethod.java        |    18 +
 .../ood/payroll/method/HoldMethod.java        |    18 +
 .../ood/payroll/method/MailMethod.java        |    17 +
 .../ood/payroll/method/PaymentMethod.java     |     7 +
 .../schedule/BiWeeklyPaymentSchedule.java     |    28 +
 .../schedule/MonthlyPaymentSchedule.java      |    22 +
 .../ood/payroll/schedule/PaymentSchedule.java |    15 +
 .../schedule/WeeklyPaymentSchedule.java       |    22 +
 .../coderising/ood/payroll/util/DateUtil.java |    96 +
 .../uml\344\275\234\344\270\232.mdj"          | 10991 ++++++++++++++++
 23 files changed, 11592 insertions(+)
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Employee.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Paycheck.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/Affiliation.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/NonAffiliation.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/ServiceCharge.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/UnionAffiliation.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/CommissionClassification.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/HourlyClassification.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/PaymentClassification.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalariedClassification.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalesReceipt.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/TimeCard.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/db/MockDB.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/BankMethod.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/HoldMethod.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/MailMethod.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/PaymentMethod.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/BiWeeklyPaymentSchedule.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/MonthlyPaymentSchedule.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/PaymentSchedule.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/WeeklyPaymentSchedule.java
 create mode 100644 students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/util/DateUtil.java
 create mode 100644 "students/2816977791/ood/ood-assignment/uml\344\275\234\344\270\232.mdj"

diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Employee.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Employee.java
new file mode 100644
index 0000000000..a19e993424
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Employee.java
@@ -0,0 +1,64 @@
+package com.coderising.ood.payroll;
+
+import com.coderising.ood.payroll.affiliation.Affiliation;
+import com.coderising.ood.payroll.classfication.PaymentClassification;
+import com.coderising.ood.payroll.method.PaymentMethod;
+import com.coderising.ood.payroll.schedule.PaymentSchedule;
+
+import java.util.Date;
+
+public class Employee {
+    int id;
+    String name;
+    String address;
+    Affiliation affiliation;
+
+
+    PaymentClassification classification;
+    PaymentSchedule schedule;
+    PaymentMethod paymentMethod;
+
+    public Employee(String name, String address) {
+        this.name = name;
+        this.address = address;
+    }
+
+    public boolean isPayDay(Date d) {
+        return schedule.isPayDate(id, d);
+    }
+
+    public boolean isPayed(Date d) {
+        return schedule.isPayed(id, d);
+    }
+
+    public Date getPayPeriodStartDate(Date d) {
+        return schedule.getPayPeriodStartDate(d);
+    }
+
+    public void payDay(Paycheck pc) {
+
+        if (isPayDay(new Date()) && isPayed(new Date())) {
+            double grossPay = classification.calculatePay(pc);
+            double deduction = affiliation.calculateDeductions(pc);
+            double netPay = grossPay - deduction;
+            pc.setGrossPay(grossPay);
+            pc.setDeductions(deduction);
+            pc.setNetPay(netPay);
+
+            paymentMethod.pay(pc, id);
+        }
+    }
+
+    public void setClassification(PaymentClassification classification) {
+        this.classification = classification;
+    }
+
+    public void setSchedule(PaymentSchedule schedule) {
+        this.schedule = schedule;
+    }
+
+    public void setPaymentMethod(PaymentMethod paymentMethod) {
+        this.paymentMethod = paymentMethod;
+    }
+}
+
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Paycheck.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Paycheck.java
new file mode 100644
index 0000000000..8704ba58c7
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/Paycheck.java
@@ -0,0 +1,34 @@
+package com.coderising.ood.payroll;
+
+import java.util.Date;
+
+public class Paycheck {
+	private Date payPeriodStart;
+	private Date payPeriodEnd;
+	private double grossPay;
+	private double netPay;
+	private double deductions;
+	
+	public Paycheck(Date payPeriodStart, Date payPeriodEnd){
+		this.payPeriodStart = payPeriodStart;
+		this.payPeriodEnd = payPeriodEnd;
+	}
+	public void setGrossPay(double grossPay) {
+		this.grossPay = grossPay;
+		
+	}
+	public void setDeductions(double deductions) {
+		this.deductions  = deductions;		
+	}
+	public void setNetPay(double netPay){
+		this.netPay = netPay;
+	}
+	public Date getPayPeriodEndDate() {
+		
+		return this.payPeriodEnd;
+	}
+	public Date getPayPeriodStartDate() {
+		
+		return this.payPeriodStart;
+	}
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/Affiliation.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/Affiliation.java
new file mode 100644
index 0000000000..2b427068ae
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/Affiliation.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.payroll.affiliation;
+
+import com.coderising.ood.payroll.Paycheck;
+
+public interface Affiliation {
+	public double calculateDeductions(Paycheck pc);
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/NonAffiliation.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/NonAffiliation.java
new file mode 100644
index 0000000000..cab1542a14
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/NonAffiliation.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.payroll.affiliation;
+
+import com.coderising.ood.payroll.Paycheck;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class NonAffiliation implements Affiliation {
+
+    @Override
+    public double calculateDeductions(Paycheck pc) {
+        return 0;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/ServiceCharge.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/ServiceCharge.java
new file mode 100644
index 0000000000..25847d650a
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/ServiceCharge.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.payroll.affiliation;
+
+import java.util.Date;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class ServiceCharge {
+    private Date date;
+    private double amount;
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(double amount) {
+        this.amount = amount;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/UnionAffiliation.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/UnionAffiliation.java
new file mode 100644
index 0000000000..50e19e985f
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/affiliation/UnionAffiliation.java
@@ -0,0 +1,53 @@
+package com.coderising.ood.payroll.affiliation;
+
+import com.coderising.ood.payroll.Paycheck;
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.List;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class UnionAffiliation implements Affiliation{
+    private int memberId;
+    private double weeklyDue;
+    private List<ServiceCharge> serviceChargeList;
+
+    @Override
+    public double calculateDeductions(Paycheck pc) {
+        int fridays = DateUtil.getFridayNumber(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate());
+        double totalDue = fridays * weeklyDue;
+        double totalCharge = 0.0d;
+        for (ServiceCharge serviceCharge : serviceChargeList){
+            if (DateUtil.isDuring(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate(), serviceCharge.getDate())){
+                totalCharge += serviceCharge.getAmount();
+            }
+        }
+        return totalCharge + totalDue;
+    }
+
+    public int getMemberId() {
+        return memberId;
+    }
+
+    public void setMemberId(int memberId) {
+        this.memberId = memberId;
+    }
+
+    public double getWeeklyDue() {
+        return weeklyDue;
+    }
+
+    public void setWeeklyDue(double weeklyDue) {
+        this.weeklyDue = weeklyDue;
+    }
+
+    public List<ServiceCharge> getServiceChargeList() {
+        return serviceChargeList;
+    }
+
+    public void setServiceChargeList(List<ServiceCharge> serviceChargeList) {
+        this.serviceChargeList = serviceChargeList;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/CommissionClassification.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/CommissionClassification.java
new file mode 100644
index 0000000000..992b8142c1
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/CommissionClassification.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.payroll.classfication;
+
+import com.coderising.ood.payroll.Paycheck;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class CommissionClassification implements PaymentClassification {
+
+    private double salary;
+
+    @Override
+    public double calculatePay(Paycheck pc) {
+        return salary;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/HourlyClassification.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/HourlyClassification.java
new file mode 100644
index 0000000000..de8ac05ae4
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/HourlyClassification.java
@@ -0,0 +1,36 @@
+package com.coderising.ood.payroll.classfication;
+
+import com.coderising.ood.payroll.Paycheck;
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class HourlyClassification implements PaymentClassification {
+    private double rate;
+    private Map<Date, TimeCard> timeCards;
+
+    public void addTimeCard(TimeCard tc) {
+        timeCards.put(tc.getDate(), tc);
+    }
+
+    @Override
+    public double calculatePay(Paycheck pc) {
+        double daysMoney = 0.0;
+        for (Date date : timeCards.keySet()) {
+            if (DateUtil.isDuring(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate(), date)) {
+                daysMoney += calculateHours(timeCards.get(date).getHours());
+            }
+        }
+        return daysMoney;
+    }
+
+    private double calculateHours(int hour) {
+        int extendHour = hour - 8 >= 0 ? hour - 8 : 0;
+        return hour * rate + extendHour * rate * 1.5;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/PaymentClassification.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/PaymentClassification.java
new file mode 100644
index 0000000000..90cd991f75
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/PaymentClassification.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.payroll.classfication;
+
+import com.coderising.ood.payroll.Paycheck;
+
+public interface PaymentClassification {
+	public double calculatePay(Paycheck pc);
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalariedClassification.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalariedClassification.java
new file mode 100644
index 0000000000..50c3a70d92
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalariedClassification.java
@@ -0,0 +1,30 @@
+package com.coderising.ood.payroll.classfication;
+
+import com.coderising.ood.payroll.Paycheck;
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class SalariedClassification implements PaymentClassification {
+    private double salary;
+    private double rate;
+    private Map<Date, SalesReceipt> salesReceiptMap;
+
+
+    @Override
+    public double calculatePay(Paycheck pc) {
+        double commission = 0.0;
+        for (Date date : salesReceiptMap.keySet()) {
+            if (DateUtil.isDuring(pc.getPayPeriodStartDate(), pc.getPayPeriodEndDate(), date)) {
+                commission += salesReceiptMap.get(date).getAmount() * rate;
+            }
+        }
+
+        return salary + commission;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalesReceipt.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalesReceipt.java
new file mode 100644
index 0000000000..5194c317c4
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/SalesReceipt.java
@@ -0,0 +1,14 @@
+package com.coderising.ood.payroll.classfication;
+
+import java.util.Date;
+
+public class SalesReceipt {
+	private Date saleDate;
+	private double amount;
+	public Date getSaleDate() {
+		return saleDate;
+	}
+	public double getAmount() {
+		return amount;
+	}
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/TimeCard.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/TimeCard.java
new file mode 100644
index 0000000000..c0c70e95f8
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/classfication/TimeCard.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.payroll.classfication;
+
+import java.util.Date;
+
+public class TimeCard {
+	private Date date;
+	private int hours;
+	
+	public Date getDate() {
+		return date;
+	}
+	public int getHours() {
+		return hours;
+	}
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/db/MockDB.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/db/MockDB.java
new file mode 100644
index 0000000000..9529963626
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/db/MockDB.java
@@ -0,0 +1,38 @@
+package com.coderising.ood.payroll.db;
+
+import com.coderising.ood.payroll.Paycheck;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class MockDB {
+
+    private static Map<Integer, Stack<Paycheck>> map;
+
+    static {
+        map = new HashMap<Integer, Stack<Paycheck>>();
+    }
+
+    public static void put(int id, Paycheck pc) {
+        if (map.containsKey(id)) {
+            Stack<Paycheck> stack = map.get(id);
+            stack.push(pc);
+        } else {
+            Stack<Paycheck> stack = new Stack<>();
+            stack.push(pc);
+            map.put(id, stack);
+        }
+    }
+
+    public static Paycheck peek(int id) {
+        if (map.containsKey(id)) {
+            return map.get(id).peek();
+        }
+        return null;
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/BankMethod.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/BankMethod.java
new file mode 100644
index 0000000000..257476c8b1
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/BankMethod.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.payroll.method;
+
+import com.coderising.ood.payroll.Paycheck;
+import com.coderising.ood.payroll.db.MockDB;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class BankMethod implements PaymentMethod {
+
+    @Override
+    public void pay(Paycheck pc, int employId) {
+        //pay to bank
+        System.out.println("pay to bank " + employId);
+        MockDB.put(employId, pc);
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/HoldMethod.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/HoldMethod.java
new file mode 100644
index 0000000000..92f1b08830
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/HoldMethod.java
@@ -0,0 +1,18 @@
+package com.coderising.ood.payroll.method;
+
+import com.coderising.ood.payroll.Paycheck;
+import com.coderising.ood.payroll.db.MockDB;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class HoldMethod implements PaymentMethod {
+
+    @Override
+    public void pay(Paycheck pc, int employId) {
+        //hold the paycheck
+        System.out.println("hold paycheck " + employId);
+        MockDB.put(employId, pc);
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/MailMethod.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/MailMethod.java
new file mode 100644
index 0000000000..1cff304dc7
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/MailMethod.java
@@ -0,0 +1,17 @@
+package com.coderising.ood.payroll.method;
+
+import com.coderising.ood.payroll.Paycheck;
+import com.coderising.ood.payroll.db.MockDB;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class MailMethod implements PaymentMethod {
+    @Override
+    public void pay(Paycheck pc, int employId) {
+        //mail to employee
+        System.out.println("mail to employee " + employId);
+        MockDB.put(employId, pc);
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/PaymentMethod.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/PaymentMethod.java
new file mode 100644
index 0000000000..b0c88c21fa
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/method/PaymentMethod.java
@@ -0,0 +1,7 @@
+package com.coderising.ood.payroll.method;
+
+import com.coderising.ood.payroll.Paycheck;
+
+public interface PaymentMethod{
+	public void pay(Paycheck pc, int employId);
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/BiWeeklyPaymentSchedule.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/BiWeeklyPaymentSchedule.java
new file mode 100644
index 0000000000..b36968d68b
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/BiWeeklyPaymentSchedule.java
@@ -0,0 +1,28 @@
+package com.coderising.ood.payroll.schedule;
+
+import com.coderising.ood.payroll.db.MockDB;
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.Date;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class BiWeeklyPaymentSchedule implements PaymentSchedule {
+
+    @Override
+    public boolean isPayDate(int employedId, Date date) {
+        Date payedDate = MockDB.peek(employedId).getPayPeriodEndDate();
+        if (payedDate == null) {
+            return DateUtil.isFriday(date);
+        } else {
+            return DateUtil.getInterval(payedDate, date) % 14 == 0;
+        }
+    }
+
+    @Override
+    public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+        return DateUtil.getStartDate(payPeriodEndDate, -13);
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/MonthlyPaymentSchedule.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/MonthlyPaymentSchedule.java
new file mode 100644
index 0000000000..b54682ab83
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/MonthlyPaymentSchedule.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.payroll.schedule;
+
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.Date;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class MonthlyPaymentSchedule implements PaymentSchedule {
+
+    @Override
+    public boolean isPayDate(int employId, Date date) {
+        return DateUtil.isLastWorkDay(date);
+    }
+
+    @Override
+    public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+        return DateUtil.getStartOfMonth();
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/PaymentSchedule.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/PaymentSchedule.java
new file mode 100644
index 0000000000..4fce5bac18
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/PaymentSchedule.java
@@ -0,0 +1,15 @@
+package com.coderising.ood.payroll.schedule;
+
+import com.coderising.ood.payroll.db.MockDB;
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.Date;
+
+public interface PaymentSchedule {
+	public boolean isPayDate(int employId, Date date);
+	public Date getPayPeriodStartDate(Date payPeriodEndDate);
+
+	default public boolean isPayed(int employedId, Date date){
+		return DateUtil.equalDay(MockDB.peek(employedId).getPayPeriodEndDate(), date);
+	}
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/WeeklyPaymentSchedule.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/WeeklyPaymentSchedule.java
new file mode 100644
index 0000000000..988b8c23ea
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/schedule/WeeklyPaymentSchedule.java
@@ -0,0 +1,22 @@
+package com.coderising.ood.payroll.schedule;
+
+import com.coderising.ood.payroll.util.DateUtil;
+
+import java.util.Date;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class WeeklyPaymentSchedule implements PaymentSchedule {
+
+    @Override
+    public boolean isPayDate(int employId,Date date) {
+        return DateUtil.isFriday(date);
+    }
+
+    @Override
+    public Date getPayPeriodStartDate(Date payPeriodEndDate) {
+        return DateUtil.getStartDate(payPeriodEndDate, -6);
+    }
+}
diff --git a/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/util/DateUtil.java b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/util/DateUtil.java
new file mode 100644
index 0000000000..b742fabef5
--- /dev/null
+++ b/students/2816977791/ood/ood-assignment/src/main/java/com/coderising/ood/payroll/util/DateUtil.java
@@ -0,0 +1,96 @@
+package com.coderising.ood.payroll.util;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author nvarchar
+ *         date 2017/7/10
+ */
+public class DateUtil {
+
+    public static boolean isDuring(Date start, Date end, Date date) {
+        long oneDay = 24 * 60 * 60 * 1000;
+        long d1 = start.getTime() / oneDay;
+        long d2 = end.getTime() / oneDay;
+        long d = date.getTime() / oneDay;
+
+        if (d1 <= d && d <= d2) {
+            return true;
+        }
+
+        return false;
+    }
+
+
+    public static int getFridayNumber(Date start, Date end) {
+        Calendar starCalendar = Calendar.getInstance();
+        starCalendar.setTime(start);
+        Calendar endCalendar = Calendar.getInstance();
+        endCalendar.setTime(end);
+        int result = 0;
+        while (starCalendar.before(endCalendar)) {
+
+            starCalendar.add(Calendar.DATE, 1);
+
+            if (starCalendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
+                result++;
+                starCalendar.add(Calendar.DATE, 6);
+            }
+
+        }
+        return result;
+    }
+
+    public static boolean isFriday(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean isLastWorkDay(Date date) {
+
+        Calendar calToday = Calendar.getInstance();
+        calToday.setTime(date);
+
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
+        while (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY &&
+                cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+            cal.add(Calendar.DATE, -1);
+        }
+
+        return cal.get(Calendar.DAY_OF_MONTH) == calToday.get(Calendar.DAY_OF_MONTH);
+    }
+
+    public static Date getStartDate(Date endDate, int duringDay) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(endDate);
+        cal.add(Calendar.DATE, duringDay);
+        return cal.getTime();
+    }
+
+    public static Date getStartOfMonth() {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.DATE, cal.getActualMinimum(Calendar.DATE));
+        return cal.getTime();
+    }
+
+    public static boolean equalDay(Date date1, Date date2) {
+        long oneDay = 24 * 60 * 60 * 1000;
+        long d1 = date1.getTime() / oneDay;
+        long d2 = date2.getTime() / oneDay;
+        return d1 == d2;
+    }
+
+    public static long getInterval(Date start, Date end) {
+        long oneDay = 24 * 60 * 60 * 1000;
+        long d1 = start.getTime() / oneDay;
+        long d2 = end.getTime() / oneDay;
+        return d2 - d1;
+    }
+}
+
diff --git "a/students/2816977791/ood/ood-assignment/uml\344\275\234\344\270\232.mdj" "b/students/2816977791/ood/ood-assignment/uml\344\275\234\344\270\232.mdj"
new file mode 100644
index 0000000000..07a8fd5223
--- /dev/null
+++ "b/students/2816977791/ood/ood-assignment/uml\344\275\234\344\270\232.mdj"
@@ -0,0 +1,10991 @@
+{
+	"_type": "Project",
+	"_id": "AAAAAAFF+h6SjaM2Hec=",
+	"name": "UML",
+	"ownedElements": [
+		{
+			"_type": "UMLModel",
+			"_id": "AAAAAAFdF8bUGpzmKj4=",
+			"_parent": {
+				"$ref": "AAAAAAFF+h6SjaM2Hec="
+			},
+			"name": "UML",
+			"ownedElements": [
+				{
+					"_type": "UMLClassDiagram",
+					"_id": "AAAAAAFdF8bUG5znYro=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "掷骰子类图",
+					"visible": true,
+					"defaultDiagram": false,
+					"ownedViews": [
+						{
+							"_type": "UMLClassView",
+							"_id": "AAAAAAFdF9Jh5p1e1kg=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdF9Jh551fLcE=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9Jh5p1e1kg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9Jh551gGOA=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9Jh551fLcE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -64,
+											"top": -64,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9Jh6J1hmaI=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9Jh551fLcE="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 93,
+											"top": 143,
+											"width": 136,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "Player",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9Jh6J1iK1E=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9Jh551fLcE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -64,
+											"top": -64,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9Jh6J1jC4c=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9Jh551fLcE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -64,
+											"top": -64,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 88,
+									"top": 136,
+									"width": 146,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdF9Jh551gGOA="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdF9Jh6J1hmaI="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdF9Jh6J1iK1E="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdF9Jh6J1jC4c="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdF9Jh6J1k2zs=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9Jh5p1e1kg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 88,
+									"top": 161,
+									"width": 146,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdF9Jh6Z1lcZE=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9Jh5p1e1kg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 88,
+									"top": 171,
+									"width": 146,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdF9Jh6Z1mfBE=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9Jh5p1e1kg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -32,
+									"top": -32,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdF9Jh6p1n2Rs=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9Jh5p1e1kg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -32,
+									"top": -32,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 88,
+							"top": 136,
+							"width": 146,
+							"height": 137,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdF9Jh551fLcE="
+							},
+							"wordWrap": false,
+							"suppressAttributes": false,
+							"suppressOperations": false,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdF9Jh6J1k2zs="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdF9Jh6Z1lcZE="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdF9Jh6Z1mfBE="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdF9Jh6p1n2Rs="
+							}
+						},
+						{
+							"_type": "UMLClassView",
+							"_id": "AAAAAAFdF9NBMZ2L3Y0=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdF9NBMZ2Jv50="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdF9NBMp2MHjA=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9NBMZ2Jv50="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9NBMp2N/fY=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9NBMp2MHjA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 352,
+											"top": -32,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9NBMp2OfKA=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9NBMp2MHjA="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 301,
+											"top": 159,
+											"width": 110,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "DiceGame",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9NBMp2P328=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9NBMp2MHjA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 352,
+											"top": -32,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9NBMp2QlM4=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9NBMp2MHjA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 352,
+											"top": -32,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 296,
+									"top": 152,
+									"width": 120,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdF9NBMp2N/fY="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdF9NBMp2OfKA="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdF9NBMp2P328="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdF9NBMp2QlM4="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdF9NBM52Rwlo=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9NBMZ2Jv50="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 296,
+									"top": 177,
+									"width": 120,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdF9NBM52Sw5c=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9NBMZ2Jv50="
+									},
+									"subViews": [
+										{
+											"_type": "UMLOperationView",
+											"_id": "AAAAAAFdF9tkjZ8WQz4=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9NBM52Sw5c="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF9tkT58TEw0="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 301,
+											"top": 192,
+											"width": 110,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "+play()",
+											"horizontalAlignment": 0,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 296,
+									"top": 187,
+									"width": 120,
+									"height": 23,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdF9NBM52TM2c=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9NBMZ2Jv50="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 176,
+									"top": -16,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdF9NBM52UQZA=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9NBMZ2Jv50="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 176,
+									"top": -16,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 296,
+							"top": 152,
+							"width": 120,
+							"height": 105,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdF9NBMp2MHjA="
+							},
+							"wordWrap": false,
+							"suppressAttributes": false,
+							"suppressOperations": false,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdF9NBM52Rwlo="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdF9NBM52Sw5c="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdF9NBM52TM2c="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdF9NBM52UQZA="
+							}
+						},
+						{
+							"_type": "UMLClassView",
+							"_id": "AAAAAAFdF9RF6p27dz8=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdF9RF6Z25s+k="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdF9RF6p285OM=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9RF6p27dz8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9RF6Z25s+k="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9RF6p290EI=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9RF6p285OM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 832,
+											"top": -64,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9RF652+dtM=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9RF6p285OM="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 541,
+											"top": 143,
+											"width": 95,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "Dice",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9RF652/xQQ=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9RF6p285OM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 832,
+											"top": -64,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9RF653A46U=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9RF6p285OM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 832,
+											"top": -64,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 536,
+									"top": 136,
+									"width": 105,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdF9RF6p290EI="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdF9RF652+dtM="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdF9RF652/xQQ="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdF9RF653A46U="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdF9RF653BO3M=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9RF6p27dz8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9RF6Z25s+k="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 536,
+									"top": 161,
+									"width": 105,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdF9RF653Cqww=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9RF6p27dz8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9RF6Z25s+k="
+									},
+									"subViews": [
+										{
+											"_type": "UMLOperationView",
+											"_id": "AAAAAAFdF9yO5Z8ojEk=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9RF653Cqww="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF9yOrp8l+p4="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 541,
+											"top": 176,
+											"width": 95,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "+roll()",
+											"horizontalAlignment": 0,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 536,
+									"top": 171,
+									"width": 105,
+									"height": 23,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdF9RF653DNB8=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9RF6p27dz8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9RF6Z25s+k="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 416,
+									"top": -32,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdF9RF653EiHA=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9RF6p27dz8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9RF6Z25s+k="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 416,
+									"top": -32,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 536,
+							"top": 136,
+							"width": 105,
+							"height": 129,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdF9RF6p285OM="
+							},
+							"wordWrap": false,
+							"suppressAttributes": false,
+							"suppressOperations": false,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdF9RF653BO3M="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdF9RF653Cqww="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdF9RF653DNB8="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdF9RF653EiHA="
+							}
+						},
+						{
+							"_type": "UMLClassView",
+							"_id": "AAAAAAFdG6RIw5sj01s=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdG6RIwpshRVw="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdG6RIw5skjDw=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6RIw5sj01s="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6RIwpshRVw="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdG6RIxJslAao=",
+											"_parent": {
+												"$ref": "AAAAAAFdG6RIw5skjDw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 64,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdG6RIxJsm7oQ=",
+											"_parent": {
+												"$ref": "AAAAAAFdG6RIw5skjDw="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 317,
+											"top": 343,
+											"width": 83,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "Display",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdG6RIxJsn/Ho=",
+											"_parent": {
+												"$ref": "AAAAAAFdG6RIw5skjDw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 64,
+											"top": 0,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdG6RIxJsowro=",
+											"_parent": {
+												"$ref": "AAAAAAFdG6RIw5skjDw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 64,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 312,
+									"top": 336,
+									"width": 93,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdG6RIxJslAao="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdG6RIxJsm7oQ="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdG6RIxJsn/Ho="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdG6RIxJsowro="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdG6RIxJsppN8=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6RIw5sj01s="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6RIwpshRVw="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 312,
+									"top": 361,
+									"width": 93,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdG6RIxJsqh8o=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6RIw5sj01s="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6RIwpshRVw="
+									},
+									"subViews": [
+										{
+											"_type": "UMLOperationView",
+											"_id": "AAAAAAFdG6UFHpx+fFk=",
+											"_parent": {
+												"$ref": "AAAAAAFdG6RIxJsqh8o="
+											},
+											"model": {
+												"$ref": "AAAAAAFdG6UEzJx4aDY="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 317,
+											"top": 376,
+											"width": 83,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "+showResult()",
+											"horizontalAlignment": 0,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 312,
+									"top": 371,
+									"width": 93,
+									"height": 23,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdG6RIxZsrp4I=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6RIw5sj01s="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6RIwpshRVw="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 32,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdG6RIxZssrB4=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6RIw5sj01s="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6RIwpshRVw="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 32,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 312,
+							"top": 336,
+							"width": 93,
+							"height": 58,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdG6RIw5skjDw="
+							},
+							"wordWrap": false,
+							"suppressAttributes": false,
+							"suppressOperations": false,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdG6RIxJsppN8="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdG6RIxJsqh8o="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdG6RIxZsrp4I="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdG6RIxZssrB4="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdG6S2ipuwjkI=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdG6S2iZusc0s="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5uxbfQ=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZusc0s="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 475,
+									"top": 210,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5uyfR4=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZusc0s="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 475,
+									"top": 225,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5uz2QY=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZusc0s="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 474,
+									"top": 181,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5u0CCg=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZutrMs="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 509,
+									"top": 210,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5u1a6s=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZutrMs="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 507,
+									"top": 223,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5u2OxE=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZutrMs="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 513,
+									"top": 182,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5u3NnY=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZuu5hA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 442,
+									"top": 211,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5u4bS4=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZuu5hA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 444,
+									"top": 224,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6S2i5u5L50=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZuu5hA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 437,
+									"top": 184,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdG6S2i5u6s+4=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZutrMs="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdG6S2i5u7PHQ=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6S2ipuwjkI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6S2iZuu5hA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdF9RF6p27dz8="
+							},
+							"lineStyle": 1,
+							"points": "535:201;416:203",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdG6S2i5uxbfQ="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdG6S2i5uyfR4="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdG6S2i5uz2QY="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdG6S2i5u0CCg="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdG6S2i5u1a6s="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdG6S2i5u2OxE="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdG6S2i5u3NnY="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdG6S2i5u4bS4="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdG6S2i5u5L50="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdG6S2i5u6s+4="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdG6S2i5u7PHQ="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdG6TzIZwbrTI=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdG6TzIJwX5cs="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwcpKE=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwX5cs="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 370,
+									"top": 289,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwdOEs=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwX5cs="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 385,
+									"top": 289,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZweT1I=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwX5cs="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 341,
+									"top": 290,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwf28Q=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwYZJ8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 371,
+									"top": 276,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwgt2E=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwYZJ8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 384,
+									"top": 278,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwhoAc=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwYZJ8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 343,
+									"top": 272,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwixsg=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwZeVE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 371,
+									"top": 302,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwj9mY=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwZeVE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 384,
+									"top": 300,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6TzIZwk3hI=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwZeVE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 344,
+									"top": 307,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdG6TzIZwlZ4U=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwYZJ8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdG6TzIZwmWlA=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6TzIZwbrTI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6TzIJwZeVE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdG6RIw5sj01s="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+							},
+							"lineStyle": 1,
+							"points": "356:257;357:335",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdG6TzIZwcpKE="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdG6TzIZwdOEs="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdG6TzIZweT1I="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdG6TzIZwf28Q="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdG6TzIZwgt2E="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdG6TzIZwhoAc="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdG6TzIZwixsg="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdG6TzIZwj9mY="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdG6TzIZwk3hI="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdG6TzIZwlZ4U="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdG6TzIZwmWlA="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdG6VR1p1K29k=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8bUG5znYro="
+							},
+							"model": {
+								"$ref": "AAAAAAFdG6VR1p1Gsno="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151Ll90=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1Gsno="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 264,
+									"top": 183,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151MEwk=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1Gsno="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 264,
+									"top": 168,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151N38E=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1Gsno="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 264,
+									"top": 213,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151OVG8=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1HuPE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 259,
+									"top": 183,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151PBXI=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1HuPE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 262,
+									"top": 169,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151Qxb0=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1HuPE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 255,
+									"top": 210,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151RWSE=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1IHBQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 269,
+									"top": 183,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151SI6M=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1IHBQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 266,
+									"top": 169,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdG6VR151Tzp0=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1IHBQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 273,
+									"top": 210,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdG6VR2J1U3mw=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1HuPE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdG6VR2J1VdIc=",
+									"_parent": {
+										"$ref": "AAAAAAFdG6VR1p1K29k="
+									},
+									"model": {
+										"$ref": "AAAAAAFdG6VR1p1IHBQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdF9NBMZ2L3Y0="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdF9Jh5p1e1kg="
+							},
+							"lineStyle": 1,
+							"points": "234:204;295:204",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdG6VR151Ll90="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdG6VR151MEwk="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdG6VR151N38E="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdG6VR151OVG8="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdG6VR151PBXI="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdG6VR151Qxb0="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdG6VR151RWSE="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdG6VR151SI6M="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdG6VR151Tzp0="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdG6VR2J1U3mw="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdG6VR2J1VdIc="
+							}
+						}
+					]
+				},
+				{
+					"_type": "UMLUseCaseDiagram",
+					"_id": "AAAAAAFdF8yd/5z3Wwc=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "购物网站",
+					"visible": true,
+					"defaultDiagram": false,
+					"ownedViews": [
+						{
+							"_type": "UMLActorView",
+							"_id": "AAAAAAFdGAKakqRiXVU=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdGAKakqRjG98=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAKakqRiXVU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAKakKRgInE="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAKalKRkgoU=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAKakqRjG98="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 80,
+											"top": 432,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAKalaRlXyo=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAKakqRjG98="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 125,
+											"top": 549,
+											"width": 40,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "用户",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAKalqRm2U4=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAKakqRjG98="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 80,
+											"top": 432,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAKalqRnExY=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAKakqRjG98="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 80,
+											"top": 432,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 120,
+									"top": 542,
+									"width": 50,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdGAKalKRkgoU="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdGAKalaRlXyo="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdGAKalqRm2U4="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdGAKalqRnExY="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdGAKalqRoke0=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAKakqRiXVU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAKakKRgInE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 40,
+									"top": 216,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdGAKalqRpCx8=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAKakqRiXVU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAKakKRgInE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 40,
+									"top": 216,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdGAKalqRq+G8=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAKakqRiXVU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAKakKRgInE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 40,
+									"top": 216,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdGAKal6Rr7ig=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAKakqRiXVU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAKakKRgInE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 40,
+									"top": 216,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 120,
+							"top": 488,
+							"width": 50,
+							"height": 80,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdGAKakqRjG98="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdGAKalqRoke0="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdGAKalqRpCx8="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdGAKalqRq+G8="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdGAKal6Rr7ig="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdGAO/iqSO/fU=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdGAO/iaSMYxI="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdGAO/i6SPYmM=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAO/iqSO/fU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAO/iaSMYxI="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAO/i6SQA1I=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAO/i6SPYmM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 96,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAO/jKSRG4E=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAO/i6SPYmM="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 363.5,
+											"top": 299.5,
+											"width": 59,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "搜索产品",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAO/jKSSM84=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAO/i6SPYmM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 96,
+											"top": 0,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAO/jKSTyrk=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAO/i6SPYmM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 96,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 358.5,
+									"top": 292.5,
+									"width": 69,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdGAO/i6SQA1I="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdGAO/jKSRG4E="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdGAO/jKSSM84="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdGAO/jKSTyrk="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdGAO/jKSULYo=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAO/iqSO/fU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAO/iaSMYxI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 48,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdGAO/jKSVv9A=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAO/iqSO/fU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAO/iaSMYxI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 48,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdGAO/jaSWaoI=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAO/iqSO/fU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAO/iaSMYxI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 48,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdGAO/jaSXnr0=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAO/iqSO/fU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAO/iaSMYxI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 48,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdGAO/jaSYrk8=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAO/iqSO/fU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAO/iaSMYxI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 48,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 344,
+							"top": 288,
+							"width": 98,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdGAO/i6SPYmM="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdGAO/jKSULYo="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdGAO/jKSVv9A="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdGAO/jaSWaoI="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdGAO/jaSXnr0="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdGAO/jaSYrk8="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdGAW4LqTsTLE=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdGAW4LaTq8JA="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdGAW4LqTtPZc=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAW4LqTsTLE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAW4LaTq8JA="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAW4LqTuTJk=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAW4LqTtPZc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -48,
+											"top": 192,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAW4LqTvhiU=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAW4LqTtPZc="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 283.5,
+											"top": 547.5,
+											"width": 59,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "登录",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAW4LqTwLGA=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAW4LqTtPZc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -48,
+											"top": 192,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAW4LqTxlcc=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAW4LqTtPZc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -48,
+											"top": 192,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 278.5,
+									"top": 540.5,
+									"width": 69,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdGAW4LqTuTJk="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdGAW4LqTvhiU="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdGAW4LqTwLGA="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdGAW4LqTxlcc="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdGAW4L6Ty/cY=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAW4LqTsTLE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAW4LaTq8JA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -24,
+									"top": 96,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdGAW4L6TzO8g=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAW4LqTsTLE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAW4LaTq8JA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -24,
+									"top": 96,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdGAW4L6T0ZYo=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAW4LqTsTLE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAW4LaTq8JA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -24,
+									"top": 96,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdGAW4L6T1z/U=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAW4LqTsTLE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAW4LaTq8JA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -24,
+									"top": 96,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdGAW4L6T22yQ=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAW4LqTsTLE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAW4LaTq8JA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -24,
+									"top": 96,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 264,
+							"top": 536,
+							"width": 98,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdGAW4LqTtPZc="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdGAW4L6Ty/cY="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdGAW4L6TzO8g="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdGAW4L6T0ZYo="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdGAW4L6T1z/U="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdGAW4L6T22yQ="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdGAXoA6UbzVQ=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdGAXoAqUZa/0="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdGAXoA6UcL8A=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAXoA6UbzVQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAXoAqUZa/0="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAXoA6UdkQA=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAXoA6UcL8A="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 512,
+											"top": -256,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAXoBKUe/lA=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAXoA6UcL8A="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 557,
+											"top": 379.5,
+											"width": 64,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "加入购物车",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAXoBKUftL0=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAXoA6UcL8A="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 512,
+											"top": -256,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAXoBKUgLYU=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAXoA6UcL8A="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 512,
+											"top": -256,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 552,
+									"top": 372.5,
+									"width": 75,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdGAXoA6UdkQA="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdGAXoBKUe/lA="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdGAXoBKUftL0="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdGAXoBKUgLYU="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdGAXoBKUhVMo=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAXoA6UbzVQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAXoAqUZa/0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": -128,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdGAXoBKUiMzs=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAXoA6UbzVQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAXoAqUZa/0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": -128,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdGAXoBKUj3f8=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAXoA6UbzVQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAXoAqUZa/0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": -128,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdGAXoBKUk5Oc=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAXoA6UbzVQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAXoAqUZa/0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": -128,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdGAXoBKUlCmw=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAXoA6UbzVQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAXoAqUZa/0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": -128,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 536,
+							"top": 368,
+							"width": 106,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdGAXoA6UcL8A="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdGAXoBKUhVMo="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdGAXoBKUiMzs="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdGAXoBKUj3f8="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdGAXoBKUk5Oc="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdGAXoBKUlCmw="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdGAY0uaVJfPE=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdGAY0uqVKVek=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAY0uaVJfPE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAY0uKVHc28="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAY0uqVLTx8=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAY0uqVKVek="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 384,
+											"top": -224,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAY0uqVMq7M=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAY0uqVKVek="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 491.5,
+											"top": 459.5,
+											"width": 59,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "下订单",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAY0uqVNyeI=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAY0uqVKVek="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 384,
+											"top": -224,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdGAY0uqVOXIE=",
+											"_parent": {
+												"$ref": "AAAAAAFdGAY0uqVKVek="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 384,
+											"top": -224,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 486.5,
+									"top": 452.5,
+									"width": 69,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdGAY0uqVLTx8="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdGAY0uqVMq7M="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdGAY0uqVNyeI="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdGAY0uqVOXIE="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdGAY0u6VPDCs=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAY0uaVJfPE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAY0uKVHc28="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 192,
+									"top": -112,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdGAY0u6VQoxY=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAY0uaVJfPE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAY0uKVHc28="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 192,
+									"top": -112,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdGAY0vKVR6Lo=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAY0uaVJfPE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAY0uKVHc28="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 192,
+									"top": -112,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdGAY0vKVS8fI=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAY0uaVJfPE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAY0uKVHc28="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 192,
+									"top": -112,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdGAY0vKVTC5U=",
+									"_parent": {
+										"$ref": "AAAAAAFdGAY0uaVJfPE="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGAY0uKVHc28="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 192,
+									"top": -112,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 472,
+							"top": 448,
+							"width": 98,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdGAY0uqVKVek="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdGAY0u6VPDCs="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdGAY0u6VQoxY="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdGAY0vKVR6Lo="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdGAY0vKVS8fI="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdGAY0vKVTC5U="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdGBgGqqbtA6o=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdGBgGqabpFws="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGqqbulzY=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabpFws="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 261,
+									"top": 395,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGqqbvRns=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabpFws="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 251,
+									"top": 384,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGqqbw+8Q=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabpFws="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 280,
+									"top": 418,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGqqbx1Oo=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabqC0k="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 179,
+									"top": 469,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGqqby2Nw=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabqC0k="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 172,
+									"top": 458,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGq6bzark=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabqC0k="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 194,
+									"top": 492,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGq6b0+5A=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabrjBY="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 342,
+									"top": 323,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGq6b1X1E=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabrjBY="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 332,
+									"top": 314,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdGBgGq6b22tU=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabrjBY="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 364,
+									"top": 340,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdGBgGq6b3GEg=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabqC0k="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdGBgGq6b4aEw=",
+									"_parent": {
+										"$ref": "AAAAAAFdGBgGqqbtA6o="
+									},
+									"model": {
+										"$ref": "AAAAAAFdGBgGqabrjBY="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdGAO/iqSO/fU="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAKakqRiXVU="
+							},
+							"lineStyle": 1,
+							"points": "170:504;372:323",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdGBgGqqbulzY="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdGBgGqqbvRns="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdGBgGqqbw+8Q="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdGBgGqqbx1Oo="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdGBgGqqby2Nw="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdGBgGq6bzark="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdGBgGq6b0+5A="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdGBgGq6b1X1E="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdGBgGq6b22tU="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdGBgGq6b3GEg="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdGBgGq6b4aEw="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdHQ4fLp+/lbg=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdHQ4fL5/A/FM=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ4fLp+/lbg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ4fL5/ByjE=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ4fL5/A/FM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ4fL5/Cees=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ4fL5/A/FM="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 567.5,
+											"top": 283.5,
+											"width": 77,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "查看产品详情",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ4fL5/Dl2s=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ4fL5/A/FM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ4fL5/ELok=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ4fL5/A/FM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 562.5,
+									"top": 276.5,
+									"width": 88,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQ4fL5/ByjE="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQ4fL5/Cees="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdHQ4fL5/Dl2s="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQ4fL5/ELok="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdHQ4fL5/FyyE=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ4fLp+/lbg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdHQ4fMJ/GK3o=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ4fLp+/lbg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdHQ4fMJ/Hh90=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ4fLp+/lbg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdHQ4fMJ/I0dw=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ4fLp+/lbg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdHQ4fMJ/Jrj0=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ4fLp+/lbg="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 544,
+							"top": 272,
+							"width": 124,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdHQ4fL5/A/FM="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdHQ4fL5/FyyE="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdHQ4fMJ/GK3o="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdHQ4fMJ/Hh90="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdHQ4fMJ/I0dw="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdHQ4fMJ/Jrj0="
+							}
+						},
+						{
+							"_type": "UMLExtendView",
+							"_id": "AAAAAAFdHQ57DaAqNs0=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ57DaAopRI="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ57DqAr1sM=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ57DaAqNs0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ57DaAopRI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 493,
+									"top": 305,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ57DaAqNs0="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ57DqAshCo=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ57DaAqNs0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ57DaAopRI="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 464,
+									"top": 279,
+									"width": 53,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.4707737086130512,
+									"distance": 11.180339887498949,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ57DaAqNs0="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"text": "«extend»",
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ57DqAt9cs=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ57DaAqNs0="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ57DaAopRI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 490,
+									"top": 276,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ57DaAqNs0="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdGAO/iqSO/fU="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdHQ4fLp+/lbg="
+							},
+							"lineStyle": 1,
+							"points": "543:294;442:301",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHQ57DqAr1sM="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHQ57DqAshCo="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHQ57DqAt9cs="
+							}
+						},
+						{
+							"_type": "UMLExtendView",
+							"_id": "AAAAAAFdHQ7gj6GpG4g=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ7gj6Gn9wA="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ7gj6GqUSs=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ7gj6GpG4g="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ7gj6Gn9wA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 484,
+									"top": 352,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ7gj6GpG4g="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ7gj6Grtfg=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ7gj6GpG4g="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ7gj6Gn9wA="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 440,
+									"top": 344,
+									"width": 53,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5922712548213971,
+									"distance": 24.515301344262525,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ7gj6GpG4g="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"text": "«extend»",
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ7gj6Gs0Zk=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ7gj6GpG4g="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ7gj6Gn9wA="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 495,
+									"top": 325,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ7gj6GpG4g="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdGAO/iqSO/fU="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAXoA6UbzVQ="
+							},
+							"lineStyle": 1,
+							"points": "544:367;436:323",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHQ7gj6GqUSs="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHQ7gj6Grtfg="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHQ7gj6Gs0Zk="
+							}
+						},
+						{
+							"_type": "UMLExtendView",
+							"_id": "AAAAAAFdHQ8AdqIMIpQ=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ8AdqIKyBQ="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ8AdqINQDI=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ8AdqIMIpQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ8AdqIKyBQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 581,
+									"top": 328,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ8AdqIMIpQ="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ8AdqIOOpY=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ8AdqIMIpQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ8AdqIKyBQ="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 540,
+									"top": 325,
+									"width": 53,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ8AdqIMIpQ="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"text": "«extend»",
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ8AdqIP3rw=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ8AdqIMIpQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ8AdqIKyBQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 610,
+									"top": 333,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ8AdqIMIpQ="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdHQ4fLp+/lbg="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAXoA6UbzVQ="
+							},
+							"lineStyle": 1,
+							"points": "591:367;602:307",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHQ8AdqINQDI="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHQ8AdqIOOpY="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHQ8AdqIP3rw="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdHQ882aKZU8U=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ882KKXixg="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdHQ882aKagds=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ882aKZU8U="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ882KKXixg="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ882aKbCFY=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ882aKagds="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -144,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ882aKcJss=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ882aKagds="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 333,
+											"top": 419.5,
+											"width": 64,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "显示购物车",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ882aKdAj4=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ882aKagds="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -144,
+											"top": 0,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ882aKeFk8=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ882aKagds="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -144,
+											"top": 0,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 328,
+									"top": 412.5,
+									"width": 75,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQ882aKbCFY="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQ882aKcJss="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdHQ882aKdAj4="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQ882aKeFk8="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdHQ882aKfXY8=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ882aKZU8U="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ882KKXixg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -72,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdHQ882qKgImc=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ882aKZU8U="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ882KKXixg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -72,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdHQ882qKhtB0=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ882aKZU8U="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ882KKXixg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -72,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdHQ882qKiU5Q=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ882aKZU8U="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ882KKXixg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -72,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdHQ882qKj6Uw=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ882aKZU8U="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ882KKXixg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -72,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 312,
+							"top": 408,
+							"width": 106,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdHQ882aKagds="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdHQ882aKfXY8="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdHQ882qKgImc="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdHQ882qKhtB0="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdHQ882qKiU5Q="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdHQ882qKj6Uw="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdHQ9cP6L6Aeo=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ9cPqL2MKE="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cP6L7zvs=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL2MKE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 240,
+									"top": 459,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQaL8CqM=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL2MKE="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 234,
+									"top": 445,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqL9dnk=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL2MKE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 253,
+									"top": 486,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqL+ddA=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL3JSg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 187,
+									"top": 484,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqL/dNg=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL3JSg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 183,
+									"top": 471,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqMATrE=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL3JSg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 194,
+									"top": 511,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqMBCKU=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL4Obc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 295,
+									"top": 434,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqMCH3Y=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL4Obc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 287,
+									"top": 423,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ9cQqMDqB8=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL4Obc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 310,
+									"top": 457,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdHQ9cQqMEVYQ=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL3JSg="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdHQ9cQ6MFMeQ=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ9cP6L6Aeo="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ9cPqL4Obc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdHQ882aKZU8U="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAKakqRiXVU="
+							},
+							"lineStyle": 1,
+							"points": "170:515;325:443",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHQ9cP6L7zvs="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHQ9cQaL8CqM="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHQ9cQqL9dnk="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdHQ9cQqL+ddA="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdHQ9cQqL/dNg="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdHQ9cQqMATrE="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdHQ9cQqMBCKU="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdHQ9cQqMCH3Y="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdHQ9cQqMDqB8="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdHQ9cQqMEVYQ="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdHQ9cQ6MFMeQ="
+							}
+						},
+						{
+							"_type": "UMLExtendView",
+							"_id": "AAAAAAFdHQ+6bqQX4zM=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ+6bqQVrTI="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ+6b6QYXyk=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ+6bqQX4zM="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ+6bqQVrTI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 440,
+									"top": 453,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ+6bqQX4zM="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ+6b6QZrOI=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ+6bqQX4zM="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ+6bqQVrTI="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 408,
+									"top": 448,
+									"width": 53,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.9596145313479303,
+									"distance": 13.45362404707371,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ+6bqQX4zM="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"text": "«extend»",
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ+6b6QaSio=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ+6bqQX4zM="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ+6bqQVrTI="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 447,
+									"top": 424,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ+6bqQX4zM="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdHQ882aKZU8U="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAY0uaVJfPE="
+							},
+							"lineStyle": 1,
+							"points": "471:452;418:439",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHQ+6b6QYXyk="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHQ+6b6QZrOI="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHQ+6b6QaSio="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdHQ/nDaSMkME=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ/nC6SIpV8="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDaSNdP4=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SIpV8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 218,
+									"top": 517,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDaSO7po=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SIpV8="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 220,
+									"top": 502,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSPPvg=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SIpV8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 213,
+									"top": 546,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSQ5n8=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SJEfc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 197,
+									"top": 514,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSRoK0=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SJEfc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 202,
+									"top": 501,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSSHNE=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SJEfc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 189,
+									"top": 540,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSTDv4=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SKfbM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 239,
+									"top": 520,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSUKEc=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SKfbM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 239,
+									"top": 506,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHQ/nDqSV+BU=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SKfbM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 239,
+									"top": 548,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdHQ/nDqSW3i8=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SJEfc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdHQ/nDqSXffo=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/nDaSMkME="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/nC6SKfbM="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdGAW4LqTsTLE="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAKakqRiXVU="
+							},
+							"lineStyle": 1,
+							"points": "170:531;263:545",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHQ/nDaSNdP4="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHQ/nDaSO7po="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSPPvg="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSQ5n8="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSRoK0="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSSHNE="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSTDv4="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSUKEc="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdHQ/nDqSV+BU="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdHQ/nDqSW3i8="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdHQ/nDqSXffo="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFdHQ/+ZqTrAgU=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFdHQ/+ZqTsUt0=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ/+Z6TtsU0=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ/+ZqTsUt0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -32,
+											"top": -16,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ/+Z6TuoEc=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ/+ZqTsUt0="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 283.5,
+											"top": 619.5,
+											"width": 59,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "注册",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ/+Z6TvnVY=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ/+ZqTsUt0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -32,
+											"top": -16,
+											"width": 65,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from UML)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdHQ/+Z6TwpEY=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQ/+ZqTsUt0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -32,
+											"top": -16,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 278.5,
+									"top": 612.5,
+									"width": 69,
+									"height": 25,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQ/+Z6TtsU0="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQ/+Z6TuoEc="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFdHQ/+Z6TvnVY="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQ/+Z6TwpEY="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFdHQ/+Z6Tx1GQ=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -16,
+									"top": -8,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFdHQ/+aKTyY7E=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -16,
+									"top": -8,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFdHQ/+aKTzGEk=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -16,
+									"top": -8,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFdHQ/+aKT0jnU=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -16,
+									"top": -8,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFdHQ/+aKT1dBo=",
+									"_parent": {
+										"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -16,
+									"top": -8,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 264,
+							"top": 608,
+							"width": 98,
+							"height": 35,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFdHQ/+ZqTsUt0="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFdHQ/+Z6Tx1GQ="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFdHQ/+aKTyY7E="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFdHQ/+aKTzGEk="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFdHQ/+aKT0jnU="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFdHQ/+aKT1dBo="
+							}
+						},
+						{
+							"_type": "UMLExtendView",
+							"_id": "AAAAAAFdHRAkKaVi4M8=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHRAkKaVg3zE="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRAkKaVjtmc=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRAkKaVi4M8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRAkKaVg3zE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 297,
+									"top": 582,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRAkKaVi4M8="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRAkKqVk7LU=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRAkKaVi4M8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRAkKaVg3zE="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": 582,
+									"width": 53,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRAkKaVi4M8="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"text": "«extend»",
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRAkKqVlFnA=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRAkKaVi4M8="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRAkKaVg3zE="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 326,
+									"top": 583,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRAkKaVi4M8="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdGAW4LqTsTLE="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+							},
+							"lineStyle": 1,
+							"points": "312:607;312:571",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHRAkKaVjtmc="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHRAkKqVk7LU="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHRAkKqVlFnA="
+							}
+						},
+						{
+							"_type": "UMLAssociationView",
+							"_id": "AAAAAAFdHRA1LqWixAs=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHRA1LqWeYgw="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WjkHo=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWeYgw="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 232,
+									"top": 555,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WkyuM=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWeYgw="
+									},
+									"visible": null,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 240,
+									"top": 542,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6Wl/Us=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWeYgw="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 217,
+									"top": 580,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6Wm/vw=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWfgCc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 199,
+									"top": 536,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WnyBs=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWfgCc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 208,
+									"top": 525,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WollM=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWfgCc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 182,
+									"top": 557,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 2,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WpMj4=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWgex0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 266,
+									"top": 574,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.5235987755982988,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WqZWg=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWgex0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 270,
+									"top": 562,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -0.7853981633974483,
+									"distance": 40,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRA1L6WrUmo=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWgex0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 256,
+									"top": 600,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 0.5235987755982988,
+									"distance": 25,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"edgePosition": 0,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdHRA1L6WsvHA=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWfgCc="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLQualifierCompartmentView",
+									"_id": "AAAAAAFdHRA1L6WtjWo=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRA1LqWixAs="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRA1LqWgex0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 0,
+									"top": 0,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdHQ/+ZqTrAgU="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAKakqRiXVU="
+							},
+							"lineStyle": 1,
+							"points": "170:542;281:607",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHRA1L6WjkHo="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHRA1L6WkyuM="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHRA1L6Wl/Us="
+							},
+							"showMultiplicity": true,
+							"showType": true,
+							"tailRoleNameLabel": {
+								"$ref": "AAAAAAFdHRA1L6Wm/vw="
+							},
+							"tailPropertyLabel": {
+								"$ref": "AAAAAAFdHRA1L6WnyBs="
+							},
+							"tailMultiplicityLabel": {
+								"$ref": "AAAAAAFdHRA1L6WollM="
+							},
+							"headRoleNameLabel": {
+								"$ref": "AAAAAAFdHRA1L6WpMj4="
+							},
+							"headPropertyLabel": {
+								"$ref": "AAAAAAFdHRA1L6WqZWg="
+							},
+							"headMultiplicityLabel": {
+								"$ref": "AAAAAAFdHRA1L6WrUmo="
+							},
+							"tailQualifiersCompartment": {
+								"$ref": "AAAAAAFdHRA1L6WsvHA="
+							},
+							"headQualifiersCompartment": {
+								"$ref": "AAAAAAFdHRA1L6WtjWo="
+							}
+						},
+						{
+							"_type": "UMLIncludeView",
+							"_id": "AAAAAAFdHRBbZKYcUQM=",
+							"_parent": {
+								"$ref": "AAAAAAFdF8yd/5z3Wwc="
+							},
+							"model": {
+								"$ref": "AAAAAAFdHRBbZKYaDv0="
+							},
+							"subViews": [
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRBbZaYdj30=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRBbZKYcUQM="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRBbZKYaDv0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 421,
+									"top": 516,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRBbZKYcUQM="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRBbZaYeH/M=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRBbZKYcUQM="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRBbZKYaDv0="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 400,
+									"top": 530,
+									"width": 55,
+									"height": 13,
+									"autoResize": false,
+									"alpha": 1.5707963267948966,
+									"distance": 30,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRBbZKYcUQM="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"text": "«include»",
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								},
+								{
+									"_type": "EdgeLabelView",
+									"_id": "AAAAAAFdHRBbZaYfqBU=",
+									"_parent": {
+										"$ref": "AAAAAAFdHRBbZKYcUQM="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHRBbZKYaDv0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 410,
+									"top": 489,
+									"width": 0,
+									"height": 13,
+									"autoResize": false,
+									"alpha": -1.5707963267948966,
+									"distance": 15,
+									"hostEdge": {
+										"$ref": "AAAAAAFdHRBbZKYcUQM="
+									},
+									"edgePosition": 1,
+									"underline": false,
+									"horizontalAlignment": 2,
+									"verticalAlignment": 5,
+									"wordWrap": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Arial;13;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"head": {
+								"$ref": "AAAAAAFdGAW4LqTsTLE="
+							},
+							"tail": {
+								"$ref": "AAAAAAFdGAY0uaVJfPE="
+							},
+							"lineStyle": 1,
+							"points": "477:483;355:535",
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showProperty": true,
+							"nameLabel": {
+								"$ref": "AAAAAAFdHRBbZaYdj30="
+							},
+							"stereotypeLabel": {
+								"$ref": "AAAAAAFdHRBbZaYeH/M="
+							},
+							"propertyLabel": {
+								"$ref": "AAAAAAFdHRBbZaYfqBU="
+							}
+						}
+					]
+				},
+				{
+					"_type": "UMLClass",
+					"_id": "AAAAAAFdF9Jh5Z1ciZA=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "Player",
+					"ownedElements": [
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdF9dc2J3pDD0=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdF9dc2J3qoKU=",
+								"_parent": {
+									"$ref": "AAAAAAFdF9dc2J3pDD0="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+								},
+								"visibility": "public",
+								"navigable": false,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdF9dc2Z3rpO4=",
+								"_parent": {
+									"$ref": "AAAAAAFdF9dc2J3pDD0="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdG6VR1p1Gsno=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6VR1p1HuPE=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6VR1p1Gsno="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6VR1p1IHBQ=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6VR1p1Gsno="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						}
+					],
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false,
+					"isActive": false
+				},
+				{
+					"_type": "UMLClass",
+					"_id": "AAAAAAFdF9NBMZ2Jv50=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "DiceGame",
+					"ownedElements": [
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdF99KOaCQNwo=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9NBMZ2Jv50="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdF99KOaCRrPU=",
+								"_parent": {
+									"$ref": "AAAAAAFdF99KOaCQNwo="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdF99KOaCSiy0=",
+								"_parent": {
+									"$ref": "AAAAAAFdF99KOaCQNwo="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9RF6Z25s+k="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "composite",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdG6MH7Zmtypw=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9NBMZ2Jv50="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6MH7ZmuDN4=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6MH7Zmtypw="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6MH7Zmvqpw=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6MH7Zmtypw="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9RF6Z25s+k="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "composite",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdG6TzIJwX5cs=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9NBMZ2Jv50="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6TzIJwYZJ8=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6TzIJwX5cs="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6TzIJwZeVE=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6TzIJwX5cs="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdG6RIwpshRVw="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						}
+					],
+					"visibility": "public",
+					"operations": [
+						{
+							"_type": "UMLOperation",
+							"_id": "AAAAAAFdF9tkT58TEw0=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9NBMZ2Jv50="
+							},
+							"name": "play",
+							"visibility": "public",
+							"isStatic": false,
+							"isLeaf": false,
+							"concurrency": "sequential",
+							"isQuery": false,
+							"isAbstract": false
+						}
+					],
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false,
+					"isActive": false
+				},
+				{
+					"_type": "UMLClass",
+					"_id": "AAAAAAFdF9RF6Z25s+k=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "Dice",
+					"ownedElements": [
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdG6Mw9ZoppUM=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9RF6Z25s+k="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6Mw9ZoqSLc=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6Mw9ZoppUM="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9RF6Z25s+k="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6Mw9porfGs=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6Mw9ZoppUM="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "composite",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdG6S2iZusc0s=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9RF6Z25s+k="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6S2iZutrMs=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6S2iZusc0s="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9RF6Z25s+k="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdG6S2iZuu5hA=",
+								"_parent": {
+									"$ref": "AAAAAAFdG6S2iZusc0s="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdF9NBMZ2Jv50="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "shared",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						}
+					],
+					"visibility": "public",
+					"operations": [
+						{
+							"_type": "UMLOperation",
+							"_id": "AAAAAAFdF9yOrp8l+p4=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9RF6Z25s+k="
+							},
+							"name": "roll",
+							"visibility": "public",
+							"isStatic": false,
+							"isLeaf": false,
+							"concurrency": "sequential",
+							"isQuery": false,
+							"isAbstract": false
+						}
+					],
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false,
+					"isActive": false
+				},
+				{
+					"_type": "UMLActor",
+					"_id": "AAAAAAFdGAKakKRgInE=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "用户",
+					"ownedElements": [
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdGBfGHaYFPwU=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBfGHaYGRkw=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBfGHaYFPwU="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBfGHaYHyF4=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBfGHaYFPwU="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAXoAqUZa/0="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdGBfedKZIprQ=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBfedaZJO7I=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBfedKZIprQ="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBfedaZKKu0=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBfedKZIprQ="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAY0uKVHc28="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdGBf23qaao/Y=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBf23qabaUY=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBf23qaao/Y="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBf23qacez0=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBf23qaao/Y="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAVH16S6bA0="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdGBgGqabpFws=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBgGqabqC0k=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBgGqabpFws="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdGBgGqabrjBY=",
+								"_parent": {
+									"$ref": "AAAAAAFdGBgGqabpFws="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAO/iaSMYxI="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdHQ9cPqL2MKE=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdHQ9cPqL3JSg=",
+								"_parent": {
+									"$ref": "AAAAAAFdHQ9cPqL2MKE="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdHQ9cPqL4Obc=",
+								"_parent": {
+									"$ref": "AAAAAAFdHQ9cPqL2MKE="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdHQ882KKXixg="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdHQ/nC6SIpV8=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdHQ/nC6SJEfc=",
+								"_parent": {
+									"$ref": "AAAAAAFdHQ/nC6SIpV8="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdHQ/nC6SKfbM=",
+								"_parent": {
+									"$ref": "AAAAAAFdHQ/nC6SIpV8="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAW4LaTq8JA="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						},
+						{
+							"_type": "UMLAssociation",
+							"_id": "AAAAAAFdHRA1LqWeYgw=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAKakKRgInE="
+							},
+							"end1": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdHRA1LqWfgCc=",
+								"_parent": {
+									"$ref": "AAAAAAFdHRA1LqWeYgw="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdGAKakKRgInE="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"end2": {
+								"_type": "UMLAssociationEnd",
+								"_id": "AAAAAAFdHRA1LqWgex0=",
+								"_parent": {
+									"$ref": "AAAAAAFdHRA1LqWeYgw="
+								},
+								"reference": {
+									"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+								},
+								"visibility": "public",
+								"navigable": true,
+								"aggregation": "none",
+								"isReadOnly": false,
+								"isOrdered": false,
+								"isUnique": false,
+								"isDerived": false,
+								"isID": false
+							},
+							"visibility": "public",
+							"isDerived": false
+						}
+					],
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdGAO/iaSMYxI=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "搜索产品",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdGAVH16S6bA0=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "查看产品细节",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdGAW4LaTq8JA=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "登录",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdGAXoAqUZa/0=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "加入购物车",
+					"ownedElements": [
+						{
+							"_type": "UMLExtend",
+							"_id": "AAAAAAFdHQ7gj6Gn9wA=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAXoAqUZa/0="
+							},
+							"source": {
+								"$ref": "AAAAAAFdGAXoAqUZa/0="
+							},
+							"target": {
+								"$ref": "AAAAAAFdGAO/iaSMYxI="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLExtend",
+							"_id": "AAAAAAFdHQ8AdqIKyBQ=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAXoAqUZa/0="
+							},
+							"source": {
+								"$ref": "AAAAAAFdGAXoAqUZa/0="
+							},
+							"target": {
+								"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+							},
+							"visibility": "public"
+						}
+					],
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdGAY0uKVHc28=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "下订单",
+					"ownedElements": [
+						{
+							"_type": "UMLInclude",
+							"_id": "AAAAAAFdGBT5vaXucnQ=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"source": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"target": {
+								"$ref": "AAAAAAFdGAW4LaTq8JA="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLExtend",
+							"_id": "AAAAAAFdHQ+6bqQVrTI=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"source": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"target": {
+								"$ref": "AAAAAAFdHQ882KKXixg="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLInclude",
+							"_id": "AAAAAAFdHRBbZKYaDv0=",
+							"_parent": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"source": {
+								"$ref": "AAAAAAFdGAY0uKVHc28="
+							},
+							"target": {
+								"$ref": "AAAAAAFdGAW4LaTq8JA="
+							},
+							"visibility": "public"
+						}
+					],
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdGAfYTKV2bvY=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "产品",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCaseSubject",
+					"_id": "AAAAAAFdGBPCQaWkzJE=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "UseCaseSubject1",
+					"visibility": "public"
+				},
+				{
+					"_type": "UMLClass",
+					"_id": "AAAAAAFdG6RIwpshRVw=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "Display",
+					"visibility": "public",
+					"operations": [
+						{
+							"_type": "UMLOperation",
+							"_id": "AAAAAAFdG6UEzJx4aDY=",
+							"_parent": {
+								"$ref": "AAAAAAFdG6RIwpshRVw="
+							},
+							"name": "showResult",
+							"visibility": "public",
+							"isStatic": false,
+							"isLeaf": false,
+							"concurrency": "sequential",
+							"isQuery": false,
+							"isAbstract": false
+						}
+					],
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false,
+					"isActive": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdHQ4fLZ+9HuM=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "查看产品详情",
+					"ownedElements": [
+						{
+							"_type": "UMLExtend",
+							"_id": "AAAAAAFdHQ57DaAopRI=",
+							"_parent": {
+								"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+							},
+							"source": {
+								"$ref": "AAAAAAFdHQ4fLZ+9HuM="
+							},
+							"target": {
+								"$ref": "AAAAAAFdGAO/iaSMYxI="
+							},
+							"visibility": "public"
+						}
+					],
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdHQ882KKXixg=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "显示购物车",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFdHQ/+ZqTpmg8=",
+					"_parent": {
+						"$ref": "AAAAAAFdF8bUGpzmKj4="
+					},
+					"name": "注册",
+					"ownedElements": [
+						{
+							"_type": "UMLExtend",
+							"_id": "AAAAAAFdHRAkKaVg3zE=",
+							"_parent": {
+								"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+							},
+							"source": {
+								"$ref": "AAAAAAFdHQ/+ZqTpmg8="
+							},
+							"target": {
+								"$ref": "AAAAAAFdGAW4LaTq8JA="
+							},
+							"visibility": "public"
+						}
+					],
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				}
+			],
+			"visibility": "public"
+		},
+		{
+			"_type": "UMLCollaboration",
+			"_id": "AAAAAAFdF9ENuJ1Khbw=",
+			"_parent": {
+				"$ref": "AAAAAAFF+h6SjaM2Hec="
+			},
+			"name": "Collaboration",
+			"ownedElements": [
+				{
+					"_type": "UMLInteraction",
+					"_id": "AAAAAAFdF9ENuJ1LFdg=",
+					"_parent": {
+						"$ref": "AAAAAAFdF9ENuJ1Khbw="
+					},
+					"name": "Interaction",
+					"ownedElements": [
+						{
+							"_type": "UMLSequenceDiagram",
+							"_id": "AAAAAAFdF9ENuJ1MVCI=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "掷骰子顺序图",
+							"visible": true,
+							"defaultDiagram": false,
+							"ownedViews": [
+								{
+									"_type": "UMLFrameView",
+									"_id": "AAAAAAFdF9ENuJ1NVPk=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9ENuZ1OWM4=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9ENuJ1NVPk="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 76,
+											"top": 10,
+											"width": 79,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "掷骰子顺序图",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFdF9ENuZ1P378=",
+											"_parent": {
+												"$ref": "AAAAAAFdF9ENuJ1NVPk="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 10,
+											"top": 10,
+											"width": 61,
+											"height": 13,
+											"autoResize": false,
+											"underline": false,
+											"text": "interaction",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 5,
+									"top": 5,
+									"width": 695,
+									"height": 595,
+									"autoResize": false,
+									"nameLabel": {
+										"$ref": "AAAAAAFdF9ENuZ1OWM4="
+									},
+									"frameTypeLabel": {
+										"$ref": "AAAAAAFdF9ENuZ1P378="
+									}
+								},
+								{
+									"_type": "UMLSeqLifelineView",
+									"_id": "AAAAAAFdF+OdeqGXCpA=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF+OdeqGWcbc="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFdF+OdeqGYEEU=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+OdeqGXCpA="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+OdeqGWcbc="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+Ode6GZUBc=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+OdeqGYEEU="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -160,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+Ode6GavkA=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+OdeqGYEEU="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 85,
+													"top": 47,
+													"width": 95,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "player: Player",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+Ode6Gb7JQ=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+OdeqGYEEU="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -160,
+													"top": 0,
+													"width": 99,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Interaction)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+OdfKGc5R8=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+OdeqGYEEU="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -160,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 80,
+											"top": 40,
+											"width": 105,
+											"height": 40,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFdF+Ode6GZUBc="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFdF+Ode6GavkA="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFdF+Ode6Gb7JQ="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFdF+OdfKGc5R8="
+											}
+										},
+										{
+											"_type": "UMLLinePartView",
+											"_id": "AAAAAAFdF+OdfKGdq7U=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+OdeqGXCpA="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+OdeqGWcbc="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 133,
+											"top": 80,
+											"width": 1,
+											"height": 271,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 80,
+									"top": 40,
+									"width": 105,
+									"height": 311,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFdF+OdeqGYEEU="
+									},
+									"wordWrap": false,
+									"linePart": {
+										"$ref": "AAAAAAFdF+OdfKGdq7U="
+									}
+								},
+								{
+									"_type": "UMLSeqLifelineView",
+									"_id": "AAAAAAFdF+RP86G5S4s=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF+RP86G4mVc="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFdF+RP86G6V2w=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+RP86G5S4s="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+RP86G4mVc="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+RP86G7KPw=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+RP86G6V2w="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -80,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+RP9KG8g9w=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+RP86G6V2w="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 205,
+													"top": 47,
+													"width": 143,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "diceGame: DiceGame",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+RP9KG9Bck=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+RP86G6V2w="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -80,
+													"top": 0,
+													"width": 99,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Interaction)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+RP9KG+FO0=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+RP86G6V2w="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -80,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 200,
+											"top": 40,
+											"width": 153,
+											"height": 40,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFdF+RP86G7KPw="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFdF+RP9KG8g9w="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFdF+RP9KG9Bck="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFdF+RP9KG+FO0="
+											}
+										},
+										{
+											"_type": "UMLLinePartView",
+											"_id": "AAAAAAFdF+RP9KG/qmo=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+RP86G5S4s="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+RP86G4mVc="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 277,
+											"top": 80,
+											"width": 1,
+											"height": 283,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 200,
+									"top": 40,
+									"width": 153,
+									"height": 323,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFdF+RP86G6V2w="
+									},
+									"wordWrap": false,
+									"linePart": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									}
+								},
+								{
+									"_type": "UMLSeqLifelineView",
+									"_id": "AAAAAAFdF+UgqKHvECc=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF+Ugp6Huy74="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFdF+UgqKHwKJY=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+UgqKHvECc="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+Ugp6Huy74="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+UgqaHx/1c=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+UgqKHwKJY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -96,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+UgqaHy7Ec=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+UgqKHwKJY="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 373,
+													"top": 47,
+													"width": 78,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "dice1: Dice",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+UgqaHzfxg=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+UgqKHwKJY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -96,
+													"top": 0,
+													"width": 99,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Interaction)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdF+UgqaH0Efk=",
+													"_parent": {
+														"$ref": "AAAAAAFdF+UgqKHwKJY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -96,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 368,
+											"top": 40,
+											"width": 88,
+											"height": 40,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFdF+UgqaHx/1c="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFdF+UgqaHy7Ec="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFdF+UgqaHzfxg="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFdF+UgqaH0Efk="
+											}
+										},
+										{
+											"_type": "UMLLinePartView",
+											"_id": "AAAAAAFdF+UgqaH1Ack=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+UgqKHvECc="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+Ugp6Huy74="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 412,
+											"top": 80,
+											"width": 1,
+											"height": 209,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 368,
+									"top": 40,
+									"width": 88,
+									"height": 249,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFdF+UgqKHwKJY="
+									},
+									"wordWrap": false,
+									"linePart": {
+										"$ref": "AAAAAAFdF+UgqaH1Ack="
+									}
+								},
+								{
+									"_type": "UMLSeqMessageView",
+									"_id": "AAAAAAFdF+TkA6HYtTw=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF+TkA6HXVqw="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdF+TkBKHZZ+Y=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+TkA6HXVqw="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 162,
+											"top": 167,
+											"width": 79,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"text": "1 : play",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdF+TkBKHaWq4=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+TkA6HXVqw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 152,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 25,
+											"hostEdge": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdF+TkBKHbuuY=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+TkA6HXVqw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 187,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "UMLActivationView",
+											"_id": "AAAAAAFdF+TkBKHctG4=",
+											"_parent": {
+												"$ref": "AAAAAAFdF+TkA6HYtTw="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF+TkA6HXVqw="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 270,
+											"top": 183,
+											"width": 14,
+											"height": 154,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"tail": {
+										"$ref": "AAAAAAFdF+OdfKGdq7U="
+									},
+									"lineStyle": 0,
+									"points": "133:183;270:183",
+									"nameLabel": {
+										"$ref": "AAAAAAFdF+TkBKHZZ+Y="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdF+TkBKHaWq4="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdF+TkBKHbuuY="
+									},
+									"activation": {
+										"$ref": "AAAAAAFdF+TkBKHctG4="
+									},
+									"showProperty": true,
+									"showType": true
+								},
+								{
+									"_type": "UMLSeqMessageView",
+									"_id": "AAAAAAFdF/sfZqPnl+I=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdF/sfZaPm+zc="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdF/sfZqPogK0=",
+											"_parent": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF/sfZaPm+zc="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 305,
+											"top": 178,
+											"width": 79,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"text": "2 : roll",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdF/sfZqPp5uY=",
+											"_parent": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF/sfZaPm+zc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 344,
+											"top": 163,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 25,
+											"hostEdge": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdF/sfZqPqawY=",
+											"_parent": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF/sfZaPm+zc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 344,
+											"top": 198,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "UMLActivationView",
+											"_id": "AAAAAAFdF/sfZqPrd6c=",
+											"_parent": {
+												"$ref": "AAAAAAFdF/sfZqPnl+I="
+											},
+											"model": {
+												"$ref": "AAAAAAFdF/sfZaPm+zc="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 405,
+											"top": 194,
+											"width": 14,
+											"height": 29,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFdF+UgqaH1Ack="
+									},
+									"tail": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"lineStyle": 0,
+									"points": "283:194;405:194",
+									"nameLabel": {
+										"$ref": "AAAAAAFdF/sfZqPogK0="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdF/sfZqPp5uY="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdF/sfZqPqawY="
+									},
+									"activation": {
+										"$ref": "AAAAAAFdF/sfZqPrd6c="
+									},
+									"showProperty": true,
+									"showType": true
+								},
+								{
+									"_type": "UMLSeqMessageView",
+									"_id": "AAAAAAFdHQp4LZ8Q7dM=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQp4LZ8P0ZU="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQp4LZ8R3GI=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQp4LZ8P0ZU="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 357,
+											"top": 232,
+											"width": 79,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"text": "3 : roll",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQp4LZ8S8XE=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQp4LZ8P0ZU="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 396,
+											"top": 217,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 25,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQp4LZ8TEEM=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQp4LZ8P0ZU="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 396,
+											"top": 252,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "UMLActivationView",
+											"_id": "AAAAAAFdHQp4LZ8UAbU=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQp4LZ8Q7dM="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQp4LZ8P0ZU="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 509,
+											"top": 248,
+											"width": 14,
+											"height": 29,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFdHQn7x57ralA="
+									},
+									"tail": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"lineStyle": 0,
+									"points": "283:248;509:248",
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQp4LZ8R3GI="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQp4LZ8S8XE="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQp4LZ8TEEM="
+									},
+									"activation": {
+										"$ref": "AAAAAAFdHQp4LZ8UAbU="
+									},
+									"showProperty": true,
+									"showType": true
+								},
+								{
+									"_type": "UMLSeqLifelineView",
+									"_id": "AAAAAAFdHQn7xp7lBR4=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQn7xp7kRhc="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFdHQn7x57mVek=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQn7xp7lBR4="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQn7xp7kRhc="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQn7x57nLbY=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQn7x57mVek="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -176,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQn7x57o4+o=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQn7x57mVek="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 477,
+													"top": 47,
+													"width": 78,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "dice2: Dice",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQn7x57pTmg=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQn7x57mVek="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -176,
+													"top": 0,
+													"width": 99,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Interaction)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQn7x57qzPQ=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQn7x57mVek="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -176,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 472,
+											"top": 40,
+											"width": 88,
+											"height": 40,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFdHQn7x57nLbY="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFdHQn7x57o4+o="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFdHQn7x57pTmg="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFdHQn7x57qzPQ="
+											}
+										},
+										{
+											"_type": "UMLLinePartView",
+											"_id": "AAAAAAFdHQn7x57ralA=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQn7xp7lBR4="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQn7xp7kRhc="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 516,
+											"top": 80,
+											"width": 1,
+											"height": 233,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 472,
+									"top": 40,
+									"width": 88,
+									"height": 273,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFdHQn7x57mVek="
+									},
+									"wordWrap": false,
+									"linePart": {
+										"$ref": "AAAAAAFdHQn7x57ralA="
+									}
+								},
+								{
+									"_type": "UMLSeqMessageView",
+									"_id": "AAAAAAFdHQrka58ztv8=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQrkap8ywZE="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQrka580RZc=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQrkap8ywZE="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 280,
+											"top": 259,
+											"width": 84,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"text": "4 : checkIfWin",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQrka581cj0=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQrkap8ywZE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 337,
+											"top": 259,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 25,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQrka582R4Q=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQrkap8ywZE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 303,
+											"top": 260,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "UMLActivationView",
+											"_id": "AAAAAAFdHQrka5831N4=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQrka58ztv8="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQrkap8ywZE="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 277,
+											"top": 276,
+											"width": 14,
+											"height": 29,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"tail": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"lineStyle": 0,
+									"points": "283:256;313:256;313:276;290:276",
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQrka580RZc="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQrka581cj0="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQrka582R4Q="
+									},
+									"activation": {
+										"$ref": "AAAAAAFdHQrka5831N4="
+									},
+									"showProperty": true,
+									"showType": true
+								},
+								{
+									"_type": "UMLSeqMessageView",
+									"_id": "AAAAAAFdHQtT8J9UAqo=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQtT8J9TQQw="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQtT8J9VOo0=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQtT8J9TQQw="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 191,
+											"top": 276,
+											"width": 19,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"text": "5 : ",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQtT8J9WSys=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQtT8J9TQQw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 200,
+											"top": 291,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 25,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQtT8Z9XeJ4=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQtT8J9TQQw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 256,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "UMLActivationView",
+											"_id": "AAAAAAFdHQtT8Z9YmtM=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQtT8J9UAqo="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQtT8J9TQQw="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 133,
+											"top": 272,
+											"width": 14,
+											"height": 25,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFdF+OdfKGdq7U="
+									},
+									"tail": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"lineStyle": 0,
+									"points": "270:272;133:272",
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQtT8J9VOo0="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQtT8J9WSys="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQtT8Z9XeJ4="
+									},
+									"activation": {
+										"$ref": "AAAAAAFdHQtT8Z9YmtM="
+									},
+									"showProperty": true,
+									"showType": true
+								},
+								{
+									"_type": "UMLSeqLifelineView",
+									"_id": "AAAAAAFdHQt8mJ9qCGY=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQt8mJ9p6E8="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFdHQt8mJ9ruWw=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQt8mJ9qCGY="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQt8mJ9p6E8="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQt8mZ9sOEM=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQt8mJ9ruWw="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -192,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQt8mZ9tGhY=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQt8mJ9ruWw="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 573,
+													"top": 47,
+													"width": 109,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "display: Display",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQt8mZ9uDAY=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQt8mJ9ruWw="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -192,
+													"top": 0,
+													"width": 99,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Interaction)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFdHQt8mZ9vP4w=",
+													"_parent": {
+														"$ref": "AAAAAAFdHQt8mJ9ruWw="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -192,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 568,
+											"top": 40,
+											"width": 119,
+											"height": 40,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFdHQt8mZ9sOEM="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFdHQt8mZ9tGhY="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFdHQt8mZ9uDAY="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFdHQt8mZ9vP4w="
+											}
+										},
+										{
+											"_type": "UMLLinePartView",
+											"_id": "AAAAAAFdHQt8mZ9w62Y=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQt8mJ9qCGY="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQt8mJ9p6E8="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 628,
+											"top": 80,
+											"width": 1,
+											"height": 283,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 568,
+									"top": 40,
+									"width": 119,
+									"height": 323,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFdHQt8mJ9ruWw="
+									},
+									"wordWrap": false,
+									"linePart": {
+										"$ref": "AAAAAAFdHQt8mZ9w62Y="
+									}
+								},
+								{
+									"_type": "UMLSeqMessageView",
+									"_id": "AAAAAAFdHQxJ4p+Q4MA=",
+									"_parent": {
+										"$ref": "AAAAAAFdF9ENuJ1MVCI="
+									},
+									"model": {
+										"$ref": "AAAAAAFdHQxJ4p+P7MY="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQxJ45+RqsQ=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQxJ4p+P7MY="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 409,
+											"top": 304,
+											"width": 86,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"text": "6 : showResult",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQxJ45+STu4=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQxJ4p+P7MY="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 452,
+											"top": 289,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 25,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFdHQxJ45+TGcs=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQxJ4p+P7MY="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 452,
+											"top": 324,
+											"width": 0,
+											"height": 13,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 10,
+											"hostEdge": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "UMLActivationView",
+											"_id": "AAAAAAFdHQxJ45+UKO0=",
+											"_parent": {
+												"$ref": "AAAAAAFdHQxJ4p+Q4MA="
+											},
+											"model": {
+												"$ref": "AAAAAAFdHQxJ4p+P7MY="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 621,
+											"top": 320,
+											"width": 14,
+											"height": 29,
+											"autoResize": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFdHQt8mZ9w62Y="
+									},
+									"tail": {
+										"$ref": "AAAAAAFdF+RP9KG/qmo="
+									},
+									"lineStyle": 0,
+									"points": "283:320;621:320",
+									"nameLabel": {
+										"$ref": "AAAAAAFdHQxJ45+RqsQ="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFdHQxJ45+STu4="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFdHQxJ45+TGcs="
+									},
+									"activation": {
+										"$ref": "AAAAAAFdHQxJ45+UKO0="
+									},
+									"showProperty": true,
+									"showType": true
+								}
+							],
+							"showSequenceNumber": true,
+							"showSignature": true,
+							"showActivation": true
+						}
+					],
+					"visibility": "public",
+					"isReentrant": true,
+					"messages": [
+						{
+							"_type": "UMLMessage",
+							"_id": "AAAAAAFdF+TkA6HXVqw=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "play",
+							"source": {
+								"$ref": "AAAAAAFdF+OdeqGWcbc="
+							},
+							"target": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"visibility": "public",
+							"messageSort": "synchCall",
+							"isConcurrentIteration": false
+						},
+						{
+							"_type": "UMLMessage",
+							"_id": "AAAAAAFdF/sfZaPm+zc=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "roll",
+							"source": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"target": {
+								"$ref": "AAAAAAFdF+Ugp6Huy74="
+							},
+							"visibility": "public",
+							"messageSort": "synchCall",
+							"isConcurrentIteration": false
+						},
+						{
+							"_type": "UMLMessage",
+							"_id": "AAAAAAFdHQp4LZ8P0ZU=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "roll",
+							"source": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"target": {
+								"$ref": "AAAAAAFdHQn7xp7kRhc="
+							},
+							"visibility": "public",
+							"messageSort": "synchCall",
+							"isConcurrentIteration": false
+						},
+						{
+							"_type": "UMLMessage",
+							"_id": "AAAAAAFdHQrkap8ywZE=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "checkIfWin",
+							"source": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"target": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"visibility": "public",
+							"messageSort": "synchCall",
+							"isConcurrentIteration": false
+						},
+						{
+							"_type": "UMLMessage",
+							"_id": "AAAAAAFdHQtT8J9TQQw=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"source": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"target": {
+								"$ref": "AAAAAAFdF+OdeqGWcbc="
+							},
+							"visibility": "public",
+							"messageSort": "reply",
+							"isConcurrentIteration": false
+						},
+						{
+							"_type": "UMLMessage",
+							"_id": "AAAAAAFdHQxJ4p+P7MY=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "showResult",
+							"source": {
+								"$ref": "AAAAAAFdF+RP86G4mVc="
+							},
+							"target": {
+								"$ref": "AAAAAAFdHQt8mJ9p6E8="
+							},
+							"visibility": "public",
+							"messageSort": "synchCall",
+							"isConcurrentIteration": false
+						}
+					],
+					"participants": [
+						{
+							"_type": "UMLLifeline",
+							"_id": "AAAAAAFdF+OdeqGWcbc=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "player",
+							"visibility": "public",
+							"represent": {
+								"$ref": "AAAAAAFdF+OdeaGVt7c="
+							},
+							"isMultiInstance": false
+						},
+						{
+							"_type": "UMLLifeline",
+							"_id": "AAAAAAFdF+RP86G4mVc=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "diceGame",
+							"visibility": "public",
+							"represent": {
+								"$ref": "AAAAAAFdF+RP8qG3O3c="
+							},
+							"isMultiInstance": false
+						},
+						{
+							"_type": "UMLLifeline",
+							"_id": "AAAAAAFdF+Ugp6Huy74=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "dice1",
+							"visibility": "public",
+							"represent": {
+								"$ref": "AAAAAAFdF+Ugp6Htms4="
+							},
+							"isMultiInstance": false
+						},
+						{
+							"_type": "UMLLifeline",
+							"_id": "AAAAAAFdHQn7xp7kRhc=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "dice2",
+							"visibility": "public",
+							"represent": {
+								"$ref": "AAAAAAFdHQn7xZ7jTMM="
+							},
+							"isMultiInstance": false
+						},
+						{
+							"_type": "UMLLifeline",
+							"_id": "AAAAAAFdHQt8mJ9p6E8=",
+							"_parent": {
+								"$ref": "AAAAAAFdF9ENuJ1LFdg="
+							},
+							"name": "display",
+							"visibility": "public",
+							"represent": {
+								"$ref": "AAAAAAFdHQt8mJ9oW1c="
+							},
+							"isMultiInstance": false
+						}
+					]
+				}
+			],
+			"visibility": "public",
+			"attributes": [
+				{
+					"_type": "UMLAttribute",
+					"_id": "AAAAAAFdF+OdeaGVt7c=",
+					"_parent": {
+						"$ref": "AAAAAAFdF9ENuJ1Khbw="
+					},
+					"name": "Role1",
+					"visibility": "public",
+					"isStatic": false,
+					"isLeaf": false,
+					"type": {
+						"$ref": "AAAAAAFdF9Jh5Z1ciZA="
+					},
+					"isReadOnly": false,
+					"isOrdered": false,
+					"isUnique": false,
+					"isDerived": false,
+					"aggregation": "none",
+					"isID": false
+				},
+				{
+					"_type": "UMLAttribute",
+					"_id": "AAAAAAFdF+RP8qG3O3c=",
+					"_parent": {
+						"$ref": "AAAAAAFdF9ENuJ1Khbw="
+					},
+					"name": "Role2",
+					"visibility": "public",
+					"isStatic": false,
+					"isLeaf": false,
+					"type": {
+						"$ref": "AAAAAAFdF9NBMZ2Jv50="
+					},
+					"isReadOnly": false,
+					"isOrdered": false,
+					"isUnique": false,
+					"isDerived": false,
+					"aggregation": "none",
+					"isID": false
+				},
+				{
+					"_type": "UMLAttribute",
+					"_id": "AAAAAAFdF+Ugp6Htms4=",
+					"_parent": {
+						"$ref": "AAAAAAFdF9ENuJ1Khbw="
+					},
+					"name": "Role3",
+					"visibility": "public",
+					"isStatic": false,
+					"isLeaf": false,
+					"type": {
+						"$ref": "AAAAAAFdF9RF6Z25s+k="
+					},
+					"isReadOnly": false,
+					"isOrdered": false,
+					"isUnique": false,
+					"isDerived": false,
+					"aggregation": "none",
+					"isID": false
+				},
+				{
+					"_type": "UMLAttribute",
+					"_id": "AAAAAAFdHQn7xZ7jTMM=",
+					"_parent": {
+						"$ref": "AAAAAAFdF9ENuJ1Khbw="
+					},
+					"name": "Role4",
+					"visibility": "public",
+					"isStatic": false,
+					"isLeaf": false,
+					"type": {
+						"$ref": "AAAAAAFdF9RF6Z25s+k="
+					},
+					"isReadOnly": false,
+					"isOrdered": false,
+					"isUnique": false,
+					"isDerived": false,
+					"aggregation": "none",
+					"isID": false
+				},
+				{
+					"_type": "UMLAttribute",
+					"_id": "AAAAAAFdHQt8mJ9oW1c=",
+					"_parent": {
+						"$ref": "AAAAAAFdF9ENuJ1Khbw="
+					},
+					"name": "Role5",
+					"visibility": "public",
+					"isStatic": false,
+					"isLeaf": false,
+					"type": {
+						"$ref": "AAAAAAFdG6RIwpshRVw="
+					},
+					"isReadOnly": false,
+					"isOrdered": false,
+					"isUnique": false,
+					"isDerived": false,
+					"aggregation": "none",
+					"isID": false
+				}
+			],
+			"isAbstract": false,
+			"isFinalSpecialization": false,
+			"isLeaf": false
+		}
+	]
+}
\ No newline at end of file

From 096522a2ee05c39df8ac2c3414961cb8b863bb3d Mon Sep 17 00:00:00 2001
From: eulerlcs <eulerlcs@gmail.com>
Date: Wed, 12 Jul 2017 01:45:12 +0900
Subject: [PATCH 331/332] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AD=A3=E5=88=99?=
 =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=94=A8=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../2.code/jmr-02-parent/pom.xml              |  15 +
 .../2.code/jmr-11-challenge/pom.xml           |   8 +
 .../eulerlcs/jmr/challenge/camel/Hello1.java  |  12 +
 .../eulerlcs/jmr/challenge/camel/Hello2.java  |  13 +
 .../jmr/challenge/camel/HelloConv.java        |   7 +
 .../jmr/challenge/camel/HelloProcessor1.java  |  13 +
 .../jmr/challenge/camel/HelloProcessor2.java  |  18 +
 .../jmr/challenge/camel/HelloRoute1.java      |  11 +
 .../jmr/challenge/camel/HelloRoute2.java      |  11 +
 .../jmr/challenge/camel/HelloRoute3.java      |  11 +
 .../jmr/challenge/camel/HelloRoute4.java      |  12 +
 .../jmr/challenge/camel/HelloRoute5.java      |  12 +
 .../jmr/challenge/camel/HelloRoute6.java      |  14 +
 .../regularexpression/ClassLoaderTree.java    |  12 -
 .../ClassLoaderTreeTest.java                  | 119 -------
 .../eulerlcs/regularexpression/UtilsTest.java | 316 ++++++++++++++++++
 .../src/test/resources/01.txt                 |   2 +
 .../src/test/resources/{01_01.txt => 07.txt}  |   0
 18 files changed, 475 insertions(+), 131 deletions(-)
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
 create mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01.txt
 rename students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/{01_01.txt => 07.txt} (100%)

diff --git a/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml b/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
index 82b785a432..381200eaa0 100644
--- a/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
+++ b/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
@@ -18,6 +18,21 @@
 
 	<dependencyManagement>
 		<dependencies>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-stream</artifactId>
+				<version>2.19.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-core</artifactId>
+				<version>2.19.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.activemq</groupId>
+				<artifactId>activemq-core</artifactId>
+				<version>5.7.0</version>
+			</dependency>
 			<dependency>
 				<groupId>org.apache.commons</groupId>
 				<artifactId>commons-lang3</artifactId>
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
index 589a5f69ee..3f106b77b5 100644
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
@@ -12,6 +12,14 @@
 
 
 	<dependencies>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-stream</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-core</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>commons-digester</groupId>
 			<artifactId>commons-digester</artifactId>
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java
new file mode 100644
index 0000000000..2cbe755db2
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java
@@ -0,0 +1,12 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.main.Main;
+
+public class Hello1 {
+	public static void main(String[] args) throws Exception {
+		System.out.println("hello camel");
+
+		Main main = new Main();
+		main.start();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java
new file mode 100644
index 0000000000..17ea05f2cb
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.main.Main;
+
+public class Hello2 {
+	public static void main(String[] args) throws Exception {
+		System.out.println("hello camel");
+
+		Main main = new Main();
+		main.addRouteBuilder(new HelloRoute6());
+		main.run();
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java
new file mode 100644
index 0000000000..9f7f9b1c1c
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java
@@ -0,0 +1,7 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+public class HelloConv {
+	public String addHello(String data) {
+		return "MyHello " + data;
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java
new file mode 100644
index 0000000000..5c5de3e899
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+public class HelloProcessor1 implements Processor {
+	@Override
+	public void process(Exchange exchange) throws Exception {
+		String body = exchange.getIn().getBody(String.class);
+		body = "Hello " + body;
+		exchange.getIn().setBody(body);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java
new file mode 100644
index 0000000000..0009907c99
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java
@@ -0,0 +1,18 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+public class HelloProcessor2 implements Processor {
+	@Override
+	public void process(Exchange exchange) throws Exception {
+		String body = exchange.getIn().getBody(String.class);
+
+		if ("".equals(body)) {
+			throw new Exception("empty value.");
+		}
+
+		body = "Hello " + body;
+		exchange.getIn().setBody(body);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java
new file mode 100644
index 0000000000..6a6c01f909
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class HelloRoute1 extends RouteBuilder {
+
+	@Override
+	public void configure() throws Exception {
+		from("timer:test-hello").to("log:test-log");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java
new file mode 100644
index 0000000000..a83e09d34f
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class HelloRoute2 extends RouteBuilder {
+
+	@Override
+	public void configure() throws Exception {
+		from("stream:in?promptMessage=Enter : ").to("stream:out");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java
new file mode 100644
index 0000000000..3e11a71181
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class HelloRoute3 extends RouteBuilder {
+
+	@Override
+	public void configure() throws Exception {
+		from("stream:in?promptMessage=Enter : ").process(new HelloProcessor1()).to("stream:out");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java
new file mode 100644
index 0000000000..315279b213
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java
@@ -0,0 +1,12 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class HelloRoute4 extends RouteBuilder {
+
+	@Override
+	public void configure() throws Exception {
+		from("stream:in?promptMessage=Enter : ").process(new HelloProcessor1())
+				.bean(HelloConv.class, "addHello(${body})").to("stream:out");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java
new file mode 100644
index 0000000000..816304c82b
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java
@@ -0,0 +1,12 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class HelloRoute5 extends RouteBuilder {
+
+	@Override
+	public void configure() throws Exception {
+		from("stream:in?promptMessage=Enter : ").routeId("HelloRoute20170705").process(new HelloProcessor2())
+				.to("stream:out");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java
new file mode 100644
index 0000000000..dae8d2887a
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java
@@ -0,0 +1,14 @@
+package com.github.eulerlcs.jmr.challenge.camel;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class HelloRoute6 extends RouteBuilder {
+
+	@Override
+	public void configure() throws Exception {
+		onException(Exception.class).handled(true).setBody().constant("なにかエラーが発生").to("stream:out");
+
+		from("stream:in?promptMessage=Enter : ").process(new HelloProcessor2()).process(new HelloProcessor2())
+				.to("stream:out");
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java
deleted file mode 100644
index 2ea7809504..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/ClassLoaderTree.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.github.eulerlcs.regularexpression;
-
-public class ClassLoaderTree {
-
-	public static void main(String[] args) {
-		ClassLoader loader = ClassLoaderTree.class.getClassLoader();
-		while (loader != null) {
-			System.out.println(loader.toString());
-			loader = loader.getParent();
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java
deleted file mode 100644
index 2e0b955bad..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/ClassLoaderTreeTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package com.github.eulerlcs.regularexpression;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.junit.Test;
-
-public class ClassLoaderTreeTest {
-
-	@Test
-	public void test01_01() {
-		String text = Utils.readAllFromResouce("01_01.txt");
-		System.out.println("--orignal text start--");
-		System.out.print(text);
-		System.out.println("--orignal text  end --");
-
-		// 统一换行符
-		String result = text.replaceAll("(\r\n)|\r", "\n");
-		System.out.println("--统一换行符 start--");
-		System.out.print(result);
-		System.out.println("--统一换行符   end --");
-
-		// 行单位前后trim
-		result = result.replaceAll("(?m)^\\s*(.*?)\\s*$", "$1");
-		System.out.println("--行单位前后trim start--");
-		System.out.print(result);
-		System.out.println("--行单位前后trim   end --");
-
-		assertFalse(result.equals(text));
-	}
-
-	@Test
-	public void test01_02() {
-
-		// ^ $ \A \E (?m)
-		String text = "123\r\nabc def";
-		String regex = "\\Aabc";
-		// Pattern p = Pattern.compile(regex);
-		Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
-
-		Matcher m = p.matcher(text);
-
-		boolean result = m.find();
-		if (result) {
-			System.out.println("found");
-		} else {
-			System.out.println("not found");
-		}
-		assertTrue(result);
-	}
-
-	@Test
-	public void test01_03_dotall() {
-		Pattern p = null;
-		Matcher m = null;
-
-		String text1 = "width height";
-		String text2 = "width\nheight";
-		// Pattern p = Pattern.compile("(?s)width.height");
-		p = Pattern.compile("width.height", Pattern.DOTALL);
-
-		m = p.matcher(text1);
-		boolean result1 = m.find();
-
-		m = p.matcher(text2);
-		boolean result2 = m.find();
-		if (result2) {
-			System.out.println("found");
-		} else {
-			System.out.println("not found");
-		}
-
-		assertTrue(result1);
-		assertTrue(result2);
-	}
-
-	@Test
-	public void test01_04_Zz() {
-		Pattern p = null;
-		Matcher m = null;
-		boolean result1 = false;
-		boolean result2 = false;
-		boolean result3 = false;
-
-		String text1 = "abc def";
-		String text2 = "def abc";
-		String text3 = "def abc\n";
-
-		p = Pattern.compile("abc\\z");
-
-		m = p.matcher(text1);
-		result1 = m.find();
-
-		m = p.matcher(text2);
-		result2 = m.find();
-
-		m = p.matcher(text3);
-		result3 = m.find();
-
-		p = Pattern.compile("abc\\Z");
-
-		m = p.matcher(text1);
-		result1 = m.find();
-
-		m = p.matcher(text2);
-		result2 = m.find();
-
-		m = p.matcher(text3);
-		result3 = m.find();
-
-		assertFalse(result1);
-		assertTrue(result2);
-		assertTrue(result3);
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
new file mode 100644
index 0000000000..3fa9e25c8d
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
@@ -0,0 +1,316 @@
+package com.github.eulerlcs.regularexpression;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+
+// http://www.cnblogs.com/playing/archive/2011/03/15/1984943.html
+
+public class UtilsTest {
+
+	/**
+	 * 多行模式-1
+	 */
+	@Test
+	public void test01_01() {
+		String t1 = Utils.readAllFromResouce("01.txt");
+
+		// 默认 单行模式
+		Pattern p1 = Pattern.compile("^def$");
+		Matcher m1 = p1.matcher(t1);
+
+		if (m1.find()) {
+			System.out.println("found!");
+		} else {
+			System.out.println("not found!");
+		}
+	}
+
+	/**
+	 * <pre>
+	 * 多行模式-2 
+	 *  (?m)		Pattern.MULTILINE
+	 * </pre>
+	 */
+	@Test
+	public void test01_02() {
+		String t1 = Utils.readAllFromResouce("01.txt");
+
+		// 多行模式 写法一
+		// Pattern p1 = Pattern.compile("(?m)^def$");
+		// 多行模式 写法二
+		Pattern p1 = Pattern.compile("^def$", Pattern.MULTILINE);
+
+		Matcher m1 = p1.matcher(t1);
+
+		if (m1.find()) {
+			System.out.println("found!");
+		} else {
+			System.out.println("not found!");
+		}
+	}
+
+	/**
+	 * flag设定和(?X)的等价关系
+	 * 
+	 * <pre>
+	 *  (?m)		Pattern.MULTILINE
+	 *  (?i)		Pattern.CASE_INSENSITIVE
+	 *  (?u)		Pattern.UNICODE_CASE
+	 *  (?s)		Pattern.DOTALL
+	 *  (?d)		Pattern.UNIX_LINES
+	 *  (?x)		Pattern.COMMENTS
+	 * </pre>
+	 */
+
+	/**
+	 * <pre>
+	 * ascii大小写
+	 *  (?i)		Pattern.CASE_INSENSITIVE
+	 * </pre>
+	 */
+	@Test
+	public void test02_01() {
+		String t1 = "abc AbC aCd ａｂｃ ＡＢｃ 2343";
+		String r1 = "abc";
+
+		// 默认 区分大小写
+		// Pattern p1 = Pattern.compile(r1);
+
+		// 忽略ascii大小，写法一
+		Pattern p1 = Pattern.compile("(?i)abc");
+
+		// 忽略ascii大小，写法而
+		// Pattern p1 = Pattern.compile(r1, Pattern.CASE_INSENSITIVE );
+
+		Matcher m1 = p1.matcher(t1);
+
+		while (m1.find()) {
+			System.out.println(m1.group());
+		}
+	}
+
+	/**
+	 * <pre>
+	 * unicode大小写
+	 *  (?u)		Pattern.UNICODE_CASE
+	 * </pre>
+	 */
+	@Test
+	public void test03_01() {
+		String t1 = "abc AbC aCd ａｂｃ ＡＢｃ 2343";
+		String r1 = "ａｂｃ";// 日文输入法下，全角abc,也就是宽字体
+
+		// 默认 区分大小写只适用于ascii
+		// Pattern p1 = Pattern.compile((?i)ａｂｃ);
+
+		// 忽略ascii大小，写法一
+		Pattern p1 = Pattern.compile("(?iu)ａｂｃ");
+
+		// 忽略ascii大小，写法而
+		// Pattern p1 = Pattern.compile(r1, Pattern.UNICODE_CASE);
+
+		Matcher m1 = p1.matcher(t1);
+
+		while (m1.find()) {
+			System.out.println(m1.group());
+		}
+	}
+
+	/** 通过设定标志位忽略大小写 */
+	@Test
+	public void test03_02() {
+		String t1 = "abc AbC aCd\nABCD 2343";
+		String r1 = "(?i)(?m)abc";
+		Pattern p1 = Pattern.compile(r1);
+		Matcher m1 = p1.matcher(t1);
+
+		while (m1.find()) {
+			System.out.println(m1.group());
+		}
+	}
+
+	@Test
+	public void test04_01_dotall() {
+		Pattern p = null;
+		Matcher m = null;
+
+		String text1 = "width height";
+		String text2 = "width\nheight";
+		// Pattern p = Pattern.compile("(?s)width.height");
+		p = Pattern.compile("width.height", Pattern.DOTALL);
+
+		m = p.matcher(text1);
+		boolean result1 = m.find();
+		if (result1) {
+			System.out.println("text1 found");
+		} else {
+			System.out.println("text1 not found");
+		}
+
+		m = p.matcher(text2);
+		boolean result2 = m.find();
+		if (result2) {
+			System.out.println("text2 found");
+		} else {
+			System.out.println("text2 not found");
+		}
+	}
+
+	/**
+	 * group
+	 * 
+	 * <pre>
+	 * group(0):正则表达式的匹配值 
+	 * group(1):第一个子串
+	 * </pre>
+	 */
+	@Test
+	public void test05_01() {
+		Pattern p = Pattern.compile("([a-z]+)-(\\d+)");
+		Matcher m = p.matcher("type x-235, type y-3, type zw-465");
+
+		while (m.find()) {
+			for (int i = 0; i < m.groupCount() + 1; i++) {
+				System.out.println("group(" + i + ")=" + m.group(i));
+			}
+			System.out.println("---------------------");
+		}
+	}
+
+	/**
+	 * 字符串分割的例子
+	 */
+	@Test
+	public void test05_02() {
+		String abc = "a///b/c";
+
+		// 分割后的数组中包含空字符
+		String[] array1 = abc.split("/");
+		for (String str : array1) {
+			System.out.println(str);
+		}
+
+		System.out.println("---------------------");
+
+		// 分割后的数组中取出了空字符
+		String[] array2 = abc.split("/+");
+		for (String str : array2) {
+			System.out.println(str);
+		}
+	}
+
+	/**
+	 * 替换
+	 */
+	@Test
+	public void test06_01() {
+		String str = "Orange is 100yuan, Banana is 180 yuan.";
+		String regex = "\\d+\\s*yuan";
+		Pattern p = Pattern.compile(regex);
+
+		Matcher m = p.matcher(str);
+		System.out.println(m.find());
+		String result = m.replaceFirst("_$0_");
+
+		System.out.println(result);
+	}
+
+	/**
+	 * 替换
+	 */
+	@Test
+	public void test06_02() {
+		String str = "Orange is 100yuan, Banana is 180 yuan.";
+		String regex = "(\\d)\\s*(yuan)";
+
+		Pattern p = Pattern.compile(regex);
+		Matcher m = p.matcher(str);
+
+		String result = m.replaceAll("$2_$1");
+
+		System.out.println(result);
+	}
+
+	/**
+	 * 命名分组，替换
+	 */
+	@Test
+	public void test06_03() {
+		String pathfFilename = "aa/notepad.exe";
+
+		String regex = "^.+/(?<filename>.+)$";
+		String replacement = "${filename}";
+
+		String filename = pathfFilename.replaceFirst(regex, replacement);
+		System.out.println(filename);
+	}
+
+	/**
+	 * 从文本中读取多行数据后，建议先把回车符删掉
+	 */
+	@Test
+	public void test07_01() {
+		String t1 = Utils.readAllFromResouce("07.txt");
+		System.out.println("--orignal text start--");
+		System.out.print(t1);
+		System.out.println("--orignal text  end --");
+
+		// 统一换行符
+		String ret1 = t1.replaceAll("(\r\n)|\r", "\n");
+		System.out.println("--统一换行符 start--");
+		System.out.print(ret1);
+		System.out.println("--统一换行符   end --");
+
+		// 行单位前后trim
+		String ret2 = ret1.replaceAll("(?m)^\\s*(.*?)\\s*$", "$1");
+		System.out.println("--行单位前后trim start--");
+		System.out.println(ret2);
+		System.out.println("--行单位前后trim   end --");
+
+		assertFalse(ret2.equals(t1));
+	}
+
+	@Test
+	public void test01_04_Zz() {
+		Pattern p = null;
+		Matcher m = null;
+		boolean result1 = false;
+		boolean result2 = false;
+		boolean result3 = false;
+
+		String text1 = "abc def";
+		String text2 = "def abc";
+		String text3 = "def abc\n";
+
+		p = Pattern.compile("abc\\z");
+
+		m = p.matcher(text1);
+		result1 = m.find();
+
+		m = p.matcher(text2);
+		result2 = m.find();
+
+		m = p.matcher(text3);
+		result3 = m.find();
+
+		p = Pattern.compile("abc\\Z");
+
+		m = p.matcher(text1);
+		result1 = m.find();
+
+		m = p.matcher(text2);
+		result2 = m.find();
+
+		m = p.matcher(text3);
+		result3 = m.find();
+
+		assertFalse(result1);
+		assertTrue(result2);
+		assertTrue(result3);
+	}
+}
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01.txt b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01.txt
new file mode 100644
index 0000000000..5f5521fae2
--- /dev/null
+++ b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01.txt
@@ -0,0 +1,2 @@
+abc
+def
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01_01.txt b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/07.txt
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01_01.txt
rename to students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/07.txt

From 5c16127a38c12d79db8b84c1cbfad0477e88c322 Mon Sep 17 00:00:00 2001
From: eulerlcs <eulerlcs@gmail.com>
Date: Wed, 12 Jul 2017 23:59:11 +0900
Subject: [PATCH 332/332] add regexp project

---
 students/41689722.eulerlcs/2.code/.gitignore  |   6 -
 .../2.code/jmr-01-aggregator/pom.xml          |  18 -
 .../2.code/jmr-02-parent/pom.xml              | 163 -------
 .../data/shoppingcart/shoppingcart.data       | Bin 131 -> 0 bytes
 .../data/xmlparser/app-config.xml             |  12 -
 .../jmr-11-challenge/data/xmlparser/hello.xml |   5 -
 .../2.code/jmr-11-challenge/pom.xml           |  56 ---
 .../eulerlcs/jmr/challenge/camel/Hello1.java  |  12 -
 .../eulerlcs/jmr/challenge/camel/Hello2.java  |  13 -
 .../jmr/challenge/camel/HelloConv.java        |   7 -
 .../jmr/challenge/camel/HelloProcessor1.java  |  13 -
 .../jmr/challenge/camel/HelloProcessor2.java  |  18 -
 .../jmr/challenge/camel/HelloRoute1.java      |  11 -
 .../jmr/challenge/camel/HelloRoute2.java      |  11 -
 .../jmr/challenge/camel/HelloRoute3.java      |  11 -
 .../jmr/challenge/camel/HelloRoute4.java      |  12 -
 .../jmr/challenge/camel/HelloRoute5.java      |  12 -
 .../jmr/challenge/camel/HelloRoute6.java      |  14 -
 .../core/FileSystemClassLoader.java           |  58 ---
 .../classloader/core/ICalculator.java         |   5 -
 .../classloader/core/NetworkClassLoader.java  |  46 --
 .../challenge/classloader/core/Versioned.java |   5 -
 .../classloader/driver/CalculatorTest.java    |  24 -
 .../classloader/driver/ClassIdentity.java     |  36 --
 .../classloader/driver/ClassLoaderTree.java   |  12 -
 .../challenge/classloader/package-info.java   |   7 -
 .../sampleRename/CalculatorAdvanced.java      |  15 -
 .../sampleRename/CalculatorBasic.java         |  15 -
 .../classloader/sampleRename/Sample.java      |  10 -
 .../challenge/systemrules/AppWithExit.java    |  13 -
 .../challenge/systemrules/package-info.java   |   5 -
 .../digester/core/HelloDigester.java          |  17 -
 .../digester/core/HelloFileRulerSet.java      |  28 --
 .../xmlparser/digester/driver/Driver.java     |  28 --
 .../xmlparser/digester/entity/Hello.java      |  19 -
 .../xmlparser/digester/entity/HelloFile.java  |  11 -
 .../challenge/xmlparser/jaxb/AppConfig.java   |  29 --
 .../jmr/challenge/xmlparser/jaxb/Driver.java  |  20 -
 .../jmr/challenge/xmlparser/jaxb/Hello.java   |  22 -
 .../challenge/xmlparser/jaxb/HelloFile.java   |  14 -
 .../challenge/xmlparser/jaxb/JaxbParser.java  |  22 -
 .../jmr/challenge/xmlparser/package-info.java |  13 -
 .../jmr/challenge/xmlparser/sax/Driver.java   |  19 -
 .../xmlparser/sax/HelloSaxParser.java         |  42 --
 .../challenge/zzz/master170219/Try170205.java | 132 ------
 .../challenge/zzz/master170219/Try170212.java |  34 --
 .../challenge/zzz/master170219/Try170219.java |  47 --
 .../com/hoo/download/BatchDownloadFile.java   | 227 ---------
 .../java/com/hoo/download/DownloadFile.java   | 176 -------
 .../java/com/hoo/download/SaveItemFile.java   |  68 ---
 .../java/com/hoo/entity/DownloadInfo.java     | 125 -----
 .../main/java/com/hoo/util/DownloadUtils.java |  40 --
 .../java/com/hoo/util/DownloadUtilsTest.java  |  39 --
 .../src/main/java/com/hoo/util/LogUtils.java  |  40 --
 .../src/main/resources/.gitkeep               |   0
 .../jmr-11-challenge/src/test/java/.gitkeep   |   0
 .../systemrules/AppWithExitTest.java          |  51 --
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-61-collection/pom.xml          |  27 --
 .../eulerlcs/jmr/algorithm/ArrayList.java     | 438 ------------------
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 -
 .../eulerlcs/jmr/algorithm/TestArrayList.java |  44 --
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-62-litestruts/data/struts.xml  |  11 -
 .../2.code/jmr-62-litestruts/pom.xml          |  39 --
 .../jmr-62-litestruts/src/main/java/.gitkeep  |   0
 .../eulerlcs/jmr/algorithm/ArrayUtil.java     | 279 -----------
 .../jmr/litestruts/action/LoginAction.java    |  30 --
 .../jmr/litestruts/action/LogoutAction.java   |  30 --
 .../eulerlcs/jmr/litestruts/core/Struts.java  | 200 --------
 .../eulerlcs/jmr/litestruts/core/View.java    |  26 --
 .../jmr/litestruts/degister/StrutsAction.java |  22 -
 .../degister/StrutsActionResult.java          |  13 -
 .../degister/StrutsActionRulerSet.java        |  30 --
 .../jmr/litestruts/degister/StrutsConfig.java |  15 -
 .../litestruts/degister/StrutsDigester.java   |  13 -
 .../src/main/resources/log4j.xml              |  16 -
 .../jmr-62-litestruts/src/test/java/.gitkeep  |   0
 .../eulerlcs/jmr/algorithm/ArrayUtilTest.java | 266 -----------
 .../jmr/litestruts/core/StrutsTest.java       |  38 --
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-63-download/data/.gitkeep      |   0
 .../2.code/jmr-63-download/pom.xml            |  39 --
 .../eulerlcs/jmr/algorithm/Iterator.java      |   8 -
 .../eulerlcs/jmr/algorithm/LinkedList.java    | 126 -----
 .../github/eulerlcs/jmr/algorithm/List.java   |  13 -
 .../eulerlcs/jmr/download/api/Connection.java |  28 --
 .../jmr/download/api/ConnectionException.java |   5 -
 .../jmr/download/api/ConnectionManager.java   |  11 -
 .../jmr/download/api/DownloadListener.java    |   5 -
 .../jmr/download/core/DownloadThread.java     |  20 -
 .../jmr/download/core/FileDownloader.java     |  64 ---
 .../jmr/download/impl/ConnectionImpl.java     |  25 -
 .../download/impl/ConnectionManagerImpl.java  |  14 -
 .../src/main/resources/log4j.xml              |  16 -
 .../jmr/download/core/FileDownloaderTest.java |  53 ---
 .../src/test/resources/.gitkeep               |   0
 .../2.code/jmr-64-minijvm/data/.gitkeep       |   0
 .../2.code/jmr-64-minijvm/pom.xml             |  43 --
 .../eulerlcs/jmr/algorithm/LRUPageFrame.java  | 110 -----
 .../github/eulerlcs/jmr/algorithm/Stack.java  |  24 -
 .../eulerlcs/jmr/algorithm/StackUtil.java     |  43 --
 .../eulerlcs/jmr/jvm/attr/AttributeInfo.java  |  19 -
 .../eulerlcs/jmr/jvm/attr/CodeAttr.java       |  52 ---
 .../jmr/jvm/attr/LineNumberTable.java         |  46 --
 .../jmr/jvm/attr/LocalVariableItem.java       |  49 --
 .../jmr/jvm/attr/LocalVariableTable.java      |  25 -
 .../eulerlcs/jmr/jvm/attr/StackMapTable.java  |  29 --
 .../eulerlcs/jmr/jvm/clz/AccessFlag.java      |  26 --
 .../eulerlcs/jmr/jvm/clz/ClassFile.java       | 100 ----
 .../eulerlcs/jmr/jvm/clz/ClassIndex.java      |  22 -
 .../eulerlcs/jmr/jvm/constant/ClassInfo.java  |  29 --
 .../jmr/jvm/constant/ConstantInfo.java        |  29 --
 .../jmr/jvm/constant/ConstantPool.java        |  28 --
 .../jmr/jvm/constant/FieldRefInfo.java        |  54 ---
 .../jmr/jvm/constant/MethodRefInfo.java       |  56 ---
 .../jmr/jvm/constant/NameAndTypeInfo.java     |  50 --
 .../jmr/jvm/constant/NullConstantInfo.java    |  11 -
 .../eulerlcs/jmr/jvm/constant/StringInfo.java |  28 --
 .../eulerlcs/jmr/jvm/constant/UTF8Info.java   |  37 --
 .../github/eulerlcs/jmr/jvm/field/Field.java  |  26 --
 .../jmr/jvm/loader/ByteCodeIterator.java      |  55 ---
 .../jmr/jvm/loader/ClassFileLoader.java       |  74 ---
 .../jmr/jvm/loader/ClassFileParser.java       | 146 ------
 .../eulerlcs/jmr/jvm/method/Method.java       |  48 --
 .../github/eulerlcs/jmr/jvm/util/Util.java    |  22 -
 .../src/main/resources/log4j.xml              |  16 -
 .../jmr/algorithm/LRUPageFrameTest.java       |  27 --
 .../jmr/jvm/loader/ClassFileloaderTest.java   | 220 ---------
 .../eulerlcs/jmr/jvm/loader/EmployeeV1.java   |  28 --
 .../src/test/resources/.gitkeep               |   0
 .../src/main/resources/.gitkeep               |   0
 .../src/main/resources/log4j.xml              |  16 -
 .../src/test/java/.gitkeep                    |   0
 .../src/test/resources/.gitkeep               |   0
 .../5.settingfile/eclipsev45.epf              | 186 --------
 .../5.settingfile/git cmd help.txt            |  43 --
 .../tool.161118.git-source-copy.bat           |  37 --
 .../tool.170330.java-maven-source-cleaner.bat |  37 --
 .../pom.xml                                   |   0
 .../eulerlcs/regularexpression/Utils.java     |   0
 .../src/main/resources}/.gitkeep              |   0
 .../src/main/resources/log4j.xml              |   0
 .../src/test/java}/.gitkeep                   |   0
 .../eulerlcs/regularexpression/UtilsTest.java |   0
 .../src/test/resources}/.gitkeep              |   0
 .../src/test/resources/01.txt                 |   0
 .../src/test/resources/07.txt                 |   0
 149 files changed, 5779 deletions(-)
 delete mode 100644 students/41689722.eulerlcs/2.code/.gitignore
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/data/shoppingcart/shoppingcart.data
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/data/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-63-download/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/data/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/.gitkeep
 delete mode 100644 students/41689722.eulerlcs/5.settingfile/eclipsev45.epf
 delete mode 100644 students/41689722.eulerlcs/5.settingfile/git cmd help.txt
 delete mode 100644 students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat
 delete mode 100644 students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat
 rename students/41689722.eulerlcs/{2.code/jmr-71-regularexpression => regularexpression}/pom.xml (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-71-regularexpression => regularexpression}/src/main/java/com/github/eulerlcs/regularexpression/Utils.java (100%)
 rename students/41689722.eulerlcs/{1.article => regularexpression/src/main/resources}/.gitkeep (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-11-challenge => regularexpression}/src/main/resources/log4j.xml (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-01-aggregator/src/site => regularexpression/src/test/java}/.gitkeep (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-71-regularexpression => regularexpression}/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-02-parent/src/site => regularexpression/src/test/resources}/.gitkeep (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-71-regularexpression => regularexpression}/src/test/resources/01.txt (100%)
 rename students/41689722.eulerlcs/{2.code/jmr-71-regularexpression => regularexpression}/src/test/resources/07.txt (100%)

diff --git a/students/41689722.eulerlcs/2.code/.gitignore b/students/41689722.eulerlcs/2.code/.gitignore
deleted file mode 100644
index c2be49c379..0000000000
--- a/students/41689722.eulerlcs/2.code/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.metadata/
-.recommenders/
-**/.settings/
-**/target/
-**/.classpath
-**/.project
diff --git a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml b/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
deleted file mode 100644
index 78a5afbac0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>com.github.eulerlcs</groupId>
-	<artifactId>jmr-01-aggregator</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>pom</packaging>
-	<description>eulerlcs master java road aggregator</description>
-
-	<modules>
-		<module>../jmr-02-parent</module>
-		<module>../jmr-11-challenge</module>
-		<module>../jmr-61-collection</module>
-		<module>../jmr-62-litestruts</module>
-		<module>../jmr-63-download</module>
-		<module>../jmr-64-minijvm</module>
-	</modules>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml b/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
deleted file mode 100644
index 381200eaa0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>com.github.eulerlcs</groupId>
-	<artifactId>jmr-02-parent</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>pom</packaging>
-	<description>eulerlcs master java road parent</description>
-
-
-	<properties>
-		<slf4j.version>1.7.24</slf4j.version>
-		<junit.version>4.12</junit.version>
-		<maven.surefire.plugin.version>2.17</maven.surefire.plugin.version>
-		<maven.compiler.target>1.8</maven.compiler.target>
-		<maven.compiler.source>1.8</maven.compiler.source>
-	</properties>
-
-	<dependencyManagement>
-		<dependencies>
-			<dependency>
-				<groupId>org.apache.camel</groupId>
-				<artifactId>camel-stream</artifactId>
-				<version>2.19.1</version>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.camel</groupId>
-				<artifactId>camel-core</artifactId>
-				<version>2.19.1</version>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.activemq</groupId>
-				<artifactId>activemq-core</artifactId>
-				<version>5.7.0</version>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.commons</groupId>
-				<artifactId>commons-lang3</artifactId>
-				<version>3.5</version>
-			</dependency>
-			<dependency>
-				<groupId>org.apache.commons</groupId>
-				<artifactId>commons-io</artifactId>
-				<version>1.3.2</version>
-			</dependency>
-			<dependency>
-				<groupId>com.github.eulerlcs</groupId>
-				<artifactId>jmr-61-collection</artifactId>
-				<version>${project.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>commons-digester</groupId>
-				<artifactId>commons-digester</artifactId>
-				<version>2.1</version>
-			</dependency>
-			<dependency>
-				<groupId>org.jdom</groupId>
-				<artifactId>jdom2</artifactId>
-				<version>2.0.6</version>
-			</dependency>
-			<dependency>
-				<groupId>dom4j</groupId>
-				<artifactId>dom4j</artifactId>
-				<version>1.6.1</version>
-			</dependency>
-			<dependency>
-				<groupId>org.projectlombok</groupId>
-				<artifactId>lombok</artifactId>
-				<version>1.16.14</version>
-				<scope>provided</scope>
-			</dependency>
-			<dependency>
-				<groupId>org.slf4j</groupId>
-				<artifactId>slf4j-api</artifactId>
-				<version>${slf4j.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>org.slf4j</groupId>
-				<artifactId>slf4j-log4j12</artifactId>
-				<version>${slf4j.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>junit</groupId>
-				<artifactId>junit</artifactId>
-				<version>${junit.version}</version>
-				<scope>test</scope>
-			</dependency>
-			<dependency>
-				<groupId>com.github.stefanbirkner</groupId>
-				<artifactId>system-rules</artifactId>
-				<version>1.16.1</version>
-				<scope>test</scope>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
-
-	<build>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-source-plugin</artifactId>
-					<version>3.0.1</version>
-					<executions>
-						<execution>
-							<id>attach-source</id>
-							<goals>
-								<goal>jar-no-fork</goal>
-							</goals>
-						</execution>
-					</executions>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-compiler-plugin</artifactId>
-					<version>3.6.1</version>
-					<configuration>
-						<source>${maven.compiler.source}</source>
-						<target>${maven.compiler.target}</target>
-					</configuration>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-jar-plugin</artifactId>
-					<version>3.0.2</version>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-javadoc-plugin</artifactId>
-					<version>2.10.4</version>
-					<configuration>
-						<author>true</author>
-						<source>1.8</source>
-						<show>protected</show>
-						<encoding>UTF-8</encoding>
-						<charset>UTF-8</charset>
-						<docencoding>UTF-8</docencoding>
-					</configuration>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-surefire-plugin</artifactId>
-					<version>2.19.1</version>
-				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-surefire-report-plugin</artifactId>
-					<version>2.19.1</version>
-					<configuration>
-						<aggregate>true</aggregate>
-					</configuration>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-source-plugin</artifactId>
-			</plugin>
-		</plugins>
-	</build>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/shoppingcart/shoppingcart.data b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/shoppingcart/shoppingcart.data
deleted file mode 100644
index 336fd732b4dcf94a212cb3a8f2718aca7a10584b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 131
zcmZ=T{#&s4I+ra20|O5Ok5^(@qC$vnaYklQiG%X5hwke{s(~^b3>;t?-_mpkeYhwu
zgRo0!cB+C`X?l82W?s62OMXsHu>=3>R=FL4Z-Cllq1pm6^Bjb~9_o+L_y!a;V&DTC
O=ABxp;GB_|nFj!(-zjkb

diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml
deleted file mode 100644
index e989327e9d..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/app-config.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<app-config>
-	<input-path>a</input-path>
-	<input-look-subfolder>b</input-look-subfolder>
-	<input-encode>c</input-encode>
-	<output-path>d</output-path>
-	<output-by-package-tree>e</output-by-package-tree>
-	<output-prefix>f</output-prefix>
-	<output-subfix>g</output-subfix>
-	<output-encode>h</output-encode>
-	<output-package-name>i</output-package-name>
-</app-config>
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
deleted file mode 100644
index 748019e106..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<files project="demo" value="123">
-	<file dir="d:/dir01">a.txt</file>
-	<file dir="d:/dir02">b.txt</file>
-</files>
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml b/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
deleted file mode 100644
index 3f106b77b5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-11-challenge</artifactId>
-	<description>eulerlcs master java road challenge</description>
-
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.camel</groupId>
-			<artifactId>camel-stream</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.camel</groupId>
-			<artifactId>camel-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-digester</groupId>
-			<artifactId>commons-digester</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.jdom</groupId>
-			<artifactId>jdom2</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>dom4j</groupId>
-			<artifactId>dom4j</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.stefanbirkner</groupId>
-			<artifactId>system-rules</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java
deleted file mode 100644
index 2cbe755db2..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello1.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.main.Main;
-
-public class Hello1 {
-	public static void main(String[] args) throws Exception {
-		System.out.println("hello camel");
-
-		Main main = new Main();
-		main.start();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java
deleted file mode 100644
index 17ea05f2cb..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/Hello2.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.main.Main;
-
-public class Hello2 {
-	public static void main(String[] args) throws Exception {
-		System.out.println("hello camel");
-
-		Main main = new Main();
-		main.addRouteBuilder(new HelloRoute6());
-		main.run();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java
deleted file mode 100644
index 9f7f9b1c1c..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloConv.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-public class HelloConv {
-	public String addHello(String data) {
-		return "MyHello " + data;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java
deleted file mode 100644
index 5c5de3e899..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor1.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-
-public class HelloProcessor1 implements Processor {
-	@Override
-	public void process(Exchange exchange) throws Exception {
-		String body = exchange.getIn().getBody(String.class);
-		body = "Hello " + body;
-		exchange.getIn().setBody(body);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java
deleted file mode 100644
index 0009907c99..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloProcessor2.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-
-public class HelloProcessor2 implements Processor {
-	@Override
-	public void process(Exchange exchange) throws Exception {
-		String body = exchange.getIn().getBody(String.class);
-
-		if ("".equals(body)) {
-			throw new Exception("empty value.");
-		}
-
-		body = "Hello " + body;
-		exchange.getIn().setBody(body);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java
deleted file mode 100644
index 6a6c01f909..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.builder.RouteBuilder;
-
-public class HelloRoute1 extends RouteBuilder {
-
-	@Override
-	public void configure() throws Exception {
-		from("timer:test-hello").to("log:test-log");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java
deleted file mode 100644
index a83e09d34f..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute2.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.builder.RouteBuilder;
-
-public class HelloRoute2 extends RouteBuilder {
-
-	@Override
-	public void configure() throws Exception {
-		from("stream:in?promptMessage=Enter : ").to("stream:out");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java
deleted file mode 100644
index 3e11a71181..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute3.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.builder.RouteBuilder;
-
-public class HelloRoute3 extends RouteBuilder {
-
-	@Override
-	public void configure() throws Exception {
-		from("stream:in?promptMessage=Enter : ").process(new HelloProcessor1()).to("stream:out");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java
deleted file mode 100644
index 315279b213..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute4.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.builder.RouteBuilder;
-
-public class HelloRoute4 extends RouteBuilder {
-
-	@Override
-	public void configure() throws Exception {
-		from("stream:in?promptMessage=Enter : ").process(new HelloProcessor1())
-				.bean(HelloConv.class, "addHello(${body})").to("stream:out");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java
deleted file mode 100644
index 816304c82b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute5.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.builder.RouteBuilder;
-
-public class HelloRoute5 extends RouteBuilder {
-
-	@Override
-	public void configure() throws Exception {
-		from("stream:in?promptMessage=Enter : ").routeId("HelloRoute20170705").process(new HelloProcessor2())
-				.to("stream:out");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java
deleted file mode 100644
index dae8d2887a..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/camel/HelloRoute6.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.camel;
-
-import org.apache.camel.builder.RouteBuilder;
-
-public class HelloRoute6 extends RouteBuilder {
-
-	@Override
-	public void configure() throws Exception {
-		onException(Exception.class).handled(true).setBody().constant("なにかエラーが発生").to("stream:out");
-
-		from("stream:in?promptMessage=Enter : ").process(new HelloProcessor2()).process(new HelloProcessor2())
-				.to("stream:out");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
deleted file mode 100644
index 82c8b60d56..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.core;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class FileSystemClassLoader extends ClassLoader {
-
-	private String rootDir;
-
-	public FileSystemClassLoader(String rootDir) {
-		this.rootDir = rootDir;
-	}
-
-	@Override
-	protected Class<?> findClass(String name) throws ClassNotFoundException {
-		byte[] classData = getClassData(name);
-		if (classData == null) {
-			throw new ClassNotFoundException();
-		} else {
-			return defineClass(name, classData, 0, classData.length);
-		}
-	}
-
-	private byte[] getClassData(String className) {
-		String path = classNameToPath(className);
-		InputStream ins = null;
-		try {
-			ins = new FileInputStream(path);
-			ByteArrayOutputStream baos = new ByteArrayOutputStream();
-			int bufferSize = 4096;
-			byte[] buffer = new byte[bufferSize];
-			int bytesNumRead = 0;
-			while ((bytesNumRead = ins.read(buffer)) != -1) {
-				baos.write(buffer, 0, bytesNumRead);
-			}
-			return baos.toByteArray();
-		} catch (IOException e) {
-			e.printStackTrace();
-		} finally {
-			if (ins != null) {
-				try {
-					ins.close();
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-
-		return null;
-	}
-
-	private String classNameToPath(String className) {
-		return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
deleted file mode 100644
index 697bf8065f..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.core;
-
-public interface ICalculator extends Versioned {
-	String calculate(String expression);
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
deleted file mode 100644
index c0f524a1b4..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.core;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.net.URL;
-
-public class NetworkClassLoader extends ClassLoader {
-
-	private String rootUrl;
-
-	public NetworkClassLoader(String rootUrl) {
-		this.rootUrl = rootUrl;
-	}
-
-	protected Class<?> findClass(String name) throws ClassNotFoundException {
-		byte[] classData = getClassData(name);
-		if (classData == null) {
-			throw new ClassNotFoundException();
-		} else {
-			return defineClass(name, classData, 0, classData.length);
-		}
-	}
-
-	private byte[] getClassData(String className) {
-		String path = classNameToPath(className);
-		try {
-			URL url = new URL(path);
-			InputStream ins = url.openStream();
-			ByteArrayOutputStream baos = new ByteArrayOutputStream();
-			int bufferSize = 4096;
-			byte[] buffer = new byte[bufferSize];
-			int bytesNumRead = 0;
-			while ((bytesNumRead = ins.read(buffer)) != -1) {
-				baos.write(buffer, 0, bytesNumRead);
-			}
-			return baos.toByteArray();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	private String classNameToPath(String className) {
-		return rootUrl + "/" + className.replace('.', '/') + ".class";
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
deleted file mode 100644
index 34dfacbbd1..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.core;
-
-public interface Versioned {
-	String getVersion();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
deleted file mode 100644
index d19ee1dbe0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.driver;
-
-import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
-import com.github.eulerlcs.jmr.challenge.classloader.core.NetworkClassLoader;
-
-public class CalculatorTest {
-
-	public static void main(String[] args) {
-		String url = "http://localhost:8080/ClassloaderTest/classes";
-		NetworkClassLoader ncl = new NetworkClassLoader(url);
-		String basicClassName = "com.example.CalculatorBasic";
-		String advancedClassName = "com.example.CalculatorAdvanced";
-		try {
-			Class<?> clazz = ncl.loadClass(basicClassName);
-			ICalculator calculator = (ICalculator) clazz.newInstance();
-			System.out.println(calculator.getVersion());
-			clazz = ncl.loadClass(advancedClassName);
-			calculator = (ICalculator) clazz.newInstance();
-			System.out.println(calculator.getVersion());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
deleted file mode 100644
index 3a9226b8ca..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.driver;
-
-import java.io.File;
-import java.lang.reflect.Method;
-
-import com.github.eulerlcs.jmr.challenge.classloader.core.FileSystemClassLoader;
-
-public class ClassIdentity {
-
-	public static void main(String[] args) {
-		new ClassIdentity().testClassIdentity();
-	}
-
-	public void testClassIdentity() {
-		String userDir = System.getProperty("user.dir");
-		String classDataRootPath = userDir + File.separator + "data" + File.separator + "classloader";
-
-		FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
-		FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
-		String className = "com.github.eulerlcs.jmr.challenge.classloader.sample.Sample";
-
-		try {
-			Class<?> class1 = fscl1.loadClass(className);
-			Object obj1 = class1.newInstance();
-
-			Class<?> class2 = fscl2.loadClass(className);
-			Object obj2 = class2.newInstance();
-
-			Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class);
-
-			setSampleMethod.invoke(obj1, obj2);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
deleted file mode 100644
index 38916b6db5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.driver;
-
-public class ClassLoaderTree {
-
-	public static void main(String[] args) {
-		ClassLoader loader = ClassLoaderTree.class.getClassLoader();
-		while (loader != null) {
-			System.out.println(loader.toString());
-			loader = loader.getParent();
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
deleted file mode 100644
index d35a4ee992..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * download from ibm developerworks
- * 
- * @see <a href=
- *      "https://www.ibm.com/developerworks/cn/java/j-lo-classloader/">https://www.ibm.com/developerworks/cn/java/j-lo-classloader/</a>
- */
-package com.github.eulerlcs.jmr.challenge.classloader;
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
deleted file mode 100644
index 9076a4f4c8..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
-
-import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
-
-public class CalculatorAdvanced implements ICalculator {
-
-	public String calculate(String expression) {
-		return "Result is " + expression;
-	}
-
-	public String getVersion() {
-		return "2.0";
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
deleted file mode 100644
index d5f7b054dd..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
-
-import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
-
-public class CalculatorBasic implements ICalculator {
-
-	public String calculate(String expression) {
-		return expression;
-	}
-
-	public String getVersion() {
-		return "1.0";
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
deleted file mode 100644
index c67a7278e8..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
-
-public class Sample {
-	@SuppressWarnings("unused")
-	private Sample instance;
-
-	public void setSample(Object instance) {
-		this.instance = (Sample) instance;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
deleted file mode 100644
index 2afd5b2074..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.systemrules;
-
-public class AppWithExit {
-	public static String message;
-
-	public static void doSomethingAndExit() {
-		message = "exit ...";
-		System.exit(1);
-	}
-
-	public static void doNothing() {
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
deleted file mode 100644
index 1710e69d47..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * copy from http://stefanbirkner.github.io/system-rules/index.html
- */
-
-package com.github.eulerlcs.jmr.challenge.systemrules;
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
deleted file mode 100644
index 3f58d74c7f..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.digester.core;
-
-import org.apache.commons.digester.Digester;
-
-import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.Hello;
-
-public class HelloDigester {
-	public static Digester newInstance() {
-		Digester d = new Digester();
-
-		d.addObjectCreate("files", Hello.class);
-		d.addSetProperties("files");
-		d.addRuleSet(new HelloFileRulerSet("files/"));
-
-		return d;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
deleted file mode 100644
index 3d62c8c93e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.digester.core;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.digester.RuleSetBase;
-
-import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.HelloFile;
-
-final class HelloFileRulerSet extends RuleSetBase {
-	protected String prefix = null;
-
-	public HelloFileRulerSet() {
-		this("");
-	}
-
-	public HelloFileRulerSet(String prefix) {
-		super();
-		this.namespaceURI = null;
-		this.prefix = prefix;
-	}
-
-	@Override
-	public void addRuleInstances(Digester digester) {
-		digester.addObjectCreate(prefix + "file", HelloFile.class);
-		digester.addSetProperties(prefix + "file", "dir", "path");
-		digester.addBeanPropertySetter(prefix + "file", "name");
-		digester.addSetNext(prefix + "file", "addFile");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
deleted file mode 100644
index 59a2987909..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.digester.driver;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.commons.digester.Digester;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
-
-import com.github.eulerlcs.jmr.challenge.xmlparser.digester.core.HelloDigester;
-import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.Hello;
-
-public class Driver {
-	private final static Logger log = LoggerFactory.getLogger(Driver.class);
-
-	public static void main(String[] args) {
-		Digester d = HelloDigester.newInstance();
-
-		try {
-			File file = new File("data//xmlparser", "hello.xml");
-			Hello helloEntity = (Hello) d.parse(file);
-			log.debug("hello.value=[{}]", helloEntity.getValue());
-		} catch (IOException | SAXException e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
deleted file mode 100644
index 415dbef23a..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class Hello {
-	private String project;
-	private String value;
-	private List<HelloFile> files = new ArrayList<>();
-
-	public void addFile(HelloFile file) {
-		files.add(file);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
deleted file mode 100644
index 2892a3058e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class HelloFile {
-	private String path;
-	private String name;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java
deleted file mode 100644
index c50bce4a15..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/AppConfig.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import lombok.Getter;
-
-@Getter
-@XmlRootElement(name = "app-config")
-public class AppConfig {
-	@XmlElement(name = "input-path")
-	private String inputPath;
-	@XmlElement(name = "input-look-subfolder")
-	private boolean inputLookSubfolder;
-	@XmlElement(name = "input-encode")
-	private String inputEncode;
-	@XmlElement(name = "output-path")
-	private String outputPath;
-	@XmlElement(name = "output-by-package-tree")
-	private boolean outputByPackageTree;
-	@XmlElement(name = "output-prefix")
-	private String outputPrefix;
-	@XmlElement(name = "output-subfix")
-	private String outputSubfix;
-	@XmlElement(name = "output-encode")
-	private String outputEncode;
-	@XmlElement(name = "output-package-name")
-	private String outputPackageName;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java
deleted file mode 100644
index 15c5686e2e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Driver.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
-
-import java.io.File;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Driver {
-	private final static Logger log = LoggerFactory.getLogger(Driver.class);
-
-	public static void main(String[] args) {
-		File xml = new File("data//xmlparser", "hello.xml");
-		Hello hello = JaxbParser.loadAppConfig(xml, Hello.class);
-		log.debug("hello.value=[{}]", hello.getValue());
-
-		xml = new File("data//xmlparser", "app-config.xml");
-		AppConfig appConfig = JaxbParser.loadAppConfig(xml, AppConfig.class);
-		log.debug("process-args.InputPath=[{}] ", appConfig.getInputPath());
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java
deleted file mode 100644
index 5bad90241e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/Hello.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
-
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.HelloFile;
-
-import lombok.Getter;
-
-@Getter
-@XmlRootElement(name = "files")
-public class Hello {
-	@XmlAttribute
-	private String project;
-	@XmlAttribute
-	private String value;
-	@XmlElement(name = "file")
-	private List<HelloFile> files;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java
deleted file mode 100644
index c5bdd127f1..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/HelloFile.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
-
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlValue;
-
-import lombok.Getter;
-
-@Getter
-public class HelloFile {
-	@XmlAttribute(name = "dir")
-	private String path;
-	@XmlValue
-	private String name;
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java
deleted file mode 100644
index 720f524426..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/jaxb/JaxbParser.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.jaxb;
-
-import java.io.File;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-/* jaxb: Java Architecture for XML Binding */
-public class JaxbParser {
-	@SuppressWarnings("unchecked")
-	public static <E> E loadAppConfig(File xml, Class<E> clazz) {
-		E entity = null;
-		try {
-			JAXBContext jc = JAXBContext.newInstance(clazz);
-			Unmarshaller u = jc.createUnmarshaller();
-			entity = (E) u.unmarshal(xml);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return entity;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
deleted file mode 100644
index 4f7a71c4bc..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * 各种xml库
- * <ul>
- * <li>apache digester
- * <li>dom
- * <li>dom4j
- * <li>ldom
- * <li>jaxb
- * <li>sax
- * </ul>
- */
-
-package com.github.eulerlcs.jmr.challenge.xmlparser;
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java
deleted file mode 100644
index d15739c5c9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/Driver.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.sax;
-
-import java.io.File;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-public class Driver {
-	public static void main(String[] args) {
-		SAXParserFactory factory = SAXParserFactory.newInstance();
-		File xml = new File("data//xmlparser", "hello.xml");
-		try {
-			SAXParser parser = factory.newSAXParser();
-			parser.parse(xml, new HelloSaxParser());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java
deleted file mode 100644
index 26cc926b11..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/sax/HelloSaxParser.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.xmlparser.sax;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/* sax: simple api for xml */
-public class HelloSaxParser extends DefaultHandler {
-	protected static Logger log = LoggerFactory.getLogger(HelloSaxParser.class);
-
-	@Override
-	public void startDocument() throws SAXException {
-		super.startDocument();
-		log.debug("sax startDocument");
-	}
-
-	@Override
-	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-		super.startElement(uri, localName, qName, attributes);
-		log.debug("sax startElement qName: [{}]", qName);
-	}
-
-	@Override
-	public void characters(char[] ch, int start, int length) throws SAXException {
-		super.characters(ch, start, length);
-		log.debug("sax characters: [{}]", new String(ch, start, length));
-	}
-
-	@Override
-	public void endElement(String uri, String localName, String qName) throws SAXException {
-		super.endElement(uri, localName, qName);
-		log.debug("sax endElement qName: [{}]", qName);
-	}
-
-	@Override
-	public void endDocument() throws SAXException {
-		super.endDocument();
-		log.debug("sax endDocument");
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java
deleted file mode 100644
index b18db9d387..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170205.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.zzz.master170219;
-
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-public class Try170205 {
-	public static void main(String[] args) throws Exception {
-		task94();
-		task93();
-		task84();
-		task83();
-		task65();
-		task64();
-
-		ArrayList<Integer> list = new ArrayList<Integer>();
-		show(list);
-	}
-
-	public static void show(ArrayList<? extends Number> list) {
-		// ....
-	}
-
-	public static void task64() {
-		DataInputStream dis = null;
-		double price = 0;
-		int count = 0;
-		double sum = 0;
-		String disp = "";
-
-		try {
-			dis = new DataInputStream(new FileInputStream("data/shoppingcart.data"));
-			while (dis.available() > 0) {
-				price = dis.readDouble();
-				count = dis.readInt();
-				disp = dis.readUTF();
-				System.out.println(disp);
-				sum += price * count;
-			}
-
-			System.out.println("sum=" + sum);
-		} catch (IOException e) {
-			e.printStackTrace();
-		} finally {
-			try {
-				dis.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-	}
-
-	public static void task65() {
-		DataInputStream dis = null;
-		byte[] magic = { (byte) 0xca, (byte) 0xfe, (byte) 0xba, (byte) 0xbe };
-		boolean ret = true;
-
-		try {
-			dis = new DataInputStream(new FileInputStream("data/sc.class"));
-			for (int i = 0; i < 4; i++) {
-				if (magic[i] != dis.readByte()) {
-					ret = false;
-					break;
-				}
-			}
-		} catch (IOException e) {
-			e.printStackTrace();
-		} finally {
-			try {
-				dis.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-		if (ret) {
-			System.out.println("it is cafebabe");
-		} else {
-			System.out.println("it is not cafebabe");
-		}
-	}
-
-	public static void task83() throws Exception {
-		Class<?> clazz = Class.forName("shoppingcart.Employee");
-		Constructor<?> ct = clazz.getConstructor(String.class, int.class);
-		Object obj = ct.newInstance("ref", 22);
-
-		Method sayHello = clazz.getDeclaredMethod("sayHello");
-		sayHello.invoke(obj);
-
-		Method getID = clazz.getDeclaredMethod("getID");
-		getID.setAccessible(true);
-		String ids = (String) getID.invoke(obj);
-		System.out.println("getID=" + ids);
-
-		Field[] flds = clazz.getDeclaredFields();
-		for (Field fld : flds) {
-			System.out.println(fld);
-		}
-	}
-
-	public static void task84() throws Exception {
-		ArrayList<Integer> list = new ArrayList<>();
-		list.add(3232);
-
-		Class<?> clazz = ArrayList.class;
-
-		Field elementDataField = clazz.getDeclaredField("elementData");
-		elementDataField.setAccessible(true);
-		Object[] elementData = (Object[]) elementDataField.get(list);
-		if (elementData.length > 1) {
-			elementData[1] = "added by reflection";
-		}
-	}
-
-	public static void task93() {
-		ArrayList<String> list1 = new ArrayList<String>();
-		ArrayList<Integer> list2 = new ArrayList<Integer>();
-		System.out.println(list1.getClass().equals(list2.getClass()));
-	}
-
-	public static void task94() {
-		ArrayList<Number> numbers = new ArrayList<Number>();
-		numbers.add(new Integer(10));
-		numbers.add(new Double(10.0d));
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java
deleted file mode 100644
index 5492441572..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170212.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.zzz.master170219;
-
-public class Try170212 {
-
-	public static void main(String[] args) {
-		t28();
-	}
-
-	public static void changeStr(String str) {
-		str = "welcome";
-	}
-
-	public static void t28() {
-		String str = "1234";
-		changeStr(str);
-		System.out.println(str);
-	}
-
-	public static void t34() {
-		Try170212 x = new Try170212();
-		Try170212.Hello obj = x.new Hello("");
-		obj.msg += ",World!";
-		System.out.println(obj.msg);
-	}
-
-	class Hello {
-		public String msg = "Hello";
-
-		public Hello(String msg) {
-			this.msg = msg;
-		}
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java
deleted file mode 100644
index 559dc44a7c..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/zzz/master170219/Try170219.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.github.eulerlcs.jmr.challenge.zzz.master170219;
-
-import java.util.ArrayList;
-import java.util.Date;
-
-public class Try170219 {
-	public static void main(String[] args) {
-		Integer[] a = new Integer[10];
-		case003(a);
-	}
-
-	public static void case001() {
-		Fruit f = new Apple();
-		f.setDate(new Date());
-	}
-
-	public static void case002() {
-		ArrayList<String> list1 = new ArrayList<String>();
-		ArrayList<Integer> list2 = new ArrayList<Integer>();
-		System.out.println(list1.getClass().equals(list2.getClass()));
-	}
-
-	public static void case003(Number[] n) {
-		// nop
-	}
-
-}
-
-class Fruit {
-	public void setDate(Object d) {
-		System.out.println("Fruit.setDate(Object d)");
-	}
-
-	// public void setDate2(Object d) {
-	// System.out.println("Fruit.setDate(Object d)");
-	// }
-}
-
-class Apple extends Fruit {
-	public void setDate(Date d) {
-		System.out.println("Apple.setDate(Date d)");
-	}
-
-	public void setDate2(Date d) {
-		System.out.println("Apple.setDate(Date d)");
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java
deleted file mode 100644
index 48b4f67670..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/BatchDownloadFile.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.hoo.download;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import com.hoo.entity.DownloadInfo;
-import com.hoo.util.LogUtils;
-
-/**
- * <b>function:</b> 分批量下载文件
- * 
- * @author hoojo
- * @createDate 2011-9-22 下午05:51:54
- * @file BatchDownloadFile.java
- * @package com.hoo.download
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public class BatchDownloadFile implements Runnable {
-	// 下载文件信息
-	private DownloadInfo downloadInfo;
-	// 一组开始下载位置
-	private long[] startPos;
-	// 一组结束下载位置
-	private long[] endPos;
-	// 休眠时间
-	private static final int SLEEP_SECONDS = 500;
-	// 子线程下载
-	private DownloadFile[] fileItem;
-	// 文件长度
-	private int length;
-	// 是否第一个文件
-	private boolean first = true;
-	// 是否停止下载
-	private boolean stop = false;
-	// 临时文件信息
-	private File tempFile;
-
-	public BatchDownloadFile(DownloadInfo downloadInfo) {
-		this.downloadInfo = downloadInfo;
-		String tempPath = this.downloadInfo.getFilePath() + File.separator + downloadInfo.getFileName() + ".position";
-		tempFile = new File(tempPath);
-		// 如果存在读入点位置的文件
-		if (tempFile.exists()) {
-			first = false;
-			// 就直接读取内容
-			try {
-				readPosInfo();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		} else {
-			// 数组的长度就要分成多少段的数量
-			startPos = new long[downloadInfo.getSplitter()];
-			endPos = new long[downloadInfo.getSplitter()];
-		}
-	}
-
-	@Override
-	public void run() {
-		// 首次下载，获取下载文件长度
-		if (first) {
-			length = this.getFileSize();// 获取文件长度
-			if (length == -1) {
-				LogUtils.log("file length is know!");
-				stop = true;
-			} else if (length == -2) {
-				LogUtils.log("read file length is error!");
-				stop = true;
-			} else if (length > 0) {
-				/**
-				 * eg start: 1, 3, 5, 7, 9 end: 3, 5, 7, 9, length
-				 */
-				for (int i = 0, len = startPos.length; i < len; i++) {
-					int size = i * (length / len);
-					startPos[i] = size;
-
-					// 设置最后一个结束点的位置
-					if (i == len - 1) {
-						endPos[i] = length;
-					} else {
-						size = (i + 1) * (length / len);
-						endPos[i] = size;
-					}
-					LogUtils.log("start-end Position[" + i + "]: " + startPos[i] + "-" + endPos[i]);
-				}
-			} else {
-				LogUtils.log("get file length is error, download is stop!");
-				stop = true;
-			}
-		}
-
-		// 子线程开始下载
-		if (!stop) {
-			// 创建单线程下载对象数组
-			fileItem = new DownloadFile[startPos.length];// startPos.length =
-															// downloadInfo.getSplitter()
-			for (int i = 0; i < startPos.length; i++) {
-				try {
-					// 创建指定个数单线程下载对象，每个线程独立完成指定块内容的下载
-					fileItem[i] = new DownloadFile(downloadInfo.getUrl(),
-							this.downloadInfo.getFilePath() + File.separator + downloadInfo.getFileName(), startPos[i],
-							endPos[i], i);
-					fileItem[i].start();// 启动线程，开始下载
-					LogUtils.log("Thread: " + i + ", startPos: " + startPos[i] + ", endPos: " + endPos[i]);
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-
-			// 循环写入下载文件长度信息
-			while (!stop) {
-				try {
-					writePosInfo();
-					LogUtils.log("downloading……");
-					Thread.sleep(SLEEP_SECONDS);
-					stop = true;
-				} catch (IOException e) {
-					e.printStackTrace();
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-				for (int i = 0; i < startPos.length; i++) {
-					if (!fileItem[i].isDownloadOver()) {
-						stop = false;
-						break;
-					}
-				}
-			}
-			LogUtils.info("Download task is finished!");
-		}
-	}
-
-	/**
-	 * 将写入点数据保存在临时文件中
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-23 下午05:25:37
-	 * @throws IOException
-	 */
-	private void writePosInfo() throws IOException {
-		DataOutputStream dos = new DataOutputStream(new FileOutputStream(tempFile));
-		dos.writeInt(startPos.length);
-		for (int i = 0; i < startPos.length; i++) {
-			dos.writeLong(fileItem[i].getStartPos());
-			dos.writeLong(fileItem[i].getEndPos());
-			// LogUtils.info("[" + fileItem[i].getStartPos() + "#" +
-			// fileItem[i].getEndPos() + "]");
-		}
-		dos.close();
-	}
-
-	/**
-	 * <b>function:</b>读取写入点的位置信息
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-23 下午05:30:29
-	 * @throws IOException
-	 */
-	private void readPosInfo() throws IOException {
-		DataInputStream dis = new DataInputStream(new FileInputStream(tempFile));
-		int startPosLength = dis.readInt();
-		startPos = new long[startPosLength];
-		endPos = new long[startPosLength];
-		for (int i = 0; i < startPosLength; i++) {
-			startPos[i] = dis.readLong();
-			endPos[i] = dis.readLong();
-		}
-		dis.close();
-	}
-
-	/**
-	 * <b>function:</b> 获取下载文件的长度
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-26 下午12:15:08
-	 * @return
-	 */
-	private int getFileSize() {
-		int fileLength = -1;
-		try {
-			URL url = new URL(this.downloadInfo.getUrl());
-			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-
-			DownloadFile.setHeader(conn);
-
-			int stateCode = conn.getResponseCode();
-			// 判断http status是否为HTTP/1.1 206 Partial Content或者200 OK
-			if (stateCode != HttpURLConnection.HTTP_OK && stateCode != HttpURLConnection.HTTP_PARTIAL) {
-				LogUtils.log("Error Code: " + stateCode);
-				return -2;
-			} else if (stateCode >= 400) {
-				LogUtils.log("Error Code: " + stateCode);
-				return -2;
-			} else {
-				// 获取长度
-				fileLength = conn.getContentLength();
-				LogUtils.log("FileLength: " + fileLength);
-			}
-
-			// 读取文件长度
-			/*
-			 * for (int i = 1; ; i++) { String header =
-			 * conn.getHeaderFieldKey(i); if (header != null) { if
-			 * ("Content-Length".equals(header)) { fileLength =
-			 * Integer.parseInt(conn.getHeaderField(i)); break; } } else {
-			 * break; } }
-			 */
-
-			DownloadFile.printHeader(conn);
-		} catch (MalformedURLException e) {
-			e.printStackTrace();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return fileLength;
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java
deleted file mode 100644
index 784efa1d88..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/DownloadFile.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package com.hoo.download;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import com.hoo.util.LogUtils;
-
-/**
- * <b>function:</b> 单线程下载文件
- * 
- * @author hoojo
- * @createDate 2011-9-22 下午02:55:10
- * @file DownloadFile.java
- * @package com.hoo.download
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public class DownloadFile extends Thread {
-
-	// 下载文件url
-	private String url;
-	// 下载文件起始位置
-	private long startPos;
-	// 下载文件结束位置
-	private long endPos;
-	// 线程id
-	private int threadId;
-
-	// 下载是否完成
-	private boolean isDownloadOver = false;
-
-	private SaveItemFile itemFile;
-
-	private static final int BUFF_LENGTH = 1024 * 8;
-
-	/**
-	 * @param url
-	 *            下载文件url
-	 * @param name
-	 *            文件名称
-	 * @param startPos
-	 *            下载文件起点
-	 * @param endPos
-	 *            下载文件结束点
-	 * @param threadId
-	 *            线程id
-	 * @throws IOException
-	 */
-	public DownloadFile(String url, String name, long startPos, long endPos, int threadId) throws IOException {
-		super();
-		this.url = url;
-		this.startPos = startPos;
-		this.endPos = endPos;
-		this.threadId = threadId;
-		// 分块下载写入文件内容
-		this.itemFile = new SaveItemFile(name, startPos);
-	}
-
-	@Override
-	public void run() {
-		while (endPos > startPos && !isDownloadOver) {
-			try {
-				URL url = new URL(this.url);
-				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-
-				// 设置连接超时时间为10000ms
-				conn.setConnectTimeout(10000);
-				// 设置读取数据超时时间为10000ms
-				conn.setReadTimeout(10000);
-
-				setHeader(conn);
-
-				String property = "bytes=" + startPos + "-";
-				conn.setRequestProperty("RANGE", property);
-
-				// 输出log信息
-				LogUtils.log("开始 " + threadId + "：" + property + endPos);
-				// printHeader(conn);
-
-				// 获取文件输入流，读取文件内容
-				InputStream is = conn.getInputStream();
-
-				byte[] buff = new byte[BUFF_LENGTH];
-				int length = -1;
-				LogUtils.log("#start#Thread: " + threadId + ", startPos: " + startPos + ", endPos: " + endPos);
-				while ((length = is.read(buff)) > 0 && startPos < endPos && !isDownloadOver) {
-					// 写入文件内容，返回最后写入的长度
-					startPos += itemFile.write(buff, 0, length);
-				}
-				LogUtils.log("#over#Thread: " + threadId + ", startPos: " + startPos + ", endPos: " + endPos);
-				LogUtils.log("Thread " + threadId + " is execute over!");
-				this.isDownloadOver = true;
-			} catch (MalformedURLException e) {
-				e.printStackTrace();
-			} catch (IOException e) {
-				e.printStackTrace();
-			} finally {
-				try {
-					if (itemFile != null) {
-						itemFile.close();
-					}
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		if (endPos < startPos && !isDownloadOver) {
-			LogUtils.log("Thread " + threadId + " startPos > endPos, not need download file !");
-			this.isDownloadOver = true;
-		}
-		if (endPos == startPos && !isDownloadOver) {
-			LogUtils.log("Thread " + threadId + " startPos = endPos, not need download file !");
-			this.isDownloadOver = true;
-		}
-	}
-
-	/**
-	 * <b>function:</b> 打印下载文件头部信息
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-22 下午05:44:35
-	 * @param conn
-	 *            HttpURLConnection
-	 */
-	public static void printHeader(URLConnection conn) {
-		int i = 1;
-		while (true) {
-			String header = conn.getHeaderFieldKey(i);
-			i++;
-			if (header != null) {
-				LogUtils.info(header + ":" + conn.getHeaderField(i));
-			} else {
-				break;
-			}
-		}
-	}
-
-	/**
-	 * <b>function:</b> 设置URLConnection的头部信息，伪装请求信息
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-28 下午05:29:43
-	 * @param con
-	 */
-	public static void setHeader(URLConnection conn) {
-		conn.setRequestProperty("User-Agent",
-				"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3");
-		conn.setRequestProperty("Accept-Language", "en-us,en;q=0.7,zh-cn;q=0.3");
-		conn.setRequestProperty("Accept-Encoding", "utf-8");
-		conn.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
-		conn.setRequestProperty("Keep-Alive", "300");
-		conn.setRequestProperty("connnection", "keep-alive");
-		conn.setRequestProperty("If-Modified-Since", "Fri, 02 Jan 2009 17:00:05 GMT");
-		conn.setRequestProperty("If-None-Match", "\"1261d8-4290-df64d224\"");
-		conn.setRequestProperty("Cache-conntrol", "max-age=0");
-		conn.setRequestProperty("Referer", "https://www.github.com");
-	}
-
-	public boolean isDownloadOver() {
-		return isDownloadOver;
-	}
-
-	public long getStartPos() {
-		return startPos;
-	}
-
-	public long getEndPos() {
-		return endPos;
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java
deleted file mode 100644
index c0dcb62ac3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/download/SaveItemFile.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.hoo.download;
-
-import java.io.IOException;
-import java.io.RandomAccessFile;
-
-/**
- * <b>function:</b> 写入文件、保存文件
- * 
- * @author hoojo
- * @createDate 2011-9-21 下午05:44:02
- * @file SaveItemFile.java
- * @package com.hoo.download
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public class SaveItemFile {
-	// 存储文件
-	private RandomAccessFile itemFile;
-
-	public SaveItemFile() throws IOException {
-		this("", 0);
-	}
-
-	/**
-	 * @param name
-	 *            文件路径、名称
-	 * @param pos
-	 *            写入点位置 position
-	 * @throws IOException
-	 */
-	public SaveItemFile(String name, long pos) throws IOException {
-		itemFile = new RandomAccessFile(name, "rw");
-		// 在指定的pos位置开始写入数据
-		itemFile.seek(pos);
-	}
-
-	/**
-	 * <b>function:</b> 同步方法写入文件
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-26 下午12:21:22
-	 * @param buff
-	 *            缓冲数组
-	 * @param start
-	 *            起始位置
-	 * @param length
-	 *            长度
-	 * @return
-	 */
-	public synchronized int write(byte[] buff, int start, int length) {
-		int i = -1;
-		try {
-			itemFile.write(buff, start, length);
-			i = length;
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return i;
-	}
-
-	public void close() throws IOException {
-		if (itemFile != null) {
-			itemFile.close();
-		}
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java
deleted file mode 100644
index 7ef4ba5477..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/entity/DownloadInfo.java
+++ /dev/null
@@ -1,125 +0,0 @@
-
-package com.hoo.entity;
-
-/**
- * <b>function:</b> 下载文件信息类
- * 
- * @author hoojo
- * @createDate 2011-9-21 下午05:14:58
- * @file DownloadInfo.java
- * @package com.hoo.entity
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public class DownloadInfo {
-	// 下载文件url
-	private String url;
-	// 下载文件名称
-	private String fileName;
-	// 下载文件路径
-	private String filePath;
-	// 分成多少段下载， 每一段用一个线程完成下载
-	private int splitter;
-
-	// 下载文件默认保存路径
-	private final static String FILE_PATH = "C:/temp";
-	// 默认分块数、线程数
-	private final static int SPLITTER_NUM = 5;
-
-	public DownloadInfo() {
-		super();
-	}
-
-	/**
-	 * @param url
-	 *            下载地址
-	 */
-	public DownloadInfo(String url) {
-		this(url, null, null, SPLITTER_NUM);
-	}
-
-	/**
-	 * @param url
-	 *            下载地址url
-	 * @param splitter
-	 *            分成多少段或是多少个线程下载
-	 */
-	public DownloadInfo(String url, int splitter) {
-		this(url, null, null, splitter);
-	}
-
-	/***
-	 * @param url
-	 *            下载地址
-	 * @param fileName
-	 *            文件名称
-	 * @param filePath
-	 *            文件保存路径
-	 * @param splitter
-	 *            分成多少段或是多少个线程下载
-	 */
-	public DownloadInfo(String url, String fileName, String filePath, int splitter) {
-		super();
-		if (url == null || "".equals(url)) {
-			throw new RuntimeException("url is not null!");
-		}
-		this.url = url;
-		this.fileName = (fileName == null || "".equals(fileName)) ? getFileName(url) : fileName;
-		this.filePath = (filePath == null || "".equals(filePath)) ? FILE_PATH : filePath;
-		this.splitter = (splitter < 1) ? SPLITTER_NUM : splitter;
-	}
-
-	/**
-	 * <b>function:</b> 通过url获得文件名称
-	 * 
-	 * @author hoojo
-	 * @createDate 2011-9-30 下午05:00:00
-	 * @param url
-	 * @return
-	 */
-	private String getFileName(String url) {
-		return url.substring(url.lastIndexOf("/") + 1, url.length());
-	}
-
-	public String getUrl() {
-		return url;
-	}
-
-	public void setUrl(String url) {
-		if (url == null || "".equals(url)) {
-			throw new RuntimeException("url is not null!");
-		}
-		this.url = url;
-	}
-
-	public String getFileName() {
-		return fileName;
-	}
-
-	public void setFileName(String fileName) {
-		this.fileName = (fileName == null || "".equals(fileName)) ? getFileName(url) : fileName;
-	}
-
-	public String getFilePath() {
-		return filePath;
-	}
-
-	public void setFilePath(String filePath) {
-		this.filePath = (filePath == null || "".equals(filePath)) ? FILE_PATH : filePath;
-	}
-
-	public int getSplitter() {
-		return splitter;
-	}
-
-	public void setSplitter(int splitter) {
-		this.splitter = (splitter < 1) ? SPLITTER_NUM : splitter;
-	}
-
-	@Override
-	public String toString() {
-		return this.url + "#" + this.fileName + "#" + this.filePath + "#" + this.splitter;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java
deleted file mode 100644
index 3ca0384319..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.hoo.util;
-
-import com.hoo.download.BatchDownloadFile;
-import com.hoo.entity.DownloadInfo;
-
-/**
- * <b>function:</b> 分块多线程下载工具类
- * 
- * @author hoojo
- * @createDate 2011-9-28 下午05:22:18
- * @file DownloadUtils.java
- * @package com.hoo.util
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public abstract class DownloadUtils {
-
-	public static void download(String url) {
-		DownloadInfo bean = new DownloadInfo(url);
-		LogUtils.info(bean);
-		BatchDownloadFile down = new BatchDownloadFile(bean);
-		new Thread(down).start();
-	}
-
-	public static void download(String url, int threadNum) {
-		DownloadInfo bean = new DownloadInfo(url, threadNum);
-		LogUtils.info(bean);
-		BatchDownloadFile down = new BatchDownloadFile(bean);
-		new Thread(down).start();
-	}
-
-	public static void download(String url, String fileName, String filePath, int threadNum) {
-		DownloadInfo bean = new DownloadInfo(url, fileName, filePath, threadNum);
-		LogUtils.info(bean);
-		BatchDownloadFile down = new BatchDownloadFile(bean);
-		new Thread(down).start();
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java
deleted file mode 100644
index 562a0ec047..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/DownloadUtilsTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * copy from http://blog.csdn.net/ibm_hoojo/article/details/6838222
- */
-package com.hoo.util;
-
-/**
- * <b>function:</b> 下载测试
- * 
- * @author hoojo
- * @createDate 2011-9-23 下午05:49:46
- * @file TestDownloadMain.java
- * @package com.hoo.download
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public class DownloadUtilsTest {
-	public static void main(String[] args) {
-		/*
-		 * DownloadInfo bean = new DownloadInfo(
-		 * "http://i7.meishichina.com/Health/UploadFiles/201109/2011092116224363.jpg"
-		 * ); System.out.println(bean); BatchDownloadFile down = new
-		 * BatchDownloadFile(bean); new Thread(down).start();
-		 */
-
-		// DownloadUtils.download("http://i7.meishichina.com/Health/UploadFiles/201109/2011092116224363.jpg");
-		DownloadUtils.download("https://github.com/dracome/coding2017/archive/master.zip", 5);
-
-		try {
-			Thread.sleep(30 * 1000);
-		} catch (InterruptedException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		int i = 3;
-		System.out.println(i);
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java
deleted file mode 100644
index 62d48bd0f9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/hoo/util/LogUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.hoo.util;
-
-/**
- * <b>function:</b> 日志工具类
- * 
- * @author hoojo
- * @createDate 2011-9-21 下午05:21:27
- * @file LogUtils.java
- * @package com.hoo.util
- * @project MultiThreadDownLoad
- * @blog http://blog.csdn.net/IBM_hoojo
- * @email hoojo_@126.com
- * @version 1.0
- */
-public abstract class LogUtils {
-
-	public static void log(Object message) {
-		System.err.println(message);
-	}
-
-	public static void log(String message) {
-		System.err.println(message);
-	}
-
-	public static void log(int message) {
-		System.err.println(message);
-	}
-
-	public static void info(Object message) {
-		System.out.println(message);
-	}
-
-	public static void info(String message) {
-		System.out.println(message);
-	}
-
-	public static void info(int message) {
-		System.out.println(message);
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
deleted file mode 100644
index c849302200..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* copy from http://stefanbirkner.github.io/system-rules/index.html */
-
-package com.github.eulerlcs.jmr.challenge.systemrules;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.contrib.java.lang.system.Assertion;
-import org.junit.contrib.java.lang.system.ExpectedSystemExit;
-
-public class AppWithExitTest {
-	@Rule
-	public final ExpectedSystemExit exit = ExpectedSystemExit.none();
-
-	@Test
-	public void exits() {
-		exit.expectSystemExit();
-		AppWithExit.doSomethingAndExit();
-	}
-
-	@Test
-	public void exitsWithStatusCode1() {
-		exit.expectSystemExitWithStatus(1);
-		AppWithExit.doSomethingAndExit();
-	}
-
-	@Test
-	public void writesMessage() {
-		exit.expectSystemExitWithStatus(1);
-		exit.checkAssertionAfterwards(new Assertion() {
-			@Override
-			public void checkAssertion() {
-				assertEquals("exit ...", AppWithExit.message);
-			}
-		});
-		AppWithExit.doSomethingAndExit();
-	}
-
-	@Test
-	public void systemExitWithStatusCode1() {
-		exit.expectSystemExitWithStatus(1);
-		AppWithExit.doSomethingAndExit();
-	}
-
-	@Test
-	public void noSystemExit() {
-		AppWithExit.doNothing();
-		// passes
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml b/students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml
deleted file mode 100644
index 1da435d5b6..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-61-collection/pom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-61-collection</artifactId>
-	<description>eulerlcs master java road collection</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java
deleted file mode 100644
index 555f5ea954..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayList.java
+++ /dev/null
@@ -1,438 +0,0 @@
-/**
- * 90% or more copy from jdk
- */
-package com.github.eulerlcs.jmr.algorithm;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-import java.util.Objects;
-import java.util.RandomAccess;
-import java.util.function.Consumer;
-
-public class ArrayList<E> implements List<E>, RandomAccess {
-	private static final int MAX_ARRAY_SIZE = 1 << 10;
-	private transient Object[] elementData = new Object[0];
-	private int size;
-	private transient int modCount = 0;
-
-	@Override
-	public int size() {
-		return size;
-	}
-
-	@Override
-	public boolean isEmpty() {
-		return size == 0;
-	}
-
-	@Override
-	public boolean contains(Object o) {
-		if (o == null) {
-			for (Object obi : elementData) {
-				if (obi == null) {
-					return true;
-				}
-			}
-		} else {
-			for (Object obj : elementData) {
-				if (o.equals(obj)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public boolean containsAll(Collection<?> c) {
-		for (Object e : c)
-			if (!contains(e))
-				return false;
-		return true;
-	}
-
-	@Override
-	public Object[] toArray() {
-		return Arrays.copyOf(elementData, size, elementData.getClass());
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public <T> T[] toArray(T[] a) {
-		if (a.length < size) {
-			return (T[]) Arrays.copyOf(elementData, size, a.getClass());
-		} else {
-			System.arraycopy(elementData, 0, a, 0, size);
-			if (a.length > size)
-				a[size] = null;
-			return a;
-		}
-	}
-
-	@Override
-	public boolean add(E e) {
-		ensureExplicitCapacity(size + 1); // Increments modCount!!
-		elementData[size] = e;
-		size++;
-		return true;
-	}
-
-	@Override
-	public void add(int index, E element) {
-		if (index >= size)
-			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
-		ensureExplicitCapacity(size + 1); // Increments modCount!!
-		System.arraycopy(elementData, index, elementData, index + 1, size - index);
-		elementData[index] = element;
-		size++;
-	}
-
-	@Override
-	public E remove(int index) {
-		if (index >= size)
-			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
-
-		modCount++;
-		@SuppressWarnings("unchecked")
-		E oldValue = (E) elementData[index];
-		int numMoved = size - index - 1;
-		if (numMoved > 0)
-			System.arraycopy(elementData, index + 1, elementData, index, numMoved);
-		elementData[--size] = null;// clear to let GC do its work
-
-		return oldValue;
-	}
-
-	@Override
-	public boolean remove(Object o) {
-		int index = -1;
-
-		if (o == null) {
-			for (int i = 0; i < size; i++)
-				if (elementData[i] == null) {
-					index = i;
-					break;
-				}
-		} else {
-			for (int i = 0; i < size; i++)
-				if (o.equals(elementData[i])) {
-					index = i;
-					break;
-				}
-		}
-
-		if (index > 0) {
-			modCount++;
-			int numMoved = size - index - 1;
-			if (numMoved > 0)
-				System.arraycopy(elementData, index + 1, elementData, index, numMoved);
-			elementData[--size] = null;// clear to let GC do its work
-
-			return true;
-		}
-
-		return false;
-	}
-
-	@Override
-	public boolean removeAll(Collection<?> c) {
-		boolean modified = false;
-		for (Object obj : c) {
-			modified |= remove(obj);
-		}
-
-		return modified;
-	}
-
-	@Override
-	public boolean addAll(Collection<? extends E> c) {
-		Object[] a = c.toArray();
-		int numNew = a.length;
-		ensureExplicitCapacity(size + numNew);// Increments modCount
-		System.arraycopy(a, 0, elementData, size, numNew);
-		size += numNew;
-		return numNew != 0;
-	}
-
-	@Override
-	public boolean addAll(int index, Collection<? extends E> c) {
-		if (index >= size)
-			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
-
-		Object[] a = c.toArray();
-		int numNew = a.length;
-		ensureExplicitCapacity(size + numNew);// Increments modCount
-
-		int numMoved = size - index;
-		if (numMoved > 0)
-			System.arraycopy(elementData, index, elementData, index + numNew, numMoved);
-
-		System.arraycopy(a, 0, elementData, index, numNew);
-		size += numNew;
-		return numNew != 0;
-	}
-
-	@Override
-	public boolean retainAll(Collection<?> c) {
-		final Object[] elementData = this.elementData;
-		int r = 0, w = 0;
-		boolean modified = false;
-		for (; r < size; r++)
-			if (c.contains(elementData[r]))
-				elementData[w++] = elementData[r];
-
-		if (w != size) {
-			// clear to let GC do its work
-			for (int i = w; i < size; i++)
-				elementData[i] = null;
-			modCount += size - w;
-			size = w;
-			modified = true;
-		}
-
-		return modified;
-	}
-
-	@Override
-	public void clear() {
-		modCount++;
-		for (int i = 0; i < size; i++)
-			elementData[i] = null;
-
-		size = 0;
-	}
-
-	@Override
-	public List<E> subList(int fromIndex, int toIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E get(int index) {
-		if (index >= size)
-			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
-
-		return (E) elementData[index];
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public E set(int index, E element) {
-		if (index >= size)
-			throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + size);
-
-		E oldValue = (E) elementData[index];
-		elementData[index] = element;
-		return oldValue;
-	}
-
-	@Override
-	public int indexOf(Object o) {
-		if (o == null) {
-			for (int i = 0; i < size; i++)
-				if (elementData[i] == null)
-					return i;
-		} else {
-			for (int i = 0; i < size; i++)
-				if (o.equals(elementData[i]))
-					return i;
-		}
-
-		return -1;
-	}
-
-	@Override
-	public int lastIndexOf(Object o) {
-		if (o == null) {
-			for (int i = size - 1; i >= 0; i--)
-				if (elementData[i] == null)
-					return i;
-		} else {
-			for (int i = size - 1; i >= 0; i--)
-				if (o.equals(elementData[i]))
-					return i;
-		}
-
-		return -1;
-	}
-
-	private void ensureExplicitCapacity(int minCapacity) {
-		modCount++;
-
-		if (elementData.length > minCapacity) {
-			return;
-		} else if (minCapacity > MAX_ARRAY_SIZE) {
-			throw new OutOfMemoryError();
-		}
-
-		int oldCapacity = elementData.length;
-
-		int newCapacity = oldCapacity == 0 ? 10 : (oldCapacity + (oldCapacity >> 1));
-		if (newCapacity > MAX_ARRAY_SIZE) {
-			newCapacity = MAX_ARRAY_SIZE;
-		}
-
-		elementData = Arrays.copyOf(elementData, newCapacity);
-	}
-
-	@Override
-	public Iterator<E> iterator() {
-		return new Itr();
-	}
-
-	@Override
-	public ListIterator<E> listIterator() {
-		return new ListItr(0);
-	}
-
-	@Override
-	public ListIterator<E> listIterator(int index) {
-		if (index < 0 || index > size)
-			throw new IndexOutOfBoundsException("Index: " + index);
-		return new ListItr(index);
-	}
-
-	/**
-	 * fully copy from jdk ArrayList.Itr
-	 */
-	private class Itr implements Iterator<E> {
-		int cursor; // index of next element to return
-		int lastRet = -1; // index of last element returned; -1 if no such
-		int expectedModCount = modCount;
-
-		@Override
-		public boolean hasNext() {
-			return cursor != size;
-		}
-
-		@Override
-		@SuppressWarnings("unchecked")
-		public E next() {
-			checkForComodification();
-			int i = cursor;
-			if (i >= size)
-				throw new NoSuchElementException();
-			Object[] elementData = ArrayList.this.elementData;
-			if (i >= elementData.length)
-				throw new ConcurrentModificationException();
-			cursor = i + 1;
-			return (E) elementData[lastRet = i];
-		}
-
-		@Override
-		public void remove() {
-			if (lastRet < 0)
-				throw new IllegalStateException();
-			checkForComodification();
-
-			try {
-				ArrayList.this.remove(lastRet);
-				cursor = lastRet;
-				lastRet = -1;
-				expectedModCount = modCount;
-			} catch (IndexOutOfBoundsException ex) {
-				throw new ConcurrentModificationException();
-			}
-		}
-
-		@Override
-		@SuppressWarnings("unchecked")
-		public void forEachRemaining(Consumer<? super E> consumer) {
-			Objects.requireNonNull(consumer);
-			final int size = ArrayList.this.size;
-			int i = cursor;
-			if (i >= size) {
-				return;
-			}
-			final Object[] elementData = ArrayList.this.elementData;
-			if (i >= elementData.length) {
-				throw new ConcurrentModificationException();
-			}
-			while (i != size && modCount == expectedModCount) {
-				consumer.accept((E) elementData[i++]);
-			}
-			// update once at end of iteration to reduce heap write traffic
-			cursor = i;
-			lastRet = i - 1;
-			checkForComodification();
-		}
-
-		final void checkForComodification() {
-			if (modCount != expectedModCount)
-				throw new ConcurrentModificationException();
-		}
-	}
-
-	/**
-	 * fully copy from jdk ArrayList.ListItr
-	 */
-	private class ListItr extends Itr implements ListIterator<E> {
-		ListItr(int index) {
-			super();
-			cursor = index;
-		}
-
-		@Override
-		public boolean hasPrevious() {
-			return cursor != 0;
-		}
-
-		@Override
-		public int nextIndex() {
-			return cursor;
-		}
-
-		@Override
-		public int previousIndex() {
-			return cursor - 1;
-		}
-
-		@Override
-		@SuppressWarnings("unchecked")
-		public E previous() {
-			checkForComodification();
-			int i = cursor - 1;
-			if (i < 0)
-				throw new NoSuchElementException();
-			Object[] elementData = ArrayList.this.elementData;
-			if (i >= elementData.length)
-				throw new ConcurrentModificationException();
-			cursor = i;
-			return (E) elementData[lastRet = i];
-		}
-
-		@Override
-		public void set(E e) {
-			if (lastRet < 0)
-				throw new IllegalStateException();
-			checkForComodification();
-
-			try {
-				ArrayList.this.set(lastRet, e);
-			} catch (IndexOutOfBoundsException ex) {
-				throw new ConcurrentModificationException();
-			}
-		}
-
-		@Override
-		public void add(E e) {
-			checkForComodification();
-
-			try {
-				int i = cursor;
-				ArrayList.this.add(i, e);
-				cursor = i + 1;
-				lastRet = -1;
-				expectedModCount = modCount;
-			} catch (IndexOutOfBoundsException ex) {
-				throw new ConcurrentModificationException();
-			}
-		}
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java
deleted file mode 100644
index 47ed2e0bef..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/java/com/github/eulerlcs/jmr/algorithm/TestArrayList.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-import java.util.List;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class TestArrayList {
-
-	@BeforeClass
-	public static void setUpBeforeClass() throws Exception {
-	}
-
-	@AfterClass
-	public static void tearDownAfterClass() throws Exception {
-	}
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void test_foreach() {
-		List<Integer> list = new ArrayList<>();
-		list.add(1);
-		list.add(2);
-		list.add(3);
-
-		int sum = 0;
-		for (Integer item : list) {
-			sum += item;
-		}
-
-		Assert.assertEquals(sum, 6);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-61-collection/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml
deleted file mode 100644
index a7a77b73df..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/data/struts.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<struts>
-    <action name="login" class="com.github.eulerlcs.jmr.litestruts.action.LoginAction">
-        <result name="success">/jsp/homepage.jsp</result>
-        <result name="fail">/jsp/showLogin.jsp</result>
-    </action>
-    <action name="logout" class="com.github.eulerlcs.jmr.litestruts.action.LogoutAction">
-    	<result name="success">/jsp/welcome.jsp</result>
-    	<result name="error">/jsp/error.jsp</result>
-    </action>
-</struts>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml
deleted file mode 100644
index 353155e346..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-62-litestruts</artifactId>
-	<description>eulerlcs master java road lite struts</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>commons-digester</groupId>
-			<artifactId>commons-digester</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.stefanbirkner</groupId>
-			<artifactId>system-rules</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java
deleted file mode 100644
index c9cc7522b5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/algorithm/ArrayUtil.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/**
- * 问题点： 没写注释，代码比较难读。尤其 merge方法。
- */
-package com.github.eulerlcs.jmr.algorithm;
-
-import java.util.Arrays;
-
-public class ArrayUtil {
-
-	/**
-	 * 给定一个整形数组a , 对该数组的值进行置换 例如： a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
-	 * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
-	 * 
-	 * @param origin
-	 * @return
-	 */
-	public static void reverseArray(int[] origin) {
-		if (origin == null || origin.length < 2) {
-			return;
-		}
-
-		for (int head = 0, tail = origin.length - 1; head < tail; head++, tail--) {
-			origin[head] = origin[head] ^ origin[tail];
-			origin[tail] = origin[head] ^ origin[tail];
-			origin[head] = origin[head] ^ origin[tail];
-		}
-	}
-
-	/**
-	 * 现在有如下的一个数组： int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
-	 * 要求将以上数组中值为0的项去掉，将不为0的值存入一个新的数组，生成的新数组为： {1,3,4,5,6,6,5,4,7,6,7,5}
-	 * 
-	 * @param oldArray
-	 * @return
-	 */
-
-	public static int[] removeZero(int[] oldArray) {
-		if (oldArray == null) {
-			return new int[0];
-		}
-
-		int count = 0;
-		for (int i = 0; i < oldArray.length; i++) {
-			if (oldArray[i] != 0)
-				count++;
-		}
-
-		int[] newArray = new int[count];
-		int newIndex = 0;
-		for (int i = 0; i < oldArray.length; i++) {
-			if (oldArray[i] != 0) {
-				newArray[newIndex] = oldArray[i];
-				newIndex++;
-			}
-		}
-
-		return newArray;
-	}
-
-	/**
-	 * 给定两个已经排序好的整形数组， a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素， 并且仍然是有序的 例如 a1 =
-	 * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意： 已经消除了重复
-	 * 
-	 * @param array1
-	 * @param array2
-	 * @return
-	 */
-
-	public static int[] merge(int[] array1, int[] array2) {
-		if (array1 == null || array1.length == 0) {
-			if (array2 == null || array2.length == 0) {
-				return new int[0];
-			} else {
-				return Arrays.copyOf(array2, array2.length);
-			}
-		} else if (array2 == null || array2.length == 0) {
-			return Arrays.copyOf(array1, array1.length);
-		}
-
-		int[] result = new int[array1.length + array2.length];
-		int idxResult = 0;
-		int idx1 = 0;
-		int idx2 = 0;
-
-		for (; idx1 < array1.length; idx1++) {
-			if (array1[idx1] < array2[idx2]) {
-				result[idxResult] = array1[idx1];
-				idxResult++;
-			} else if (array1[idx1] == array2[idx2]) {
-				result[idxResult] = array1[idx1];
-				idxResult++;
-				idx2++;
-			} else {
-				for (; idx2 < array2.length; idx2++) {
-					if (array2[idx2] < array1[idx1]) {
-						result[idxResult] = array2[idx2];
-						idxResult++;
-					} else {
-						if (array2[idx2] == array1[idx1]) {
-							idx2++;
-						}
-
-						break;
-					}
-				}
-
-				if (idx2 == array2.length) {
-					break;
-				} else {
-					idx1--;
-				}
-			}
-		}
-
-		if (idx1 < array1.length) {
-			System.arraycopy(array1, idx1, result, idxResult, array1.length - idx1);
-			idxResult += array1.length - idx1;
-		}
-
-		if (idx2 < array2.length) {
-			System.arraycopy(array2, idx2, result, idxResult, array2.length - idx2);
-			idxResult += array2.length - idx2;
-		}
-
-		result = removeZero(result);
-		return result;
-	}
-
-	/**
-	 * 把一个已经存满数据的数组 oldArray的容量进行扩展， 扩展后的新数据大小为oldArray.length + size
-	 * 注意，老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
-	 * [2,3,6,0,0,0]
-	 * 
-	 * @param oldArray
-	 * @param increaseCapacity
-	 * @return
-	 */
-	public static int[] grow(int[] oldArray, int increaseCapacity) {
-		if (oldArray == null || increaseCapacity < 0) {
-			return new int[0];
-		}
-
-		int newCapacity = oldArray.length + increaseCapacity;
-
-		int[] newArray = Arrays.copyOf(oldArray, newCapacity);
-
-		return newArray;
-	}
-
-	/**
-	 * 斐波那契数列为：1，1，2，3，5，8，13，21...... ，给定一个最大值， 返回小于该值的数列 例如， max = 15 ,
-	 * 则返回的数组应该为 [1，1，2，3，5，8，13] max = 1, 则返回空数组 []
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public static int[] fibonacci(int max) {
-		if (max <= 1) {
-			return new int[0];
-		}
-
-		int[] result = new int[10];
-		result[0] = 1;
-		result[1] = 1;
-		int idx = 2;
-		int sum = 2;
-		while (sum < max) {
-			if (idx >= result.length) {
-				grow(result, result.length * 2);
-			}
-
-			result[idx] = sum;
-			sum = result[idx - 1] + result[idx];
-			idx++;
-		}
-
-		result = removeZero(result);
-		return result;
-	}
-
-	/**
-	 * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public static int[] getPrimes(int max) {
-		if (max < 2) {
-			return new int[0];
-		}
-
-		int[] all = new int[max];
-		int index = 0;
-		int temp = 0;
-
-		for (int i = 0; i < max; i++) {
-			all[i] = i;
-		}
-
-		all[0] = 0;
-		all[1] = 0;
-		index = 2;
-
-		// 筛法
-		loops: for (; index < max;) {
-			for (int i = 2;; i++) {
-				temp = index * i;
-				if (temp >= max) {
-					break;
-				}
-				all[temp] = 0;
-			}
-
-			for (int i = index + 1; i < max; i++) {
-				if (all[i] != 0) {
-					index = i;
-					continue loops;
-				}
-			}
-
-			break;
-		}
-
-		int[] result = removeZero(all);
-		return result;
-	}
-
-	/**
-	 * 所谓“完数”， 是指这个数恰好等于它的因子之和，例如6=1+2+3 给定一个最大值max， 返回一个数组， 数组中是小于max 的所有完数
-	 * 
-	 * @param max
-	 * @return
-	 */
-	public static long[] getPerfectNumbers(long max) {
-		long[] perfect = new long[49];// 到2016年1月为止，共发现了49个完全数
-		int idx = 0;
-		long sum = 1;
-		long sqrt = 0;
-
-		for (long n = 2; n < max; n++) {
-			sum = 1;
-			sqrt = (long) Math.sqrt(n);
-			for (long i = 2; i <= sqrt; i++) {
-				if (n % i == 0)
-					sum += i + n / i;
-			}
-
-			if (sum == n) {
-				perfect[idx] = n;
-				idx++;
-			}
-		}
-
-		// return removeZero(perfect);
-		return perfect;
-	}
-
-	/**
-	 * 用separator 把数组 array给连接起来 例如array= [3,8,9], separator = "-" 则返回值为"3-8-9"
-	 * 
-	 * @param array
-	 * @param separator
-	 * @return
-	 */
-	public static String join(int[] array, String separator) {
-		if (array == null || array.length == 0) {
-			return "";
-		}
-
-		StringBuilder sb = new StringBuilder();
-
-		for (int i = 0; i < array.length - 1; i++) {
-			sb.append(array[i] + separator);
-		}
-		sb.append(String.valueOf(array[array.length - 1]));
-
-		return sb.toString();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java
deleted file mode 100644
index 4d9af132ac..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LoginAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.action;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * 
- * @author liuxin
- *
- */
-public class LoginAction {
-	@Setter
-	@Getter
-	private String name;
-	@Setter
-	@Getter
-	private String password;
-	@Getter
-	private String message;
-
-	public String execute() {
-		if ("test".equals(name) && "1234".equals(password)) {
-			this.message = "login successful";
-			return "success";
-		}
-		this.message = "login failed,please check your user/pwd";
-		return "fail";
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java
deleted file mode 100644
index 119e74e3e9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/action/LogoutAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.action;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * 这是一个用来展示登录的业务类， 其中的用户名和密码都是硬编码的。
- * 
- * @author liuxin
- *
- */
-public class LogoutAction {
-	@Setter
-	@Getter
-	private String name;
-	@Setter
-	@Getter
-	private String password;
-	@Getter
-	private String message;
-
-	public String execute() {
-		if ("test".equals(name) && "1234".equals(password)) {
-			this.message = "login successful";
-			return "success";
-		}
-		this.message = "login failed,please check your user/pwd";
-		return "error";
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java
deleted file mode 100644
index 459abaae99..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/Struts.java
+++ /dev/null
@@ -1,200 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.core;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.digester.Digester;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
-
-import com.github.eulerlcs.jmr.litestruts.degister.StrutsConfig;
-import com.github.eulerlcs.jmr.litestruts.degister.StrutsDigester;
-
-/**
- * <ul>
- * <li>读取配置文件struts.xml</li>
- * <li>根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
- * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
- * "password"="1234") , 那就应该调用 setName和setPassword方法</li>
- * <li>通过反射调用对象的exectue 方法， 并获得返回值，例如"success"</li>
- * <li>通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
- * {"message": "登录成功"} , 放到View对象的parameters</li>
- * <li>根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp， 放到View对象的jsp字段中。</li>
- * </ul>
- */
-public class Struts {
-	private final static Logger log = LoggerFactory.getLogger(Struts.class);
-	private static StrutsConfig config = null;
-
-	public static View runAction(String actionName, Map<String, String> parameters) {
-		/*
-		 * 0. 读取配置文件struts.xml
-		 * 
-		 * 1. 根据actionName找到相对应的class ， 例如LoginAction, 通过反射实例化（创建对象）
-		 * 据parameters中的数据，调用对象的setter方法， 例如parameters中的数据是 ("name"="test" ,
-		 * "password"="1234") , 那就应该调用 setName和setPassword方法
-		 * 
-		 * 2. 通过反射调用对象的exectue 方法， 并获得返回值，例如"success"
-		 * 
-		 * 3. 通过反射找到对象的所有getter方法（例如 getMessage）, 通过反射来调用， 把值和属性形成一个HashMap , 例如
-		 * {"message": "登录成功"} , 放到View对象的parameters
-		 * 
-		 * 4. 根据struts.xml中的 <result> 配置,以及execute的返回值， 确定哪一个jsp，
-		 * 放到View对象的jsp字段中。
-		 * 
-		 */
-
-		// 0.
-		getConfig();
-
-		// 1.1.
-		Object object = createInstance(actionName);
-		if (object == null) {
-			return null;
-		}
-		// 1.2.
-		if (!prepareParameters(object, parameters)) {
-			return null;
-		}
-		// 2.
-		String viewId = execute(object);
-		if (viewId == null) {
-			return null;
-		}
-		// 3.
-		View view = biuldView(object);
-		if (view == null) {
-			return null;
-		}
-
-		// 4.
-		String uri = config.getActionMap().get(actionName).getResults().get(viewId).getUrl();
-		view.setJsp(uri);
-
-		return view;
-	}
-
-	private static StrutsConfig getConfig() {
-		if (config != null) {
-			return config;
-		}
-
-		Digester d = StrutsDigester.newInstance();
-		try {
-			File file = new File("data", "struts.xml");
-			config = (StrutsConfig) d.parse(file);
-		} catch (IOException | SAXException e) {
-			log.error("getConfig", e);
-			System.exit(1);
-		}
-
-		return config;
-	}
-
-	private static Object createInstance(String actionName) {
-		if (actionName == null) {
-			return null;
-		}
-
-		String className = config.getActionMap().get(actionName).getClazz();
-		Object object = null;
-		try {
-			Class<?> clazz = Class.forName(className);
-			object = clazz.newInstance();
-		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
-			log.error("createInstance", e);
-		}
-
-		return object;
-	}
-
-	private static boolean prepareParameters(Object object, Map<String, String> parameters) {
-		if (parameters == null || parameters.size() == 0) {
-			return true;
-		}
-
-		Class<?> clazz = object.getClass();
-		Method setter = null;
-
-		try {
-			for (String key : parameters.keySet()) {
-				setter = clazz.getMethod(biuldSetterName(key), String.class);
-				setter.setAccessible(true);
-				setter.invoke(object, parameters.get(key));
-			}
-		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
-				| InvocationTargetException e) {
-			log.error("prepareParameters", e);
-			return false;
-		}
-
-		return true;
-	}
-
-	private static String biuldSetterName(String name) {
-		String setterName = "set";
-		setterName += name.substring(0, 1).toUpperCase() + name.substring(1);
-		return setterName;
-
-	}
-
-	private static String debiuldGetterName(String getterName) {
-		if (getterName == null || getterName.length() <= 3) {
-			return null;
-		}
-		if (!getterName.substring(0, 3).equals("get")) {
-			return null;
-		}
-
-		String name = getterName.substring(3, 4).toLowerCase() + getterName.substring(4);
-		return name;
-	}
-
-	private static String execute(Object object) {
-		final String METHOD_EXECUTE = "execute";
-		String viewId = null;
-
-		Class<?> clazz = object.getClass();
-		try {
-			Method method = clazz.getMethod(METHOD_EXECUTE);
-			viewId = (String) method.invoke(object);
-		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
-				| InvocationTargetException e) {
-			log.error("execute", e);
-			return viewId;
-		}
-
-		return viewId;
-	}
-
-	private static View biuldView(Object object) {
-		View view = new View();
-		Map<String, Object> parameters = new HashMap<>();
-
-		Class<?> clazz = object.getClass();
-		Method[] methods;
-		try {
-			methods = clazz.getMethods();
-			for (Method method : methods) {
-				String name = debiuldGetterName(method.getName());
-				if (name == null) {
-					continue;
-				}
-				Object value = method.invoke(object);
-				parameters.put(name, value);
-			}
-
-			view.setParameters(parameters);
-		} catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-			log.error("biuldResult", e);
-			return null;
-		}
-
-		return view;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java
deleted file mode 100644
index 0aa18d5f54..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/core/View.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.core;
-
-import java.util.Map;
-
-public class View {
-	private String jsp;
-	private Map<String, Object> parameters;
-
-	public String getJsp() {
-		return jsp;
-	}
-
-	public View setJsp(String jsp) {
-		this.jsp = jsp;
-		return this;
-	}
-
-	public Map<String, Object> getParameters() {
-		return parameters;
-	}
-
-	public View setParameters(Map<String, Object> parameters) {
-		this.parameters = parameters;
-		return this;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java
deleted file mode 100644
index 336f594241..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsAction.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.degister;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import lombok.Getter;
-import lombok.Setter;
-
-public class StrutsAction {
-	@Getter
-	@Setter
-	private String name;
-	@Getter
-	@Setter
-	private String clazz;
-	@Getter
-	private Map<String, StrutsActionResult> results = new HashMap<>();
-
-	public void addResult(StrutsActionResult result) {
-		results.put(result.getName(), result);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java
deleted file mode 100644
index 64247d4aba..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionResult.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.degister;
-
-import lombok.Getter;
-import lombok.Setter;
-
-public class StrutsActionResult {
-	@Getter
-	@Setter
-	private String name;
-	@Getter
-	@Setter
-	private String url;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java
deleted file mode 100644
index 567f4c7ef1..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsActionRulerSet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.degister;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.digester.RuleSetBase;
-
-final class StrutsActionRulerSet extends RuleSetBase {
-	protected String prefix = null;
-
-	public StrutsActionRulerSet() {
-		this("");
-	}
-
-	public StrutsActionRulerSet(String prefix) {
-		super();
-		this.namespaceURI = null;
-		this.prefix = prefix;
-	}
-
-	@Override
-	public void addRuleInstances(Digester digester) {
-		digester.addObjectCreate(prefix + "action", StrutsAction.class);
-		digester.addSetProperties(prefix + "action");
-		digester.addSetProperties(prefix + "action", "class", "clazz");
-		digester.addSetNext(prefix + "action", "addAction");
-		digester.addObjectCreate(prefix + "action/result", StrutsActionResult.class);
-		digester.addSetProperties(prefix + "action/result");
-		digester.addBeanPropertySetter(prefix + "action/result", "url");
-		digester.addSetNext(prefix + "action/result", "addResult");
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java
deleted file mode 100644
index b2005c9700..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsConfig.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.degister;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import lombok.Getter;
-
-public class StrutsConfig {
-	@Getter
-	private Map<String, StrutsAction> actionMap = new HashMap<>();
-
-	public void addAction(StrutsAction action) {
-		actionMap.put(action.getName(), action);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java
deleted file mode 100644
index f466c8cb10..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/degister/StrutsDigester.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.degister;
-
-import org.apache.commons.digester.Digester;
-
-public class StrutsDigester {
-	public static Digester newInstance() {
-		Digester d = new Digester();
-		d.addObjectCreate("struts", StrutsConfig.class);
-		d.addSetProperties("struts");
-		d.addRuleSet(new StrutsActionRulerSet("struts/"));
-		return d;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java
deleted file mode 100644
index 7242407f74..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/algorithm/ArrayUtilTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/**
- * 问题点： 没有全分支覆盖。只简单的测了关键或者关心的case
- */
-package com.github.eulerlcs.jmr.algorithm;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class ArrayUtilTest {
-
-	@Test
-	public void reverseArray_null() {
-		int[] actuals = null;
-		int[] expecteds = null;
-
-		ArrayUtil.reverseArray(actuals);
-
-		assertArrayEquals(actuals, expecteds);
-	}
-
-	@Test
-	public void reverseArray_0() {
-		int[] actuals = {};
-		int[] expecteds = {};
-
-		ArrayUtil.reverseArray(actuals);
-
-		assertArrayEquals(actuals, expecteds);
-	}
-
-	@Test
-	public void reverseArray_1() {
-		int[] actuals = { 2 };
-		int[] expecteds = { 2 };
-
-		ArrayUtil.reverseArray(actuals);
-
-		assertArrayEquals(actuals, expecteds);
-	}
-
-	@Test
-	public void reverseArray_2() {
-		int[] actuals = { 7, 9 };
-		int[] expecteds = { 9, 7 };
-
-		ArrayUtil.reverseArray(actuals);
-
-		assertArrayEquals(actuals, expecteds);
-	}
-
-	@Test
-	public void reverseArray_4() {
-		int[] actuals = { 7, 9, 30, 3 };
-		int[] expecteds = { 3, 30, 9, 7 };
-
-		ArrayUtil.reverseArray(actuals);
-
-		assertArrayEquals(actuals, expecteds);
-	}
-
-	@Test
-	public void reverseArray_5() {
-		int[] actuals = { 7, 9, 30, 3, 4 };
-		int[] expecteds = { 4, 3, 30, 9, 7 };
-
-		ArrayUtil.reverseArray(actuals);
-
-		assertArrayEquals(actuals, expecteds);
-	}
-
-	@Test
-	public void removeZero_null() {
-		int oldArr[] = null;
-		int[] expecteds = {};
-
-		int[] newArr = ArrayUtil.removeZero(oldArr);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void removeZero_0() {
-		int oldArr[] = {};
-		int[] expecteds = {};
-
-		int[] newArr = ArrayUtil.removeZero(oldArr);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void removeZero_1() {
-		int oldArr[] = { 0 };
-		int[] expecteds = {};
-
-		int[] newArr = ArrayUtil.removeZero(oldArr);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void removeZero_2() {
-		int oldArr[] = { 3, 5 };
-		int[] expecteds = { 3, 5 };
-
-		int[] newArr = ArrayUtil.removeZero(oldArr);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void removeZero_3() {
-		int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
-		int[] expecteds = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 };
-
-		int[] newArr = ArrayUtil.removeZero(oldArr);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void merge_1() {
-		int[] a1 = { 3, 5, 7, 8 };
-		int[] a2 = { 4, 5, 6, 7 };
-		int[] expecteds = { 3, 4, 5, 6, 7, 8 };
-
-		int[] newArr = ArrayUtil.merge(a1, a2);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void merge_2() {
-		int[] a1 = { 4, 5, 6, 7 };
-		int[] a2 = { 3, 5, 7, 8 };
-		int[] expecteds = { 3, 4, 5, 6, 7, 8 };
-
-		int[] newArr = ArrayUtil.merge(a1, a2);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void grow_1() {
-		int[] oldArray = { 2, 3, 6 };
-		int increaseCapacity = 3;
-		int[] expecteds = { 2, 3, 6, 0, 0, 0 };
-
-		int[] newArr = ArrayUtil.grow(oldArray, increaseCapacity);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void fibonacci_1() {
-		int max = 1;
-		int[] expecteds = {};
-
-		int[] newArr = ArrayUtil.fibonacci(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void fibonacci_2() {
-		int max = 2;
-		int[] expecteds = { 1, 1 };
-
-		int[] newArr = ArrayUtil.fibonacci(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void fibonacci_15() {
-		int max = 15;
-		int[] expecteds = { 1, 1, 2, 3, 5, 8, 13 };
-
-		int[] newArr = ArrayUtil.fibonacci(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPrimes_1() {
-		int max = 1;
-		int[] expecteds = {};
-
-		int[] newArr = ArrayUtil.getPrimes(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPrimes_2() {
-		int max = 2;
-		int[] expecteds = {};
-
-		int[] newArr = ArrayUtil.getPrimes(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPrimes_3() {
-		int max = 3;
-		int[] expecteds = { 2 };
-
-		int[] newArr = ArrayUtil.getPrimes(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPrimes_4() {
-		int max = 4;
-		int[] expecteds = { 2, 3 };
-
-		int[] newArr = ArrayUtil.getPrimes(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPrimes_23() {
-		int max = 23;
-		int[] expecteds = { 2, 3, 5, 7, 11, 13, 17, 19 };
-
-		int[] newArr = ArrayUtil.getPrimes(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPrimes_24() {
-		int max = 24;
-		int[] expecteds = { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
-
-		int[] newArr = ArrayUtil.getPrimes(max);
-
-		assertArrayEquals(newArr, expecteds);
-	}
-
-	@Test
-	public void getPerfectNumbers_max() {
-		long max = Long.MAX_VALUE;
-		max = 10000;
-		long[] expecteds = { 6, 28, 496, 8128, 33550336, 8589869056L, 137438691328L, 2305843008139952128L };
-
-		long[] newArr = ArrayUtil.getPerfectNumbers(max);
-
-		assertEquals(newArr[3], expecteds[3]);
-	}
-
-	@Test
-	public void join_0() {
-		int[] array = { 3, 8, 9 };
-		String separator = "-";
-		String expected = "3-8-9";
-
-		String actual = ArrayUtil.join(array, separator);
-		assertEquals(expected, actual);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java
deleted file mode 100644
index b2fa989915..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/core/StrutsTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.github.eulerlcs.jmr.litestruts.core;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class StrutsTest {
-
-	@Test
-	public void testLoginActionSuccess() {
-
-		String actionName = "login";
-
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "1234");
-
-		View view = Struts.runAction(actionName, params);
-
-		Assert.assertEquals("/jsp/homepage.jsp", view.getJsp());
-		Assert.assertEquals("login successful", view.getParameters().get("message"));
-	}
-
-	@Test
-	public void testLoginActionFailed() {
-		String actionName = "login";
-		Map<String, String> params = new HashMap<String, String>();
-		params.put("name", "test");
-		params.put("password", "123456"); // 密码和预设的不一致
-
-		View view = Struts.runAction(actionName, params);
-
-		Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp());
-		Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message"));
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-62-litestruts/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/data/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-63-download/data/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml b/students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml
deleted file mode 100644
index 8656e91371..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-63-download</artifactId>
-	<description>eulerlcs master java road - download file by multiple thread</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>commons-digester</groupId>
-			<artifactId>commons-digester</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.stefanbirkner</groupId>
-			<artifactId>system-rules</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java
deleted file mode 100644
index 78d537e842..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/Iterator.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-public interface Iterator {
-	public boolean hasNext();
-
-	public Object next();
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java
deleted file mode 100644
index 7f42cc502b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/LinkedList.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-public class LinkedList implements List {
-
-	private Node head;
-
-	public void add(Object o) {
-
-	}
-
-	public void add(int index, Object o) {
-
-	}
-
-	public Object get(int index) {
-		return null;
-	}
-
-	public Object remove(int index) {
-		return null;
-	}
-
-	public int size() {
-		return -1;
-	}
-
-	public void addFirst(Object o) {
-
-	}
-
-	public void addLast(Object o) {
-
-	}
-
-	public Object removeFirst() {
-		return null;
-	}
-
-	public Object removeLast() {
-		return null;
-	}
-
-	public Iterator iterator() {
-		return null;
-	}
-
-	private static class Node {
-		Object data;
-		Node next;
-
-	}
-
-	/**
-	 * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3
-	 */
-	public void reverse() {
-
-	}
-
-	/**
-	 * 删除一个单链表的前半部分 例如：list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10
-	 * ,删除以后的值为7,8,10
-	 * 
-	 */
-	public void removeFirstHalf() {
-
-	}
-
-	/**
-	 * 从第i个元素开始， 删除length 个元素 ， 注意i从0开始
-	 * 
-	 * @param i
-	 * @param length
-	 */
-	public void remove(int i, int length) {
-
-	}
-
-	/**
-	 * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 =
-	 * 11->101->201->301->401->501->601->701 listB = 1->3->4->6
-	 * 返回的结果应该是[101,301,401,601]
-	 * 
-	 * @param list
-	 */
-	public static int[] getElements(LinkedList list) {
-		return null;
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 从当前链表中中删除在list中出现的元素
-	 * 
-	 * @param list
-	 */
-
-	public void subtract(LinkedList list) {
-
-	}
-
-	/**
-	 * 已知当前链表中的元素以值递增有序排列，并以单链表作存储结构。 删除表中所有值相同的多余元素（使得操作后的线性表中所有元素的值均不相同）
-	 */
-	public void removeDuplicateValues() {
-
-	}
-
-	/**
-	 * 已知链表中的元素以值递增有序排列，并以单链表作存储结构。 试写一高效的算法，删除表中所有值大于min且小于max的元素（若表中存在这样的元素）
-	 * 
-	 * @param min
-	 * @param max
-	 */
-	public void removeRange(int min, int max) {
-
-	}
-
-	/**
-	 * 假设当前链表和参数list指定的链表均以元素依值递增有序排列（同一表中的元素值各不相同）
-	 * 现要求生成新链表C，其元素为当前链表和list中元素的交集，且表C中的元素有依值递增有序排列
-	 * 
-	 * @param list
-	 */
-	public LinkedList intersection(LinkedList list) {
-		return null;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java
deleted file mode 100644
index d693a0895d..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/algorithm/List.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-public interface List {
-	public void add(Object o);
-
-	public void add(int index, Object o);
-
-	public Object get(int index);
-
-	public Object remove(int index);
-
-	public int size();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java
deleted file mode 100644
index 30042c8db0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/Connection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.eulerlcs.jmr.download.api;
-
-import java.io.IOException;
-
-public interface Connection {
-	/**
-	 * 给定开始和结束位置， 读取数据， 返回值是字节数组
-	 * 
-	 * @param startPos
-	 *            开始位置， 从0开始
-	 * @param endPos
-	 *            结束位置
-	 * @return
-	 */
-	public byte[] read(int startPos, int endPos) throws IOException;
-
-	/**
-	 * 得到数据内容的长度
-	 * 
-	 * @return
-	 */
-	public int getContentLength();
-
-	/**
-	 * 关闭连接
-	 */
-	public void close();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java
deleted file mode 100644
index 2ba4d3978c..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.github.eulerlcs.jmr.download.api;
-
-public class ConnectionException extends Exception {
-	private static final long serialVersionUID = 1L;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java
deleted file mode 100644
index e2faed7df6..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/ConnectionManager.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.eulerlcs.jmr.download.api;
-
-public interface ConnectionManager {
-	/**
-	 * 给定一个url , 打开一个连接
-	 * 
-	 * @param url
-	 * @return
-	 */
-	public Connection open(String url) throws ConnectionException;
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java
deleted file mode 100644
index 80400ab21b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/api/DownloadListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.github.eulerlcs.jmr.download.api;
-
-public interface DownloadListener {
-	public void notifyFinished();
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java
deleted file mode 100644
index 179a037a92..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/DownloadThread.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.github.eulerlcs.jmr.download.core;
-
-import com.github.eulerlcs.jmr.download.api.Connection;
-
-public class DownloadThread extends Thread {
-	Connection conn;
-	int startPos;
-	int endPos;
-
-	public DownloadThread(Connection conn, int startPos, int endPos) {
-		this.conn = conn;
-		this.startPos = startPos;
-		this.endPos = endPos;
-	}
-
-	@Override
-	public void run() {
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java
deleted file mode 100644
index fa3c193960..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/core/FileDownloader.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.github.eulerlcs.jmr.download.core;
-
-import com.github.eulerlcs.jmr.download.api.Connection;
-import com.github.eulerlcs.jmr.download.api.ConnectionException;
-import com.github.eulerlcs.jmr.download.api.ConnectionManager;
-import com.github.eulerlcs.jmr.download.api.DownloadListener;
-
-public class FileDownloader {
-
-	String url;
-
-	DownloadListener listener;
-
-	ConnectionManager cm;
-
-	public FileDownloader(String _url) {
-		this.url = _url;
-	}
-
-	public void execute() {
-		// 在这里实现你的代码， 注意： 需要用多线程实现下载
-		// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
-		// (1) ConnectionManager , 可以打开一个连接，通过Connection可以读取其中的一段（用startPos,
-		// endPos来指定）
-		// (2) DownloadListener, 由于是多线程下载， 调用这个类的客户端不知道什么时候结束，所以你需要实现当所有
-		// 线程都执行完以后， 调用listener的notifiedFinished方法， 这样客户端就能收到通知。
-		// 具体的实现思路：
-		// 1. 需要调用ConnectionManager的open方法打开连接，
-		// 然后通过Connection.getContentLength方法获得文件的长度
-		// 2. 至少启动3个线程下载， 注意每个线程需要先调用ConnectionManager的open方法
-		// 然后调用read方法， read方法中有读取文件的开始位置和结束位置的参数， 返回值是byte[]数组
-		// 3. 把byte数组写入到文件中
-		// 4. 所有的线程都下载完成以后， 需要调用listener的notifiedFinished方法
-
-		// 下面的代码是示例代码， 也就是说只有一个线程， 你需要改造成多线程的。
-		Connection conn = null;
-		try {
-			conn = cm.open(this.url);
-
-			int length = conn.getContentLength();
-
-			new DownloadThread(conn, 0, length - 1).start();
-
-		} catch (ConnectionException e) {
-			e.printStackTrace();
-		} finally {
-			if (conn != null) {
-				conn.close();
-			}
-		}
-	}
-
-	public void setListener(DownloadListener listener) {
-		this.listener = listener;
-	}
-
-	public void setConnectionManager(ConnectionManager ucm) {
-		this.cm = ucm;
-	}
-
-	public DownloadListener getListener() {
-		return this.listener;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java
deleted file mode 100644
index 72b679702b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.github.eulerlcs.jmr.download.impl;
-
-import java.io.IOException;
-
-import com.github.eulerlcs.jmr.download.api.Connection;
-
-public class ConnectionImpl implements Connection {
-
-	@Override
-	public byte[] read(int startPos, int endPos) throws IOException {
-
-		return null;
-	}
-
-	@Override
-	public int getContentLength() {
-
-		return 0;
-	}
-
-	@Override
-	public void close() {
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java
deleted file mode 100644
index b24ae09984..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/java/com/github/eulerlcs/jmr/download/impl/ConnectionManagerImpl.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.github.eulerlcs.jmr.download.impl;
-
-import com.github.eulerlcs.jmr.download.api.Connection;
-import com.github.eulerlcs.jmr.download.api.ConnectionException;
-import com.github.eulerlcs.jmr.download.api.ConnectionManager;
-
-public class ConnectionManagerImpl implements ConnectionManager {
-
-	@Override
-	public Connection open(String url) throws ConnectionException {
-
-		return null;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java
deleted file mode 100644
index 531601606e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/java/com/github/eulerlcs/jmr/download/core/FileDownloaderTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.github.eulerlcs.jmr.download.core;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.github.eulerlcs.jmr.download.api.ConnectionManager;
-import com.github.eulerlcs.jmr.download.api.DownloadListener;
-import com.github.eulerlcs.jmr.download.impl.ConnectionManagerImpl;
-
-public class FileDownloaderTest {
-	boolean downloadFinished = false;
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-	}
-
-	@Test
-	public void testDownload() {
-		String url = "http://localhost:8080/test.jpg";
-
-		FileDownloader downloader = new FileDownloader(url);
-
-		ConnectionManager cm = new ConnectionManagerImpl();
-		downloader.setConnectionManager(cm);
-
-		downloader.setListener(new DownloadListener() {
-			@Override
-			public void notifyFinished() {
-				downloadFinished = true;
-			}
-		});
-
-		downloader.execute();
-
-		// 等待多线程下载程序执行完毕
-		while (!downloadFinished) {
-			try {
-				System.out.println("还没有下载完成，休眠五秒");
-				// 休眠5秒
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-
-		System.out.println("下载完成！");
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-63-download/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/data/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/data/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml
deleted file mode 100644
index 76b2d2e4be..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>com.github.eulerlcs</groupId>
-		<artifactId>jmr-02-parent</artifactId>
-		<version>0.0.1-SNAPSHOT</version>
-		<relativePath>../jmr-02-parent/pom.xml</relativePath>
-	</parent>
-	<artifactId>jmr-64-minijvm</artifactId>
-	<description>eulerlcs master java road - mini jvm</description>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.github.eulerlcs</groupId>
-			<artifactId>jmr-61-collection</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-digester</groupId>
-			<artifactId>commons-digester</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-log4j12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.stefanbirkner</groupId>
-			<artifactId>system-rules</artifactId>
-		</dependency>
-	</dependencies>
-</project>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java
deleted file mode 100644
index 25268be2dc..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrame.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-/**
- * 用双向链表实现LRU算法
- * 
- * @author liuxin, eulerlcs
- */
-public class LRUPageFrame {
-	private static class Node {
-		Node prev;
-		Node next;
-		int pageNum;
-	}
-
-	private int capacity;
-	private int length = 0;
-	private Node first;// 链表头
-	private Node last;// 链表尾
-
-	public LRUPageFrame(int capacity) {
-		this.capacity = capacity;
-	}
-
-	/**
-	 * 获取缓存中对象
-	 * 
-	 * @param pageNum
-	 */
-	public void access(int pageNum) {
-		Node node = findNode(pageNum);
-
-		if (node != null) {
-			moveToFirst(node);
-		} else {
-			node = new Node();
-			node.pageNum = pageNum;
-			addToFirst(node);
-		}
-	}
-
-	private Node findNode(int pageNum) {
-		Node node = first;
-
-		while (node != null) {
-			if (node.pageNum == pageNum) {
-				return node;
-			} else {
-				node = node.next;
-			}
-		}
-
-		return null;
-	}
-
-	private void moveToFirst(Node node) {
-		if (node == first) {
-			return;
-		} else if (node == last) {
-			last = node.prev;
-		}
-
-		if (node.prev != null) {
-			node.prev.next = node.next;
-		}
-		if (node.next != null) {
-			node.next.prev = node.prev;
-		}
-
-		first.prev = node;
-		node.prev = null;
-		node.next = first;
-
-		first = node;
-	}
-
-	private void addToFirst(Node node) {
-		if (first == null) {
-			first = node;
-			last = first;
-		} else {
-			first.prev = node;
-			node.next = first;
-			first = node;
-		}
-
-		length++;
-		if (length > capacity) {
-			last.prev.next = null;
-			last = last.prev;
-
-			length = capacity;
-		}
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder buffer = new StringBuilder();
-		Node node = first;
-		while (node != null) {
-			buffer.append(node.pageNum);
-
-			node = node.next;
-			if (node != null) {
-				buffer.append(",");
-			}
-		}
-
-		return buffer.toString();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java
deleted file mode 100644
index 6f2c895554..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/Stack.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-public class Stack {
-	private ArrayList elementData = new ArrayList();
-
-	public void push(Object o) {
-	}
-
-	public Object pop() {
-		return null;
-	}
-
-	public Object peek() {
-		return null;
-	}
-
-	public boolean isEmpty() {
-		return false;
-	}
-
-	public int size() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java
deleted file mode 100644
index 1c0a56be56..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/algorithm/StackUtil.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-public class StackUtil {
-	/**
-	 * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后， 元素次序变为: 1,2,3,4,5
-	 * 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 */
-	public static void reverse(Stack s) {
-
-	}
-
-	/**
-	 * 删除栈中的某个元素 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty， 可以使用另外一个栈来辅助
-	 * 
-	 * @param o
-	 */
-	public static void remove(Stack s, Object o) {
-
-	}
-
-	/**
-	 * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意：只能使用Stack的基本操作，即push,pop,peek,isEmpty，
-	 * 可以使用另外一个栈来辅助
-	 * 
-	 * @param len
-	 * @return
-	 */
-	public static Object[] getTop(Stack s, int len) {
-		return null;
-	}
-
-	/**
-	 * 字符串s 可能包含这些字符： ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s =
-	 * "([e{d}f])" , 则该字符串中的括号是成对出现， 该方法返回true 如果 s = "([b{x]y})",
-	 * 则该字符串中的括号不是成对出现的， 该方法返回false;
-	 * 
-	 * @param s
-	 * @return
-	 */
-	public static boolean isValidPairs(String s) {
-		return false;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java
deleted file mode 100644
index a74ee2eaaf..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/AttributeInfo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.attr;
-
-public abstract class AttributeInfo {
-	public static final String CODE = "Code";
-	public static final String CONST_VALUE = "ConstantValue";
-	public static final String EXCEPTIONS = "Exceptions";
-	public static final String LINE_NUM_TABLE = "LineNumberTable";
-	public static final String LOCAL_VAR_TABLE = "LocalVariableTable";
-	public static final String STACK_MAP_TABLE = "StackMapTable";
-	int attrNameIndex;
-	int attrLen;
-
-	public AttributeInfo(int attrNameIndex, int attrLen) {
-
-		this.attrNameIndex = attrNameIndex;
-		this.attrLen = attrLen;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java
deleted file mode 100644
index ee99466cad..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/CodeAttr.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.attr;
-
-import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
-import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
-
-public class CodeAttr extends AttributeInfo {
-	private int maxStack;
-	private int maxLocals;
-	private int codeLen;
-	private String code;
-
-	public String getCode() {
-		return code;
-	}
-
-	// private ByteCodeCommand[] cmds ;
-	// public ByteCodeCommand[] getCmds() {
-	// return cmds;
-	// }
-	private LineNumberTable lineNumTable;
-	private LocalVariableTable localVarTable;
-	private StackMapTable stackMapTable;
-
-	public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,
-			String code /* ByteCodeCommand[] cmds */) {
-		super(attrNameIndex, attrLen);
-		this.maxStack = maxStack;
-		this.maxLocals = maxLocals;
-		this.codeLen = codeLen;
-		this.code = code;
-		// this.cmds = cmds;
-	}
-
-	public void setLineNumberTable(LineNumberTable t) {
-		this.lineNumTable = t;
-	}
-
-	public void setLocalVariableTable(LocalVariableTable t) {
-		this.localVarTable = t;
-	}
-
-	public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) {
-
-		return null;
-	}
-
-	private void setStackMapTable(StackMapTable t) {
-		this.stackMapTable = t;
-
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java
deleted file mode 100644
index 3c3ee7e256..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LineNumberTable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.attr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
-
-public class LineNumberTable extends AttributeInfo {
-	List<LineNumberItem> items = new ArrayList<LineNumberItem>();
-
-	private static class LineNumberItem {
-		int startPC;
-		int lineNum;
-
-		public int getStartPC() {
-			return startPC;
-		}
-
-		public void setStartPC(int startPC) {
-			this.startPC = startPC;
-		}
-
-		public int getLineNum() {
-			return lineNum;
-		}
-
-		public void setLineNum(int lineNum) {
-			this.lineNum = lineNum;
-		}
-	}
-
-	public void addLineNumberItem(LineNumberItem item) {
-		this.items.add(item);
-	}
-
-	public LineNumberTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-
-	}
-
-	public static LineNumberTable parse(ByteCodeIterator iter) {
-
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java
deleted file mode 100644
index 19483e48d5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableItem.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.attr;
-
-public class LocalVariableItem {
-	private int startPC;
-	private int length;
-	private int nameIndex;
-	private int descIndex;
-	private int index;
-
-	public int getStartPC() {
-		return startPC;
-	}
-
-	public void setStartPC(int startPC) {
-		this.startPC = startPC;
-	}
-
-	public int getLength() {
-		return length;
-	}
-
-	public void setLength(int length) {
-		this.length = length;
-	}
-
-	public int getNameIndex() {
-		return nameIndex;
-	}
-
-	public void setNameIndex(int nameIndex) {
-		this.nameIndex = nameIndex;
-	}
-
-	public int getDescIndex() {
-		return descIndex;
-	}
-
-	public void setDescIndex(int descIndex) {
-		this.descIndex = descIndex;
-	}
-
-	public int getIndex() {
-		return index;
-	}
-
-	public void setIndex(int index) {
-		this.index = index;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java
deleted file mode 100644
index a847d9222e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/LocalVariableTable.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.attr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
-
-public class LocalVariableTable extends AttributeInfo {
-
-	List<LocalVariableItem> items = new ArrayList<LocalVariableItem>();
-
-	public LocalVariableTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-	}
-
-	public static LocalVariableTable parse(ByteCodeIterator iter) {
-
-		return null;
-	}
-
-	private void addLocalVariableItem(LocalVariableItem item) {
-		this.items.add(item);
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java
deleted file mode 100644
index e281ce8616..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/attr/StackMapTable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.attr;
-
-import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
-
-public class StackMapTable extends AttributeInfo {
-
-	private String originalCode;
-
-	public StackMapTable(int attrNameIndex, int attrLen) {
-		super(attrNameIndex, attrLen);
-	}
-
-	public static StackMapTable parse(ByteCodeIterator iter) {
-		int index = iter.nextU2ToInt();
-		int len = iter.nextU4ToInt();
-		StackMapTable t = new StackMapTable(index, len);
-
-		// 后面的StackMapTable太过复杂， 不再处理， 只把原始的代码读进来保存
-		String code = iter.nextUxToHexString(len);
-		t.setOriginalCode(code);
-
-		return t;
-	}
-
-	private void setOriginalCode(String code) {
-		this.originalCode = code;
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java
deleted file mode 100644
index 2e912067fd..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/AccessFlag.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.clz;
-
-public class AccessFlag {
-	private int flagValue;
-
-	public AccessFlag(int value) {
-		this.flagValue = value;
-	}
-
-	public int getFlagValue() {
-		return flagValue;
-	}
-
-	public void setFlagValue(int flag) {
-		this.flagValue = flag;
-	}
-
-	public boolean isPublicClass() {
-		return (this.flagValue & 0x0001) != 0;
-	}
-
-	public boolean isFinalClass() {
-		return (this.flagValue & 0x0010) != 0;
-	}
-
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java
deleted file mode 100644
index 7b84ca588e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassFile.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.clz;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.github.eulerlcs.jmr.jvm.constant.ClassInfo;
-import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
-import com.github.eulerlcs.jmr.jvm.field.Field;
-import com.github.eulerlcs.jmr.jvm.method.Method;
-
-public class ClassFile {
-
-	private int minorVersion;
-	private int majorVersion;
-
-	private AccessFlag accessFlag;
-	private ClassIndex clzIndex;
-	private ConstantPool pool;
-	private List<Field> fields = new ArrayList<Field>();
-	private List<Method> methods = new ArrayList<Method>();
-
-	public ClassIndex getClzIndex() {
-		return clzIndex;
-	}
-
-	public AccessFlag getAccessFlag() {
-		return accessFlag;
-	}
-
-	public void setAccessFlag(AccessFlag accessFlag) {
-		this.accessFlag = accessFlag;
-	}
-
-	public ConstantPool getConstantPool() {
-		return pool;
-	}
-
-	public int getMinorVersion() {
-		return minorVersion;
-	}
-
-	public void setMinorVersion(int minorVersion) {
-		this.minorVersion = minorVersion;
-	}
-
-	public int getMajorVersion() {
-		return majorVersion;
-	}
-
-	public void setMajorVersion(int majorVersion) {
-		this.majorVersion = majorVersion;
-	}
-
-	public void setConstPool(ConstantPool pool) {
-		this.pool = pool;
-
-	}
-
-	public void setClassIndex(ClassIndex clzIndex) {
-		this.clzIndex = clzIndex;
-	}
-
-	public void addField(Field f) {
-		this.fields.add(f);
-	}
-
-	public List<Field> getFields() {
-		return this.fields;
-	}
-
-	public void addMethod(Method m) {
-		this.methods.add(m);
-	}
-
-	public List<Method> getMethods() {
-		return methods;
-	}
-
-	public void print() {
-
-		if (this.accessFlag.isPublicClass()) {
-			System.out.println("Access flag : public  ");
-		}
-		System.out.println("Class Name:" + getClassName());
-
-		System.out.println("Super Class Name:" + getSuperClassName());
-
-	}
-
-	private String getClassName() {
-		int thisClassIndex = this.clzIndex.getThisClassIndex();
-		ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex);
-		return thisClass.getClassName();
-	}
-
-	private String getSuperClassName() {
-		ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex());
-		return superClass.getClassName();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java
deleted file mode 100644
index 819b538406..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/clz/ClassIndex.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.clz;
-
-public class ClassIndex {
-	private int thisClassIndex;
-	private int superClassIndex;
-
-	public int getThisClassIndex() {
-		return thisClassIndex;
-	}
-
-	public void setThisClassIndex(int thisClassIndex) {
-		this.thisClassIndex = thisClassIndex;
-	}
-
-	public int getSuperClassIndex() {
-		return superClassIndex;
-	}
-
-	public void setSuperClassIndex(int superClassIndex) {
-		this.superClassIndex = superClassIndex;
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java
deleted file mode 100644
index d2bc776faf..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ClassInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class ClassInfo extends ConstantInfo {
-	private int type = ConstantInfo.CLASS_INFO;
-	private int utf8Index;
-
-	public ClassInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getUtf8Index() {
-		return utf8Index;
-	}
-
-	public void setUtf8Index(int utf8Index) {
-		this.utf8Index = utf8Index;
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public String getClassName() {
-		int index = getUtf8Index();
-		UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index);
-		return utf8Info.getValue();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java
deleted file mode 100644
index c283fb56a5..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public abstract class ConstantInfo {
-	public static final int UTF8_INFO = 1;
-	public static final int FLOAT_INFO = 4;
-	public static final int CLASS_INFO = 7;
-	public static final int STRING_INFO = 8;
-	public static final int FIELD_INFO = 9;
-	public static final int METHOD_INFO = 10;
-	public static final int NAME_AND_TYPE_INFO = 12;
-	protected ConstantPool constantPool;
-
-	public ConstantInfo() {
-	}
-
-	public ConstantInfo(ConstantPool pool) {
-		this.constantPool = pool;
-	}
-
-	public abstract int getType();
-
-	public ConstantPool getConstantPool() {
-		return constantPool;
-	}
-
-	public ConstantInfo getConstantInfo(int index) {
-		return this.constantPool.getConstantInfo(index);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java
deleted file mode 100644
index ff1af9d094..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/ConstantPool.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ConstantPool {
-
-	private List<ConstantInfo> constantInfos = new ArrayList<ConstantInfo>();
-
-	public ConstantPool() {
-	}
-
-	public void addConstantInfo(ConstantInfo info) {
-		this.constantInfos.add(info);
-	}
-
-	public ConstantInfo getConstantInfo(int index) {
-		return this.constantInfos.get(index);
-	}
-
-	public String getUTF8String(int index) {
-		return ((UTF8Info) this.constantInfos.get(index)).getValue();
-	}
-
-	public Object getSize() {
-		return this.constantInfos.size() - 1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java
deleted file mode 100644
index e5220ac5c4..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/FieldRefInfo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class FieldRefInfo extends ConstantInfo {
-	private int type = ConstantInfo.FIELD_INFO;
-	private int classInfoIndex;
-	private int nameAndTypeIndex;
-
-	public FieldRefInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public int getClassInfoIndex() {
-		return classInfoIndex;
-	}
-
-	public void setClassInfoIndex(int classInfoIndex) {
-		this.classInfoIndex = classInfoIndex;
-	}
-
-	public int getNameAndTypeIndex() {
-		return nameAndTypeIndex;
-	}
-
-	public void setNameAndTypeIndex(int nameAndTypeIndex) {
-		this.nameAndTypeIndex = nameAndTypeIndex;
-	}
-
-	@Override
-	public String toString() {
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
-		return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]";
-	}
-
-	public String getClassName() {
-		ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex());
-		UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index());
-		return utf8Info.getValue();
-	}
-
-	public String getFieldName() {
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getName();
-	}
-
-	public String getFieldType() {
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getTypeInfo();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java
deleted file mode 100644
index 4dc4ae3d1b..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/MethodRefInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class MethodRefInfo extends ConstantInfo {
-	private int type = ConstantInfo.METHOD_INFO;
-
-	private int classInfoIndex;
-	private int nameAndTypeIndex;
-
-	public MethodRefInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public int getClassInfoIndex() {
-		return classInfoIndex;
-	}
-
-	public void setClassInfoIndex(int classInfoIndex) {
-		this.classInfoIndex = classInfoIndex;
-	}
-
-	public int getNameAndTypeIndex() {
-		return nameAndTypeIndex;
-	}
-
-	public void setNameAndTypeIndex(int nameAndTypeIndex) {
-		this.nameAndTypeIndex = nameAndTypeIndex;
-	}
-
-	@Override
-	public String toString() {
-		return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType();
-	}
-
-	public String getClassName() {
-		ConstantPool pool = this.getConstantPool();
-		ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex());
-		return clzInfo.getClassName();
-	}
-
-	public String getMethodName() {
-		ConstantPool pool = this.getConstantPool();
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getName();
-	}
-
-	public String getParamAndReturnType() {
-		ConstantPool pool = this.getConstantPool();
-		NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex());
-		return typeInfo.getTypeInfo();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java
deleted file mode 100644
index 6674006efd..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NameAndTypeInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class NameAndTypeInfo extends ConstantInfo {
-	public int type = ConstantInfo.NAME_AND_TYPE_INFO;
-
-	private int index1;
-	private int index2;
-
-	public NameAndTypeInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getIndex1() {
-		return index1;
-	}
-
-	public void setIndex1(int index1) {
-		this.index1 = index1;
-	}
-
-	public int getIndex2() {
-		return index2;
-	}
-
-	public void setIndex2(int index2) {
-		this.index2 = index2;
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public String getName() {
-		ConstantPool pool = this.getConstantPool();
-		UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1);
-		return utf8Info1.getValue();
-	}
-
-	public String getTypeInfo() {
-		ConstantPool pool = this.getConstantPool();
-		UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2);
-		return utf8Info2.getValue();
-	}
-
-	@Override
-	public String toString() {
-		return "(" + getName() + "," + getTypeInfo() + ")";
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java
deleted file mode 100644
index c4267ca5fc..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/NullConstantInfo.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class NullConstantInfo extends ConstantInfo {
-	public NullConstantInfo() {
-	}
-
-	@Override
-	public int getType() {
-		return -1;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java
deleted file mode 100644
index 6f3575a5e0..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/StringInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class StringInfo extends ConstantInfo {
-	private int type = ConstantInfo.STRING_INFO;
-	private int index;
-
-	public StringInfo(ConstantPool pool) {
-		super(pool);
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	public int getIndex() {
-		return index;
-	}
-
-	public void setIndex(int index) {
-		this.index = index;
-	}
-
-	@Override
-	public String toString() {
-		return this.getConstantPool().getUTF8String(index);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java
deleted file mode 100644
index 2435cc554e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/constant/UTF8Info.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.constant;
-
-public class UTF8Info extends ConstantInfo {
-	private int type = ConstantInfo.UTF8_INFO;
-	private int length;
-	private String value;
-
-	public UTF8Info(ConstantPool pool) {
-		super(pool);
-	}
-
-	public int getLength() {
-		return length;
-	}
-
-	public void setLength(int length) {
-		this.length = length;
-	}
-
-	@Override
-	public int getType() {
-		return type;
-	}
-
-	@Override
-	public String toString() {
-		return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]";
-	}
-
-	public String getValue() {
-		return value;
-	}
-
-	public void setValue(String value) {
-		this.value = value;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java
deleted file mode 100644
index d0f54964ac..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/field/Field.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.field;
-
-import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
-import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
-
-public class Field {
-	private int accessFlag;
-	private int nameIndex;
-	private int descriptorIndex;
-
-	private ConstantPool pool;
-
-	public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) {
-
-		this.accessFlag = accessFlag;
-		this.nameIndex = nameIndex;
-		this.descriptorIndex = descriptorIndex;
-		this.pool = pool;
-	}
-
-	public static Field parse(ConstantPool pool, ByteCodeIterator iter) {
-
-		return null;
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java
deleted file mode 100644
index 095a81dece..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ByteCodeIterator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.loader;
-
-import java.util.Arrays;
-
-import com.github.eulerlcs.jmr.jvm.util.Util;
-
-public class ByteCodeIterator {
-	byte[] codes;
-	int pos = 0;
-
-	ByteCodeIterator(byte[] codes) {
-		this.codes = codes;
-	}
-
-	public byte[] getBytes(int len) {
-		if (pos + len >= codes.length) {
-			throw new ArrayIndexOutOfBoundsException();
-		}
-
-		byte[] data = Arrays.copyOfRange(codes, pos, pos + len);
-		pos += len;
-		return data;
-	}
-
-	public int nextU1toInt() {
-
-		return Util.byteToInt(new byte[] { codes[pos++] });
-	}
-
-	public int nextU2ToInt() {
-		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] });
-	}
-
-	public int nextU4ToInt() {
-		return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] });
-	}
-
-	public String nextU4ToHexString() {
-		return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }));
-	}
-
-	public String nextUxToHexString(int len) {
-		byte[] tmp = new byte[len];
-
-		for (int i = 0; i < len; i++) {
-			tmp[i] = codes[pos++];
-		}
-		return Util.byteToHexString(tmp).toLowerCase();
-
-	}
-
-	public void back(int n) {
-		this.pos -= n;
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java
deleted file mode 100644
index 49018cb0a7..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileLoader.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.loader;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
-
-public class ClassFileLoader {
-	private final static Logger log = LoggerFactory.getLogger(ClassFileLoader.class);
-
-	private List<String> clzPaths = new ArrayList<String>();
-
-	public byte[] readBinaryCode(String className) {
-		File file = findClassFile(className);
-		if (file == null) {
-			return new byte[0];
-		}
-
-		byte[] ret = null;
-		byte[] bytes = new byte[(int) file.length()];
-		try (DataInputStream dis = new DataInputStream(new FileInputStream(file))) {
-			dis.readFully(bytes);
-			ret = bytes;
-		} catch (IOException e) {
-			log.error("ClassFileLoader read error!", e);
-		}
-
-		return ret;
-	}
-
-	private File findClassFile(String className) {
-		String sub = className.replace(".", File.separator) + ".class";
-		for (String clzPath : clzPaths) {
-			File file = new File(clzPath, sub);
-			if (file.exists()) {
-				return file;
-			}
-		}
-
-		return null;
-	}
-
-	public void addClassPath(String path) {
-		clzPaths.add(path);
-	}
-
-	public String getClassPath() {
-		if (clzPaths.size() == 0) {
-			return "";
-		}
-
-		StringBuilder sb = new StringBuilder();
-		for (String clzPath : clzPaths) {
-			sb.append(";");
-			sb.append(clzPath);
-		}
-
-		String cat = sb.toString();
-		return cat.length() > 0 ? cat.substring(1) : "";
-	}
-
-	public ClassFile loadClass(String className) {
-		byte[] codes = this.readBinaryCode(className);
-		ClassFileParser parser = new ClassFileParser();
-		return parser.parse(codes);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java
deleted file mode 100644
index 394c35beb9..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileParser.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.loader;
-
-import java.io.UnsupportedEncodingException;
-
-import com.github.eulerlcs.jmr.jvm.clz.AccessFlag;
-import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
-import com.github.eulerlcs.jmr.jvm.clz.ClassIndex;
-import com.github.eulerlcs.jmr.jvm.constant.ClassInfo;
-import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
-import com.github.eulerlcs.jmr.jvm.constant.FieldRefInfo;
-import com.github.eulerlcs.jmr.jvm.constant.MethodRefInfo;
-import com.github.eulerlcs.jmr.jvm.constant.NameAndTypeInfo;
-import com.github.eulerlcs.jmr.jvm.constant.NullConstantInfo;
-import com.github.eulerlcs.jmr.jvm.constant.StringInfo;
-import com.github.eulerlcs.jmr.jvm.constant.UTF8Info;
-
-public class ClassFileParser {
-
-	public ClassFile parse(byte[] codes) {
-
-		ClassFile clzFile = new ClassFile();
-
-		ByteCodeIterator iter = new ByteCodeIterator(codes);
-
-		String magicNumber = iter.nextU4ToHexString();
-
-		if (!"cafebabe".equals(magicNumber)) {
-			return null;
-		}
-
-		clzFile.setMinorVersion(iter.nextU2ToInt());
-		clzFile.setMajorVersion(iter.nextU2ToInt());
-
-		ConstantPool pool = parseConstantPool(iter);
-		clzFile.setConstPool(pool);
-
-		AccessFlag flag = parseAccessFlag(iter);
-		clzFile.setAccessFlag(flag);
-
-		ClassIndex clzIndex = parseClassInfex(iter);
-		clzFile.setClassIndex(clzIndex);
-
-		parseInterfaces(iter);
-
-		return clzFile;
-	}
-
-	private AccessFlag parseAccessFlag(ByteCodeIterator iter) {
-
-		AccessFlag flag = new AccessFlag(iter.nextU2ToInt());
-		// System.out.println("Is public class: " + flag.isPublicClass());
-		// System.out.println("Is final class : " + flag.isFinalClass());
-
-		return flag;
-	}
-
-	private ClassIndex parseClassInfex(ByteCodeIterator iter) {
-
-		int thisClassIndex = iter.nextU2ToInt();
-		int superClassIndex = iter.nextU2ToInt();
-
-		ClassIndex clzIndex = new ClassIndex();
-
-		clzIndex.setThisClassIndex(thisClassIndex);
-		clzIndex.setSuperClassIndex(superClassIndex);
-
-		return clzIndex;
-
-	}
-
-	private ConstantPool parseConstantPool(ByteCodeIterator iter) {
-
-		int constPoolCount = iter.nextU2ToInt();
-
-		System.out.println("Constant Pool Count :" + constPoolCount);
-
-		ConstantPool pool = new ConstantPool();
-
-		pool.addConstantInfo(new NullConstantInfo());
-
-		for (int i = 1; i <= constPoolCount - 1; i++) {
-
-			int tag = iter.nextU1toInt();
-
-			if (tag == 7) {
-				// Class Info
-				int utf8Index = iter.nextU2ToInt();
-				ClassInfo clzInfo = new ClassInfo(pool);
-				clzInfo.setUtf8Index(utf8Index);
-
-				pool.addConstantInfo(clzInfo);
-			} else if (tag == 1) {
-				// UTF-8 String
-				int len = iter.nextU2ToInt();
-				byte[] data = iter.getBytes(len);
-				String value = null;
-				try {
-					value = new String(data, "UTF-8");
-				} catch (UnsupportedEncodingException e) {
-					e.printStackTrace();
-				}
-
-				UTF8Info utf8Str = new UTF8Info(pool);
-				utf8Str.setLength(len);
-				utf8Str.setValue(value);
-				pool.addConstantInfo(utf8Str);
-			} else if (tag == 8) {
-				StringInfo info = new StringInfo(pool);
-				info.setIndex(iter.nextU2ToInt());
-				pool.addConstantInfo(info);
-			} else if (tag == 9) {
-				FieldRefInfo field = new FieldRefInfo(pool);
-				field.setClassInfoIndex(iter.nextU2ToInt());
-				field.setNameAndTypeIndex(iter.nextU2ToInt());
-				pool.addConstantInfo(field);
-			} else if (tag == 10) {
-				// MethodRef
-				MethodRefInfo method = new MethodRefInfo(pool);
-				method.setClassInfoIndex(iter.nextU2ToInt());
-				method.setNameAndTypeIndex(iter.nextU2ToInt());
-				pool.addConstantInfo(method);
-			} else if (tag == 12) {
-				// Name and Type Info
-				NameAndTypeInfo nameType = new NameAndTypeInfo(pool);
-				nameType.setIndex1(iter.nextU2ToInt());
-				nameType.setIndex2(iter.nextU2ToInt());
-				pool.addConstantInfo(nameType);
-			} else {
-				throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet.");
-			}
-		}
-
-		System.out.println("Finished reading Constant pool ");
-
-		return pool;
-	}
-
-	private void parseInterfaces(ByteCodeIterator iter) {
-		int interfaceCount = iter.nextU2ToInt();
-
-		System.out.println("interfaceCount:" + interfaceCount);
-
-		// TODO : 如果实现了interface, 这里需要解析
-	}
-
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java
deleted file mode 100644
index 2f043bc42e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/method/Method.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.method;
-
-import com.github.eulerlcs.jmr.jvm.attr.CodeAttr;
-import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
-import com.github.eulerlcs.jmr.jvm.loader.ByteCodeIterator;
-
-public class Method {
-
-	private int accessFlag;
-	private int nameIndex;
-	private int descriptorIndex;
-
-	private com.github.eulerlcs.jmr.jvm.attr.CodeAttr codeAttr;
-
-	private ClassFile clzFile;
-
-	public ClassFile getClzFile() {
-		return clzFile;
-	}
-
-	public int getNameIndex() {
-		return nameIndex;
-	}
-
-	public int getDescriptorIndex() {
-		return descriptorIndex;
-	}
-
-	public CodeAttr getCodeAttr() {
-		return codeAttr;
-	}
-
-	public void setCodeAttr(CodeAttr code) {
-		this.codeAttr = code;
-	}
-
-	public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) {
-		this.clzFile = clzFile;
-		this.accessFlag = accessFlag;
-		this.nameIndex = nameIndex;
-		this.descriptorIndex = descriptorIndex;
-	}
-
-	public static Method parse(ClassFile clzFile, ByteCodeIterator iter) {
-		return null;
-
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java
deleted file mode 100644
index 7cc99ed27e..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/java/com/github/eulerlcs/jmr/jvm/util/Util.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.util;
-
-public class Util {
-	public static int byteToInt(byte[] codes) {
-		String s1 = byteToHexString(codes);
-		return Integer.valueOf(s1, 16).intValue();
-	}
-
-	public static String byteToHexString(byte[] codes) {
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < codes.length; i++) {
-			byte b = codes[i];
-			int value = b & 0xFF;
-			String strHex = Integer.toHexString(value);
-			if (strHex.length() < 2) {
-				strHex = "0" + strHex;
-			}
-			buffer.append(strHex);
-		}
-		return buffer.toString();
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java
deleted file mode 100644
index debc4d7eb6..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/algorithm/LRUPageFrameTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.github.eulerlcs.jmr.algorithm;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class LRUPageFrameTest {
-	@Test
-	public void testAccess() {
-		LRUPageFrame frame = new LRUPageFrame(3);
-		frame.access(7);
-		frame.access(0);
-		frame.access(1);
-		Assert.assertEquals("1,0,7", frame.toString());
-		frame.access(2);
-		Assert.assertEquals("2,1,0", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,2,1", frame.toString());
-		frame.access(3);
-		Assert.assertEquals("3,0,2", frame.toString());
-		frame.access(0);
-		Assert.assertEquals("0,3,2", frame.toString());
-		frame.access(4);
-		Assert.assertEquals("4,0,3", frame.toString());
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java
deleted file mode 100644
index 1e18416b61..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/ClassFileloaderTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.loader;
-
-import java.io.File;
-import java.util.List;
-
-import javax.xml.bind.DatatypeConverter;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.github.eulerlcs.jmr.jvm.clz.ClassFile;
-import com.github.eulerlcs.jmr.jvm.clz.ClassIndex;
-import com.github.eulerlcs.jmr.jvm.constant.ClassInfo;
-import com.github.eulerlcs.jmr.jvm.constant.ConstantPool;
-import com.github.eulerlcs.jmr.jvm.constant.MethodRefInfo;
-import com.github.eulerlcs.jmr.jvm.constant.NameAndTypeInfo;
-import com.github.eulerlcs.jmr.jvm.constant.UTF8Info;
-import com.github.eulerlcs.jmr.jvm.field.Field;
-import com.github.eulerlcs.jmr.jvm.method.Method;
-
-public class ClassFileloaderTest {
-	private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1";
-	private static String userDir = System.getProperty("user.dir");
-	private static String path1 = "C:\temp";
-	private static String path2 = userDir + File.separator + "target" + File.separator + "test-classes";
-	private static String className = EmployeeV1.class.getName();
-	static ClassFileLoader loader = null;
-	static ClassFile clzFile = null;
-	static {
-		loader = new ClassFileLoader();
-		loader.addClassPath(path1);
-		loader.addClassPath(path2);
-		clzFile = loader.loadClass(className);
-		clzFile.print();
-	}
-
-	@Before
-	public void setUp() throws Exception {
-	}
-
-	@After
-	public void tearDown() throws Exception {
-		loader = null;
-	}
-
-	@Test
-	public void testClassPath() {
-		String clzPath = loader.getClassPath();
-		Assert.assertEquals(path1 + ";" + path2, clzPath);
-	}
-
-	@Test
-	public void testClassFileLength() {
-		byte[] byteCodes = loader.readBinaryCode(className);
-		// 注意：这个字节数可能和你的JVM版本有关系， 你可以看看编译好的类到底有多大
-		Assert.assertEquals(1078, byteCodes.length);
-
-	}
-
-	@Test
-	public void testMagicNumber() {
-		byte[] byteCodes = loader.readBinaryCode(className);
-		byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] };
-		String acctualValue = DatatypeConverter.printHexBinary(codes);
-
-		Assert.assertEquals("CAFEBABE", acctualValue);
-	}
-
-	/**
-	 * ----------------------------------------------------------------------
-	 */
-
-	@Test
-	public void testVersion() {
-
-		Assert.assertEquals(0, clzFile.getMinorVersion());
-		Assert.assertEquals(52, clzFile.getMajorVersion());
-
-	}
-
-	@Test
-	public void testConstantPool() {
-
-		ConstantPool pool = clzFile.getConstantPool();
-
-		Assert.assertEquals(53, pool.getSize());
-
-		{
-			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1);
-			Assert.assertEquals(2, clzInfo.getUtf8Index());
-
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2);
-			Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue());
-		}
-		{
-			ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3);
-			Assert.assertEquals(4, clzInfo.getUtf8Index());
-
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4);
-			Assert.assertEquals("java/lang/Object", utf8Info.getValue());
-		}
-		{
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5);
-			Assert.assertEquals("name", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(6);
-			Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(7);
-			Assert.assertEquals("age", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(8);
-			Assert.assertEquals("I", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(9);
-			Assert.assertEquals("<init>", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(10);
-			Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue());
-
-			utf8Info = (UTF8Info) pool.getConstantInfo(11);
-			Assert.assertEquals("Code", utf8Info.getValue());
-		}
-
-		{
-			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(12);
-			Assert.assertEquals(3, methodRef.getClassInfoIndex());
-			Assert.assertEquals(13, methodRef.getNameAndTypeIndex());
-		}
-
-		{
-			NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13);
-			Assert.assertEquals(9, nameAndType.getIndex1());
-			Assert.assertEquals(14, nameAndType.getIndex2());
-		}
-		// 抽查几个吧
-		{
-			MethodRefInfo methodRef = (MethodRefInfo) pool.getConstantInfo(45);
-			Assert.assertEquals(1, methodRef.getClassInfoIndex());
-			Assert.assertEquals(46, methodRef.getNameAndTypeIndex());
-		}
-
-		{
-			UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53);
-			Assert.assertEquals("EmployeeV1.java", utf8Info.getValue());
-		}
-	}
-
-	@Test
-	public void testClassIndex() {
-
-		ClassIndex clzIndex = clzFile.getClzIndex();
-		ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex());
-		ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex());
-
-		Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName());
-		Assert.assertEquals("java/lang/Object", superClassInfo.getClassName());
-	}
-
-	/**
-	 * 下面是第三次JVM课应实现的测试用例
-	 */
-	@Test
-	public void testReadFields() {
-
-		List<Field> fields = clzFile.getFields();
-		Assert.assertEquals(2, fields.size());
-		{
-			Field f = fields.get(0);
-			Assert.assertEquals("name:Ljava/lang/String;", f.toString());
-		}
-		{
-			Field f = fields.get(1);
-			Assert.assertEquals("age:I", f.toString());
-		}
-	}
-
-	@Test
-	public void testMethods() {
-
-		List<Method> methods = clzFile.getMethods();
-		ConstantPool pool = clzFile.getConstantPool();
-
-		{
-			Method m = methods.get(0);
-			assertMethodEquals(pool, m, "<init>", "(Ljava/lang/String;I)V", "2ab7000c2a2bb5000f2a1cb50011b1");
-
-		}
-		{
-			Method m = methods.get(1);
-			assertMethodEquals(pool, m, "setName", "(Ljava/lang/String;)V", "2a2bb5000fb1");
-
-		}
-		{
-			Method m = methods.get(2);
-			assertMethodEquals(pool, m, "setAge", "(I)V", "2a1bb50011b1");
-		}
-		{
-			Method m = methods.get(3);
-			assertMethodEquals(pool, m, "sayHello", "()V", "b2001c1222b60024b1");
-
-		}
-		{
-			Method m = methods.get(4);
-			assertMethodEquals(pool, m, "main", "([Ljava/lang/String;)V", "bb000159122b101db7002d4c2bb6002fb1");
-		}
-	}
-
-	private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc,
-			String expectedCode) {
-		String methodName = pool.getUTF8String(m.getNameIndex());
-		String methodDesc = pool.getUTF8String(m.getDescriptorIndex());
-		String code = m.getCodeAttr().getCode();
-		Assert.assertEquals(expectedName, methodName);
-		Assert.assertEquals(expectedDesc, methodDesc);
-		Assert.assertEquals(expectedCode, code);
-	}
-}
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java
deleted file mode 100644
index 070ad19083..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/java/com/github/eulerlcs/jmr/jvm/loader/EmployeeV1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.github.eulerlcs.jmr.jvm.loader;
-
-public class EmployeeV1 {
-	private String name;
-	private int age;
-
-	public EmployeeV1(String name, int age) {
-		this.name = name;
-		this.age = age;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setAge(int age) {
-		this.age = age;
-	}
-
-	public void sayHello() {
-		System.out.println("Hello , this is class Employee ");
-	}
-
-	public static void main(String[] args) {
-		EmployeeV1 p = new EmployeeV1("Andy", 29);
-		p.sayHello();
-	}
-}
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-64-minijvm/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml
deleted file mode 100644
index 831b8d9ce3..0000000000
--- a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
-		<param name="Target" value="System.out" />
-		<layout class="org.apache.log4j.PatternLayout">
-			<param name="ConversionPattern" value="%m%n" />
-		</layout>
-	</appender>
-
-	<root>
-		<!-- <level value="warm" /> -->
-		<appender-ref ref="stdout" />
-	</root>
-</log4j:configuration>
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/.gitkeep b/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/.gitkeep
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/students/41689722.eulerlcs/5.settingfile/eclipsev45.epf b/students/41689722.eulerlcs/5.settingfile/eclipsev45.epf
deleted file mode 100644
index ca88d61e06..0000000000
--- a/students/41689722.eulerlcs/5.settingfile/eclipsev45.epf
+++ /dev/null
@@ -1,186 +0,0 @@
-#Sat Mar 11 11:44:44 JST 2017
-\!/=
-/configuration/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
-/configuration/org.eclipse.ui.ide/MAX_RECENT_WORKSPACES=10
-/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES=E\:\\10.github.repo\\coding2017.eulerlcs\\group09\\41689722.eulerlcs\\2.code
-/configuration/org.eclipse.ui.ide/RECENT_WORKSPACES_PROTOCOL=3
-/configuration/org.eclipse.ui.ide/SHOW_RECENT_WORKSPACES=false
-/configuration/org.eclipse.ui.ide/SHOW_WORKSPACE_SELECTION_DIALOG=true
-/instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
-/instance/org.eclipse.core.resources/encoding=UTF-8
-/instance/org.eclipse.core.resources/version=1
-/instance/org.eclipse.debug.core/prefWatchExpressions=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<watchExpressions/>\r\n
-/instance/org.eclipse.debug.ui/org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<launchPerspectives/>\r\n
-/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<DebugViewMemento org.eclipse.debug.ui.BREADCRUMB_DROPDOWN_AUTO_EXPAND\="false"/>
-/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.ExpressionView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684">\r\n<PRESENTATION_CONTEXT_PROPERTIES IMemento.internal.id\="org.eclipse.debug.ui.ExpressionView"/>\r\n</VariablesViewMemento>
-/instance/org.eclipse.debug.ui/pref_state_memento.org.eclipse.debug.ui.VariableView=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<VariablesViewMemento org.eclipse.debug.ui.SASH_DETAILS_PART\="315" org.eclipse.debug.ui.SASH_VIEW_PART\="684"/>
-/instance/org.eclipse.debug.ui/preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane|
-/instance/org.eclipse.e4.ui.css.swt.theme/themeid=org.eclipse.e4.ui.css.theme.e4_default6.0,6.1,6.2,6.3,10.0
-/instance/org.eclipse.e4.ui.workbench.renderers.swt/enableMRU=true
-/instance/org.eclipse.e4.ui.workbench.renderers.swt/themeEnabled=true
-/instance/org.eclipse.egit.core/GitRepositoriesView.GitDirectories=E\:\\10.github.repo\\coding2017.eulerlcs\\.git;
-/instance/org.eclipse.egit.core/GitRepositoriesView.GitDirectories.relative=E\:\\10.github.repo\\coding2017.eulerlcs\\.git;
-/instance/org.eclipse.epp.logging.aeri.ide/resetSendMode=KEEP
-/instance/org.eclipse.epp.logging.aeri.ide/resetSendModeOn=0
-/instance/org.eclipse.epp.logging.aeri.ide/sendMode=NOTIFY
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.compliance=1.8
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.source=1.8
-/instance/org.eclipse.jdt.launching/org.eclipse.jdt.launching.PREF_VM_XML=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<vmSettings defaultVM\="57,org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType13,1489199648184">\r\n<vmType id\="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType">\r\n<vm id\="1489199648184" javadocURL\="https\://docs.oracle.com/javase/8/docs/api/" name\="jre1.8.0_121" path\="C\:\\Java\\jre1.8.0_121"/>\r\n</vmType>\r\n</vmSettings>\r\n
-/instance/org.eclipse.jdt.ui/content_assist_number_of_computers=24
-/instance/org.eclipse.jdt.ui/content_assist_proposals_background=255,255,255
-/instance/org.eclipse.jdt.ui/content_assist_proposals_foreground=0,0,0
-/instance/org.eclipse.jdt.ui/editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-/instance/org.eclipse.jdt.ui/fontPropagated=true
-/instance/org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.navigator.layout=2
-/instance/org.eclipse.jdt.ui/org.eclipse.jdt.internal.ui.navigator.librariesnode=true
-/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.editor.tab.width=
-/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles.version=12
-/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.javadoclocations.migrated=true
-/instance/org.eclipse.jdt.ui/org.eclipse.jface.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.jdt.ui/proposalOrderMigrated=true
-/instance/org.eclipse.jdt.ui/sourceHoverBackgroundColor=255,255,225
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_default_serial_version_id=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_generated_serial_version_id=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_annotations=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_deprecated_annotations=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_methods=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_nls_tags=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_override_annotations=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_missing_override_annotations_interface_methods=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.add_serial_version_id=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_blocks=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_parentheses_in_expressions=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_this_for_non_static_field_access=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.always_use_this_for_non_static_method_access=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.convert_functional_interfaces=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.convert_to_enhanced_for_loop=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.correct_indentation=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code_changes_only=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.insert_inferred_type_arguments=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.make_local_variable_final=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.make_parameters_final=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.make_private_fields_final=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.make_type_abstract_if_missing_method=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.make_variable_declarations_final=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.never_use_blocks=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.never_use_parentheses_in_expressions=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.on_save_use_additional_actions=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.organize_imports=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_private_constructors=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_redundant_type_arguments=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces_all=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_casts=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_nls_tags=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_imports=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_local_variables=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_fields=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_members=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_methods=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unused_private_types=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.sort_members=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.sort_members_all=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_anonymous_class_creation=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks_only_for_return_and_throw=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_lambda=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_parentheses_in_expressions=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_field_access=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_method_access=false
-/instance/org.eclipse.jdt.ui/sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-/instance/org.eclipse.jdt.ui/spelling_locale_initialized=true
-/instance/org.eclipse.jdt.ui/tabWidthPropagated=true
-/instance/org.eclipse.jdt.ui/useAnnotationsPrefPage=true
-/instance/org.eclipse.jdt.ui/useQuickDiffPrefPage=true
-/instance/org.eclipse.jst.j2ee.webservice.ui/areThereWebServices=false
-/instance/org.eclipse.m2e.discovery/org.eclipse.m2e.discovery.pref.projects=
-/instance/org.eclipse.mylyn.context.core/mylyn.attention.migrated=true
-/instance/org.eclipse.mylyn.monitor.ui/org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true
-/instance/org.eclipse.mylyn.tasks.ui/migrated.task.repositories.secure.store=true
-/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.filters.nonmatching=true
-/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true
-/instance/org.eclipse.mylyn.tasks.ui/org.eclipse.mylyn.tasks.ui.welcome.message=true
-/instance/org.eclipse.oomph.workingsets/working.set.group=<?xml version\="1.0" encoding\="UTF-8"?>\n<workingsets\:WorkingSetGroup xmi\:version\="2.0" xmlns\:xmi\="http\://www.omg.org/XMI" xmlns\:workingsets\="http\://www.eclipse.org/oomph/workingsets/1.0"/>\n
-/instance/org.eclipse.rse.core/org.eclipse.rse.systemtype.local.systemType.defaultUserId=euler
-/instance/org.eclipse.rse.ui/org.eclipse.rse.preferences.order.connections=euler-PC.Local
-/instance/org.eclipse.team.ui/org.eclipse.team.ui.first_time=false
-/instance/org.eclipse.ui.editors/overviewRuler_migration=migrated_3.1
-/instance/org.eclipse.ui.ide/PROBLEMS_FILTERS_MIGRATE=true
-/instance/org.eclipse.ui.ide/platformState=1488095469945
-/instance/org.eclipse.ui.ide/quickStart=false
-/instance/org.eclipse.ui.ide/tipsAndTricks=true
-/instance/org.eclipse.ui.workbench//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false
-/instance/org.eclipse.ui.workbench//org.eclipse.ui.commands/state/org.eclipse.wst.xml.views.XPathView.processor.xpathprocessor/org.eclipse.ui.commands.radioState=xpath10
-/instance/org.eclipse.ui.workbench/ColorsAndFontsPreferencePage.expandedCategories=Torg.eclipse.ui.workbenchMisc\tTorg.eclipse.jdt.ui.presentation\tTorg.eclipse.wst.sse.ui
-/instance/org.eclipse.ui.workbench/ColorsAndFontsPreferencePage.selectedElement=Forg.eclipse.jface.textfont
-/instance/org.eclipse.ui.workbench/PLUGINS_NOT_ACTIVATED_ON_STARTUP=org.eclipse.m2e.discovery;org.eclipse.rse.ui;
-/instance/org.eclipse.ui.workbench/REMOTE_COMMANDS_VIEW_FONT=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.compare.contentmergeviewer.TextMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.debug.ui.DetailPaneFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.debug.ui.MemoryViewTableFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.debug.ui.consoleFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.egit.ui.CommitMessageEditorFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.egit.ui.CommitMessageFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.egit.ui.DiffHeadlineFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.jdt.internal.ui.compare.JavaMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.jdt.internal.ui.compare.PropertiesFileMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.jdt.ui.PropertiesFileEditor.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.jdt.ui.editors.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.jface.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.mylyn.wikitext.ui.presentation.textFont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.pde.internal.ui.compare.ManifestContentMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.pde.internal.ui.compare.PluginContentMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.ui.commands=<?xml version\="1.0" encoding\="UTF-8"?>\r\n<org.eclipse.ui.commands/>
-/instance/org.eclipse.ui.workbench/org.eclipse.wst.jsdt.internal.ui.compare.JavaMergeViewer=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.wst.jsdt.ui.editors.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/org.eclipse.wst.sse.ui.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui.workbench/terminal.views.view.font.definition=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.ui/showIntro=false
-/instance/org.eclipse.wst.jsdt.ui/fontPropagated=true
-/instance/org.eclipse.wst.jsdt.ui/org.eclipse.jface.textfont=1|Consolas|12.0|0|WINDOWS|1|-16|0|0|0|400|0|0|0|0|3|2|1|49|Consolas;
-/instance/org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.ui.editor.tab.width=
-/instance/org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.ui.formatterprofiles.version=11
-/instance/org.eclipse.wst.jsdt.ui/org.eclipse.wst.jsdt.ui.javadoclocations.migrated=true
-/instance/org.eclipse.wst.jsdt.ui/proposalOrderMigrated=true
-/instance/org.eclipse.wst.jsdt.ui/tabWidthPropagated=true
-/instance/org.eclipse.wst.jsdt.ui/useAnnotationsPrefPage=true
-/instance/org.eclipse.wst.jsdt.ui/useQuickDiffPrefPage=true
-@org.eclipse.core.net=1.3.0.v20160418-1534
-@org.eclipse.core.resources=3.11.1.v20161107-2032
-@org.eclipse.debug.core=3.10.100.v20160419-1720
-@org.eclipse.debug.ui=3.11.202.v20161114-0338
-@org.eclipse.e4.ui.css.swt.theme=0.10.100.v20160523-0836
-@org.eclipse.e4.ui.workbench.renderers.swt=0.14.0.v20160525-0940
-@org.eclipse.egit.core=4.4.1.201607150455-r
-@org.eclipse.epp.logging.aeri.ide=2.0.3.v20161205-0933
-@org.eclipse.jdt.core=3.12.2.v20161117-1814
-@org.eclipse.jdt.launching=3.8.101.v20161111-2014
-@org.eclipse.jdt.ui=3.12.2.v20160929-0804
-@org.eclipse.jst.j2ee.webservice.ui=1.1.500.v201302011850
-@org.eclipse.m2e.discovery=1.7.0.20160603-1933
-@org.eclipse.mylyn.context.core=3.21.0.v20160701-1337
-@org.eclipse.mylyn.monitor.ui=3.21.0.v20160630-1702
-@org.eclipse.mylyn.tasks.ui=3.21.0.v20160913-2131
-@org.eclipse.oomph.workingsets=1.6.0.v20161019-0656
-@org.eclipse.rse.core=3.3.100.201603151753
-@org.eclipse.rse.ui=3.3.300.201610252046
-@org.eclipse.team.ui=3.8.0.v20160518-1906
-@org.eclipse.ui=3.108.1.v20160929-1045
-@org.eclipse.ui.editors=3.10.1.v20161106-1856
-@org.eclipse.ui.ide=3.12.2.v20161115-1450
-@org.eclipse.ui.workbench=3.108.2.v20161025-2029
-@org.eclipse.wst.jsdt.ui=2.0.0.v201608301904
-file_export_version=3.0
diff --git a/students/41689722.eulerlcs/5.settingfile/git cmd help.txt b/students/41689722.eulerlcs/5.settingfile/git cmd help.txt
deleted file mode 100644
index 86015b4865..0000000000
--- a/students/41689722.eulerlcs/5.settingfile/git cmd help.txt	
+++ /dev/null
@@ -1,43 +0,0 @@
-open git server deretory
-mkdir abc.git
-cd abc.git
-
-run git bash
-	git --bare init --shared
-
-git clone
-cd abc
-
-git config --global push. default simple
-git push --set-upstream origin master
-git push
-
-get remot branch list
-	git remote update
-
-
-add deleted files
-	git rm <filename>
-	git rm $(git ls-files --deleted)
-	
-
-delete (remote) branch
-	git branch -d branch.abc
-	git push origin :branch.abc
-	
-	or
-	
-	git push --delete origin branch.abc
-	
-
-romote branch douki
-	git fecth --all --prune
-	
-git log
-	git log --graph --pretty=format:
-	
-// http://blog.toshimaru.net/git-log-graph/
-	[alias]
-  lg = git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
-  lga = git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
- 
\ No newline at end of file
diff --git a/students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat b/students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat
deleted file mode 100644
index ddb704e561..0000000000
--- a/students/41689722.eulerlcs/5.settingfile/tool.161118.git-source-copy.bat
+++ /dev/null
@@ -1,37 +0,0 @@
-@echo off
-setlocal ENABLEDELAYEDEXPANSION
-
-rem .* 
-:main
-	call :ini
-	
-	set path_root=d:\abc
-	set path_desc=pg.%yymmdd%.%hhmmss%
-	
-	call :copy_source ""
-	call :copy_source ""
-
-	call :end
-	@echo on
-	
-goto :eof
-:copy_source
-	if %1=="" goto :eof
-	set file_name=%~1
-	set file_name=!file_name:/=\!
-	@echo f | xcopy /r/y/s %path_root%\!file_name!		%path_desc%\!file_name!
-
-goto :eof
-:end
-	@echo.
-	@echo.
-	pause
-
-goto :eof
-:ini
-	set self_path="%cd%"
-	set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
-	set yymmdd=!yyyymmdd:~2,6!
-	set hhmmss=%time:~0,2%%time:~3,2%%time:~6,2%
-	if "!hhmmss:~0,1!" == " " set hhmmss=0!hhmmss:~1,7!
-goto :eof
diff --git a/students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat b/students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat
deleted file mode 100644
index 5189f9e130..0000000000
--- a/students/41689722.eulerlcs/5.settingfile/tool.170330.java-maven-source-cleaner.bat
+++ /dev/null
@@ -1,37 +0,0 @@
-@echo off
-setlocal ENABLEDELAYEDEXPANSION
-
-:main
-	call :ini
-	cd /d E:\12.repolist\41689722.eulerlcs\2.code
-	call :del_resource
-	call :end
-	@echo on
-	
-goto :eof
-:del_resource
-	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".settings"`) do rmdir /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".metadata"`) do rmdir /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h "target"`) do rmdir /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h "RemoteSystemsTempFiles"`) do rmdir /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".recommenders"`) do rmdir /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/ad-h ".apt_generated"`) do rmdir /s/q %%a
-
-	for /f "usebackq delims==" %%a in (`dir /b/s/a-d-h ".classpath"`) do del /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/a-d-h ".project"`) do del /s/q %%a
-	for /f "usebackq delims==" %%a in (`dir /b/s/a-d-h ".factorypath"`) do del /s/q %%a
-
-goto :eof
-:end
-	@echo.
-	@echo.
-	pause
-
-goto :eof
-:ini
-	set self_path="%cd%"
-	set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
-	set yymmdd=!yyyymmdd:~2,6!
-	set hhmmss=%time:~0,2%%time:~3,2%%time:~6,2%
-	if "!hhmmss:~0,1!" == " " set hhmmss=0!hhmmss:~1,7!
-goto :eof
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/pom.xml b/students/41689722.eulerlcs/regularexpression/pom.xml
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-71-regularexpression/pom.xml
rename to students/41689722.eulerlcs/regularexpression/pom.xml
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java b/students/41689722.eulerlcs/regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
rename to students/41689722.eulerlcs/regularexpression/src/main/java/com/github/eulerlcs/regularexpression/Utils.java
diff --git a/students/41689722.eulerlcs/1.article/.gitkeep b/students/41689722.eulerlcs/regularexpression/src/main/resources/.gitkeep
similarity index 100%
rename from students/41689722.eulerlcs/1.article/.gitkeep
rename to students/41689722.eulerlcs/regularexpression/src/main/resources/.gitkeep
diff --git a/students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml b/students/41689722.eulerlcs/regularexpression/src/main/resources/log4j.xml
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml
rename to students/41689722.eulerlcs/regularexpression/src/main/resources/log4j.xml
diff --git a/students/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep b/students/41689722.eulerlcs/regularexpression/src/test/java/.gitkeep
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep
rename to students/41689722.eulerlcs/regularexpression/src/test/java/.gitkeep
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java b/students/41689722.eulerlcs/regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
rename to students/41689722.eulerlcs/regularexpression/src/test/java/com/github/eulerlcs/regularexpression/UtilsTest.java
diff --git a/students/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep b/students/41689722.eulerlcs/regularexpression/src/test/resources/.gitkeep
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep
rename to students/41689722.eulerlcs/regularexpression/src/test/resources/.gitkeep
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01.txt b/students/41689722.eulerlcs/regularexpression/src/test/resources/01.txt
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/01.txt
rename to students/41689722.eulerlcs/regularexpression/src/test/resources/01.txt
diff --git a/students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/07.txt b/students/41689722.eulerlcs/regularexpression/src/test/resources/07.txt
similarity index 100%
rename from students/41689722.eulerlcs/2.code/jmr-71-regularexpression/src/test/resources/07.txt
rename to students/41689722.eulerlcs/regularexpression/src/test/resources/07.txt
