diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 03dcbc18..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-language: java
-script:
-- mvn test
-- mvn test -Pfunctional-test -Dselenium.driver=firefox
-env: MAVEN_OPTS="-XX:MaxPermSize=128m"
-addons:
- firefox: "26.0"
-before_install:
- - "export DISPLAY=:99.0"
- - "sh -e /etc/init.d/xvfb start"
diff --git a/examples/boot-api/refresh-db.sh b/examples/boot-api/refresh-db.sh
index 4cfbee44..d2b7a9b0 100755
--- a/examples/boot-api/refresh-db.sh
+++ b/examples/boot-api/refresh-db.sh
@@ -1,3 +1,5 @@
#!/bin/bash
+echo "init db for production mode"
+
mvn antrun:run -Prefresh-db
\ No newline at end of file
diff --git a/examples/boot-api/src/main/java/org/springside/examples/bootapi/service/AccountService.java b/examples/boot-api/src/main/java/org/springside/examples/bootapi/service/AccountService.java
index 5cd10303..39fcd2e8 100644
--- a/examples/boot-api/src/main/java/org/springside/examples/bootapi/service/AccountService.java
+++ b/examples/boot-api/src/main/java/org/springside/examples/bootapi/service/AccountService.java
@@ -17,7 +17,7 @@ import org.springside.examples.bootapi.domain.Account;
import org.springside.examples.bootapi.repository.AccountDao;
import org.springside.modules.utils.Digests;
import org.springside.modules.utils.Encodes;
-import org.springside.modules.utils.Identities;
+import org.springside.modules.utils.Ids;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
@@ -60,7 +60,7 @@ public class AccountService {
throw new RestException("Password wrong", HttpStatus.UNAUTHORIZED);
}
- String token = Identities.uuid2();
+ String token = Ids.uuid2();
loginUsers.put(token, account);
counterService.increment("loginUser");
return token;
diff --git a/examples/boot-api/src/main/resources/.h2.server.properties b/examples/boot-api/src/main/resources/.h2.server.properties
index c836fbae..3eb9427c 100644
--- a/examples/boot-api/src/main/resources/.h2.server.properties
+++ b/examples/boot-api/src/main/resources/.h2.server.properties
@@ -2,5 +2,5 @@
#Sat Nov 07 10:12:13 CST 2015
0=TestDB(Embedded)|org.h2.Driver|jdbc\:h2\:mem\:testdb|sa
webAllowOthers=false
-webPort=8082
+webPort=8090
webSSL=false
diff --git a/examples/boot-api/start.sh b/examples/boot-api/start.sh
index d33e7e03..a2e60850 100755
--- a/examples/boot-api/start.sh
+++ b/examples/boot-api/start.sh
@@ -1,5 +1,7 @@
#!/bin/bash
+echo "start applicaiton in production mode"
+
java -Xmx1024m -XX:MaxPermSize=128M -Djava.security.egd=file:/dev/./urandom -jar target/boot-api-5.0.0-SNAPSHOT.war --spring.profiles.active=prod
#set the server port
diff --git a/examples/pom.xml b/examples/pom.xml
index b0285bc2..92abe46b 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -15,6 +15,6 @@
boot-api
- boot-advanced-api
+ boot-showcase
\ No newline at end of file
diff --git a/modules/utils/src/main/java/org/springside/modules/utils/Identities.java b/modules/utils/src/main/java/org/springside/modules/utils/Ids.java
similarity index 97%
rename from modules/utils/src/main/java/org/springside/modules/utils/Identities.java
rename to modules/utils/src/main/java/org/springside/modules/utils/Ids.java
index 921d6de4..0ff8eda6 100644
--- a/modules/utils/src/main/java/org/springside/modules/utils/Identities.java
+++ b/modules/utils/src/main/java/org/springside/modules/utils/Ids.java
@@ -13,7 +13,7 @@ import java.util.UUID;
*
* @author calvin
*/
-public class Identities {
+public class Ids {
private static SecureRandom random = new SecureRandom();
diff --git a/modules/utils/src/main/java/org/springside/modules/utils/Reflections.java b/modules/utils/src/main/java/org/springside/modules/utils/Reflections.java
index 315e991d..92cc4968 100644
--- a/modules/utils/src/main/java/org/springside/modules/utils/Reflections.java
+++ b/modules/utils/src/main/java/org/springside/modules/utils/Reflections.java
@@ -86,9 +86,7 @@ public class Reflections {
}
/**
- * 直接调用对象方法, 无视private/protected修饰符.
- * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
- * 同时匹配方法名+参数类型,
+ * 直接调用对象方法, 无视private/protected修饰符. 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. 同时匹配方法名+参数类型,
*/
public static Object invokeMethod(final Object obj, final String methodName, final Class>[] parameterTypes,
final Object[] args) {
@@ -105,8 +103,7 @@ public class Reflections {
}
/**
- * 直接调用对象方法, 无视private/protected修饰符,
- * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
+ * 直接调用对象方法, 无视private/protected修饰符, 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
* 只匹配函数名,如果有多个同名函数调用第一个。
*/
public static Object invokeMethodByName(final Object obj, final String methodName, final Object[] args) {
@@ -130,7 +127,8 @@ public class Reflections {
public static Field getAccessibleField(final Object obj, final String fieldName) {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(fieldName, "fieldName can't be blank");
- for (Class> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
+ for (Class> superClass = obj.getClass(); superClass != Object.class; superClass = superClass
+ .getSuperclass()) {
try {
Field field = superClass.getDeclaredField(fieldName);
makeAccessible(field);
@@ -143,9 +141,7 @@ public class Reflections {
}
/**
- * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
- * 如向上转型到Object仍无法找到, 返回null.
- * 匹配函数名+参数类型。
+ * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. 匹配函数名+参数类型。
*
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
@@ -154,7 +150,8 @@ public class Reflections {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(methodName, "methodName can't be blank");
- for (Class> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
+ for (Class> searchType = obj.getClass(); searchType != Object.class; searchType = searchType
+ .getSuperclass()) {
try {
Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
makeAccessible(method);
@@ -167,9 +164,7 @@ public class Reflections {
}
/**
- * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
- * 如向上转型到Object仍无法找到, 返回null.
- * 只匹配函数名。
+ * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. 如向上转型到Object仍无法找到, 返回null. 只匹配函数名。
*
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
@@ -177,7 +172,8 @@ public class Reflections {
Validate.notNull(obj, "object can't be null");
Validate.notBlank(methodName, "methodName can't be blank");
- for (Class> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) {
+ for (Class> searchType = obj.getClass(); searchType != Object.class; searchType = searchType
+ .getSuperclass()) {
Method[] methods = searchType.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().equals(methodName)) {
@@ -203,17 +199,14 @@ public class Reflections {
* 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public static void makeAccessible(Field field) {
- if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier
- .isFinal(field.getModifiers())) && !field.isAccessible()) {
+ if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())
+ || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
field.setAccessible(true);
}
}
/**
- * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
- * 如无法找到, 返回Object.class.
- * eg.
- * public UserDao extends HibernateDao
+ * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 如无法找到, 返回Object.class. eg. public UserDao extends HibernateDao
*
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be determined
@@ -223,8 +216,7 @@ public class Reflections {
}
/**
- * 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
- * 如无法找到, 返回Object.class.
+ * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
*
* 如public UserDao extends HibernateDao
*
@@ -256,6 +248,9 @@ public class Reflections {
return (Class) params[index];
}
+ /**
+ * 获取CGLib处理过后的实体的原类.
+ */
public static Class> getUserClass(Object instance) {
Validate.notNull(instance, "Instance must not be null");
Class clazz = instance.getClass();
diff --git a/modules/utils/src/main/java/org/springside/modules/utils/Threads.java b/modules/utils/src/main/java/org/springside/modules/utils/Threads.java
index a958531d..5851435c 100644
--- a/modules/utils/src/main/java/org/springside/modules/utils/Threads.java
+++ b/modules/utils/src/main/java/org/springside/modules/utils/Threads.java
@@ -44,19 +44,31 @@ public class Threads {
}
/**
- * 创建ThreadFactory,使得创建的线程有自己的名字而不是默认的"pool-x-thread-y",
+ * 创建ThreadFactory,使得创建的线程有自己的名字而不是默认的"pool-x-thread-y"
+ *
* 在用threaddump查看线程时特别有用。 格式如"mythread-%d",使用了Guava的工具类
*/
public static ThreadFactory buildJobFactory(String nameFormat) {
return new ThreadFactoryBuilder().setNameFormat(nameFormat).build();
}
+ /**
+ * 创建ThreadFactory,使得创建的线程有自己的名字而不是默认的"pool-x-thread-y"
+ *
+ * 在用threaddump查看线程时特别有用。 格式如"mythread-%d",使用了Guava的工具类
+ */
+ public static ThreadFactory buildJobFactory(String nameFormat, boolean daemon) {
+ return new ThreadFactoryBuilder().setNameFormat(nameFormat).setDaemon(daemon).build();
+ }
+
/**
* 按照ExecutorService JavaDoc示例代码编写的Graceful Shutdown方法.
+ *
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
- * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
- * 如果仍然超時,則強制退出.
- * 另对在shutdown时线程本身被调用中断做了处理.
+ *
+ * 如果超时, 则调用shutdownNow,取消在workQueue中Pending的任务,并中断所有阻塞函数.
+ *
+ * 如果仍然超時,則強制退出. 另对在shutdown时线程本身被调用中断做了处理.
*/
public static void gracefulShutdown(ExecutorService pool, int shutdownTimeout, int shutdownNowTimeout,
TimeUnit timeUnit) {
@@ -79,7 +91,9 @@ public class Threads {
}
/**
- * 直接调用shutdownNow的方法, 有timeout控制.取消在workQueue中Pending的任务,并中断所有阻塞函数.
+ * 直接调用shutdownNow的方法, 有timeout控制.
+ *
+ * 取消在workQueue中Pending的任务,并中断所有阻塞函数.
*/
public static void normalShutdown(ExecutorService pool, int timeout, TimeUnit timeUnit) {
try {
diff --git a/modules/utils/src/test/java/org/springside/modules/utils/IdentitiesTest.java b/modules/utils/src/test/java/org/springside/modules/utils/IdentitiesTest.java
index 18636779..10bf4049 100644
--- a/modules/utils/src/test/java/org/springside/modules/utils/IdentitiesTest.java
+++ b/modules/utils/src/test/java/org/springside/modules/utils/IdentitiesTest.java
@@ -11,9 +11,9 @@ public class IdentitiesTest {
@Test
public void demo() {
- System.out.println("uuid: " + Identities.uuid());
- System.out.println("uuid2:" + Identities.uuid2());
- System.out.println("randomLong: " + Identities.randomLong());
- System.out.println("randomBase62:" + Identities.randomBase62(7));
+ System.out.println("uuid: " + Ids.uuid());
+ System.out.println("uuid2:" + Ids.uuid2());
+ System.out.println("randomLong: " + Ids.randomLong());
+ System.out.println("randomBase62:" + Ids.randomBase62(7));
}
}