diff --git a/.gitignore b/.gitignore index f1e9957cfa..fa9bcb8820 100644 --- a/.gitignore +++ b/.gitignore @@ -280,6 +280,23 @@ 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/* + + diff --git a/coding2017 b/coding2017 deleted file mode 160000 index bdbfcff8c9..0000000000 --- a/coding2017 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bdbfcff8c9b106c07b6cbd6702fe97accc1dc90b 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 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()); } } 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 + + } + +} 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/com/coderising/ood/srp/Configuration.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..70759b547a --- /dev/null +++ b/students/1049843090/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 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/com/coderising/ood/srp/ConfigurationKeys.java b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..c57f37c4ce --- /dev/null +++ b/students/1049843090/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"; + +} \ No newline at end of file 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 new file mode 100644 index 0000000000..27b3f180a7 --- /dev/null +++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/DBUtil.java @@ -0,0 +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; + } + + + public static List querySubscriber(String productId) { + + List 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 new file mode 100644 index 0000000000..9948734ff5 --- /dev/null +++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,45 @@ +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(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 getPromotionProducts() { + List 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 new file mode 100644 index 0000000000..d8accbd797 --- /dev/null +++ b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,58 @@ +package com.coderising.ood.srp; + +import java.util.List; + +public class PromotionMail { + + + public static void main(String[] args) throws Exception { + new PromotionMail().sendEMails(); + + } + + + private void setMessage(ProductInfo productInfo, UserInfo userInfo, MailData mailData) { + + + mailData.setSubject("您关注的产品降价了"); + String message = "尊敬的 " + userInfo.getName() + ", 您关注的产品 " + productInfo.getDescription() + " 降价了,欢迎购买!"; + mailData.setMessage(message); + + } + + + private void sendEMails() throws Exception { + ProductInfoService productInfoService = new ProductInfoService(); + UserInfoService userInfoService = new UserInfoService(); + List productInfos = productInfoService.getPromotionProducts(); + + System.out.println("开始发送邮件"); + MailData mailData = getMailData(); + productInfos.forEach(e -> { + List 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() + "邮件格式不正确"); + } + + }); + }); + + + } + + + 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; + } + +} \ 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 getuserInfoByProduceId(String productId) { + return DBUtil.querySubscriber(productId); + } +} diff --git a/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1049843090/ood/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/1049843090/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/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 queryUserList(String sql){ + + List 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 products, List 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 getProducts() throws IOException{ + return readFile(new File(Configuration.PRODUCTS_FILE_PATH)); + } + + private static List readFile(File file) throws IOException { + List products = new ArrayList(); + 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 products = new ArrayList(); + List users = new ArrayList(); + 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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/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 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/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 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 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; + } + + + +} 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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); + } + +} 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 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(); + 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 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 @@ +测试 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 @@ + + 4.0.0 + coderising + + com.coding + parent + 1.0-SNAPSHOT + ../parent/pom.xml + + + + 2.1 + + + + + + commons-digester + commons-digester + ${commons-digester.version} + + + + + \ 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 clzPaths; + + private Map 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 getClzContext() { + if (clzContext == null) { + clzContext = createClzContextWithClzPaths(clzPaths); + } + return clzContext; + } + + private Map createClzContextWithClzPaths(List clzPaths) { + Map clzContext = new ConcurrentHashMap<>(60); + for (String e : clzPaths) { + File file = new File(e); + if (file.isDirectory()) { + List files = FileUtils2.listAllFiles(file); + clzContext = addClassElements(clzContext, e, files); + } + } + return clzContext; + } + + private Map addClassElements(Map clzContext, String classpath, List 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 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中的 配置,以及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中的 配置,以及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 parameters) { + Object action = createInstance(findActionClass(actionConfig.getClassName())); + for (Map.Entry 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 params = new HashMap(); + 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 params = new HashMap(); + 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 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 getResults() { + return results; + } + + public void setResults(Map 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 actions = new HashMap<>(10); + + public Map getActions() { + return actions; + } + + public void setActions(Map 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/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 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/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..3aef295085 --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/Product.java @@ -0,0 +1,27 @@ +package com.coderising.ood.srp.optimize; + +/** + * 产品对象 + * Created by luoziyihao on 6/12/17. + */ + +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/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..080c999ffa --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/ProductParser.java @@ -0,0 +1,37 @@ +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 { + + public List parse(String productClassPath) { + List 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 new file mode 100644 index 0000000000..6ee832307a --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailApp.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp.optimize; + +import java.util.List; + +/** + * main 函数启动类 + * Created by luoziyihao on 6/12/17. + */ +public class PromotionMailApp { + + public static void main(String args[]) { + List products = new ProductParser().parse("product_promotion.txt"); + + List users = new UserService().loadMailingList(); + + List 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 new file mode 100644 index 0000000000..189b3ced17 --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailClaim.java @@ -0,0 +1,99 @@ +package com.coderising.ood.srp.optimize; + +import java.util.ArrayList; +import java.util.List; + +/** + * 发发送邮件的必要参数 vo + * Created by luoziyihao on 6/12/17. + */ +public class PromotionMailClaim { + private String toAddress; + private String fromAddress; + private String subject; + private String message; + private String smtpHost; + 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 load(List products, List users, SmptPropeties smptPropeties + , boolean mailDebug) { + List promotionMailClaims = new ArrayList<>(); + for (Product product : products) { + for (User user : users) { + PromotionMailClaim promotionMailClaim = new PromotionMailClaim() + .init(product, user, smptPropeties, mailDebug); + 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 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 new file mode 100644 index 0000000000..ad37998e45 --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/PromotionMailableBehavior.java @@ -0,0 +1,41 @@ +package com.coderising.ood.srp.optimize; + +import java.util.List; + +/** + * 发邮件的行为类 + * Created by luoziyihao on 6/12/17. + */ +public class PromotionMailableBehavior { + + public void send(List emailSendClaimList) { + for (PromotionMailClaim promotionMailClaim : emailSendClaimList) { + sendEmailForOneClaim(promotionMailClaim); + } + } + + private void sendEmailForOneClaim(PromotionMailClaim promotionMailClaim) { + System.out.println("开始发送邮件"); + + try { + doSendMail(promotionMailClaim); + } catch (Exception e) { + try { + promotionMailClaim.setSmtpHost(promotionMailClaim.getAltSmtpHost()); + 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 new file mode 100644 index 0000000000..c6664fafc3 --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/SmptPropeties.java @@ -0,0 +1,35 @@ +package com.coderising.ood.srp.optimize; + +/** + * 邮件服务器配置类 + * Created by luoziyihao on 6/12/17. + */ +public class SmptPropeties { + 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 new file mode 100644 index 0000000000..996efadbb6 --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/User.java @@ -0,0 +1,26 @@ +package com.coderising.ood.srp.optimize; + +/** + * 用户类 + * Created by luoziyihao on 6/12/17. + */ +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 new file mode 100644 index 0000000000..f5da2d3908 --- /dev/null +++ b/students/1204187480/code/homework/coderising/src/main/java/com/coderising/ood/srp/optimize/UserService.java @@ -0,0 +1,22 @@ +package com.coderising.ood.srp.optimize; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用户service, 管理用户的数据 + * Created by luoziyihao on 6/12/17. + */ +public class UserService { + + List loadMailingList() { + 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/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 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 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ 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("", 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 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 methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(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("", "(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 @@ + + 4.0.0 + coding + + com.coding + parent + 1.0-SNAPSHOT + ../parent/pom.xml + + + \ 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 @@ + + 4.0.0 + common + jar + + com.coding + parent-dependencies + 1.0-SNAPSHOT + ../parent-dependencies/pom.xml + + + \ 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 get(String paraName, Object object, Class 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 describe(Object model) { + Method[] methods = model.getClass().getDeclaredMethods(); //获取实体类的所有属性,返回Field数组 + Map 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 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 listAllFiles(List 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) { + // 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); + } + } + + 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 new file mode 100644 index 0000000000..889c6cefb6 --- /dev/null +++ b/students/1204187480/code/homework/common/src/main/java/com/coding/common/util/IOUtils2.java @@ -0,0 +1,35 @@ +package com.coding.common.util; + +import java.io.*; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 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); + + } + } + } + + + public static List 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/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 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/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.*; + +/** + *

+ *

+ * + * @author raoxiang + * @version 6/13/17 + * @since 1.8 + */ +public class IOUtils2Test { + @Test + public void readToStringListTest() throws Exception { + List 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 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 @@ + + 4.0.0 + + com.coding + parent-dependencies + pom + 1.0-SNAPSHOT + https://github.com/luoziyihao/coding2017 + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot + + true + + + + + + + UTF-8 + UTF-8 + 1.8 + UTF-8 + 1.8 + 1.8 + 3.0 + 1.1.7 + 1.1.7 + 1.2 + 1.2.17 + 4.12 + 3.4 + 4.1 + 2.5 + 1.9.2 + 19.0 + 1.1.6 + 1.16.10 + 1.2.22 + 0.2.0 + 2.9.4 + + + + + + + ch.qos.logback + logback-classic + ${logback-classic.version} + + + + commons-logging + commons-logging + ${commons-logging.version} + + + log4j + log4j + ${log4j.version} + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + + + joda-time + joda-time + ${joda-time.version} + + + io.reactivex + rxjava + ${rxjava.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + com.shekhargulati + strman + ${strman.version} + + + + + + junit + junit + ${junit.version} + + + + + ${project.artifactId} + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + \ 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 @@ + + + 4.0.0 + parent + pom + manage the dependencies for modules + + com.coding + parent-dependencies + 1.0-SNAPSHOT + ../parent-dependencies/pom.xml + + + + + com.coding + common + 1.0-SNAPSHOT + + + + \ 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 @@ + + + 4.0.0 + com.coding + coding2017 + 1.0-SNAPSHOT + pom + + parent-dependencies + common + parent + coding + coderising + + + + 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章 + 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 @@ + + 4.0.0 + + com.coderising + ood-assignment-enan + 0.0.1-SNAPSHOT + jar + + ood-assignment-enan + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + org.projectlombok + lombok + 1.16.16 + true + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + ${project.build.sourceEncoding} + + + + + 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 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 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 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 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 products; + try { + products = readProductConfig.read(file); + } catch (IOException e) { + throw new RuntimeException("读取降价商品失败,终止发送降价邮件提醒"); + } + for (Product product : products) { + List users = (List) 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 read(File file) throws IOException { + List 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 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 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 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/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 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/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 new file mode 100644 index 0000000000..aa40bc6251 --- /dev/null +++ b/students/1299310140/src/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,96 @@ +package com.coderising.ood.srp; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +public class PromotionMail { + + 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 NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + + public static void main(String[] args) throws Exception { + + //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); + + String sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + product.getId() +"' " + + "and send_mail=1 "; + List list = DBUtil.query(sendMailQuery); + + if(list == null){ + System.out.println("没有邮件发送"); + return; + } + + Configuration config = new Configuration(); + PromotionMail pe = new PromotionMail(config); + boolean emailDebug = false; + + 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); + } + } + + } + + + public PromotionMail(Configuration config){ + + smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER); + + altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); + + fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN); + + } + + protected void setMessageAndToAddress(HashMap userInfo,Product product) + { + toAddress = (String) userInfo.get(EMAIL_KEY); + + String name = (String) userInfo.get(NAME_KEY); + + subject = "您关注的产品降价了"; + message = "尊敬的 "+name+", 您关注的产品 " + product.getDesc() + " 降价了,欢迎购买!" ; + + } + + protected void sendEMails(boolean debug) throws IOException + { + + 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()); + } + } + } +} 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(); + } + } +} 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 query(String sql) { + List 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 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 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 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的文件夹 +测试 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 @@ + + 4.0.0 + + com.coderising + ds-answer + 0.0.1-SNAPSHOT + jar + + ds-answer + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + 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 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中的 配置,以及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 params = new HashMap(); + 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 params = new HashMap(); + 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 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ 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 { + + //用数组来保存循环队列的元素 + 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 queue = new CircleQueue(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 execute(int n, int m){ + + Queue queue = new Queue(); + for (int i = 0; i < n; i++){ + queue.enQueue(i); + } + + List result = new ArrayList(); + 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 { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node 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 oldlast = last; + last = new Node(); + 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 { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + 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 normalStack = new Stack(); + private Stack minNumStack = new Stack(); + + 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 s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + + + public static void reverse_247565311(Stack s){ + if(s == null || s.isEmpty()) { + return; + } + + int size = s.size(); + Stack tmpStack = new Stack(); + + for(int i=0;ii){ + 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 s) { + if(s == null || s.isEmpty()){ + return; + } + + Stack tmp = new Stack(); + while(!s.isEmpty()){ + tmp.push(s.pop()); + } + while(!tmp.isEmpty()){ + Integer top = tmp.pop(); + addToBottom(s,top); + } + + + } + public static void addToBottom(Stack 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() stack = new Stack(); + for(int i=0;i 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 testReverse_247565311() { + Stack 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 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 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 queue1 = new ArrayDeque<>(); + Queue 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 tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack 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 convert(String expr) { + List inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + 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 tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List 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 tokens = parser.parse(this.expr); + + + Stack 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 tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack 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 OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map 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 parse(String expr) { + List 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 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 { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode 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 remove(T x, BinaryTreeNode 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 findMin(BinaryTreeNode p){ + if (p==null){ + return null; + } else if (p.left == null){ + return p; + } else{ + return findMin(p.left); + } + } + private BinaryTreeNode findMax(BinaryTreeNode p){ + if (p==null){ + return null; + }else if (p.right==null){ + return p; + } else{ + return findMax(p.right); + } + } + private int height(BinaryTreeNode 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){ + if (t == null){ + return 0; + } + return size(t.left) + 1 + size(t.right); + + } + + public List levelVisit(){ + List result = new ArrayList(); + if(root == null){ + return result; + } + Queue> queue = new Queue>(); + BinaryTreeNode 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 getNodesBetween(T n1, T n2){ + List elements = new ArrayList<>(); + getNodesBetween(elements,root,n1,n2); + return elements; + } + + public void getNodesBetween(List elements ,BinaryTreeNode 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 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){ + 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 tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + root.left.right.right = new BinaryTreeNode(5); + tree = new BinarySearchTree(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 root= tree.getRoot(); + Assert.assertEquals(4, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode1() { + tree.remove(4); + BinaryTreeNode 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 root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } + + @Test + public void testLevelVisit() { + List 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 root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(4); + root.left.right = new BinaryTreeNode(1); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + + Assert.assertFalse(tree.isValid()); + } + @Test + public void testGetNodesBetween(){ + List 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 { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T 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/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 List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + preOrderVisit(root, result); + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + inOrderVisit(root, result); + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + postOrderVisit(root, result); + return result; + } + + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + Stack> stack = new Stack>(); + + BinaryTreeNode 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 List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + BinaryTreeNode node = root; + Stack> stack = new Stack>(); + + while (node != null || !stack.isEmpty()) { + + while (node != null) { + stack.push(node); + node = node.left; + } + BinaryTreeNode currentNode = stack.pop(); + result.add(currentNode.data); + node = currentNode.right; + } + return result; + } + + private static void preOrderVisit(BinaryTreeNode node, List result) { + if (node == null) { + return; + } + result.add(node.getData()); + preOrderVisit(node.getLeft(), result); + preOrderVisit(node.getRight(), result); + } + + private static void inOrderVisit(BinaryTreeNode node, List result) { + if (node == null) { + return; + } + inOrderVisit(node.getLeft(), result); + result.add(node.getData()); + inOrderVisit(node.getRight(), result); + } + + private static void postOrderVisit(BinaryTreeNode node, List 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 root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List 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 @@ + + 4.0.0 + + com.coderising + ds-assignment + 0.0.1-SNAPSHOT + jar + + ds-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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中的 配置,以及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 params = new HashMap(); + 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 params = new HashMap(); + 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 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ 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 prerequisites; + + public List 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 students = new ArrayList(); + + public int getMaxStudents() { + return maxStudents; + } + + public List 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 coursesAlreadyTaken = new ArrayList(); + + public List 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 prerequisites; + + public List 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 students = new ArrayList(); + + public List 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 coursesAlreadyTaken = new ArrayList(); + + public List 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 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 + */ +public class CircleQueue { + + 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 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 { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node 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 oldlast = last; + last = new Node(); + 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 + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + 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 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 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() { + 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})")); + } + +} 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 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 OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map 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 parse(String expr) { + List 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 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 { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode 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 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 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 tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + root.left.right.right = new BinaryTreeNode(5); + tree = new BinarySearchTree(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 root= tree.getRoot(); + Assert.assertEquals(4, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode1() { + tree.remove(4); + BinaryTreeNode 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 root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } + + @Test + public void testLevelVisit() { + List 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 root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(4); + root.left.right = new BinaryTreeNode(1); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + + Assert.assertFalse(tree.isValid()); + } + @Test + public void testGetNodesBetween(){ + List 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 { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T 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/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 List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + 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 root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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/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 emailList = getEmails("product_promotion.txt"); + for (Email email : emailList) { + sendEmail(email); + } + + } + + public static List getEmails(String file) throws IOException { + List emailList = new ArrayList(); + List list = Product.getProductByFile(file); + + for (Product p : list) { + String productId = p.getProductID(); + List> l = emailDAO.listSubscriptionsByProdoctId(productId); + for (Map userInfo : l) { + String username = userInfo.get("NAME"); + String productDesc = p.getProductDesc(); + String fromAddr = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); + List toAddr = new ArrayList(); + 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 toAddresses; + private String subject; + private String content; + private String smtpServer; + private String email_admin; + + public Email(String fromAddress, List 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 getToAddresses() { + return toAddresses; + } + + public void setToAddresses(List 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 getProductByFile(String f) throws IOException { + List list = new ArrayList(); + 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> listSubscriptionsByProdoctId(String productId) { + String sql = "Select name from subscriptions " + + "where product_id= '" + productId + "' " + + "and send_mail=1 "; + List> userList = new ArrayList>(); + for (int i = 1; i <= 3; i++) { + Map userInfo = new HashMap(); + 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()); + } +} diff --git a/students/1395844061/.gitignore b/students/1395844061/.gitignore new file mode 100644 index 0000000000..d41523dfd3 --- /dev/null +++ b/students/1395844061/.gitignore @@ -0,0 +1,26 @@ +# 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 diff --git a/students/1395844061/README.md b/students/1395844061/README.md new file mode 100644 index 0000000000..32243de0c9 --- /dev/null +++ b/students/1395844061/README.md @@ -0,0 +1,2 @@ +### 1395844061 ood +1. ood代码优化 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/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 new file mode 100644 index 0000000000..0be9b165c9 --- /dev/null +++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,99 @@ +package com.coderising.ood.srp; + +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.*; + +/** + * PromotionMail + * + * @author Chenpz + * @package com.coderising.ood.srp + * @date 2017/6/12/23:33 + */ +public class PromotionMail { + + private ProductInfo productInfo; + private List mailInfoList = new ArrayList<>(); + + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + public PromotionMail(){} + + public PromotionMail(ProductInfo productInfo) throws Exception { + this.productInfo = productInfo; + initMailInfoList(loadMailingList()); + } + + /** + * 获取每个型号的手机关注的人员信息列表 + * @return + * @throws Exception + */ + private List> loadMailingList() throws Exception { + String sql = "select name from subscriptions " + + "where product_id= '" + productInfo.getProductID() +"' " + + "and send_mail=1 "; + return DBUtil.query(sql); + } + + /** + * 组装促销邮件的内容信息 + * @param mailingList + */ + private void initMailInfoList(List> mailingList) { + if (ArgsUtil.isNotEmpty(mailingList)){ + for (Map map : mailingList){ + // 初始化 mailInfoList + mailInfoList.add(buildMailInfo(map)); + } + } + } + + /** + * 组装邮件内容信息 + * @param userInfo + * @return + */ + private MailInfo buildMailInfo(Map 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 + * @throws IOException + */ + public void sendEMails(boolean debug) throws IOException { + System.out.println("开始发送邮件... ..."); + if (ArgsUtil.isNotEmpty(mailInfoList)) { + for (MailInfo mailInfo : mailInfoList){ + MailUtil.sendEmail(mailInfo.toAddress, mailInfo.subject, mailInfo.message, debug); + } + }else { + System.out.println("没有邮件发送... ..."); + } + } + + class MailInfo{ + + 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/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 new file mode 100644 index 0000000000..931e93ab3b --- /dev/null +++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/Configuration.java @@ -0,0 +1,31 @@ +package com.coderising.ood.srp.config; + +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 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/config/ConfigurationKeys.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java new file mode 100644 index 0000000000..702c8cce32 --- /dev/null +++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java @@ -0,0 +1,16 @@ +package com.coderising.ood.srp.config; + +/** + * 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/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/DBUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java new file mode 100644 index 0000000000..2b4e0410ac --- /dev/null +++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/DBUtil.java @@ -0,0 +1,37 @@ +package com.coderising.ood.srp.utils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * DBUtil + * + * @author Chenpz + * @package com.coderising.ood.srp + * @date 2017/6/12/23:32 + */ +public final class DBUtil { + + private DBUtil(){ + throw new RuntimeException("illegal called!"); + } + + /** + * 应该从数据库读, 但是简化为直接生成。 + * @param sql + * @return + */ + public static List> query(String sql){ + System.out.println("sql: "+sql); + List> userList = new ArrayList<>(); + for (int i = 1; i <= 3; i++) { + Map 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/utils/FileUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java new file mode 100644 index 0000000000..43af9df5e4 --- /dev/null +++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/FileUtil.java @@ -0,0 +1,46 @@ +package com.coderising.ood.srp.utils; + +import com.coderising.ood.srp.ProductInfo; + +import java.io.*; +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 FileUtil { + + private FileUtil(){ + throw new RuntimeException("illegal called!"); + } + + public static List readProductInfoFromFile(String filePath) throws IOException{ + + if (!ArgsUtil.isNotNull(filePath)) + throw new IllegalArgumentException("illegal arguments"); + + File file = new File(filePath); + BufferedReader br = null; + List 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/utils/MailUtil.java b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java new file mode 100644 index 0000000000..cff76d7bf0 --- /dev/null +++ b/students/1395844061/course-pro-1/src/main/java/com/coderising/ood/srp/utils/MailUtil.java @@ -0,0 +1,67 @@ +package com.coderising.ood.srp.utils; + +import com.coderising.ood.srp.config.Configuration; +import com.coderising.ood.srp.config.ConfigurationKeys; + +/** + * MailUtil + * + * @author Chenpz + * @package com.coderising.ood.srp + * @date 2017/6/12/23:28 + */ +public final class MailUtil { + + private static String smtpHost = null; + private static String altSmtpHost = null; + private static String fromAddress = 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); + } + + private MailUtil(){ + throw new RuntimeException("illegal called!"); + } + + 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"); + buffer.append("Subject:").append(subject).append("\n"); + 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/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..2bf0df1070 --- /dev/null +++ b/students/1395844061/course-pro-1/src/test/java/com/coderising/ood/srp/MainTest.java @@ -0,0 +1,27 @@ +package com.coderising.ood.srp; + +import com.coderising.ood.srp.utils.ArgsUtil; +import com.coderising.ood.srp.utils.FileUtil; + +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 productInfoList = FileUtil.readProductInfoFromFile(filePath); + if (ArgsUtil.isNotEmpty(productInfoList)){ + for (ProductInfo productInfo: productInfoList){ + new PromotionMail(productInfo) + .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 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' + diff --git a/students/1398524980/README.md b/students/1398524980/README.md new file mode 100644 index 0000000000..a652ad5ecf --- /dev/null +++ b/students/1398524980/README.md @@ -0,0 +1 @@ +作业 \ 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/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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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> 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/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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 query(final String sql){ + final List 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 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 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 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 diff --git a/students/1418243288/readme.md b/students/1418243288/readme.md new file mode 100644 index 0000000000..fcb796bdef --- /dev/null +++ b/students/1418243288/readme.md @@ -0,0 +1,5 @@ +测试下新上传的值 +#test + +#试试对不对# +public void main diff --git a/students/1452302762/ood/ood-assignment/pom.xml b/students/1452302762/ood/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/1452302762/ood/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..20657ee745 --- /dev/null +++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,22 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public static String getProperty(String key) { + return configurations.get(key); + } + +} diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/1452302762/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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Constant.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Constant.java new file mode 100644 index 0000000000..02807c7a3d --- /dev/null +++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Constant.java @@ -0,0 +1,7 @@ +package com.coderising.ood.srp; + +public class Constant { + + public static final String NAME_KEY = "NAME"; + public static final String EMAIL_KEY = "EMAIL"; +} diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/1452302762/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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java new file mode 100644 index 0000000000..3d386ee7f4 --- /dev/null +++ b/students/1452302762/ood/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; + +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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..22389dcb59 --- /dev/null +++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,66 @@ +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 = Configuration.getProperty(ConfigurationKeys.SMTP_SERVER);; + private static String altSmtpHost = Configuration.getProperty(ConfigurationKeys.ALT_SMTP_SERVER); ; + private static String fromAddress = Configuration.getProperty(ConfigurationKeys.EMAIL_ADMIN); ; + private static String toAddress = null; + private static String subject = null; + private static String message = null; + protected void setMessage(String name,String productDesc) throws IOException{ + if(toAddress.length()>0){ + subject = "您关注的产品降价了"; + message = "尊敬的 "+name+", 您关注的产品 " + productDesc + " 降价了,欢迎购买!" ; + } + } + private static 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); + } + protected static void configureEMail(HashMap userInfo) throws IOException{ + toAddress =userInfo.get(Constant.EMAIL_KEY); + } + public static void sendEMails(boolean debug,String productID) throws Exception{ + System.out.println("开始发送邮件"); + List mailingList=loadMailingList(productID); + 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 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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java new file mode 100644 index 0000000000..2ba503eae4 --- /dev/null +++ b/students/1452302762/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 productID ; + private String productDesc; + + public Product(String productID, String productDesc) { + this.productID = productID; + this.productDesc = productDesc; + } + public Product(String[] data) { + this.productID =data[0]; + this.productDesc = data[1]; + System.out.println("产品ID = " + productID + "\n"); + System.out.println("产品描述 = " + productDesc + "\n"); + } + 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/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..f70095e45c --- /dev/null +++ b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,13 @@ +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"); + boolean emailDebug = false; + Product product=new Product(FileUtil.readFile(f)); + MailUtil.sendEMails(emailDebug,product.getProductID()); + } +} diff --git a/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/1452302762/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..0c0124cc61 --- /dev/null +++ b/students/1452302762/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/1753179526/readme.md b/students/1753179526/readme.md new file mode 100644 index 0000000000..0eb59149a8 --- /dev/null +++ b/students/1753179526/readme.md @@ -0,0 +1,5 @@ +Test git commit. push-wary + +第二次提交内容,更改编码问题。 + +增加new line 测试命令行 \ No newline at end of file diff --git a/students/183549495 b/students/183549495 new file mode 100644 index 0000000000..f29dee6099 --- /dev/null +++ b/students/183549495 @@ -0,0 +1 @@ +测试 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 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; + +/** + *

Title: MailBean

+ *

Description: 邮件信息

+ *

Company: smartisan

+ * @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; + +/** + *

Title: ProductBean

+ *

Description: 产品信息

+ *

Company: smartisan

+ * @author Administrator + * @date 2017年6月18日 + */ +public class ProductBean { + + /** + * 产品编号 + */ + private String productID; + + /** + * 产品描述 + */ + private String productDesc; + + private List 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 getUsers() { + return users; + } + + public void setUsers(List 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; + +/** + *

Title: UserBean

+ *

Description: 用户信息

+ *

Company: smartisan

+ * @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 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 getPros() { + return pros; + } + + public void setPros(List 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; + +/** + *

Title: Configuration

+ *

Description: 获取配置信息

+ *

Company: smartisan

+ * @author Administrator + * @date 2017年6月18日 + */ +public class Configuration { + //封装成私有变量 + private static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/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; + +/** + *

Title: ConfigurationKeys

+ *

Description: 邮件服务器配置参数

+ *

Company: smartisan

+ * @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; + +/** + *

Title: DBUtil

+ *

Description: 数据库操作

+ *

Company: smartisan

+ * @author Administrator + * @date 2017年6月18日 + */ +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * 用户和关注的产品,应该是多对多的关系,应该有张多对多的表[用户id + 产品id] + * 先根据产品id查询出用户id,再根据用户id查询出用户信息。此处省略这部分的处理 + * @param sql + * @return + */ + public static List query(Set 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 iter = proIds.iterator(); + while(iter.hasNext()){ + sendMailQuery.append("'" + iter.next() + "',"); + } + sendMailQuery.delete(sendMailQuery.length()-1, sendMailQuery.length()).append(")"); + + List proList = new ArrayList(); + ProductBean proBean = null; + List userList = new ArrayList(); + 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; + +/** + *

Title: MailUtil

+ *

Description: 邮件工具类

+ *

Company: smartisan

+ * @author Administrator + * @date 2017年6月18日 + */ +public class MailUtil { + + /** + * 获取邮件正文信息 + * @param user 用户信息 + * @return 邮件正文 + */ + private static String getMassege(UserBean user){ + List 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 getMailInf(List users){ + List retList = new ArrayList(); + 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 users) { + List 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..9af969c773 --- /dev/null +++ b/students/254647832/src/com/coderising/ood/srp/PromotionMail.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; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.coderising.ood.bean.UserBean; + +/** + *

Title: PromotionMail

+ *

Description: 邮件发送处理

+ *

Company: smartisan

+ * @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 proIds = readFile(f); + + //2、根据降价产品的ID获取关注该产品的用户信息 + List users = DBUtil.query(proIds); + + //3、向这些用户发送邮件 + MailUtil.sendEmail(users); + } + + /** + * 读取文件,获取降价产品信息 + * @param file + * @return 产品信息的ID + * @throws IOException + */ + private static Set readFile(File file) throws IOException{ + Set proIds = new HashSet(); + BufferedReader br = null; + boolean flag = true; + try { + br = new BufferedReader(new FileReader(file)); + 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()); + } 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/275677638/1.txt b/students/275677638/1.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/students/275677638/README.md b/students/275677638/README.md new file mode 100644 index 0000000000..aa7a31b814 --- /dev/null +++ b/students/275677638/README.md @@ -0,0 +1,3 @@ +愿意自荐代码的,可以每个人一个目录 以自己的QQ号命名 ,把自荐的代码放到里边去 + +diff diff --git a/students/276137509/276137509Learning/readme.md b/students/276137509/276137509Learning/readme.md new file mode 100644 index 0000000000..7c847014a2 --- /dev/null +++ b/students/276137509/276137509Learning/readme.md @@ -0,0 +1 @@ +### 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 diff --git a/students/279069328/readme.md b/students/279069328/readme.md new file mode 100644 index 0000000000..e84336bfe0 --- /dev/null +++ b/students/279069328/readme.md @@ -0,0 +1,3 @@ +# Coding 2017 + +KevinSmile@coderising \ No newline at end of file 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 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 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 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 getSubscribers() { + List 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 getProducts() { + BufferedReader br = null; + List 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 getProducts() { + return getProductsFunction.getProducts(); + } + + public void sendMail(List 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 products) { + if (null == products || products.size() == 0) { + System.out.println("没有发现到货的产品"); + return; + } + Iterator iterator = products.iterator(); + while (iterator.hasNext()) { + Product product = iterator.next(); + List 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 products) { + if (null == products || products.size() == 0) { + System.out.println("没有发现需要促销的产品"); + return; + } + Iterator iterator = products.iterator(); + while (iterator.hasNext()) { + Product product = iterator.next(); + List 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,需求一直在变化,比如通过数据库获取促销产品或者促销活动改为到货通知,抢购等;为了应变各种变化,需重构代码。 ### +## 需求分析 ## +需求可变因素:
+ +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/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 + " 降价了,欢迎购买!" ; } } 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 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 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 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 @@ + + + 4.0.0 + + com.coding2017 + practice13-ood-srp + 1.0-SNAPSHOT + + + 1.6 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${java.encoding} + + + + + \ 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 configurations = new HashMap(); + + 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 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 products = PromotionProduct.readFromFile("com/coderising/ood/srp/product_promotion.txt"); + + for (PromotionProduct product : products) { + List 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 readFromFile(String filepath) throws IOException { + List products = new ArrayList(); + 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 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(); + } +} 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 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 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,第一次提交 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 mailList = 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("/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 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 @@ + + + 4.0.0 + + com.coderising + ood-assignment-txh + 1.0-SNAPSHOT + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + \ 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 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..2c5d9dd968 --- /dev/null +++ b/students/329866097/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.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++) { + 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 readFile(String filePath) throws IOException { + File file = new File(filePath); + BufferedReader br = null; + Map 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/PromotionMail.java b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..1273603cb8 --- /dev/null +++ b/students/329866097/src/main/java/com/coderising/ood/srp/PromotionMail.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.*; +import java.util.stream.Collectors; + +public class PromotionMail { + + public static void main(String[] args) throws Exception { + Email email = new Email(); + + Map productMap = FileUtil.readFile( "src/main/resources/product_promotion.txt"); + for (Map.Entry entry : productMap.entrySet()) { + String productId = entry.getKey(); + String productDesc = entry.getValue(); + List userList = DBUtil.query(setLoadQuery(productId)); + for(User user : userList) { + try { + email.send(user, productDesc, email.getSmtpHost()); + } catch (Exception e) { + try { + email.send(user, productDesc, email.getAltSmtpHost()); + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + } + } + + 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; + } +} 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 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 @@ + + 4.0.0 + com.coderising + 335402763Learning + 0.0.1-SNAPSHOT + \ No newline at end of file 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..4e777b5cd0 --- /dev/null +++ b/students/335402763/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,21 @@ +package com.coderising.ood.srp; + +import java.io.File; + +import com.coderising.ood.srp.service.PromotionMailService; +import com.coderising.ood.srp.service.impl.PromotionMailServiceImpl; + + +public class PromotionMail { + + + public static void main(String[] args) throws Exception { + + File f = new File("D:\\Program Files\\mygit\\coding2017\\students\\335402763\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt"); + boolean emailDebug = false; + + PromotionMailService promotionMailService = new PromotionMailServiceImpl(); + promotionMailService.sendPromotionMail(f, emailDebug); + } + +} 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/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 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/utils/DBUtil.java b/students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java new file mode 100644 index 0000000000..2a7002dede --- /dev/null +++ b/students/335402763/src/main/java/com/coderising/ood/srp/utils/DBUtil.java @@ -0,0 +1,25 @@ +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/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 props=new HashMap(); + 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + 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 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..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> 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> 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> mailingList = DBUtil.loadMailingList(product); + + if (mailingList == null){ + System.out.println("没有邮件发送"); + return ; + } + + Iterator> iter = mailingList.iterator(); + while (iter.hasNext()) { + HashMap 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 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/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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.7 + 1.7 + UTF-8 + + + + + 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 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> loadMailingList(String productID){ + String sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + productID + "' " + + "and send_mail=1 "; + System.out.println("loadQuery set"); + 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/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> mailingList = DBUtil.loadMailingList(productInfo.getProductID()); + sendEMails(emailDebug, mailingList, productInfo); + + } + + private static String getMessage(HashMap 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> mailingList, ProductInfo productInfo) throws IOException { + System.out.println("开始发送邮件"); + MailUtil.init(); + if (mailingList != null) { + for (HashMap 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 query(String sql, Product product){ + List 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 hosts = new ArrayList(); + { + hosts.add("smtp.163.com"); + hosts.add("smtp1.163.com"); + } + + public List getHosts() { + return hosts; + } + public void setHosts(List 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 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 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 read(InputStream is) throws IOException { + BufferedReader br = null; + List 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 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 diff --git a/students/382266293/src/ood/srp/MailSender.java b/students/382266293/src/ood/srp/MailSender.java new file mode 100644 index 0000000000..83e3fbef85 --- /dev/null +++ b/students/382266293/src/ood/srp/MailSender.java @@ -0,0 +1,52 @@ +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; + +/** + * 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 prepareMails(File productFile) throws Exception { + + List products = productDAO.list(productFile); + List mailingList = mailDAO.loadMailingList(products); + setMailContext(mailingList); + + return mailingList; + } + + protected abstract void setMailContext(List mailingList); + + protected void setDebug(boolean debug) { + this.debug = debug; + } + + protected void sendEMails(List mailingList) { + + if (mailDAO.isValide(mailingList)) { + System.out.println("开始发送邮件"); + + for (Mail mail : mailingList) { + MailUtil.send(mail, sc); + } + } + + } + + +} diff --git a/students/382266293/src/ood/srp/PromotionMail.java b/students/382266293/src/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..c3d6520a67 --- /dev/null +++ b/students/382266293/src/ood/srp/PromotionMail.java @@ -0,0 +1,40 @@ +package ood.srp; + +import 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 mailList = pm.prepareMails(f); + pm.sendEMails(mailList); + + } + + @Override + protected void setMailContext(List 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/ood/srp/bean/Mail.java b/students/382266293/src/ood/srp/bean/Mail.java new file mode 100644 index 0000000000..91e1363140 --- /dev/null +++ b/students/382266293/src/ood/srp/bean/Mail.java @@ -0,0 +1,53 @@ +package 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/ood/srp/bean/Product.java b/students/382266293/src/ood/srp/bean/Product.java new file mode 100644 index 0000000000..3b879b274f --- /dev/null +++ b/students/382266293/src/ood/srp/bean/Product.java @@ -0,0 +1,38 @@ +package 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 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 getSubscribers() { + return subscribers; + } + + public void setSubscribers(List subscribers) { + this.subscribers = subscribers; + } + +} diff --git a/students/382266293/src/ood/srp/bean/Subscriber.java b/students/382266293/src/ood/srp/bean/Subscriber.java new file mode 100644 index 0000000000..a2a2641622 --- /dev/null +++ b/students/382266293/src/ood/srp/bean/Subscriber.java @@ -0,0 +1,27 @@ +package 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/ood/srp/config/Configuration.java b/students/382266293/src/ood/srp/config/Configuration.java new file mode 100644 index 0000000000..59bf7bfbd1 --- /dev/null +++ b/students/382266293/src/ood/srp/config/Configuration.java @@ -0,0 +1,37 @@ +package 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 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/ood/srp/config/ServerConfig.java b/students/382266293/src/ood/srp/config/ServerConfig.java new file mode 100644 index 0000000000..2c8c52a79a --- /dev/null +++ b/students/382266293/src/ood/srp/config/ServerConfig.java @@ -0,0 +1,32 @@ +package 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/ood/srp/dao/MailDAO.java b/students/382266293/src/ood/srp/dao/MailDAO.java new file mode 100644 index 0000000000..c80eb7f7bc --- /dev/null +++ b/students/382266293/src/ood/srp/dao/MailDAO.java @@ -0,0 +1,39 @@ +package ood.srp.dao; + +import ood.srp.bean.Mail; +import ood.srp.bean.Product; +import ood.srp.bean.Subscriber; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by onlyLYJ on 2017/6/12. + */ +public class MailDAO { + + public List loadMailingList(List products) throws Exception { + + List mails = new ArrayList<>(); + + for (Product p : products) { + List 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 mailingList) { + if (null == mailingList || mailingList.isEmpty()) { + throw new RuntimeException("没有邮件发送"); + } + return true; + } + +} diff --git a/students/382266293/src/ood/srp/dao/ProductDAO.java b/students/382266293/src/ood/srp/dao/ProductDAO.java new file mode 100644 index 0000000000..39312cf24a --- /dev/null +++ b/students/382266293/src/ood/srp/dao/ProductDAO.java @@ -0,0 +1,49 @@ +package ood.srp.dao; + +import 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 list(File productFile) throws IOException // @02C + { + + System.out.println(productFile); + List 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/ood/srp/dao/UserDAO.java b/students/382266293/src/ood/srp/dao/UserDAO.java new file mode 100644 index 0000000000..91ebd5cd23 --- /dev/null +++ b/students/382266293/src/ood/srp/dao/UserDAO.java @@ -0,0 +1,31 @@ +package ood.srp.dao; + +import ood.srp.bean.Product; +import ood.srp.bean.Subscriber; +import ood.srp.util.DBUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by onlyLYJ on 2017/6/12. + */ +public class UserDAO { + + public List list(Product p) throws Exception { + + DBUtil.setLoadQuery(p); + + List 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/ood/srp/data/product_promotion.txt b/students/382266293/src/ood/srp/data/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/382266293/src/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/ood/srp/util/DBUtil.java b/students/382266293/src/ood/srp/util/DBUtil.java new file mode 100644 index 0000000000..9d14f02cba --- /dev/null +++ b/students/382266293/src/ood/srp/util/DBUtil.java @@ -0,0 +1,16 @@ +package ood.srp.util; + +import 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/ood/srp/util/MailUtil.java b/students/382266293/src/ood/srp/util/MailUtil.java new file mode 100644 index 0000000000..d41af6667e --- /dev/null +++ b/students/382266293/src/ood/srp/util/MailUtil.java @@ -0,0 +1,32 @@ +package ood.srp.util; + +import ood.srp.bean.Mail; +import 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 { + + +} diff --git a/students/383117348/ood-assignment/pom.xml b/students/383117348/ood-assignment/pom.xml new file mode 100644 index 0000000000..1be81576cc --- /dev/null +++ b/students/383117348/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..715b5a23db --- /dev/null +++ b/students/383117348/ood-assignment/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 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_EMAIL_DEBUG, false); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public Object getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..ddc77c7566 --- /dev/null +++ b/students/383117348/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"; + public static final String IS_EMAIL_DEBUG = "is_email_debug"; +} diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..65383e4dba --- /dev/null +++ b/students/383117348/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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java new file mode 100644 index 0000000000..275edf2ab2 --- /dev/null +++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/FileUtil.java @@ -0,0 +1,61 @@ +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.List; + +public class FileUtil { + + /** + * 根据文件路径获取文件,如果文件不存在,抛出异常 + * @param path + * @return + * @throws FileNotFoundException + */ + public static File readFile(String path) throws FileNotFoundException { + File file = new File(path); + if (!file.exists()) { + throw new FileNotFoundException("文件不存在"); + } + return file; + } + + /** + * 根据正则,将文件中的数据解析成字符串数组形式返回 + * + * @param file + * @param regex + * @return + */ + public static List parseToString(File file, String regex) { + List list = new ArrayList(); + BufferedReader br = null; + try { + if (file != null && file.exists()) { + + br = new BufferedReader(new FileReader(file)); + String temp = null; + while ((temp = br.readLine()) != null) { + String[] strs = temp.split(regex); + list.add(strs); + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return list; + } +} diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..d5ed2e536e --- /dev/null +++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,52 @@ +package com.coderising.ood.srp; + +public class MailUtil { + + private static String fromAddress = ""; + private static String smtpHost = ""; + private static String altSmtpHost = ""; + private static boolean debug = false; + + private static Configuration config = new Configuration(); + + private 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); + debug = (Boolean) config.getProperty(ConfigurationKeys.IS_EMAIL_DEBUG); + } + /** + * 发送单条邮件 + * @param toAddress + * @param subject + * @param message + */ + public static void sendEmail(String toAddress,String subject,String message) { + ConfigureEmail(); + if(debug){ + System.out.println("测试环境"); + }else{ + System.out.println("正式环境"); + } + 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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..d00b438768 --- /dev/null +++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,101 @@ +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; + +public class PromotionMail { + + protected String subject = null; + protected String message = null; + + private static List products = new ArrayList(); + + private static String filePath = "E:\\coding2017\\students\\383117348\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt"; + + private UserInfoService uis = new UserInfoServiceImpl(); + + public PromotionMail(File file) throws Exception { + // 读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + readFile(file); + } + + public static void main(String[] args) throws Exception { + File f = FileUtil.readFile(filePath); + PromotionMail pe = new PromotionMail(f); + // 遍历每条产品信息 + for (String[] data : products) { + List> list = pe.loadUserInfoList(data[0]); + if (list != null && list.size() > 0) { + pe.sendEMails(list, data[1]); + } + } + } + + /** + * 读取产品文件,获得所有的产品信息 + * + * @param file + */ + protected void readFile(File file) { + List datas = FileUtil.parseToString(file, " "); + if (datas != null && datas.size() > 0) { + products = datas; + for (String[] data : products) { + System.out.print("产品ID = " + data[0] + "\n"); + System.out.println("产品描述 = " + data[1] + "\n"); + } + } + } + + /** + * 根据产品id获取需要发送的用户信息,暂未考虑sql注入的安全问题 + * + * @return + * @throws Exception + */ + protected List> loadUserInfoList(String productID) throws Exception { + return uis.getList(productID); + } + + /** + * 设置发送的消息体 + * + * @param name + * @throws IOException + */ + protected void setMessage(String name, String productDesc) throws IOException { + this.subject = "您关注的产品降价了"; + this.message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了,欢迎购买!"; + } + + /** + * 发送邮件 + * + * @param mailingList + * @throws IOException + */ + protected void sendEMails(List> mailingList, String productDesc) throws IOException { + + System.out.println("开始发送邮件"); + + if (mailingList != null) { + Iterator> iter = mailingList.iterator(); + while (iter.hasNext()) { + Map 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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoService.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoService.java new file mode 100644 index 0000000000..9dea3e28d5 --- /dev/null +++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoService.java @@ -0,0 +1,14 @@ +package com.coderising.ood.srp; + +import java.util.List; +import java.util.Map; + +public interface UserInfoService { + /** + * 根据产品id获取订阅信息用户 + * @param productID + * @return + */ + public List> getList(String productID); + +} diff --git a/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoServiceImpl.java b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoServiceImpl.java new file mode 100644 index 0000000000..07427ac138 --- /dev/null +++ b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/UserInfoServiceImpl.java @@ -0,0 +1,26 @@ +package com.coderising.ood.srp; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class UserInfoServiceImpl implements UserInfoService { + + public List> getList(String productID) { + // TODO Auto-generated method stub + List> list = new ArrayList>(); + 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/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/383117348/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..0c0124cc61 --- /dev/null +++ b/students/383117348/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/383117348/ood-assignment/src/test/java/com/coderising/ood_assignment/AppTest.java b/students/383117348/ood-assignment/src/test/java/com/coderising/ood_assignment/AppTest.java new file mode 100644 index 0000000000..931f1f5362 --- /dev/null +++ b/students/383117348/ood-assignment/src/test/java/com/coderising/ood_assignment/AppTest.java @@ -0,0 +1,38 @@ +package com.coderising.ood_assignment; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} 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 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 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 @@ + diff --git a/students/402246209/learning/pom.xml b/students/402246209/learning/pom.xml new file mode 100644 index 0000000000..129bccd496 --- /dev/null +++ b/students/402246209/learning/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + com.mimieye + learning + RELEASE + jar + + + \ 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 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> 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> listPromotions(String filePath) throws Exception { + List> list = null; + List results = FileReadUtil.readFile(filePath); + if(results != null && results.size()>0){ + list = new ArrayList<>(); + String temp = null; + String[] data = null; + Map map = null; + Iterator 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 readFile(String fileName) throws IOException { + File file = new File(fileName); + BufferedReader reader = null; + List 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 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"); + } + +} 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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/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 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 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 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 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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/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 diff --git a/students/466199956/readme.md b/students/466199956/readme.md new file mode 100644 index 0000000000..e69de29bb2 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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/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()); + + } + + +} 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 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + 1.8 + 1.8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + 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 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 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 @@ + + + 4.0.0 + + season2 + season2 + 1.0-SNAPSHOT + + + \ 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 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 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 query(String sql){ + + List 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 createEmails(String path) throws IOException { + List products = ProductInfoLoader.readFile(path); + List mails = new ArrayList<>(); + for (Product product : products) { + String sql = getSql(product.getProductId()); + List 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 readFile(String path) throws IOException // @02C + { + File file = new File(path); + List 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 mailingList){ + if (mailingList != null) { + Iterator 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; + } +} 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"); + } + +} 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 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 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); + + } + + + +} 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 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 diff --git a/students/511134962/ood-assignment/pom.xml b/students/511134962/ood-assignment/pom.xml new file mode 100644 index 0000000000..542d8e08ef --- /dev/null +++ b/students/511134962/ood-assignment/pom.xml @@ -0,0 +1,40 @@ + + + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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..aae91db287 --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,147 @@ +/********************************************************************************************************************** + * 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 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; +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 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(); + mailingList = queryMailingList(); + } + + private void readProductInfos( File file ) throws IOException + {//读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + String[] productInfos = fileUtil.readFile( file ); + productInfo.setProductID( productInfos[ 0 ] ); + productInfo.setProductDesc( productInfos[ 1 ] ); + System.out.println( "产品ID = " + productInfo.getProductID() + "\n" ); + System.out.println( "产品描述 = " + productInfo.getProductDesc() + "\n" ); + } + + private void configuringEMAILSetting() + { + setSMTPHost(); + setAltSMTPHost(); + setFromAddress(); + } + + 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() + { + altSmtpHost = config.getProperty( ConfigurationKeys.ALT_SMTP_SERVER ); + } + + 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\\resources\\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 ) + { + Iterator iter = mailingList.iterator(); + while ( iter.hasNext() ) + { + configureEMail( ( HashMap ) iter.next() ); + try + { + if ( toAddress.length() > 0 ) + { + MailUtil.sendEmail( toAddress, fromAddress, subject, message, smtpHost, emailDebug ); + } + } + catch ( Exception e ) + { + try + { + MailUtil.sendEmail( toAddress, fromAddress, subject, message, altSmtpHost, emailDebug ); + } + catch ( Exception e2 ) + { + System.out.println( "通过备用 SMTP服务器发送邮件失败: " + e2.getMessage() ); + } + } + } + } + else + { + System.out.println( "没有邮件发送" ); + } + + } + + 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 + ", 您关注的产品 " + productInfo.getProductDesc() + " 降价了,欢迎购买!"; + } + +} 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/common/ConfigurationKeys.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java new file mode 100644 index 0000000000..fa6b1ec04a --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/common/ConfigurationKeys.java @@ -0,0 +1,15 @@ +/********************************************************************************************************************** + * 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; + +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/dao/ProductPromotionDAO.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java new file mode 100644 index 0000000000..62b8c05710 --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/dao/ProductPromotionDAO.java @@ -0,0 +1,33 @@ +/********************************************************************************************************************** + * 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.dao; + +import com.coderising.ood.srp.util.DBUtil; + +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 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/util/DBUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java new file mode 100644 index 0000000000..832ba0408a --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java @@ -0,0 +1,37 @@ +/********************************************************************************************************************** + * 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.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +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/util/FileUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/FileUtil.java new file mode 100644 index 0000000000..963eb72001 --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/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.util; + +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/util/MailUtil.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java new file mode 100644 index 0000000000..cac1a23f8d --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/util/MailUtil.java @@ -0,0 +1,23 @@ +/********************************************************************************************************************** + * 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.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/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/ProductInfo.java new file mode 100644 index 0000000000..3bd52e942d --- /dev/null +++ b/students/511134962/ood-assignment/src/main/java/com/coderising/ood/srp/vo/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.vo; + +import java.util.Objects; + +public class ProductInfo +{ + private String productID = null; + private 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/resources/product_promotion.txt b/students/511134962/ood-assignment/src/main/resources/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/511134962/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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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..bf42021028 --- /dev/null +++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,46 @@ +package com.coderising.ood.srp; + +import java.io.File; + +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; + +/** + * 模拟 商品促销通知系统 + *

标题:

+ *

描述:

+ * @autho zx + * @time 2017年6月12日 下午11:43:57 +*/ +public class PromotionMail { + + /** 模拟注入userService */ + private UserService userService = new UserService(); + + /** 模拟注入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; + new PromotionMail(f, emailDebug); + } + + /** + * 商品促销通知系统 + *

标题:

+ *

描述:

+ * @param file + * @param mailDebug + * @throws Exception + */ + public PromotionMail(File file, boolean mailDebug) throws Exception { + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + Product product = FileUtil.readFile(file); + messageService.sendEMails(mailDebug, userService.queryUserInfo(product.getProductId()),product); + } + + +} 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; + +/** + * 推送的消息 实体 + *

标题:

+ *

描述:

+ * @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; + +/** + * 商品类 + *

标题:

+ *

描述:

+ * @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; + +/** + * 服务配置 + *

标题:

+ *

描述:

+ * @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/config/Configuration.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java new file mode 100644 index 0000000000..45cbf41c11 --- /dev/null +++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/config/Configuration.java @@ -0,0 +1,31 @@ +package com.coderising.ood.srp.config; +import java.util.HashMap; +import java.util.Map; + +/** + * 配置类,模拟从配置文件中读取参数 + *

标题:

+ *

描述:

+ * @autho zx + * @time 2017年6月12日 下午11:44:36 +*/ +public class Configuration { + + private static Map configurations = new HashMap(); + + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + return configurations.get(key); + } + +} diff --git a/students/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 + *

标题:

+ *

描述:

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

标题:

+ *

描述:

+ * @autho zx + * @time 2017年6月13日 上午12:51:00 +*/ +public class UserJDBC { + + /** + * 根据商品Id 获取用户信息 + *

方法名称:

+ *

方法说明:

+ * @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/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 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; + +/** + * 推送消息 + *

标题:

+ *

描述:

+ * @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(); + + /** + * 推送消息 + *

方法名称:

+ *

方法说明:

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

标题:

+ *

描述:

+ * @autho zx + * @time 2017年6月13日 上午12:53:30 +*/ +public class UserService { + + /** 模拟注入userJDBC */ + private UserJDBC userJDBC = new UserJDBC(); + + /** + * 获取用户信息 + *

方法名称:

+ *

方法说明:

+ * @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/util/DBUtil.java b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java new file mode 100644 index 0000000000..e466fcb0d4 --- /dev/null +++ b/students/511739113/6.11/ood-assignment/src/main/java/com/coderising/ood/srp/util/DBUtil.java @@ -0,0 +1,32 @@ +package com.coderising.ood.srp.util; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 模拟获取数据库 + *

标题:

+ *

描述:

+ * @autho zx + * @time 2017年6月12日 下午11:47:21 +*/ +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/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工具类 + *

标题:

+ *

描述:

+ * @autho zx + * @time 2017年6月13日 上午2:04:59 +*/ +public class FileUtil { + + /** + * 读取商品信息 + *

方法名称:

+ *

方法说明:

+ * @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; + +/** + * 消息推送工具类 + *

标题:

+ *

描述:

+ * @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()); + } + + +} 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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"); + } + + + 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()); + + } + + +} 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 query(String sql){ + + List 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 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 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 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 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 @@ + + 4.0.0 + com.coding2017 + season2 + 0.0.1-SNAPSHOT + \ 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 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()); + + } + + +} diff --git a/students/549739951/src/main/java/srp/Main.java b/students/549739951/src/main/java/srp/Main.java new file mode 100644 index 0000000000..617f64e3ee --- /dev/null +++ b/students/549739951/src/main/java/srp/Main.java @@ -0,0 +1,58 @@ +package srp; + +import srp.model.Product; +import srp.model.User; +import srp.service.ProductService; +import srp.service.PromotionService; +import srp.service.UserService; +import srp.util.RandomUtils; + +import java.util.List; + +/** + * @version V1.0 + * @Title: Main + * @Package: srp + * @Description: 主程序 + * @author: 南来 + * @date: 2017-06-12 9:22 + */ +public class Main { + + /** + * //TODO 写的crud项目太多,作业越写越懵逼,最后我也不知道写成啥了,也不知道是否符合SRP原则。。。总之……欢迎老师和同学们批评指正! + */ + public static void main(String[] args) throws InterruptedException { + //模拟业务场景 + for (; ; ) { + start(); + Thread.sleep(Long.parseLong(RandomUtils.randomNumber(3))); + } + } + + private static void start() { + //region 模拟自动装配 + UserService userService = new UserService(); + ProductService productService = new ProductService(); + PromotionService promotionService = new PromotionService(); + //endregion + + // 1 遍历商品 是否降价 + List products = productService.getProduct(); + if (null != products) { + for (Product product : products) { + // 2 商品降价 + if (product.getDown()) { + // 3 获取所有关注这个产品的用户 + List watchProductUsers = userService.getWatchProductUsers(product.getId()); + if (null != watchProductUsers && watchProductUsers.size() > 0) + // 4 发送促销邮件 + for (User user : watchProductUsers) + promotionService.promotionMail(user.getName(), user.getEmail(), product.getDesc()); + } + } + } + + //TODO 以上代码有明显线程问题。。。大家无视就好。。。。。¯\_(ツ)_/¯ + } +} diff --git a/students/549739951/src/main/java/srp/config/Config.java b/students/549739951/src/main/java/srp/config/Config.java new file mode 100644 index 0000000000..df81a97584 --- /dev/null +++ b/students/549739951/src/main/java/srp/config/Config.java @@ -0,0 +1,21 @@ +package srp.config; + +/** + * @version V1.0 + * @Title: Config + * @Package: srp.config + * @Description: 配置对象 模拟读取配置文件 //todo 或者应该封装成对象? + * @author: 南来 + * @date: 2017-06-12 9:21 + */ +public class Config { + /** + * 主邮件服务器 + */ + public static final String smtpHost = "smtp.server"; + /** + * 备用邮件服务器 + */ + public static final String altSmtpHost = "alt.smtp.server"; + +} diff --git a/students/549739951/src/main/java/srp/config/Constant.java b/students/549739951/src/main/java/srp/config/Constant.java new file mode 100644 index 0000000000..33983c7c05 --- /dev/null +++ b/students/549739951/src/main/java/srp/config/Constant.java @@ -0,0 +1,26 @@ +package srp.config; + +/** + * @version V1.0 + * @Title: Constant + * @Package: srp.config + * @Description: 存放项目常量,避免写死代码,便于后期维护。 + * @author: 南来 + * @date: 2017-06-12 9:17 + */ +public class Constant { + /** + * from address + */ + public static final String EMAIL_ADMIN = "email.admin"; + + /** + * 促销邮件主题 + */ + public static final String SUBJECT = "您关注的产品降价了"; + + /** + * 促销邮件内容 + */ + public static final String MESSAGE = "尊敬的 %s, 您关注的产品 %s 降价了,欢迎购买!"; +} diff --git a/students/549739951/src/main/java/srp/dao/DB.java b/students/549739951/src/main/java/srp/dao/DB.java new file mode 100644 index 0000000000..0b273333b6 --- /dev/null +++ b/students/549739951/src/main/java/srp/dao/DB.java @@ -0,0 +1,86 @@ +package srp.dao; + +import srp.model.Product; +import srp.model.User; +import srp.util.RandomUtils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * @version V1.0 + * @Title: DB + * @Package: srp.dao + * @Description: 伪dao层 持续输出数据 没有细分每个对象单独dao层的部分 + * @author: 南来 + * @date: 2017-06-12 9:20 + */ +public class DB { + + /** + * 模拟在数据库中查询用户 + * + * @return 所有用户 + */ + public List getUsers() { + List users = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + User user = new User(); + user.setName(RandomUtils.randomName()); + user.setEmail(RandomUtils.randomMail()); + //region 模拟关注商品 + try { + List products = getProducts(); + if (null != products && products.size() > 0) + user.setWatchProductId(RandomUtils.randomOne(products).getId()); + } catch (IOException e) { + e.printStackTrace(); + } + //endregion + users.add(user); + } + return users; + } + + /** + * @param productId 商品id + * @return 所有关注该商品的用户集 + */ + public List getWatchProductUsers(String productId) { + if (0 == productId.length()) return null; + List users = getUsers(); + List temp = new ArrayList<>(); + for (User user : users) { + if (null != user.getWatchProductId() && productId.equals(user.getWatchProductId())) + temp.add(user); + } + return temp; + } + + /** + * 模拟在数据库中查询商品 + * + * @return 所有商品 + */ + public List getProducts() throws IOException { + List products = new ArrayList<>(); + try (BufferedReader br = new BufferedReader(new FileReader(new File("D:\\product_promotion.txt")))) { + String temp; + while (null != (temp = br.readLine())) { + String[] data = temp.split(" "); + Product product = new Product(); + product.setId(data[0]); + product.setDesc(data[1]); + //region 模拟降价 + product.setDown(RandomUtils.randomBoolean()); + //endregion + products.add(product); + } + } + return products; + } +} diff --git a/students/549739951/src/main/java/srp/model/Email.java b/students/549739951/src/main/java/srp/model/Email.java new file mode 100644 index 0000000000..a316b6cd57 --- /dev/null +++ b/students/549739951/src/main/java/srp/model/Email.java @@ -0,0 +1,71 @@ +package srp.model; + +/** + * @version V1.0 + * @Title: Email + * @Package: srp.model + * @Description: Email 对象 + * @author: 南来 + * @date: 2017-06-12 10:32 + */ +public class Email { + + /** + * from address + */ + private String from; + /** + * to address + */ + private String to; + /** + * 主题 + */ + private String subject; + /** + * 内容 + */ + private String content; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + 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 getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + return "Email{" + + "from='" + from + '\'' + + ", to='" + to + '\'' + + ", subject='" + subject + '\'' + + ", content='" + content + '\'' + + '}'; + } +} diff --git a/students/549739951/src/main/java/srp/model/Product.java b/students/549739951/src/main/java/srp/model/Product.java new file mode 100644 index 0000000000..6a6cfab5ab --- /dev/null +++ b/students/549739951/src/main/java/srp/model/Product.java @@ -0,0 +1,58 @@ +package srp.model; + +/** + * @version V1.0 + * @Title: Product + * @Package: srp.model + * @Description: 商品对象 + * @author: 南来 + * @date: 2017-06-12 9:46 + */ +public class Product { + + /** + * 商品主键 + */ + private String Id; + /** + * 商品描述 + */ + private String Desc; + /** + * 是否降价 + */ + private boolean down; + + public String getId() { + return Id; + } + + public void setId(String id) { + Id = id; + } + + public String getDesc() { + return Desc; + } + + public void setDesc(String desc) { + Desc = desc; + } + + public boolean getDown() { + return down; + } + + public void setDown(boolean down) { + this.down = down; + } + + @Override + public String toString() { + return "Product{" + + "Id='" + Id + '\'' + + ", Desc='" + Desc + '\'' + + ", down='" + down + '\'' + + '}'; + } +} diff --git a/students/549739951/src/main/java/srp/model/User.java b/students/549739951/src/main/java/srp/model/User.java new file mode 100644 index 0000000000..f45c818979 --- /dev/null +++ b/students/549739951/src/main/java/srp/model/User.java @@ -0,0 +1,58 @@ +package srp.model; + +/** + * @version V1.0 + * @Title: User + * @Package: srp.model + * @Description: 用户对象 + * @author: 南来 + * @date: 2017-06-12 10:07 + */ +public class User { + + /** + * 用户名 + */ + private String name; + /** + * e-mail + */ + private String email; + /** + * 关注的商品Id + */ + private String watchProductId; + + 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 getWatchProductId() { + return watchProductId; + } + + public void setWatchProductId(String watchProductId) { + this.watchProductId = watchProductId; + } + + @Override + public String toString() { + return "User{" + + "name='" + name + '\'' + + ", email='" + email + '\'' + + ", watchProductId='" + watchProductId + '\'' + + '}'; + } +} diff --git a/students/549739951/src/main/java/srp/service/MailService.java b/students/549739951/src/main/java/srp/service/MailService.java new file mode 100644 index 0000000000..60c79117db --- /dev/null +++ b/students/549739951/src/main/java/srp/service/MailService.java @@ -0,0 +1,36 @@ +package srp.service; + +import srp.model.Email; +import srp.util.MailUtil; + +import static srp.config.Config.altSmtpHost; +import static srp.config.Config.smtpHost; + +/** + * @version V1.0 + * @Title: MailService + * @Package: srp.service + * @Description: e-mail服务类 省去接口部分 + * @author: 南来 + * @date: 2017-06-12 10:26 + */ +public class MailService { + + /** + * 负责发送邮件对象 + * + * @param email email对象 + */ + public void send(Email email) { + if (MailUtil.send(email, smtpHost)) { + System.out.println(String.format("ServerHost: %s , 邮件内容: %s ", smtpHost, email)); + } else { + System.out.println("主邮件服务器发送失败,尝试使用备用服务器发送……"); + if (MailUtil.send(email, altSmtpHost)) { + System.out.println(String.format("ServerHost: %s , 邮件内容: %s ", altSmtpHost, email)); + } else { + System.err.println("使用备用服务器发送失败……(╯°Д°)╯︵┻━┻"); + } + } + } +} diff --git a/students/549739951/src/main/java/srp/service/ProductService.java b/students/549739951/src/main/java/srp/service/ProductService.java new file mode 100644 index 0000000000..bcc10ee362 --- /dev/null +++ b/students/549739951/src/main/java/srp/service/ProductService.java @@ -0,0 +1,35 @@ +package srp.service; + +import srp.dao.DB; +import srp.model.Product; + +import java.io.IOException; +import java.util.List; + +/** + * @version V1.0 + * @Title: ProductService + * @Package: srp.service + * @Description: 商品service + * @author: 南来 + * @date: 2017-06-12 11:11 + */ +public class ProductService { + + //模拟自动装配 + private DB db = new DB(); + + /** + * 获取所有商品 + * + * @return 所有商品 + */ + public List getProduct() { + try { + return db.getProducts(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/students/549739951/src/main/java/srp/service/PromotionService.java b/students/549739951/src/main/java/srp/service/PromotionService.java new file mode 100644 index 0000000000..f888d3d673 --- /dev/null +++ b/students/549739951/src/main/java/srp/service/PromotionService.java @@ -0,0 +1,46 @@ +package srp.service; + +import srp.config.Constant; +import srp.model.Email; + +/** + * @version V1.0 + * @Title: PromotionService + * @Package: srp.service + * @Description: Promotion服务类 省去接口部分 + * @author: 南来 + * @date: 2017-06-12 10:24 + */ +public class PromotionService { + + private MailService mailService = new MailService(); + + /** + * 发送促销邮件 + * + * @param name + * @param toAddress 邮箱地址 + * @param desc + */ + public void promotionMail(String name, String toAddress, String desc) { + mailService.send(build(name, toAddress, desc)); + } + + /** + * 构建Email对象 + * + * @param name 姓名 + * @param toAddress 邮箱地址 + * @param desc 商品描述 + * @return Email对象 + */ + private Email build(String name, String toAddress, String desc) { + Email email = new Email(); + email.setFrom(Constant.EMAIL_ADMIN); + email.setTo(toAddress); + email.setSubject(Constant.SUBJECT); + email.setContent(String.format(Constant.MESSAGE, name, desc)); + return email; + } + +} diff --git a/students/549739951/src/main/java/srp/service/UserService.java b/students/549739951/src/main/java/srp/service/UserService.java new file mode 100644 index 0000000000..96f9d42bfb --- /dev/null +++ b/students/549739951/src/main/java/srp/service/UserService.java @@ -0,0 +1,36 @@ +package srp.service; + +import srp.dao.DB; +import srp.model.User; + +import java.util.List; + +/** + * @version V1.0 + * @Title: UserService + * @Package: srp.service + * @Description: User服务类 省去接口部分 + * @author: 南来 + * @date: 2017-06-12 10:25 + */ +public class UserService { + //模拟自动装配 + private DB db = new DB(); + + /** + * 获取所有用户 + * + * @return 所有用户 + */ + protected List getUser() { + return db.getUsers(); + } + + /** + * @param productId 商品id + * @return 所有关注该商品的用户集 + */ + public List getWatchProductUsers(String productId) { + return db.getWatchProductUsers(productId); + } +} diff --git a/students/549739951/src/main/java/srp/util/MailUtil.java b/students/549739951/src/main/java/srp/util/MailUtil.java new file mode 100644 index 0000000000..5bb87b37d7 --- /dev/null +++ b/students/549739951/src/main/java/srp/util/MailUtil.java @@ -0,0 +1,25 @@ +package srp.util; + +import srp.model.Email; + +/** + * @version V1.0 + * @Title: MailUtil + * @Package: srp.util + * @Description: 邮件工具类 + * @author: 南来 + * @date: 2017-06-12 10:50 + */ +public class MailUtil { + + /** + * 模拟发送 随机失败 + * + * @param email email + * @param serverHost 邮件服务配置 + * @return 成功失败 + */ + public static boolean send(Email email, String serverHost) { + return RandomUtils.randomBoolean(); + } +} diff --git a/students/549739951/src/main/java/srp/util/RandomUtils.java b/students/549739951/src/main/java/srp/util/RandomUtils.java new file mode 100644 index 0000000000..caa37fb99a --- /dev/null +++ b/students/549739951/src/main/java/srp/util/RandomUtils.java @@ -0,0 +1,61 @@ +package srp.util; + +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Random; + +/** + * @version V1.0 + * @Title: RandomUtils + * @Package: srp.util + * @Description: 随机工具类 + * @author: 南来 + * @date: 2017-06-12 13:04 + */ +public class RandomUtils { + + public static boolean randomBoolean() { + return new Random().nextBoolean(); + } + + public static Exception randomException() { + if (RandomUtils.randomBoolean()) + return new RuntimeException(); + return null; + } + + public static String randomMail() { + return randomNumber(9) + "@qq.com"; + } + + public static T randomOne(List list) { + return list.get(new Random().nextInt(list.size())); + } + + public static String randomNumber(int length) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < length; i++) + sb.append(new Random().nextInt(10)); + return sb.toString(); + } + + public static String randomName() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 3; i++) { + int highCode, lowCode; + + highCode = (176 + Math.abs(new Random().nextInt(39))); + lowCode = (161 + Math.abs(new Random().nextInt(93))); + + byte[] b = new byte[]{(Integer.valueOf(highCode)).byteValue() + , (Integer.valueOf(lowCode)).byteValue()}; + + try { + sb.append(new String(b, "GBK")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + return sb.toString(); + } +} diff --git a/students/549739951/src/main/resources/product_promotion.txt b/students/549739951/src/main/resources/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/549739951/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 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 @@ + + 4.0.0 + com.codering.ood + coderising + 0.0.1-SNAPSHOT + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + org.apache.commons + commons-lang3 + 3.4 + + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + \ 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 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 query(String sql) { + + List 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 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 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 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 rawlog = new ArrayList(); + for (RawLogger r : rawlog){ + r.log(msg); + } + + List logger = new ArrayList(); + 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/Configuration.java b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/Configuration.java new file mode 100644 index 0000000000..bf9902bf99 --- /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 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/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..528ff9321d --- /dev/null +++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/DBUtil.java @@ -0,0 +1,35 @@ +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; + } + + 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 new file mode 100644 index 0000000000..aa16293062 --- /dev/null +++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/MailUtil.java @@ -0,0 +1,97 @@ +package com.github.orajavac.coding2017.ood.srp; + +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) { + //假装发了一封邮件 + 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 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 new file mode 100644 index 0000000000..53e7e27471 --- /dev/null +++ b/students/562768642/src/com/github/orajavac/coding2017/ood/srp/PromotionMail.java @@ -0,0 +1,67 @@ +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 Mail mail = new Mail(); + + + + 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); + + } + + + public PromotionMail(File file, boolean mailDebug) throws Exception { + + //读取配置文件, 文件中只有一行用空格隔开, 例如 P8756 iPhone8 + Product p = FileUtil.readFile(file); + + + config = new Configuration(); + + mail.setSmtpHost(MailUtil.setSMTPHost(config)); + mail.setAltSmtpHost(MailUtil.setAltSMTPHost(config)); + + + mail.setFromAddress(MailUtil.setFromAddress(config)); + + + DBUtil.setLoadQuery(p.getProductID()); + + MailUtil.sendEMails(mailDebug, loadMailingList(),p,mail); + + + } + + + + + protected List loadMailingList() throws Exception { + return DBUtil.query(this.sendMailQuery); + } +} 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 diff --git a/students/582161208/ood-assignment/pom.xml b/students/582161208/ood-assignment/pom.xml new file mode 100644 index 0000000000..a24289ffac --- /dev/null +++ b/students/582161208/ood-assignment/pom.xml @@ -0,0 +1,47 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + org.projectlombok + lombok + 1.14.8 + + + org.apache.commons + commons-lang3 + 3.1 + + + commons-collections + commons-collections + 3.2 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..3985daf8b5 --- /dev/null +++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,22 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + return configurations.get(key); + } + +} diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..0a96deeb98 --- /dev/null +++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java @@ -0,0 +1,8 @@ +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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..cf0b00a917 --- /dev/null +++ b/students/582161208/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.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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java new file mode 100644 index 0000000000..8a82cad4f2 --- /dev/null +++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailInfo.java @@ -0,0 +1,25 @@ +package com.coderising.ood.srp; + +import lombok.Data; + +/** + * 邮件基本信息 + * + * @author ida 2017/6/12 + */ +@Data +public class MailInfo { + + private String smtpHost; + + private String altSmtpHost; + + private String fromAddress; + + private String toAddress; + + private String subject; + + private String message; + +} diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..06005966e7 --- /dev/null +++ b/students/582161208/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, 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/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java new file mode 100644 index 0000000000..0d77a94f91 --- /dev/null +++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/ProductInfo.java @@ -0,0 +1,17 @@ +package com.coderising.ood.srp; + +import lombok.Data; + +/** + * 产品信息 + * + * @author ida 2017/6/12 + */ +@Data +public class ProductInfo { + + /** 产品id */ + private String productId; + /** 产品描述 */ + private String productDesc; +} diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..0df36f30c9 --- /dev/null +++ b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,183 @@ +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 org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +/** + * 邮件发送处理类 + * + * @author ida 2017/6/12 + */ +public class PromotionMail { + + protected static String sendMailQuery = ""; + + private static Configuration config; + + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + /** + * 发送邮件公有方法 + * + * @param file + * @param mailDebug + */ + public void sendMails(File file, boolean mailDebug) { + try { + config = new Configuration(); + sendEMails(file, mailDebug); + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } + + /** + * 发送邮件 + * + * @param file + * @param debug + * @throws IOException + */ + private static void sendEMails(File file, boolean debug) throws IOException { + + ProductInfo product = readFile(file); + + MailInfo mailInfo = setMailInfo(); + + System.out.println("开始发送邮件"); + + List mailingList = DBUtil.query(sendMailQuery); + if (CollectionUtils.isNotEmpty(mailingList)) { + Iterator iter = mailingList.iterator(); + while (iter.hasNext()) { + MailInfo newMail = configureEMail((HashMap) iter.next(), mailInfo, product); + try { + if (StringUtils.isNotBlank(newMail.getToAddress())) + sendMail(mailInfo, debug); + } catch (Exception e) { + try { + sendMail(mailInfo, debug); + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + } else { + System.out.println("没有邮件发送"); + } + + } + + /** + * 设置邮件部分信息 + * + * @return + */ + private static MailInfo setMailInfo() { + MailInfo mailInfo = new MailInfo(); + mailInfo.setSmtpHost(config.getProperty(ConfigurationKeys.SMTP_SERVER)); + mailInfo.setAltSmtpHost(config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER)); + mailInfo.setFromAddress(config.getProperty(ConfigurationKeys.EMAIL_ADMIN)); + return mailInfo; + } + + /** + * 设置邮件message + * + * @param userInfo + * @param mailInfo + * @param product + * @return + * @throws IOException + */ + private static MailInfo setMessage(HashMap userInfo, MailInfo mailInfo, ProductInfo product) + throws IOException { + String name = (String) userInfo.get(NAME_KEY); + mailInfo.setSubject("您关注的产品降价了"); + mailInfo.setMessage("尊敬的 " + name + ", 您关注的产品 " + product.getProductDesc() + " 降价了,欢迎购买!"); + return mailInfo; + } + + /** + * 读取文件 + * + * @param file + * @return + * @throws IOException + */ + private static ProductInfo readFile(File file) throws IOException { + ProductInfo product = setProductInfo(file); + System.out.println("产品ID = " + product.getProductId() + "\n"); + System.out.println("产品描述 = " + product.getProductDesc() + "\n"); + sendMailQuery = "Select name from subscriptions " + "where product_id= '" + product.getProductId() + "' " + + "and send_mail=1 "; + System.out.println("loadQuery set"); + return product; + } + + /** + * 设置peoduct信息 + * + * @param file + * @return + * @throws IOException + */ + private static ProductInfo setProductInfo(File file) throws IOException { + ProductInfo product = null; + BufferedReader br = null; + try { + product = new ProductInfo(); + br = new BufferedReader(new FileReader(file)); + String temp = br.readLine(); + String[] data = temp.split(" "); + product.setProductId(data[0]); + product.setProductDesc(data[1]); + } catch (IOException e) { + throw new IOException(e.getMessage()); + } finally { + br.close(); + } + return product; + } + + /** + * 读取邮件数据 + * + * @param userInfo + * @param mailInfo + * @param product + * @return + * @throws IOException + */ + private static MailInfo configureEMail(HashMap userInfo, MailInfo mailInfo, ProductInfo product) + throws IOException { + String toAddress = (String) userInfo.get(EMAIL_KEY); + mailInfo.setToAddress(toAddress); + if (toAddress.length() > 0) + return setMessage(userInfo, mailInfo, product); + return mailInfo; + } + + private static void sendMail(MailInfo mailInfo, Boolean debug) { + MailUtil.sendEmail(mailInfo.getToAddress(), mailInfo.getFromAddress(), mailInfo.getSubject(), + mailInfo.getMessage(), mailInfo.getSmtpHost(), debug); + } + + public static void main(String[] args) throws Exception { + File file = new File("C:\\coderising\\workspace_ds\\ood-example\\src\\product_promotion.txt"); +// File file = new File("/Users/myhome/Desktop/product_promotion.txt"); + boolean emailDebug = false; + PromotionMail pe = new PromotionMail(); + pe.sendMails(file, emailDebug); + } + +} diff --git a/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/582161208/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..0c0124cc61 --- /dev/null +++ b/students/582161208/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/592146505/data-structure/assignment/pom.xml b/students/592146505/data-structure/assignment/pom.xml new file mode 100644 index 0000000000..5024466d17 --- /dev/null +++ b/students/592146505/data-structure/assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ds-assignment + 0.0.1-SNAPSHOT + jar + + ds-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/students/592146505/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 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中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/students/592146505/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 params = new HashMap(); + 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 params = new HashMap(); + 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/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..e5d9aebba8 --- /dev/null +++ b/students/592146505/data-structure/assignment/src/main/java/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Course.java new file mode 100644 index 0000000000..436d092f58 --- /dev/null +++ b/students/592146505/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 prerequisites; + + public List 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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseOffering.java new file mode 100644 index 0000000000..ab8c764584 --- /dev/null +++ b/students/592146505/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 students = new ArrayList(); + + public int getMaxStudents() { + return maxStudents; + } + + public List getStudents() { + return students; + } + + public Course getCourse() { + return course; + } +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/CourseService.java new file mode 100644 index 0000000000..8c34bad0c3 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/bad/Student.java new file mode 100644 index 0000000000..a651923ef5 --- /dev/null +++ b/students/592146505/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 coursesAlreadyTaken = new ArrayList(); + + public List getCoursesAlreadyTaken() { + return coursesAlreadyTaken; + } +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Course.java new file mode 100644 index 0000000000..aefc9692bb --- /dev/null +++ b/students/592146505/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 prerequisites; + + public List getPrerequisites() { + return prerequisites; + } + +} + + diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseOffering.java new file mode 100644 index 0000000000..8660ec8109 --- /dev/null +++ b/students/592146505/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 students = new ArrayList(); + + public List 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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/CourseService.java new file mode 100644 index 0000000000..22ba4a5450 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/course/good/Student.java new file mode 100644 index 0000000000..2c7e128b2a --- /dev/null +++ b/students/592146505/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 coursesAlreadyTaken = new ArrayList(); + + public List getCoursesAlreadyTaken() { + return coursesAlreadyTaken; + } + + public boolean canAttend(Course course){ + return this.coursesAlreadyTaken.containsAll( + course.getPrerequisites()); + } +} + + diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/DateUtil.java new file mode 100644 index 0000000000..b6cf28c096 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/Logger.java new file mode 100644 index 0000000000..0357c4d912 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/MailUtil.java new file mode 100644 index 0000000000..ec54b839c5 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/ocp/SMSUtil.java new file mode 100644 index 0000000000..13cf802418 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..f328c1816a --- /dev/null +++ b/students/592146505/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 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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..9f9e749af7 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..781587a846 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/592146505/data-structure/assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..a98917f829 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/List.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..45740e6d57 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..994a241a3d --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/linklist/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..2e0550c67e --- /dev/null +++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,39 @@ +package com.coding.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..6a3ea639b9 --- /dev/null +++ b/students/592146505/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 execute(int n, int m){ + return null; + } + +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/students/592146505/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 { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node 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 oldlast = last; + last = new Node(); + 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..cef19a8b59 --- /dev/null +++ b/students/592146505/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 + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + + } + diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..f391d92b8f --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..fedb243604 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..b0ec38161d --- /dev/null +++ b/students/592146505/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 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..76f2cb7668 --- /dev/null +++ b/students/592146505/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 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() { + 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})")); + } + +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..d0ab4387d2 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..e86d056a24 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..ef85ff007f --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20e34e8852 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..96a2194a67 --- /dev/null +++ b/students/592146505/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 convert(String expr) { + + return null; + } + + + +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..dcbb18be4b --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..956927e2df --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/students/592146505/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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/students/592146505/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 OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..d3b0f167e1 --- /dev/null +++ b/students/592146505/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 parse(String expr) { + List 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/students/592146505/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 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTree.java new file mode 100644 index 0000000000..4536ee7a2b --- /dev/null +++ b/students/592146505/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 { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode 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 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 getNodesBetween(T n1, T n2){ + return null; + } + +} + diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..4a53dbe2f1 --- /dev/null +++ b/students/592146505/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 tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + root.left.right.right = new BinaryTreeNode(5); + tree = new BinarySearchTree(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 root= tree.getRoot(); + Assert.assertEquals(4, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode1() { + tree.remove(4); + BinaryTreeNode 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 root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } + + @Test + public void testLevelVisit() { + List 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 root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(4); + root.left.right = new BinaryTreeNode(1); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + + Assert.assertFalse(tree.isValid()); + } + @Test + public void testGetNodesBetween(){ + List numbers = this.tree.getNodesBetween(3, 8); + System.out.println(numbers.toString()); + + } +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..c1421cd398 --- /dev/null +++ b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package com.coding.basic.tree; + +public class BinaryTreeNode { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T 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/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..b033cbe1d5 --- /dev/null +++ b/students/592146505/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 List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..41857e137d --- /dev/null +++ b/students/592146505/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 root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java b/students/592146505/data-structure/assignment/src/main/java/com/coding/basic/tree/FileList.java new file mode 100644 index 0000000000..6e65192e4a --- /dev/null +++ b/students/592146505/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/592146505/ood/ood-assignment/pom.xml b/students/592146505/ood/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/592146505/ood/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..f328c1816a --- /dev/null +++ b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java @@ -0,0 +1,23 @@ +package com.coderising.ood.srp; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..82e9261d18 --- /dev/null +++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..9f9e749af7 --- /dev/null +++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..781587a846 --- /dev/null +++ b/students/592146505/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/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt b/students/592146505/ood/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/592146505/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/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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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(); + 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 productList = mailService.readFile(src); + List personList = mailService.querySendPerons(); + + List emailList=getEmailList(productList,personList); + + mailService.sendMessage(emailList); + } + + private static List getEmailList( List productList, List personList) throws Exception + { + List emailList=new ArrayList(); + 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 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 persons; + private List products; + + + + public void sendMessage(List 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 + * @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(); + 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(); + } + } + + +} 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 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> query(String sql) { + + List> userList = new ArrayList>(); + for (int i = 1; i <= 3; i++) { + HashMap userInfo = new HashMap(); + 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(产品id,产品描述)形式返回。 + * + * @author xujie + * + */ +public class FileUtil { + + public static List readFile(String path) throws IOException { + BufferedReader br = null; + List 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..1dd007b3d5 --- /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> mailList; + + public static void main(String[] args) throws Exception { + + String path = "src/edu/coerscnu/ood/srp/product_promotion.txt"; + List 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 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> iter = mailList.iterator(); + while (iter.hasNext()) { + HashMap 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> 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 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 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 @@ +这是我的目录 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 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 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 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 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 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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/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 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/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 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 new file mode 100644 index 0000000000..4820d10a12 --- /dev/null +++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java @@ -0,0 +1,128 @@ +package com.coderising.ood.srp; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +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; + protected String sendMailQuery = null; + protected LinkedList theme; + public Mail(File file, boolean emailDebug) throws Exception + { + theme = new LinkedList<>(); + FileProdUtil.readFile(file, theme); + setSMTPHost(); + setAltSMTPHost(); + setFromAddress(); + sendEMails(emailDebug, theme); + } + //protected abstract void readFile(File fie, LinkedList theme) 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 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); + } + + + //protected abstract void setMessage(String name) throws IOException; + + abstract protected void setSendMailQuery(Theme theme) throws Exception; + + + 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 void sendEMails(boolean debug, LinkedList theme) throws Exception + { + 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, + 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..1f84e2f087 --- /dev/null +++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java @@ -0,0 +1,8 @@ +package com.coderising.ood.srp; + +public class Product extends Theme { + + + + +} 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..d6ef4b8c26 --- /dev/null +++ b/students/702282822/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,37 @@ +package com.coderising.ood.srp; + +import java.io.File; +import java.io.IOException; + +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(Theme theme) throws Exception { + sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + theme.getID() +"' " + + "and send_mail=1 "; + + System.out.println("loadQuery set"); + } + + + protected void setMessage(String name, Theme theme) throws IOException + { + subject = "您关注的产品降价了"; + message = "尊敬的 "+ name +", 您关注的产品 " + theme.getDesc() + " 降价了,欢迎购买!" ; + } +} 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; + } +} 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 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 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 diff --git a/students/734473301/coding2017jyz/product_promotion.txt b/students/734473301/coding2017jyz/product_promotion.txt new file mode 100644 index 0000000000..b7a974adb3 --- /dev/null +++ b/students/734473301/coding2017jyz/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/734473301/coding2017jyz/readme.txt b/students/734473301/coding2017jyz/readme.txt new file mode 100644 index 0000000000..746bb1fdc8 --- /dev/null +++ b/students/734473301/coding2017jyz/readme.txt @@ -0,0 +1,4 @@ +因为内容不多,也就没有分包,全部放在了一起。 + +发送邮件的实现方法,最后是放在了host上,可以直接new一个host发送, +这个方法应该实现在哪个类,这个还需结合实际考虑。 \ No newline at end of file diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Configuration.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Configuration.java new file mode 100644 index 0000000000..01dbf8d408 --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Configuration.java @@ -0,0 +1,32 @@ +package homework.jyz.coding2017; +import java.util.HashMap; +import java.util.Map; + +/** + * 主机配置类 + */ +public class Configuration { + + 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 Map configurations = new HashMap<>(); + + public Configuration() { + configurations.put(SMTP_SERVER, "smtp.163.com"); + configurations.put(ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(EMAIL_ADMIN, "admin@company.com"); + } + + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Email.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Email.java new file mode 100644 index 0000000000..8e33d1e4d0 --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/Email.java @@ -0,0 +1,54 @@ +package homework.jyz.coding2017; + +/** + * 邮件实体信息 + * Created by jyz on 2017/6/13. + */ +public class Email { + private String fromAddress; + private String toAddress; + private String subject; + private String message; + + public Email() { + } + + 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/734473301/coding2017jyz/src/homework/jyz/coding2017/EmailHost.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/EmailHost.java new file mode 100644 index 0000000000..4299d466fe --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/EmailHost.java @@ -0,0 +1,57 @@ +package homework.jyz.coding2017; + +/** + * 邮件服务器主机类 + * Created by jyz on 2017/6/13. + */ +public class EmailHost { + private Configuration config; + private String host; + private String altHost; + private String hostAdmin; + + /** + * 构建主机 + * @param config 主机配置 + */ + public EmailHost(Configuration config) { + this.config = config; + host = this.config.getProperty(Configuration.SMTP_SERVER); + altHost = this.config.getProperty(Configuration.ALT_SMTP_SERVER); + hostAdmin = this.config.getProperty(Configuration.EMAIL_ADMIN); + } + + public boolean send(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"); + if(send(host,buffer.toString())){ + return true; + } + System.out.println("启用备用主机发送.."); + if(send(altHost,buffer.toString())){ + return true; + } + System.out.println("发送失败"); + return false; + } + System.out.println("邮件为空,发送失败"); + return false; + } + + public boolean send(String host,String message){ + try { + System.out.println("使用主机"+host+"发送邮件"); + System.out.println(message); + return true; + } catch (Exception e) { + System.out.println("使用主机"+host+"发送邮件失败"); + e.printStackTrace(); + return false; + } + } +} diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailConfig.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailConfig.java new file mode 100644 index 0000000000..2d3a56aac6 --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailConfig.java @@ -0,0 +1,68 @@ +package homework.jyz.coding2017; + + + +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; + +/** + * 配置邮件信息类 + * Created by jyz on 2017/6/13. + */ +public class MailConfig { + private MailDao dao; + private static final String NAME_KEY = "NAME"; + private static final String EMAIL_KEY = "EMAIL"; + + private String productID = ""; + private String productDesc = ""; + + public MailConfig(MailDao dao) { + this.dao = dao; + } + + public List getEmails() { + List mails = dao.getMails(productID); + List list = new ArrayList<>(); + for (HashMap map : mails) { + Email email = new Email(); + setMessage(map, email); + list.add(email); + } + return list; + } + + private void setMessage(HashMap userInfo, Email email) { + String name = (String) userInfo.get(NAME_KEY); + email.setSubject("您关注的产品降价了"); + String message = "尊敬的 " + name + ", 您关注的产品 " + productDesc + " 降价了,欢迎购买!"; + email.setMessage(message); + } + + + public 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(" "); + 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 { + if(br != null){ + br.close(); + } + } + } +} diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailDao.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailDao.java new file mode 100644 index 0000000000..def5400761 --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailDao.java @@ -0,0 +1,34 @@ +package homework.jyz.coding2017; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 邮件Dao + * Created by jyz on 2017/6/13. + */ +public class MailDao { + + public List getMails(String productID){ + String sendMailQuery = "Select name from subscriptions " + + "where product_id= '" + productID +"' " + + "and send_mail=1 "; + + System.out.println("loadQuery set"); + return query(sendMailQuery); + } + + 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/734473301/coding2017jyz/src/homework/jyz/coding2017/MailSend.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailSend.java new file mode 100644 index 0000000000..d9658cb22f --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/MailSend.java @@ -0,0 +1,41 @@ +package homework.jyz.coding2017; + +import java.util.List; + +/** + * 发送邮件的工作类 + * Created by jyz on 2017/6/13. + */ +public class MailSend { + + private EmailHost host; + + public MailSend(EmailHost host){ + this.host = host; + } + + public MailSend() { + } + + /** + * 默认主机发送 + * @param emails + */ + public void send(List emails){ + emails.forEach(email -> host.send(email)); + } + public void send(Email email){ + host.send(email); + } + /** + * 指定主机发送 + * @param host + * @param emails + */ + public void send(EmailHost host,List emails){ + for (Email email : emails) { + host.send(email); + } + } + +} diff --git a/students/734473301/coding2017jyz/src/homework/jyz/coding2017/WorkStart.java b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/WorkStart.java new file mode 100644 index 0000000000..9759223a94 --- /dev/null +++ b/students/734473301/coding2017jyz/src/homework/jyz/coding2017/WorkStart.java @@ -0,0 +1,26 @@ +package homework.jyz.coding2017; + +import java.io.File; +import java.io.IOException; + +/** + * 主程序类 + * Created by jyz on 2017/6/13. + */ +public class WorkStart { + public static void main(String args[]) throws IOException { + // 发送邮件程序入口 + Configuration confg = new Configuration();// 加载配置 + MailSend ms = new MailSend(new EmailHost(confg));// 创建邮件工作类 + MailConfig mc = new MailConfig(new MailDao());// 组织待发送邮件 + mc.readFile(new File("product_promotion.txt"));// 获取产品信息 + ms.send(mc.getEmails());// 批量发送 + + Email email = new Email("from@qq.com","to@qq.com","coding2017","hello,world!"); + ms.send(email); // 单个发送 + + } + + + +} 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 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 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/PromotionMail.java b/students/740707954/src/ood/newSrp/PromotionMail.java new file mode 100644 index 0000000000..74cb9741da --- /dev/null +++ b/students/740707954/src/ood/newSrp/PromotionMail.java @@ -0,0 +1,32 @@ +package ood.newSrp; + +import ood.newSrp.entity.Product; +import ood.newSrp.server.UserServer; +import ood.newSrp.server.ProductServer; + +import java.util.List; +import java.util.Map; + +/** + * promotion 提升 + */ +public class PromotionMail { + // 用户信息 + private static UserServer ms = new UserServer(); + // 邮件发送器 + private static MailSender mSend = new MailSender(); + + public static void main(String[] args) throws Exception { + // 获取产品信息 + List pList = ProductServer.getUserProduct(); + + for (Product p : pList) { + System.out.println("产品ID: " + p.getProductId() + "\n" + "产品描述:" + p.getProductDesc()); + // 获取接收产品用户列表 + List sendUserList = ms.querySendUser(p.getProductId()); + // 发送邮件 + mSend.batchSendEMail(p, sendUserList, false); + } + + } +} diff --git a/students/740707954/src/ood/newSrp/conf/Configuration.java b/students/740707954/src/ood/newSrp/conf/Configuration.java new file mode 100644 index 0000000000..37bf3f3a58 --- /dev/null +++ b/students/740707954/src/ood/newSrp/conf/Configuration.java @@ -0,0 +1,26 @@ +package ood.newSrp.conf; + +import ood.oldSrp.ConfigurationKeys; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public static String getProperty(String key) { + return configurations.get(key); + } + +} diff --git a/students/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/Product.java b/students/740707954/src/ood/newSrp/entity/Product.java new file mode 100644 index 0000000000..4fc38aacb4 --- /dev/null +++ b/students/740707954/src/ood/newSrp/entity/Product.java @@ -0,0 +1,35 @@ +package ood.newSrp.entity; + +/** + * 产品信息 + * Created by Administrator on 2017/6/15 0015. + */ +public class Product { + 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/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/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 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 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 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/util/DBUtil.java b/students/740707954/src/ood/newSrp/util/DBUtil.java new file mode 100644 index 0000000000..c1866fd925 --- /dev/null +++ b/students/740707954/src/ood/newSrp/util/DBUtil.java @@ -0,0 +1,25 @@ +package ood.newSrp.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/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 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 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 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 @@ + + + + season2 + learning2017 + 2.0-SEASON2 + + 4.0.0 + + datastrure + + + \ 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..90705ddca2 --- /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(){ + + } +} 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 @@ + + + + season2 + learning2017 + 2.0-SEASON2 + + 4.0.0 + + ood + + + \ No newline at end of file diff --git a/students/75939388/ood/src/main/java/srp/original/PromotionMail.java b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java new file mode 100644 index 0000000000..8deec60166 --- /dev/null +++ b/students/75939388/ood/src/main/java/srp/original/PromotionMail.java @@ -0,0 +1,202 @@ +package srp.original; + +import srp.refactor.configuration.Configuration; +import srp.refactor.configuration.ConfigurationKeys; +import srp.refactor.util.DBUtil; + +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){} +// MailContentUtil.sendEmail(toAddress, fromAddress, subject, message, smtpHost, debug); + } + catch (Exception e) + { + + try { +// MailContentUtil.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/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,然后批量保存至超类的待发送邮件列表中 + * 全部解析完成(数据量较大时需要设置阈值)后 + * 由用户发起发送请求 + * + * 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 promotionProducts) throws Exception{ + if(promotionProducts.isEmpty()){ + throw new RuntimeException("没有商品待促销不能为空"); + } + for(Product product : promotionProducts){ + String querySql = productService.getLoadQuerySql(product.getProductId()); + List 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/configuration/Configuration.java b/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java new file mode 100644 index 0000000000..b3b24944d2 --- /dev/null +++ b/students/75939388/ood/src/main/java/srp/refactor/configuration/Configuration.java @@ -0,0 +1,23 @@ +package srp.refactor.configuration; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + + return configurations.get(key); + } + +} diff --git a/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java b/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java new file mode 100644 index 0000000000..9b1cfe8dcc --- /dev/null +++ b/students/75939388/ood/src/main/java/srp/refactor/configuration/ConfigurationKeys.java @@ -0,0 +1,9 @@ +package srp.refactor.configuration; + +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/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/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 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 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 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 getPromotionInfoList(List data){ + List 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 getUserList(String sql){ + List userMapList = DBUtil.query(sql); + List 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/main/java/srp/refactor/util/DBUtil.java b/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java new file mode 100644 index 0000000000..00aa263606 --- /dev/null +++ b/students/75939388/ood/src/main/java/srp/refactor/util/DBUtil.java @@ -0,0 +1,25 @@ +package srp.refactor.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/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 readFile(File file)throws IOException { + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(file)); + String tmp = null; + List 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/resources/ood_demo_file/product_promotion.txt b/students/75939388/ood/src/main/resources/ood_demo_file/product_promotion.txt new file mode 100644 index 0000000000..0c0124cc61 --- /dev/null +++ b/students/75939388/ood/src/main/resources/ood_demo_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/75939388/ood/src/test/java/srp/SrpTest.java b/students/75939388/ood/src/test/java/srp/SrpTest.java new file mode 100644 index 0000000000..c55f54b1d0 --- /dev/null +++ b/students/75939388/ood/src/test/java/srp/SrpTest.java @@ -0,0 +1,41 @@ +package srp; + +import org.junit.Before; +import org.junit.Test; +import srp.refactor.PromotionMailClient; +import srp.refactor.domain.Product; +import srp.refactor.services.ProductService; +import srp.refactor.util.FileUtil; + +import java.io.File; +import java.util.List; + +/** + * Created by Tee on 2017/6/15. + */ +public class SrpTest { + + PromotionMailClient promotionMail = null; + + private static int in = 0; + + @Before + public void init(){ + + } + + /** + * 重构后的代码尝试运行 + */ + @Test + 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 data = FileUtil.readFile(file); + + PromotionMailClient promotionMail = new PromotionMailClient(); + List promotionProducts = new ProductService().getPromotionInfoList(data); + promotionMail.batchWrite(promotionProducts); + promotionMail.batchSend(false); + } +} 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 @@ + + + 4.0.0 + + learning2017 + season2 + 2.0-SEASON2 + + + + datastrure + + ood + + + https://github.com/macvis/coding2017 + + 2017编程能力提高,第二季。 + teacher:刘欣 + gitHub: https://github.com/onlyliuxin/coding2017.git + student: TerrenceWen + + + + + TerrenceWen + https://github.com/macvis/ + macvis@126.com + + + + + 1.8 + 1.8 + UTF-8 + UTF-8 + 1.8 + 1.8 + UTF-8 + + + + + + aliyun + aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + never + + + false + + + + + + + + junit + junit + 4.12 + + + + + dom4j + dom4j + 1.6.1 + + + + + jaxen + jaxen + 1.1.6 + + + + + commons-io + commons-io + 2.5 + + + org.apache.commons + commons-lang3 + 3.5 + + + commons-codec + commons-codec + 1.10 + + + org.apache.commons + commons-collections4 + 4.1 + + + \ No newline at end of file diff --git a/students/759412759/ood-assignment/pom.xml b/students/759412759/ood-assignment/pom.xml new file mode 100644 index 0000000000..cac49a5328 --- /dev/null +++ b/students/759412759/ood-assignment/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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) { + + } +} diff --git a/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Configuration.java new file mode 100644 index 0000000000..7616041c05 --- /dev/null +++ b/students/759412759/ood-assignment/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 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/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ConfigurationKeys.java new file mode 100644 index 0000000000..8695aed644 --- /dev/null +++ b/students/759412759/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/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/DBUtil.java new file mode 100644 index 0000000000..0bef2d57c9 --- /dev/null +++ b/students/759412759/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/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Mail.java new file mode 100644 index 0000000000..49f0db842d --- /dev/null +++ b/students/759412759/ood-assignment/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/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java new file mode 100644 index 0000000000..2820127c4b --- /dev/null +++ b/students/759412759/ood-assignment/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/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/Product.java new file mode 100644 index 0000000000..860f584faf --- /dev/null +++ b/students/759412759/ood-assignment/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/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java new file mode 100644 index 0000000000..18674e0101 --- /dev/null +++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/ProductService.java @@ -0,0 +1,32 @@ +package com.coderising.ood.srp; + +import java.io.*; + +/** + * Created by Tudou on 2017/6/16. + */ +public class ProductService { + + 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/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..015b68ff10 --- /dev/null +++ b/students/759412759/ood-assignment/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 = ProductService.loadProductFromFile(path); + List> list = userService.loadMailingList(product.getProductID()); + + pe.sendEMails(list,product,Boolean.FALSE); + } + + private void sendEMails(List> mailingList, Product product, boolean debug) throws IOException { + System.out.println("开始发送邮件"); + if (mailingList != null) { + Iterator> iter = mailingList.iterator(); + while (iter.hasNext()) { + HashMap 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 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/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/UserService.java new file mode 100644 index 0000000000..80dc46eda8 --- /dev/null +++ b/students/759412759/ood-assignment/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> 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/ood-assignment/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 new file mode 100644 index 0000000000..46c64c6e64 --- /dev/null +++ b/students/759412759/ood-assignment/src/main/java/com/coderising/ood/srp/product_promotion.txt @@ -0,0 +1 @@ +P8756 iPhone8 \ No newline at end of file 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + 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 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..60c50b34f0 --- /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++) { + UserInfo userInfo = new UserInfo(); + userInfo.setUsername("User" + i); + userInfo.setEmail("aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } +} 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 new file mode 100644 index 0000000000..614de5a438 --- /dev/null +++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/MailUtil.java @@ -0,0 +1,44 @@ +package com.coderising.ood.srp; + +import java.util.List; + +public class MailUtil { + + public static void sendEmail(List 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 readProductInfo() { + File file = new File("E:\\coding2017\\students\\765324639\\ood\\ood-assignment\\src\\main\\java\\com\\coderising\\ood\\srp\\product_promotion.txt"); + List 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 new file mode 100644 index 0000000000..b47f451636 --- /dev/null +++ b/students/765324639/ood/ood-assignment/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,40 @@ +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 { + + public static void main(String[] args) throws Exception { + + List productList = ProductInfoReader.readProductInfo(); + + for (Product product : productList) { + List userInfoList = UserInfoReader.readUserInfo(product.getId()); + List mailInfoList = generateEmails(product, userInfoList); + boolean emailDebug = false; + MailUtil.sendEmail(mailInfoList, emailDebug); + } + + } + + public static List generateEmails(Product product, List userInfoList) { + List 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 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); + } +} 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 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 @@ + + + 4.0.0 + + com + season_two + 1.0-SNAPSHOT + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + + \ 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 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 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 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 readProductFile(File file) throws IOException + { + List list = new ArrayList(); + 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 diff --git a/students/785396327/first/ood/srp/ConfigParser.java b/students/785396327/first/ood/srp/ConfigParser.java new file mode 100644 index 0000000000..87e00e707e --- /dev/null +++ b/students/785396327/first/ood/srp/ConfigParser.java @@ -0,0 +1,9 @@ +package first.ood.srp; + +/** + * Created by william on 2017/6/14. + */ +public abstract class ConfigParser { + + abstract void parseInfoFromConfig(Email email); +} 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 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/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/DBParser.java b/students/785396327/first/ood/srp/DBParser.java new file mode 100644 index 0000000000..3e49e6abd7 --- /dev/null +++ b/students/785396327/first/ood/srp/DBParser.java @@ -0,0 +1,24 @@ +package first.ood.srp; + +import java.util.HashMap; +import java.util.List; + +/** + * Created by william on 2017/6/14. + */ +public abstract class DBParser { + protected String sql; + protected Object[] params; + + protected DBParser(String sql, Object[] params) { + this.sql = sql; + this.params = params; + } + + protected List parseInfoFromDB(T email) { + List> data = DBUtil.query(sql, params); + return convertData(email, data); + } + + abstract List convertData(T email, List> data); +} diff --git a/students/785396327/first/ood/srp/DBUtil.java b/students/785396327/first/ood/srp/DBUtil.java new file mode 100644 index 0000000000..473b8b1ca4 --- /dev/null +++ b/students/785396327/first/ood/srp/DBUtil.java @@ -0,0 +1,43 @@ +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> query(String sql, Object[] params) { + formateSQL(sql, params); + + List userList = new ArrayList(); + for (int i = 1; i <= 3; i++) { + Map userInfo = new HashMap(); + userInfo.put("NAME", "User" + i); + userInfo.put("EMAIL", "aa@bb.com"); + userList.add(userInfo); + } + + return userList; + } + + 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 new file mode 100644 index 0000000000..ebca19e579 --- /dev/null +++ b/students/785396327/first/ood/srp/Email.java @@ -0,0 +1,46 @@ +package first.ood.srp; + +/** + * Created by william 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; + + 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..e6f422b52f --- /dev/null +++ b/students/785396327/first/ood/srp/EmailParser.java @@ -0,0 +1,26 @@ +package first.ood.srp; + +import java.util.List; + +/** + * Created by william on 2017/6/12. + */ +public class EmailParser { + 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; + } + + public List parseEmailList() { + PromotionMail promotionMail = new PromotionMail(); + configParser.parseInfoFromConfig(promotionMail); + fileParser.parseInfoFromFile(promotionMail); + return dbParser.parseInfoFromDB(promotionMail); + } + +} diff --git a/students/785396327/first/ood/srp/FileParser.java b/students/785396327/first/ood/srp/FileParser.java new file mode 100644 index 0000000000..1f14c11389 --- /dev/null +++ b/students/785396327/first/ood/srp/FileParser.java @@ -0,0 +1,38 @@ +package first.ood.srp; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +/** + * Created by gongxun on 2017/6/12. + */ +public abstract class FileParser { + protected String[] data; + + protected 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(); + } + } + + protected abstract void parseInfoFromFile(Email email); + +} diff --git a/students/785396327/first/ood/srp/MailSender.java b/students/785396327/first/ood/srp/MailSender.java new file mode 100644 index 0000000000..a2ed82db46 --- /dev/null +++ b/students/785396327/first/ood/srp/MailSender.java @@ -0,0 +1,33 @@ +package first.ood.srp; + +import java.util.Iterator; +import java.util.List; + +/** + * Created by william on 2017/6/12. + */ +public class MailSender { + + 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 mailList, boolean isDebug) { + if (mailList != null) { + for (Iterator 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/PromotionFileParser.java b/students/785396327/first/ood/srp/PromotionFileParser.java new file mode 100644 index 0000000000..1d57b8de2e --- /dev/null +++ b/students/785396327/first/ood/srp/PromotionFileParser.java @@ -0,0 +1,27 @@ +package first.ood.srp; + +/** + * Created by william 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/PromotionMail.java b/students/785396327/first/ood/srp/PromotionMail.java new file mode 100644 index 0000000000..48096fa54a --- /dev/null +++ b/students/785396327/first/ood/srp/PromotionMail.java @@ -0,0 +1,22 @@ +package first.ood.srp; + +public class PromotionMail extends Email { + private String productID; + private String productDesc; + + 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/PromotionMailConfigParser.java b/students/785396327/first/ood/srp/PromotionMailConfigParser.java new file mode 100644 index 0000000000..6fd8feb08c --- /dev/null +++ b/students/785396327/first/ood/srp/PromotionMailConfigParser.java @@ -0,0 +1,15 @@ +package first.ood.srp; + +/** + * Created by william 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..55e740474f --- /dev/null +++ b/students/785396327/first/ood/srp/PromotionMailDBParser.java @@ -0,0 +1,48 @@ +package first.ood.srp; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Created by william on 2017/6/14. + */ +public class PromotionMailDBParser extends DBParser { + + protected PromotionMailDBParser(String sql, Object[] params) { + super(sql, params); + } + + /** + * 由于sql参数需要运行时提供所以重写parseInfoFromDB方法 + * @param email + * @return + */ + @Override + protected List parseInfoFromDB(PromotionMail email) { + List> data = DBUtil.query(super.sql, new Object[]{email.getproductID()}); + return convertData(email, data); + } + + @Override + List convertData(PromotionMail email, List> data) { + List mailList = new ArrayList(); + for (HashMap map : data) { + email.setToAddress(parseToAddress(map)); + email.setMessage(parseMessage(map, email)); + email.setSubject("您关注的产品降价了"); + mailList.add(email); + } + return mailList; + } + + private String parseMessage(HashMap map, PromotionMail promotionMail) { + String name = map.get(ConfigurationKeys.NAME_KEY); + String message = "尊敬的 " + name + ", 您关注的产品 " + promotionMail.getProductDesc() + " 降价了,欢迎购买!"; + return message; + } + + private String parseToAddress(HashMap 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 new file mode 100644 index 0000000000..2b54947c05 --- /dev/null +++ b/students/785396327/first/ood/srp/SendMailTest.java @@ -0,0 +1,24 @@ +package first.ood.srp; + +import java.util.List; + +/** + * Created by william on 2017/6/12. + */ +public class SendMailTest { + + public static void main(String[] args) { + 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; + + ConfigParser configParser = new PromotionMailConfigParser(); + FileParser fileParser = new PromotionFileParser(filepath); + DBParser DBParser = new PromotionMailDBParser(sql, null); + + EmailParser emailParser = new EmailParser(configParser, fileParser, DBParser); + List promotionMails = emailParser.parseEmailList(); + MailSender 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 new file mode 100644 index 0000000000..ec0483fa8b --- /dev/null +++ b/students/785396327/first/ood/srp/StringUtils.java @@ -0,0 +1,17 @@ +package first.ood.srp; + +/** + * Created by william on 2017/6/12. + */ +public class StringUtils { + + /** + * 判断字符串是否为空 + * + * @param str + * @return + */ + public static boolean isEmpty(String str) { + return str == null || str.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 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 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/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"); + } +} 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 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 @@ + + 4.0.0 + + com.coderising + ood-assignment + 0.0.1-SNAPSHOT + jar + + ood-assignment + http://maven.apache.org + + + UTF-8 + + + + + + junit + junit + 4.12 + + + + + + aliyunmaven + http://maven.aliyun.com/nexus/content/groups/public/ + + + diff --git a/students/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 query(String sql){ + + List userList = new ArrayList(); + 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 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 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 readFile(File file) throws IOException // @02C + { + List productlist = new ArrayList(); + 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 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 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..0330532c81 --- /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 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号命名 ,把自荐的代码放到里边去 diff --git a/students/844620174/readme.md b/students/844620174/readme.md new file mode 100644 index 0000000000..ead67b8547 --- /dev/null +++ b/students/844620174/readme.md @@ -0,0 +1,14 @@ +# 新上传的内容 +### Git 命令行使用 +git 拉取主仓库步骤 +1. fork +2. clone +3. 上传代码 + +git 上传代码分为三步 +1. 新增文件 add +1. 本地提交 commit +1. 远程提交 push + +更新代码 +使用 git pull 命令 \ No newline at end of file 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 { + +} 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 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 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; + } + + public static List queryValidUserList(String sql) { + List userList = query(sql); + List 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 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 getHeaders(); + + Map 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 getHeaders() { + return null; + } + + @Override + public Map getParams() { + Map 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 userList = DBUtil.queryUserListByProduct(product); + + PromotionMail pe = new PromotionMail(); + + pe.sendEMails(emailDebug, userList, product); + } + + protected void sendEMails(boolean debug, List 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 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 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 users = new UserService().getUsers(); + //2.获得促销商品 + List 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 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 query(String sql){ + + List userList = new ArrayList(); + 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 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 getPromotionProducts(String path){ + List products = new ArrayList(); + 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 readFile(File file) throws IOException // @02C + { + List products = 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(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 getUsers(){ + String sendMailQuery = "Select name from subscriptions " + + "where send_mail=1 "; + return DBUtil.query(sendMailQuery); + } +} 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 0000000000..638b75e7eb Binary files /dev/null and "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" differ 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 plist = productService.getProductDescList(file); + sendEMails(mailDebug, configuration, plist); + } + + protected void sendEMails(boolean debug, MailServiceConfiguration configuration, List plist) + throws IOException { + System.out.println("开始发送邮件"); + if (plist != null) { + Iterator piterator = plist.iterator(); + while (piterator.hasNext()) { + Product product = piterator.next(); + List ulist = userService.getSendMailUser(product); + if (ulist != null) { + Iterator 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 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 getProductDescList(File file) throws IOException { + List plist = new ArrayList(); + 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 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 0000000000..c2d8aceb83 Binary files /dev/null and "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" differ diff --git a/students/986547781/README.md b/students/986547781/README.md new file mode 100644 index 0000000000..f568850ceb --- /dev/null +++ b/students/986547781/README.md @@ -0,0 +1,2 @@ +##第一次尝试 +##解决编码问题 \ No newline at end of file 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..e8037fb1c4 --- /dev/null +++ b/students/992331664/data-structure/data-structure/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java' + +repositories { + jcenter() +} + +dependencies { + compile 'org.slf4j:slf4j-api:1.7.21' + 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/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/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 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中的 配置,以及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 params = new HashMap(); + 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 params = new HashMap(); + 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 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ 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 prerequisites; + + public List 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 students = new ArrayList(); + + public int getMaxStudents() { + return maxStudents; + } + + public List 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 coursesAlreadyTaken = new ArrayList(); + + public List 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 prerequisites; + + public List 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 students = new ArrayList(); + + public List 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 coursesAlreadyTaken = new ArrayList(); + + public List 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 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..c17e6def49 --- /dev/null +++ b/students/992331664/data-structure/data-structure/src/main/java/com/coding/basic/array/ArrayUtil.java @@ -0,0 +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] + * + * @param origin + * @return + */ + 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} + * + * @param oldArray + * @return + */ + + 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] , 注意: 已经消除了重复 + * + * @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) { + 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, 则返回空数组 [] + * + * @param max + * @return + */ + 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] + * + * @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 + */ +public class CircleQueue { + + 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 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 { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node 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 oldlast = last; + last = new Node(); + 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 + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + 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 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 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() { + 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})")); + } + +} 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 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 OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map 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 parse(String expr) { + List 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 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 { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode 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 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 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 tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + root.left.right.right = new BinaryTreeNode(5); + tree = new BinarySearchTree(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 root= tree.getRoot(); + Assert.assertEquals(4, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode1() { + tree.remove(4); + BinaryTreeNode 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 root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } + + @Test + public void testLevelVisit() { + List 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 root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(4); + root.left.right = new BinaryTreeNode(1); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + + Assert.assertFalse(tree.isValid()); + } + @Test + public void testGetNodesBetween(){ + List 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 { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T 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/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 List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + 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 root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List 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/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); + } +} 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/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..9df4e1c77a --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/PromotionMail.java @@ -0,0 +1,91 @@ +package com.coderising.ood.srp; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import com.coderising.ood.srp.config.Configuration; +import com.coderising.ood.srp.config.ConnectionConfig; +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; +import com.coderising.ood.srp.service.SubscriptionsService; +import com.coderising.ood.srp.util.MailUtil; + +public class PromotionMail { + + protected SubscriptionsService subscriptionsService; + + protected ProductService productService; + + public PromotionMail(SubscriptionsService subscriptionsService, ProductService productService) { + this.subscriptionsService = subscriptionsService; + this.productService = productService; + } + + /** + * 发送促销邮件 + * + * @param file + * 促销产品文件 + * @param mailDebug + * @throws Exception + */ + public void sendPromotionMail(File file, boolean mailDebug) throws Exception { + + // 得到促销的产品 + List products = productService.doFindPromotionalProducts(file); + + // 得到促销产品的订阅信息 + List subscriptions = subscriptionsService.doFindByProducts(products); + + // 得到订阅人的邮箱和名称,邮箱内容 + List mails = getMails(subscriptions); + + // 发送邮箱 + sendEMails(new ConnectionConfig(new Configuration()), mails, mailDebug); + } + + // 得到发送的邮箱对象 + protected List getMails(List subscriptions) { + + List mails = new ArrayList(); + String subject = "您关注的产品降价了"; + + for (Subscriptions sub : subscriptions) { + String productDesc = sub.getProduct().getProductDesc(); + String message = "尊敬的 " + sub.getName() + ", 您关注的产品 " + productDesc + " 降价了,欢迎购买!"; + mails.add(new MailInfo(subject, message, sub.getEmail())); + } + return mails; + } + + // 发送邮件 + protected void sendEMails(ConnectionConfig config, List mails, boolean debug) { + if (mails == null) { + System.out.println("没有邮件需要发送"); + return; + } + System.out.println("开始发送邮件"); + Iterator iter = mails.iterator(); + while (iter.hasNext()) { + MailInfo 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 { + MailUtil.sendEmail(mail.getToAddress(), config.getFromAddress(), mail.getSubject(),mail.getMessage(), config.getAltSmtpHost(), debug); + + } catch (Exception e2) { + System.out.println("通过备用 SMTP服务器发送邮件失败: " + e2.getMessage()); + } + } + } + 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 new file mode 100644 index 0000000000..bbed122807 --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/Configuration.java @@ -0,0 +1,22 @@ +package com.coderising.ood.srp.config; +import java.util.HashMap; +import java.util.Map; + +public class Configuration { + + static Map configurations = new HashMap<>(); + static{ + configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com"); + configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com"); + configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com"); + } + /** + * 应该从配置文件读, 但是这里简化为直接从一个map 中去读 + * @param key + * @return + */ + public String getProperty(String key) { + return configurations.get(key); + } + +} diff --git a/students/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 new file mode 100644 index 0000000000..cadb23ed24 --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConfigurationKeys.java @@ -0,0 +1,10 @@ +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/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..531efe251d --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/config/ConnectionConfig.java @@ -0,0 +1,41 @@ +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/MailInfo.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java new file mode 100644 index 0000000000..2744e2fd1f --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/MailInfo.java @@ -0,0 +1,52 @@ +package com.coderising.ood.srp.model; + +/** + * 邮箱信息 + * + */ +public class MailInfo { + private String subject; + private String message; + private String toAddress; + + public MailInfo() { + super(); + } + + public MailInfo(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..fcfc5f7cf4 --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Product.java @@ -0,0 +1,36 @@ +package com.coderising.ood.srp.model; + +/** + * 产品信息 + */ +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..8a25fe19ed --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/model/Subscriptions.java @@ -0,0 +1,53 @@ +package com.coderising.ood.srp.model; + +/** + * 订阅信息,主要有订阅产品,订阅用户 + * + */ +public class Subscriptions { + + // name 和 email 应该存放在用户信息中,如叫订阅用户, + 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/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/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..aae01818f9 --- /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 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..c31c25c084 --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/service/SubscriptionsService.java @@ -0,0 +1,18 @@ +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 { + + /** + * 查询产品的订阅人 + * + * @param products + * 产品 + * @return 订阅信息 + */ + List doFindByProducts(List 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 doFindPromotionalProducts(File file) throws IOException { + + List products = new ArrayList(); + + 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 doFindByProducts(List products) { + + List 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 = new ArrayList(); + 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 new file mode 100644 index 0000000000..33bb5cfd43 --- /dev/null +++ b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/DBUtil.java @@ -0,0 +1,28 @@ +package com.coderising.ood.srp.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DBUtil { + + /** + * 应该从数据库读, 但是简化为直接生成。 + * + * @param sql + * @return + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + 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/util/MailUtil.java b/students/992331664/ood/ood/src/main/java/com/coderising/ood/srp/util/MailUtil.java new file mode 100644 index 0000000000..bb028c690c --- /dev/null +++ b/students/992331664/ood/ood/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/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); + } +}