diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3870085c5d3074f72d128aa5a3c364d99401af9a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,19 @@
+language: java
+
+sudo: false # faster builds
+
+install: true
+
+jdk:
+ - openjdk8
+
+notifications:
+ email: false
+
+script:
+ - export TZ=Asia/Shanghai
+ - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
+ - mvn cobertura:cobertura -Dcobertura.report.format=xml -Dmaven.javadoc.skip.true
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
diff --git a/README.md b/README.md
index 3595a2a32dad234b9a10eb48dd4a20577a45b5df..2d722de9c674b3b9214b6709ee827d558bcfb630 100644
--- a/README.md
+++ b/README.md
@@ -17,6 +17,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 9628bb8a410698953cf21585e260d62b954574e3..7526eb7f917127f9f00b64e0a28b8cb6f1077670 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,7 @@
4.11
1.2.58
3.7.4.ALL
- 1.7.25
+ 0.8.2
@@ -95,11 +95,6 @@
${alipay-sdk-version}
provided
-
- org.slf4j
- slf4j-simple
- ${slf4j-version}
-
@@ -190,6 +185,25 @@
+
+ org.jacoco
+ jacoco-maven-plugin
+ ${jacoco-version}
+
+
+
+ prepare-agent
+
+
+
+ report
+ test
+
+ report
+
+
+
+
org.apache.maven.plugins
maven-gpg-plugin
diff --git a/src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java b/src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a961fd298f0249095347b62d7354679b256591b
--- /dev/null
+++ b/src/main/java/me/zhyd/oauth/cache/AuthCacheConfig.java
@@ -0,0 +1,24 @@
+package me.zhyd.oauth.cache;
+
+/**
+ * AuthCache配置类
+ *
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @date 2019/8/1 17:15
+ * @since 1.8
+ */
+public class AuthCacheConfig {
+
+ /**
+ * 默认缓存过期时间:3分钟
+ * 鉴于授权过程中,根据个人的操作习惯,或者授权平台的不同(google等),每个授权流程的耗时也有差异,不过单个授权流程一般不会太长
+ * 本缓存工具默认的过期时间设置为3分钟,即程序默认认为3分钟内的授权有效,超过3分钟则默认失效,失效后删除
+ */
+ public static long timeout = 3 * 60 * 1000;
+
+ /**
+ * 是否开启定时{@link AuthDefaultCache#pruneCache()}的任务
+ */
+ public static boolean schedulePrune = true;
+}
diff --git a/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java b/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java
index 6da66958a7f27c289d92110a40f993e00f44bae8..79482140f962179ce2b63ae4cf8c8fd84f5144cd 100644
--- a/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java
+++ b/src/main/java/me/zhyd/oauth/cache/AuthDefaultCache.java
@@ -18,12 +18,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
*/
public class AuthDefaultCache implements AuthCache {
- /**
- * 默认缓存过期时间:3分钟
- * 鉴于授权过程中,根据个人的操作习惯,或者授权平台的不同(google等),每个授权流程的耗时也有差异,不过单个授权流程一般不会太长
- * 本缓存工具默认的过期时间设置为3分钟,即程序默认认为3分钟内的授权有效,超过3分钟则默认失效,失效后删除
- */
- private static final long DEF_TIMEOUT = 3 * 60 * 1000;
/**
* state cache
*/
@@ -33,7 +27,9 @@ public class AuthDefaultCache implements AuthCache {
private final Lock readLock = cacheLock.readLock();
public AuthDefaultCache() {
- this.schedulePrune(DEF_TIMEOUT);
+ if (AuthCacheConfig.schedulePrune) {
+ this.schedulePrune(AuthCacheConfig.timeout);
+ }
}
/**
@@ -44,7 +40,7 @@ public class AuthDefaultCache implements AuthCache {
*/
@Override
public void set(String key, String value) {
- set(key, value, DEF_TIMEOUT);
+ set(key, value, AuthCacheConfig.timeout);
}
/**
diff --git a/src/main/java/me/zhyd/oauth/log/Log.java b/src/main/java/me/zhyd/oauth/log/Log.java
new file mode 100644
index 0000000000000000000000000000000000000000..2cd6c5601dcbec4a1c1d4dcfea17bb1b0efa50cb
--- /dev/null
+++ b/src/main/java/me/zhyd/oauth/log/Log.java
@@ -0,0 +1,156 @@
+package me.zhyd.oauth.log;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.PrintStream;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * 针对JustAuth提供的轻量级的日志打印工具
+ *
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @date 2019/8/1 17:14
+ * @see Log#debug(String)
+ * @see Log#debug(String, Throwable)
+ * @see Log#warn(String)
+ * @see Log#warn(String, Throwable)
+ * @see Log#error(String)
+ * @see Log#error(String, Throwable)
+ * @since 1.8
+ */
+public class Log {
+
+ public static void debug(String msg) {
+ debug(msg, null);
+ }
+
+ public static void warn(String msg) {
+ warn(msg, null);
+ }
+
+ public static void error(String msg) {
+ error(msg, null);
+ }
+
+ public static void debug(String msg, Throwable t) {
+ print(Level.DEBUG, msg, t, System.out);
+ }
+
+ public static void warn(String msg, Throwable t) {
+ print(Level.WARN, msg, t, System.out);
+ }
+
+ public static void error(String msg, Throwable t) {
+ print(Level.ERROR, msg, t, System.err);
+ }
+
+ /**
+ * 打印日志内容,格式:2019-08-02 20:44:07 main me.zhyd.oauth.log.Log(debug:39) [DEBUG] - xxxx
+ *
+ * @param level 日志级别
+ * @param msg 日志内容
+ * @param t 异常信息
+ * @param ps 实际执行打印的PrintStream
+ */
+ private static void print(Level level, String msg, Throwable t, PrintStream ps) {
+ if (Config.enable) {
+ if (level.getLevelNum() >= Config.level.getLevelNum()) {
+ ps.println(String.format("%s %s %s [%s] - %s", getDate(), Thread.currentThread().getName(), getCaller(), level, msg));
+ writeThrowable(t, ps);
+ ps.flush();
+ }
+ }
+ }
+
+ /**
+ * 获取调用方的信息
+ *
+ * @return 返回调用方的信息,格式:class(method:lineNumber)
+ */
+ private static String getCaller() {
+ int offset = 2;
+ StackTraceElement[] stackTraceArr = (new Throwable()).getStackTrace();
+ StackTraceElement stackTrace = null;
+ if (offset >= stackTraceArr.length) {
+ offset = offset - 1;
+ }
+ stackTrace = stackTraceArr[offset];
+ return stackTrace.getClassName() +
+ "(" +
+ stackTrace.getMethodName() +
+ ':' +
+ stackTrace.getLineNumber() +
+ ")";
+ }
+
+ /**
+ * 获取格式化后的日期
+ *
+ * @return string
+ */
+ private static String getDate() {
+ return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ }
+
+ /**
+ * 打印异常信息
+ *
+ * @param t 异常
+ * @param targetStream 实际执行打印的PrintStream
+ */
+ private static void writeThrowable(Throwable t, PrintStream targetStream) {
+ if (t != null) {
+ t.printStackTrace(targetStream);
+ }
+ }
+
+ /**
+ * 日志级别
+ *
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @date 2019/8/2 19:49
+ * @since 1.8
+ */
+ @Getter
+ @AllArgsConstructor
+ public enum Level {
+ /**
+ * DEBUG: 普通级别
+ */
+ DEBUG(10),
+ /**
+ * WARN: 警告级别
+ */
+ WARN(30),
+ /**
+ * ERROR: 异常级别
+ */
+ ERROR(40);
+
+ private int levelNum;
+ }
+
+ /**
+ * 日志配置
+ *
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @date 2019/8/1 17:14
+ * @since 1.8
+ */
+ static class Config {
+
+ /**
+ * 需要打印的日志级别
+ */
+ static Level level = Level.DEBUG;
+ /**
+ * 是否启用日志打印功能,默认启用
+ */
+ static boolean enable = true;
+ }
+}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java
index 908b3b5f6bef4a781f51d9dee224273085911a34..71fe680fa971bc133a0bc1ff5a249cec4c943ea3 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java
@@ -9,6 +9,7 @@ import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.config.AuthSource;
import me.zhyd.oauth.enums.AuthResponseStatus;
import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.log.Log;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthToken;
@@ -25,7 +26,6 @@ import me.zhyd.oauth.utils.UuidUtils;
* @author yangkai.shen (https://xkcoding.com)
* @since 1.0.0
*/
-@Slf4j
public abstract class AuthDefaultRequest implements AuthRequest {
protected AuthConfig config;
protected AuthSource source;
@@ -82,7 +82,7 @@ public abstract class AuthDefaultRequest implements AuthRequest {
AuthUser user = this.getUserInfo(authToken);
return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build();
} catch (Exception e) {
- log.error("Failed to login with oauth authorization.", e);
+ Log.error("Failed to login with oauth authorization.", e);
return this.responseError(e);
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java
index 4ea654fba5d71ed32dd961cf00f8b96afbe107e8..57b4960b298241c56f04a60a67ccc53a58ff27de 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java
@@ -4,17 +4,14 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
-import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.cache.AuthStateCache;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.config.AuthSource;
import me.zhyd.oauth.enums.AuthResponseStatus;
import me.zhyd.oauth.enums.AuthUserGender;
import me.zhyd.oauth.exception.AuthException;
-import me.zhyd.oauth.model.AuthCallback;
-import me.zhyd.oauth.model.AuthResponse;
-import me.zhyd.oauth.model.AuthToken;
-import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.log.Log;
+import me.zhyd.oauth.model.*;
import me.zhyd.oauth.utils.UrlBuilder;
import java.text.MessageFormat;
@@ -25,7 +22,6 @@ import java.text.MessageFormat;
* @author yangkai.shen (https://xkcoding.com)
* @since 1.5.0
*/
-@Slf4j
public class AuthMiRequest extends AuthDefaultRequest {
private static final String PREFIX = "&&&START&&&";
@@ -96,7 +92,7 @@ public class AuthMiRequest extends AuthDefaultRequest {
JSONObject emailPhone = userEmailPhone.getJSONObject("data");
authUser.setEmail(emailPhone.getString("email"));
} else {
- log.warn("小米开发平台暂时不对外开放用户手机及邮箱信息的获取");
+ Log.warn("小米开发平台暂时不对外开放用户手机及邮箱信息的获取");
}
return authUser;
diff --git a/src/test/java/me/zhyd/oauth/log/LogTest.java b/src/test/java/me/zhyd/oauth/log/LogTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d729da393ebdbe3a42aa794b5e48a8cf41a3c076
--- /dev/null
+++ b/src/test/java/me/zhyd/oauth/log/LogTest.java
@@ -0,0 +1,111 @@
+package me.zhyd.oauth.log;
+
+import org.junit.Test;
+
+/**
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @date 2019/8/2 19:36
+ * @since 1.8
+ */
+public class LogTest {
+
+ public static void main(String[] args) {
+ // 测试正常打印
+ Log.debug("[1] This is a test.");
+ Log.debug("[1] This is a test.", new NullPointerException("npe"));
+
+ Log.warn("[1] This is a test.");
+ Log.warn("[1] This is a test.", new NullPointerException("npe"));
+
+ Log.error("[1] This is a test.");
+ Log.error("[1] This is a test.", new NullPointerException("npe"));
+
+ // 测试只打印 error级别的日志
+ Log.Config.level = Log.Level.ERROR;
+
+ Log.debug("[2] This is a test.");
+ Log.warn("[2] This is a test.");
+ Log.error("[2] This is a test.");
+
+ // 测试关闭日志
+ Log.Config.enable = false;
+
+ Log.debug("[3] This is a test.");
+ Log.warn("[3] This is a test.");
+ Log.error("[3] This is a test.");
+ }
+
+ /**
+ * 1000000: 23135ms
+ * 100000: 3016ms
+ * 10000: 328ms
+ * 1000: 26ms
+ */
+ @Test
+ public void testByThread() {
+ long start = System.currentTimeMillis();
+ for (int i = 0; i < 1; i++) {
+ System.out.println(callMethodByThread());
+ }
+ long end = System.currentTimeMillis();
+ System.out.println((end - start) + "ms");
+
+ }
+
+ /**
+ * 1000000: 19058ms
+ * 100000: 2772ms
+ * 10000: 323ms
+ * 1000: 29ms
+ */
+ @Test
+ public void testByThrowable() {
+ long end = System.currentTimeMillis();
+ for (int i = 0; i < 1; i++) {
+ System.out.println(callMethodByThrowable());
+ }
+ long end2 = System.currentTimeMillis();
+ System.out.println((end2 - end) + "ms");
+
+ }
+
+ @Test
+ public void testBySecurityManager() {
+ long end = System.currentTimeMillis();
+ for (int i = 0; i < 1; i++) {
+ System.out.println(callMethodBySecurityManager());
+ }
+ long end2 = System.currentTimeMillis();
+ System.out.println((end2 - end) + "ms");
+
+ }
+
+ private String callMethodByThread() {
+ StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+ for (StackTraceElement stackTraceElement : stackTrace) {
+ System.out.println(stackTraceElement.getMethodName());
+ }
+ return stackTrace[2].getMethodName();
+ }
+
+ private String callMethodByThrowable() {
+ StackTraceElement[] stackTrace = (new Throwable()).getStackTrace();
+ for (StackTraceElement stackTraceElement : stackTrace) {
+ System.out.println(stackTraceElement.getMethodName());
+ }
+ return stackTrace[2].getMethodName();
+ }
+
+ private String callMethodBySecurityManager() {
+ return new SecurityManager() {
+ String getClassName() {
+ for (Class clazz : getClassContext()) {
+ System.out.println(clazz);
+ }
+ return getClassContext()[0].getName();
+ }
+ }.getClassName();
+ }
+
+}
diff --git a/src/test/java/me/zhyd/oauth/utils/CustomTest.java b/src/test/java/me/zhyd/oauth/utils/CustomTest.java
deleted file mode 100644
index ccab7d28cff6167d4abbc5b4b45e0454631cd21d..0000000000000000000000000000000000000000
--- a/src/test/java/me/zhyd/oauth/utils/CustomTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package me.zhyd.oauth.utils;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.JSONPath;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 其他测试方法
- *
- * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
- */
-public class CustomTest {
-
- /**
- * 1000000: 23135ms
- * 100000: 3016ms
- * 10000: 328ms
- * 1000: 26ms
- */
- @Test
- public void test() {
- long start = System.currentTimeMillis();
- for (int i = 0; i < 1000; i++) {
- callMethod();
- }
- long end = System.currentTimeMillis();
- System.out.println((end - start) + "ms");
-
- }
-
- /**
- * 1000000: 19058ms
- * 100000: 2772ms
- * 10000: 323ms
- * 1000: 29ms
- */
- @Test
- public void test2() {
- long end = System.currentTimeMillis();
- for (int i = 0; i < 1000; i++) {
- callMethod2();
- }
- long end2 = System.currentTimeMillis();
- System.out.println((end2 - end) + "ms");
-
- }
-
- public String callMethod() {
- StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-// for (StackTraceElement stackTraceElement : stackTrace) {
-// System.out.println(stackTraceElement.getMethodName());
-// }
- return stackTrace[2].getMethodName();
- }
-
- public String callMethod2() {
- StackTraceElement[] stackTrace = (new Throwable()).getStackTrace();
-// for (StackTraceElement stackTraceElement : stackTrace) {
-// System.out.println(stackTraceElement.getMethodName());
-// }
- return stackTrace[2].getMethodName();
- }
-
- @Test
- public void jsonpath() {
- List