diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/src/site/.gitkeep b/group09/41689722.eulerlcs/1.article/.gitkeep
similarity index 100%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/src/site/.gitkeep
rename to group09/41689722.eulerlcs/1.article/.gitkeep
diff --git a/group09/41689722.eulerlcs/2.code/.gitignore b/group09/41689722.eulerlcs/2.code/.gitignore
new file mode 100644
index 0000000000..c2be49c379
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/.gitignore
@@ -0,0 +1,6 @@
+.metadata/
+.recommenders/
+**/.settings/
+**/target/
+**/.classpath
+**/.project
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml b/group09/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
similarity index 51%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml
rename to group09/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
index a09edb357b..be065e6a95 100644
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/pom.xml
+++ b/group09/41689722.eulerlcs/2.code/jmr-01-aggregator/pom.xml
@@ -1,13 +1,16 @@
4.0.0
- com.eulerlcs.collection
- collection-aggregator
+ com.github.eulerlcs
+ jmr-01-aggregator
0.0.1-SNAPSHOT
pom
+ eulerlcs master java road aggregator
- ../collection-parent
- ../collection-lib
+ ../jmr-02-parent
+ ../jmr-11-challenge
+ ../jmr-61-170226-collection
+ ../jmr-61-170305-litestruts
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/resources/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep
similarity index 100%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/resources/.gitkeep
rename to group09/41689722.eulerlcs/2.code/jmr-01-aggregator/src/site/.gitkeep
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml b/group09/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
similarity index 75%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml
rename to group09/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
index 6f05e517e2..8e6a7752f7 100644
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/pom.xml
+++ b/group09/41689722.eulerlcs/2.code/jmr-02-parent/pom.xml
@@ -1,23 +1,44 @@
4.0.0
- com.eulerlcs.collection
- collection-parent
+ com.github.eulerlcs
+ jmr-02-parent
0.0.1-SNAPSHOT
pom
+ eulerlcs master java road parent
- 1.7.23
+ 1.7.24
4.12
2.17
1.8
1.8
-
+
+ commons-digester
+ commons-digester
+ 2.1
+
+
+ org.jdom
+ jdom2
+ 2.0.6
+
+
+ dom4j
+ dom4j
+ 1.6.1
+
+
+ org.projectlombok
+ lombok
+ 1.16.14
+ provided
+
org.slf4j
slf4j-api
@@ -34,10 +55,15 @@
${junit.version}
test
+
+ com.github.stefanbirkner
+ system-rules
+ 1.16.1
+ test
+
-
@@ -94,11 +120,6 @@
true
-
- org.apache.maven.plugins
- maven-checkstyle-plugin
- 2.17
-
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/resources/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep
similarity index 100%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/resources/.gitkeep
rename to group09/41689722.eulerlcs/2.code/jmr-02-parent/src/site/.gitkeep
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/CalculatorAdvanced.class b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/CalculatorAdvanced.class
new file mode 100644
index 0000000000..d1655401e6
Binary files /dev/null and b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/CalculatorAdvanced.class differ
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/CalculatorBasic.class b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/CalculatorBasic.class
new file mode 100644
index 0000000000..41c161a767
Binary files /dev/null and b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/CalculatorBasic.class differ
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/Sample.class b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/Sample.class
new file mode 100644
index 0000000000..640df1edc0
Binary files /dev/null and b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/classloader/com/github/eulerlcs/jmr/challenge/classloader/sample/Sample.class differ
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
new file mode 100644
index 0000000000..748019e106
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/data/xmlparser/hello.xml
@@ -0,0 +1,5 @@
+
+
+ a.txt
+ b.txt
+
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
new file mode 100644
index 0000000000..589a5f69ee
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/pom.xml
@@ -0,0 +1,48 @@
+
+ 4.0.0
+
+ com.github.eulerlcs
+ jmr-02-parent
+ 0.0.1-SNAPSHOT
+ ../jmr-02-parent/pom.xml
+
+ jmr-11-challenge
+ eulerlcs master java road challenge
+
+
+
+
+ commons-digester
+ commons-digester
+
+
+ org.jdom
+ jdom2
+
+
+ dom4j
+ dom4j
+
+
+ org.projectlombok
+ lombok
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+ junit
+ junit
+
+
+ com.github.stefanbirkner
+ system-rules
+
+
+
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/LoginAction.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/LoginAction.java
new file mode 100644
index 0000000000..dcdbe226ed
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/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/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/Struts.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/Struts.java
new file mode 100644
index 0000000000..85e2e22de3
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/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/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/StrutsTest.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/StrutsTest.java
new file mode 100644
index 0000000000..b8c81faf3c
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/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/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/View.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/View.java
new file mode 100644
index 0000000000..07df2a5dab
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/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/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/struts.xml b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/coderising/litestruts/struts.xml
new file mode 100644
index 0000000000..dd598a3664
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/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/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
new file mode 100644
index 0000000000..82c8b60d56
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/FileSystemClassLoader.java
@@ -0,0 +1,58 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class FileSystemClassLoader extends ClassLoader {
+
+ private String rootDir;
+
+ public FileSystemClassLoader(String rootDir) {
+ this.rootDir = rootDir;
+ }
+
+ @Override
+ protected Class> findClass(String name) throws ClassNotFoundException {
+ byte[] classData = getClassData(name);
+ if (classData == null) {
+ throw new ClassNotFoundException();
+ } else {
+ return defineClass(name, classData, 0, classData.length);
+ }
+ }
+
+ private byte[] getClassData(String className) {
+ String path = classNameToPath(className);
+ InputStream ins = null;
+ try {
+ ins = new FileInputStream(path);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int bufferSize = 4096;
+ byte[] buffer = new byte[bufferSize];
+ int bytesNumRead = 0;
+ while ((bytesNumRead = ins.read(buffer)) != -1) {
+ baos.write(buffer, 0, bytesNumRead);
+ }
+ return baos.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (ins != null) {
+ try {
+ ins.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private String classNameToPath(String className) {
+ return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
new file mode 100644
index 0000000000..697bf8065f
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/ICalculator.java
@@ -0,0 +1,5 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+public interface ICalculator extends Versioned {
+ String calculate(String expression);
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
new file mode 100644
index 0000000000..0241e92a5c
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/NetworkClassLoader.java
@@ -0,0 +1,48 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URL;
+
+public class NetworkClassLoader extends ClassLoader {
+
+ private String rootUrl;
+
+ public NetworkClassLoader(String rootUrl) {
+ this.rootUrl = rootUrl;
+ }
+
+ protected Class> findClass(String name) throws ClassNotFoundException {
+ byte[] classData = getClassData(name);
+ if (classData == null) {
+ throw new ClassNotFoundException();
+ }
+ else {
+ return defineClass(name, classData, 0, classData.length);
+ }
+ }
+
+ private byte[] getClassData(String className) {
+ String path = classNameToPath(className);
+ try {
+ URL url = new URL(path);
+ InputStream ins = url.openStream();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int bufferSize = 4096;
+ byte[] buffer = new byte[bufferSize];
+ int bytesNumRead = 0;
+ while ((bytesNumRead = ins.read(buffer)) != -1) {
+ baos.write(buffer, 0, bytesNumRead);
+ }
+ return baos.toByteArray();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private String classNameToPath(String className) {
+ return rootUrl + "/"
+ + className.replace('.', '/') + ".class";
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
new file mode 100644
index 0000000000..34dfacbbd1
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/core/Versioned.java
@@ -0,0 +1,5 @@
+package com.github.eulerlcs.jmr.challenge.classloader.core;
+
+public interface Versioned {
+ String getVersion();
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
new file mode 100644
index 0000000000..d19ee1dbe0
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/CalculatorTest.java
@@ -0,0 +1,24 @@
+package com.github.eulerlcs.jmr.challenge.classloader.driver;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
+import com.github.eulerlcs.jmr.challenge.classloader.core.NetworkClassLoader;
+
+public class CalculatorTest {
+
+ public static void main(String[] args) {
+ String url = "http://localhost:8080/ClassloaderTest/classes";
+ NetworkClassLoader ncl = new NetworkClassLoader(url);
+ String basicClassName = "com.example.CalculatorBasic";
+ String advancedClassName = "com.example.CalculatorAdvanced";
+ try {
+ Class> clazz = ncl.loadClass(basicClassName);
+ ICalculator calculator = (ICalculator) clazz.newInstance();
+ System.out.println(calculator.getVersion());
+ clazz = ncl.loadClass(advancedClassName);
+ calculator = (ICalculator) clazz.newInstance();
+ System.out.println(calculator.getVersion());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
new file mode 100644
index 0000000000..3a9226b8ca
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassIdentity.java
@@ -0,0 +1,36 @@
+package com.github.eulerlcs.jmr.challenge.classloader.driver;
+
+import java.io.File;
+import java.lang.reflect.Method;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.FileSystemClassLoader;
+
+public class ClassIdentity {
+
+ public static void main(String[] args) {
+ new ClassIdentity().testClassIdentity();
+ }
+
+ public void testClassIdentity() {
+ String userDir = System.getProperty("user.dir");
+ String classDataRootPath = userDir + File.separator + "data" + File.separator + "classloader";
+
+ FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
+ FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
+ String className = "com.github.eulerlcs.jmr.challenge.classloader.sample.Sample";
+
+ try {
+ Class> class1 = fscl1.loadClass(className);
+ Object obj1 = class1.newInstance();
+
+ Class> class2 = fscl2.loadClass(className);
+ Object obj2 = class2.newInstance();
+
+ Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class);
+
+ setSampleMethod.invoke(obj1, obj2);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
new file mode 100644
index 0000000000..38916b6db5
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/driver/ClassLoaderTree.java
@@ -0,0 +1,12 @@
+package com.github.eulerlcs.jmr.challenge.classloader.driver;
+
+public class ClassLoaderTree {
+
+ public static void main(String[] args) {
+ ClassLoader loader = ClassLoaderTree.class.getClassLoader();
+ while (loader != null) {
+ System.out.println(loader.toString());
+ loader = loader.getParent();
+ }
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
new file mode 100644
index 0000000000..d35a4ee992
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * download from ibm developerworks
+ *
+ * @see https://www.ibm.com/developerworks/cn/java/j-lo-classloader/
+ */
+package com.github.eulerlcs.jmr.challenge.classloader;
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
new file mode 100644
index 0000000000..9076a4f4c8
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorAdvanced.java
@@ -0,0 +1,15 @@
+package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
+
+public class CalculatorAdvanced implements ICalculator {
+
+ public String calculate(String expression) {
+ return "Result is " + expression;
+ }
+
+ public String getVersion() {
+ return "2.0";
+ }
+
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
new file mode 100644
index 0000000000..d5f7b054dd
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/CalculatorBasic.java
@@ -0,0 +1,15 @@
+package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
+
+import com.github.eulerlcs.jmr.challenge.classloader.core.ICalculator;
+
+public class CalculatorBasic implements ICalculator {
+
+ public String calculate(String expression) {
+ return expression;
+ }
+
+ public String getVersion() {
+ return "1.0";
+ }
+
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
new file mode 100644
index 0000000000..c67a7278e8
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/classloader/sampleRename/Sample.java
@@ -0,0 +1,10 @@
+package com.github.eulerlcs.jmr.challenge.classloader.sampleRename;
+
+public class Sample {
+ @SuppressWarnings("unused")
+ private Sample instance;
+
+ public void setSample(Object instance) {
+ this.instance = (Sample) instance;
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
new file mode 100644
index 0000000000..2afd5b2074
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExit.java
@@ -0,0 +1,13 @@
+package com.github.eulerlcs.jmr.challenge.systemrules;
+
+public class AppWithExit {
+ public static String message;
+
+ public static void doSomethingAndExit() {
+ message = "exit ...";
+ System.exit(1);
+ }
+
+ public static void doNothing() {
+ }
+}
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
new file mode 100644
index 0000000000..1710e69d47
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/systemrules/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * copy from http://stefanbirkner.github.io/system-rules/index.html
+ */
+
+package com.github.eulerlcs.jmr.challenge.systemrules;
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
new file mode 100644
index 0000000000..3f58d74c7f
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloDigester.java
@@ -0,0 +1,17 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.core;
+
+import org.apache.commons.digester.Digester;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.Hello;
+
+public class HelloDigester {
+ public static Digester newInstance() {
+ Digester d = new Digester();
+
+ d.addObjectCreate("files", Hello.class);
+ d.addSetProperties("files");
+ d.addRuleSet(new HelloFileRulerSet("files/"));
+
+ return d;
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
new file mode 100644
index 0000000000..3d62c8c93e
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/core/HelloFileRulerSet.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.core;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.RuleSetBase;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.HelloFile;
+
+final class HelloFileRulerSet extends RuleSetBase {
+ protected String prefix = null;
+
+ public HelloFileRulerSet() {
+ this("");
+ }
+
+ public HelloFileRulerSet(String prefix) {
+ super();
+ this.namespaceURI = null;
+ this.prefix = prefix;
+ }
+
+ @Override
+ public void addRuleInstances(Digester digester) {
+ digester.addObjectCreate(prefix + "file", HelloFile.class);
+ digester.addSetProperties(prefix + "file", "dir", "path");
+ digester.addBeanPropertySetter(prefix + "file", "name");
+ digester.addSetNext(prefix + "file", "addFile");
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
new file mode 100644
index 0000000000..59a2987909
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/driver/Driver.java
@@ -0,0 +1,28 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.driver;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.digester.Digester;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.core.HelloDigester;
+import com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity.Hello;
+
+public class Driver {
+ private final static Logger log = LoggerFactory.getLogger(Driver.class);
+
+ public static void main(String[] args) {
+ Digester d = HelloDigester.newInstance();
+
+ try {
+ File file = new File("data//xmlparser", "hello.xml");
+ Hello helloEntity = (Hello) d.parse(file);
+ log.debug("hello.value=[{}]", helloEntity.getValue());
+ } catch (IOException | SAXException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
new file mode 100644
index 0000000000..415dbef23a
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/Hello.java
@@ -0,0 +1,19 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class Hello {
+ private String project;
+ private String value;
+ private List files = new ArrayList<>();
+
+ public void addFile(HelloFile file) {
+ files.add(file);
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
new file mode 100644
index 0000000000..2892a3058e
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/digester/entity/HelloFile.java
@@ -0,0 +1,11 @@
+package com.github.eulerlcs.jmr.challenge.xmlparser.digester.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class HelloFile {
+ private String path;
+ private String name;
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
new file mode 100644
index 0000000000..4f7a71c4bc
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/java/com/github/eulerlcs/jmr/challenge/xmlparser/package-info.java
@@ -0,0 +1,13 @@
+/**
+ * 各种xml库
+ *
+ * - apache digester
+ *
- dom
+ *
- dom4j
+ *
- ldom
+ *
- jaxb
+ *
- sax
+ *
+ */
+
+package com.github.eulerlcs.jmr.challenge.xmlparser;
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/src/site/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep
similarity index 100%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/src/site/.gitkeep
rename to group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/.gitkeep
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
new file mode 100644
index 0000000000..c849302200
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/java/com/github/eulerlcs/jmr/challenge/systemrules/AppWithExitTest.java
@@ -0,0 +1,51 @@
+/* copy from http://stefanbirkner.github.io/system-rules/index.html */
+
+package com.github.eulerlcs.jmr.challenge.systemrules;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.contrib.java.lang.system.Assertion;
+import org.junit.contrib.java.lang.system.ExpectedSystemExit;
+
+public class AppWithExitTest {
+ @Rule
+ public final ExpectedSystemExit exit = ExpectedSystemExit.none();
+
+ @Test
+ public void exits() {
+ exit.expectSystemExit();
+ AppWithExit.doSomethingAndExit();
+ }
+
+ @Test
+ public void exitsWithStatusCode1() {
+ exit.expectSystemExitWithStatus(1);
+ AppWithExit.doSomethingAndExit();
+ }
+
+ @Test
+ public void writesMessage() {
+ exit.expectSystemExitWithStatus(1);
+ exit.checkAssertionAfterwards(new Assertion() {
+ @Override
+ public void checkAssertion() {
+ assertEquals("exit ...", AppWithExit.message);
+ }
+ });
+ AppWithExit.doSomethingAndExit();
+ }
+
+ @Test
+ public void systemExitWithStatusCode1() {
+ exit.expectSystemExitWithStatus(1);
+ AppWithExit.doSomethingAndExit();
+ }
+
+ @Test
+ public void noSystemExit() {
+ AppWithExit.doNothing();
+ // passes
+ }
+}
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-11-challenge/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/pom.xml
similarity index 71%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml
rename to group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/pom.xml
index 6d1654e23a..90b5cc3818 100644
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/pom.xml
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/pom.xml
@@ -2,13 +2,13 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.eulerlcs.collection
- collection-parent
+ com.github.eulerlcs
+ jmr-02-parent
0.0.1-SNAPSHOT
- ../collection-parent/pom.xml
+ ../jmr-02-parent/pom.xml
- collection-lib
-
+ jmr-61-170226-collection
+ eulerlcs master java road collection
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/java/com/github/eulerlcs/jmr/collection/core/ArrayList.java
similarity index 97%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java
rename to group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/java/com/github/eulerlcs/jmr/collection/core/ArrayList.java
index 219919719b..1c039b8c62 100644
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/main/java/com/eulerlcs/collection/ArrayList.java
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/java/com/github/eulerlcs/jmr/collection/core/ArrayList.java
@@ -1,7 +1,7 @@
/**
* 90% or more copy from jdk
*/
-package com.eulerlcs.collection;
+package com.github.eulerlcs.jmr.collection.core;
import java.util.Arrays;
import java.util.Collection;
@@ -15,7 +15,7 @@
import java.util.function.Consumer;
public class ArrayList implements List, RandomAccess {
- private static final int MAXQARRAYQSIZE = 1 << 10;
+ private static final int MAX_ARRAY_SIZE = 1 << 10;
private transient Object[] elementData = new Object[0];
private int size;
private transient int modCount = 0;
@@ -267,15 +267,15 @@ private void ensureExplicitCapacity(int minCapacity) {
if (elementData.length > minCapacity) {
return;
- } else if (minCapacity > MAXQARRAYQSIZE) {
+ } else if (minCapacity > MAX_ARRAY_SIZE) {
throw new OutOfMemoryError();
}
int oldCapacity = elementData.length;
int newCapacity = oldCapacity == 0 ? 10 : (oldCapacity + (oldCapacity >> 1));
- if (newCapacity > MAXQARRAYQSIZE) {
- newCapacity = MAXQARRAYQSIZE;
+ if (newCapacity > MAX_ARRAY_SIZE) {
+ newCapacity = MAX_ARRAY_SIZE;
}
elementData = Arrays.copyOf(elementData, newCapacity);
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/resources/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/resources/log4j.xml b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/test/java/com/github/eulerlcs/jmr/collection/core/TestArrayList.java
similarity index 86%
rename from group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java
rename to group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/test/java/com/github/eulerlcs/jmr/collection/core/TestArrayList.java
index b66dd278e3..96e1049d73 100644
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/src/test/java/com/eulerlcs/collection/TestArrayList.java
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/test/java/com/github/eulerlcs/jmr/collection/core/TestArrayList.java
@@ -1,4 +1,4 @@
-package com.eulerlcs.collection;
+package com.github.eulerlcs.jmr.collection.core;
import java.util.List;
@@ -9,6 +9,8 @@
import org.junit.BeforeClass;
import org.junit.Test;
+import com.github.eulerlcs.jmr.collection.core.ArrayList;
+
public class TestArrayList {
@BeforeClass
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/test/resources/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-61-170226-collection/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/data/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/data/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/pom.xml b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/pom.xml
new file mode 100644
index 0000000000..6ce14ac574
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+
+ com.github.eulerlcs
+ jmr-02-parent
+ 0.0.1-SNAPSHOT
+ ../jmr-02-parent/pom.xml
+
+ jmr-61-170305-litestruts
+ eulerlcs master java road lite struts
+
+
+
+ commons-digester
+ commons-digester
+
+
+ org.projectlombok
+ lombok
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+ junit
+ junit
+
+
+ com.github.stefanbirkner
+ system-rules
+
+
+
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/util/ArrayUtil.java b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/util/ArrayUtil.java
new file mode 100644
index 0000000000..636d0b1789
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/util/ArrayUtil.java
@@ -0,0 +1,279 @@
+/**
+ * 问题点: 没写注释,代码比较难读。尤其 merge方法。
+ */
+package com.github.eulerlcs.jmr.litestruts.util;
+
+import java.util.Arrays;
+
+public class ArrayUtil {
+
+ /**
+ * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a =
+ * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7]
+ *
+ * @param origin
+ * @return
+ */
+ public static void reverseArray(int[] origin) {
+ if (origin == null || origin.length < 2) {
+ return;
+ }
+
+ for (int head = 0, tail = origin.length - 1; head < tail; head++, tail--) {
+ origin[head] = origin[head] ^ origin[tail];
+ origin[tail] = origin[head] ^ origin[tail];
+ origin[head] = origin[head] ^ origin[tail];
+ }
+ }
+
+ /**
+ * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
+ * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5}
+ *
+ * @param oldArray
+ * @return
+ */
+
+ public static int[] removeZero(int[] oldArray) {
+ if (oldArray == null) {
+ return new int[0];
+ }
+
+ int count = 0;
+ for (int i = 0; i < oldArray.length; i++) {
+ if (oldArray[i] != 0)
+ count++;
+ }
+
+ int[] newArray = new int[count];
+ int newIndex = 0;
+ for (int i = 0; i < oldArray.length; i++) {
+ if (oldArray[i] != 0) {
+ newArray[newIndex] = oldArray[i];
+ newIndex++;
+ }
+ }
+
+ return newArray;
+ }
+
+ /**
+ * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 =
+ * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复
+ *
+ * @param array1
+ * @param array2
+ * @return
+ */
+
+ public static int[] merge(int[] array1, int[] array2) {
+ if (array1 == null || array1.length == 0) {
+ if (array2 == null || array2.length == 0) {
+ return new int[0];
+ } else {
+ return Arrays.copyOf(array2, array2.length);
+ }
+ } else if (array2 == null || array2.length == 0) {
+ return Arrays.copyOf(array1, array1.length);
+ }
+
+ int[] result = new int[array1.length + array2.length];
+ int idxResult = 0;
+ int idx1 = 0;
+ int idx2 = 0;
+
+ for (; idx1 < array1.length; idx1++) {
+ if (array1[idx1] < array2[idx2]) {
+ result[idxResult] = array1[idx1];
+ idxResult++;
+ } else if (array1[idx1] == array2[idx2]) {
+ result[idxResult] = array1[idx1];
+ idxResult++;
+ idx2++;
+ } else {
+ for (; idx2 < array2.length; idx2++) {
+ if (array2[idx2] < array1[idx1]) {
+ result[idxResult] = array2[idx2];
+ idxResult++;
+ } else {
+ if (array2[idx2] == array1[idx1]) {
+ idx2++;
+ }
+
+ break;
+ }
+ }
+
+ if (idx2 == array2.length) {
+ break;
+ } else {
+ idx1--;
+ }
+ }
+ }
+
+ if (idx1 < array1.length) {
+ System.arraycopy(array1, idx1, result, idxResult, array1.length - idx1);
+ idxResult += array1.length - idx1;
+ }
+
+ if (idx2 < array2.length) {
+ System.arraycopy(array2, idx2, result, idxResult, array2.length - idx2);
+ idxResult += array2.length - idx2;
+ }
+
+ result = removeZero(result);
+ return result;
+ }
+
+ /**
+ * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size
+ * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为
+ * [2,3,6,0,0,0]
+ *
+ * @param oldArray
+ * @param increaseCapacity
+ * @return
+ */
+ public static int[] grow(int[] oldArray, int increaseCapacity) {
+ if (oldArray == null || increaseCapacity < 0) {
+ return new int[0];
+ }
+
+ int newCapacity = oldArray.length + increaseCapacity;
+
+ int[] newArray = Arrays.copyOf(oldArray, newCapacity);
+
+ return newArray;
+ }
+
+ /**
+ * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 ,
+ * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 []
+ *
+ * @param max
+ * @return
+ */
+ public static int[] fibonacci(int max) {
+ if (max <= 1) {
+ return new int[0];
+ }
+
+ int[] result = new int[10];
+ result[0] = 1;
+ result[1] = 1;
+ int idx = 2;
+ int sum = 2;
+ while (sum < max) {
+ if (idx >= result.length) {
+ grow(result, result.length * 2);
+ }
+
+ result[idx] = sum;
+ sum = result[idx - 1] + result[idx];
+ idx++;
+ }
+
+ result = removeZero(result);
+ return result;
+ }
+
+ /**
+ * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19]
+ *
+ * @param max
+ * @return
+ */
+ public static int[] getPrimes(int max) {
+ if (max < 2) {
+ return new int[0];
+ }
+
+ int[] all = new int[max];
+ int index = 0;
+ int temp = 0;
+
+ for (int i = 0; i < max; i++) {
+ all[i] = i;
+ }
+
+ all[0] = 0;
+ all[1] = 0;
+ index = 2;
+
+ // 筛法
+ loops: for (; index < max;) {
+ for (int i = 2;; i++) {
+ temp = index * i;
+ if (temp >= max) {
+ break;
+ }
+ all[temp] = 0;
+ }
+
+ for (int i = index + 1; i < max; i++) {
+ if (all[i] != 0) {
+ index = i;
+ continue loops;
+ }
+ }
+
+ break;
+ }
+
+ int[] result = removeZero(all);
+ return result;
+ }
+
+ /**
+ * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数
+ *
+ * @param max
+ * @return
+ */
+ public static long[] getPerfectNumbers(long max) {
+ long[] perfect = new long[49];// 到2016年1月为止,共发现了49个完全数
+ int idx = 0;
+ long sum = 1;
+ long sqrt = 0;
+
+ for (long n = 2; n < max; n++) {
+ sum = 1;
+ sqrt = (long) Math.sqrt(n);
+ for (long i = 2; i <= sqrt; i++) {
+ if (n % i == 0)
+ sum += i + n / i;
+ }
+
+ if (sum == n) {
+ perfect[idx] = n;
+ idx++;
+ }
+ }
+
+ // return removeZero(perfect);
+ return perfect;
+ }
+
+ /**
+ * 用separator 把数组 array给连接起来 例如array= [3,8,9], separator = "-" 则返回值为"3-8-9"
+ *
+ * @param array
+ * @param separator
+ * @return
+ */
+ public static String join(int[] array, String separator) {
+ if (array == null || array.length == 0) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+
+ for (int i = 0; i < array.length - 1; i++) {
+ sb.append(array[i] + separator);
+ }
+ sb.append(String.valueOf(array[array.length - 1]));
+
+ return sb.toString();
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/util/package-info.java b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/util/package-info.java
new file mode 100644
index 0000000000..6797c45b67
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/java/com/github/eulerlcs/jmr/litestruts/util/package-info.java
@@ -0,0 +1,4 @@
+/**
+ *
+ */
+package com.github.eulerlcs.jmr.litestruts.util;
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/resources/log4j.xml b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/resources/log4j.xml
new file mode 100644
index 0000000000..831b8d9ce3
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/main/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/java/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/java/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/util/ArrayUtilTest.java b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/util/ArrayUtilTest.java
new file mode 100644
index 0000000000..b2957d01b7
--- /dev/null
+++ b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/java/com/github/eulerlcs/jmr/litestruts/util/ArrayUtilTest.java
@@ -0,0 +1,266 @@
+/**
+ * 问题点: 没有全分支覆盖。只简单的测了关键或者关心的case
+ */
+package com.github.eulerlcs.jmr.litestruts.util;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ArrayUtilTest {
+
+ @Test
+ public void reverseArray_null() {
+ int[] actuals = null;
+ int[] expecteds = null;
+
+ ArrayUtil.reverseArray(actuals);
+
+ assertArrayEquals(actuals, expecteds);
+ }
+
+ @Test
+ public void reverseArray_0() {
+ int[] actuals = {};
+ int[] expecteds = {};
+
+ ArrayUtil.reverseArray(actuals);
+
+ assertArrayEquals(actuals, expecteds);
+ }
+
+ @Test
+ public void reverseArray_1() {
+ int[] actuals = { 2 };
+ int[] expecteds = { 2 };
+
+ ArrayUtil.reverseArray(actuals);
+
+ assertArrayEquals(actuals, expecteds);
+ }
+
+ @Test
+ public void reverseArray_2() {
+ int[] actuals = { 7, 9 };
+ int[] expecteds = { 9, 7 };
+
+ ArrayUtil.reverseArray(actuals);
+
+ assertArrayEquals(actuals, expecteds);
+ }
+
+ @Test
+ public void reverseArray_4() {
+ int[] actuals = { 7, 9, 30, 3 };
+ int[] expecteds = { 3, 30, 9, 7 };
+
+ ArrayUtil.reverseArray(actuals);
+
+ assertArrayEquals(actuals, expecteds);
+ }
+
+ @Test
+ public void reverseArray_5() {
+ int[] actuals = { 7, 9, 30, 3, 4 };
+ int[] expecteds = { 4, 3, 30, 9, 7 };
+
+ ArrayUtil.reverseArray(actuals);
+
+ assertArrayEquals(actuals, expecteds);
+ }
+
+ @Test
+ public void removeZero_null() {
+ int oldArr[] = null;
+ int[] expecteds = {};
+
+ int[] newArr = ArrayUtil.removeZero(oldArr);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void removeZero_0() {
+ int oldArr[] = {};
+ int[] expecteds = {};
+
+ int[] newArr = ArrayUtil.removeZero(oldArr);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void removeZero_1() {
+ int oldArr[] = { 0 };
+ int[] expecteds = {};
+
+ int[] newArr = ArrayUtil.removeZero(oldArr);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void removeZero_2() {
+ int oldArr[] = { 3, 5 };
+ int[] expecteds = { 3, 5 };
+
+ int[] newArr = ArrayUtil.removeZero(oldArr);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void removeZero_3() {
+ int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 };
+ int[] expecteds = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 };
+
+ int[] newArr = ArrayUtil.removeZero(oldArr);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void merge_1() {
+ int[] a1 = { 3, 5, 7, 8 };
+ int[] a2 = { 4, 5, 6, 7 };
+ int[] expecteds = { 3, 4, 5, 6, 7, 8 };
+
+ int[] newArr = ArrayUtil.merge(a1, a2);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void merge_2() {
+ int[] a1 = { 4, 5, 6, 7 };
+ int[] a2 = { 3, 5, 7, 8 };
+ int[] expecteds = { 3, 4, 5, 6, 7, 8 };
+
+ int[] newArr = ArrayUtil.merge(a1, a2);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void grow_1() {
+ int[] oldArray = { 2, 3, 6 };
+ int increaseCapacity = 3;
+ int[] expecteds = { 2, 3, 6, 0, 0, 0 };
+
+ int[] newArr = ArrayUtil.grow(oldArray, increaseCapacity);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void fibonacci_1() {
+ int max = 1;
+ int[] expecteds = {};
+
+ int[] newArr = ArrayUtil.fibonacci(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void fibonacci_2() {
+ int max = 2;
+ int[] expecteds = { 1, 1 };
+
+ int[] newArr = ArrayUtil.fibonacci(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void fibonacci_15() {
+ int max = 15;
+ int[] expecteds = { 1, 1, 2, 3, 5, 8, 13 };
+
+ int[] newArr = ArrayUtil.fibonacci(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPrimes_1() {
+ int max = 1;
+ int[] expecteds = {};
+
+ int[] newArr = ArrayUtil.getPrimes(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPrimes_2() {
+ int max = 2;
+ int[] expecteds = {};
+
+ int[] newArr = ArrayUtil.getPrimes(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPrimes_3() {
+ int max = 3;
+ int[] expecteds = { 2 };
+
+ int[] newArr = ArrayUtil.getPrimes(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPrimes_4() {
+ int max = 4;
+ int[] expecteds = { 2, 3 };
+
+ int[] newArr = ArrayUtil.getPrimes(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPrimes_23() {
+ int max = 23;
+ int[] expecteds = { 2, 3, 5, 7, 11, 13, 17, 19 };
+
+ int[] newArr = ArrayUtil.getPrimes(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPrimes_24() {
+ int max = 24;
+ int[] expecteds = { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
+
+ int[] newArr = ArrayUtil.getPrimes(max);
+
+ assertArrayEquals(newArr, expecteds);
+ }
+
+ @Test
+ public void getPerfectNumbers_max() {
+ long max = Long.MAX_VALUE;
+ max = 100000;
+ long[] expecteds = { 6, 28, 496, 8128, 33550336, 8589869056L, 137438691328L, 2305843008139952128L };
+
+ long[] newArr = ArrayUtil.getPerfectNumbers(max);
+
+ assertEquals(newArr[3], expecteds[3]);
+ }
+
+ @Test
+ public void join_0() {
+ int[] array = { 3, 8, 9 };
+ String separator = "-";
+ String expected = "3-8-9";
+
+ String actual = ArrayUtil.join(array, separator);
+ assertEquals(expected, actual);
+ }
+}
diff --git a/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/resources/.gitkeep b/group09/41689722.eulerlcs/2.code/jmr-61-170305-litestruts/src/test/resources/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore
deleted file mode 100644
index e10e727be5..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/.metadata/
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project
deleted file mode 100644
index 47cffea382..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- collection-aggregator
-
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-aggregator/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath
deleted file mode 100644
index 5131f04311..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.classpath
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore
deleted file mode 100644
index b83d22266a..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project
deleted file mode 100644
index 69766f62bc..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- collection-lib
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 714351aec1..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-lib/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project
deleted file mode 100644
index 3467a254de..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- collection-parent
-
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs b/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f1cb..0000000000
--- a/group09/41689722.eulerlcs/20170226-eulerlcs-collection/collection-parent/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1