From 7a6d3e7201a1aeaba52571a87f3e559376000983 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 28 Sep 2019 22:50:45 +0800 Subject: [PATCH 001/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/StringAdvice.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 90f3015..2adb043 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -10,6 +10,26 @@ */ public final class StringAdvice { + /** + * 判断是null和空 + * + * @param content + * @return + */ + public static boolean isEmpty(String content) { + return content == null || content.isEmpty(); + } + + /** + * 判断不是null和空 + * + * @param content + * @return + */ + public static boolean isNotEmpty(String content) { + return content != null && content.isEmpty(); + } + /** * 从index位置切断字符串 * @param string From f4828ac57bbd2b53b832f67a15682ff53e593a4f Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 29 Sep 2019 16:06:16 +0800 Subject: [PATCH 002/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 54 ++++++++++++++++-------------------------------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 9ff0ea0..596ec34 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 com.github.developframework @@ -83,38 +84,15 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.0 + HEAD - - - - - - - - - - - - - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-releases/ - - - maven-source-plugin - 3.0.1 + 3.1.0 attach-sources @@ -153,7 +131,7 @@ maven-compiler-plugin - 3.8.0 + 3.8.1 @@ -182,19 +160,8 @@ maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - org.apache.maven.plugins maven-javadoc-plugin none @@ -202,6 +169,17 @@ + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + \ No newline at end of file From 47e93884a254be0f672940bf983f90c55b6b9838 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 29 Sep 2019 16:25:16 +0800 Subject: [PATCH 003/178] [maven-release-plugin] prepare release v1.0.1 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-support/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 13 ++++++------- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 83dacd9..b21e4d8 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.1-SNAPSHOT + 1.0.1 4.0.0 diff --git a/develop-toolkit-support/pom.xml b/develop-toolkit-support/pom.xml index 9a88037..4be47e5 100644 --- a/develop-toolkit-support/pom.xml +++ b/develop-toolkit-support/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.1-SNAPSHOT + 1.0.1 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index f76cecf..dbba6c4 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.1-SNAPSHOT + 1.0.1 4.0.0 diff --git a/pom.xml b/pom.xml index 596ec34..c8a8278 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,11 @@ - + 4.0.0 com.github.developframework develop-toolkit pom - 1.0.1-SNAPSHOT + 1.0.1 开发工具箱 2018 Develop Toolkit @@ -29,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.1-SNAPSHOT + 1.0.1 com.github.developframework develop-toolkit-support - 1.0.1-SNAPSHOT + 1.0.1 com.github.developframework develop-toolkit-world - 1.0.1-SNAPSHOT + 1.0.1 org.projectlombok @@ -84,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.1 From 3bae5a9dfa5a68363b25e0a1ef525c1cfccd6b1f Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 29 Sep 2019 16:25:31 +0800 Subject: [PATCH 004/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-support/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index b21e4d8..e355d8d 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.1 + 1.0.2-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-support/pom.xml b/develop-toolkit-support/pom.xml index 4be47e5..8f10526 100644 --- a/develop-toolkit-support/pom.xml +++ b/develop-toolkit-support/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.1 + 1.0.2-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index dbba6c4..11cf165 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.1 + 1.0.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index c8a8278..b781447 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.1 + 1.0.2-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.1 + 1.0.2-SNAPSHOT com.github.developframework develop-toolkit-support - 1.0.1 + 1.0.2-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.1 + 1.0.2-SNAPSHOT org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.1 + HEAD From 4bbedce79204af36fdd41c80d094f7008875267c Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 11 Oct 2019 09:13:06 +0800 Subject: [PATCH 005/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/IOAdvice.java | 36 +++++++++++++++++++ .../toolkit/base/utils/StringAdvice.java | 4 +-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 57cae26..63478e7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -221,6 +221,42 @@ public static void writeLines(List lines, OutputStream outputStream, Cha } } + /** + * 追加文本行 + * + * @param lines + * @param filename + * @param charset + * @throws IOException + */ + public static void appendLines(List lines, String filename, Charset charset) throws IOException { + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), charset))) { + for (String line : lines) { + writer.append(line); + writer.newLine(); + } + writer.flush(); + } + } + + /** + * 追加文本行 + * + * @param lines + * @param outputStream + * @param charset + * @throws IOException + */ + public static void appendLines(List lines, OutputStream outputStream, Charset charset) throws IOException { + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { + for (String line : lines) { + writer.append(line); + writer.newLine(); + } + writer.flush(); + } + } + /** * 转移 * diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 2adb043..19ac522 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -27,7 +27,7 @@ public static boolean isEmpty(String content) { * @return */ public static boolean isNotEmpty(String content) { - return content != null && content.isEmpty(); + return content != null && !content.isEmpty(); } /** @@ -38,7 +38,7 @@ public static boolean isNotEmpty(String content) { */ public static TwoValues cutOff(String string, int index) { if (index > string.length() || index < 0) { - throw new IllegalArgumentException(); + return null; } return TwoValues.of( string.substring(0, index), From edf70b7c7452fda8a50f9220739f423e8ec028b8 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 17 Oct 2019 17:38:18 +0800 Subject: [PATCH 006/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/support/http/HttpAdvice.java | 8 ++++---- .../develop/toolkit/support/http/HttpAdviceResponse.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java index ccdb4f8..efca3d6 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java @@ -149,13 +149,13 @@ private static HttpAdviceResponse send(String label, HttpClient httpClient, Http sb .append("\nlabel: ").append(label) .append("\nhttp request:\n") - .append("\turl: ").append(httpRequest.uri().toString()).append("\n") - .append("\theaders:\n"); + .append(" url: ").append(httpRequest.uri().toString()).append("\n") + .append(" headers:\n"); httpRequest .headers() .map() - .forEach((k, v) -> sb.append("\t\t").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); - sb.append("\tbody: ").append(content != null ? content : "(no content)").append("\n"); + .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); + sb.append(" body: ").append(content != null ? content : "(no content)").append("\n"); if (response != null) { sb.append(response.toString()); } diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java index 0d6ca1f..5c31f14 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java @@ -46,12 +46,12 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb .append("\nhttp response:\n") - .append("\tstatus: ").append(httpStatus).append("\n") - .append("\theaders:\n"); + .append(" status: ").append(httpStatus).append("\n") + .append(" headers:\n"); for (Map.Entry> entry : headers.entrySet()) { - sb.append("\t\t").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); + sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } - sb.append("\tbody: ").append(ofString()); + sb.append(" body: ").append(ofString()); return sb.toString(); } } From d952c1409806b24770dd2055f8bc9ef3e774a1d4 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 18 Oct 2019 17:45:27 +0800 Subject: [PATCH 007/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/support/http/HttpAdvice.java | 5 ++--- .../develop/toolkit/support/http/HttpAdviceResponse.java | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java index efca3d6..1aac80b 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java @@ -148,9 +148,8 @@ private static HttpAdviceResponse send(String label, HttpClient httpClient, Http StringBuilder sb = new StringBuilder(); sb .append("\nlabel: ").append(label) - .append("\nhttp request:\n") - .append(" url: ").append(httpRequest.uri().toString()).append("\n") - .append(" headers:\n"); + .append("\nhttp request:\n url: ") + .append(httpRequest.uri().toString()).append("\n headers:\n"); httpRequest .headers() .map() diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java index 5c31f14..88bb35d 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java @@ -45,9 +45,7 @@ public String getHeader(String header) { public String toString() { StringBuilder sb = new StringBuilder(); sb - .append("\nhttp response:\n") - .append(" status: ").append(httpStatus).append("\n") - .append(" headers:\n"); + .append("\nhttp response:\n status: ").append(httpStatus).append("\n headers:\n"); for (Map.Entry> entry : headers.entrySet()) { sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } From 83ee741ad6ea018871208c176393aef7feaf03b8 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 6 Nov 2019 20:32:29 +0800 Subject: [PATCH 008/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/KeyValuePairs.java | 19 ++++++++++++++----- .../world/person/IdentificationCard.java | 2 +- pom.xml | 12 ++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java index a065451..5f565c3 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java @@ -1,9 +1,6 @@ package develop.toolkit.base.struct; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -76,8 +73,20 @@ public static KeyValuePairs fromMap(Map map) { */ @SafeVarargs public static KeyValuePairs of(KeyValuePair... keyValuePairArray) { + return of(List.of(keyValuePairArray)); + } + + /** + * 带值初始化 + * + * @param keyValuePairCollection + * @param + * @param + * @return + */ + public static KeyValuePairs of(Collection> keyValuePairCollection) { KeyValuePairs keyValuePairs = new KeyValuePairs<>(); - keyValuePairs.addAll(List.of(keyValuePairArray)); + keyValuePairs.addAll(keyValuePairCollection); return keyValuePairs; } } diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java index c655ead..1324a38 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java @@ -82,7 +82,7 @@ public static boolean isValid(String card) { if (card.length() == 15) { return true; } else { - return card.charAt(17) == computeLastCode(card.substring(0, card.length() - 1)); + return card.toUpperCase().charAt(17) == computeLastCode(card.substring(0, card.length() - 1)); } } return false; diff --git a/pom.xml b/pom.xml index b781447..ab3f51d 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,18 @@ HEAD + + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-releases/ + + + From 490186166f9055cf732119657324bd626343fabf Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 8 Nov 2019 16:00:32 +0800 Subject: [PATCH 009/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/CollectionAdvice.java | 127 ++++++++++++++---- .../develop/toolkit/base/utils/IOAdvice.java | 42 +++++- 2 files changed, 138 insertions(+), 31 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 917dd5e..bc259f8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -2,7 +2,6 @@ import develop.toolkit.base.struct.CollectionInMap; import develop.toolkit.base.struct.TwoValues; -import lombok.NonNull; import java.util.*; import java.util.function.Function; @@ -23,16 +22,17 @@ public final class CollectionAdvice { * @param target * @param function * @param - * @param * @return */ - public static boolean contains(@NonNull Collection collection, R target, @NonNull Function function) { - for (E item : collection) { - R value = function.apply(item); - if (target == null) { - return value == null; - } else if (target.equals(value)) { - return true; + public static boolean contains(Collection collection, Object target, Function function) { + if (collection != null) { + for (E item : collection) { + Object value = function == null ? item : function.apply(item); + if (target == null) { + return value == null; + } else if (target.equals(value)) { + return true; + } } } return false; @@ -45,16 +45,17 @@ public static boolean contains(@NonNull Collection collection, R targe * @param target * @param function * @param - * @param * @return */ - public static Optional getFirstMatch(@NonNull Collection collection, R target, @NonNull Function function) { - for (E item : collection) { - R value = function.apply(item); - if (target == null) { - return value == null ? Optional.ofNullable(item) : Optional.empty(); - } else if (target.equals(value)) { - return Optional.ofNullable(item); + public static Optional getFirstMatch(Collection collection, Object target, Function function) { + if (collection != null) { + for (E item : collection) { + Object value = function == null ? item : function.apply(item); + if (target == null) { + return value == null ? Optional.ofNullable(item) : Optional.empty(); + } else if (target.equals(value)) { + return Optional.ofNullable(item); + } } } return Optional.empty(); @@ -68,10 +69,12 @@ public static Optional getFirstMatch(@NonNull Collection collection * @param * @return */ - public static Optional getFirstTrue(@NonNull Collection collection, @NonNull Predicate predicate) { - for (E item : collection) { - if (predicate.test(item)) { - return Optional.ofNullable(item); + public static Optional getFirstTrue(Collection collection, Predicate predicate) { + if (collection != null) { + for (E item : collection) { + if (predicate.test(item)) { + return Optional.ofNullable(item); + } } } return Optional.empty(); @@ -85,10 +88,12 @@ public static Optional getFirstTrue(@NonNull Collection collection, @N * @param * @return */ - public static Optional getFirstFalse(@NonNull Collection collection, @NonNull Predicate predicate) { - for (E item : collection) { - if (!predicate.test(item)) { - return Optional.ofNullable(item); + public static Optional getFirstFalse(Collection collection, Predicate predicate) { + if (collection != null) { + for (E item : collection) { + if (!predicate.test(item)) { + return Optional.ofNullable(item); + } } } return Optional.empty(); @@ -101,12 +106,14 @@ public static Optional getFirstFalse(@NonNull Collection collection, @ * @param target * @param function * @param - * @param * @return */ - public static List getAllMatch(@NonNull Collection collection, R target, @NonNull Function function) { + public static List getAllMatch(Collection collection, Object target, Function function) { + if (collection == null) { + return null; + } return collection.stream().filter(item -> { - R value = function.apply(item); + Object value = function == null ? item : function.apply(item); if (target == null) { return value == null; } else { @@ -115,6 +122,68 @@ public static List getAllMatch(@NonNull Collection collection, R ta }).collect(Collectors.toList()); } + /** + * 全部匹配 + * + * @param collection + * @param predicate + * @param + * @return + */ + public static boolean allMatch(Collection collection, Predicate predicate) { + if (predicate == null || collection == null) { + return false; + } + for (E e : collection) { + if (!predicate.test(e)) { + return false; + } + } + return true; + } + + /** + * 任意一个匹配 + * + * @param collection + * @param predicate + * @param + * @return + */ + public static boolean anyMatch(Collection collection, Predicate predicate) { + if (collection != null && predicate != null) { + for (E e : collection) { + if (predicate.test(e)) { + return true; + } + } + } + return false; + } + + /** + * 判断所有元素的处理值相等 + * + * @param collection + * @param function + * @param + * @return + */ + public static boolean allAccept(Collection collection, Function function) { + if (collection == null || collection.isEmpty()) { + return false; + } + List list = new ArrayList<>(collection); + Object targetValue = function == null ? list.get(0) : function.apply(list.get(0)); + for (int i = 1, size = list.size(); i < size; i++) { + Object itemValue = function == null ? list.get(i) : function.apply(list.get(i)); + if ((targetValue != null && !targetValue.equals(itemValue)) || (targetValue == null && itemValue != null)) { + return false; + } + } + return true; + } + /** * 转化为Map * @@ -126,7 +195,7 @@ public static List getAllMatch(@NonNull Collection collection, R ta * @param * @return */ - public static Map toMap(@NonNull Collection collection, @NonNull Function keySupplier, @NonNull Function valueSupplier) { + public static Map toMap(Collection collection, Function keySupplier, Function valueSupplier) { Map map = new HashMap<>(); for (E item : collection) { map.put(keySupplier.apply(item), valueSupplier.apply(item)); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 63478e7..8614176 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -258,7 +258,7 @@ public static void appendLines(List lines, OutputStream outputStream, Ch } /** - * 转移 + * 复制文本 * * @param inputStream * @param outputStream @@ -266,7 +266,7 @@ public static void appendLines(List lines, OutputStream outputStream, Ch * @param function * @throws IOException */ - public static void transferText(InputStream inputStream, OutputStream outputStream, Charset charset, Function function) throws IOException { + public static void copyText(InputStream inputStream, OutputStream outputStream, Charset charset, Function function) throws IOException { Scanner scanner = new Scanner(inputStream, charset); try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { while (scanner.hasNext()) { @@ -278,6 +278,44 @@ public static void transferText(InputStream inputStream, OutputStream outputStre scanner.close(); } + /** + * 复制文件 + * + * @param inputStream + * @param outputStream + * @return + * @throws IOException + */ + public static long copy(InputStream inputStream, OutputStream outputStream) throws IOException { + final byte[] buffer = new byte[4096]; + long count = 0; + int n; + while (-1 != (n = inputStream.read(buffer))) { + outputStream.write(buffer, 0, n); + count += n; + } + return count; + } + + /** + * 安静地复制文件 + * + * @param source + * @param target + * @return + */ + public static long copyQuietly(File source, File target) { + target.getParentFile().mkdirs(); + try ( + InputStream inputStream = new FileInputStream(source); + OutputStream outputStream = new FileOutputStream(target) + ) { + return copy(inputStream, outputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + /** * 打印文件 * From 9421d21f4c92cfbf6574a7a1716da089e5327c11 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 12 Nov 2019 09:43:11 +0800 Subject: [PATCH 010/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/StopWatch.java | 4 ++++ .../toolkit/base/utils/CollectionAdvice.java | 23 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java index 1b81f5a..11b40ed 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java @@ -34,6 +34,10 @@ public long end(String name) { return end.toEpochMilli() - startInstantMap.get(name).toEpochMilli(); } + public String formatEnd() { + return DateTimeAdvice.millisecondPretty(end()); + } + public String formatEnd(String label) { return label + ": " + DateTimeAdvice.millisecondPretty(end()); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index bc259f8..2de68b8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -185,7 +185,7 @@ public static boolean allAccept(Collection collection, Function fun } /** - * 转化为Map + * 分组 * * @param collection * @param keySupplier @@ -195,7 +195,7 @@ public static boolean allAccept(Collection collection, Function fun * @param * @return */ - public static Map toMap(Collection collection, Function keySupplier, Function valueSupplier) { + public static Map grouping(Collection collection, Function keySupplier, Function valueSupplier) { Map map = new HashMap<>(); for (E item : collection) { map.put(keySupplier.apply(item), valueSupplier.apply(item)); @@ -203,6 +203,23 @@ public static Map toMap(Collection collection, Function return map; } + /** + * 分组求数量 + * + * @param collection + * @param keySupplier + * @param + * @param + * @return + */ + public static Map groupingCount(Collection collection, Function keySupplier) { + Map map = new HashMap<>(); + for (E item : collection) { + map.computeIfPresent(keySupplier.apply(item), (k, v) -> v + 1); + } + return map; + } + /** * 并集 * @@ -293,7 +310,7 @@ public static TwoValues, List> partition(Collection collection */ public static List> zip(List master, List other) { if (master.size() != other.size()) { - throw new IllegalArgumentException("list size must be some"); + throw new IllegalArgumentException("list size must be same"); } List> list = new LinkedList<>(); for (int i = 0; i < master.size(); i++) { From 5f0ee660c8266c10608f4ca58cb49386d9cb2f25 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 12 Nov 2019 10:01:51 +0800 Subject: [PATCH 011/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/Sorter.java | 3 ++- .../toolkit/base/struct/CollectionInMap.java | 8 ++++---- .../toolkit/base/utils/CollectionAdvice.java | 16 +++++++++++----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java index e2230e4..042afb9 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java @@ -10,6 +10,7 @@ * * @author qiushui on 2018-07-09. */ +@Deprecated public class Sorter { private CollectionInMap map = new CollectionInMap<>(key -> new LinkedList()); @@ -27,7 +28,7 @@ public Sorter(@NonNull SortFunction sortFunction) { public void sort(Collection collection) { for (V item : collection) { K key = sortFunction.sort(item); - map.addItemSoft(key, item); + map.putItemSoft(key, item); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java index a6e3f58..48b16a7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java @@ -36,7 +36,7 @@ public CollectionInMap(int initialCapacity, @NonNull CollectionProvider collecti * @param key map key * @param item 新元素 */ - public void addItem(K key, V item) { + public void putItem(K key, V item) { if (containsKey(key)) { Collection collection = get(key); collection.add(item); @@ -50,7 +50,7 @@ public void addItem(K key, V item) { * @param key map key * @param items 新元素 */ - public void addAllItem(K key, @NonNull Collection items) { + public void putAllItem(K key, @NonNull Collection items) { if (containsKey(key)) { Collection collection = get(key); collection.addAll(items); @@ -65,7 +65,7 @@ public void addAllItem(K key, @NonNull Collection items) { * @param item 新元素 */ @SuppressWarnings("unchecked") - public void addItemSoft(K key, V item) { + public void putItemSoft(K key, V item) { if (containsKey(key)) { Collection collection = get(key); collection.add(item); @@ -82,7 +82,7 @@ public void addItemSoft(K key, V item) { * @param items 新元素 */ @SuppressWarnings("unchecked") - public void addAllItemSoft(K key, @NonNull Collection items) { + public void putAllItemSoft(K key, @NonNull Collection items) { if (containsKey(key)) { Collection collection = get(key); collection.addAll(items); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 2de68b8..b792d9e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -195,10 +195,10 @@ public static boolean allAccept(Collection collection, Function fun * @param * @return */ - public static Map grouping(Collection collection, Function keySupplier, Function valueSupplier) { - Map map = new HashMap<>(); + public static CollectionInMap grouping(Collection collection, Function keySupplier, Function valueSupplier) { + CollectionInMap map = new CollectionInMap<>(k -> new LinkedList()); for (E item : collection) { - map.put(keySupplier.apply(item), valueSupplier.apply(item)); + map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item)); } return map; } @@ -215,7 +215,13 @@ public static Map grouping(Collection collection, Function Map groupingCount(Collection collection, Function keySupplier) { Map map = new HashMap<>(); for (E item : collection) { - map.computeIfPresent(keySupplier.apply(item), (k, v) -> v + 1); + K key = keySupplier.apply(item); + Integer v; + if ((v = map.get(key)) != null) { + map.put(key, ++v); + } else { + map.put(key, 1); + } } return map; } @@ -270,7 +276,7 @@ public static CollectionInMap associate(Collection master, Colle for (E e : master) { for (T t : target) { if (predicate.test(e, t)) { - map.addItemSoft(e, t); + map.putItemSoft(e, t); } } } From 35d240d50e658eb8125ffa4f7ce5fc5953404621 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 13 Nov 2019 10:53:26 +0800 Subject: [PATCH 012/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ab3f51d..3b4a171 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ 1.18.10 1.7.28 - 1.3.2 + 1.4.0 From 42a6c721b595cee2a4262567c2d28779c47d8698 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 23 Nov 2019 15:01:32 +0800 Subject: [PATCH 013/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/range/IntRange.java | 24 ++++++++ .../toolkit/base/struct/range/LongRange.java | 24 ++++++++ .../toolkit/base/struct/range/Range.java | 26 +++++++++ .../toolkit/base/utils/RandomAdvice.java | 57 +++++++++++++++++++ .../src/main/java/module-info.java | 1 + .../toolkit/support/http/HttpAdvice.java | 30 ++++++++++ 6 files changed, 162 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/Range.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java new file mode 100644 index 0000000..ec5ae8f --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java @@ -0,0 +1,24 @@ +package develop.toolkit.base.struct.range; + +/** + * 整型范围 + */ +public class IntRange extends Range { + + public IntRange(Integer start, Integer end) { + super(start, end); + } + + /** + * 生成整型数组 + * + * @return + */ + public final Integer[] generate() { + Integer[] array = new Integer[end - start]; + for (int i = 0; i < array.length; i++) { + array[i] = start + i; + } + return array; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java new file mode 100644 index 0000000..092c045 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java @@ -0,0 +1,24 @@ +package develop.toolkit.base.struct.range; + +/** + * 长整型范围 + */ +public class LongRange extends Range { + + public LongRange(Long start, Long end) { + super(start, end); + } + + /** + * 生成长整型数组 + * + * @return + */ + public final long[] generate() { + long[] array = new long[(int) (end - start)]; + for (int i = 0; i < array.length; i++) { + array[i] = start + i; + } + return array; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/Range.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/Range.java new file mode 100644 index 0000000..552e26c --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/Range.java @@ -0,0 +1,26 @@ +package develop.toolkit.base.struct.range; + +import develop.toolkit.base.utils.CompareAdvice; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import org.apache.commons.lang3.Validate; + +/** + * 范围结构体 + * + * @param + */ +@Getter +@EqualsAndHashCode +public class Range> { + + protected T start; + + protected T end; + + public Range(T start, T end) { + Validate.isTrue(CompareAdvice.gte(end, start), "Start value must be smaller or equal to end value."); + this.start = start; + this.end = end; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java new file mode 100644 index 0000000..fadb663 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java @@ -0,0 +1,57 @@ +package develop.toolkit.base.utils; + +import develop.toolkit.base.struct.range.IntRange; +import org.apache.commons.lang3.RandomUtils; +import org.apache.commons.lang3.Validate; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public final class RandomAdvice { + + /** + * 随机count个整数 + * + * @param startInclusive + * @param endExclusive + * @param count + * @return + */ + public static int[] nextInts(final int startInclusive, final int endExclusive, final int count) { + Validate.isTrue(endExclusive - startInclusive >= count, "Difference value must be greater or equal to end value."); + List list = new ArrayList<>(List.of(new IntRange(startInclusive, endExclusive).generate())); + int[] result = new int[count]; + for (int i = 0; i < result.length; i++) { + result[i] = list.remove(RandomUtils.nextInt(0, list.size())); + } + return result; + } + + /** + * 随机count个元素 + * + * @param list + * @param count + * @param + * @return + */ + public static List nextElements(final List list, final int count) { + return IntStream + .of(nextInts(0, list.size(), count)) + .mapToObj(list::get) + .collect(Collectors.toList()); + } + + /** + * 随机一个元素 + * + * @param list + * @param + * @return + */ + public static T nextElement(final List list) { + return list.get(RandomUtils.nextInt(0, list.size())); + } +} diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index 9f3468f..7b0a702 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -5,6 +5,7 @@ requires lombok; requires org.slf4j; + requires org.apache.commons.lang3; exports develop.toolkit.base.components; exports develop.toolkit.base.constants; diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java index 1aac80b..dc10c38 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java @@ -38,6 +38,36 @@ public static HttpAdviceResponse get(String label, HttpClient httpClient, String ); } + public static HttpAdviceResponse post(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { + return send( + label, + httpClient, + HttpMethod.POST, + builder(url, headers, parameters), + null + ); + } + + public static HttpAdviceResponse put(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { + return send( + label, + httpClient, + HttpMethod.PUT, + builder(url, headers, parameters), + null + ); + } + + public static HttpAdviceResponse delete(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { + return send( + label, + httpClient, + HttpMethod.DELETE, + builder(url, headers, parameters), + null + ); + } + /** * 发送x-www-form-urlencoded格式请求 * From 43ab92cfad07951b812eb78006c44e92b60e8578 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 25 Nov 2019 16:09:33 +0800 Subject: [PATCH 014/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/ObjectAdvice.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 9decb1b..aa46671 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -110,4 +110,38 @@ public static boolean isBoolean(Object obj) { var clazz = obj.getClass(); return clazz == boolean.class || clazz == Boolean.class; } + + /** + * 值是否在数组里 + * + * @param obj + * @param targets + * @param + * @return + */ + public static boolean valueIn(@NonNull T obj, T... targets) { + for (T target : targets) { + if (obj.equals(target)) { + return true; + } + } + return false; + } + + /** + * 值是否不在数组里 + * + * @param obj + * @param targets + * @param + * @return + */ + public static boolean valueNotIn(@NonNull T obj, T... targets) { + for (T target : targets) { + if (obj.equals(target)) { + return false; + } + } + return true; + } } From f69cf1dbc3c6d3c76dc1b6beb0b9bcb5b090ba9f Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 26 Nov 2019 17:07:39 +0800 Subject: [PATCH 015/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-http/pom.xml | 22 +++++ .../toolkit/http/HttpFailedException.java | 14 ++++ .../java/develop/toolkit/http/HttpHeader.java | 26 ++++++ .../toolkit/http/JDKToolkitHttpClient.java | 62 ++++++++++++++ .../toolkit/http/ToolkitHttpClient.java | 29 +++++++ .../toolkit/http/request/HttpMethod.java | 9 +++ .../toolkit/http/request/HttpRequestData.java | 81 +++++++++++++++++++ .../request/body/FormDataHttpRequestBody.java | 54 +++++++++++++ .../body/FormUrlencodedHttpRequestBody.java | 50 ++++++++++++ .../request/body/HttpRequestDataBody.java | 26 ++++++ .../request/body/JsonRawHttpRequestBody.java | 25 ++++++ .../request/body/RawHttpRequestDataBody.java | 19 +++++ .../request/body/TextRawHttpRequestBody.java | 27 +++++++ .../request/body/XmlRawHttpRequestBody.java | 27 +++++++ .../DefaultHttpResponseBodyProcessor.java | 23 ++++++ .../http/response/HttpResponseData.java | 44 ++++++++++ .../HttpResponseDataBodyProcessor.java | 32 ++++++++ develop-toolkit-http/src/test/java/Test.java | 23 ++++++ pom.xml | 6 ++ 19 files changed, 599 insertions(+) create mode 100644 develop-toolkit-http/pom.xml create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java create mode 100644 develop-toolkit-http/src/test/java/Test.java diff --git a/develop-toolkit-http/pom.xml b/develop-toolkit-http/pom.xml new file mode 100644 index 0000000..099c151 --- /dev/null +++ b/develop-toolkit-http/pom.xml @@ -0,0 +1,22 @@ + + + + develop-toolkit + com.github.developframework + 1.0.2-SNAPSHOT + + 4.0.0 + + develop-toolkit-http + + 开发工具箱 - HTTP + + + + com.github.developframework + develop-toolkit-base + + + \ No newline at end of file diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java new file mode 100644 index 0000000..eabec13 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java @@ -0,0 +1,14 @@ +package develop.toolkit.http; + +import develop.toolkit.base.exception.FormatRuntimeException; + +public class HttpFailedException extends FormatRuntimeException { + + public HttpFailedException(String format, Object... parameters) { + super(format, parameters); + } + + public HttpFailedException(String format, Throwable cause, Object... parameters) { + super(format, cause, parameters); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java new file mode 100644 index 0000000..f2e6025 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java @@ -0,0 +1,26 @@ +package develop.toolkit.http; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +/** + * Http头信息 + */ +@Getter +@EqualsAndHashCode +public class HttpHeader { + + private String headerName; + + private String value; + + public HttpHeader(String headerName, String value) { + this.headerName = headerName; + this.value = value; + } + + @Override + public String toString() { + return String.format("%s: %s", headerName, value); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java new file mode 100644 index 0000000..3f4bc93 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java @@ -0,0 +1,62 @@ +package develop.toolkit.http; + +import develop.toolkit.http.request.HttpRequestData; +import develop.toolkit.http.response.HttpResponseData; +import develop.toolkit.http.response.HttpResponseDataBodyProcessor; +import lombok.Getter; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; + +/** + * 基于JDK 11 HttpClient实现 + */ +public class JDKToolkitHttpClient implements ToolkitHttpClient { + + @Getter + private HttpClient httpClient; + + public JDKToolkitHttpClient() { + this.httpClient = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(30L)) + .version(HttpClient.Version.HTTP_1_1) + .build(); + } + + public JDKToolkitHttpClient(HttpClient httpClient) { + this.httpClient = httpClient; + } + + @Override + public > HttpResponseData request(HttpRequestData requestData, P httpResponseDataBodyProcessor) throws HttpFailedException { + if (requestData.getBody() != null) { + requestData.getBody().prepare(requestData); + } + final byte[] data = requestData.serializeBody(); + final HttpRequest.BodyPublisher bodyPublisher = data != null ? HttpRequest.BodyPublishers.ofByteArray(data) : HttpRequest.BodyPublishers.noBody(); + HttpRequest.Builder httpRequestBuilder = HttpRequest.newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .timeout(Duration.ofSeconds(30L)) + .uri(URI.create(requestData.getWholeUrl())) + .method(requestData.getHttpMethod().name(), bodyPublisher); + requestData.getHeaders().forEach(httpRequestBuilder::header); + + try { + final HttpResponse httpResponse = httpClient.send(httpRequestBuilder.build(), HttpResponse.BodyHandlers.ofByteArray()); + final HttpResponseData responseData = new HttpResponseData<>(httpResponse.statusCode(), httpResponse.body()); + responseData.parseHeaders(httpResponse.headers().map()); + responseData.setSuccess(httpResponseDataBodyProcessor.checkSuccess(responseData)); + if (responseData.isSuccess()) { + responseData.setSuccessBody(httpResponseDataBodyProcessor.parseBodyContent(responseData)); + } else { + responseData.setErrorBody(httpResponseDataBodyProcessor.error(responseData)); + } + return responseData; + } catch (Exception e) { + throw new HttpFailedException("http failed: %s", e, e.getMessage()); + } + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java new file mode 100644 index 0000000..b8dc5b9 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java @@ -0,0 +1,29 @@ +package develop.toolkit.http; + +import develop.toolkit.http.request.HttpRequestData; +import develop.toolkit.http.response.DefaultHttpResponseBodyProcessor; +import develop.toolkit.http.response.HttpResponseData; +import develop.toolkit.http.response.HttpResponseDataBodyProcessor; + + +public interface ToolkitHttpClient { + + /** + * 发送请求 + * + * @param + * @param httpRequestData + * @param httpResponseDataBodyProcessor + * @return + */ + > HttpResponseData request(HttpRequestData httpRequestData, P httpResponseDataBodyProcessor) throws HttpFailedException; + + /** + * @param httpRequestData + * @return + * @throws HttpFailedException + */ + default HttpResponseData request(HttpRequestData httpRequestData) throws HttpFailedException { + return request(httpRequestData, new DefaultHttpResponseBodyProcessor()); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java new file mode 100644 index 0000000..924fe5d --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java @@ -0,0 +1,9 @@ +package develop.toolkit.http.request; + +/** + * @author qiuzhenhao + */ +public enum HttpMethod { + + GET, POST, PUT, DELETE +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java new file mode 100644 index 0000000..620676e --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java @@ -0,0 +1,81 @@ +package develop.toolkit.http.request; + +import develop.toolkit.http.request.body.HttpRequestDataBody; +import lombok.Getter; +import lombok.Setter; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Http请求体 + * + * @author qiuzhenhao + */ +@Getter +public class HttpRequestData { + + private HttpMethod httpMethod; + + private String url; + + private Map headers = new HashMap<>(); + + private Map urlParameters = new HashMap<>(); + + @Setter + private Charset charset = StandardCharsets.UTF_8; + + @Setter + private HttpRequestDataBody body; + + public HttpRequestData(HttpMethod httpMethod, String url) { + this.httpMethod = httpMethod; + this.url = url; + } + + public void addHeader(String headerName, String value) { + headers.put(headerName, value); + } + + public void addUrlParameter(String parameterName, Object value) { + urlParameters.put(parameterName, value); + } + + public String getWholeUrl() { + return urlParameters.isEmpty() ? url : (url + "?" + serializeParameters()); + } + + /** + * 序列化参数 + * + * @return + */ + protected String serializeParameters() { + return urlParameters.entrySet().stream().map(parameter -> { + try { + return String.format("%s=%s", parameter.getKey(), URLEncoder.encode(parameter.getValue().toString(), charset.displayName())); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return ""; + } + }).collect(Collectors.joining("&")); + } + + /** + * 序列化 + * + * @return + */ + public byte[] serializeBody() { + if (body == null) { + return null; + } + return body.serializeBody(charset); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java new file mode 100644 index 0000000..f899922 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java @@ -0,0 +1,54 @@ +package develop.toolkit.http.request.body; + +import develop.toolkit.http.request.HttpRequestData; +import lombok.Getter; +import org.apache.commons.lang3.RandomStringUtils; + +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author qiuzhenhao + */ +public class FormDataHttpRequestBody implements HttpRequestDataBody { + + @Getter + private String boundary; + + @Getter + protected Map parameters = new LinkedHashMap<>(); + + public void addParameter(String parameterName, String value) { + parameters.put(parameterName, value); + } + + public FormDataHttpRequestBody() { + this.boundary = "----WebKitFormBoundary" + RandomStringUtils.randomAlphabetic(10); + } + + public FormDataHttpRequestBody(String boundary) { + this.boundary = boundary; + } + + @Override + public byte[] serializeBody(Charset charset) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : parameters.entrySet()) { + if (entry != null) { + sb + .append(boundary) + .append("\r\n") + .append(String.format("Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", entry.getKey(), URLEncoder.encode(entry.getValue().toString(), charset))); + } + } + System.out.println(sb.toString()); + return sb.toString().getBytes(charset); + } + + @Override + public void prepare(HttpRequestData httpRequestData) { + httpRequestData.addHeader("Content-Type", "multipart/form-data; boundary=" + boundary); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java new file mode 100644 index 0000000..a8408ae --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java @@ -0,0 +1,50 @@ +package develop.toolkit.http.request.body; + +import develop.toolkit.http.request.HttpRequestData; +import lombok.Getter; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * application/x-www-form-urlencoded 格式Body + */ +public class FormUrlencodedHttpRequestBody implements HttpRequestDataBody { + + @Getter + protected Map parameters = new LinkedHashMap<>(); + + public void addParameter(String parameterName, String value) { + parameters.put(parameterName, value); + } + + @Override + public byte[] serializeBody(Charset charset) { + return serializeParameters(charset).getBytes(charset); + } + + @Override + public void prepare(HttpRequestData httpRequestData) { + httpRequestData.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + httpRequestData.getCharset().displayName()); + } + + /** + * 序列化参数 + * + * @return + */ + protected String serializeParameters(Charset charset) { + return parameters.entrySet().stream().map(parameter -> { + try { + return String.format("%s=%s", parameter.getKey(), URLEncoder.encode(parameter.getValue().toString(), charset.displayName())); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return ""; + } + }).collect(Collectors.joining("&")); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java new file mode 100644 index 0000000..933f88f --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java @@ -0,0 +1,26 @@ +package develop.toolkit.http.request.body; + +import develop.toolkit.http.request.HttpRequestData; + +import java.nio.charset.Charset; + +/** + * + */ +public interface HttpRequestDataBody { + + /** + * 序列化成字节 + * + * @param charset + * @return + */ + byte[] serializeBody(Charset charset); + + /** + * 准备 + * + * @param httpRequestData + */ + void prepare(HttpRequestData httpRequestData); +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java new file mode 100644 index 0000000..875bcc7 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java @@ -0,0 +1,25 @@ +package develop.toolkit.http.request.body; + +import java.nio.charset.Charset; + +/** + * Json富文本Body + */ +public class JsonRawHttpRequestBody extends RawHttpRequestDataBody { + + private String json; + + public JsonRawHttpRequestBody(String json) { + this.json = json; + } + + @Override + protected String getContentType(Charset charset) { + return "application/json;charset=" + charset.displayName(); + } + + @Override + public byte[] serializeBody(Charset charset) { + return json.getBytes(charset); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java new file mode 100644 index 0000000..283c5da --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java @@ -0,0 +1,19 @@ +package develop.toolkit.http.request.body; + +import develop.toolkit.http.request.HttpRequestData; + +import java.nio.charset.Charset; + +/** + * 富文本Body + */ +public abstract class RawHttpRequestDataBody implements HttpRequestDataBody { + + @Override + public void prepare(HttpRequestData httpRequestData) { + httpRequestData.addHeader("Content-Type", getContentType(httpRequestData.getCharset())); + } + + protected abstract String getContentType(Charset charset); + +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java new file mode 100644 index 0000000..4a7ac22 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java @@ -0,0 +1,27 @@ +package develop.toolkit.http.request.body; + +import java.nio.charset.Charset; + +/** + * Text富文本Body + * + * @author qiuzhenhao + */ +public class TextRawHttpRequestBody extends RawHttpRequestDataBody { + + private String text; + + public TextRawHttpRequestBody(String text) { + this.text = text; + } + + @Override + protected String getContentType(Charset charset) { + return "text/plain;charset=" + charset.displayName(); + } + + @Override + public byte[] serializeBody(Charset charset) { + return text.getBytes(charset); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java new file mode 100644 index 0000000..cbfbee5 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java @@ -0,0 +1,27 @@ +package develop.toolkit.http.request.body; + +import java.nio.charset.Charset; + +/** + * Xml富文本Body + * + * @author qiuzhenhao + */ +public class XmlRawHttpRequestBody extends RawHttpRequestDataBody { + + private String xml; + + public XmlRawHttpRequestBody(String xml) { + this.xml = xml; + } + + @Override + protected String getContentType(Charset charset) { + return "application/xml;charset=" + charset.displayName(); + } + + @Override + public byte[] serializeBody(Charset charset) { + return xml.getBytes(charset); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java new file mode 100644 index 0000000..6e5b197 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java @@ -0,0 +1,23 @@ +package develop.toolkit.http.response; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * 简单型响应体处理器 + * 转化为字符串 + * + * @author qiuzhenhao + */ +public class DefaultHttpResponseBodyProcessor implements HttpResponseDataBodyProcessor { + + @Override + public String parseBodyContent(HttpResponseData httpResponseData) throws IOException { + return new String(httpResponseData.getData(), StandardCharsets.UTF_8); + } + + @Override + public String error(HttpResponseData httpResponseData) throws IOException { + return new String(httpResponseData.getData(), StandardCharsets.UTF_8); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java new file mode 100644 index 0000000..ff533f9 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java @@ -0,0 +1,44 @@ +package develop.toolkit.http.response; + +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Http响应体 + * + * @author qiuzhenhao + */ +@Getter +@Setter +public class HttpResponseData { + + private int httpStatus; + + private byte[] data; + + private boolean success; + + private T successBody; + + private Y errorBody; + + private Map headers; + + public HttpResponseData(int httpStatus, byte[] data) { + this.httpStatus = httpStatus; + this.data = data; + } + + public void parseHeaders(Map> headerFields) { + this.headers = new LinkedHashMap<>(); + for (Map.Entry> headerFieldsEntry : headerFields.entrySet()) { + final String headerName = headerFieldsEntry.getKey(); + headers.put(headerName, StringUtils.join(headerFieldsEntry.getValue())); + } + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java new file mode 100644 index 0000000..8da0f01 --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java @@ -0,0 +1,32 @@ +package develop.toolkit.http.response; + +import develop.toolkit.base.utils.CompareAdvice; + +import java.io.IOException; + +/** + * 响应体Body处理器 + * + * @param 请求成功时的返回类型 + * @param 请求失败时的返回类型 + */ +public interface HttpResponseDataBodyProcessor { + + /** + * 实现如何判断请求成功 + */ + default boolean checkSuccess(HttpResponseData httpResponseData) throws IOException { + return CompareAdvice.between(httpResponseData.getHttpStatus(), 200, 300); + } + + /** + * 实现如何解析请求成功时的Body + */ + T parseBodyContent(HttpResponseData httpResponseData) throws IOException; + + /** + * 实现请求失败时的处理 + */ + Y error(HttpResponseData httpResponseData) throws IOException; + +} diff --git a/develop-toolkit-http/src/test/java/Test.java b/develop-toolkit-http/src/test/java/Test.java new file mode 100644 index 0000000..2ae3abb --- /dev/null +++ b/develop-toolkit-http/src/test/java/Test.java @@ -0,0 +1,23 @@ +import develop.toolkit.http.JDKToolkitHttpClient; +import develop.toolkit.http.ToolkitHttpClient; +import develop.toolkit.http.request.HttpMethod; +import develop.toolkit.http.request.HttpRequestData; +import develop.toolkit.http.request.body.FormDataHttpRequestBody; +import develop.toolkit.http.response.DefaultHttpResponseBodyProcessor; +import develop.toolkit.http.response.HttpResponseData; + +public class Test { + + public static void main(String[] args) { + ToolkitHttpClient client = new JDKToolkitHttpClient(); + HttpRequestData requestData = new HttpRequestData(HttpMethod.POST, "http://localhost:9090/data"); + String json = "{\"time\": \"2019-10-01 12:00:00\"}"; + FormDataHttpRequestBody form = new FormDataHttpRequestBody(); + form.addParameter("time", "2019-10-01 12:00:00"); + requestData.setBody(form); + HttpResponseData responseData = client.request(requestData, new DefaultHttpResponseBodyProcessor()); + if (responseData.isSuccess()) { + System.out.println(responseData.getSuccessBody()); + } + } +} diff --git a/pom.xml b/pom.xml index 3b4a171..dd9eb25 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ develop-toolkit-base develop-toolkit-support develop-toolkit-world + develop-toolkit-http @@ -35,6 +36,11 @@ develop-toolkit-support 1.0.2-SNAPSHOT + + com.github.developframework + develop-toolkit-http + 1.0.2-SNAPSHOT + com.github.developframework develop-toolkit-world From 73dc5ff04a096dad08673d25e3b4f7e48c5d07ca Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 27 Nov 2019 17:08:10 +0800 Subject: [PATCH 016/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/http/JDKToolkitHttpClient.java | 6 ++--- ...Body.java => PlainRawHttpRequestBody.java} | 6 ++--- .../ByteHttpResponseBodyProcessor.java | 17 ++++++++++++++ .../DefaultHttpResponseBodyProcessor.java | 8 +++---- .../http/response/HttpResponseData.java | 12 +--------- .../HttpResponseDataBodyProcessor.java | 5 ++-- develop-toolkit-http/src/test/java/Test.java | 23 ------------------- 7 files changed, 30 insertions(+), 47 deletions(-) rename develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/{TextRawHttpRequestBody.java => PlainRawHttpRequestBody.java} (74%) create mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java delete mode 100644 develop-toolkit-http/src/test/java/Test.java diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java index 3f4bc93..e9795ec 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java @@ -47,12 +47,12 @@ public > HttpResponseData httpResponse = httpClient.send(httpRequestBuilder.build(), HttpResponse.BodyHandlers.ofByteArray()); final HttpResponseData responseData = new HttpResponseData<>(httpResponse.statusCode(), httpResponse.body()); - responseData.parseHeaders(httpResponse.headers().map()); + responseData.setHeaders(httpResponse.headers().map()); responseData.setSuccess(httpResponseDataBodyProcessor.checkSuccess(responseData)); if (responseData.isSuccess()) { - responseData.setSuccessBody(httpResponseDataBodyProcessor.parseBodyContent(responseData)); + responseData.setSuccessBody(httpResponseDataBodyProcessor.parseBodyContent(responseData.getData())); } else { - responseData.setErrorBody(httpResponseDataBodyProcessor.error(responseData)); + responseData.setErrorBody(httpResponseDataBodyProcessor.error(responseData.getData())); } return responseData; } catch (Exception e) { diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java similarity index 74% rename from develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java rename to develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java index 4a7ac22..fc6ac5d 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/TextRawHttpRequestBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java @@ -3,15 +3,15 @@ import java.nio.charset.Charset; /** - * Text富文本Body + * Plain富文本Body * * @author qiuzhenhao */ -public class TextRawHttpRequestBody extends RawHttpRequestDataBody { +public class PlainRawHttpRequestBody extends RawHttpRequestDataBody { private String text; - public TextRawHttpRequestBody(String text) { + public PlainRawHttpRequestBody(String text) { this.text = text; } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java new file mode 100644 index 0000000..77c63ae --- /dev/null +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java @@ -0,0 +1,17 @@ +package develop.toolkit.http.response; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +public class ByteHttpResponseBodyProcessor implements HttpResponseDataBodyProcessor { + + @Override + public byte[] parseBodyContent(byte[] data) throws IOException { + return data; + } + + @Override + public String error(byte[] data) throws IOException { + return new String(data, StandardCharsets.UTF_8); + } +} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java index 6e5b197..36766d9 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java @@ -12,12 +12,12 @@ public class DefaultHttpResponseBodyProcessor implements HttpResponseDataBodyProcessor { @Override - public String parseBodyContent(HttpResponseData httpResponseData) throws IOException { - return new String(httpResponseData.getData(), StandardCharsets.UTF_8); + public String parseBodyContent(byte[] data) throws IOException { + return new String(data, StandardCharsets.UTF_8); } @Override - public String error(HttpResponseData httpResponseData) throws IOException { - return new String(httpResponseData.getData(), StandardCharsets.UTF_8); + public String error(byte[] data) throws IOException { + return new String(data, StandardCharsets.UTF_8); } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java index ff533f9..a53497b 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java @@ -2,9 +2,7 @@ import lombok.Getter; import lombok.Setter; -import org.apache.commons.lang3.StringUtils; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -27,18 +25,10 @@ public class HttpResponseData { private Y errorBody; - private Map headers; + private Map> headers; public HttpResponseData(int httpStatus, byte[] data) { this.httpStatus = httpStatus; this.data = data; } - - public void parseHeaders(Map> headerFields) { - this.headers = new LinkedHashMap<>(); - for (Map.Entry> headerFieldsEntry : headerFields.entrySet()) { - final String headerName = headerFieldsEntry.getKey(); - headers.put(headerName, StringUtils.join(headerFieldsEntry.getValue())); - } - } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java index 8da0f01..da8a2b2 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java @@ -22,11 +22,10 @@ default boolean checkSuccess(HttpResponseData httpResponseData) throws IOExcepti /** * 实现如何解析请求成功时的Body */ - T parseBodyContent(HttpResponseData httpResponseData) throws IOException; + T parseBodyContent(byte[] data) throws IOException; /** * 实现请求失败时的处理 */ - Y error(HttpResponseData httpResponseData) throws IOException; - + Y error(byte[] data) throws IOException; } diff --git a/develop-toolkit-http/src/test/java/Test.java b/develop-toolkit-http/src/test/java/Test.java deleted file mode 100644 index 2ae3abb..0000000 --- a/develop-toolkit-http/src/test/java/Test.java +++ /dev/null @@ -1,23 +0,0 @@ -import develop.toolkit.http.JDKToolkitHttpClient; -import develop.toolkit.http.ToolkitHttpClient; -import develop.toolkit.http.request.HttpMethod; -import develop.toolkit.http.request.HttpRequestData; -import develop.toolkit.http.request.body.FormDataHttpRequestBody; -import develop.toolkit.http.response.DefaultHttpResponseBodyProcessor; -import develop.toolkit.http.response.HttpResponseData; - -public class Test { - - public static void main(String[] args) { - ToolkitHttpClient client = new JDKToolkitHttpClient(); - HttpRequestData requestData = new HttpRequestData(HttpMethod.POST, "http://localhost:9090/data"); - String json = "{\"time\": \"2019-10-01 12:00:00\"}"; - FormDataHttpRequestBody form = new FormDataHttpRequestBody(); - form.addParameter("time", "2019-10-01 12:00:00"); - requestData.setBody(form); - HttpResponseData responseData = client.request(requestData, new DefaultHttpResponseBodyProcessor()); - if (responseData.isSuccess()) { - System.out.println(responseData.getSuccessBody()); - } - } -} From 8be7f8442e2d87da7a4c4abb0142b4e4fc19b4a2 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 29 Nov 2019 17:12:06 +0800 Subject: [PATCH 017/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/StringAdvice.java | 22 +++++++++++++ .../toolkit/http/JDKToolkitHttpClient.java | 15 ++++----- .../toolkit/http/ToolkitHttpClient.java | 15 +-------- .../ByteHttpResponseBodyProcessor.java | 17 ---------- .../DefaultHttpResponseBodyProcessor.java | 23 -------------- .../http/response/HttpResponseData.java | 17 +++++----- .../HttpResponseDataBodyProcessor.java | 31 ------------------- 7 files changed, 37 insertions(+), 103 deletions(-) delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 19ac522..5d56a5b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -45,4 +45,26 @@ public static TwoValues cutOff(String string, int index) { string.substring(index) ); } + + /** + * 切掉尾部字符串 + * + * @param string + * @param tail + * @return + */ + public static String cutTail(String string, String tail) { + return string.endsWith(tail) ? string.substring(0, string.length() - tail.length()) : string; + } + + /** + * 切掉头部字符串 + * + * @param string + * @param head + * @return + */ + public static String cutHead(String string, String head) { + return string.startsWith(head) ? string.substring(head.length() + 1) : string; + } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java index e9795ec..12a806c 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java @@ -2,7 +2,6 @@ import develop.toolkit.http.request.HttpRequestData; import develop.toolkit.http.response.HttpResponseData; -import develop.toolkit.http.response.HttpResponseDataBodyProcessor; import lombok.Getter; import java.net.URI; @@ -10,6 +9,7 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; +import java.time.Instant; /** * 基于JDK 11 HttpClient实现 @@ -31,7 +31,7 @@ public JDKToolkitHttpClient(HttpClient httpClient) { } @Override - public > HttpResponseData request(HttpRequestData requestData, P httpResponseDataBodyProcessor) throws HttpFailedException { + public HttpResponseData request(HttpRequestData requestData) throws HttpFailedException { if (requestData.getBody() != null) { requestData.getBody().prepare(requestData); } @@ -45,15 +45,12 @@ public > HttpResponseData httpResponse = httpClient.send(httpRequestBuilder.build(), HttpResponse.BodyHandlers.ofByteArray()); - final HttpResponseData responseData = new HttpResponseData<>(httpResponse.statusCode(), httpResponse.body()); + final long costTime = Instant.now().toEpochMilli() - start.toEpochMilli(); + final HttpResponseData responseData = new HttpResponseData(httpResponse.statusCode(), httpResponse.body()); + responseData.setCostTime(costTime); responseData.setHeaders(httpResponse.headers().map()); - responseData.setSuccess(httpResponseDataBodyProcessor.checkSuccess(responseData)); - if (responseData.isSuccess()) { - responseData.setSuccessBody(httpResponseDataBodyProcessor.parseBodyContent(responseData.getData())); - } else { - responseData.setErrorBody(httpResponseDataBodyProcessor.error(responseData.getData())); - } return responseData; } catch (Exception e) { throw new HttpFailedException("http failed: %s", e, e.getMessage()); diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java index b8dc5b9..9ecbffb 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java @@ -1,9 +1,7 @@ package develop.toolkit.http; import develop.toolkit.http.request.HttpRequestData; -import develop.toolkit.http.response.DefaultHttpResponseBodyProcessor; import develop.toolkit.http.response.HttpResponseData; -import develop.toolkit.http.response.HttpResponseDataBodyProcessor; public interface ToolkitHttpClient { @@ -11,19 +9,8 @@ public interface ToolkitHttpClient { /** * 发送请求 * - * @param * @param httpRequestData - * @param httpResponseDataBodyProcessor * @return */ - > HttpResponseData request(HttpRequestData httpRequestData, P httpResponseDataBodyProcessor) throws HttpFailedException; - - /** - * @param httpRequestData - * @return - * @throws HttpFailedException - */ - default HttpResponseData request(HttpRequestData httpRequestData) throws HttpFailedException { - return request(httpRequestData, new DefaultHttpResponseBodyProcessor()); - } + HttpResponseData request(HttpRequestData httpRequestData) throws HttpFailedException; } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java deleted file mode 100644 index 77c63ae..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/ByteHttpResponseBodyProcessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package develop.toolkit.http.response; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class ByteHttpResponseBodyProcessor implements HttpResponseDataBodyProcessor { - - @Override - public byte[] parseBodyContent(byte[] data) throws IOException { - return data; - } - - @Override - public String error(byte[] data) throws IOException { - return new String(data, StandardCharsets.UTF_8); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java deleted file mode 100644 index 36766d9..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/DefaultHttpResponseBodyProcessor.java +++ /dev/null @@ -1,23 +0,0 @@ -package develop.toolkit.http.response; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -/** - * 简单型响应体处理器 - * 转化为字符串 - * - * @author qiuzhenhao - */ -public class DefaultHttpResponseBodyProcessor implements HttpResponseDataBodyProcessor { - - @Override - public String parseBodyContent(byte[] data) throws IOException { - return new String(data, StandardCharsets.UTF_8); - } - - @Override - public String error(byte[] data) throws IOException { - return new String(data, StandardCharsets.UTF_8); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java index a53497b..9757442 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java @@ -3,32 +3,31 @@ import lombok.Getter; import lombok.Setter; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; /** * Http响应体 - * - * @author qiuzhenhao */ @Getter @Setter -public class HttpResponseData { +public class HttpResponseData { private int httpStatus; private byte[] data; - private boolean success; - - private T successBody; - - private Y errorBody; - private Map> headers; + private long costTime; + public HttpResponseData(int httpStatus, byte[] data) { this.httpStatus = httpStatus; this.data = data; } + + public String getStringBody() { + return new String(data, StandardCharsets.UTF_8); + } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java deleted file mode 100644 index da8a2b2..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseDataBodyProcessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package develop.toolkit.http.response; - -import develop.toolkit.base.utils.CompareAdvice; - -import java.io.IOException; - -/** - * 响应体Body处理器 - * - * @param 请求成功时的返回类型 - * @param 请求失败时的返回类型 - */ -public interface HttpResponseDataBodyProcessor { - - /** - * 实现如何判断请求成功 - */ - default boolean checkSuccess(HttpResponseData httpResponseData) throws IOException { - return CompareAdvice.between(httpResponseData.getHttpStatus(), 200, 300); - } - - /** - * 实现如何解析请求成功时的Body - */ - T parseBodyContent(byte[] data) throws IOException; - - /** - * 实现请求失败时的处理 - */ - Y error(byte[] data) throws IOException; -} From 73bb74382b8cb81632fb6e6d7f9139f58a8e1752 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 2 Jan 2020 21:46:15 +0800 Subject: [PATCH 018/178] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=AD=A6=E6=8C=87?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/StatisticsAdvice.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java new file mode 100644 index 0000000..590ff04 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java @@ -0,0 +1,96 @@ +package develop.toolkit.base.utils; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 统计学指标 + * + * @author qiushui on 2020-01-02. + */ +public final class StatisticsAdvice { + + /** + * 最大值 + * + * @param numbers + * @return + */ + public static double max(Collection numbers) { + return numbers + .stream() + .mapToDouble(Number::doubleValue) + .max().orElseThrow(); + } + + /** + * 最小值 + * + * @param numbers + * @return + */ + public static double min(Collection numbers) { + return numbers + .stream() + .mapToDouble(Number::doubleValue) + .min().orElseThrow(); + } + + /** + * 平均值 + * + * @param numbers + * @return + */ + public static double average(Collection numbers) { + return numbers + .stream() + .mapToDouble(Number::doubleValue) + .average().orElseThrow(); + } + + /** + * 方差 + * + * @param numbers + * @return + */ + public static double variance(Collection numbers) { + final double average = average(numbers); + return numbers + .stream() + .mapToDouble(number -> Math.pow(number.doubleValue() - average, 2)) + .average().orElseThrow(); + } + + /** + * 标准差 + * + * @param numbers + * @return + */ + public static double standardDeviation(Collection numbers) { + return Math.sqrt(variance(numbers)); + } + + /** + * 中位数 + * + * @param numbers + * @return + */ + public static double median(Collection numbers) { + final List list = numbers + .stream() + .sorted() + .map(Number::doubleValue) + .collect(Collectors.toList()); + if (list.size() % 2 == 0) { + int half = list.size() / 2; + return (list.get(half) + list.get(half + 1)) / 2; + } else { + return list.get(list.size() / 2 + 1); + } + } +} From 0553a39eb1829f6678d99f32987be97d7092a21c Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 3 Jan 2020 15:00:58 +0800 Subject: [PATCH 019/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/CollectionAdvice.java | 41 +++++++++++++++++++ .../toolkit/base/utils/StringAdvice.java | 35 +++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index b792d9e..43e8771 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -1,9 +1,11 @@ package develop.toolkit.base.utils; import develop.toolkit.base.struct.CollectionInMap; +import develop.toolkit.base.struct.KeyValuePairs; import develop.toolkit.base.struct.TwoValues; import java.util.*; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -283,6 +285,26 @@ public static CollectionInMap associate(Collection master, Colle return map; } + /** + * 关联 (明确是单个的) + * 将集合target按条件与集合master配对 + * + * @param master + * @param target + * @param predicate + * @param + * @param + * @return + */ + public static KeyValuePairs associateOne(Collection master, Collection target, AssociatePredicate predicate) { + final KeyValuePairs keyValuePairs = new KeyValuePairs<>(); + for (E e : master) { + final T matchT = getFirstTrue(target, t -> predicate.test(e, t)).orElse(null); + keyValuePairs.addKeyValue(e, matchT); + } + return keyValuePairs; + } + /** * 划分 * 按条件把集合拆分成满足条件和不满足条件的两个集合 @@ -325,6 +347,25 @@ public static List> zip(List master, List other) { return list; } + /** + * 分页处理 + * + * @param list + * @param size + * @param consumer + * @param + */ + public static void pagerProcess(List list, int size, Consumer> consumer) { + final int total = list.size(); + final int page = total % size == 0 ? (total / size) : (total / size + 1); + for (int i = 0; i < page; i++) { + int fromIndex = i * size; + int toIndex = fromIndex + Math.min(total - fromIndex, size); + List subList = list.subList(fromIndex, toIndex); + consumer.accept(subList); + } + } + public interface AssociatePredicate { boolean test(E master, T target); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 5d56a5b..df64063 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -2,11 +2,15 @@ import develop.toolkit.base.struct.TwoValues; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * 字符串增强工具 * * @author qiushui on 2018-09-06. - * @since 0.1 */ public final class StringAdvice { @@ -67,4 +71,33 @@ public static String cutTail(String string, String tail) { public static String cutHead(String string, String head) { return string.startsWith(head) ? string.substring(head.length() + 1) : string; } + + /** + * 正则取值 + * + * @param string + * @param regex + * @return + */ + public static List regexMatch(String string, String regex) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(string); + List list = new ArrayList<>(matcher.groupCount()); + while (matcher.find()) { + list.add(matcher.group()); + } + return list; + } + + /** + * 正则开头结尾匹配抓取中间字符串值 + * + * @param string + * @param start + * @param end + * @return + */ + public static List regexMatchStartEnd(String string, String start, String end) { + return regexMatch(string, String.format("(?<=%s)(.+?)(?=%s)", start, end)); + } } From 04b609b498561151a9713fae94e4a2e89f649a97 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 14 Jan 2020 09:27:27 +0800 Subject: [PATCH 020/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-base/src/main/java/module-info.java | 1 - develop-toolkit-http/src/main/java/module-info.java | 6 ++++++ .../src/main/java/module-info.java | 13 +++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 develop-toolkit-http/src/main/java/module-info.java diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index 7b0a702..066407d 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -2,7 +2,6 @@ * @author qiushui on 2019-02-26. */ module develop.toolkit.base { - requires lombok; requires org.slf4j; requires org.apache.commons.lang3; diff --git a/develop-toolkit-http/src/main/java/module-info.java b/develop-toolkit-http/src/main/java/module-info.java new file mode 100644 index 0000000..fec6a19 --- /dev/null +++ b/develop-toolkit-http/src/main/java/module-info.java @@ -0,0 +1,6 @@ +module develop.toolkit.http { + requires develop.toolkit.base; + requires java.net.http; + requires lombok; + requires org.apache.commons.lang3; +} \ No newline at end of file diff --git a/develop-toolkit-support/src/main/java/module-info.java b/develop-toolkit-support/src/main/java/module-info.java index 89d9687..e0e95d1 100644 --- a/develop-toolkit-support/src/main/java/module-info.java +++ b/develop-toolkit-support/src/main/java/module-info.java @@ -2,16 +2,17 @@ * @author qiushui on 2019-02-27. */ module develop.toolkit.support { - requires lombok; + requires com.fasterxml.jackson.databind; + requires com.fasterxml.jackson.dataformat.xml; requires develop.toolkit.base; - requires org.apache.commons.lang3; - requires java.sql; - requires mysql.connector.java; requires expression; requires java.net.http; - requires com.fasterxml.jackson.databind; - requires com.fasterxml.jackson.dataformat.xml; + requires java.sql; + requires lombok; + requires mysql.connector.java; + requires org.apache.commons.lang3; exports develop.toolkit.support.db; exports develop.toolkit.support.db.mysql; + exports develop.toolkit.support.http; } \ No newline at end of file From 8fea084d7cf077fee38c92dc288e422698b50e6e Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 15 Jan 2020 22:38:35 +0800 Subject: [PATCH 021/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/EntityRegistry.java | 91 +++++++++++++++++++ .../toolkit/base/components/EntitySign.java | 16 ++++ .../toolkit/base/components/Sorter.java | 76 ---------------- 3 files changed, 107 insertions(+), 76 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntitySign.java delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java new file mode 100644 index 0000000..9885e24 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java @@ -0,0 +1,91 @@ +package develop.toolkit.base.components; + +import lombok.NonNull; + +import java.io.Serializable; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Optional; + +/** + * 实体注册器 + * + * @author qiushui on 2018-05-29. + */ +public abstract class EntityRegistry, K> implements Serializable { + + private static final long serialVersionUID = 8580818076321536793L; + + protected Map entityMap; + + public EntityRegistry() { + this.entityMap = new LinkedHashMap<>(); + T[] defaultEntities = defaultEntity(); + if (defaultEntities != null) { + for (T defaultEntity : defaultEntities) { + entityMap.put(defaultEntity.key(), defaultEntity); + } + } + } + + /** + * 提供默认实体 + * + * @return 默认实体数组 + */ + protected abstract T[] defaultEntity(); + + /** + * 添加自定义实体 + * + * @param customEntities 自定义实体 + */ + public final void addCustomEntities(@NonNull T[] customEntities) { + if (customEntities != null) { + for (T entity : customEntities) { + entityMap.put(entity.key(), entity); + } + } + } + + /** + * 提取 + * + * @param key 标记 + * @return 实体 + */ + public final Optional extract(K key) { + if (entityMap.containsKey(key)) { + return Optional.of(entityMap.get(key)); + } + return Optional.empty(); + } + + /** + * 强制提取 + * + * @param key 标记 + * @param customRuntimeException 如果实体不存在于注册器则抛出自定义异常 + * @return 实体 + */ + public final T extractRequired(K key, RuntimeException customRuntimeException) { + if (entityMap.containsKey(key)) { + return entityMap.get(key); + } + throw customRuntimeException; + } + + /** + * 提取,失败使用默认值 + * + * @param key 标记 + * @param defaultValue 默认值 + * @return 实体 + */ + public final T extractOrDefault(K key, T defaultValue) { + if (entityMap.containsKey(key)) { + return entityMap.get(key); + } + return defaultValue; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntitySign.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntitySign.java new file mode 100644 index 0000000..2713ee0 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntitySign.java @@ -0,0 +1,16 @@ +package develop.toolkit.base.components; + +/** + * 实体记号接口 + * + * @author qiushui on 2018-05-29. + */ +public interface EntitySign { + + /** + * 识别名 + * + * @return 识别名 + */ + K key(); +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java deleted file mode 100644 index 042afb9..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Sorter.java +++ /dev/null @@ -1,76 +0,0 @@ -package develop.toolkit.base.components; - -import develop.toolkit.base.struct.CollectionInMap; -import lombok.NonNull; - -import java.util.*; - -/** - * 分拣器 - * - * @author qiushui on 2018-07-09. - */ -@Deprecated -public class Sorter { - - private CollectionInMap map = new CollectionInMap<>(key -> new LinkedList()); - - private SortFunction sortFunction; - - public Sorter(@NonNull SortFunction sortFunction) { - this.sortFunction = sortFunction; - } - - /** - * 分拣 - * @param collection - */ - public void sort(Collection collection) { - for (V item : collection) { - K key = sortFunction.sort(item); - map.putItemSoft(key, item); - } - } - - /** - * 清空 - */ - public void clear() { - map.clear(); - } - - /** - * 返回单列列表 - * @param key - * @return - */ - @SuppressWarnings("unchecked") - public List getSingleList(K key) { - if (map.containsKey(key)) { - return new ArrayList<>(map.get(key)); - } else { - return Collections.EMPTY_LIST; - } - } - - /** - * 返回所有键 - * - * @return - */ - public Set allKey() { - return map.keySet(); - } - - @FunctionalInterface - public interface SortFunction { - - /** - * 返回需要投递的key - * - * @param item - * @return - */ - K sort(V item); - } -} From 6ea6f8886ca5db162e6e0d008e1402f62dafcee1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Jan 2020 11:00:43 +0800 Subject: [PATCH 022/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/ObjectAdvice.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index aa46671..a12264c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -1,7 +1,10 @@ package develop.toolkit.base.utils; import lombok.NonNull; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.commons.lang3.reflect.MethodUtils; +import java.lang.reflect.InvocationTargetException; import java.util.function.Supplier; /** @@ -23,6 +26,26 @@ public static T assign(T obj, @NonNull Supplier defaultSupplier) { return obj != null ? obj : defaultSupplier.get(); } + /** + * 是否基本类型 + * + * @param clazz + * @return + */ + @SuppressWarnings("unchecked") + public static boolean isPrimitiveType(Class clazz) { + return valueIn(clazz, + int.class, Integer.class, + long.class, Long.class, + float.class, Float.class, + double.class, Double.class, + boolean.class, Boolean.class, + char.class, Character.class, + short.class, Short.class, + byte.class, Byte.class + ); + } + /** * 是否是字节 * @@ -119,6 +142,7 @@ public static boolean isBoolean(Object obj) { * @param * @return */ + @SafeVarargs public static boolean valueIn(@NonNull T obj, T... targets) { for (T target : targets) { if (obj.equals(target)) { @@ -136,6 +160,7 @@ public static boolean valueIn(@NonNull T obj, T... targets) { * @param * @return */ + @SafeVarargs public static boolean valueNotIn(@NonNull T obj, T... targets) { for (T target : targets) { if (obj.equals(target)) { @@ -144,4 +169,103 @@ public static boolean valueNotIn(@NonNull T obj, T... targets) { } return true; } + + /** + * 反射设置值 + * + * @param instance + * @param field + * @param value + * @param firstUseSetterMethod 优先使用setter方法 + */ + public static void set(Object instance, String field, Object value, boolean firstUseSetterMethod) { + try { + if (firstUseSetterMethod) { + try { + final String setterMethodName = JavaBeanUtils.getSetterMethodName(field); + MethodUtils.invokeMethod(instance, true, setterMethodName); + } catch (NoSuchMethodException e) { + FieldUtils.writeDeclaredField(instance, field, value, true); + } + } else { + FieldUtils.writeDeclaredField(instance, field, value, true); + } + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + /** + * 反射获取值 + * + * @param instance + * @param field + * @param fieldType + * @param firstUseGetterMethod 优先使用getter方法 + * @return + */ + public static Object get(Object instance, String field, Class fieldType, boolean firstUseGetterMethod) { + try { + if (firstUseGetterMethod) { + try { + final String getterMethodName = JavaBeanUtils.getGetterMethodName(field, fieldType); + return MethodUtils.invokeMethod(instance, true, getterMethodName); + } catch (NoSuchMethodException e) { + return FieldUtils.readDeclaredField(instance, field, true); + } + } else { + return FieldUtils.readDeclaredField(instance, field, true); + } + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + /** + * 安静地使用无参构造方法new对象 + * + * @param clazz + * @param + * @return + */ + public static T newInstanceQuietly(Class clazz) { + try { + return clazz.getConstructor().newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 字符串值转化成基本类型值 + * + * @param value + * @param clazz + * @return + */ + public static Object primitiveTypeCast(String value, Class clazz) { + if (value == null) { + return null; + } else if (clazz == String.class) { + return value; + } else if (clazz == int.class || clazz == Integer.class) { + return Integer.parseInt(value); + } else if (clazz == long.class || clazz == Long.class) { + return Long.parseLong(value); + } else if (clazz == boolean.class || clazz == Boolean.class) { + return Boolean.parseBoolean(value); + } else if (clazz == float.class || clazz == Float.class) { + return Float.parseFloat(value); + } else if (clazz == double.class || clazz == Double.class) { + return Double.parseDouble(value); + } else if (clazz == short.class || clazz == Short.class) { + return Short.parseShort(value); + } else if (clazz == char.class || clazz == Character.class) { + return value.charAt(0); + } else if (clazz == byte.class || clazz == Byte.class) { + return Byte.parseByte(value); + } else { + throw new ClassCastException(); + } + } } From 80aa0e7d180da3b094802c12ee0b40a1b4e93fc8 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 25 Feb 2020 14:18:07 +0800 Subject: [PATCH 023/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/IOAdvice.java | 38 ++++++++++----- .../java/develop/toolkit/base/utils/K.java | 48 +++++++++++++++++++ .../toolkit/base/utils/ObjectAdvice.java | 13 ----- 3 files changed, 75 insertions(+), 24 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 8614176..6cc0c34 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -1,7 +1,5 @@ package develop.toolkit.base.utils; -import lombok.NonNull; - import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -27,7 +25,7 @@ public final class IOAdvice { * @throws IOException */ public static Stream readLines(String filename) throws IOException { - return readLines(filename, StandardCharsets.UTF_8); + return readLines(filename, null); } /** @@ -47,10 +45,9 @@ public static Stream readLines(String filename, Charset charset) throws * * @param inputStream * @return - * @throws IOException */ public static Stream readLines(InputStream inputStream) { - return readLines(inputStream, StandardCharsets.UTF_8); + return readLines(inputStream, null); } /** @@ -60,8 +57,8 @@ public static Stream readLines(InputStream inputStream) { * @param charset * @return */ - public static Stream readLines(@NonNull InputStream inputStream, Charset charset) { - Scanner scanner = new Scanner(inputStream, charset); + public static Stream readLines(InputStream inputStream, Charset charset) { + Scanner scanner = new Scanner(inputStream, charset == null ? StandardCharsets.UTF_8 : charset); List lines = new LinkedList<>(); while (scanner.hasNext()) { lines.add(scanner.nextLine()); @@ -70,16 +67,25 @@ public static Stream readLines(@NonNull InputStream inputStream, Charset return lines.stream(); } + /** + * 从classpath读流 + * + * @param filename + * @return + */ + public static InputStream readInputStreamFromClasspath(String filename) { + return IOAdvice.class.getResourceAsStream(filename.startsWith("/") ? filename : ("/" + filename)); + } + /** * 从classpath读取文件 * * @param filename * @param charset * @return - * @throws IOException */ public static Stream readLinesFromClasspath(String filename, Charset charset) { - return readLines(IOAdvice.class.getResourceAsStream(filename), charset); + return readLines(readInputStreamFromClasspath(filename), charset); } /** @@ -87,10 +93,20 @@ public static Stream readLinesFromClasspath(String filename, Charset cha * * @param filename * @return - * @throws IOException */ public static Stream readLinesFromClasspath(String filename) { - return readLines(IOAdvice.class.getResourceAsStream(filename)); + return readLines(readInputStreamFromClasspath(filename), null); + } + + /** + * 从classpath读取文件并每行用regex切分 + * + * @param filename + * @param regex + * @return + */ + public static Stream splitFromClasspath(String filename, String regex) { + return readLinesFromClasspath(filename).map(line -> line.split(regex)); } /** diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java new file mode 100644 index 0000000..8ab3ddd --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java @@ -0,0 +1,48 @@ +package develop.toolkit.base.utils; + +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * 判空处理简化操作 + */ +public final class K { + + /** + * 如果为null返回默认值 + * + * @param value 值 + * @param defaultSupplier 默认值提供器 + * @param + * @return + */ + public static T def(T value, Supplier defaultSupplier) { + return value != null ? value : defaultSupplier.get(); + } + + /** + * 如果不为null则执行consumer + * + * @param value 值 + * @param + */ + public static void let(T value, Consumer consumer) { + if (value != null) { + consumer.accept(value); + } + } + + /** + * 如果不为null则返回转化值 + * + * @param value 值 + * @param function 转化函数 + * @param + * @param + * @return + */ + public static R map(T value, Function function) { + return value != null ? function.apply(value) : null; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index a12264c..aaff96c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -5,7 +5,6 @@ import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.InvocationTargetException; -import java.util.function.Supplier; /** * 实例对象处理增强工具 @@ -14,18 +13,6 @@ */ public final class ObjectAdvice { - /** - * 赋值 - * - * @param obj 值 - * @param defaultSupplier 默认值提供器 - * @param - * @return - */ - public static T assign(T obj, @NonNull Supplier defaultSupplier) { - return obj != null ? obj : defaultSupplier.get(); - } - /** * 是否基本类型 * From a35a43f96f30f85c00fbb7326ab3d1a77941b8f9 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 27 Feb 2020 14:56:56 +0800 Subject: [PATCH 024/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/IOAdvice.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 6cc0c34..8bc70d0 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -17,6 +17,32 @@ */ public final class IOAdvice { + /** + * 转换成字节数组 + * + * @param inputStream + * @return + * @throws IOException + */ + public static byte[] toByteArray(InputStream inputStream) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + inputStream.transferTo(baos); + byte[] data = baos.toByteArray(); + baos.close(); + return data; + } + + /** + * 转换成字节数组 + * + * @param filename + * @return + * @throws IOException + */ + public static byte[] toByteArrayFromClasspath(String filename) throws IOException { + return toByteArray(readInputStreamFromClasspath(filename)); + } + /** * 文件读取行 * @@ -348,7 +374,6 @@ public static void printFile(String filename, Charset charset) throws IOExceptio * * @param inputStream * @param charset - * @throws IOException */ public static void printInputStream(InputStream inputStream, Charset charset) { readLines(inputStream, charset).forEach(System.out::println); From e6bb67da72170fb10b64787315e3ee20e222af93 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 3 Mar 2020 21:25:33 +0800 Subject: [PATCH 025/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/IOAdvice.java | 75 +++++++++++-------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 8bc70d0..8cec8a7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -22,14 +22,17 @@ public final class IOAdvice { * * @param inputStream * @return - * @throws IOException */ - public static byte[] toByteArray(InputStream inputStream) throws IOException { + public static byte[] toByteArray(InputStream inputStream) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - inputStream.transferTo(baos); - byte[] data = baos.toByteArray(); - baos.close(); - return data; + try (inputStream) { + inputStream.transferTo(baos); + byte[] data = baos.toByteArray(); + baos.close(); + return data; + } catch (IOException e) { + throw new RuntimeException(e); + } } /** @@ -37,9 +40,8 @@ public static byte[] toByteArray(InputStream inputStream) throws IOException { * * @param filename * @return - * @throws IOException */ - public static byte[] toByteArrayFromClasspath(String filename) throws IOException { + public static byte[] toByteArrayFromClasspath(String filename) { return toByteArray(readInputStreamFromClasspath(filename)); } @@ -48,9 +50,8 @@ public static byte[] toByteArrayFromClasspath(String filename) throws IOExceptio * * @param filename * @return - * @throws IOException */ - public static Stream readLines(String filename) throws IOException { + public static Stream readLines(String filename) { return readLines(filename, null); } @@ -60,10 +61,13 @@ public static Stream readLines(String filename) throws IOException { * @param filename * @param charset * @return - * @throws IOException */ - public static Stream readLines(String filename, Charset charset) throws IOException { - return readLines(new FileInputStream(filename), charset); + public static Stream readLines(String filename, Charset charset) { + try { + return readLines(new FileInputStream(filename), charset); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } } /** @@ -84,13 +88,17 @@ public static Stream readLines(InputStream inputStream) { * @return */ public static Stream readLines(InputStream inputStream, Charset charset) { - Scanner scanner = new Scanner(inputStream, charset == null ? StandardCharsets.UTF_8 : charset); - List lines = new LinkedList<>(); - while (scanner.hasNext()) { - lines.add(scanner.nextLine()); + try (inputStream) { + Scanner scanner = new Scanner(inputStream, charset == null ? StandardCharsets.UTF_8 : charset); + List lines = new LinkedList<>(); + while (scanner.hasNext()) { + lines.add(scanner.nextLine()); + } + scanner.close(); + return lines.stream(); + } catch (IOException e) { + throw new RuntimeException(e); } - scanner.close(); - return lines.stream(); } /** @@ -233,15 +241,16 @@ public static void forEachFromClasspath(String filename, Consumer consum * @param lines * @param filename * @param charset - * @throws IOException */ - public static void writeLines(List lines, String filename, Charset charset) throws IOException { + public static void writeLines(List lines, String filename, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), charset))) { for (String line : lines) { writer.write(line); writer.newLine(); } writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); } } @@ -251,15 +260,16 @@ public static void writeLines(List lines, String filename, Charset chars * @param lines * @param outputStream * @param charset - * @throws IOException */ - public static void writeLines(List lines, OutputStream outputStream, Charset charset) throws IOException { + public static void writeLines(List lines, OutputStream outputStream, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { for (String line : lines) { writer.write(line); writer.newLine(); } writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); } } @@ -269,15 +279,16 @@ public static void writeLines(List lines, OutputStream outputStream, Cha * @param lines * @param filename * @param charset - * @throws IOException */ - public static void appendLines(List lines, String filename, Charset charset) throws IOException { + public static void appendLines(List lines, String filename, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), charset))) { for (String line : lines) { writer.append(line); writer.newLine(); } writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); } } @@ -287,15 +298,16 @@ public static void appendLines(List lines, String filename, Charset char * @param lines * @param outputStream * @param charset - * @throws IOException */ - public static void appendLines(List lines, OutputStream outputStream, Charset charset) throws IOException { + public static void appendLines(List lines, OutputStream outputStream, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { for (String line : lines) { writer.append(line); writer.newLine(); } writer.flush(); + } catch (IOException e) { + throw new RuntimeException(e); } } @@ -306,9 +318,8 @@ public static void appendLines(List lines, OutputStream outputStream, Ch * @param outputStream * @param charset * @param function - * @throws IOException */ - public static void copyText(InputStream inputStream, OutputStream outputStream, Charset charset, Function function) throws IOException { + public static void copyText(InputStream inputStream, OutputStream outputStream, Charset charset, Function function) { Scanner scanner = new Scanner(inputStream, charset); try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { while (scanner.hasNext()) { @@ -316,6 +327,8 @@ public static void copyText(InputStream inputStream, OutputStream outputStream, writer.write(line); writer.newLine(); } + } catch (IOException e) { + throw new RuntimeException(e); } scanner.close(); } @@ -326,7 +339,6 @@ public static void copyText(InputStream inputStream, OutputStream outputStream, * @param inputStream * @param outputStream * @return - * @throws IOException */ public static long copy(InputStream inputStream, OutputStream outputStream) throws IOException { final byte[] buffer = new byte[4096]; @@ -363,9 +375,8 @@ public static long copyQuietly(File source, File target) { * * @param filename * @param charset - * @throws IOException */ - public static void printFile(String filename, Charset charset) throws IOException { + public static void printFile(String filename, Charset charset) { readLines(filename, charset).forEach(System.out::println); } From 8beb665b3a93c66f4b624c047a1bdda9e9c3b114 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 6 Mar 2020 17:09:06 +0800 Subject: [PATCH 026/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-http/src/main/java/module-info.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/develop-toolkit-http/src/main/java/module-info.java b/develop-toolkit-http/src/main/java/module-info.java index fec6a19..ba2a6a3 100644 --- a/develop-toolkit-http/src/main/java/module-info.java +++ b/develop-toolkit-http/src/main/java/module-info.java @@ -3,4 +3,9 @@ requires java.net.http; requires lombok; requires org.apache.commons.lang3; + + exports develop.toolkit.http.request.body; + exports develop.toolkit.http.request; + exports develop.toolkit.http.response; + exports develop.toolkit.http; } \ No newline at end of file From de2267b5ace6a684cb23242cfcf919274f869ec9 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 6 Mar 2020 23:08:54 +0800 Subject: [PATCH 027/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/http/HttpHeader.java | 26 ----------------- .../toolkit/http/JDKToolkitHttpClient.java | 6 ++-- .../toolkit/http/request/HttpRequestData.java | 28 +++++++++++++------ .../request/body/FormDataHttpRequestBody.java | 5 ++-- .../body/FormUrlencodedHttpRequestBody.java | 13 +++------ .../request/body/HttpRequestDataBody.java | 11 +++++++- .../request/body/JsonRawHttpRequestBody.java | 9 +----- .../request/body/PlainRawHttpRequestBody.java | 9 +----- .../request/body/RawHttpRequestDataBody.java | 13 +++++++++ .../request/body/XmlRawHttpRequestBody.java | 9 +----- .../http/response/HttpResponseData.java | 2 +- 11 files changed, 56 insertions(+), 75 deletions(-) delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java deleted file mode 100644 index f2e6025..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpHeader.java +++ /dev/null @@ -1,26 +0,0 @@ -package develop.toolkit.http; - -import lombok.EqualsAndHashCode; -import lombok.Getter; - -/** - * Http头信息 - */ -@Getter -@EqualsAndHashCode -public class HttpHeader { - - private String headerName; - - private String value; - - public HttpHeader(String headerName, String value) { - this.headerName = headerName; - this.value = value; - } - - @Override - public String toString() { - return String.format("%s: %s", headerName, value); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java index 12a806c..b730de1 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java @@ -37,16 +37,16 @@ public HttpResponseData request(HttpRequestData requestData) throws HttpFailedEx } final byte[] data = requestData.serializeBody(); final HttpRequest.BodyPublisher bodyPublisher = data != null ? HttpRequest.BodyPublishers.ofByteArray(data) : HttpRequest.BodyPublishers.noBody(); - HttpRequest.Builder httpRequestBuilder = HttpRequest.newBuilder() + HttpRequest.Builder builder = HttpRequest.newBuilder() .version(HttpClient.Version.HTTP_1_1) .timeout(Duration.ofSeconds(30L)) .uri(URI.create(requestData.getWholeUrl())) .method(requestData.getHttpMethod().name(), bodyPublisher); - requestData.getHeaders().forEach(httpRequestBuilder::header); + requestData.getHeaders().forEach(builder::header); try { Instant start = Instant.now(); - final HttpResponse httpResponse = httpClient.send(httpRequestBuilder.build(), HttpResponse.BodyHandlers.ofByteArray()); + final HttpResponse httpResponse = httpClient.send(builder.build(), HttpResponse.BodyHandlers.ofByteArray()); final long costTime = Instant.now().toEpochMilli() - start.toEpochMilli(); final HttpResponseData responseData = new HttpResponseData(httpResponse.statusCode(), httpResponse.body()); responseData.setCostTime(costTime); diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java index 620676e..1348ebd 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java @@ -1,5 +1,6 @@ package develop.toolkit.http.request; +import develop.toolkit.base.utils.K; import develop.toolkit.http.request.body.HttpRequestDataBody; import lombok.Getter; import lombok.Setter; @@ -31,7 +32,6 @@ public class HttpRequestData { @Setter private Charset charset = StandardCharsets.UTF_8; - @Setter private HttpRequestDataBody body; public HttpRequestData(HttpMethod httpMethod, String url) { @@ -39,12 +39,19 @@ public HttpRequestData(HttpMethod httpMethod, String url) { this.url = url; } - public void addHeader(String headerName, String value) { + public HttpRequestData addHeader(String headerName, String value) { headers.put(headerName, value); + return this; } - public void addUrlParameter(String parameterName, Object value) { + public HttpRequestData addUrlParameter(String parameterName, Object value) { urlParameters.put(parameterName, value); + return this; + } + + public HttpRequestData addBody(HttpRequestDataBody body) { + this.body = body; + return this; } public String getWholeUrl() { @@ -61,7 +68,6 @@ protected String serializeParameters() { try { return String.format("%s=%s", parameter.getKey(), URLEncoder.encode(parameter.getValue().toString(), charset.displayName())); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); return ""; } }).collect(Collectors.joining("&")); @@ -73,9 +79,15 @@ protected String serializeParameters() { * @return */ public byte[] serializeBody() { - if (body == null) { - return null; - } - return body.serializeBody(charset); + return K.map(body, b -> b.serializeBody(charset)); + } + + /** + * 字符串格式Body + * + * @return + */ + public String stringBody() { + return K.map(body, b -> b.body(charset)); } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java index f899922..0925b40 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java @@ -33,7 +33,7 @@ public FormDataHttpRequestBody(String boundary) { } @Override - public byte[] serializeBody(Charset charset) { + public String body(Charset charset) { StringBuilder sb = new StringBuilder(); for (Map.Entry entry : parameters.entrySet()) { if (entry != null) { @@ -43,8 +43,7 @@ public byte[] serializeBody(Charset charset) { .append(String.format("Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", entry.getKey(), URLEncoder.encode(entry.getValue().toString(), charset))); } } - System.out.println(sb.toString()); - return sb.toString().getBytes(charset); + return sb.toString(); } @Override diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java index a8408ae..25ac67a 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java @@ -22,11 +22,6 @@ public void addParameter(String parameterName, String value) { parameters.put(parameterName, value); } - @Override - public byte[] serializeBody(Charset charset) { - return serializeParameters(charset).getBytes(charset); - } - @Override public void prepare(HttpRequestData httpRequestData) { httpRequestData.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + httpRequestData.getCharset().displayName()); @@ -37,12 +32,12 @@ public void prepare(HttpRequestData httpRequestData) { * * @return */ - protected String serializeParameters(Charset charset) { - return parameters.entrySet().stream().map(parameter -> { + @Override + public String body(Charset charset) { + return parameters.entrySet().stream().map(entry -> { try { - return String.format("%s=%s", parameter.getKey(), URLEncoder.encode(parameter.getValue().toString(), charset.displayName())); + return String.format("%s=%s", entry.getKey(), URLEncoder.encode(entry.getValue().toString(), charset.displayName())); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); return ""; } }).collect(Collectors.joining("&")); diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java index 933f88f..3bacbfe 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java @@ -15,7 +15,16 @@ public interface HttpRequestDataBody { * @param charset * @return */ - byte[] serializeBody(Charset charset); + default byte[] serializeBody(Charset charset) { + return body(charset).getBytes(); + } + + /** + * 字符串格式body + * + * @return + */ + String body(Charset charset); /** * 准备 diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java index 875bcc7..7175d91 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java @@ -7,19 +7,12 @@ */ public class JsonRawHttpRequestBody extends RawHttpRequestDataBody { - private String json; - public JsonRawHttpRequestBody(String json) { - this.json = json; + super(json); } @Override protected String getContentType(Charset charset) { return "application/json;charset=" + charset.displayName(); } - - @Override - public byte[] serializeBody(Charset charset) { - return json.getBytes(charset); - } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java index fc6ac5d..9bbc552 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java @@ -9,19 +9,12 @@ */ public class PlainRawHttpRequestBody extends RawHttpRequestDataBody { - private String text; - public PlainRawHttpRequestBody(String text) { - this.text = text; + super(text); } @Override protected String getContentType(Charset charset) { return "text/plain;charset=" + charset.displayName(); } - - @Override - public byte[] serializeBody(Charset charset) { - return text.getBytes(charset); - } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java index 283c5da..774060d 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java @@ -1,6 +1,7 @@ package develop.toolkit.http.request.body; import develop.toolkit.http.request.HttpRequestData; +import lombok.Getter; import java.nio.charset.Charset; @@ -9,6 +10,13 @@ */ public abstract class RawHttpRequestDataBody implements HttpRequestDataBody { + @Getter + private String raw; + + public RawHttpRequestDataBody(String raw) { + this.raw = raw; + } + @Override public void prepare(HttpRequestData httpRequestData) { httpRequestData.addHeader("Content-Type", getContentType(httpRequestData.getCharset())); @@ -16,4 +24,9 @@ public void prepare(HttpRequestData httpRequestData) { protected abstract String getContentType(Charset charset); + @Override + public String body(Charset charset) { + return raw; + } + } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java index cbfbee5..c23d674 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java @@ -9,19 +9,12 @@ */ public class XmlRawHttpRequestBody extends RawHttpRequestDataBody { - private String xml; - public XmlRawHttpRequestBody(String xml) { - this.xml = xml; + super(xml); } @Override protected String getContentType(Charset charset) { return "application/xml;charset=" + charset.displayName(); } - - @Override - public byte[] serializeBody(Charset charset) { - return xml.getBytes(charset); - } } diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java index 9757442..4ad4cff 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java @@ -27,7 +27,7 @@ public HttpResponseData(int httpStatus, byte[] data) { this.data = data; } - public String getStringBody() { + public String stringBody() { return new String(data, StandardCharsets.UTF_8); } } From 8c74d58e3e3463c67bba5bb50ba06c94e4de3147 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 11 Mar 2020 16:32:29 +0800 Subject: [PATCH 028/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-support/pom.xml | 2 +- pom.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-support/pom.xml b/develop-toolkit-support/pom.xml index 8f10526..bc36fc2 100644 --- a/develop-toolkit-support/pom.xml +++ b/develop-toolkit-support/pom.xml @@ -13,7 +13,7 @@ 3.10.1 8.0.15 - 2.9.9 + 2.10.2 diff --git a/pom.xml b/pom.xml index dd9eb25..bd1c769 100644 --- a/pom.xml +++ b/pom.xml @@ -19,9 +19,9 @@ - 1.18.10 - 1.7.28 - 1.4.0 + 1.18.12 + 1.7.30 + 1.5.0 From 6bddbd0fad16e9bac5482fdd3cb09989417df2c6 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 12 Mar 2020 08:53:55 +0800 Subject: [PATCH 029/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/http/request/HttpRequestData.java | 1 + 1 file changed, 1 insertion(+) diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java index 1348ebd..e18fa22 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java @@ -32,6 +32,7 @@ public class HttpRequestData { @Setter private Charset charset = StandardCharsets.UTF_8; + @Setter private HttpRequestDataBody body; public HttpRequestData(HttpMethod httpMethod, String url) { From 1dce5344f7837e72615e62bb17c14930999a2caf Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 12 Mar 2020 09:00:46 +0800 Subject: [PATCH 030/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/http/request/HttpRequestData.java | 1 - 1 file changed, 1 deletion(-) diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java index e18fa22..1348ebd 100644 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java +++ b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java @@ -32,7 +32,6 @@ public class HttpRequestData { @Setter private Charset charset = StandardCharsets.UTF_8; - @Setter private HttpRequestDataBody body; public HttpRequestData(HttpMethod httpMethod, String url) { From f929e647477e67947f66115ee7782aa4f7dc47ab Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 23 Mar 2020 21:27:23 +0800 Subject: [PATCH 031/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/struct/CollectionInMap.java | 8 ++++---- .../java/develop/toolkit/base/utils/CollectionAdvice.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java index 48b16a7..e967ac5 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java @@ -16,17 +16,17 @@ public class CollectionInMap extends ConcurrentHashMap> implements Serializable { private static final long serialVersionUID = 3068493190714636107L; - private CollectionProvider collectionProvider; + private CollectionProvider collectionProvider; public CollectionInMap() { - this.collectionProvider = k -> new LinkedList(); + this.collectionProvider = k -> new LinkedList<>(); } - public CollectionInMap(@NonNull CollectionProvider collectionProvider) { + public CollectionInMap(@NonNull CollectionProvider collectionProvider) { this.collectionProvider = collectionProvider; } - public CollectionInMap(int initialCapacity, @NonNull CollectionProvider collectionProvider) { + public CollectionInMap(int initialCapacity, @NonNull CollectionProvider collectionProvider) { super(initialCapacity); this.collectionProvider = collectionProvider; } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 43e8771..2b66637 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -198,7 +198,7 @@ public static boolean allAccept(Collection collection, Function fun * @return */ public static CollectionInMap grouping(Collection collection, Function keySupplier, Function valueSupplier) { - CollectionInMap map = new CollectionInMap<>(k -> new LinkedList()); + CollectionInMap map = new CollectionInMap<>(); for (E item : collection) { map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item)); } From a8ac7dc7dfeb158a5a149223a76ff41b95c7972a Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 25 Mar 2020 21:51:43 +0800 Subject: [PATCH 032/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/Counter.java | 80 +++++++++++++++++++ .../toolkit/base/components/StopWatch.java | 12 ++- .../toolkit/base/struct/KeyValuePairs.java | 2 + .../toolkit/base/utils/CollectionAdvice.java | 71 +++++++++------- 4 files changed, 133 insertions(+), 32 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java new file mode 100644 index 0000000..f8f849c --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java @@ -0,0 +1,80 @@ +package develop.toolkit.base.components; + +import develop.toolkit.base.struct.KeyValuePairs; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 计数器 + * + * @author qiushui on 2020-03-25. + */ +public class Counter { + + private ConcurrentHashMap map = new ConcurrentHashMap<>(); + + /** + * 加 + * + * @param key + */ + public void add(K key, final int count) { + map.compute(key, (k, v) -> v == null ? count : (v + count)); + } + + /** + * 加1 + * + * @param key + */ + public void add(K key) { + add(key, 1); + } + + /** + * 减 + * + * @param key + */ + public void subtract(K key, final int count) { + map.compute(key, (k, v) -> (v == null || v == count) ? 0 : (v - count)); + } + + /** + * 减1 + * + * @param key + */ + public void subtract(K key) { + subtract(key, 1); + } + + /** + * 取值 + * + * @param key + * @return + */ + public int get(K key) { + return map.getOrDefault(key, 0); + } + + /** + * 获得所有键集合 + * + * @return + */ + public Set keySet() { + return map.keySet(); + } + + /** + * 转化成KeyValuePairs + * + * @return + */ + public KeyValuePairs toKeyValuePairs() { + return KeyValuePairs.fromMap(map); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java index 11b40ed..cd2e438 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java @@ -17,11 +17,11 @@ public final class StopWatch { private Map startInstantMap = new ConcurrentHashMap<>(); - private StopWatch() { - start(DEFAULT_NAME); + private StopWatch(String name) { + pause(name); } - public void start(String name) { + public void pause(String name) { startInstantMap.put(name, Instant.now()); } @@ -47,6 +47,10 @@ public String formatEnd(String label, String name) { } public static StopWatch start() { - return new StopWatch(); + return new StopWatch(DEFAULT_NAME); + } + + public static StopWatch start(String name) { + return new StopWatch(name); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java index 5f565c3..ee892a1 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java @@ -10,6 +10,8 @@ */ public class KeyValuePairs extends LinkedList> { + private static final long serialVersionUID = -3327179013671312416L; + /** * 添加键值对 * diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 2b66637..5b2f015 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -1,5 +1,6 @@ package develop.toolkit.base.utils; +import develop.toolkit.base.components.Counter; import develop.toolkit.base.struct.CollectionInMap; import develop.toolkit.base.struct.KeyValuePairs; import develop.toolkit.base.struct.TwoValues; @@ -29,7 +30,7 @@ public final class CollectionAdvice { public static boolean contains(Collection collection, Object target, Function function) { if (collection != null) { for (E item : collection) { - Object value = function == null ? item : function.apply(item); + Object value = function.apply(item); if (target == null) { return value == null; } else if (target.equals(value)) { @@ -52,10 +53,12 @@ public static boolean contains(Collection collection, Object target, Func public static Optional getFirstMatch(Collection collection, Object target, Function function) { if (collection != null) { for (E item : collection) { - Object value = function == null ? item : function.apply(item); - if (target == null) { - return value == null ? Optional.ofNullable(item) : Optional.empty(); - } else if (target.equals(value)) { + final Object value = function.apply(item); + if (target != null) { + if (target.equals(value)) { + return Optional.ofNullable(item); + } + } else if (value == null) { return Optional.ofNullable(item); } } @@ -63,6 +66,25 @@ public static Optional getFirstMatch(Collection collection, Object tar return Optional.empty(); } + /** + * 获得第一个匹配的元素 + * + * @param collection + * @param target + * @param + * @return + */ + public static Optional getFirstMatch(Collection collection, Object target) { + if (collection != null && target != null) { + for (E item : collection) { + if (target.equals(item)) { + return Optional.of(item); + } + } + } + return Optional.empty(); + } + /** * 获得第一个判断是true的元素 * @@ -114,14 +136,17 @@ public static List getAllMatch(Collection collection, Object target, F if (collection == null) { return null; } - return collection.stream().filter(item -> { - Object value = function == null ? item : function.apply(item); - if (target == null) { - return value == null; - } else { - return target.equals(value); - } - }).collect(Collectors.toList()); + return collection + .stream() + .filter(item -> { + Object value = function == null ? item : function.apply(item); + if (target == null) { + return value == null; + } else { + return target.equals(value); + } + }) + .collect(Collectors.toList()); } /** @@ -199,9 +224,7 @@ public static boolean allAccept(Collection collection, Function fun */ public static CollectionInMap grouping(Collection collection, Function keySupplier, Function valueSupplier) { CollectionInMap map = new CollectionInMap<>(); - for (E item : collection) { - map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item)); - } + collection.forEach(item -> map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item))); return map; } @@ -214,18 +237,10 @@ public static CollectionInMap grouping(Collection collection, * @param * @return */ - public static Map groupingCount(Collection collection, Function keySupplier) { - Map map = new HashMap<>(); - for (E item : collection) { - K key = keySupplier.apply(item); - Integer v; - if ((v = map.get(key)) != null) { - map.put(key, ++v); - } else { - map.put(key, 1); - } - } - return map; + public static Counter groupingCount(Collection collection, Function keySupplier) { + Counter counter = new Counter<>(); + collection.forEach(item -> counter.add(keySupplier.apply(item))); + return counter; } /** From 49afc0c382327f972af2100f2dcb262604ff1c79 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 2 Apr 2020 14:53:16 +0800 Subject: [PATCH 033/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/base/utils/CollectionAdvice.java | 2 +- .../src/main/java/develop/toolkit/world/normal/Season.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 5b2f015..b4306f4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -370,7 +370,7 @@ public static List> zip(List master, List other) { * @param consumer * @param */ - public static void pagerProcess(List list, int size, Consumer> consumer) { + public static void pagingProcess(List list, int size, Consumer> consumer) { final int total = list.size(); final int page = total % size == 0 ? (total / size) : (total / size + 1); for (int i = 0; i < page; i++) { diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java index 2beb725..9aa46b7 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java @@ -73,7 +73,7 @@ public TwoValues range() { */ public int getDayOfSeason(LocalDate day) { if (isDayAt(MonthDay.from(day), this)) { - return (int) range().getFirstValue().atYear(day.getYear()).until(day, ChronoUnit.DAYS); + return (int) range().getFirstValue().atYear(day.getYear()).until(day, ChronoUnit.DAYS) + 1; } return -1; } From 5368d8c878608e98f49c15472f538c786a4c315f Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 8 Apr 2020 09:52:52 +0800 Subject: [PATCH 034/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/support/db/mysql/MysqlClient.java | 7 ++++--- .../java/develop/toolkit/support/db/mysql/RowMapper.java | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java index 966a7bd..091ba02 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java @@ -5,6 +5,7 @@ import org.apache.commons.lang3.StringUtils; import java.sql.*; +import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -114,12 +115,12 @@ public Optional queryOne(String sql, PreparedStatementSetter setter, RowM ); } - public int insertAll(String table, List list, String... fields) throws SQLException { + public int insertAll(String table, Collection collection, String... fields) throws SQLException { String sql = new StringBuilder() .append("INSERT INTO ").append(table).append("(") - .append(StringUtils.join(fields, ",")).append(") VALUES") + .append(Stream.of(fields).map(f -> "`" + f + "`").collect(Collectors.joining(","))).append(") VALUES") .append( - list + collection .stream() .map(data -> "(" + Stream.of(fields) diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java index 7b6abf1..fcc7575 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java @@ -1,11 +1,12 @@ package develop.toolkit.support.db.mysql; import java.sql.ResultSet; +import java.sql.SQLException; /** * @author qiushui on 2019-09-03. */ public interface RowMapper { - T mapping(ResultSet resultSet); + T mapping(ResultSet resultSet) throws SQLException; } From bd9ec3d3ca140fe03c8fa7d52413e8639c09284b Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 11 Apr 2020 16:38:45 +0800 Subject: [PATCH 035/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/base/utils/DateTimeAdvice.java | 4 +--- .../main/java/develop/toolkit/support/http/HttpAdvice.java | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java index ec1c168..5329361 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java @@ -152,9 +152,7 @@ public static Date fromLocalDate(LocalDate localDate) { if (localDate == null) { return null; } - LocalTime localTime = LocalTime.of(0, 0, 0, 0); - LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); - return fromLocalDateTime(localDateTime); + return fromLocalDateTime(localDate.atTime(LocalTime.MIN)); } /** diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java index dc10c38..e931f42 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java @@ -9,6 +9,7 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.Map; import java.util.stream.Collectors; @@ -163,7 +164,9 @@ private static HttpAdviceResponse send(String label, HttpClient httpClient, Http httpRequest = builder.method( httpMethod.name(), content == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(content, StandardCharsets.UTF_8) - ).build(); + ) + .timeout(Duration.ofSeconds(10L)) + .build(); HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofByteArray()); response = new HttpAdviceResponse( httpResponse.statusCode(), From e6ec76a93c0a3e13b0b8d0aac0d60dcbdc2c1856 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 20 Apr 2020 08:54:09 +0800 Subject: [PATCH 036/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/utils/CollectionAdvice.java | 6 ++++++ .../main/java/develop/toolkit/base/utils/StringAdvice.java | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index b4306f4..01db312 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -228,6 +228,12 @@ public static CollectionInMap grouping(Collection collection, return map; } + public static CollectionInMap grouping(Collection collection, Function keySupplier) { + CollectionInMap map = new CollectionInMap<>(); + collection.forEach(item -> map.putItemSoft(keySupplier.apply(item), item)); + return map; + } + /** * 分组求数量 * diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index df64063..7739aa9 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -69,7 +69,7 @@ public static String cutTail(String string, String tail) { * @return */ public static String cutHead(String string, String head) { - return string.startsWith(head) ? string.substring(head.length() + 1) : string; + return string.startsWith(head) ? string.substring(head.length()) : string; } /** From eef7c0817f580b852826e67cf16af700cc1f31fc Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 1 May 2020 15:25:51 +0800 Subject: [PATCH 037/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/struct/Pager.java | 15 ++++++++++-- .../toolkit/base/struct/PagerResult.java | 16 ++++--------- .../toolkit/base/utils/ObjectAdvice.java | 19 +++++++++++++++ .../toolkit/base/utils/StringAdvice.java | 23 ++++++++++++++----- 4 files changed, 54 insertions(+), 19 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java index ae5aa16..375ffca 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java @@ -1,7 +1,7 @@ package develop.toolkit.base.struct; -import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.Setter; import java.io.Serializable; @@ -11,7 +11,6 @@ * @author qiushui on 2018-06-07. * @since 0.1 */ -@AllArgsConstructor public class Pager implements Serializable { private static final long serialVersionUID = -4527797845938921337L; @@ -26,8 +25,20 @@ public class Pager implements Serializable { @Getter protected int size; + /* 记录总条数 */ + @Setter + private long recordTotal; + + /* 页总数 */ + @Setter + private long pageTotal; + public Pager() { this(DEFAULT_PAGE, DEFAULT_SIZE); } + public Pager(int page, int size) { + this.page = page; + this.size = size; + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java index 8d94efe..762a615 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java @@ -19,21 +19,15 @@ public class PagerResult implements Serializable { /* 数据列表 */ private List list; - /* 记录总条数 */ - private long recordTotal; - /* 分页信息 */ private Pager pager; - /* 页总数 */ - private long pageTotal; - public PagerResult(Pager pager, List list, long recordTotal) { - this.list = list; - this.recordTotal = recordTotal; - this.pager = pager; - this.pageTotal = recordTotal % pager.getSize() == 0 ? recordTotal / pager.getSize() : (recordTotal / pager.getSize() + 1L); - } + this.list = list; + this.pager = pager; + this.pager.setRecordTotal(recordTotal); + this.pager.setPageTotal(recordTotal % pager.getSize() == 0 ? recordTotal / pager.getSize() : (recordTotal / pager.getSize() + 1L)); + } public PagerResult(int page, int size, List list, long total) { this(new Pager(page, size), list, total); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index aaff96c..791c6bd 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -1,9 +1,11 @@ package develop.toolkit.base.utils; +import develop.toolkit.base.struct.KeyValuePairs; import lombok.NonNull; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.MethodUtils; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; /** @@ -208,6 +210,23 @@ public static Object get(Object instance, String field, Class fieldType, bool } } + /** + * 读取全部字段值 + * + * @param instance + * @return + */ + public static KeyValuePairs readAllFieldValue(Object instance) { + Class instanceClass = instance.getClass(); + KeyValuePairs keyValuePairs = new KeyValuePairs<>(); + + Field[] fields = instanceClass.getDeclaredFields(); + for (Field field : fields) { + keyValuePairs.addKeyValue(field.getName(), get(instance, field.getName(), field.getType(), true)); + } + return keyValuePairs; + } + /** * 安静地使用无参构造方法new对象 * diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 7739aa9..fd8f9d2 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -34,12 +34,23 @@ public static boolean isNotEmpty(String content) { return content != null && !content.isEmpty(); } - /** - * 从index位置切断字符串 - * @param string - * @param index - * @return - */ + /** + * null话默认为空字符串 + * + * @param content + * @return + */ + public static String defaultEmpty(String content) { + return content != null ? content : ""; + } + + /** + * 从index位置切断字符串 + * + * @param string + * @param index + * @return + */ public static TwoValues cutOff(String string, int index) { if (index > string.length() || index < 0) { return null; From 7d5f983e66c0cb70501467af7f543d49f45e6fa4 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 3 May 2020 17:17:29 +0800 Subject: [PATCH 038/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/support/db/mysql/PreparedStatementSetter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java index 3e14bf4..ad59be7 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java +++ b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java @@ -1,11 +1,12 @@ package develop.toolkit.support.db.mysql; import java.sql.PreparedStatement; +import java.sql.SQLException; /** * @author qiushui on 2019-09-03. */ public interface PreparedStatementSetter { - void set(PreparedStatement preparedStatement); + void set(PreparedStatement preparedStatement) throws SQLException; } From 6cff6f93ed1bef3a517091a4ef55d2f7355d7d96 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 13 May 2020 15:12:53 +0800 Subject: [PATCH 039/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct}/HttpAdviceResponse.java | 17 +---- .../toolkit/base/utils}/HttpAdvice.java | 70 ++++++++++++++----- .../src/main/java/module-info.java | 1 + develop-toolkit-support/pom.xml | 13 ---- .../toolkit/support/http/HttpMethod.java | 12 ---- .../src/main/java/module-info.java | 3 - 6 files changed, 55 insertions(+), 61 deletions(-) rename {develop-toolkit-support/src/main/java/develop/toolkit/support/http => develop-toolkit-base/src/main/java/develop/toolkit/base/struct}/HttpAdviceResponse.java (66%) rename {develop-toolkit-support/src/main/java/develop/toolkit/support/http => develop-toolkit-base/src/main/java/develop/toolkit/base/utils}/HttpAdvice.java (74%) delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpMethod.java diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java similarity index 66% rename from develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java rename to develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java index 88bb35d..9a07a5c 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdviceResponse.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java @@ -1,14 +1,11 @@ -package develop.toolkit.support.http; +package develop.toolkit.base.struct; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.apache.commons.lang3.StringUtils; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -25,18 +22,10 @@ public class HttpAdviceResponse { private byte[] body; - public String ofString() { + public String bodyOfString() { return new String(body, StandardCharsets.UTF_8); } - public T parseJson(Class clazz, ObjectMapper objectMapper) throws IOException { - return objectMapper.readValue(body, clazz); - } - - public T parseXml(Class clazz, XmlMapper xmlMapper) throws IOException { - return xmlMapper.readValue(body, clazz); - } - public String getHeader(String header) { return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); } @@ -49,7 +38,7 @@ public String toString() { for (Map.Entry> entry : headers.entrySet()) { sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } - sb.append(" body: ").append(ofString()); + sb.append(" body: ").append(bodyOfString()); return sb.toString(); } } diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java similarity index 74% rename from develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java rename to develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index e931f42..8ec2618 100644 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -1,5 +1,6 @@ -package develop.toolkit.support.http; +package develop.toolkit.base.utils; +import develop.toolkit.base.struct.HttpAdviceResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -19,6 +20,37 @@ @Slf4j public final class HttpAdvice { + /** + * 通用请求 + * + * @param label + * @param httpClient + * @param httpMethod + * @param url + * @param headers + * @param parameters + * @param content + * @return + * @throws IOException + */ + public static HttpAdviceResponse request( + String label, + HttpClient httpClient, + String httpMethod, + String url, + Map headers, + Map parameters, + String content + ) throws IOException { + return send( + label, + httpClient, + httpMethod, + builder(url, headers, parameters), + content + ); + } + /** * GET请求 * @@ -33,39 +65,39 @@ public static HttpAdviceResponse get(String label, HttpClient httpClient, String return send( label, httpClient, - HttpMethod.GET, + "GET", builder(url, headers, parameters), null ); } - public static HttpAdviceResponse post(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { + public static HttpAdviceResponse post(String label, HttpClient httpClient, String url, Map headers, String content) throws IOException { return send( label, httpClient, - HttpMethod.POST, - builder(url, headers, parameters), - null + "POST", + builder(url, headers, null), + content ); } - public static HttpAdviceResponse put(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { + public static HttpAdviceResponse put(String label, HttpClient httpClient, String url, Map headers, String content) throws IOException { return send( label, httpClient, - HttpMethod.PUT, - builder(url, headers, parameters), - null + "PUT", + builder(url, headers, null), + content ); } - public static HttpAdviceResponse delete(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { + public static HttpAdviceResponse delete(String label, HttpClient httpClient, String url, Map headers, String content) throws IOException { return send( label, httpClient, - HttpMethod.DELETE, - builder(url, headers, parameters), - null + "DELETE", + builder(url, headers, null), + content ); } @@ -81,7 +113,7 @@ public static HttpAdviceResponse delete(String label, HttpClient httpClient, Str * @return * @throws IOException */ - public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient httpClient, HttpMethod httpMethod, String url, Map headers, Map parameters, Map form) throws IOException { + public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, Map form) throws IOException { return send( label, httpClient, @@ -107,7 +139,7 @@ public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient htt * @return * @throws IOException */ - public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, HttpMethod httpMethod, String url, Map headers, Map parameters, String json) throws IOException { + public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, String json) throws IOException { return send( label, httpClient, @@ -129,7 +161,7 @@ public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, H * @return * @throws IOException */ - public static HttpAdviceResponse sendXml(String label, HttpClient httpClient, HttpMethod httpMethod, String url, Map headers, Map parameters, String xml) throws IOException { + public static HttpAdviceResponse sendXml(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, String xml) throws IOException { return send( label, httpClient, @@ -157,12 +189,12 @@ private static HttpRequest.Builder builder(String url, Map heade return builder; } - private static HttpAdviceResponse send(String label, HttpClient httpClient, HttpMethod httpMethod, HttpRequest.Builder builder, String content) throws IOException { + private static HttpAdviceResponse send(String label, HttpClient httpClient, String httpMethod, HttpRequest.Builder builder, String content) throws IOException { HttpAdviceResponse response = null; HttpRequest httpRequest = null; try { httpRequest = builder.method( - httpMethod.name(), + httpMethod, content == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(content, StandardCharsets.UTF_8) ) .timeout(Duration.ofSeconds(10L)) diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index 066407d..98bfb35 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -5,6 +5,7 @@ requires lombok; requires org.slf4j; requires org.apache.commons.lang3; + requires java.net.http; exports develop.toolkit.base.components; exports develop.toolkit.base.constants; diff --git a/develop-toolkit-support/pom.xml b/develop-toolkit-support/pom.xml index bc36fc2..e4ae60b 100644 --- a/develop-toolkit-support/pom.xml +++ b/develop-toolkit-support/pom.xml @@ -13,7 +13,6 @@ 3.10.1 8.0.15 - 2.10.2 @@ -33,17 +32,5 @@ ${version.mysql-connector-java} true - - com.fasterxml.jackson.core - jackson-databind - ${version.jackson} - true - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - ${version.jackson} - true - \ No newline at end of file diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpMethod.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpMethod.java deleted file mode 100644 index 43adfc0..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/http/HttpMethod.java +++ /dev/null @@ -1,12 +0,0 @@ -package develop.toolkit.support.http; - -public enum HttpMethod { - - GET, - - POST, - - PUT, - - DELETE -} diff --git a/develop-toolkit-support/src/main/java/module-info.java b/develop-toolkit-support/src/main/java/module-info.java index e0e95d1..a38773c 100644 --- a/develop-toolkit-support/src/main/java/module-info.java +++ b/develop-toolkit-support/src/main/java/module-info.java @@ -2,8 +2,6 @@ * @author qiushui on 2019-02-27. */ module develop.toolkit.support { - requires com.fasterxml.jackson.databind; - requires com.fasterxml.jackson.dataformat.xml; requires develop.toolkit.base; requires expression; requires java.net.http; @@ -14,5 +12,4 @@ exports develop.toolkit.support.db; exports develop.toolkit.support.db.mysql; - exports develop.toolkit.support.http; } \ No newline at end of file From 298ea7b2c2af039522de6304ba393637fa973497 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 15 May 2020 14:49:27 +0800 Subject: [PATCH 040/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/CollectionInMap.java | 13 ++++++------- .../toolkit/base/utils/CollectionAdvice.java | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java index e967ac5..46f477b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java @@ -2,10 +2,9 @@ import lombok.NonNull; -import java.io.Serializable; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.LinkedList; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; /** @@ -13,14 +12,14 @@ * * @author qiushui on 2018-07-09. */ -public class CollectionInMap extends ConcurrentHashMap> implements Serializable { +public class CollectionInMap extends LinkedHashMap> { - private static final long serialVersionUID = 3068493190714636107L; + private static final long serialVersionUID = 3068493190714636107L; private CollectionProvider collectionProvider; - public CollectionInMap() { - this.collectionProvider = k -> new LinkedList<>(); - } + public CollectionInMap() { + this.collectionProvider = k -> new LinkedList<>(); + } public CollectionInMap(@NonNull CollectionProvider collectionProvider) { this.collectionProvider = collectionProvider; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 01db312..0cf78c6 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -283,6 +283,20 @@ public static Set intersection(Collection master, Collection... oth return set; } + /** + * 补集 + * + * @param master + * @param other + * @param + * @return + */ + public static Set complementary(Collection master, Collection other) { + Set set = new HashSet<>(master); + set.removeIf(other::contains); + return set; + } + /** * 关联 * 将集合target按条件与集合master配对 From 2a5050461260c02dbfa6af4cd01110ee2ba729a1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 15 May 2020 15:15:36 +0800 Subject: [PATCH 041/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/CollectionAdvice.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 0cf78c6..ce0bed9 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -9,6 +9,7 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -297,6 +298,23 @@ public static Set complementary(Collection master, Collection other return set; } + /** + * 合并多集合 + * + * @param supplier + * @param collections + * @param + * @return + */ + @SafeVarargs + public static Collection merge(Supplier> supplier, Collection... collections) { + Collection collection = supplier.get(); + for (Collection coll : collections) { + collection.addAll(coll); + } + return collection; + } + /** * 关联 * 将集合target按条件与集合master配对 From c865f928abaec3ea0bd35b426396faaec66ce4e5 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 16 May 2020 12:09:50 +0800 Subject: [PATCH 042/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/CollectionInMap.java | 38 ++--- .../toolkit/base/utils/CollectionAdvice.java | 130 ++---------------- .../develop/toolkit/base/utils/IOAdvice.java | 25 ++-- .../toolkit/base/utils/ObjectAdvice.java | 48 +++---- .../toolkit/base/utils/StringAdvice.java | 13 +- 5 files changed, 66 insertions(+), 188 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java index 46f477b..b08cb3a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java @@ -6,6 +6,7 @@ import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.function.Predicate; +import java.util.function.Supplier; /** * Map里有集合结构 @@ -15,32 +16,33 @@ public class CollectionInMap extends LinkedHashMap> { private static final long serialVersionUID = 3068493190714636107L; - private CollectionProvider collectionProvider; + private final Supplier> supplier; public CollectionInMap() { - this.collectionProvider = k -> new LinkedList<>(); + this.supplier = LinkedList::new; } - public CollectionInMap(@NonNull CollectionProvider collectionProvider) { - this.collectionProvider = collectionProvider; + public CollectionInMap(Supplier> supplier) { + this.supplier = supplier; } - public CollectionInMap(int initialCapacity, @NonNull CollectionProvider collectionProvider) { + public CollectionInMap(int initialCapacity, Supplier> supplier) { super(initialCapacity); - this.collectionProvider = collectionProvider; + this.supplier = supplier; } /** * 追加元素 - * @param key map key + * + * @param key map key * @param item 新元素 */ - public void putItem(K key, V item) { + public void putItem(K key, V item) { if (containsKey(key)) { Collection collection = get(key); collection.add(item); } else { - throw new IllegalStateException("key \"" + "\" is not exist."); + throw new IllegalStateException("key \"" + key + "\" is not exist."); } } @@ -54,7 +56,7 @@ public void putAllItem(K key, @NonNull Collection items) { Collection collection = get(key); collection.addAll(items); } else { - throw new IllegalStateException("key \"" + "\" is not exist."); + throw new IllegalStateException("key \"" + key + "\" is not exist."); } } @@ -63,13 +65,12 @@ public void putAllItem(K key, @NonNull Collection items) { * @param key map key * @param item 新元素 */ - @SuppressWarnings("unchecked") public void putItemSoft(K key, V item) { if (containsKey(key)) { Collection collection = get(key); collection.add(item); } else { - Collection collection = collectionProvider.provide(key); + Collection collection = supplier.get(); collection.add(item); put(key, collection); } @@ -80,13 +81,12 @@ public void putItemSoft(K key, V item) { * @param key map key * @param items 新元素 */ - @SuppressWarnings("unchecked") public void putAllItemSoft(K key, @NonNull Collection items) { if (containsKey(key)) { Collection collection = get(key); collection.addAll(items); } else { - Collection collection = collectionProvider.provide(key); + Collection collection = supplier.get(); collection.addAll(items); put(key, collection); } @@ -119,14 +119,4 @@ public void removeIfItem(K key, @NonNull Predicate filter) { throw new IllegalStateException("key \"" + key + "\" is not exist."); } } - - /** - * 集合提供器 - * @param - */ - @FunctionalInterface - public interface CollectionProvider { - - Collection provide(K key); - } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index ce0bed9..ff426bb 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -6,10 +6,7 @@ import develop.toolkit.base.struct.TwoValues; import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; +import java.util.function.*; import java.util.stream.Collectors; /** @@ -21,12 +18,6 @@ public final class CollectionAdvice { /** * 检查元素 - * - * @param collection - * @param target - * @param function - * @param - * @return */ public static boolean contains(Collection collection, Object target, Function function) { if (collection != null) { @@ -44,12 +35,6 @@ public static boolean contains(Collection collection, Object target, Func /** * 获得第一个匹配的元素 - * - * @param collection - * @param target - * @param function - * @param - * @return */ public static Optional getFirstMatch(Collection collection, Object target, Function function) { if (collection != null) { @@ -69,11 +54,6 @@ public static Optional getFirstMatch(Collection collection, Object tar /** * 获得第一个匹配的元素 - * - * @param collection - * @param target - * @param - * @return */ public static Optional getFirstMatch(Collection collection, Object target) { if (collection != null && target != null) { @@ -88,11 +68,6 @@ public static Optional getFirstMatch(Collection collection, Object tar /** * 获得第一个判断是true的元素 - * - * @param collection - * @param predicate - * @param - * @return */ public static Optional getFirstTrue(Collection collection, Predicate predicate) { if (collection != null) { @@ -107,11 +82,6 @@ public static Optional getFirstTrue(Collection collection, Predicate - * @return */ public static Optional getFirstFalse(Collection collection, Predicate predicate) { if (collection != null) { @@ -126,12 +96,6 @@ public static Optional getFirstFalse(Collection collection, Predicate< /** * 获得全部匹配的元素 - * - * @param collection - * @param target - * @param function - * @param - * @return */ public static List getAllMatch(Collection collection, Object target, Function function) { if (collection == null) { @@ -152,11 +116,6 @@ public static List getAllMatch(Collection collection, Object target, F /** * 全部匹配 - * - * @param collection - * @param predicate - * @param - * @return */ public static boolean allMatch(Collection collection, Predicate predicate) { if (predicate == null || collection == null) { @@ -172,11 +131,6 @@ public static boolean allMatch(Collection collection, Predicate predic /** * 任意一个匹配 - * - * @param collection - * @param predicate - * @param - * @return */ public static boolean anyMatch(Collection collection, Predicate predicate) { if (collection != null && predicate != null) { @@ -191,11 +145,6 @@ public static boolean anyMatch(Collection collection, Predicate predic /** * 判断所有元素的处理值相等 - * - * @param collection - * @param function - * @param - * @return */ public static boolean allAccept(Collection collection, Function function) { if (collection == null || collection.isEmpty()) { @@ -214,14 +163,6 @@ public static boolean allAccept(Collection collection, Function fun /** * 分组 - * - * @param collection - * @param keySupplier - * @param valueSupplier - * @param - * @param - * @param - * @return */ public static CollectionInMap grouping(Collection collection, Function keySupplier, Function valueSupplier) { CollectionInMap map = new CollectionInMap<>(); @@ -235,14 +176,14 @@ public static CollectionInMap grouping(Collection collection, Fu return map; } + public static Map groupingUniqueKey(Collection collection, Function keySupplier) { + Map map = new HashMap<>(); + collection.forEach(item -> map.put(keySupplier.apply(item), item)); + return map; + } + /** * 分组求数量 - * - * @param collection - * @param keySupplier - * @param - * @param - * @return */ public static Counter groupingCount(Collection collection, Function keySupplier) { Counter counter = new Counter<>(); @@ -252,11 +193,6 @@ public static Counter groupingCount(Collection collection, Function /** * 并集 - * - * @param master - * @param other - * @param - * @return */ @SafeVarargs public static Set union(Collection master, Collection... other) { @@ -269,11 +205,6 @@ public static Set union(Collection master, Collection... other) { /** * 交集 - * - * @param master - * @param other - * @param - * @return */ @SafeVarargs public static Set intersection(Collection master, Collection... other) { @@ -286,11 +217,6 @@ public static Set intersection(Collection master, Collection... oth /** * 补集 - * - * @param master - * @param other - * @param - * @return */ public static Set complementary(Collection master, Collection other) { Set set = new HashSet<>(master); @@ -300,11 +226,6 @@ public static Set complementary(Collection master, Collection other /** * 合并多集合 - * - * @param supplier - * @param collections - * @param - * @return */ @SafeVarargs public static Collection merge(Supplier> supplier, Collection... collections) { @@ -318,15 +239,8 @@ public static Collection merge(Supplier> supplier, Collecti /** * 关联 * 将集合target按条件与集合master配对 - * - * @param master - * @param target - * @param predicate - * @param - * @param - * @return */ - public static CollectionInMap associate(Collection master, Collection target, AssociatePredicate predicate) { + public static CollectionInMap associate(Collection master, Collection target, BiPredicate predicate) { CollectionInMap map = new CollectionInMap<>(); for (E e : master) { for (T t : target) { @@ -341,15 +255,8 @@ public static CollectionInMap associate(Collection master, Colle /** * 关联 (明确是单个的) * 将集合target按条件与集合master配对 - * - * @param master - * @param target - * @param predicate - * @param - * @param - * @return */ - public static KeyValuePairs associateOne(Collection master, Collection target, AssociatePredicate predicate) { + public static KeyValuePairs associateOne(Collection master, Collection target, BiPredicate predicate) { final KeyValuePairs keyValuePairs = new KeyValuePairs<>(); for (E e : master) { final T matchT = getFirstTrue(target, t -> predicate.test(e, t)).orElse(null); @@ -361,11 +268,6 @@ public static KeyValuePairs associateOne(Collection master, Coll /** * 划分 * 按条件把集合拆分成满足条件和不满足条件的两个集合 - * - * @param collection - * @param predicate - * @param - * @return */ public static TwoValues, List> partition(Collection collection, Predicate predicate) { List match = new LinkedList<>(); @@ -383,11 +285,6 @@ public static TwoValues, List> partition(Collection collection /** * 压缩 * 将两个集合的元素按索引捆绑到一起 - * - * @param master - * @param other - * @param - * @return */ public static List> zip(List master, List other) { if (master.size() != other.size()) { @@ -402,11 +299,6 @@ public static List> zip(List master, List other) { /** * 分页处理 - * - * @param list - * @param size - * @param consumer - * @param */ public static void pagingProcess(List list, int size, Consumer> consumer) { final int total = list.size(); @@ -418,8 +310,4 @@ public static void pagingProcess(List list, int size, Consumer> c consumer.accept(subList); } } - - public interface AssociatePredicate { - boolean test(E master, T target); - } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 8cec8a7..e78cc24 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -24,12 +24,9 @@ public final class IOAdvice { * @return */ public static byte[] toByteArray(InputStream inputStream) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (inputStream) { + try (inputStream; ByteArrayOutputStream baos = new ByteArrayOutputStream()) { inputStream.transferTo(baos); - byte[] data = baos.toByteArray(); - baos.close(); - return data; + return baos.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } @@ -359,15 +356,17 @@ public static long copy(InputStream inputStream, OutputStream outputStream) thro * @return */ public static long copyQuietly(File source, File target) { - target.getParentFile().mkdirs(); - try ( - InputStream inputStream = new FileInputStream(source); - OutputStream outputStream = new FileOutputStream(target) - ) { - return copy(inputStream, outputStream); - } catch (IOException e) { - throw new RuntimeException(e); + if (target.getParentFile().mkdirs()) { + try ( + InputStream inputStream = new FileInputStream(source); + OutputStream outputStream = new FileOutputStream(target) + ) { + return copy(inputStream, outputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } } + return -1; } /** diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 791c6bd..6034410 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -2,11 +2,11 @@ import develop.toolkit.base.struct.KeyValuePairs; import lombok.NonNull; +import lombok.SneakyThrows; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; /** * 实例对象处理增强工具 @@ -21,7 +21,6 @@ public final class ObjectAdvice { * @param clazz * @return */ - @SuppressWarnings("unchecked") public static boolean isPrimitiveType(Class clazz) { return valueIn(clazz, int.class, Integer.class, @@ -167,20 +166,17 @@ public static boolean valueNotIn(@NonNull T obj, T... targets) { * @param value * @param firstUseSetterMethod 优先使用setter方法 */ + @SneakyThrows public static void set(Object instance, String field, Object value, boolean firstUseSetterMethod) { - try { - if (firstUseSetterMethod) { - try { - final String setterMethodName = JavaBeanUtils.getSetterMethodName(field); - MethodUtils.invokeMethod(instance, true, setterMethodName); - } catch (NoSuchMethodException e) { - FieldUtils.writeDeclaredField(instance, field, value, true); - } - } else { + if (firstUseSetterMethod) { + try { + final String setterMethodName = JavaBeanUtils.getSetterMethodName(field); + MethodUtils.invokeMethod(instance, true, setterMethodName); + } catch (NoSuchMethodException e) { FieldUtils.writeDeclaredField(instance, field, value, true); } - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); + } else { + FieldUtils.writeDeclaredField(instance, field, value, true); } } @@ -193,20 +189,17 @@ public static void set(Object instance, String field, Object value, boolean firs * @param firstUseGetterMethod 优先使用getter方法 * @return */ + @SneakyThrows public static Object get(Object instance, String field, Class fieldType, boolean firstUseGetterMethod) { - try { - if (firstUseGetterMethod) { - try { - final String getterMethodName = JavaBeanUtils.getGetterMethodName(field, fieldType); - return MethodUtils.invokeMethod(instance, true, getterMethodName); - } catch (NoSuchMethodException e) { - return FieldUtils.readDeclaredField(instance, field, true); - } - } else { + if (firstUseGetterMethod) { + try { + final String getterMethodName = JavaBeanUtils.getGetterMethodName(field, fieldType); + return MethodUtils.invokeMethod(instance, true, getterMethodName); + } catch (NoSuchMethodException e) { return FieldUtils.readDeclaredField(instance, field, true); } - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); + } else { + return FieldUtils.readDeclaredField(instance, field, true); } } @@ -234,12 +227,9 @@ public static KeyValuePairs readAllFieldValue(Object instance) { * @param * @return */ + @SneakyThrows public static T newInstanceQuietly(Class clazz) { - try { - return clazz.getConstructor().newInstance(); - } catch (Exception e) { - throw new RuntimeException(e); - } + return clazz.getConstructor().newInstance(); } /** diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index fd8f9d2..80a8193 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -35,7 +35,7 @@ public static boolean isNotEmpty(String content) { } /** - * null话默认为空字符串 + * null的话默认为空字符串 * * @param content * @return @@ -44,6 +44,17 @@ public static String defaultEmpty(String content) { return content != null ? content : ""; } + /** + * 空字符串的话默认为默认值 + * + * @param content + * @param defaultValue + * @return + */ + public static String emptyOr(String content, String defaultValue) { + return isEmpty(content) ? defaultValue : content; + } + /** * 从index位置切断字符串 * From 74b5dfa3add56701b38b08c542f3d5b7d907e2a1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 15:32:44 +0800 Subject: [PATCH 043/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/HttpAdviceResponse.java | 2 ++ .../toolkit/base/utils/CollectionAdvice.java | 19 +++++++++++++++++++ .../toolkit/base/utils/HttpAdvice.java | 17 ++++++++++++----- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java index 9a07a5c..4ea6d3b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java @@ -22,6 +22,8 @@ public class HttpAdviceResponse { private byte[] body; + private long costTime; + public String bodyOfString() { return new String(body, StandardCharsets.UTF_8); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index ff426bb..b8752b2 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -8,6 +8,7 @@ import java.util.*; import java.util.function.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 集合增强工具 @@ -310,4 +311,22 @@ public static void pagingProcess(List list, int size, Consumer> c consumer.accept(subList); } } + + /** + * 指定排序 + * 把master的元素值按sortTarget的元素值排序,条件按predicate + */ + public static List sort(Collection master, Collection sortTarget, BiPredicate predicate) { + return sortTarget + .stream() + .map(s -> CollectionAdvice.getFirstTrue(master, c -> predicate.test(c, s)).orElse(null)) + .collect(Collectors.toList()); + } + + public static List sort(Collection master, S[] sortTarget, BiPredicate predicate) { + return Stream + .of(sortTarget) + .map(s -> CollectionAdvice.getFirstTrue(master, c -> predicate.test(c, s)).orElse(null)) + .collect(Collectors.toList()); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index 8ec2618..e347427 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -11,6 +11,8 @@ import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Map; import java.util.stream.Collectors; @@ -193,17 +195,22 @@ private static HttpAdviceResponse send(String label, HttpClient httpClient, Stri HttpAdviceResponse response = null; HttpRequest httpRequest = null; try { - httpRequest = builder.method( - httpMethod, - content == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(content, StandardCharsets.UTF_8) - ) + httpRequest = builder + .method( + httpMethod, + content == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(content, StandardCharsets.UTF_8) + ) .timeout(Duration.ofSeconds(10L)) .build(); + + Instant start = Instant.now(); HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofByteArray()); + Instant end = Instant.now(); response = new HttpAdviceResponse( httpResponse.statusCode(), httpResponse.headers().map(), - httpResponse.body() + httpResponse.body(), + start.until(end, ChronoUnit.MILLIS) ); return response; } catch (InterruptedException e) { From 559c7fc7d979625dea3ae7e113b8277f36c14083 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:23:47 +0800 Subject: [PATCH 044/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 71 +++---- .../src/main/java/module-info.java | 28 +-- develop-toolkit-http/pom.xml | 22 --- .../toolkit/http/HttpFailedException.java | 14 -- .../toolkit/http/JDKToolkitHttpClient.java | 59 ------ .../toolkit/http/ToolkitHttpClient.java | 16 -- .../toolkit/http/request/HttpMethod.java | 9 - .../toolkit/http/request/HttpRequestData.java | 93 --------- .../request/body/FormDataHttpRequestBody.java | 53 ----- .../body/FormUrlencodedHttpRequestBody.java | 45 ----- .../request/body/HttpRequestDataBody.java | 35 ---- .../request/body/JsonRawHttpRequestBody.java | 18 -- .../request/body/PlainRawHttpRequestBody.java | 20 -- .../request/body/RawHttpRequestDataBody.java | 32 --- .../request/body/XmlRawHttpRequestBody.java | 20 -- .../http/response/HttpResponseData.java | 33 ---- .../src/main/java/module-info.java | 11 -- .../develop/toolkit/support/db/DBAdvice.java | 29 --- .../toolkit/support/db/mysql/MysqlClient.java | 187 ------------------ .../support/db/mysql/MysqlProperties.java | 40 ---- .../db/mysql/NoUniqueResultException.java | 11 -- .../db/mysql/PreparedStatementSetter.java | 12 -- .../toolkit/support/db/mysql/RowMapper.java | 12 -- .../toolkit/support/db/mysql/SQLFactory.java | 61 ------ pom.xml | 10 +- 25 files changed, 52 insertions(+), 889 deletions(-) rename {develop-toolkit-support => develop-toolkit-db}/pom.xml (80%) rename {develop-toolkit-support => develop-toolkit-db}/src/main/java/module-info.java (65%) delete mode 100644 develop-toolkit-http/pom.xml delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java delete mode 100644 develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java delete mode 100644 develop-toolkit-http/src/main/java/module-info.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/DBAdvice.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlProperties.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/NoUniqueResultException.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java delete mode 100644 develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/SQLFactory.java diff --git a/develop-toolkit-support/pom.xml b/develop-toolkit-db/pom.xml similarity index 80% rename from develop-toolkit-support/pom.xml rename to develop-toolkit-db/pom.xml index e4ae60b..c5412b9 100644 --- a/develop-toolkit-support/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -1,36 +1,37 @@ - - - - com.github.developframework - develop-toolkit - 1.0.2-SNAPSHOT - - 4.0.0 - - develop-toolkit-support - 开发工具箱 - 扩展支持 - - - 3.10.1 - 8.0.15 - - - - - com.github.developframework - develop-toolkit-base - - - org.mongodb - mongo-java-driver - ${version.mongo-java-driver} - true - - - mysql - mysql-connector-java - ${version.mysql-connector-java} - true - - + + + + com.github.developframework + develop-toolkit + 1.0.2-SNAPSHOT + + 4.0.0 + + develop-toolkit-db + 开发工具箱 - 数据库服务 + + + 3.10.1 + 8.0.15 + + + + + com.github.developframework + develop-toolkit-base + + + org.mongodb + mongo-java-driver + ${version.mongo-java-driver} + true + + + mysql + mysql-connector-java + ${version.mysql-connector-java} + true + + \ No newline at end of file diff --git a/develop-toolkit-support/src/main/java/module-info.java b/develop-toolkit-db/src/main/java/module-info.java similarity index 65% rename from develop-toolkit-support/src/main/java/module-info.java rename to develop-toolkit-db/src/main/java/module-info.java index a38773c..93086ef 100644 --- a/develop-toolkit-support/src/main/java/module-info.java +++ b/develop-toolkit-db/src/main/java/module-info.java @@ -1,15 +1,15 @@ -/** - * @author qiushui on 2019-02-27. - */ -module develop.toolkit.support { - requires develop.toolkit.base; - requires expression; - requires java.net.http; - requires java.sql; - requires lombok; - requires mysql.connector.java; - requires org.apache.commons.lang3; - - exports develop.toolkit.support.db; - exports develop.toolkit.support.db.mysql; +/** + * @author qiushui on 2019-02-27. + */ +module develop.toolkit.db { + requires develop.toolkit.base; + requires expression; + requires java.net.http; + requires java.sql; + requires lombok; + requires mysql.connector.java; + requires org.apache.commons.lang3; + + exports develop.toolkit.db; + exports develop.toolkit.db.mysql; } \ No newline at end of file diff --git a/develop-toolkit-http/pom.xml b/develop-toolkit-http/pom.xml deleted file mode 100644 index 099c151..0000000 --- a/develop-toolkit-http/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - develop-toolkit - com.github.developframework - 1.0.2-SNAPSHOT - - 4.0.0 - - develop-toolkit-http - - 开发工具箱 - HTTP - - - - com.github.developframework - develop-toolkit-base - - - \ No newline at end of file diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java deleted file mode 100644 index eabec13..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/HttpFailedException.java +++ /dev/null @@ -1,14 +0,0 @@ -package develop.toolkit.http; - -import develop.toolkit.base.exception.FormatRuntimeException; - -public class HttpFailedException extends FormatRuntimeException { - - public HttpFailedException(String format, Object... parameters) { - super(format, parameters); - } - - public HttpFailedException(String format, Throwable cause, Object... parameters) { - super(format, cause, parameters); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java deleted file mode 100644 index b730de1..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/JDKToolkitHttpClient.java +++ /dev/null @@ -1,59 +0,0 @@ -package develop.toolkit.http; - -import develop.toolkit.http.request.HttpRequestData; -import develop.toolkit.http.response.HttpResponseData; -import lombok.Getter; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.Duration; -import java.time.Instant; - -/** - * 基于JDK 11 HttpClient实现 - */ -public class JDKToolkitHttpClient implements ToolkitHttpClient { - - @Getter - private HttpClient httpClient; - - public JDKToolkitHttpClient() { - this.httpClient = HttpClient.newBuilder() - .connectTimeout(Duration.ofSeconds(30L)) - .version(HttpClient.Version.HTTP_1_1) - .build(); - } - - public JDKToolkitHttpClient(HttpClient httpClient) { - this.httpClient = httpClient; - } - - @Override - public HttpResponseData request(HttpRequestData requestData) throws HttpFailedException { - if (requestData.getBody() != null) { - requestData.getBody().prepare(requestData); - } - final byte[] data = requestData.serializeBody(); - final HttpRequest.BodyPublisher bodyPublisher = data != null ? HttpRequest.BodyPublishers.ofByteArray(data) : HttpRequest.BodyPublishers.noBody(); - HttpRequest.Builder builder = HttpRequest.newBuilder() - .version(HttpClient.Version.HTTP_1_1) - .timeout(Duration.ofSeconds(30L)) - .uri(URI.create(requestData.getWholeUrl())) - .method(requestData.getHttpMethod().name(), bodyPublisher); - requestData.getHeaders().forEach(builder::header); - - try { - Instant start = Instant.now(); - final HttpResponse httpResponse = httpClient.send(builder.build(), HttpResponse.BodyHandlers.ofByteArray()); - final long costTime = Instant.now().toEpochMilli() - start.toEpochMilli(); - final HttpResponseData responseData = new HttpResponseData(httpResponse.statusCode(), httpResponse.body()); - responseData.setCostTime(costTime); - responseData.setHeaders(httpResponse.headers().map()); - return responseData; - } catch (Exception e) { - throw new HttpFailedException("http failed: %s", e, e.getMessage()); - } - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java deleted file mode 100644 index 9ecbffb..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/ToolkitHttpClient.java +++ /dev/null @@ -1,16 +0,0 @@ -package develop.toolkit.http; - -import develop.toolkit.http.request.HttpRequestData; -import develop.toolkit.http.response.HttpResponseData; - - -public interface ToolkitHttpClient { - - /** - * 发送请求 - * - * @param httpRequestData - * @return - */ - HttpResponseData request(HttpRequestData httpRequestData) throws HttpFailedException; -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java deleted file mode 100644 index 924fe5d..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpMethod.java +++ /dev/null @@ -1,9 +0,0 @@ -package develop.toolkit.http.request; - -/** - * @author qiuzhenhao - */ -public enum HttpMethod { - - GET, POST, PUT, DELETE -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java deleted file mode 100644 index 1348ebd..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/HttpRequestData.java +++ /dev/null @@ -1,93 +0,0 @@ -package develop.toolkit.http.request; - -import develop.toolkit.base.utils.K; -import develop.toolkit.http.request.body.HttpRequestDataBody; -import lombok.Getter; -import lombok.Setter; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * Http请求体 - * - * @author qiuzhenhao - */ -@Getter -public class HttpRequestData { - - private HttpMethod httpMethod; - - private String url; - - private Map headers = new HashMap<>(); - - private Map urlParameters = new HashMap<>(); - - @Setter - private Charset charset = StandardCharsets.UTF_8; - - private HttpRequestDataBody body; - - public HttpRequestData(HttpMethod httpMethod, String url) { - this.httpMethod = httpMethod; - this.url = url; - } - - public HttpRequestData addHeader(String headerName, String value) { - headers.put(headerName, value); - return this; - } - - public HttpRequestData addUrlParameter(String parameterName, Object value) { - urlParameters.put(parameterName, value); - return this; - } - - public HttpRequestData addBody(HttpRequestDataBody body) { - this.body = body; - return this; - } - - public String getWholeUrl() { - return urlParameters.isEmpty() ? url : (url + "?" + serializeParameters()); - } - - /** - * 序列化参数 - * - * @return - */ - protected String serializeParameters() { - return urlParameters.entrySet().stream().map(parameter -> { - try { - return String.format("%s=%s", parameter.getKey(), URLEncoder.encode(parameter.getValue().toString(), charset.displayName())); - } catch (UnsupportedEncodingException e) { - return ""; - } - }).collect(Collectors.joining("&")); - } - - /** - * 序列化 - * - * @return - */ - public byte[] serializeBody() { - return K.map(body, b -> b.serializeBody(charset)); - } - - /** - * 字符串格式Body - * - * @return - */ - public String stringBody() { - return K.map(body, b -> b.body(charset)); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java deleted file mode 100644 index 0925b40..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormDataHttpRequestBody.java +++ /dev/null @@ -1,53 +0,0 @@ -package develop.toolkit.http.request.body; - -import develop.toolkit.http.request.HttpRequestData; -import lombok.Getter; -import org.apache.commons.lang3.RandomStringUtils; - -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author qiuzhenhao - */ -public class FormDataHttpRequestBody implements HttpRequestDataBody { - - @Getter - private String boundary; - - @Getter - protected Map parameters = new LinkedHashMap<>(); - - public void addParameter(String parameterName, String value) { - parameters.put(parameterName, value); - } - - public FormDataHttpRequestBody() { - this.boundary = "----WebKitFormBoundary" + RandomStringUtils.randomAlphabetic(10); - } - - public FormDataHttpRequestBody(String boundary) { - this.boundary = boundary; - } - - @Override - public String body(Charset charset) { - StringBuilder sb = new StringBuilder(); - for (Map.Entry entry : parameters.entrySet()) { - if (entry != null) { - sb - .append(boundary) - .append("\r\n") - .append(String.format("Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", entry.getKey(), URLEncoder.encode(entry.getValue().toString(), charset))); - } - } - return sb.toString(); - } - - @Override - public void prepare(HttpRequestData httpRequestData) { - httpRequestData.addHeader("Content-Type", "multipart/form-data; boundary=" + boundary); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java deleted file mode 100644 index 25ac67a..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/FormUrlencodedHttpRequestBody.java +++ /dev/null @@ -1,45 +0,0 @@ -package develop.toolkit.http.request.body; - -import develop.toolkit.http.request.HttpRequestData; -import lombok.Getter; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * application/x-www-form-urlencoded 格式Body - */ -public class FormUrlencodedHttpRequestBody implements HttpRequestDataBody { - - @Getter - protected Map parameters = new LinkedHashMap<>(); - - public void addParameter(String parameterName, String value) { - parameters.put(parameterName, value); - } - - @Override - public void prepare(HttpRequestData httpRequestData) { - httpRequestData.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + httpRequestData.getCharset().displayName()); - } - - /** - * 序列化参数 - * - * @return - */ - @Override - public String body(Charset charset) { - return parameters.entrySet().stream().map(entry -> { - try { - return String.format("%s=%s", entry.getKey(), URLEncoder.encode(entry.getValue().toString(), charset.displayName())); - } catch (UnsupportedEncodingException e) { - return ""; - } - }).collect(Collectors.joining("&")); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java deleted file mode 100644 index 3bacbfe..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/HttpRequestDataBody.java +++ /dev/null @@ -1,35 +0,0 @@ -package develop.toolkit.http.request.body; - -import develop.toolkit.http.request.HttpRequestData; - -import java.nio.charset.Charset; - -/** - * - */ -public interface HttpRequestDataBody { - - /** - * 序列化成字节 - * - * @param charset - * @return - */ - default byte[] serializeBody(Charset charset) { - return body(charset).getBytes(); - } - - /** - * 字符串格式body - * - * @return - */ - String body(Charset charset); - - /** - * 准备 - * - * @param httpRequestData - */ - void prepare(HttpRequestData httpRequestData); -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java deleted file mode 100644 index 7175d91..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/JsonRawHttpRequestBody.java +++ /dev/null @@ -1,18 +0,0 @@ -package develop.toolkit.http.request.body; - -import java.nio.charset.Charset; - -/** - * Json富文本Body - */ -public class JsonRawHttpRequestBody extends RawHttpRequestDataBody { - - public JsonRawHttpRequestBody(String json) { - super(json); - } - - @Override - protected String getContentType(Charset charset) { - return "application/json;charset=" + charset.displayName(); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java deleted file mode 100644 index 9bbc552..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/PlainRawHttpRequestBody.java +++ /dev/null @@ -1,20 +0,0 @@ -package develop.toolkit.http.request.body; - -import java.nio.charset.Charset; - -/** - * Plain富文本Body - * - * @author qiuzhenhao - */ -public class PlainRawHttpRequestBody extends RawHttpRequestDataBody { - - public PlainRawHttpRequestBody(String text) { - super(text); - } - - @Override - protected String getContentType(Charset charset) { - return "text/plain;charset=" + charset.displayName(); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java deleted file mode 100644 index 774060d..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/RawHttpRequestDataBody.java +++ /dev/null @@ -1,32 +0,0 @@ -package develop.toolkit.http.request.body; - -import develop.toolkit.http.request.HttpRequestData; -import lombok.Getter; - -import java.nio.charset.Charset; - -/** - * 富文本Body - */ -public abstract class RawHttpRequestDataBody implements HttpRequestDataBody { - - @Getter - private String raw; - - public RawHttpRequestDataBody(String raw) { - this.raw = raw; - } - - @Override - public void prepare(HttpRequestData httpRequestData) { - httpRequestData.addHeader("Content-Type", getContentType(httpRequestData.getCharset())); - } - - protected abstract String getContentType(Charset charset); - - @Override - public String body(Charset charset) { - return raw; - } - -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java deleted file mode 100644 index c23d674..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/request/body/XmlRawHttpRequestBody.java +++ /dev/null @@ -1,20 +0,0 @@ -package develop.toolkit.http.request.body; - -import java.nio.charset.Charset; - -/** - * Xml富文本Body - * - * @author qiuzhenhao - */ -public class XmlRawHttpRequestBody extends RawHttpRequestDataBody { - - public XmlRawHttpRequestBody(String xml) { - super(xml); - } - - @Override - protected String getContentType(Charset charset) { - return "application/xml;charset=" + charset.displayName(); - } -} diff --git a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java b/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java deleted file mode 100644 index 4ad4cff..0000000 --- a/develop-toolkit-http/src/main/java/develop/toolkit/http/response/HttpResponseData.java +++ /dev/null @@ -1,33 +0,0 @@ -package develop.toolkit.http.response; - -import lombok.Getter; -import lombok.Setter; - -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Map; - -/** - * Http响应体 - */ -@Getter -@Setter -public class HttpResponseData { - - private int httpStatus; - - private byte[] data; - - private Map> headers; - - private long costTime; - - public HttpResponseData(int httpStatus, byte[] data) { - this.httpStatus = httpStatus; - this.data = data; - } - - public String stringBody() { - return new String(data, StandardCharsets.UTF_8); - } -} diff --git a/develop-toolkit-http/src/main/java/module-info.java b/develop-toolkit-http/src/main/java/module-info.java deleted file mode 100644 index ba2a6a3..0000000 --- a/develop-toolkit-http/src/main/java/module-info.java +++ /dev/null @@ -1,11 +0,0 @@ -module develop.toolkit.http { - requires develop.toolkit.base; - requires java.net.http; - requires lombok; - requires org.apache.commons.lang3; - - exports develop.toolkit.http.request.body; - exports develop.toolkit.http.request; - exports develop.toolkit.http.response; - exports develop.toolkit.http; -} \ No newline at end of file diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/DBAdvice.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/DBAdvice.java deleted file mode 100644 index b535693..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/DBAdvice.java +++ /dev/null @@ -1,29 +0,0 @@ -package develop.toolkit.support.db; - -import develop.toolkit.support.db.mysql.MysqlClient; -import develop.toolkit.support.db.mysql.MysqlProperties; - -import java.sql.SQLException; -import java.util.Map; - -/** - * @author qiushui on 2019-09-03. - */ -public final class DBAdvice { - - public static MysqlClient mysql(String domain, String username, String password, String database, Map parameters) throws SQLException { - return mysql(domain, 3306, username, password, database, parameters); - } - - public static MysqlClient mysql(String domain, String username, String password, String database) throws SQLException { - return mysql(domain, 3306, username, password, database, null); - } - - public static MysqlClient mysql(String domain, int port, String username, String password, String database, Map parameters) throws SQLException { - MysqlProperties mysqlProperties = new MysqlProperties(domain, port, username, password, database); - if (parameters != null) { - mysqlProperties.getParameters().putAll(parameters); - } - return new MysqlClient(mysqlProperties); - } -} diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java deleted file mode 100644 index 091ba02..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlClient.java +++ /dev/null @@ -1,187 +0,0 @@ -package develop.toolkit.support.db.mysql; - -import com.github.developframework.expression.ExpressionUtils; -import develop.toolkit.base.utils.JavaBeanUtils; -import org.apache.commons.lang3.StringUtils; - -import java.sql.*; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @author qiushui on 2019-09-03. - */ -public class MysqlClient implements AutoCloseable { - - private Connection connection; - - public MysqlClient(MysqlProperties mysqlProperties) throws SQLException { - try { - Class.forName("com.mysql.cj.jdbc.Driver"); - connection = DriverManager.getConnection( - mysqlProperties.getUrl(), - mysqlProperties.getUsername(), - mysqlProperties.getPassword() - ); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - /** - * 查询列表 - * - * @param sql - * @param rowMapper - * @param - * @return - * @throws SQLException - */ - public List query(String sql, RowMapper rowMapper) throws SQLException { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(sql); - List list = new LinkedList<>(); - while (resultSet.next()) { - list.add(rowMapper.mapping(resultSet)); - } - resultSet.close(); - statement.close(); - return list; - } - - /** - * 查询列表 - * - * @param sql - * @param setter - * @param rowMapper - * @param - * @return - * @throws SQLException - */ - public List query(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { - PreparedStatement statement = connection.prepareStatement(sql); - setter.set(statement); - ResultSet resultSet = statement.executeQuery(); - List list = new LinkedList<>(); - while (resultSet.next()) { - list.add(rowMapper.mapping(resultSet)); - } - resultSet.close(); - statement.close(); - return list; - } - - /** - * 查询单记录 - * - * @param sql - * @param rowMapper - * @param - * @return - * @throws SQLException - */ - public Optional queryOne(String sql, RowMapper rowMapper) throws SQLException { - List list = query(sql, rowMapper); - if (list.size() > 1) { - throw new NoUniqueResultException(list.size()); - } - return Optional.ofNullable( - list.isEmpty() ? null : list.get(0) - ); - } - - /** - * 查询单记录 - * - * @param sql - * @param setter - * @param rowMapper - * @param - * @return - * @throws SQLException - */ - public Optional queryOne(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { - List list = query(sql, setter, rowMapper); - if (list.size() > 1) { - throw new NoUniqueResultException(list.size()); - } - return Optional.ofNullable( - list.isEmpty() ? null : list.get(0) - ); - } - - public int insertAll(String table, Collection collection, String... fields) throws SQLException { - String sql = new StringBuilder() - .append("INSERT INTO ").append(table).append("(") - .append(Stream.of(fields).map(f -> "`" + f + "`").collect(Collectors.joining(","))).append(") VALUES") - .append( - collection - .stream() - .map(data -> - "(" + Stream.of(fields) - .map(field -> { - Object object = ExpressionUtils.getValue(data, JavaBeanUtils.underlineToCamelcase(field)); - String value = object != null ? object.toString() : null; - return StringUtils.isNumeric(value) ? value : ("'" + value + "'"); - }) - .collect(Collectors.joining(",")) + ")" - ) - .collect(Collectors.joining(",")) - ) - .toString(); - Statement statement = connection.createStatement(); - int count = statement.executeUpdate(sql); - statement.close(); - return count; - } - - /** - * 插入记录 - * - * @param table - * @param data - * @param fields - * @param - * @return - * @throws SQLException - */ - public int insert(String table, T data, String... fields) throws SQLException { - return insertAll(table, List.of(data), fields); - } - - /** - * 执行修改语句 - * - * @param sql - * @param setter - * @return - * @throws SQLException - */ - public int executeUpdate(String sql, PreparedStatementSetter setter) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - setter.set(preparedStatement); - return preparedStatement.executeUpdate(); - } - - /** - * 执行修改语句 - * - * @param sql - * @return - * @throws SQLException - */ - public int executeUpdate(String sql) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - return preparedStatement.executeUpdate(); - } - - @Override - public void close() throws SQLException { - connection.close(); - } -} diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlProperties.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlProperties.java deleted file mode 100644 index 34d235f..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/MysqlProperties.java +++ /dev/null @@ -1,40 +0,0 @@ -package develop.toolkit.support.db.mysql; - -import lombok.Getter; - -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @author qiushui on 2019-09-03. - */ -@Getter -public class MysqlProperties { - - private String domain; - - private int port; - - private String username; - - private String password; - - private String database; - - private Map parameters = new HashMap<>(); - - public MysqlProperties(String domain, int port, String username, String password, String database) { - this.domain = domain; - this.port = port; - this.username = username; - this.password = password; - this.database = database; - parameters.put("useSSL", "false"); - } - - public String getUrl() { - return String.format("jdbc:mysql://%s:%d/%s?", domain, port, database) + - parameters.entrySet().stream().map(entry -> String.format("%s=%s", entry.getKey(), entry.getValue())).collect(Collectors.joining("&")); - } -} diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/NoUniqueResultException.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/NoUniqueResultException.java deleted file mode 100644 index b045a9d..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/NoUniqueResultException.java +++ /dev/null @@ -1,11 +0,0 @@ -package develop.toolkit.support.db.mysql; - -/** - * @author qiushui on 2019-09-03. - */ -public class NoUniqueResultException extends RuntimeException { - - public NoUniqueResultException(int size) { - super("no unique result: " + size); - } -} diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java deleted file mode 100644 index ad59be7..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/PreparedStatementSetter.java +++ /dev/null @@ -1,12 +0,0 @@ -package develop.toolkit.support.db.mysql; - -import java.sql.PreparedStatement; -import java.sql.SQLException; - -/** - * @author qiushui on 2019-09-03. - */ -public interface PreparedStatementSetter { - - void set(PreparedStatement preparedStatement) throws SQLException; -} diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java deleted file mode 100644 index fcc7575..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/RowMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package develop.toolkit.support.db.mysql; - -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * @author qiushui on 2019-09-03. - */ -public interface RowMapper { - - T mapping(ResultSet resultSet) throws SQLException; -} diff --git a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/SQLFactory.java b/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/SQLFactory.java deleted file mode 100644 index c80d731..0000000 --- a/develop-toolkit-support/src/main/java/develop/toolkit/support/db/mysql/SQLFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -package develop.toolkit.support.db.mysql; - -import develop.toolkit.base.utils.IOAdvice; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @author qiushui on 2019-09-18. - */ -public class SQLFactory { - - private Map sqlMap = new HashMap<>(); - - public SQLFactory(String... sqlFiles) { - for (String sqlFile : sqlFiles) { - parseSqlFile(sqlFile); - } - } - - private void parseSqlFile(String sqlFile) { - List lines = IOAdvice.readLinesFromClasspath(sqlFile).collect(Collectors.toList()); - String key = null; - StringBuilder sb = new StringBuilder(); - for (String line : lines) { - if (line.isBlank()) { - continue; - } - if (line.startsWith("#")) { - putSql(key, sb); - key = line.substring(1).trim(); - } else { - if (sb.length() > 0) { - sb.append(" "); - } - sb.append(line.trim()); - } - } - putSql(key, sb); - } - - private void putSql(String key, StringBuilder sb) { - if (key != null && sb.length() > 0) { - if (sqlMap.containsKey(key)) { - throw new RuntimeException("sql map exists \"" + key + "\""); - } - sqlMap.put(key, sb.toString()); - sb.setLength(0); - } - } - - public String getSql(String key) { - String sql = sqlMap.get(key); - if (sql == null) { - throw new RuntimeException("sql map not exists \"" + key + "\""); - } - return sql; - } -} diff --git a/pom.xml b/pom.xml index bd1c769..5cc145c 100644 --- a/pom.xml +++ b/pom.xml @@ -13,9 +13,8 @@ develop-toolkit-base - develop-toolkit-support + develop-toolkit-db develop-toolkit-world - develop-toolkit-http @@ -33,12 +32,7 @@ com.github.developframework - develop-toolkit-support - 1.0.2-SNAPSHOT - - - com.github.developframework - develop-toolkit-http + develop-toolkit-db 1.0.2-SNAPSHOT From df09ddc8a0b002d64abfa267a9c320b017eaa61f Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:37:08 +0800 Subject: [PATCH 045/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pom.xml b/pom.xml index 5cc145c..44fffa6 100644 --- a/pom.xml +++ b/pom.xml @@ -86,18 +86,6 @@ HEAD - - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-releases/ - - - From 42509c5f847dc24685548d001dee827789657212 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:37:52 +0800 Subject: [PATCH 046/178] [maven-release-plugin] prepare release v1.0.2 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 5 ++--- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index e355d8d..7f0f4b8 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index c5412b9..d367732 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -1,10 +1,9 @@ - + com.github.developframework develop-toolkit - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index 11cf165..d53e278 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/pom.xml b/pom.xml index 44fffa6..79a8c2a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.2-SNAPSHOT + 1.0.2 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.2-SNAPSHOT + 1.0.2 com.github.developframework develop-toolkit-db - 1.0.2-SNAPSHOT + 1.0.2 com.github.developframework develop-toolkit-world - 1.0.2-SNAPSHOT + 1.0.2 org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.2 From 3e1104df188bae67ac5f45fcccc9a9ed01896c0d Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:38:11 +0800 Subject: [PATCH 047/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 7f0f4b8..2e0269a 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index d367732..8e2ee8d 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index d53e278..a465750 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 79a8c2a..8dd4d51 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.2 + 1.0.3-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.2 + 1.0.3-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.2 + 1.0.3-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.2 + 1.0.3-SNAPSHOT org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.2 + HEAD From 8f6bb278198f293c9fb95ad13723204dbaec0ecc Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:41:03 +0800 Subject: [PATCH 048/178] [maven-release-plugin] rollback the release of v1.0.2 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 5 +++-- develop-toolkit-world/pom.xml | 2 +- pom.xml | 8 ++++---- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 2e0269a..e355d8d 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 8e2ee8d..c5412b9 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -1,9 +1,10 @@ - + com.github.developframework develop-toolkit - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index a465750..11cf165 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 8dd4d51..44fffa6 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.3-SNAPSHOT + 1.0.2-SNAPSHOT org.projectlombok From 0ec151a20cb2a1cf46d858d6ac626a730b0fa186 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:41:29 +0800 Subject: [PATCH 049/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/db/DBAdvice.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java new file mode 100644 index 0000000..f9697c7 --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java @@ -0,0 +1,29 @@ +package develop.toolkit.db; + +import develop.toolkit.db.mysql.MysqlClient; +import develop.toolkit.db.mysql.MysqlProperties; + +import java.sql.SQLException; +import java.util.Map; + +/** + * @author qiushui on 2019-09-03. + */ +public final class DBAdvice { + + public static MysqlClient mysql(String domain, String username, String password, String database, Map parameters) throws SQLException { + return mysql(domain, 3306, username, password, database, parameters); + } + + public static MysqlClient mysql(String domain, String username, String password, String database) throws SQLException { + return mysql(domain, 3306, username, password, database, null); + } + + public static MysqlClient mysql(String domain, int port, String username, String password, String database, Map parameters) throws SQLException { + MysqlProperties mysqlProperties = new MysqlProperties(domain, port, username, password, database); + if (parameters != null) { + mysqlProperties.getParameters().putAll(parameters); + } + return new MysqlClient(mysqlProperties); + } +} From d1a3e2010b96172644b9e590eddf83e267515234 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:43:51 +0800 Subject: [PATCH 050/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/db/mysql/MysqlClient.java | 186 ++++++++++++++++++ .../toolkit/db/mysql/MysqlProperties.java | 40 ++++ .../db/mysql/NoUniqueResultException.java | 11 ++ .../db/mysql/PreparedStatementSetter.java | 12 ++ .../develop/toolkit/db/mysql/RowMapper.java | 12 ++ .../develop/toolkit/db/mysql/SQLFactory.java | 61 ++++++ 6 files changed, 322 insertions(+) create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/NoUniqueResultException.java create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/PreparedStatementSetter.java create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/RowMapper.java create mode 100644 develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java new file mode 100644 index 0000000..b75221c --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java @@ -0,0 +1,186 @@ +package develop.toolkit.db.mysql; + +import com.github.developframework.expression.ExpressionUtils; +import develop.toolkit.base.utils.JavaBeanUtils; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import java.sql.*; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author qiushui on 2019-09-03. + */ +public class MysqlClient implements AutoCloseable { + + @Getter + private final Connection connection; + + public MysqlClient(MysqlProperties mysqlProperties) throws SQLException { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + connection = DriverManager.getConnection( + mysqlProperties.getUrl(), + mysqlProperties.getUsername(), + mysqlProperties.getPassword() + ); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + /** + * 查询列表 + * + * @param sql + * @param rowMapper + * @param + * @return + * @throws SQLException + */ + public List query(String sql, RowMapper rowMapper) throws SQLException { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql); + List list = new LinkedList<>(); + while (resultSet.next()) { + list.add(rowMapper.mapping(resultSet)); + } + resultSet.close(); + statement.close(); + return Collections.unmodifiableList(list); + } + + /** + * 查询列表 + * + * @param sql + * @param setter + * @param rowMapper + * @param + * @return + * @throws SQLException + */ + public List query(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { + PreparedStatement statement = connection.prepareStatement(sql); + setter.set(statement); + ResultSet resultSet = statement.executeQuery(); + List list = new LinkedList<>(); + while (resultSet.next()) { + list.add(rowMapper.mapping(resultSet)); + } + resultSet.close(); + statement.close(); + return Collections.unmodifiableList(list); + } + + /** + * 查询单记录 + * + * @param sql + * @param rowMapper + * @param + * @return + * @throws SQLException + */ + public Optional queryOne(String sql, RowMapper rowMapper) throws SQLException { + List list = query(sql, rowMapper); + if (list.size() > 1) { + throw new NoUniqueResultException(list.size()); + } + return Optional.ofNullable( + list.isEmpty() ? null : list.get(0) + ); + } + + /** + * 查询单记录 + * + * @param sql + * @param setter + * @param rowMapper + * @param + * @return + * @throws SQLException + */ + public Optional queryOne(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { + List list = query(sql, setter, rowMapper); + if (list.size() > 1) { + throw new NoUniqueResultException(list.size()); + } + return Optional.ofNullable( + list.isEmpty() ? null : list.get(0) + ); + } + + public int insertAll(String table, Collection collection, String... fields) throws SQLException { + String sql = new StringBuilder() + .append("INSERT INTO ").append(table).append("(") + .append(Stream.of(fields).map(f -> "`" + f + "`").collect(Collectors.joining(","))).append(") VALUES") + .append( + collection + .stream() + .map(data -> + "(" + Stream.of(fields) + .map(field -> { + Object object = ExpressionUtils.getValue(data, JavaBeanUtils.underlineToCamelcase(field)); + String value = object != null ? object.toString() : null; + return StringUtils.isNumeric(value) ? value : ("'" + value + "'"); + }) + .collect(Collectors.joining(",")) + ")" + ) + .collect(Collectors.joining(",")) + ) + .toString(); + Statement statement = connection.createStatement(); + int count = statement.executeUpdate(sql); + statement.close(); + return count; + } + + /** + * 插入记录 + * + * @param table + * @param data + * @param fields + * @param + * @return + * @throws SQLException + */ + public int insert(String table, T data, String... fields) throws SQLException { + return insertAll(table, List.of(data), fields); + } + + /** + * 执行修改语句 + * + * @param sql + * @param setter + * @return + * @throws SQLException + */ + public int executeUpdate(String sql, PreparedStatementSetter setter) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + setter.set(preparedStatement); + return preparedStatement.executeUpdate(); + } + + /** + * 执行修改语句 + * + * @param sql + * @return + * @throws SQLException + */ + public int executeUpdate(String sql) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + return preparedStatement.executeUpdate(); + } + + @Override + public void close() throws SQLException { + connection.close(); + } +} diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java new file mode 100644 index 0000000..f9c9c00 --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java @@ -0,0 +1,40 @@ +package develop.toolkit.db.mysql; + +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author qiushui on 2019-09-03. + */ +@Getter +public class MysqlProperties { + + private final String domain; + + private final int port; + + private final String username; + + private final String password; + + private final String database; + + private final Map parameters = new HashMap<>(); + + public MysqlProperties(String domain, int port, String username, String password, String database) { + this.domain = domain; + this.port = port; + this.username = username; + this.password = password; + this.database = database; + parameters.put("useSSL", "false"); + } + + public String getUrl() { + return String.format("jdbc:mysql://%s:%d/%s?", domain, port, database) + + parameters.entrySet().stream().map(entry -> String.format("%s=%s", entry.getKey(), entry.getValue())).collect(Collectors.joining("&")); + } +} diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/NoUniqueResultException.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/NoUniqueResultException.java new file mode 100644 index 0000000..f24fd97 --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/NoUniqueResultException.java @@ -0,0 +1,11 @@ +package develop.toolkit.db.mysql; + +/** + * @author qiushui on 2019-09-03. + */ +public class NoUniqueResultException extends RuntimeException { + + public NoUniqueResultException(int size) { + super("no unique result: " + size); + } +} diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/PreparedStatementSetter.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/PreparedStatementSetter.java new file mode 100644 index 0000000..d9f5d5c --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/PreparedStatementSetter.java @@ -0,0 +1,12 @@ +package develop.toolkit.db.mysql; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * @author qiushui on 2019-09-03. + */ +public interface PreparedStatementSetter { + + void set(PreparedStatement preparedStatement) throws SQLException; +} diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/RowMapper.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/RowMapper.java new file mode 100644 index 0000000..a3e0c1d --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/RowMapper.java @@ -0,0 +1,12 @@ +package develop.toolkit.db.mysql; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * @author qiushui on 2019-09-03. + */ +public interface RowMapper { + + T mapping(ResultSet resultSet) throws SQLException; +} diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java new file mode 100644 index 0000000..560455e --- /dev/null +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java @@ -0,0 +1,61 @@ +package develop.toolkit.db.mysql; + +import develop.toolkit.base.utils.IOAdvice; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author qiushui on 2019-09-18. + */ +public class SQLFactory { + + private Map sqlMap = new HashMap<>(); + + public SQLFactory(String... sqlFiles) { + for (String sqlFile : sqlFiles) { + parseSqlFile(sqlFile); + } + } + + private void parseSqlFile(String sqlFile) { + List lines = IOAdvice.readLinesFromClasspath(sqlFile).collect(Collectors.toList()); + String key = null; + StringBuilder sb = new StringBuilder(); + for (String line : lines) { + if (line.isBlank()) { + continue; + } + if (line.startsWith("#")) { + putSql(key, sb); + key = line.substring(1).trim(); + } else { + if (sb.length() > 0) { + sb.append(" "); + } + sb.append(line.trim()); + } + } + putSql(key, sb); + } + + private void putSql(String key, StringBuilder sb) { + if (key != null && sb.length() > 0) { + if (sqlMap.containsKey(key)) { + throw new RuntimeException("sql map exists \"" + key + "\""); + } + sqlMap.put(key, sb.toString()); + sb.setLength(0); + } + } + + public String getSql(String key) { + String sql = sqlMap.get(key); + if (sql == null) { + throw new RuntimeException("sql map not exists \"" + key + "\""); + } + return sql; + } +} From 90cd78c5d75a0fecc598073726fd88ade41fe118 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:45:01 +0800 Subject: [PATCH 051/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/develop/toolkit/db/mysql/MysqlProperties.java | 1 + 1 file changed, 1 insertion(+) diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java index f9c9c00..5314074 100644 --- a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlProperties.java @@ -31,6 +31,7 @@ public MysqlProperties(String domain, int port, String username, String password this.password = password; this.database = database; parameters.put("useSSL", "false"); + parameters.put("serverTimezone", "Asia/Shanghai"); } public String getUrl() { From bd171ebc5697fd4c8495ae9efea2696449ddfa1e Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:45:24 +0800 Subject: [PATCH 052/178] [maven-release-plugin] prepare release v1.0.2 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 5 ++--- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index e355d8d..7f0f4b8 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index c5412b9..d367732 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -1,10 +1,9 @@ - + com.github.developframework develop-toolkit - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index 11cf165..d53e278 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2-SNAPSHOT + 1.0.2 4.0.0 diff --git a/pom.xml b/pom.xml index 44fffa6..79a8c2a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.2-SNAPSHOT + 1.0.2 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.2-SNAPSHOT + 1.0.2 com.github.developframework develop-toolkit-db - 1.0.2-SNAPSHOT + 1.0.2 com.github.developframework develop-toolkit-world - 1.0.2-SNAPSHOT + 1.0.2 org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.2 From 348fcd16d352c1b14b294357619abf83576bcd26 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 May 2020 16:45:41 +0800 Subject: [PATCH 053/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 7f0f4b8..2e0269a 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index d367732..8e2ee8d 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index d53e278..a465750 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.2 + 1.0.3-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 79a8c2a..8dd4d51 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.2 + 1.0.3-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.2 + 1.0.3-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.2 + 1.0.3-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.2 + 1.0.3-SNAPSHOT org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.2 + HEAD From f700e1dd89dc600abd646256443b54543fae9d67 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 27 May 2020 21:59:23 +0800 Subject: [PATCH 054/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-db/pom.xml | 4 +- .../develop/toolkit/db/mysql/MysqlClient.java | 65 ++++++++++--------- .../src/main/java/module-info.java | 1 + 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 8e2ee8d..7386a3b 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -11,8 +11,8 @@ 开发工具箱 - 数据库服务 - 3.10.1 - 8.0.15 + 3.12.4 + 8.0.20 diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java index b75221c..af11b14 100644 --- a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java @@ -2,6 +2,7 @@ import com.github.developframework.expression.ExpressionUtils; import develop.toolkit.base.utils.JavaBeanUtils; +import develop.toolkit.base.utils.K; import lombok.Getter; import org.apache.commons.lang3.StringUtils; @@ -11,6 +12,8 @@ import java.util.stream.Stream; /** + * Mysql客户端 + * * @author qiushui on 2019-09-03. */ public class MysqlClient implements AutoCloseable { @@ -41,15 +44,7 @@ public MysqlClient(MysqlProperties mysqlProperties) throws SQLException { * @throws SQLException */ public List query(String sql, RowMapper rowMapper) throws SQLException { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery(sql); - List list = new LinkedList<>(); - while (resultSet.next()) { - list.add(rowMapper.mapping(resultSet)); - } - resultSet.close(); - statement.close(); - return Collections.unmodifiableList(list); + return query(sql, null, rowMapper); } /** @@ -63,16 +58,18 @@ public List query(String sql, RowMapper rowMapper) throws SQLException * @throws SQLException */ public List query(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { - PreparedStatement statement = connection.prepareStatement(sql); - setter.set(statement); - ResultSet resultSet = statement.executeQuery(); - List list = new LinkedList<>(); - while (resultSet.next()) { - list.add(rowMapper.mapping(resultSet)); + final PreparedStatement statement = connection.prepareStatement(sql); + if (setter != null) { + setter.set(statement); + } + final ResultSet resultSet = statement.executeQuery(); + try (statement; resultSet) { + List list = new LinkedList<>(); + while (resultSet.next()) { + list.add(rowMapper.mapping(resultSet)); + } + return Collections.unmodifiableList(list); } - resultSet.close(); - statement.close(); - return Collections.unmodifiableList(list); } /** @@ -117,26 +114,28 @@ public Optional queryOne(String sql, PreparedStatementSetter setter, RowM public int insertAll(String table, Collection collection, String... fields) throws SQLException { String sql = new StringBuilder() .append("INSERT INTO ").append(table).append("(") - .append(Stream.of(fields).map(f -> "`" + f + "`").collect(Collectors.joining(","))).append(") VALUES") + .append(Stream.of(fields).map(f -> String.format("`%s`", f)).collect(Collectors.joining(","))) + .append(") VALUES") .append( collection .stream() .map(data -> - "(" + Stream.of(fields) + Stream.of(fields) .map(field -> { - Object object = ExpressionUtils.getValue(data, JavaBeanUtils.underlineToCamelcase(field)); - String value = object != null ? object.toString() : null; + String value = K.map( + ExpressionUtils.getValue(data, JavaBeanUtils.underlineToCamelcase(field)), + Object::toString + ); return StringUtils.isNumeric(value) ? value : ("'" + value + "'"); }) - .collect(Collectors.joining(",")) + ")" + .collect(Collectors.joining(",", "(", ")")) ) .collect(Collectors.joining(",")) ) .toString(); - Statement statement = connection.createStatement(); - int count = statement.executeUpdate(sql); - statement.close(); - return count; + try (Statement statement = connection.createStatement()) { + return statement.executeUpdate(sql); + } } /** @@ -162,9 +161,12 @@ public int insert(String table, T data, String... fields) throws SQLExceptio * @throws SQLException */ public int executeUpdate(String sql, PreparedStatementSetter setter) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - setter.set(preparedStatement); - return preparedStatement.executeUpdate(); + try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + if (setter != null) { + setter.set(preparedStatement); + } + return preparedStatement.executeUpdate(); + } } /** @@ -175,8 +177,7 @@ public int executeUpdate(String sql, PreparedStatementSetter setter) throws SQLE * @throws SQLException */ public int executeUpdate(String sql) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement(sql); - return preparedStatement.executeUpdate(); + return executeUpdate(sql, null); } @Override diff --git a/develop-toolkit-db/src/main/java/module-info.java b/develop-toolkit-db/src/main/java/module-info.java index 93086ef..ae3ccce 100644 --- a/develop-toolkit-db/src/main/java/module-info.java +++ b/develop-toolkit-db/src/main/java/module-info.java @@ -9,6 +9,7 @@ requires lombok; requires mysql.connector.java; requires org.apache.commons.lang3; + requires mongo.java.driver; exports develop.toolkit.db; exports develop.toolkit.db.mysql; From 3030990195c900482c277476a30f74ea960af35f Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 29 May 2020 17:33:30 +0800 Subject: [PATCH 055/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/struct/Pager.java | 14 ++-- .../toolkit/base/utils/ObjectAdvice.java | 74 +++++++++++++++---- 2 files changed, 66 insertions(+), 22 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java index 375ffca..db82d60 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java @@ -9,20 +9,18 @@ * 分页请求参数信息 * * @author qiushui on 2018-06-07. - * @since 0.1 */ +@Getter public class Pager implements Serializable { - private static final long serialVersionUID = -4527797845938921337L; + private static final long serialVersionUID = -4527797845938921337L; - public static final int DEFAULT_PAGE = 1; - public static final int DEFAULT_SIZE = 10; + public static final int DEFAULT_PAGE = 0; + public static final int DEFAULT_SIZE = 20; /* 页码 */ - @Getter protected int page; /* 页容量 */ - @Getter protected int size; /* 记录总条数 */ @@ -41,4 +39,8 @@ public Pager(int page, int size) { this.page = page; this.size = size; } + + public int getOffset() { + return page * size; + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 6034410..8f05fb3 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -1,12 +1,13 @@ package develop.toolkit.base.utils; -import develop.toolkit.base.struct.KeyValuePairs; import lombok.NonNull; import lombok.SneakyThrows; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.MethodUtils; import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; /** * 实例对象处理增强工具 @@ -163,20 +164,40 @@ public static boolean valueNotIn(@NonNull T obj, T... targets) { * * @param instance * @param field - * @param value * @param firstUseSetterMethod 优先使用setter方法 */ @SneakyThrows - public static void set(Object instance, String field, Object value, boolean firstUseSetterMethod) { + public static void set(Object instance, Field field, boolean firstUseSetterMethod) { + if (firstUseSetterMethod) { + try { + final String setterMethodName = JavaBeanUtils.getSetterMethodName(field.getName()); + MethodUtils.invokeMethod(instance, true, setterMethodName); + } catch (NoSuchMethodException e) { + FieldUtils.writeField(field, instance, true); + } + } else { + FieldUtils.writeField(field, instance, true); + } + } + + /** + * 反射设置值 + * + * @param instance + * @param fieldName + * @param firstUseSetterMethod 优先使用setter方法 + */ + @SneakyThrows + public static void set(Object instance, String fieldName, boolean firstUseSetterMethod) { if (firstUseSetterMethod) { try { - final String setterMethodName = JavaBeanUtils.getSetterMethodName(field); + final String setterMethodName = JavaBeanUtils.getSetterMethodName(fieldName); MethodUtils.invokeMethod(instance, true, setterMethodName); } catch (NoSuchMethodException e) { - FieldUtils.writeDeclaredField(instance, field, value, true); + FieldUtils.writeDeclaredField(instance, fieldName, true); } } else { - FieldUtils.writeDeclaredField(instance, field, value, true); + FieldUtils.writeDeclaredField(instance, fieldName, true); } } @@ -185,21 +206,43 @@ public static void set(Object instance, String field, Object value, boolean firs * * @param instance * @param field - * @param fieldType * @param firstUseGetterMethod 优先使用getter方法 * @return */ @SneakyThrows - public static Object get(Object instance, String field, Class fieldType, boolean firstUseGetterMethod) { + public static Object get(Object instance, Field field, boolean firstUseGetterMethod) { if (firstUseGetterMethod) { try { - final String getterMethodName = JavaBeanUtils.getGetterMethodName(field, fieldType); + final String getterMethodName = JavaBeanUtils.getGetterMethodName(field.getName(), field.getType()); return MethodUtils.invokeMethod(instance, true, getterMethodName); } catch (NoSuchMethodException e) { - return FieldUtils.readDeclaredField(instance, field, true); + return FieldUtils.readDeclaredField(instance, field.getName(), true); } } else { - return FieldUtils.readDeclaredField(instance, field, true); + return FieldUtils.readDeclaredField(instance, field.getName(), true); + } + } + + /** + * 反射获取值 + * + * @param instance + * @param fieldName + * @param firstUseGetterMethod 优先使用getter方法 + * @return + */ + @SneakyThrows + public static Object get(Object instance, String fieldName, boolean firstUseGetterMethod) { + if (firstUseGetterMethod) { + try { + Field field = instance.getClass().getField(fieldName); + final String getterMethodName = JavaBeanUtils.getGetterMethodName(fieldName, field.getType()); + return MethodUtils.invokeMethod(instance, true, getterMethodName); + } catch (NoSuchMethodException e) { + return FieldUtils.readDeclaredField(instance, fieldName, true); + } + } else { + return FieldUtils.readDeclaredField(instance, fieldName, true); } } @@ -209,15 +252,14 @@ public static Object get(Object instance, String field, Class fieldType, bool * @param instance * @return */ - public static KeyValuePairs readAllFieldValue(Object instance) { + public static Map readAllFieldValue(Object instance) { Class instanceClass = instance.getClass(); - KeyValuePairs keyValuePairs = new KeyValuePairs<>(); - + Map map = new HashMap<>(); Field[] fields = instanceClass.getDeclaredFields(); for (Field field : fields) { - keyValuePairs.addKeyValue(field.getName(), get(instance, field.getName(), field.getType(), true)); + map.put(field, get(instance, field, true)); } - return keyValuePairs; + return map; } /** From 70c67a187d7dcf07c20f165c22fd23ae20984712 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 30 May 2020 22:56:53 +0800 Subject: [PATCH 056/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/ObjectAdvice.java | 122 +----------------- 1 file changed, 7 insertions(+), 115 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 8f05fb3..3cecc9f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -16,113 +16,6 @@ */ public final class ObjectAdvice { - /** - * 是否基本类型 - * - * @param clazz - * @return - */ - public static boolean isPrimitiveType(Class clazz) { - return valueIn(clazz, - int.class, Integer.class, - long.class, Long.class, - float.class, Float.class, - double.class, Double.class, - boolean.class, Boolean.class, - char.class, Character.class, - short.class, Short.class, - byte.class, Byte.class - ); - } - - /** - * 是否是字节 - * - * @param obj - * @return - */ - public static boolean isByte(Object obj) { - var clazz = obj.getClass(); - return clazz == byte.class || clazz == Byte.class; - } - - /** - * 是否是短整型 - * - * @param obj - * @return - */ - public static boolean isShort(Object obj) { - var clazz = obj.getClass(); - return clazz == short.class || clazz == Short.class; - } - - /** - * 是否是整型 - * - * @param obj - * @return - */ - public static boolean isInt(Object obj) { - var clazz = obj.getClass(); - return clazz == int.class || clazz == Integer.class; - } - - /** - * 是否是长整型 - * - * @param obj - * @return - */ - public static boolean isLong(Object obj) { - var clazz = obj.getClass(); - return clazz == long.class || clazz == Long.class; - } - - /** - * 是否是单精度浮点型 - * - * @param obj - * @return - */ - public static boolean isFloat(Object obj) { - var clazz = obj.getClass(); - return clazz == float.class || clazz == Float.class; - } - - /** - * 是否是双精度浮点型 - * - * @param obj - * @return - */ - public static boolean isDouble(Object obj) { - var clazz = obj.getClass(); - return clazz == double.class || clazz == Double.class; - } - - /** - * 是否是字符型 - * - * @param obj - * @return - */ - public static boolean isChar(Object obj) { - var clazz = obj.getClass(); - return clazz == char.class || clazz == Character.class; - } - - /** - * 是否是布尔型 - * - * @param obj - * @return - */ - public static boolean isBoolean(Object obj) { - var clazz = obj.getClass(); - return clazz == boolean.class || clazz == Boolean.class; - } - /** * 值是否在数组里 * @@ -194,10 +87,10 @@ public static void set(Object instance, String fieldName, boolean firstUseSetter final String setterMethodName = JavaBeanUtils.getSetterMethodName(fieldName); MethodUtils.invokeMethod(instance, true, setterMethodName); } catch (NoSuchMethodException e) { - FieldUtils.writeDeclaredField(instance, fieldName, true); + FieldUtils.writeField(instance, fieldName, true); } } else { - FieldUtils.writeDeclaredField(instance, fieldName, true); + FieldUtils.writeField(instance, fieldName, true); } } @@ -216,10 +109,10 @@ public static Object get(Object instance, Field field, boolean firstUseGetterMet final String getterMethodName = JavaBeanUtils.getGetterMethodName(field.getName(), field.getType()); return MethodUtils.invokeMethod(instance, true, getterMethodName); } catch (NoSuchMethodException e) { - return FieldUtils.readDeclaredField(instance, field.getName(), true); + return FieldUtils.readField(instance, field.getName(), true); } } else { - return FieldUtils.readDeclaredField(instance, field.getName(), true); + return FieldUtils.readField(instance, field.getName(), true); } } @@ -239,10 +132,10 @@ public static Object get(Object instance, String fieldName, boolean firstUseGett final String getterMethodName = JavaBeanUtils.getGetterMethodName(fieldName, field.getType()); return MethodUtils.invokeMethod(instance, true, getterMethodName); } catch (NoSuchMethodException e) { - return FieldUtils.readDeclaredField(instance, fieldName, true); + return FieldUtils.readField(instance, fieldName, true); } } else { - return FieldUtils.readDeclaredField(instance, fieldName, true); + return FieldUtils.readField(instance, fieldName, true); } } @@ -253,9 +146,8 @@ public static Object get(Object instance, String fieldName, boolean firstUseGett * @return */ public static Map readAllFieldValue(Object instance) { - Class instanceClass = instance.getClass(); Map map = new HashMap<>(); - Field[] fields = instanceClass.getDeclaredFields(); + Field[] fields = FieldUtils.getAllFields(instance.getClass()); for (Field field : fields) { map.put(field, get(instance, field, true)); } From b052e08033a5bb0fa7af721533fd68e4298b7e13 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 5 Jun 2020 23:42:47 +0800 Subject: [PATCH 057/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/HttpAdvice.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index e347427..dbb2b35 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -22,6 +22,20 @@ @Slf4j public final class HttpAdvice { + /** + * 默认的httpClient + * + * @return + */ + public static HttpClient defaultHttpClient() { + return HttpClient + .newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .connectTimeout(Duration.ofSeconds(5L)) + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); + } + /** * 通用请求 * @@ -204,7 +218,7 @@ private static HttpAdviceResponse send(String label, HttpClient httpClient, Stri .build(); Instant start = Instant.now(); - HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofByteArray()); + HttpResponse httpResponse = K.def(httpClient, HttpAdvice::defaultHttpClient).send(httpRequest, HttpResponse.BodyHandlers.ofByteArray()); Instant end = Instant.now(); response = new HttpAdviceResponse( httpResponse.statusCode(), From 1b451e0090c5c658c05806164eb7b24a5a19b318 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 23 Jun 2020 10:19:27 +0800 Subject: [PATCH 058/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/Counter.java | 18 +--- .../base/components/EntityRegistry.java | 1 + .../toolkit/base/components/StopWatch.java | 3 +- .../base/constants/DateFormatConstants.java | 1 + .../base/constants/DateTimeConstants.java | 3 +- .../exception/FormatRuntimeException.java | 1 + .../toolkit/base/struct/CollectionInMap.java | 1 + .../base/struct/HttpAdviceResponse.java | 1 + .../toolkit/base/struct/KeyValuePair.java | 9 -- .../toolkit/base/struct/KeyValuePairs.java | 25 +---- .../develop/toolkit/base/struct/Pager.java | 1 + .../toolkit/base/struct/PagerResult.java | 3 +- .../toolkit/base/struct/ThreeValues.java | 8 -- .../toolkit/base/struct/TwoValues.java | 6 -- .../toolkit/base/struct/range/IntRange.java | 2 - .../toolkit/base/struct/range/LongRange.java | 3 +- .../toolkit/base/utils/CollectionAdvice.java | 1 + .../toolkit/base/utils/CompareAdvice.java | 35 +----- .../toolkit/base/utils/DateTimeAdvice.java | 49 +-------- .../toolkit/base/utils/HttpAdvice.java | 47 +------- .../develop/toolkit/base/utils/IOAdvice.java | 100 +----------------- .../toolkit/base/utils/JavaBeanUtils.java | 26 +---- .../java/develop/toolkit/base/utils/K.java | 11 +- .../toolkit/base/utils/ObjectAdvice.java | 43 +++----- .../toolkit/base/utils/RandomAdvice.java | 15 +-- .../toolkit/base/utils/StatisticsAdvice.java | 19 +--- .../toolkit/base/utils/StringAdvice.java | 44 ++------ .../java/develop/toolkit/db/DBAdvice.java | 1 + .../develop/toolkit/db/mysql/MysqlClient.java | 43 +------- .../develop/toolkit/db/mysql/SQLFactory.java | 3 +- .../develop/toolkit/world/normal/Season.java | 18 +--- .../develop/toolkit/world/person/Account.java | 5 +- .../world/person/IdentificationCard.java | 12 +-- .../develop/toolkit/world/person/Sex.java | 1 + .../develop/toolkit/world/verify/Regex.java | 1 + .../toolkit/world/verify/WorldVerify.java | 10 +- pom.xml | 12 +++ 37 files changed, 72 insertions(+), 510 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java index f8f849c..99cdd7d 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java @@ -10,14 +10,13 @@ * * @author qiushui on 2020-03-25. */ +@SuppressWarnings("unused") public class Counter { - private ConcurrentHashMap map = new ConcurrentHashMap<>(); + private final ConcurrentHashMap map = new ConcurrentHashMap<>(); /** * 加 - * - * @param key */ public void add(K key, final int count) { map.compute(key, (k, v) -> v == null ? count : (v + count)); @@ -25,8 +24,6 @@ public void add(K key, final int count) { /** * 加1 - * - * @param key */ public void add(K key) { add(key, 1); @@ -34,8 +31,6 @@ public void add(K key) { /** * 减 - * - * @param key */ public void subtract(K key, final int count) { map.compute(key, (k, v) -> (v == null || v == count) ? 0 : (v - count)); @@ -43,8 +38,6 @@ public void subtract(K key, final int count) { /** * 减1 - * - * @param key */ public void subtract(K key) { subtract(key, 1); @@ -52,9 +45,6 @@ public void subtract(K key) { /** * 取值 - * - * @param key - * @return */ public int get(K key) { return map.getOrDefault(key, 0); @@ -62,8 +52,6 @@ public int get(K key) { /** * 获得所有键集合 - * - * @return */ public Set keySet() { return map.keySet(); @@ -71,8 +59,6 @@ public Set keySet() { /** * 转化成KeyValuePairs - * - * @return */ public KeyValuePairs toKeyValuePairs() { return KeyValuePairs.fromMap(map); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java index 9885e24..d1f470c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/EntityRegistry.java @@ -12,6 +12,7 @@ * * @author qiushui on 2018-05-29. */ +@SuppressWarnings("unused") public abstract class EntityRegistry, K> implements Serializable { private static final long serialVersionUID = 8580818076321536793L; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java index cd2e438..0dd8725 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java @@ -11,11 +11,12 @@ * * @author qiushui on 2019-03-17. */ +@SuppressWarnings("unused") public final class StopWatch { public static final String DEFAULT_NAME = "default"; - private Map startInstantMap = new ConcurrentHashMap<>(); + private final Map startInstantMap = new ConcurrentHashMap<>(); private StopWatch(String name) { pause(name); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java index ca19f14..abc598b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java @@ -7,6 +7,7 @@ * * @author qiushui on 2019-02-20. */ +@SuppressWarnings("unused") public interface DateFormatConstants { String STANDARD = "yyyy-MM-dd HH:mm:ss"; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateTimeConstants.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateTimeConstants.java index 7c3471e..70e5bb7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateTimeConstants.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateTimeConstants.java @@ -5,9 +5,8 @@ /** * @author qiushui on 2019-05-07. */ +@SuppressWarnings("unused") public interface DateTimeConstants { LocalTime LAST_SECOND = LocalTime.of(23, 59, 59); - - } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/FormatRuntimeException.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/FormatRuntimeException.java index b146a43..2a9a231 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/FormatRuntimeException.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/FormatRuntimeException.java @@ -5,6 +5,7 @@ * * @author qiushui */ +@SuppressWarnings("unused") public abstract class FormatRuntimeException extends RuntimeException{ public FormatRuntimeException() { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java index b08cb3a..7511c8c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java @@ -13,6 +13,7 @@ * * @author qiushui on 2018-07-09. */ +@SuppressWarnings("unused") public class CollectionInMap extends LinkedHashMap> { private static final long serialVersionUID = 3068493190714636107L; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java index 4ea6d3b..1471cf2 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java @@ -14,6 +14,7 @@ @Setter @NoArgsConstructor @AllArgsConstructor +@SuppressWarnings("unused") public class HttpAdviceResponse { private int httpStatus; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java index 198b517..908f560 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java @@ -24,9 +24,6 @@ public class KeyValuePair implements Serializable { /** * 美化成字符串 - * - * @param separator - * @return */ public String formatString(String separator) { return key + separator + value; @@ -39,12 +36,6 @@ public String toString() { /** * 带值初始化 - * - * @param key - * @param value - * @param - * @param - * @return */ public static KeyValuePair of(K key, V value) { return new KeyValuePair<>(key, value); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java index ee892a1..e9906d6 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePairs.java @@ -8,15 +8,13 @@ * * @author qiushui on 2018-11-03. */ +@SuppressWarnings("unused") public class KeyValuePairs extends LinkedList> { private static final long serialVersionUID = -3327179013671312416L; /** * 添加键值对 - * - * @param key - * @param value */ public void addKeyValue(K key, V value) { this.add(new KeyValuePair<>(key, value)); @@ -24,8 +22,6 @@ public void addKeyValue(K key, V value) { /** * 获取所有键 - * - * @return */ public List allKey() { return this.stream().map(KeyValuePair::getKey).collect(Collectors.toList()); @@ -33,8 +29,6 @@ public List allKey() { /** * 获取所有值 - * - * @return */ public List allValue() { return this.stream().map(KeyValuePair::getValue).collect(Collectors.toList()); @@ -42,8 +36,6 @@ public List allValue() { /** * 转化成Map形式 - * - * @return */ public Map toMap() { Map map = new HashMap<>(); @@ -53,11 +45,6 @@ public Map toMap() { /** * 从Map转化 - * - * @param map - * @param - * @param - * @return */ public static KeyValuePairs fromMap(Map map) { KeyValuePairs keyValuePairs = new KeyValuePairs<>(); @@ -67,11 +54,6 @@ public static KeyValuePairs fromMap(Map map) { /** * 带值初始化 - * - * @param keyValuePairArray - * @param - * @param - * @return */ @SafeVarargs public static KeyValuePairs of(KeyValuePair... keyValuePairArray) { @@ -80,11 +62,6 @@ public static KeyValuePairs of(KeyValuePair... keyValuePairAr /** * 带值初始化 - * - * @param keyValuePairCollection - * @param - * @param - * @return */ public static KeyValuePairs of(Collection> keyValuePairCollection) { KeyValuePairs keyValuePairs = new KeyValuePairs<>(); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java index db82d60..d01aa52 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/Pager.java @@ -40,6 +40,7 @@ public Pager(int page, int size) { this.size = size; } + @SuppressWarnings("unused") public int getOffset() { return page * size; } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java index 762a615..6911fd8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/PagerResult.java @@ -13,6 +13,7 @@ */ @Getter @NoArgsConstructor +@SuppressWarnings("unused") public class PagerResult implements Serializable { private static final long serialVersionUID = -3028130281925624773L; @@ -35,8 +36,6 @@ public PagerResult(int page, int size, List list, long total) { /** * 空分页结果 - * - * @return */ public static PagerResult empty(Class clazz, int page, int size) { return new PagerResult<>(page, size, List.of(), 0); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java index ea122a4..375ff92 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java @@ -25,14 +25,6 @@ public class ThreeValues implements Serializable { /** * 带值初始化 - * - * @param firstValue - * @param secondValue - * @param thirdValue - * @param - * @param - * @param - * @return */ public static ThreeValues of(T firstValue, S secondValue, U thirdValue) { return new ThreeValues<>(firstValue, secondValue, thirdValue); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java index cca596d..a02cbe3 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java @@ -23,12 +23,6 @@ public class TwoValues implements Serializable { /** * 带值初始化 - * - * @param firstValue - * @param secondValue - * @param - * @param - * @return */ public static TwoValues of(T firstValue, S secondValue) { return new TwoValues<>(firstValue, secondValue); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java index ec5ae8f..9e66676 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/IntRange.java @@ -11,8 +11,6 @@ public IntRange(Integer start, Integer end) { /** * 生成整型数组 - * - * @return */ public final Integer[] generate() { Integer[] array = new Integer[end - start]; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java index 092c045..8f2c6f8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/range/LongRange.java @@ -3,6 +3,7 @@ /** * 长整型范围 */ +@SuppressWarnings("unused") public class LongRange extends Range { public LongRange(Long start, Long end) { @@ -11,8 +12,6 @@ public LongRange(Long start, Long end) { /** * 生成长整型数组 - * - * @return */ public final long[] generate() { long[] array = new long[(int) (end - start)]; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index b8752b2..22bdfee 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -15,6 +15,7 @@ * * @author qiushui on 2018-12-20. */ +@SuppressWarnings("unused") public final class CollectionAdvice { /** diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java index 2d38489..3d64a7b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java @@ -7,14 +7,11 @@ * * @author qiushui on 2019-08-23. */ +@SuppressWarnings("unused") public final class CompareAdvice { /** * 小于 - * - * @param a - * @param b - * @return */ public static > boolean lt(@NonNull T a, @NonNull T b) { return a.compareTo(b) < 0; @@ -22,10 +19,6 @@ public static > boolean lt(@NonNull T a, @NonNull T b) { /** * 小于等于 - * - * @param a - * @param b - * @return */ public static > boolean lte(@NonNull T a, @NonNull T b) { return a.compareTo(b) <= 0; @@ -33,10 +26,6 @@ public static > boolean lte(@NonNull T a, @NonNull T b) /** * 大于 - * - * @param a - * @param b - * @return */ public static > boolean gt(@NonNull T a, @NonNull T b) { return a.compareTo(b) > 0; @@ -44,10 +33,6 @@ public static > boolean gt(@NonNull T a, @NonNull T b) { /** * 大于等于 - * - * @param a - * @param b - * @return */ public static > boolean gte(@NonNull T a, @NonNull T b) { return a.compareTo(b) >= 0; @@ -55,10 +40,6 @@ public static > boolean gte(@NonNull T a, @NonNull T b) /** * 等于 - * - * @param a - * @param b - * @return */ public static > boolean eq(@NonNull T a, @NonNull T b) { return a.compareTo(b) == 0; @@ -66,12 +47,6 @@ public static > boolean eq(@NonNull T a, @NonNull T b) { /** * 在之间(闭区间) - * - * @param a - * @param start - * @param end - * @param - * @return */ public static > boolean between(@NonNull T a, @NonNull T start, @NonNull T end) { return gte(a, start) && lte(a, end); @@ -79,10 +54,6 @@ public static > boolean between(@NonNull T a, @NonNull T /** * 返回两者中较大值 - * - * @param a - * @param b - * @return */ public static > T max(@NonNull T a, @NonNull T b) { return gt(a, b) ? a : b; @@ -90,10 +61,6 @@ public static > T max(@NonNull T a, @NonNull T b) { /** * 返回两者中较小值 - * - * @param a - * @param b - * @return */ public static > T min(@NonNull T a, @NonNull T b) { return lt(a, b) ? a : b; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java index 5329361..720a996 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java @@ -12,6 +12,7 @@ * * @author qiushui on 2019-02-20. */ +@SuppressWarnings("unused") public final class DateTimeAdvice { public static String now() { @@ -20,9 +21,6 @@ public static String now() { /** * 格式化Date - * - * @param date - * @return */ public static String format(Date date) { return format(date, DateFormatConstants.STANDARD); @@ -30,9 +28,6 @@ public static String format(Date date) { /** * 解析标准日期时间字符串 - * - * @param dateStr - * @return */ public static LocalDateTime parseStandard(CharSequence dateStr) { return LocalDateTime.parse(dateStr, DateFormatConstants.STANDARD_FORMATTER); @@ -40,10 +35,6 @@ public static LocalDateTime parseStandard(CharSequence dateStr) { /** * 格式化Date - * - * @param date - * @param pattern - * @return */ public static String format(Date date, String pattern) { if (date == null) { @@ -54,9 +45,6 @@ public static String format(Date date, String pattern) { /** * 格式化LocalDateTime - * - * @param localDateTime - * @return */ public static String format(LocalDateTime localDateTime) { return format(localDateTime, DateFormatConstants.STANDARD); @@ -64,10 +52,6 @@ public static String format(LocalDateTime localDateTime) { /** * 格式化LocalDateTime - * - * @param localDateTime - * @param pattern - * @return */ public static String format(LocalDateTime localDateTime, String pattern) { if (localDateTime == null) { @@ -79,9 +63,6 @@ public static String format(LocalDateTime localDateTime, String pattern) { /** * Date转到LocalDateTime - * - * @param date - * @return */ public static LocalDateTime toLocalDateTime(Date date) { if (date == null) { @@ -92,9 +73,6 @@ public static LocalDateTime toLocalDateTime(Date date) { /** * Date转到LocalDate - * - * @param date - * @return */ public static LocalDate toLocalDate(Date date) { if (date == null) { @@ -105,9 +83,6 @@ public static LocalDate toLocalDate(Date date) { /** * Date转到LocalTime - * - * @param date - * @return */ public static LocalTime toLocalTime(Date date) { if (date == null) { @@ -118,9 +93,6 @@ public static LocalTime toLocalTime(Date date) { /** * Date转到Instant - * - * @param date - * @return */ public static Instant toInstant(Date date) { if (date == null) { @@ -131,9 +103,6 @@ public static Instant toInstant(Date date) { /** * 从LocalDateTime转到Date - * - * @param localDateTime - * @return */ public static Date fromLocalDateTime(LocalDateTime localDateTime) { if (localDateTime == null) { @@ -144,9 +113,6 @@ public static Date fromLocalDateTime(LocalDateTime localDateTime) { /** * 从LocalDate转到Date - * - * @param localDate - * @return */ public static Date fromLocalDate(LocalDate localDate) { if (localDate == null) { @@ -157,9 +123,6 @@ public static Date fromLocalDate(LocalDate localDate) { /** * 从LocalTime转到Date - * - * @param localTime - * @return */ public static Date fromLocalTime(LocalTime localTime) { if (localTime == null) { @@ -171,9 +134,6 @@ public static Date fromLocalTime(LocalTime localTime) { /** * 从Instant转到Date - * - * @param instant - * @return */ public static Date fromInstant(Instant instant) { if (instant == null) { @@ -184,10 +144,6 @@ public static Date fromInstant(Instant instant) { /** * 判断是否同一个月 - * - * @param day1 - * @param day2 - * @return */ public static boolean isSameMonth(LocalDate day1, LocalDate day2) { return day1.getYear() == day2.getYear() && day1.getMonth().getValue() == day2.getMonth().getValue(); @@ -195,9 +151,6 @@ public static boolean isSameMonth(LocalDate day1, LocalDate day2) { /** * 毫秒美化 - * - * @param millisecond - * @return */ public static String millisecondPretty(long millisecond) { if (millisecond < 1000) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index dbb2b35..fcd0371 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -20,12 +20,11 @@ * Http增强工具 */ @Slf4j +@SuppressWarnings("unused") public final class HttpAdvice { /** * 默认的httpClient - * - * @return */ public static HttpClient defaultHttpClient() { return HttpClient @@ -38,16 +37,6 @@ public static HttpClient defaultHttpClient() { /** * 通用请求 - * - * @param label - * @param httpClient - * @param httpMethod - * @param url - * @param headers - * @param parameters - * @param content - * @return - * @throws IOException */ public static HttpAdviceResponse request( String label, @@ -69,13 +58,6 @@ public static HttpAdviceResponse request( /** * GET请求 - * - * @param httpClient - * @param url - * @param headers - * @param parameters - * @return - * @throws IOException */ public static HttpAdviceResponse get(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { return send( @@ -119,15 +101,6 @@ public static HttpAdviceResponse delete(String label, HttpClient httpClient, Str /** * 发送x-www-form-urlencoded格式请求 - * - * @param httpClient - * @param httpMethod - * @param url - * @param headers - * @param parameters - * @param form - * @return - * @throws IOException */ public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, Map form) throws IOException { return send( @@ -145,15 +118,6 @@ public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient htt /** * 发送json请求 - * - * @param httpClient - * @param httpMethod - * @param url - * @param headers - * @param parameters - * @param json - * @return - * @throws IOException */ public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, String json) throws IOException { return send( @@ -167,15 +131,6 @@ public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, S /** * 发送xml请求 - * - * @param httpClient - * @param httpMethod - * @param url - * @param headers - * @param parameters - * @param xml - * @return - * @throws IOException */ public static HttpAdviceResponse sendXml(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, String xml) throws IOException { return send( diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index e78cc24..c0e5cb0 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -15,13 +15,11 @@ * * @author qiushui on 2019-02-21. */ +@SuppressWarnings("unused") public final class IOAdvice { /** * 转换成字节数组 - * - * @param inputStream - * @return */ public static byte[] toByteArray(InputStream inputStream) { try (inputStream; ByteArrayOutputStream baos = new ByteArrayOutputStream()) { @@ -34,9 +32,6 @@ public static byte[] toByteArray(InputStream inputStream) { /** * 转换成字节数组 - * - * @param filename - * @return */ public static byte[] toByteArrayFromClasspath(String filename) { return toByteArray(readInputStreamFromClasspath(filename)); @@ -44,9 +39,6 @@ public static byte[] toByteArrayFromClasspath(String filename) { /** * 文件读取行 - * - * @param filename - * @return */ public static Stream readLines(String filename) { return readLines(filename, null); @@ -54,10 +46,6 @@ public static Stream readLines(String filename) { /** * 文件读取行 - * - * @param filename - * @param charset - * @return */ public static Stream readLines(String filename, Charset charset) { try { @@ -69,9 +57,6 @@ public static Stream readLines(String filename, Charset charset) { /** * 文本流读取行 - * - * @param inputStream - * @return */ public static Stream readLines(InputStream inputStream) { return readLines(inputStream, null); @@ -79,10 +64,6 @@ public static Stream readLines(InputStream inputStream) { /** * 文本流读取行 - * - * @param inputStream - * @param charset - * @return */ public static Stream readLines(InputStream inputStream, Charset charset) { try (inputStream) { @@ -100,9 +81,6 @@ public static Stream readLines(InputStream inputStream, Charset charset) /** * 从classpath读流 - * - * @param filename - * @return */ public static InputStream readInputStreamFromClasspath(String filename) { return IOAdvice.class.getResourceAsStream(filename.startsWith("/") ? filename : ("/" + filename)); @@ -110,10 +88,6 @@ public static InputStream readInputStreamFromClasspath(String filename) { /** * 从classpath读取文件 - * - * @param filename - * @param charset - * @return */ public static Stream readLinesFromClasspath(String filename, Charset charset) { return readLines(readInputStreamFromClasspath(filename), charset); @@ -121,9 +95,6 @@ public static Stream readLinesFromClasspath(String filename, Charset cha /** * 从classpath读取文件 - * - * @param filename - * @return */ public static Stream readLinesFromClasspath(String filename) { return readLines(readInputStreamFromClasspath(filename), null); @@ -131,10 +102,6 @@ public static Stream readLinesFromClasspath(String filename) { /** * 从classpath读取文件并每行用regex切分 - * - * @param filename - * @param regex - * @return */ public static Stream splitFromClasspath(String filename, String regex) { return readLinesFromClasspath(filename).map(line -> line.split(regex)); @@ -142,10 +109,6 @@ public static Stream splitFromClasspath(String filename, String regex) /** * 读取文本 - * - * @param inputStream - * @param charset - * @return */ public static String readText(InputStream inputStream, Charset charset) { StringBuilder sb = new StringBuilder(); @@ -155,9 +118,6 @@ public static String readText(InputStream inputStream, Charset charset) { /** * 读取文本 - * - * @param inputStream - * @return */ public static String readText(InputStream inputStream) { StringBuilder sb = new StringBuilder(); @@ -167,10 +127,6 @@ public static String readText(InputStream inputStream) { /** * 从classpath读取文本 - * - * @param filename - * @param charset - * @return */ public static String readTextFromClasspath(String filename, Charset charset) { StringBuilder sb = new StringBuilder(); @@ -180,9 +136,6 @@ public static String readTextFromClasspath(String filename, Charset charset) { /** * 从classpath读取文本 - * - * @param filename - * @return */ public static String readTextFromClasspath(String filename) { StringBuilder sb = new StringBuilder(); @@ -192,10 +145,6 @@ public static String readTextFromClasspath(String filename) { /** * 文本流按行循环处理 - * - * @param inputStream - * @param charset - * @param consumer */ public static void forEach(InputStream inputStream, Charset charset, Consumer consumer) { readLines(inputStream, charset).forEach(consumer); @@ -203,9 +152,6 @@ public static void forEach(InputStream inputStream, Charset charset, Consumer consumer) { readLines(inputStream).forEach(consumer); @@ -213,10 +159,6 @@ public static void forEach(InputStream inputStream, Consumer consumer) { /** * classpath文本流按行循环处理 - * - * @param filename - * @param charset - * @param consumer */ public static void forEachFromClasspath(String filename, Charset charset, Consumer consumer) { readLinesFromClasspath(filename, charset).forEach(consumer); @@ -224,9 +166,6 @@ public static void forEachFromClasspath(String filename, Charset charset, Consum /** * classpath文本流按行循环处理 - * - * @param filename - * @param consumer */ public static void forEachFromClasspath(String filename, Consumer consumer) { readLinesFromClasspath(filename).forEach(consumer); @@ -234,10 +173,6 @@ public static void forEachFromClasspath(String filename, Consumer consum /** * 写出文本行到文件 - * - * @param lines - * @param filename - * @param charset */ public static void writeLines(List lines, String filename, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), charset))) { @@ -253,10 +188,6 @@ public static void writeLines(List lines, String filename, Charset chars /** * 写出文本行 - * - * @param lines - * @param outputStream - * @param charset */ public static void writeLines(List lines, OutputStream outputStream, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { @@ -272,10 +203,6 @@ public static void writeLines(List lines, OutputStream outputStream, Cha /** * 追加文本行 - * - * @param lines - * @param filename - * @param charset */ public static void appendLines(List lines, String filename, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), charset))) { @@ -291,10 +218,6 @@ public static void appendLines(List lines, String filename, Charset char /** * 追加文本行 - * - * @param lines - * @param outputStream - * @param charset */ public static void appendLines(List lines, OutputStream outputStream, Charset charset) { try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { @@ -310,11 +233,6 @@ public static void appendLines(List lines, OutputStream outputStream, Ch /** * 复制文本 - * - * @param inputStream - * @param outputStream - * @param charset - * @param function */ public static void copyText(InputStream inputStream, OutputStream outputStream, Charset charset, Function function) { Scanner scanner = new Scanner(inputStream, charset); @@ -332,10 +250,6 @@ public static void copyText(InputStream inputStream, OutputStream outputStream, /** * 复制文件 - * - * @param inputStream - * @param outputStream - * @return */ public static long copy(InputStream inputStream, OutputStream outputStream) throws IOException { final byte[] buffer = new byte[4096]; @@ -350,10 +264,6 @@ public static long copy(InputStream inputStream, OutputStream outputStream) thro /** * 安静地复制文件 - * - * @param source - * @param target - * @return */ public static long copyQuietly(File source, File target) { if (target.getParentFile().mkdirs()) { @@ -371,9 +281,6 @@ public static long copyQuietly(File source, File target) { /** * 打印文件 - * - * @param filename - * @param charset */ public static void printFile(String filename, Charset charset) { readLines(filename, charset).forEach(System.out::println); @@ -381,9 +288,6 @@ public static void printFile(String filename, Charset charset) { /** * 打印流文件 - * - * @param inputStream - * @param charset */ public static void printInputStream(InputStream inputStream, Charset charset) { readLines(inputStream, charset).forEach(System.out::println); @@ -391,8 +295,6 @@ public static void printInputStream(InputStream inputStream, Charset charset) { /** * 打印流文件 - * - * @param inputStream */ public static void printInputStream(InputStream inputStream) { readLines(inputStream, StandardCharsets.UTF_8).forEach(System.out::println); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JavaBeanUtils.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JavaBeanUtils.java index 2b224f1..9f5f434 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JavaBeanUtils.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JavaBeanUtils.java @@ -4,14 +4,11 @@ * @author qiushui on 2018-10-03. * @since 0.1 */ +@SuppressWarnings("unused") public final class JavaBeanUtils { /** * 根据属性名称和java类型,获取对应的getter方法名 - * - * @param property - * @param javaType - * @return */ public static String getGetterMethodName(String property, Class javaType) { StringBuilder sb = new StringBuilder(); @@ -31,9 +28,6 @@ public static String getGetterMethodName(String property, Class javaType) { /** * 根据属性名称获取对应的setter方法名称 - * - * @param property - * @return */ public static String getSetterMethodName(String property) { StringBuilder sb = new StringBuilder(); @@ -49,9 +43,6 @@ public static String getSetterMethodName(String property) { /** * 驼峰转下划线 - * - * @param camelcaseString - * @return */ public static String camelcaseToUnderline(String camelcaseString) { StringBuilder sb = new StringBuilder(); @@ -68,9 +59,6 @@ public static String camelcaseToUnderline(String camelcaseString) { /** * 驼峰转中划线 - * - * @param camelcaseString - * @return */ public static String camelcaseToMiddleLine(String camelcaseString) { StringBuilder sb = new StringBuilder(); @@ -90,9 +78,6 @@ public static String camelcaseToMiddleLine(String camelcaseString) { /** * 下划线转驼峰 - * - * @param underlineString - * @return */ public static String underlineToCamelcase(String underlineString) { StringBuilder sb = new StringBuilder(); @@ -115,9 +100,6 @@ public static String underlineToCamelcase(String underlineString) { /** * 中划线转驼峰 - * - * @param middleLineString - * @return */ public static String middleLineToCamelcase(String middleLineString) { StringBuilder sb = new StringBuilder(); @@ -140,9 +122,6 @@ public static String middleLineToCamelcase(String middleLineString) { /** * 开头字母转大写 - * - * @param text - * @return */ public static String startUpperCaseText(String text) { StringBuilder sb = new StringBuilder(); @@ -159,9 +138,6 @@ public static String startUpperCaseText(String text) { /** * 开头字母转小写 - * - * @param text - * @return */ public static String startLowerCaseText(String text) { StringBuilder sb = new StringBuilder(); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java index 8ab3ddd..2d4b8ad 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java @@ -7,6 +7,7 @@ /** * 判空处理简化操作 */ +@SuppressWarnings("unused") public final class K { /** @@ -14,8 +15,8 @@ public final class K { * * @param value 值 * @param defaultSupplier 默认值提供器 - * @param - * @return + * @param 泛型 + * @return 值 */ public static T def(T value, Supplier defaultSupplier) { return value != null ? value : defaultSupplier.get(); @@ -25,7 +26,7 @@ public static T def(T value, Supplier defaultSupplier) { * 如果不为null则执行consumer * * @param value 值 - * @param + * @param 泛型 */ public static void let(T value, Consumer consumer) { if (value != null) { @@ -38,9 +39,7 @@ public static void let(T value, Consumer consumer) { * * @param value 值 * @param function 转化函数 - * @param - * @param - * @return + * @return 转化值 */ public static R map(T value, Function function) { return value != null ? function.apply(value) : null; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 3cecc9f..088fd84 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -14,15 +14,11 @@ * * @author qiushui on 2019-02-20. */ +@SuppressWarnings("unused") public final class ObjectAdvice { /** * 值是否在数组里 - * - * @param obj - * @param targets - * @param - * @return */ @SafeVarargs public static boolean valueIn(@NonNull T obj, T... targets) { @@ -36,11 +32,6 @@ public static boolean valueIn(@NonNull T obj, T... targets) { /** * 值是否不在数组里 - * - * @param obj - * @param targets - * @param - * @return */ @SafeVarargs public static boolean valueNotIn(@NonNull T obj, T... targets) { @@ -55,8 +46,8 @@ public static boolean valueNotIn(@NonNull T obj, T... targets) { /** * 反射设置值 * - * @param instance - * @param field + * @param instance 实例 + * @param field 字段 * @param firstUseSetterMethod 优先使用setter方法 */ @SneakyThrows @@ -76,8 +67,8 @@ public static void set(Object instance, Field field, boolean firstUseSetterMetho /** * 反射设置值 * - * @param instance - * @param fieldName + * @param instance 实例 + * @param fieldName 字段 * @param firstUseSetterMethod 优先使用setter方法 */ @SneakyThrows @@ -97,10 +88,10 @@ public static void set(Object instance, String fieldName, boolean firstUseSetter /** * 反射获取值 * - * @param instance - * @param field + * @param instance 实例 + * @param field 字段 * @param firstUseGetterMethod 优先使用getter方法 - * @return + * @return 反射值 */ @SneakyThrows public static Object get(Object instance, Field field, boolean firstUseGetterMethod) { @@ -119,10 +110,10 @@ public static Object get(Object instance, Field field, boolean firstUseGetterMet /** * 反射获取值 * - * @param instance - * @param fieldName + * @param instance 实例 + * @param fieldName 字段 * @param firstUseGetterMethod 优先使用getter方法 - * @return + * @return 反射值 */ @SneakyThrows public static Object get(Object instance, String fieldName, boolean firstUseGetterMethod) { @@ -142,8 +133,8 @@ public static Object get(Object instance, String fieldName, boolean firstUseGett /** * 读取全部字段值 * - * @param instance - * @return + * @param instance 实例 + * @return 所有字段值 */ public static Map readAllFieldValue(Object instance) { Map map = new HashMap<>(); @@ -156,10 +147,6 @@ public static Map readAllFieldValue(Object instance) { /** * 安静地使用无参构造方法new对象 - * - * @param clazz - * @param - * @return */ @SneakyThrows public static T newInstanceQuietly(Class clazz) { @@ -168,10 +155,6 @@ public static T newInstanceQuietly(Class clazz) { /** * 字符串值转化成基本类型值 - * - * @param value - * @param clazz - * @return */ public static Object primitiveTypeCast(String value, Class clazz) { if (value == null) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java index fadb663..fc73fba 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java @@ -9,15 +9,11 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +@SuppressWarnings("unused") public final class RandomAdvice { /** * 随机count个整数 - * - * @param startInclusive - * @param endExclusive - * @param count - * @return */ public static int[] nextInts(final int startInclusive, final int endExclusive, final int count) { Validate.isTrue(endExclusive - startInclusive >= count, "Difference value must be greater or equal to end value."); @@ -31,11 +27,6 @@ public static int[] nextInts(final int startInclusive, final int endExclusive, f /** * 随机count个元素 - * - * @param list - * @param count - * @param - * @return */ public static List nextElements(final List list, final int count) { return IntStream @@ -46,10 +37,6 @@ public static List nextElements(final List list, final int count) { /** * 随机一个元素 - * - * @param list - * @param - * @return */ public static T nextElement(final List list) { return list.get(RandomUtils.nextInt(0, list.size())); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java index 590ff04..0eff75b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java @@ -9,13 +9,11 @@ * * @author qiushui on 2020-01-02. */ +@SuppressWarnings("unused") public final class StatisticsAdvice { /** * 最大值 - * - * @param numbers - * @return */ public static double max(Collection numbers) { return numbers @@ -26,9 +24,6 @@ public static double max(Collection numbers) { /** * 最小值 - * - * @param numbers - * @return */ public static double min(Collection numbers) { return numbers @@ -39,9 +34,6 @@ public static double min(Collection numbers) { /** * 平均值 - * - * @param numbers - * @return */ public static double average(Collection numbers) { return numbers @@ -52,9 +44,6 @@ public static double average(Collection numbers) { /** * 方差 - * - * @param numbers - * @return */ public static double variance(Collection numbers) { final double average = average(numbers); @@ -66,9 +55,6 @@ public static double variance(Collection numbers) { /** * 标准差 - * - * @param numbers - * @return */ public static double standardDeviation(Collection numbers) { return Math.sqrt(variance(numbers)); @@ -76,9 +62,6 @@ public static double standardDeviation(Collection numbers) { /** * 中位数 - * - * @param numbers - * @return */ public static double median(Collection numbers) { final List list = numbers diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 80a8193..202766c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -12,13 +12,11 @@ * * @author qiushui on 2018-09-06. */ +@SuppressWarnings("unused") public final class StringAdvice { /** * 判断是null和空 - * - * @param content - * @return */ public static boolean isEmpty(String content) { return content == null || content.isEmpty(); @@ -26,9 +24,6 @@ public static boolean isEmpty(String content) { /** * 判断不是null和空 - * - * @param content - * @return */ public static boolean isNotEmpty(String content) { return content != null && !content.isEmpty(); @@ -36,9 +31,6 @@ public static boolean isNotEmpty(String content) { /** * null的话默认为空字符串 - * - * @param content - * @return */ public static String defaultEmpty(String content) { return content != null ? content : ""; @@ -46,26 +38,25 @@ public static String defaultEmpty(String content) { /** * 空字符串的话默认为默认值 - * - * @param content - * @param defaultValue - * @return */ public static String emptyOr(String content, String defaultValue) { return isEmpty(content) ? defaultValue : content; } + /** + * 头尾添加字符串 + */ + public static String headTail(String content, String sign) { + return sign + content + sign; + } + /** * 从index位置切断字符串 - * - * @param string - * @param index - * @return */ public static TwoValues cutOff(String string, int index) { if (index > string.length() || index < 0) { return null; - } + } return TwoValues.of( string.substring(0, index), string.substring(index) @@ -74,10 +65,6 @@ public static TwoValues cutOff(String string, int index) { /** * 切掉尾部字符串 - * - * @param string - * @param tail - * @return */ public static String cutTail(String string, String tail) { return string.endsWith(tail) ? string.substring(0, string.length() - tail.length()) : string; @@ -85,10 +72,6 @@ public static String cutTail(String string, String tail) { /** * 切掉头部字符串 - * - * @param string - * @param head - * @return */ public static String cutHead(String string, String head) { return string.startsWith(head) ? string.substring(head.length()) : string; @@ -96,10 +79,6 @@ public static String cutHead(String string, String head) { /** * 正则取值 - * - * @param string - * @param regex - * @return */ public static List regexMatch(String string, String regex) { Pattern pattern = Pattern.compile(regex); @@ -113,11 +92,6 @@ public static List regexMatch(String string, String regex) { /** * 正则开头结尾匹配抓取中间字符串值 - * - * @param string - * @param start - * @param end - * @return */ public static List regexMatchStartEnd(String string, String start, String end) { return regexMatch(string, String.format("(?<=%s)(.+?)(?=%s)", start, end)); diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java index f9697c7..f5d805d 100644 --- a/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/DBAdvice.java @@ -9,6 +9,7 @@ /** * @author qiushui on 2019-09-03. */ +@SuppressWarnings("unused") public final class DBAdvice { public static MysqlClient mysql(String domain, String username, String password, String database, Map parameters) throws SQLException { diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java index af11b14..6038c06 100644 --- a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/MysqlClient.java @@ -16,6 +16,7 @@ * * @author qiushui on 2019-09-03. */ +@SuppressWarnings("unused") public class MysqlClient implements AutoCloseable { @Getter @@ -36,12 +37,6 @@ public MysqlClient(MysqlProperties mysqlProperties) throws SQLException { /** * 查询列表 - * - * @param sql - * @param rowMapper - * @param - * @return - * @throws SQLException */ public List query(String sql, RowMapper rowMapper) throws SQLException { return query(sql, null, rowMapper); @@ -49,13 +44,6 @@ public List query(String sql, RowMapper rowMapper) throws SQLException /** * 查询列表 - * - * @param sql - * @param setter - * @param rowMapper - * @param - * @return - * @throws SQLException */ public List query(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { final PreparedStatement statement = connection.prepareStatement(sql); @@ -74,12 +62,6 @@ public List query(String sql, PreparedStatementSetter setter, RowMapper - * @return - * @throws SQLException */ public Optional queryOne(String sql, RowMapper rowMapper) throws SQLException { List list = query(sql, rowMapper); @@ -93,13 +75,6 @@ public Optional queryOne(String sql, RowMapper rowMapper) throws SQLEx /** * 查询单记录 - * - * @param sql - * @param setter - * @param rowMapper - * @param - * @return - * @throws SQLException */ public Optional queryOne(String sql, PreparedStatementSetter setter, RowMapper rowMapper) throws SQLException { List list = query(sql, setter, rowMapper); @@ -140,13 +115,6 @@ public int insertAll(String table, Collection collection, String... field /** * 插入记录 - * - * @param table - * @param data - * @param fields - * @param - * @return - * @throws SQLException */ public int insert(String table, T data, String... fields) throws SQLException { return insertAll(table, List.of(data), fields); @@ -154,11 +122,6 @@ public int insert(String table, T data, String... fields) throws SQLExceptio /** * 执行修改语句 - * - * @param sql - * @param setter - * @return - * @throws SQLException */ public int executeUpdate(String sql, PreparedStatementSetter setter) throws SQLException { try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) { @@ -171,10 +134,6 @@ public int executeUpdate(String sql, PreparedStatementSetter setter) throws SQLE /** * 执行修改语句 - * - * @param sql - * @return - * @throws SQLException */ public int executeUpdate(String sql) throws SQLException { return executeUpdate(sql, null); diff --git a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java index 560455e..21603fa 100644 --- a/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java +++ b/develop-toolkit-db/src/main/java/develop/toolkit/db/mysql/SQLFactory.java @@ -10,9 +10,10 @@ /** * @author qiushui on 2019-09-18. */ +@SuppressWarnings("unused") public class SQLFactory { - private Map sqlMap = new HashMap<>(); + private final Map sqlMap = new HashMap<>(); public SQLFactory(String... sqlFiles) { for (String sqlFile : sqlFiles) { diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java index 9aa46b7..fca2ed3 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/normal/Season.java @@ -12,6 +12,7 @@ * * @author qiushui on 2019-04-28. */ +@SuppressWarnings("unused") public enum Season { SPRING(1), @@ -23,7 +24,7 @@ public enum Season { WINTER(4); @Getter - private int value; + private final int value; Season(int value) { this.value = value; @@ -31,8 +32,6 @@ public enum Season { /** * 日期范围 - * - * @return */ public TwoValues range() { switch (this) { @@ -67,9 +66,6 @@ public TwoValues range() { /** * 这一天是这个季节的第几天 - * - * @param day - * @return */ public int getDayOfSeason(LocalDate day) { if (isDayAt(MonthDay.from(day), this)) { @@ -80,9 +76,6 @@ public int getDayOfSeason(LocalDate day) { /** * 日期落在哪个季节 - * - * @param monthDay - * @return */ public static Season dayAt(MonthDay monthDay) { for (Season season : Season.values()) { @@ -96,10 +89,6 @@ public static Season dayAt(MonthDay monthDay) { /** * 日期是否是某个季节 - * - * @param monthDay - * @param season - * @return */ public static boolean isDayAt(MonthDay monthDay, Season season) { return dayAt(monthDay) == season; @@ -107,9 +96,6 @@ public static boolean isDayAt(MonthDay monthDay, Season season) { /** * 值 - * - * @param value - * @return */ public static Season valueOf(int value) { for (Season season : Season.values()) { diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Account.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Account.java index 62593d3..2637e9a 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Account.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Account.java @@ -9,19 +9,16 @@ * * @author qiushui on 2019-02-26. */ +@SuppressWarnings("unused") public interface Account extends Serializable { /** * 获得账号 - * - * @return */ String getAccount(); /** * 获得密码 - * - * @return */ Password getPassword(); } diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java index 1324a38..85a0cbc 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/IdentificationCard.java @@ -16,6 +16,7 @@ * * @author qiushui on 2019-02-27. */ +@SuppressWarnings("unused") @Getter @Setter @EqualsAndHashCode(of = "card") @@ -55,8 +56,6 @@ public String toString() { /** * 15位身份证 - * - * @return */ public boolean length15() { return card.length() == 15; @@ -64,8 +63,6 @@ public boolean length15() { /** * 18位身份证 - * - * @return */ public boolean length18() { return card.length() == 18; @@ -73,9 +70,6 @@ public boolean length18() { /** * 验证身份证号有效 - * - * @param card - * @return */ public static boolean isValid(String card) { if (card != null && card.matches(Regex.IDENTIFICATION_CARD_RELAXED)) { @@ -90,8 +84,6 @@ public static boolean isValid(String card) { /** * 解析 - * - * @param regionParser */ public void parse(RegionParser regionParser) { if (regionParser != null) { @@ -113,8 +105,6 @@ public void parse(RegionParser regionParser) { /** * 获得年龄 - * - * @return */ public int getAge() { LocalDate now = LocalDate.now(); diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Sex.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Sex.java index 0125b41..3ab2b57 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Sex.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/person/Sex.java @@ -5,6 +5,7 @@ * * @author qiushui on 2019-02-26. */ +@SuppressWarnings("unused") public enum Sex { MALE, FEMALE, UNKNOWN diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/Regex.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/Regex.java index 08e0014..2dc275a 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/Regex.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/Regex.java @@ -5,6 +5,7 @@ * * @author qiushui on 2019-02-26. */ +@SuppressWarnings("unused") public interface Regex { // 不严格的手机号 diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/WorldVerify.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/WorldVerify.java index 4339542..b2bac6c 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/WorldVerify.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/WorldVerify.java @@ -7,13 +7,11 @@ * * @author qiushui on 2019-02-26. */ +@SuppressWarnings("unused") public final class WorldVerify { /** * 不严格验证手机号 - * - * @param mobile - * @return */ public static boolean isMobileRelaxed(String mobile) { return mobile != null && mobile.matches(Regex.MOBILE_RELAXED); @@ -21,9 +19,6 @@ public static boolean isMobileRelaxed(String mobile) { /** * 不严格验证身份证 - * - * @param card - * @return */ public static boolean isIdentificationCardRelaxed(String card) { return card != null && card.matches(Regex.IDENTIFICATION_CARD_RELAXED); @@ -31,9 +26,6 @@ public static boolean isIdentificationCardRelaxed(String card) { /** * 严格验证身份证 - * - * @param card - * @return */ public static boolean isIdentificationCard(String card) { return IdentificationCard.isValid(card); diff --git a/pom.xml b/pom.xml index 8dd4d51..60a5af6 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,18 @@ HEAD + + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-releases/ + + + From 794a7ca87978aa7542a7798864cad3f31dfac759 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 23 Jun 2020 10:21:27 +0800 Subject: [PATCH 059/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pom.xml b/pom.xml index 60a5af6..8dd4d51 100644 --- a/pom.xml +++ b/pom.xml @@ -86,18 +86,6 @@ HEAD - - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-releases/ - - - From f797a9e5ec196153f7c34fff832040495538b62b Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 23 Jun 2020 10:22:19 +0800 Subject: [PATCH 060/178] [maven-release-plugin] prepare release v1.0.3 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 2e0269a..66b1f7a 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.3-SNAPSHOT + 1.0.3 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 7386a3b..643d11a 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.3-SNAPSHOT + 1.0.3 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index a465750..bb09c36 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.3-SNAPSHOT + 1.0.3 4.0.0 diff --git a/pom.xml b/pom.xml index 8dd4d51..0fff1c3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.3-SNAPSHOT + 1.0.3 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.3-SNAPSHOT + 1.0.3 com.github.developframework develop-toolkit-db - 1.0.3-SNAPSHOT + 1.0.3 com.github.developframework develop-toolkit-world - 1.0.3-SNAPSHOT + 1.0.3 org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.3 From d5836a11d1da4decce4c347df5a0de12e391bf31 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 23 Jun 2020 10:22:33 +0800 Subject: [PATCH 061/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 66b1f7a..62dd17e 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.3 + 1.0.4-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 643d11a..9acb61e 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.3 + 1.0.4-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index bb09c36..e212560 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.3 + 1.0.4-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 0fff1c3..2223ec9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.3 + 1.0.4-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -28,17 +28,17 @@ com.github.developframework develop-toolkit-base - 1.0.3 + 1.0.4-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.3 + 1.0.4-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.3 + 1.0.4-SNAPSHOT org.projectlombok @@ -83,7 +83,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.3 + HEAD From d81d657652fabd6b168b9720d8e774a204049aad Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 28 Jun 2020 11:03:46 +0800 Subject: [PATCH 062/178] =?UTF-8?q?=E8=BD=A6=E7=89=8C=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/world/verify/CarPlateVerify.java | 40 +++++++++++++++++++ pom.xml | 12 ++++++ 2 files changed, 52 insertions(+) create mode 100644 develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java new file mode 100644 index 0000000..7ce9ba1 --- /dev/null +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java @@ -0,0 +1,40 @@ +package develop.toolkit.world.verify; + +/** + * 车牌验证 + * + * @author qiushui on 2020-05-12. + */ +public final class CarPlateVerify { + + private static final String PROVINCES = "京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新"; + + private static final String PLATE_CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZ"; + + private static final String PLATE_CHARS_NUMBER = "0123456789"; + + private static final String PLATE_CHARS_OTHER = "学挂"; + + /** + * 参考https://my.oschina.net/chenyoca/blog/1571062 + * + * @param plate + * @return + */ + public static boolean checkValid(String plate) { + String provinceShortName = String.valueOf(plate.charAt(0)); + if (!PROVINCES.contains(provinceShortName)) { + return false; + } + if (plate.length() == 7) { + for (int i = 1; i < 7; i++) { + if (!PLATE_CHARS.contains(String.valueOf(plate.charAt(i)))) { + return false; + } + } + } else if (plate.length() == 8) { + + } + return true; + } +} diff --git a/pom.xml b/pom.xml index 2223ec9..36fbbc6 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,18 @@ HEAD + + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-releases/ + + + From f2de184775cc670cd5f1ec3e1353b3af1a11c57c Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 28 Jun 2020 14:43:14 +0800 Subject: [PATCH 063/178] =?UTF-8?q?=E8=BD=A6=E7=89=8C=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/world/verify/CarPlateVerify.java | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java index 7ce9ba1..ec421cf 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java @@ -7,10 +7,6 @@ */ public final class CarPlateVerify { - private static final String PROVINCES = "京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新"; - - private static final String PLATE_CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZ"; - private static final String PLATE_CHARS_NUMBER = "0123456789"; private static final String PLATE_CHARS_OTHER = "学挂"; @@ -22,19 +18,56 @@ public final class CarPlateVerify { * @return */ public static boolean checkValid(String plate) { + final String PROVINCES = "京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新"; String provinceShortName = String.valueOf(plate.charAt(0)); if (!PROVINCES.contains(provinceShortName)) { return false; } if (plate.length() == 7) { - for (int i = 1; i < 7; i++) { - if (!PLATE_CHARS.contains(String.valueOf(plate.charAt(i)))) { - return false; + return validNormal(plate); + } else if (plate.length() == 8) { + return validNewEnergy(plate); + } else { + return false; + } + } + + /** + * 普通民用车牌 + */ + private static boolean validNormal(String plate) { + final String PLATE_CHARS_ORG = "ABCDEFGHJKLMNPQRSTUVWXY"; + final String PLATE_CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZ0123456789"; + if (PLATE_CHARS_ORG.contains(String.valueOf(plate.charAt(1)))) { + for (int i = 2; i < 7; i++) { + String ch = String.valueOf(plate.charAt(i)); + if (!PLATE_CHARS.contains(ch)) { + return i == 6 && "学挂".contains(ch); } } - } else if (plate.length() == 8) { + return true; + } + return false; + } + /** + * 新能源车牌 + */ + private static boolean validNewEnergy(String plate) { + final String PLATE_CHARS_ORG = "ABCDEFGHJKLMNPQRSTUVWXY"; + if (PLATE_CHARS_ORG.contains(String.valueOf(plate.charAt(1)))) { + if ( + "123456789DF".contains(String.valueOf(plate.charAt(2))) && + "ABCDEFGHJKLMNPQRSTUVWXYZ123456789".contains(String.valueOf(plate.charAt(3))) && + "123456789DF".contains(String.valueOf(plate.charAt(7))) + ) { + for (int i = 4; i < 6; i++) { + if ("0123456789".contains(String.valueOf(plate.charAt(i)))) { + return true; + } + } + } } - return true; + return false; } } From 43737e51b6be325878485431fd877565afbedcf9 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 13 Jul 2020 23:04:35 +0800 Subject: [PATCH 064/178] zip --- .../java/develop/toolkit/base/utils/CollectionAdvice.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 22bdfee..9c22877 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -288,11 +288,11 @@ public static TwoValues, List> partition(Collection collection * 压缩 * 将两个集合的元素按索引捆绑到一起 */ - public static List> zip(List master, List other) { + public static List> zip(List master, List other) { if (master.size() != other.size()) { throw new IllegalArgumentException("list size must be same"); } - List> list = new LinkedList<>(); + List> list = new LinkedList<>(); for (int i = 0; i < master.size(); i++) { list.add(TwoValues.of(master.get(i), other.get(i))); } From 50f33f97d0f7246ec29c05960aaec0f9a209c948 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 15 Jul 2020 18:47:27 +0800 Subject: [PATCH 065/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/HttpAdvice.java | 21 +++++----- .../develop/toolkit/base/utils/IOAdvice.java | 39 ++++++------------- .../toolkit/base/utils/StringAdvice.java | 9 +++++ 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index fcd0371..5bc899e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.net.URI; +import java.net.URLEncoder; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; @@ -102,16 +103,17 @@ public static HttpAdviceResponse delete(String label, HttpClient httpClient, Str /** * 发送x-www-form-urlencoded格式请求 */ - public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, Map form) throws IOException { + public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map form) throws IOException { return send( label, httpClient, httpMethod, - builder(url, headers, parameters).header("Content-Type", "application/x-www-form-urlencoded"), + builder(url, headers, null).header("Content-Type", "application/x-www-form-urlencoded"), form .entrySet() .stream() - .map(kv -> String.format("%s=%s", kv.getKey(), kv.getValue())) + .filter(kv -> kv.getValue() != null) + .map(kv -> String.format("%s=%s", kv.getKey(), URLEncoder.encode(kv.getValue().toString(), StandardCharsets.UTF_8))) .collect(Collectors.joining("&")) ); } @@ -119,12 +121,12 @@ public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient htt /** * 发送json请求 */ - public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, String json) throws IOException { + public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, String httpMethod, String url, Map headers, String json) throws IOException { return send( label, httpClient, httpMethod, - builder(url, headers, parameters).header("Content-Type", "application/json;charset=UTF-8"), + builder(url, headers, null).header("Content-Type", "application/json;charset=UTF-8"), json ); } @@ -132,12 +134,12 @@ public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, S /** * 发送xml请求 */ - public static HttpAdviceResponse sendXml(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map parameters, String xml) throws IOException { + public static HttpAdviceResponse sendXml(String label, HttpClient httpClient, String httpMethod, String url, Map headers, String xml) throws IOException { return send( label, httpClient, httpMethod, - builder(url, headers, parameters).header("Content-Type", "application/xml;charset=UTF-8"), + builder(url, headers, null).header("Content-Type", "application/xml;charset=UTF-8"), xml ); } @@ -147,10 +149,11 @@ private static HttpRequest.Builder builder(String url, Map heade url += parameters .entrySet() .stream() - .map(kv -> String.format("%s=%s", kv.getKey(), kv.getValue())) + .filter(kv -> kv.getValue() != null) + .map(kv -> String.format("%s=%s", kv.getKey(), URLEncoder.encode(kv.getValue().toString(), StandardCharsets.UTF_8))) .collect(Collectors.joining("&", "?", "")); } - HttpRequest.Builder builder = HttpRequest + final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(HttpClient.Version.HTTP_1_1) .uri(URI.create(url)); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index c0e5cb0..ac089ed 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -186,6 +186,13 @@ public static void writeLines(List lines, String filename, Charset chars } } + /** + * 写出文本行到文件 + */ + public static void writeLines(List lines, String filename) { + writeLines(lines, filename, StandardCharsets.UTF_8); + } + /** * 写出文本行 */ @@ -205,9 +212,9 @@ public static void writeLines(List lines, OutputStream outputStream, Cha * 追加文本行 */ public static void appendLines(List lines, String filename, Charset charset) { - try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), charset))) { + try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename, true), charset))) { for (String line : lines) { - writer.append(line); + writer.write(line); writer.newLine(); } writer.flush(); @@ -219,16 +226,8 @@ public static void appendLines(List lines, String filename, Charset char /** * 追加文本行 */ - public static void appendLines(List lines, OutputStream outputStream, Charset charset) { - try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset))) { - for (String line : lines) { - writer.append(line); - writer.newLine(); - } - writer.flush(); - } catch (IOException e) { - throw new RuntimeException(e); - } + public static void appendLines(List lines, String filename) { + appendLines(lines, filename, StandardCharsets.UTF_8); } /** @@ -248,20 +247,6 @@ public static void copyText(InputStream inputStream, OutputStream outputStream, scanner.close(); } - /** - * 复制文件 - */ - public static long copy(InputStream inputStream, OutputStream outputStream) throws IOException { - final byte[] buffer = new byte[4096]; - long count = 0; - int n; - while (-1 != (n = inputStream.read(buffer))) { - outputStream.write(buffer, 0, n); - count += n; - } - return count; - } - /** * 安静地复制文件 */ @@ -271,7 +256,7 @@ public static long copyQuietly(File source, File target) { InputStream inputStream = new FileInputStream(source); OutputStream outputStream = new FileOutputStream(target) ) { - return copy(inputStream, outputStream); + return inputStream.transferTo(outputStream); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 202766c..348e32e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 字符串增强工具 @@ -96,4 +98,11 @@ public static List regexMatch(String string, String regex) { public static List regexMatchStartEnd(String string, String start, String end) { return regexMatch(string, String.format("(?<=%s)(.+?)(?=%s)", start, end)); } + + /** + * 间隔美化 + */ + public static String intervalFormat(String separator, Object... objs) { + return Stream.of(objs).map(Object::toString).collect(Collectors.joining(separator)); + } } From 3480bac784f87f41c00533f37af6ba54b49b6469 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Jul 2020 10:39:58 +0800 Subject: [PATCH 066/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/ArrayAdvice.java | 368 ++++++++++++++++++ .../toolkit/base/utils/CollectionAdvice.java | 18 +- .../toolkit/base/utils/CompareAdvice.java | 25 +- 3 files changed, 408 insertions(+), 3 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java new file mode 100644 index 0000000..76f3887 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -0,0 +1,368 @@ +package develop.toolkit.base.utils; + +import develop.toolkit.base.components.Counter; +import develop.toolkit.base.struct.CollectionInMap; +import develop.toolkit.base.struct.KeyValuePairs; +import develop.toolkit.base.struct.TwoValues; +import org.apache.commons.lang3.ArrayUtils; + +import java.lang.reflect.Array; +import java.util.*; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 数组增强工具 + * + * @author qiushui on 2020-07-17. + */ +@SuppressWarnings("unused") +public final class ArrayAdvice { + + /** + * 检查元素存在 + */ + public static boolean contains(E[] array, Object target, Function function) { + if (array != null) { + for (E item : array) { + Object value = function.apply(item); + if (target == null) { + return value == null; + } else if (target.equals(value)) { + return true; + } + } + } + return false; + } + + /** + * 检查元素存在 + */ + public static boolean contains(E[] array, Object target) { + if (array != null) { + for (E item : array) { + if (target == null) { + return item == null; + } else if (target.equals(item)) { + return true; + } + } + } + return false; + } + + /** + * 获得第一个匹配的元素 + */ + public static Optional getFirstMatch(E[] array, Object target, Function function) { + if (array != null) { + for (E item : array) { + final Object value = function.apply(item); + if (target != null) { + if (target.equals(value)) { + return Optional.ofNullable(item); + } + } else if (value == null) { + return Optional.ofNullable(item); + } + } + } + return Optional.empty(); + } + + /** + * 获得第一个匹配的元素 + */ + public static Optional getFirstMatch(E[] array, Object target) { + if (array != null && target != null) { + for (E item : array) { + if (target.equals(item)) { + return Optional.of(item); + } + } + } + return Optional.empty(); + } + + /** + * 获得第一个判断是true的元素 + */ + public static Optional getFirstTrue(E[] array, Predicate predicate) { + if (array != null) { + for (E item : array) { + if (predicate.test(item)) { + return Optional.ofNullable(item); + } + } + } + return Optional.empty(); + } + + /** + * 获得第一个判断是false的元素 + */ + public static Optional getFirstFalse(E[] array, Predicate predicate) { + if (array != null) { + for (E item : array) { + if (!predicate.test(item)) { + return Optional.ofNullable(item); + } + } + } + return Optional.empty(); + } + + /** + * 获得全部匹配的元素 + */ + public static List getAllMatch(E[] array, Object target, Function function) { + if (array == null) { + return null; + } + return Stream + .of(array) + .filter(item -> { + Object value = function == null ? item : function.apply(item); + if (target == null) { + return value == null; + } else { + return target.equals(value); + } + }) + .collect(Collectors.toList()); + } + + /** + * 全部匹配 + */ + public static boolean allMatch(E[] array, Predicate predicate) { + if (predicate == null || array == null) { + return false; + } + for (E e : array) { + if (!predicate.test(e)) { + return false; + } + } + return true; + } + + /** + * 任意一个匹配 + */ + public static boolean anyMatch(E[] array, Predicate predicate) { + if (array != null && predicate != null) { + for (E e : array) { + if (predicate.test(e)) { + return true; + } + } + } + return false; + } + + /** + * 判断所有元素的处理值相等 + */ + public static boolean allAccept(E[] array, Function function) { + if (array == null || array.length == 0) { + return false; + } + Object targetValue = function == null ? array[0] : function.apply(array[0]); + for (int i = 1, size = array.length; i < size; i++) { + Object itemValue = function == null ? array[i] : function.apply(array[i]); + if ((targetValue != null && !targetValue.equals(itemValue)) || (targetValue == null && itemValue != null)) { + return false; + } + } + return true; + } + + /** + * 分组 + */ + public static CollectionInMap grouping(E[] array, Function keySupplier, Function valueSupplier) { + CollectionInMap map = new CollectionInMap<>(); + for (E item : array) { + map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item)); + } + return map; + } + + public static CollectionInMap grouping(V[] array, Function keySupplier) { + CollectionInMap map = new CollectionInMap<>(); + for (V item : array) { + map.putItemSoft(keySupplier.apply(item), item); + } + return map; + } + + public static Map groupingUniqueKey(V[] array, Function keySupplier) { + Map map = new HashMap<>(); + for (V item : array) { + map.put(keySupplier.apply(item), item); + } + return map; + } + + /** + * 分组求数量 + */ + public static Counter groupingCount(E[] array, Function keySupplier) { + Counter counter = new Counter<>(); + for (E item : array) { + counter.add(keySupplier.apply(item)); + } + return counter; + } + + /** + * 并集 + */ + @SafeVarargs + public static Set union(E[] master, E[]... other) { + Set set = new HashSet<>(Set.of(master)); + for (E[] array : other) { + set.addAll(Set.of(array)); + } + return set; + } + + /** + * 交集 + */ + @SafeVarargs + public static Set intersection(E[] master, E[]... other) { + Set set = new HashSet<>(Set.of(master)); + for (E[] array : other) { + set.removeIf(Predicate.not(item -> contains(array, item))); + } + return set; + } + + /** + * 补集 + */ + public static Set complementary(E[] master, E[] other) { + Set set = new HashSet<>(Set.of(master)); + set.removeIf(item -> contains(other, item)); + return set; + } + + /** + * 合并多数组 + */ + @SuppressWarnings("unchecked") + @SafeVarargs + public static E[] merge(Class clazz, E[]... arrays) { + E[] mergeArray = (E[]) Array.newInstance( + clazz, + Stream.of(arrays).mapToInt(array -> array.length).sum() + ); + int i = 0; + for (E[] array : arrays) { + for (E item : array) { + mergeArray[i++] = item; + } + } + return mergeArray; + } + + /** + * 关联 + * 将集合target按条件与集合master配对 + */ + public static CollectionInMap associate(E[] master, T[] target, BiPredicate predicate) { + CollectionInMap map = new CollectionInMap<>(); + for (E e : master) { + for (T t : target) { + if (predicate.test(e, t)) { + map.putItemSoft(e, t); + } + } + } + return map; + } + + /** + * 关联 (明确是单个的) + * 将集合target按条件与集合master配对 + */ + public static KeyValuePairs associateOne(E[] master, T[] target, BiPredicate predicate) { + final KeyValuePairs keyValuePairs = new KeyValuePairs<>(); + for (E e : master) { + final T matchT = getFirstTrue(target, t -> predicate.test(e, t)).orElse(null); + keyValuePairs.addKeyValue(e, matchT); + } + return keyValuePairs; + } + + /** + * 划分 + * 按条件把集合拆分成满足条件和不满足条件的两个集合 + */ + public static TwoValues, List> partition(E[] collection, Predicate predicate) { + List match = new LinkedList<>(); + List notMatch = new LinkedList<>(); + for (E e : collection) { + if (predicate.test(e)) { + match.add(e); + } else { + notMatch.add(e); + } + } + return TwoValues.of(match, notMatch); + } + + /** + * 压缩 + * 将两个集合的元素按索引捆绑到一起 + */ + public static List> zip(T[] master, S[] other) { + if (master.length != other.length) { + throw new IllegalArgumentException("list size must be same"); + } + List> list = new LinkedList<>(); + for (int i = 0; i < master.length; i++) { + list.add(TwoValues.of(master[i], other[i])); + } + return list; + } + + /** + * 分页处理 + */ + public static void pagingProcess(E[] array, int size, Consumer consumer) { + final int total = array.length; + final int page = total % size == 0 ? (total / size) : (total / size + 1); + for (int i = 0; i < page; i++) { + int fromIndex = i * size; + int toIndex = fromIndex + Math.min(total - fromIndex, size); + E[] subArray = ArrayUtils.subarray(array, fromIndex, toIndex); + consumer.accept(subArray); + } + } + + /** + * 指定排序 + * 把master的元素值按sortTarget的元素值排序,条件按predicate + */ + public static List sort(T[] master, S[] sortTarget, BiPredicate predicate) { + return Stream + .of(sortTarget) + .map(s -> ArrayAdvice.getFirstTrue(master, c -> predicate.test(c, s)).orElse(null)) + .collect(Collectors.toList()); + } + + public static List sort(T[] master, Collection sortTarget, BiPredicate predicate) { + return sortTarget + .stream() + .map(s -> ArrayAdvice.getFirstTrue(master, c -> predicate.test(c, s)).orElse(null)) + .collect(Collectors.toList()); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 9c22877..4761bae 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -19,7 +19,7 @@ public final class CollectionAdvice { /** - * 检查元素 + * 检查元素存在 */ public static boolean contains(Collection collection, Object target, Function function) { if (collection != null) { @@ -35,6 +35,22 @@ public static boolean contains(Collection collection, Object target, Func return false; } + /** + * 检查元素存在 + */ + public static boolean contains(Collection collection, Object target) { + if (collection != null) { + for (E item : collection) { + if (target == null) { + return item == null; + } else if (target.equals(item)) { + return true; + } + } + } + return false; + } + /** * 获得第一个匹配的元素 */ diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java index 3d64a7b..4770692 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java @@ -52,17 +52,38 @@ public static > boolean between(@NonNull T a, @NonNull T return gte(a, start) && lte(a, end); } + /** + * 在之间(左闭区间) + */ + public static > boolean betweenLeft(@NonNull T a, @NonNull T start, @NonNull T end) { + return gte(a, start) && lt(a, end); + } + + /** + * 在之间(右闭区间) + */ + public static > boolean betweenRight(@NonNull T a, @NonNull T start, @NonNull T end) { + return gt(a, start) && lte(a, end); + } + + /** + * 在之间(开区间) + */ + public static > boolean betweenOpen(@NonNull T a, @NonNull T start, @NonNull T end) { + return gt(a, start) && lt(a, end); + } + /** * 返回两者中较大值 */ public static > T max(@NonNull T a, @NonNull T b) { - return gt(a, b) ? a : b; + return gte(a, b) ? a : b; } /** * 返回两者中较小值 */ public static > T min(@NonNull T a, @NonNull T b) { - return lt(a, b) ? a : b; + return lte(a, b) ? a : b; } } From f22498e44c7224a8c7f2c2164d6b67f1c1fd01ec Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Jul 2020 11:18:27 +0800 Subject: [PATCH 067/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/constants/DateFormatConstants.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java index abc598b..80332f8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java @@ -14,9 +14,12 @@ public interface DateFormatConstants { String COMPACT = "yyyyMMddHHmmss"; String DATE = "yyyy-MM-dd"; String TIME = "HH:mm:ss"; - String MYSQL_FORMAT_DATETIME = "%Y-%m-%d %H:%i:%s"; + String MYSQL_FORMAT_DATETIME = "%Y-%m-%d %H:%i:%S"; String MYSQL_FORMAT_DATE = "%Y-%m-%d"; String MYSQL_FORMAT_TIME = "%H:%i:%s"; + String MYSQL_FORMAT_MONTH = "%Y-%m"; DateTimeFormatter STANDARD_FORMATTER = DateTimeFormatter.ofPattern(STANDARD); + DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE); + DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern(TIME); } From b57c45bea519e797d2ecd08b64b65a81def9ff76 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Jul 2020 17:47:05 +0800 Subject: [PATCH 068/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/struct/KeyValuePair.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java index 908f560..1813222 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java @@ -3,6 +3,7 @@ import lombok.*; import java.io.Serializable; +import java.util.Map; /** * 键值对结构体 @@ -40,4 +41,11 @@ public String toString() { public static KeyValuePair of(K key, V value) { return new KeyValuePair<>(key, value); } + + /** + * 从Entry初始化 + */ + public static KeyValuePair of(Map.Entry entry) { + return new KeyValuePair<>(entry.getKey(), entry.getValue()); + } } From 67efaaf986db7f232ddf86fd92e3d7cce781f098 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 22 Jul 2020 17:23:37 +0800 Subject: [PATCH 069/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/develop/toolkit/base/utils/ArrayAdvice.java | 4 +++- .../java/develop/toolkit/base/utils/CollectionAdvice.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index 76f3887..f43042f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -267,7 +267,9 @@ public static E[] merge(Class clazz, E[]... arrays) { int i = 0; for (E[] array : arrays) { for (E item : array) { - mergeArray[i++] = item; + if (item != null) { + mergeArray[i++] = item; + } } } return mergeArray; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 4761bae..3ad29d6 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -249,7 +249,9 @@ public static Set complementary(Collection master, Collection other public static Collection merge(Supplier> supplier, Collection... collections) { Collection collection = supplier.get(); for (Collection coll : collections) { - collection.addAll(coll); + if (coll != null) { + collection.addAll(coll); + } } return collection; } From af6520ea388b61aa661b2b8e1aa35e61757d5632 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 24 Jul 2020 11:08:14 +0800 Subject: [PATCH 070/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/BatchTask.java | 64 +++++++++++++++++++ .../toolkit/base/components/Counter.java | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java new file mode 100644 index 0000000..f061bda --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java @@ -0,0 +1,64 @@ +package develop.toolkit.base.components; + +import develop.toolkit.base.utils.DateTimeAdvice; +import lombok.Getter; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +/** + * 批量任务计时 + * + * @author qiushui on 2020-07-23. + */ +@SuppressWarnings("unused") +public final class BatchTask { + + @Getter + private final int total; + + @Getter + private int current; + + private long sumCostTime; + + private Instant start; + + public BatchTask(int total) { + this.total = total; + } + + /** + * 开始任务 + */ + public void start() { + start = Instant.now(); + current++; + } + + /** + * 完成单次任务 + */ + public String finishOnce(String message) { + if (current > total) { + throw new IllegalStateException("The task have been finished."); + } + long costTime = start.until(Instant.now(), ChronoUnit.MILLIS); + sumCostTime += costTime; + + long avgTime = sumCostTime / current; + LocalDateTime finishTime = LocalDateTime.now().plusSeconds((total - current) * avgTime / 1000); + return String.format( + "%d/%d\t(%02f%%) [cur: %s | avg: %s | sum: %s]\tfinish at: %s - %s", + current, + total, + (float) current / (float) total, + DateTimeAdvice.millisecondPretty(costTime), + DateTimeAdvice.millisecondPretty(avgTime), + DateTimeAdvice.millisecondPretty(sumCostTime), + DateTimeAdvice.format(finishTime), + message + ); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java index 99cdd7d..e7cd391 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/Counter.java @@ -11,7 +11,7 @@ * @author qiushui on 2020-03-25. */ @SuppressWarnings("unused") -public class Counter { +public final class Counter { private final ConcurrentHashMap map = new ConcurrentHashMap<>(); From 9b8bfb9ca5970084e52eca3fa3450c95aa60473a Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 24 Jul 2020 11:09:45 +0800 Subject: [PATCH 071/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/base/components/BatchTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java index f061bda..29030b7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java @@ -53,7 +53,7 @@ public String finishOnce(String message) { "%d/%d\t(%02f%%) [cur: %s | avg: %s | sum: %s]\tfinish at: %s - %s", current, total, - (float) current / (float) total, + (float) current / (float) total * 100, DateTimeAdvice.millisecondPretty(costTime), DateTimeAdvice.millisecondPretty(avgTime), DateTimeAdvice.millisecondPretty(sumCostTime), From ee637bdf29daf09ba73892649a9857ceecd7a2d0 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 24 Jul 2020 11:30:58 +0800 Subject: [PATCH 072/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/BatchTask.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java index 29030b7..916943d 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/BatchTask.java @@ -44,19 +44,21 @@ public String finishOnce(String message) { if (current > total) { throw new IllegalStateException("The task have been finished."); } - long costTime = start.until(Instant.now(), ChronoUnit.MILLIS); + final long costTime = start.until(Instant.now(), ChronoUnit.MILLIS); sumCostTime += costTime; - long avgTime = sumCostTime / current; - LocalDateTime finishTime = LocalDateTime.now().plusSeconds((total - current) * avgTime / 1000); + final long avgTime = sumCostTime / current; + final long surplus = (total - current) * avgTime; + LocalDateTime finishTime = LocalDateTime.now().plusSeconds(surplus / 1000); return String.format( - "%d/%d\t(%02f%%) [cur: %s | avg: %s | sum: %s]\tfinish at: %s - %s", + "%d/%d\t(%.02f%%) [cur: %s | avg: %s | sum: %s | sur: %s]\tfinish at: %s - %s", current, total, (float) current / (float) total * 100, DateTimeAdvice.millisecondPretty(costTime), DateTimeAdvice.millisecondPretty(avgTime), DateTimeAdvice.millisecondPretty(sumCostTime), + DateTimeAdvice.millisecondPretty(surplus), DateTimeAdvice.format(finishTime), message ); From feb465d6417ba615bcf3e4df3722264ab92707de Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 24 Jul 2020 17:36:42 +0800 Subject: [PATCH 073/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/develop/toolkit/base/utils/StringAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 348e32e..8d90b18 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -103,6 +103,6 @@ public static List regexMatchStartEnd(String string, String start, Strin * 间隔美化 */ public static String intervalFormat(String separator, Object... objs) { - return Stream.of(objs).map(Object::toString).collect(Collectors.joining(separator)); + return Stream.of(objs).map(o -> o == null ? "null" : o.toString()).collect(Collectors.joining(separator)); } } From 5fe203c5b2d0020c71fbdd9b590ce0d0a4f8fea3 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 27 Jul 2020 14:11:38 +0800 Subject: [PATCH 074/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/HttpAdvice.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index 5bc899e..d5c7844 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import javax.net.ssl.SSLContext; import java.io.IOException; import java.net.URI; import java.net.URLEncoder; @@ -36,6 +37,22 @@ public static HttpClient defaultHttpClient() { .build(); } + /** + * 带ssl的httpClient + * + * @param sslContext + * @return + */ + public static HttpClient sslHttpClient(SSLContext sslContext) { + return HttpClient + .newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .connectTimeout(Duration.ofSeconds(5L)) + .followRedirects(HttpClient.Redirect.NORMAL) + .sslContext(sslContext) + .build(); + } + /** * 通用请求 */ From e7e3ec96ff5eea27809439b84193f3dfbe57db1d Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 13 Aug 2020 17:42:38 +0800 Subject: [PATCH 075/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/AbstractCollectionInMap.java | 85 +++++++++++++++ .../toolkit/base/struct/CollectionInMap.java | 1 + .../toolkit/base/struct/ListInMap.java | 24 ++++ .../develop/toolkit/base/struct/SetInMap.java | 24 ++++ .../toolkit/base/utils/ArrayAdvice.java | 20 ++-- .../toolkit/base/utils/CollectionAdvice.java | 20 ++-- .../develop/toolkit/base/utils/IOAdvice.java | 103 ++++++++++++------ 7 files changed, 226 insertions(+), 51 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java new file mode 100644 index 0000000..9e09ee0 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java @@ -0,0 +1,85 @@ +package develop.toolkit.base.struct; + +import lombok.NonNull; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Set; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * Map里有集合结构 + * + * @author qiushui on 2020-08-13. + */ +@SuppressWarnings("unused") +public abstract class AbstractCollectionInMap> extends LinkedHashMap { + + private static final long serialVersionUID = 3068493190714636107L; + protected final Supplier supplier; + + public AbstractCollectionInMap(Supplier supplier) { + this.supplier = supplier; + } + + /** + * 追加元素 + * + * @param key map key + * @param item 新元素 + */ + public final void putItem(K key, V item) { + COLLECTION collection = get(key); + if (collection == null) { + collection = supplier.get(); + put(key, collection); + } + collection.add(item); + } + + /** + * 追加元素 + * + * @param key map key + * @param items 新元素 + */ + public final void putAllItem(K key, @NonNull Set items) { + COLLECTION collection = get(key); + if (collection == null) { + collection = supplier.get(); + put(key, collection); + } + collection.addAll(items); + } + + /** + * 删除元素 + * + * @param key map key + * @param item 元素 + */ + public final void removeItem(K key, V item) { + COLLECTION collection = get(key); + if (collection != null) { + collection.remove(item); + } else { + throw new IllegalStateException("key \"" + key + "\" is not exist."); + } + } + + /** + * 根据条件删除元素 + * + * @param key map key + * @param filter 条件 + */ + public final void removeIfItem(K key, @NonNull Predicate filter) { + COLLECTION collection = get(key); + if (collection != null) { + collection.removeIf(filter); + } else { + throw new IllegalStateException("key \"" + key + "\" is not exist."); + } + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java index 7511c8c..f4c0c6b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java @@ -14,6 +14,7 @@ * @author qiushui on 2018-07-09. */ @SuppressWarnings("unused") +@Deprecated public class CollectionInMap extends LinkedHashMap> { private static final long serialVersionUID = 3068493190714636107L; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java new file mode 100644 index 0000000..50a2c03 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java @@ -0,0 +1,24 @@ +package develop.toolkit.base.struct; + +import java.util.LinkedList; +import java.util.List; +import java.util.function.Supplier; + +/** + * Map里有列表结构 + * + * @author qiushui on 2020-08-13. + */ +@SuppressWarnings("unused") +public class ListInMap extends AbstractCollectionInMap> { + + private static final long serialVersionUID = 3068493190714636107L; + + public ListInMap() { + super(LinkedList::new); + } + + public ListInMap(Supplier> supplier) { + super(supplier); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java new file mode 100644 index 0000000..d0b8a68 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java @@ -0,0 +1,24 @@ +package develop.toolkit.base.struct; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Supplier; + +/** + * Map里有集合结构 + * + * @author qiushui on 2020-08-13. + */ +@SuppressWarnings("unused") +public class SetInMap extends AbstractCollectionInMap> { + + private static final long serialVersionUID = 3068493190714636107L; + + public SetInMap() { + super(HashSet::new); + } + + public SetInMap(Supplier> supplier) { + super(supplier); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index f43042f..4fdf15a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -1,8 +1,8 @@ package develop.toolkit.base.utils; import develop.toolkit.base.components.Counter; -import develop.toolkit.base.struct.CollectionInMap; import develop.toolkit.base.struct.KeyValuePairs; +import develop.toolkit.base.struct.ListInMap; import develop.toolkit.base.struct.TwoValues; import org.apache.commons.lang3.ArrayUtils; @@ -186,18 +186,18 @@ public static boolean allAccept(E[] array, Function function) { /** * 分组 */ - public static CollectionInMap grouping(E[] array, Function keySupplier, Function valueSupplier) { - CollectionInMap map = new CollectionInMap<>(); + public static ListInMap grouping(E[] array, Function keySupplier, Function valueSupplier) { + ListInMap map = new ListInMap<>(); for (E item : array) { - map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item)); + map.putItem(keySupplier.apply(item), valueSupplier.apply(item)); } return map; } - public static CollectionInMap grouping(V[] array, Function keySupplier) { - CollectionInMap map = new CollectionInMap<>(); + public static ListInMap grouping(V[] array, Function keySupplier) { + ListInMap map = new ListInMap<>(); for (V item : array) { - map.putItemSoft(keySupplier.apply(item), item); + map.putItem(keySupplier.apply(item), item); } return map; } @@ -279,12 +279,12 @@ public static E[] merge(Class clazz, E[]... arrays) { * 关联 * 将集合target按条件与集合master配对 */ - public static CollectionInMap associate(E[] master, T[] target, BiPredicate predicate) { - CollectionInMap map = new CollectionInMap<>(); + public static ListInMap associate(E[] master, T[] target, BiPredicate predicate) { + ListInMap map = new ListInMap<>(); for (E e : master) { for (T t : target) { if (predicate.test(e, t)) { - map.putItemSoft(e, t); + map.putItem(e, t); } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 3ad29d6..18512c8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -1,8 +1,8 @@ package develop.toolkit.base.utils; import develop.toolkit.base.components.Counter; -import develop.toolkit.base.struct.CollectionInMap; import develop.toolkit.base.struct.KeyValuePairs; +import develop.toolkit.base.struct.ListInMap; import develop.toolkit.base.struct.TwoValues; import java.util.*; @@ -182,15 +182,15 @@ public static boolean allAccept(Collection collection, Function fun /** * 分组 */ - public static CollectionInMap grouping(Collection collection, Function keySupplier, Function valueSupplier) { - CollectionInMap map = new CollectionInMap<>(); - collection.forEach(item -> map.putItemSoft(keySupplier.apply(item), valueSupplier.apply(item))); + public static ListInMap grouping(Collection collection, Function keySupplier, Function valueSupplier) { + ListInMap map = new ListInMap<>(); + collection.forEach(item -> map.putItem(keySupplier.apply(item), valueSupplier.apply(item))); return map; } - public static CollectionInMap grouping(Collection collection, Function keySupplier) { - CollectionInMap map = new CollectionInMap<>(); - collection.forEach(item -> map.putItemSoft(keySupplier.apply(item), item)); + public static ListInMap grouping(Collection collection, Function keySupplier) { + ListInMap map = new ListInMap<>(); + collection.forEach(item -> map.putItem(keySupplier.apply(item), item)); return map; } @@ -260,12 +260,12 @@ public static Collection merge(Supplier> supplier, Collecti * 关联 * 将集合target按条件与集合master配对 */ - public static CollectionInMap associate(Collection master, Collection target, BiPredicate predicate) { - CollectionInMap map = new CollectionInMap<>(); + public static ListInMap associate(Collection master, Collection target, BiPredicate predicate) { + ListInMap map = new ListInMap<>(); for (E e : master) { for (T t : target) { if (predicate.test(e, t)) { - map.putItemSoft(e, t); + map.putItem(e, t); } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index ac089ed..c9c837a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -1,13 +1,16 @@ package develop.toolkit.base.utils; +import develop.toolkit.base.struct.ListInMap; + import java.io.*; +import java.lang.reflect.Constructor; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.LinkedList; import java.util.List; import java.util.Scanner; -import java.util.function.Consumer; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -107,6 +110,72 @@ public static Stream splitFromClasspath(String filename, String regex) return readLinesFromClasspath(filename).map(line -> line.split(regex)); } + /** + * 从classpath读取文件并每行用regex切分,然后装填到实体类 + */ + @SuppressWarnings("unchecked") + public static Stream splitFromClasspath(String filename, String regex, Class clazz) { + List list = splitFromClasspath(filename, regex).collect(Collectors.toList()); + if (list.isEmpty()) { + return Stream.empty(); + } else { + final String[] first = list.get(0); + final Constructor constructor = ArrayAdvice + .getFirstMatch(clazz.getConstructors(), first.length, Constructor::getParameterCount) + .orElseThrow(() -> new IllegalArgumentException("No match constructor for parameter size: " + first.length)); + final Class[] parameterTypes = constructor.getParameterTypes(); + return list + .stream() + .map(objs -> { + try { + final Object[] parameters = new Object[objs.length]; + for (int i = 0; i < objs.length; i++) { + parameters[i] = ObjectAdvice.primitiveTypeCast(objs[i], parameterTypes[i]); + } + return (T) constructor.newInstance(parameters); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + } + + /** + * 从classpath读取文件并每行用regex切分,然后按keyFunction分组 + */ + public static ListInMap splitGroupingFormClasspath(String filename, String regex, Function keyFunction) { + ListInMap map = new ListInMap<>(); + splitFromClasspath(filename, regex).forEach(objs -> map.putItem(keyFunction.apply(objs), objs)); + return map; + } + + /** + * 从classpath读取文件并每行用regex切分,装填到实体类,然后按keyFunction分组 + */ + public static ListInMap splitGroupingFormClasspath(String filename, String regex, Class clazz, Function keyFunction) { + ListInMap map = new ListInMap<>(); + splitFromClasspath(filename, regex, clazz).forEach(t -> map.putItem(keyFunction.apply(t), t)); + return map; + } + + /** + * 从classpath读取文件并每行用regex切分,然后按keyFunction分组 + */ + public static ListInMap splitGroupingFormClasspath(String filename, String regex, Function keyFunction, Function valueFunction) { + ListInMap map = new ListInMap<>(); + splitFromClasspath(filename, regex).forEach(objs -> map.putItem(keyFunction.apply(objs), valueFunction.apply(objs))); + return map; + } + + /** + * 从classpath读取文件并每行用regex切分,装填到实体类,然后按keyFunction分组 + */ + public static ListInMap splitGroupingFormClasspath(String filename, String regex, Class clazz, Function keyFunction, Function valueFunction) { + ListInMap map = new ListInMap<>(); + splitFromClasspath(filename, regex, clazz).forEach(t -> map.putItem(keyFunction.apply(t), valueFunction.apply(t))); + return map; + } + /** * 读取文本 */ @@ -130,7 +199,7 @@ public static String readText(InputStream inputStream) { */ public static String readTextFromClasspath(String filename, Charset charset) { StringBuilder sb = new StringBuilder(); - forEachFromClasspath(filename, charset, line -> sb.append(line.trim())); + readLinesFromClasspath(filename, charset).forEach(line -> sb.append(line.trim())); return sb.toString(); } @@ -139,38 +208,10 @@ public static String readTextFromClasspath(String filename, Charset charset) { */ public static String readTextFromClasspath(String filename) { StringBuilder sb = new StringBuilder(); - forEachFromClasspath(filename, line -> sb.append(line.trim())); + readLinesFromClasspath(filename).forEach(line -> sb.append(line.trim())); return sb.toString(); } - /** - * 文本流按行循环处理 - */ - public static void forEach(InputStream inputStream, Charset charset, Consumer consumer) { - readLines(inputStream, charset).forEach(consumer); - } - - /** - * 文本流按行循环处理 - */ - public static void forEach(InputStream inputStream, Consumer consumer) { - readLines(inputStream).forEach(consumer); - } - - /** - * classpath文本流按行循环处理 - */ - public static void forEachFromClasspath(String filename, Charset charset, Consumer consumer) { - readLinesFromClasspath(filename, charset).forEach(consumer); - } - - /** - * classpath文本流按行循环处理 - */ - public static void forEachFromClasspath(String filename, Consumer consumer) { - readLinesFromClasspath(filename).forEach(consumer); - } - /** * 写出文本行到文件 */ From 8e1499c9c30ce767fe7083ced2b996cc3875c284 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 14 Aug 2020 09:19:50 +0800 Subject: [PATCH 076/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/AbstractCollectionInMap.java | 13 +- .../toolkit/base/struct/CollectionInMap.java | 124 ------------------ 2 files changed, 6 insertions(+), 131 deletions(-) delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java index 9e09ee0..84a1f80 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java @@ -30,12 +30,7 @@ public AbstractCollectionInMap(Supplier supplier) { * @param item 新元素 */ public final void putItem(K key, V item) { - COLLECTION collection = get(key); - if (collection == null) { - collection = supplier.get(); - put(key, collection); - } - collection.add(item); + getInternal(key).add(item); } /** @@ -45,12 +40,16 @@ public final void putItem(K key, V item) { * @param items 新元素 */ public final void putAllItem(K key, @NonNull Set items) { + getInternal(key).addAll(items); + } + + private COLLECTION getInternal(K key) { COLLECTION collection = get(key); if (collection == null) { collection = supplier.get(); put(key, collection); } - collection.addAll(items); + return collection; } /** diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java deleted file mode 100644 index f4c0c6b..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/CollectionInMap.java +++ /dev/null @@ -1,124 +0,0 @@ -package develop.toolkit.base.struct; - -import lombok.NonNull; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.function.Predicate; -import java.util.function.Supplier; - -/** - * Map里有集合结构 - * - * @author qiushui on 2018-07-09. - */ -@SuppressWarnings("unused") -@Deprecated -public class CollectionInMap extends LinkedHashMap> { - - private static final long serialVersionUID = 3068493190714636107L; - private final Supplier> supplier; - - public CollectionInMap() { - this.supplier = LinkedList::new; - } - - public CollectionInMap(Supplier> supplier) { - this.supplier = supplier; - } - - public CollectionInMap(int initialCapacity, Supplier> supplier) { - super(initialCapacity); - this.supplier = supplier; - } - - /** - * 追加元素 - * - * @param key map key - * @param item 新元素 - */ - public void putItem(K key, V item) { - if (containsKey(key)) { - Collection collection = get(key); - collection.add(item); - } else { - throw new IllegalStateException("key \"" + key + "\" is not exist."); - } - } - - /** - * 追加元素 - * @param key map key - * @param items 新元素 - */ - public void putAllItem(K key, @NonNull Collection items) { - if (containsKey(key)) { - Collection collection = get(key); - collection.addAll(items); - } else { - throw new IllegalStateException("key \"" + key + "\" is not exist."); - } - } - - /** - * 软追加元素 - * @param key map key - * @param item 新元素 - */ - public void putItemSoft(K key, V item) { - if (containsKey(key)) { - Collection collection = get(key); - collection.add(item); - } else { - Collection collection = supplier.get(); - collection.add(item); - put(key, collection); - } - } - - /** - * 软追加元素 - * @param key map key - * @param items 新元素 - */ - public void putAllItemSoft(K key, @NonNull Collection items) { - if (containsKey(key)) { - Collection collection = get(key); - collection.addAll(items); - } else { - Collection collection = supplier.get(); - collection.addAll(items); - put(key, collection); - } - } - - /** - * 删除元素 - * @param key map key - * @param item 元素 - */ - public void removeItem(K key, V item) { - if (containsKey(key)) { - Collection collection = get(key); - collection.remove(item); - } else { - throw new IllegalStateException("key \"" + key + "\" is not exist."); - } - } - - /** - * 根据条件删除元素 - * @param key map key - * @param filter 条件 - */ - public void removeIfItem(K key, @NonNull Predicate filter) { - if (containsKey(key)) { - Collection collection = get(key); - collection.removeIf(filter); - } else { - throw new IllegalStateException("key \"" + key + "\" is not exist."); - } - } -} From 7e48c912df536072f7266bdb62b35811b82404a9 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 19 Aug 2020 17:51:17 +0800 Subject: [PATCH 077/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/develop/toolkit/base/utils/RandomAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java index fc73fba..a391746 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RandomAdvice.java @@ -39,6 +39,6 @@ public static List nextElements(final List list, final int count) { * 随机一个元素 */ public static T nextElement(final List list) { - return list.get(RandomUtils.nextInt(0, list.size())); + return list.get(list.size() == 1 ? 0 : RandomUtils.nextInt(0, list.size())); } } From 8a23202576b7a7cd195f7c1008d8a2d2f32afa8a Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 21 Aug 2020 21:18:30 +0800 Subject: [PATCH 078/178] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/AbstractCollectionInMap.java | 1 - .../develop/toolkit/base/struct/KeyValuePair.java | 5 +++++ .../develop/toolkit/base/struct/ListInMap.java | 14 +++++++------- .../java/develop/toolkit/base/struct/SetInMap.java | 2 +- .../develop/toolkit/base/struct/ThreeValues.java | 4 ++++ .../develop/toolkit/base/struct/TwoValues.java | 4 ++++ 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java index 84a1f80..6b19141 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/AbstractCollectionInMap.java @@ -16,7 +16,6 @@ @SuppressWarnings("unused") public abstract class AbstractCollectionInMap> extends LinkedHashMap { - private static final long serialVersionUID = 3068493190714636107L; protected final Supplier supplier; public AbstractCollectionInMap(Supplier supplier) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java index 1813222..df705b4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/KeyValuePair.java @@ -42,10 +42,15 @@ public static KeyValuePair of(K key, V value) { return new KeyValuePair<>(key, value); } + public static KeyValuePair of(T[] objs) { + return new KeyValuePair<>(objs[0], objs[1]); + } + /** * 从Entry初始化 */ public static KeyValuePair of(Map.Entry entry) { return new KeyValuePair<>(entry.getKey(), entry.getValue()); } + } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java index 50a2c03..a86b103 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ListInMap.java @@ -12,13 +12,13 @@ @SuppressWarnings("unused") public class ListInMap extends AbstractCollectionInMap> { - private static final long serialVersionUID = 3068493190714636107L; + private static final long serialVersionUID = -6928970809459612701L; - public ListInMap() { - super(LinkedList::new); - } + public ListInMap() { + super(LinkedList::new); + } - public ListInMap(Supplier> supplier) { - super(supplier); - } + public ListInMap(Supplier> supplier) { + super(supplier); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java index d0b8a68..3183942 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/SetInMap.java @@ -12,7 +12,7 @@ @SuppressWarnings("unused") public class SetInMap extends AbstractCollectionInMap> { - private static final long serialVersionUID = 3068493190714636107L; + private static final long serialVersionUID = 3476351408668231918L; public SetInMap() { super(HashSet::new); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java index 375ff92..66250b3 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java @@ -29,4 +29,8 @@ public class ThreeValues implements Serializable { public static ThreeValues of(T firstValue, S secondValue, U thirdValue) { return new ThreeValues<>(firstValue, secondValue, thirdValue); } + + public static ThreeValues of(T[] objs) { + return new ThreeValues<>(objs[0], objs[1], objs[2]); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java index a02cbe3..b9cf56c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java @@ -27,4 +27,8 @@ public class TwoValues implements Serializable { public static TwoValues of(T firstValue, S secondValue) { return new TwoValues<>(firstValue, secondValue); } + + public static TwoValues of(T[] objs) { + return new TwoValues<>(objs[0], objs[1]); + } } From 30cea302cd1cc6524ff66d9c1c263f8a552a4df4 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 10 Sep 2020 21:48:37 +0800 Subject: [PATCH 079/178] =?UTF-8?q?=E6=96=B0http=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 53 +++++++++ .../base/struct/http/HttpClientReceiver.java | 45 ++++++++ .../base/struct/http/HttpClientSender.java | 107 ++++++++++++++++++ .../toolkit/base/utils/StringAdvice.java | 15 +++ 4 files changed, 220 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java new file mode 100644 index 0000000..32608ce --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -0,0 +1,53 @@ +package develop.toolkit.base.components; + +import develop.toolkit.base.struct.http.HttpClientSender; +import lombok.extern.slf4j.Slf4j; + +import java.net.http.HttpClient; +import java.time.Duration; + +/** + * Http发送助手 + * + * @author qiushui on 2020-09-10. + */ +@Slf4j +public final class HttpClientHelper { + + private final HttpClient httpClient; + + public HttpClientHelper(HttpClient httpClient) { + this.httpClient = httpClient; + } + + public HttpClientHelper(Duration connectTimeout) { + this.httpClient = HttpClient + .newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .connectTimeout(connectTimeout) + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); + } + + public HttpClientHelper() { + this(Duration.ofSeconds(5L)); + } + + public HttpClientSender get(String url) { + return new HttpClientSender(httpClient, "GET", url); + } + + public HttpClientSender post(String url) { + return new HttpClientSender(httpClient, "POST", url); + } + + public HttpClientSender put(String url) { + return new HttpClientSender(httpClient, "PUT", url); + } + + public HttpClientSender delete(String url) { + return new HttpClientSender(httpClient, "DELETE", url); + } + + +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java new file mode 100644 index 0000000..36c6923 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -0,0 +1,45 @@ +package develop.toolkit.base.struct.http; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +/** + * @author qiushui on 2020-09-10. + */ +@Getter +@AllArgsConstructor +public final class HttpClientReceiver { + + private final int httpStatus; + + private final Map> headers; + + private final byte[] body; + + private final long costTime; + + public String stringBody() { + return new String(body, StandardCharsets.UTF_8); + } + + public String getHeader(String header) { + return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb + .append("\nhttp response:\n status: ").append(httpStatus).append("\n headers:\n"); + for (Map.Entry> entry : headers.entrySet()) { + sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); + } + sb.append(" body: ").append(stringBody()); + return sb.toString(); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java new file mode 100644 index 0000000..52fd4df --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -0,0 +1,107 @@ +package develop.toolkit.base.struct.http; + +import lombok.Getter; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.Map; + +/** + * @author qiushui on 2020-09-10. + */ +@Getter +public final class HttpClientSender { + + private final HttpClient httpClient; + + private final String method; + + private final String url; + + private final Map headers = new HashMap<>(); + + private final Map parameters = new HashMap<>(); + + private Duration readTimeout = Duration.ofSeconds(10L); + + private String debugLabel; + + private byte[] body; + + public HttpClientSender(HttpClient httpClient, String method, String url) { + this.httpClient = httpClient; + this.method = method; + this.url = url; + } + + public HttpClientSender header(String header, String value) { + this.headers.put(header, value); + return this; + } + + public HttpClientSender headers(Map headers) { + this.headers.putAll(headers); + return this; + } + + public HttpClientSender parameter(String parameter, String value) { + this.parameters.put(parameter, value); + return this; + } + + public HttpClientSender parameters(Map parameters) { + this.parameters.putAll(parameters); + return this; + } + + public HttpClientSender readTimeout(Duration readTimeout) { + this.readTimeout = readTimeout; + return this; + } + + public HttpClientSender debugLabel(String debugLabel) { + this.debugLabel = debugLabel; + return this; + } + + public HttpClientSender body(byte[] body) { + this.body = body; + return this; + } + + public HttpClientSender body(String body) { + this.body = body.getBytes(StandardCharsets.UTF_8); + return this; + } + + public HttpClientReceiver send() throws IOException, InterruptedException { + final HttpRequest.Builder builder = HttpRequest + .newBuilder() + .version(httpClient.version()) + .uri(URI.create(url)); + final HttpRequest request = builder + .method( + method, + body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofByteArray(body) + ) + .timeout(readTimeout) + .build(); + Instant start = Instant.now(); + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray()); + Instant end = Instant.now(); + return new HttpClientReceiver( + response.statusCode(), + response.headers().map(), + response.body(), + start.until(end, ChronoUnit.MILLIS) + ); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 8d90b18..559e79c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -2,8 +2,11 @@ import develop.toolkit.base.struct.TwoValues; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -105,4 +108,16 @@ public static List regexMatchStartEnd(String string, String start, Strin public static String intervalFormat(String separator, Object... objs) { return Stream.of(objs).map(o -> o == null ? "null" : o.toString()).collect(Collectors.joining(separator)); } + + /** + * 处理成url参数格式 + */ + public static String urlFormat(Map parameters) { + return parameters + .entrySet() + .stream() + .filter(kv -> kv.getValue() != null) + .map(kv -> String.format("%s=%s", kv.getKey(), URLEncoder.encode(kv.getValue().toString(), StandardCharsets.UTF_8))) + .collect(Collectors.joining("&")); + } } From d76f7dd931d16f1d893fe24dc86bb7298d629b1c Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 11 Sep 2020 11:38:10 +0800 Subject: [PATCH 080/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/HttpClientReceiver.java | 17 ++-- .../base/struct/http/HttpClientSender.java | 98 ++++++++++++++----- .../toolkit/base/utils/HttpAdvice.java | 2 +- .../toolkit/base/utils/StringAdvice.java | 7 +- 4 files changed, 92 insertions(+), 32 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java index 36c6923..94c6890 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -1,30 +1,33 @@ package develop.toolkit.base.struct.http; -import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.commons.lang3.StringUtils; -import java.nio.charset.StandardCharsets; +import java.net.http.HttpResponse; import java.util.List; import java.util.Map; /** + * Http接收器 + * * @author qiushui on 2020-09-10. */ @Getter -@AllArgsConstructor -public final class HttpClientReceiver { +public final class HttpClientReceiver { private final int httpStatus; private final Map> headers; - private final byte[] body; + private final T body; private final long costTime; - public String stringBody() { - return new String(body, StandardCharsets.UTF_8); + public HttpClientReceiver(HttpResponse httpResponse, long costTime) { + this.httpStatus = httpResponse.statusCode(); + this.headers = httpResponse.headers().map(); + this.costTime = costTime; + this.body = httpResponse.body(); } public String getHeader(String header) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 52fd4df..75d39e7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -1,13 +1,15 @@ package develop.toolkit.base.struct.http; +import develop.toolkit.base.utils.StringAdvice; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -15,8 +17,11 @@ import java.util.Map; /** + * Http发送器 + * * @author qiushui on 2020-09-10. */ +@Slf4j @Getter public final class HttpClientSender { @@ -28,13 +33,13 @@ public final class HttpClientSender { private final Map headers = new HashMap<>(); - private final Map parameters = new HashMap<>(); + private final Map parameters = new HashMap<>(); private Duration readTimeout = Duration.ofSeconds(10L); private String debugLabel; - private byte[] body; + private Object body; public HttpClientSender(HttpClient httpClient, String method, String url) { this.httpClient = httpClient; @@ -72,36 +77,85 @@ public HttpClientSender debugLabel(String debugLabel) { return this; } - public HttpClientSender body(byte[] body) { - this.body = body; + public HttpClientSender bodyJson(String json) { + headers.put("Content-Type", "application/json;charset=utf-8"); + this.body = json; return this; } - public HttpClientSender body(String body) { - this.body = body.getBytes(StandardCharsets.UTF_8); + public HttpClientSender bodyXml(String xml) { + headers.put("Content-Type", "application/xml;charset=utf-8"); + this.body = xml; return this; } - public HttpClientReceiver send() throws IOException, InterruptedException { + public HttpClientSender bodyBytes(byte[] bytes) { + this.body = bytes; + return this; + } + + public HttpClientReceiver send(HttpResponse.BodyHandler bodyHandler) throws IOException { + return send(bodyPublisher(body), bodyHandler); + } + + public HttpClientReceiver send(HttpRequest.BodyPublisher bodyPublisher, HttpResponse.BodyHandler bodyHandler) throws IOException { final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(httpClient.version()) - .uri(URI.create(url)); + .uri(URI.create(url + StringAdvice.urlParametersFormat(parameters, true))); + headers.forEach(builder::header); final HttpRequest request = builder - .method( - method, - body == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofByteArray(body) - ) + .method(method, bodyPublisher) .timeout(readTimeout) .build(); - Instant start = Instant.now(); - HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray()); - Instant end = Instant.now(); - return new HttpClientReceiver( - response.statusCode(), - response.headers().map(), - response.body(), - start.until(end, ChronoUnit.MILLIS) - ); + HttpClientReceiver receiver = null; + try { + Instant start = Instant.now(); + HttpResponse response = httpClient.send(request, bodyHandler); + Instant end = Instant.now(); + receiver = new HttpClientReceiver<>(response, start.until(end, ChronoUnit.MILLIS)); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + if (log.isDebugEnabled()) { + String content; + if (body == null) { + content = "(No content)"; + } else if (body instanceof String) { + content = (String) body; + } else if (body.getClass().isArray()) { + content = "(Bytes data)"; + } else { + content = "(Unknown data)"; + } + StringBuilder sb = new StringBuilder(); + sb + .append("\nlabel: ").append(debugLabel == null ? "(未定义)" : debugLabel) + .append("\nhttp request:\n url: ") + .append(request.uri().toString()).append("\n headers:\n"); + request + .headers() + .map() + .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); + sb.append(" body: ").append(content).append("\n"); + if (receiver != null) { + sb.append(receiver.toString()); + } + log.debug(sb.toString()); + } + } + return receiver; + } + + private HttpRequest.BodyPublisher bodyPublisher(Object body) { + if (body == null) { + return HttpRequest.BodyPublishers.noBody(); + } else if (body instanceof String) { + return HttpRequest.BodyPublishers.ofString((String) body); + } else if (body.getClass().isArray()) { + return HttpRequest.BodyPublishers.ofByteArray((byte[]) body); + } else { + throw new AssertionError(); + } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index d5c7844..c407992 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -189,7 +189,7 @@ private static HttpAdviceResponse send(String label, HttpClient httpClient, Stri httpMethod, content == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(content, StandardCharsets.UTF_8) ) - .timeout(Duration.ofSeconds(10L)) + .timeout(Duration.ofMinutes(5L)) .build(); Instant start = Instant.now(); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 559e79c..1ab7f9a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -112,8 +112,11 @@ public static String intervalFormat(String separator, Object... objs) { /** * 处理成url参数格式 */ - public static String urlFormat(Map parameters) { - return parameters + public static String urlParametersFormat(Map parameters, boolean needQuestionMark) { + if (parameters.isEmpty()) { + return ""; + } + return (needQuestionMark ? "?" : "") + parameters .entrySet() .stream() .filter(kv -> kv.getValue() != null) From a4bdc795a8f290248ea0f4591d3231d258af4c7f Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 11 Sep 2020 21:57:13 +0800 Subject: [PATCH 081/178] =?UTF-8?q?=E6=96=B0http=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-base/pom.xml | 5 ++ .../base/components/HttpClientHelper.java | 2 - .../http/AbstractStringSenderHandler.java | 20 +++++ .../base/struct/http/HttpClientReceiver.java | 22 +---- .../base/struct/http/HttpClientSender.java | 87 ++++++++++--------- .../base/struct/http/JacksonHandler.java | 34 ++++++++ .../base/struct/http/SenderHandler.java | 16 ++++ .../base/struct/http/SimpleSenderHandler.java | 12 +++ .../src/main/java/module-info.java | 3 + pom.xml | 6 ++ 10 files changed, 145 insertions(+), 62 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 62dd17e..ba9aa04 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -24,5 +24,10 @@ com.github.developframework expression + + com.fasterxml.jackson.core + jackson-databind + true + \ No newline at end of file diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 32608ce..6503f74 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -48,6 +48,4 @@ public HttpClientSender put(String url) { public HttpClientSender delete(String url) { return new HttpClientSender(httpClient, "DELETE", url); } - - } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java new file mode 100644 index 0000000..2f19e8d --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java @@ -0,0 +1,20 @@ +package develop.toolkit.base.struct.http; + +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +/** + * @author qiushui on 2020-09-11. + */ +public abstract class AbstractStringSenderHandler implements SenderHandler { + + @Override + public HttpRequest.BodyPublisher bodyPublisher(Object requestBody) { + return HttpRequest.BodyPublishers.ofString((String) requestBody); + } + + @Override + public HttpResponse.BodyHandler bodyHandler() { + return HttpResponse.BodyHandlers.ofString(); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java index 94c6890..40bb7ac 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -1,9 +1,9 @@ package develop.toolkit.base.struct.http; +import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.commons.lang3.StringUtils; -import java.net.http.HttpResponse; import java.util.List; import java.util.Map; @@ -13,6 +13,7 @@ * @author qiushui on 2020-09-10. */ @Getter +@AllArgsConstructor public final class HttpClientReceiver { private final int httpStatus; @@ -23,26 +24,7 @@ public final class HttpClientReceiver { private final long costTime; - public HttpClientReceiver(HttpResponse httpResponse, long costTime) { - this.httpStatus = httpResponse.statusCode(); - this.headers = httpResponse.headers().map(); - this.costTime = costTime; - this.body = httpResponse.body(); - } - public String getHeader(String header) { return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb - .append("\nhttp response:\n status: ").append(httpStatus).append("\n headers:\n"); - for (Map.Entry> entry : headers.entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); - } - sb.append(" body: ").append(stringBody()); - return sb.toString(); - } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 75d39e7..9035b7d 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -14,6 +14,7 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -39,7 +40,7 @@ public final class HttpClientSender { private String debugLabel; - private Object body; + private Object requestBody; public HttpClientSender(HttpClient httpClient, String method, String url) { this.httpClient = httpClient; @@ -79,83 +80,89 @@ public HttpClientSender debugLabel(String debugLabel) { public HttpClientSender bodyJson(String json) { headers.put("Content-Type", "application/json;charset=utf-8"); - this.body = json; + this.requestBody = json; return this; } public HttpClientSender bodyXml(String xml) { headers.put("Content-Type", "application/xml;charset=utf-8"); - this.body = xml; + this.requestBody = xml; return this; } public HttpClientSender bodyBytes(byte[] bytes) { - this.body = bytes; + this.requestBody = bytes; return this; } - public HttpClientReceiver send(HttpResponse.BodyHandler bodyHandler) throws IOException { - return send(bodyPublisher(body), bodyHandler); + public HttpClientReceiver send() throws IOException { + return send(new SimpleSenderHandler()); } - public HttpClientReceiver send(HttpRequest.BodyPublisher bodyPublisher, HttpResponse.BodyHandler bodyHandler) throws IOException { + public HttpClientReceiver send(SenderHandler senderHandler) throws IOException { final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(httpClient.version()) .uri(URI.create(url + StringAdvice.urlParametersFormat(parameters, true))); headers.forEach(builder::header); final HttpRequest request = builder - .method(method, bodyPublisher) + .method(method, senderHandler.bodyPublisher(requestBody)) .timeout(readTimeout) .build(); - HttpClientReceiver receiver = null; + HttpClientReceiver receiver = null; + BODY responseBody = null; try { Instant start = Instant.now(); - HttpResponse response = httpClient.send(request, bodyHandler); + HttpResponse response = httpClient.send(request, senderHandler.bodyHandler()); Instant end = Instant.now(); - receiver = new HttpClientReceiver<>(response, start.until(end, ChronoUnit.MILLIS)); + responseBody = response.body(); + receiver = new HttpClientReceiver<>( + response.statusCode(), + response.headers().map(), + senderHandler.convert(responseBody), + start.until(end, ChronoUnit.MILLIS) + ); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { if (log.isDebugEnabled()) { - String content; - if (body == null) { - content = "(No content)"; - } else if (body instanceof String) { - content = (String) body; - } else if (body.getClass().isArray()) { - content = "(Bytes data)"; - } else { - content = "(Unknown data)"; - } - StringBuilder sb = new StringBuilder(); - sb - .append("\nlabel: ").append(debugLabel == null ? "(未定义)" : debugLabel) - .append("\nhttp request:\n url: ") - .append(request.uri().toString()).append("\n headers:\n"); - request - .headers() - .map() - .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); - sb.append(" body: ").append(content).append("\n"); - if (receiver != null) { - sb.append(receiver.toString()); - } - log.debug(sb.toString()); + printDebug(request, receiver, responseBody); } } return receiver; } - private HttpRequest.BodyPublisher bodyPublisher(Object body) { + private String printBody(Object body) { if (body == null) { - return HttpRequest.BodyPublishers.noBody(); + return "(No content)"; } else if (body instanceof String) { - return HttpRequest.BodyPublishers.ofString((String) body); + return (String) body; } else if (body.getClass().isArray()) { - return HttpRequest.BodyPublishers.ofByteArray((byte[]) body); + return "(Bytes data)"; } else { - throw new AssertionError(); + return "(Unknown data)"; } } + + private void printDebug(HttpRequest request, HttpClientReceiver receiver, Object responseBody) { + StringBuilder sb = new StringBuilder(); + sb + .append("\nlabel: ").append(debugLabel == null ? "(未定义)" : debugLabel) + .append("\nhttp request:\n url: ") + .append(request.uri().toString()).append("\n headers:\n"); + request + .headers() + .map() + .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); + sb.append(" body: ").append(printBody(requestBody)).append("\n"); + if (receiver != null) { + sb + .append("\nhttp response:\n status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); + for (Map.Entry> entry : receiver.getHeaders().entrySet()) { + sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); + } + sb.append(" body: ").append(printBody(responseBody)); + } + log.debug(sb.toString()); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java new file mode 100644 index 0000000..0e2c9d0 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java @@ -0,0 +1,34 @@ +package develop.toolkit.base.struct.http; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AllArgsConstructor; + +import java.util.Collection; + +/** + * @author qiushui on 2020-09-11. + */ +@AllArgsConstructor +public class JacksonHandler extends AbstractStringSenderHandler { + + private final ObjectMapper objectMapper; + + private final Class clazz; + + private final Class type; + + @Override + public T convert(String json) { + try { + if (type == null) { + return objectMapper.readValue(json, clazz); + } else if (Collection.class.isAssignableFrom(type)) { + objectMapper.getTypeFactory().constructCollectionType(type, clazz) + } + + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java new file mode 100644 index 0000000..27b7b5f --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java @@ -0,0 +1,16 @@ +package develop.toolkit.base.struct.http; + +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +/** + * @author qiushui on 2020-09-11. + */ +public interface SenderHandler { + + HttpRequest.BodyPublisher bodyPublisher(Object requestBody); + + HttpResponse.BodyHandler bodyHandler(); + + E convert(BODY body); +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java new file mode 100644 index 0000000..71dce5f --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java @@ -0,0 +1,12 @@ +package develop.toolkit.base.struct.http; + +/** + * @author qiushui on 2020-09-11. + */ +public final class SimpleSenderHandler extends AbstractStringSenderHandler { + + @Override + public String convert(String body) { + return body; + } +} diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index 98bfb35..b3da22f 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -6,10 +6,13 @@ requires org.slf4j; requires org.apache.commons.lang3; requires java.net.http; + requires com.fasterxml.jackson.databind; exports develop.toolkit.base.components; exports develop.toolkit.base.constants; exports develop.toolkit.base.exception; exports develop.toolkit.base.struct; + exports develop.toolkit.base.struct.http; + exports develop.toolkit.base.struct.range; exports develop.toolkit.base.utils; } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 36fbbc6..3b5944b 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ 1.18.12 1.7.30 1.5.0 + 2.10.2 @@ -55,6 +56,11 @@ expression ${version.expression} + + com.fasterxml.jackson.core + jackson-databind + ${version.jackson} + From 744b9d33041f1fc103c341bdfcdadac0d5b22747 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 13 Sep 2020 22:07:10 +0800 Subject: [PATCH 082/178] =?UTF-8?q?=E6=96=B0http=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/HttpClientReceiver.java | 4 +++ .../base/struct/http/HttpClientSender.java | 9 ++++- .../base/struct/http/JacksonHandler.java | 34 ------------------- 3 files changed, 12 insertions(+), 35 deletions(-) delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java index 40bb7ac..c275655 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -27,4 +27,8 @@ public final class HttpClientReceiver { public String getHeader(String header) { return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); } + + public boolean isSuccess() { + return httpStatus >= 200 && httpStatus < 300; + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 9035b7d..afeed77 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -42,6 +42,8 @@ public final class HttpClientSender { private Object requestBody; + private boolean onlyPrintFailed; + public HttpClientSender(HttpClient httpClient, String method, String url) { this.httpClient = httpClient; this.method = method; @@ -78,6 +80,11 @@ public HttpClientSender debugLabel(String debugLabel) { return this; } + public HttpClientSender onlyPrintFailed(boolean onlyPrintFailed) { + this.onlyPrintFailed = onlyPrintFailed; + return this; + } + public HttpClientSender bodyJson(String json) { headers.put("Content-Type", "application/json;charset=utf-8"); this.requestBody = json; @@ -125,7 +132,7 @@ public HttpClientReceiver send(SenderHandler senderHandler } catch (InterruptedException e) { throw new RuntimeException(e); } finally { - if (log.isDebugEnabled()) { + if (log.isDebugEnabled() && (!onlyPrintFailed || receiver == null || !receiver.isSuccess())) { printDebug(request, receiver, responseBody); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java deleted file mode 100644 index 0e2c9d0..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/JacksonHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package develop.toolkit.base.struct.http; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.AllArgsConstructor; - -import java.util.Collection; - -/** - * @author qiushui on 2020-09-11. - */ -@AllArgsConstructor -public class JacksonHandler extends AbstractStringSenderHandler { - - private final ObjectMapper objectMapper; - - private final Class clazz; - - private final Class type; - - @Override - public T convert(String json) { - try { - if (type == null) { - return objectMapper.readValue(json, clazz); - } else if (Collection.class.isAssignableFrom(type)) { - objectMapper.getTypeFactory().constructCollectionType(type, clazz) - } - - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } -} From 10c21e7acebef15cb9efc09e5f1d05a0e0e8a9e1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 14 Sep 2020 18:37:54 +0800 Subject: [PATCH 083/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/AbstractStringSenderHandler.java | 20 -- .../base/struct/http/HttpClientReceiver.java | 24 +++ .../base/struct/http/HttpClientSender.java | 61 ++++-- .../toolkit/base/struct/http/HttpContent.java | 13 ++ .../struct/http/MultiPartBodyPublisher.java | 186 ++++++++++++++++++ .../base/struct/http/SenderHandler.java | 9 +- .../base/struct/http/SimpleSenderHandler.java | 12 -- .../struct/http/StringBodySenderHandler.java | 14 ++ 8 files changed, 289 insertions(+), 50 deletions(-) delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java deleted file mode 100644 index 2f19e8d..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/AbstractStringSenderHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package develop.toolkit.base.struct.http; - -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; - -/** - * @author qiushui on 2020-09-11. - */ -public abstract class AbstractStringSenderHandler implements SenderHandler { - - @Override - public HttpRequest.BodyPublisher bodyPublisher(Object requestBody) { - return HttpRequest.BodyPublishers.ofString((String) requestBody); - } - - @Override - public HttpResponse.BodyHandler bodyHandler() { - return HttpResponse.BodyHandlers.ofString(); - } -} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java index c275655..e6028be 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -1,9 +1,15 @@ package develop.toolkit.base.struct.http; +import develop.toolkit.base.utils.IOAdvice; import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.OpenOption; +import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -31,4 +37,22 @@ public String getHeader(String header) { public boolean isSuccess() { return httpStatus >= 200 && httpStatus < 300; } + + public void save(Path path, OpenOption... openOptions) { + byte[] data; + if (body instanceof InputStream) { + data = IOAdvice.toByteArray((InputStream) body); + } else if (body.getClass().isArray()) { + data = (byte[]) body; + } else if (body instanceof String) { + data = ((String) body).getBytes(); + } else { + throw new IllegalArgumentException(); + } + try { + Files.write(path, data, openOptions); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index afeed77..b2e87ea 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -1,5 +1,6 @@ package develop.toolkit.base.struct.http; +import develop.toolkit.base.utils.DateTimeAdvice; import develop.toolkit.base.utils.StringAdvice; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -10,12 +11,15 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.nio.file.OpenOption; +import java.nio.file.Path; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; /** * Http发送器 @@ -102,21 +106,48 @@ public HttpClientSender bodyBytes(byte[] bytes) { return this; } + public void download(Path path, OpenOption... openOptions) throws IOException { + send(HttpResponse.BodyHandlers::ofByteArray).save(path, openOptions); + } + + public void downloadQuietly(Path path, OpenOption... openOptions) { + sendQuietly(HttpResponse.BodyHandlers::ofByteArray) + .ifPresent(receiver -> receiver.save(path, openOptions)); + } + public HttpClientReceiver send() throws IOException { - return send(new SimpleSenderHandler()); + return send(new StringBodySenderHandler()); + } + + public Optional> sendQuietly() { + try { + return Optional.of(send(new StringBodySenderHandler())); + } catch (IOException e) { + e.printStackTrace(); + return Optional.empty(); + } + } + + public Optional> sendQuietly(SenderHandler senderHandler) { + try { + return Optional.of(send(senderHandler)); + } catch (IOException e) { + e.printStackTrace(); + return Optional.empty(); + } } - public HttpClientReceiver send(SenderHandler senderHandler) throws IOException { + public HttpClientReceiver send(SenderHandler senderHandler) throws IOException { final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(httpClient.version()) .uri(URI.create(url + StringAdvice.urlParametersFormat(parameters, true))); headers.forEach(builder::header); final HttpRequest request = builder - .method(method, senderHandler.bodyPublisher(requestBody)) + .method(method, requestBody == null ? HttpRequest.BodyPublishers.noBody() : senderHandler.bodyPublisher(requestBody)) .timeout(readTimeout) .build(); - HttpClientReceiver receiver = null; + HttpClientReceiver receiver = null; BODY responseBody = null; try { Instant start = Instant.now(); @@ -126,7 +157,7 @@ public HttpClientReceiver send(SenderHandler senderHandler receiver = new HttpClientReceiver<>( response.statusCode(), response.headers().map(), - senderHandler.convert(responseBody), + responseBody, start.until(end, ChronoUnit.MILLIS) ); } catch (InterruptedException e) { @@ -152,24 +183,26 @@ private String printBody(Object body) { } private void printDebug(HttpRequest request, HttpClientReceiver receiver, Object responseBody) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder("\n=========================================================================================================\n"); sb - .append("\nlabel: ").append(debugLabel == null ? "(未定义)" : debugLabel) - .append("\nhttp request:\n url: ") - .append(request.uri().toString()).append("\n headers:\n"); + .append("\nlabel: ").append(debugLabel == null ? "(Undefined)" : debugLabel) + .append("\nhttp request:\n url: ") + .append(request.uri().toString()).append("\n headers:\n"); request .headers() .map() - .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); - sb.append(" body: ").append(printBody(requestBody)).append("\n"); + .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); + sb.append(" body: ").append(printBody(requestBody)).append("\n"); if (receiver != null) { sb - .append("\nhttp response:\n status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); + .append("\nhttp response:\n status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); for (Map.Entry> entry : receiver.getHeaders().entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); + sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } - sb.append(" body: ").append(printBody(responseBody)); + sb.append(" cost: ").append(DateTimeAdvice.millisecondPretty(receiver.getCostTime())).append("\n"); + sb.append(" body: ").append(printBody(responseBody)); } + sb.append("\n\n=========================================================================================================\n"); log.debug(sb.toString()); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java new file mode 100644 index 0000000..534bc84 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java @@ -0,0 +1,13 @@ +package develop.toolkit.base.struct.http; + +/** + * @author qiushui on 2020-09-14. + */ +public enum HttpContent { + + URL, + + HEADERS, + + BODY +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java new file mode 100644 index 0000000..c3f0d7c --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java @@ -0,0 +1,186 @@ +package develop.toolkit.base.struct.http; + +import lombok.Getter; +import org.apache.commons.lang3.RandomStringUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.net.http.HttpRequest; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.function.Supplier; + +/** + * @author qiushui on 2020-09-14. + */ +public class MultiPartBodyPublisher { + + private final List partsSpecificationList = new ArrayList<>(); + + @Getter + private final String boundary = RandomStringUtils.randomAlphabetic(10); + + public HttpRequest.BodyPublisher build() { + if (partsSpecificationList.isEmpty()) { + throw new IllegalStateException("Must have at least one part to build multipart message."); + } + addFinalBoundaryPart(); + return HttpRequest.BodyPublishers.ofByteArrays(PartsIterator::new); + } + + public MultiPartBodyPublisher addPart(String name, String value) { + PartsSpecification newPart = new PartsSpecification(); + newPart.type = PartsSpecification.Type.STRING; + newPart.name = name; + newPart.value = value; + partsSpecificationList.add(newPart); + return this; + } + + public MultiPartBodyPublisher addPart(String name, Path path) { + PartsSpecification newPart = new PartsSpecification(); + newPart.type = PartsSpecification.Type.FILE; + newPart.name = name; + newPart.path = path; + partsSpecificationList.add(newPart); + return this; + } + + public MultiPartBodyPublisher addPart(String name, byte[] bytes) { + PartsSpecification newPart = new PartsSpecification(); + newPart.type = PartsSpecification.Type.FILE; + newPart.name = name; + newPart.bytes = bytes; + partsSpecificationList.add(newPart); + return this; + } + + public MultiPartBodyPublisher addPart(String name, String filename, String contentType, Supplier stream) { + PartsSpecification newPart = new PartsSpecification(); + newPart.type = PartsSpecification.Type.STREAM; + newPart.name = name; + newPart.stream = stream; + newPart.filename = filename; + newPart.contentType = contentType; + partsSpecificationList.add(newPart); + return this; + } + + private void addFinalBoundaryPart() { + PartsSpecification newPart = new PartsSpecification(); + newPart.type = PartsSpecification.Type.FINAL_BOUNDARY; + newPart.value = "--" + boundary + "--"; + partsSpecificationList.add(newPart); + } + + static class PartsSpecification { + + public enum Type { + STRING, FILE, BYTES, STREAM, FINAL_BOUNDARY + } + + public Type type; + public String name; + public String value; + public Path path; + public byte[] bytes; + public Supplier stream; + public String filename; + public String contentType; + + } + + class PartsIterator implements Iterator { + + private final Iterator iterator = partsSpecificationList.iterator(); + private InputStream currentFileInput; + + private boolean done; + private byte[] next; + + @Override + public boolean hasNext() { + if (done) return false; + if (next != null) return true; + try { + next = computeNext(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + if (next == null) { + done = true; + return false; + } + return true; + } + + @Override + public byte[] next() { + if (!hasNext()) throw new NoSuchElementException(); + byte[] res = next; + next = null; + return res; + } + + private byte[] computeNext() throws IOException { + if (currentFileInput == null) { + if (!iterator.hasNext()) return null; + PartsSpecification nextPart = iterator.next(); + String filename = null; + String contentType = "application/octet-stream"; + switch (nextPart.type) { + case STRING: { + String part = + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=" + nextPart.name + "\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n\r\n" + + nextPart.value + "\r\n"; + return part.getBytes(StandardCharsets.UTF_8); + } + case FINAL_BOUNDARY: { + return nextPart.value.getBytes(StandardCharsets.UTF_8); + } + case BYTES: { + return nextPart.bytes; + } + case FILE: { + Path path = nextPart.path; + filename = path.getFileName().toString(); + contentType = Files.probeContentType(path); + currentFileInput = Files.newInputStream(path); + } + break; + case STREAM: { + filename = nextPart.filename; + contentType = nextPart.contentType; + currentFileInput = nextPart.stream.get(); + } + break; + } + String partHeader = + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=" + nextPart.name + "; filename=" + filename + "\r\n" + + "Content-Type: " + contentType + "\r\n\r\n"; + return partHeader.getBytes(StandardCharsets.UTF_8); + } else { + byte[] buf = new byte[8192]; + int r = currentFileInput.read(buf); + if (r > 0) { + byte[] actualBytes = new byte[r]; + System.arraycopy(buf, 0, actualBytes, 0, r); + return actualBytes; + } else { + currentFileInput.close(); + currentFileInput = null; + return "\r\n".getBytes(); + } + } + } + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java index 27b7b5f..400ae49 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java @@ -6,11 +6,12 @@ /** * @author qiushui on 2020-09-11. */ -public interface SenderHandler { +@FunctionalInterface +public interface SenderHandler { - HttpRequest.BodyPublisher bodyPublisher(Object requestBody); + default HttpRequest.BodyPublisher bodyPublisher(Object requestBody) { + return HttpRequest.BodyPublishers.ofString((String) requestBody); + } HttpResponse.BodyHandler bodyHandler(); - - E convert(BODY body); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java deleted file mode 100644 index 71dce5f..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SimpleSenderHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package develop.toolkit.base.struct.http; - -/** - * @author qiushui on 2020-09-11. - */ -public final class SimpleSenderHandler extends AbstractStringSenderHandler { - - @Override - public String convert(String body) { - return body; - } -} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java new file mode 100644 index 0000000..f4f74c0 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java @@ -0,0 +1,14 @@ +package develop.toolkit.base.struct.http; + +import java.net.http.HttpResponse; + +/** + * @author qiushui on 2020-09-11. + */ +public class StringBodySenderHandler implements SenderHandler { + + @Override + public HttpResponse.BodyHandler bodyHandler() { + return HttpResponse.BodyHandlers.ofString(); + } +} From 9a674b0675f773aa5d7e2c71b60a841395825b47 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 15 Sep 2020 17:37:03 +0800 Subject: [PATCH 084/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/FormUrlencodedBody.java | 31 +++++++++++++ .../base/struct/http/HttpClientSender.java | 22 +++++++--- ...lisher.java => MultiPartFormDataBody.java} | 43 +++++++++++-------- .../base/struct/http/SenderHandler.java | 10 ++++- 4 files changed, 81 insertions(+), 25 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java rename develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/{MultiPartBodyPublisher.java => MultiPartFormDataBody.java} (79%) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java new file mode 100644 index 0000000..1a7d7ca --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java @@ -0,0 +1,31 @@ +package develop.toolkit.base.struct.http; + +import develop.toolkit.base.struct.KeyValuePairs; + +import java.net.URLEncoder; +import java.net.http.HttpRequest; +import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; + +/** + * @author qiushui on 2020-09-15. + */ +public class FormUrlencodedBody { + + private final KeyValuePairs pairs = new KeyValuePairs<>(); + + public HttpRequest.BodyPublisher buildBodyPublisher() { + return HttpRequest.BodyPublishers.ofString( + pairs + .stream() + .filter(pair -> pair.getValue() != null) + .map(pair -> pair.getKey() + "=" + URLEncoder.encode(pair.getValue().toString(), StandardCharsets.UTF_8)) + .collect(Collectors.joining("&")) + ); + } + + public FormUrlencodedBody addPair(String name, Object value) { + pairs.addKeyValue(name, value); + return this; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index b2e87ea..aae8dbc 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -101,6 +101,18 @@ public HttpClientSender bodyXml(String xml) { return this; } + public HttpClientSender bodyMultiPartFormData(MultiPartFormDataBody multiPartFormDataBody) { + headers.put("Content-Type", "multipart/form-data; boundary=" + multiPartFormDataBody.getBoundary()); + this.requestBody = multiPartFormDataBody.buildBodyPublisher(); + return this; + } + + public HttpClientSender bodyFormUrlencoded(FormUrlencodedBody formUrlencodedBody) { + headers.put("Content-Type", "application/x-www-form-urlencoded"); + this.requestBody = formUrlencodedBody.buildBodyPublisher(); + return this; + } + public HttpClientSender bodyBytes(byte[] bytes) { this.requestBody = bytes; return this; @@ -148,23 +160,21 @@ public HttpClientReceiver send(SenderHandler senderHandler) t .timeout(readTimeout) .build(); HttpClientReceiver receiver = null; - BODY responseBody = null; try { Instant start = Instant.now(); HttpResponse response = httpClient.send(request, senderHandler.bodyHandler()); Instant end = Instant.now(); - responseBody = response.body(); receiver = new HttpClientReceiver<>( response.statusCode(), response.headers().map(), - responseBody, + response.body(), start.until(end, ChronoUnit.MILLIS) ); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { if (log.isDebugEnabled() && (!onlyPrintFailed || receiver == null || !receiver.isSuccess())) { - printDebug(request, receiver, responseBody); + printDebug(request, receiver); } } return receiver; @@ -182,7 +192,7 @@ private String printBody(Object body) { } } - private void printDebug(HttpRequest request, HttpClientReceiver receiver, Object responseBody) { + private void printDebug(HttpRequest request, HttpClientReceiver receiver) { StringBuilder sb = new StringBuilder("\n=========================================================================================================\n"); sb .append("\nlabel: ").append(debugLabel == null ? "(Undefined)" : debugLabel) @@ -200,7 +210,7 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver, Obj sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } sb.append(" cost: ").append(DateTimeAdvice.millisecondPretty(receiver.getCostTime())).append("\n"); - sb.append(" body: ").append(printBody(responseBody)); + sb.append(" body: ").append(printBody(receiver.getBody())); } sb.append("\n\n=========================================================================================================\n"); log.debug(sb.toString()); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java similarity index 79% rename from develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java rename to develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index c3f0d7c..bbd0bd3 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartBodyPublisher.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -19,14 +19,14 @@ /** * @author qiushui on 2020-09-14. */ -public class MultiPartBodyPublisher { +public class MultiPartFormDataBody { private final List partsSpecificationList = new ArrayList<>(); @Getter private final String boundary = RandomStringUtils.randomAlphabetic(10); - public HttpRequest.BodyPublisher build() { + public HttpRequest.BodyPublisher buildBodyPublisher() { if (partsSpecificationList.isEmpty()) { throw new IllegalStateException("Must have at least one part to build multipart message."); } @@ -34,7 +34,7 @@ public HttpRequest.BodyPublisher build() { return HttpRequest.BodyPublishers.ofByteArrays(PartsIterator::new); } - public MultiPartBodyPublisher addPart(String name, String value) { + public MultiPartFormDataBody addPart(String name, String value) { PartsSpecification newPart = new PartsSpecification(); newPart.type = PartsSpecification.Type.STRING; newPart.name = name; @@ -43,7 +43,7 @@ public MultiPartBodyPublisher addPart(String name, String value) { return this; } - public MultiPartBodyPublisher addPart(String name, Path path) { + public MultiPartFormDataBody addPart(String name, Path path) { PartsSpecification newPart = new PartsSpecification(); newPart.type = PartsSpecification.Type.FILE; newPart.name = name; @@ -52,7 +52,7 @@ public MultiPartBodyPublisher addPart(String name, Path path) { return this; } - public MultiPartBodyPublisher addPart(String name, byte[] bytes) { + public MultiPartFormDataBody addPart(String name, byte[] bytes) { PartsSpecification newPart = new PartsSpecification(); newPart.type = PartsSpecification.Type.FILE; newPart.name = name; @@ -61,7 +61,7 @@ public MultiPartBodyPublisher addPart(String name, byte[] bytes) { return this; } - public MultiPartBodyPublisher addPart(String name, String filename, String contentType, Supplier stream) { + public MultiPartFormDataBody addPart(String name, String filename, String contentType, Supplier stream) { PartsSpecification newPart = new PartsSpecification(); newPart.type = PartsSpecification.Type.STREAM; newPart.name = name; @@ -104,6 +104,8 @@ class PartsIterator implements Iterator { private boolean done; private byte[] next; + private static final String NEW_LINE = "\r\n"; + @Override public boolean hasNext() { if (done) return false; @@ -136,12 +138,7 @@ private byte[] computeNext() throws IOException { String contentType = "application/octet-stream"; switch (nextPart.type) { case STRING: { - String part = - "--" + boundary + "\r\n" + - "Content-Disposition: form-data; name=" + nextPart.name + "\r\n" + - "Content-Type: text/plain; charset=UTF-8\r\n\r\n" + - nextPart.value + "\r\n"; - return part.getBytes(StandardCharsets.UTF_8); + return headerBytes(nextPart.name, nextPart.value, null, "text/plain; charset=UTF-8"); } case FINAL_BOUNDARY: { return nextPart.value.getBytes(StandardCharsets.UTF_8); @@ -163,11 +160,7 @@ private byte[] computeNext() throws IOException { } break; } - String partHeader = - "--" + boundary + "\r\n" + - "Content-Disposition: form-data; name=" + nextPart.name + "; filename=" + filename + "\r\n" + - "Content-Type: " + contentType + "\r\n\r\n"; - return partHeader.getBytes(StandardCharsets.UTF_8); + return headerBytes(nextPart.name, null, filename, contentType); } else { byte[] buf = new byte[8192]; int r = currentFileInput.read(buf); @@ -178,9 +171,23 @@ private byte[] computeNext() throws IOException { } else { currentFileInput.close(); currentFileInput = null; - return "\r\n".getBytes(); + return NEW_LINE.getBytes(); } } } + + private byte[] headerBytes(String name, String value, String filename, String contentType) { + StringBuilder sb = new StringBuilder("--") + .append(boundary).append(NEW_LINE) + .append("Content-Disposition: form-data; name=").append(name); + if (filename != null) { + sb.append("; filename=").append(filename); + } + sb.append(NEW_LINE).append("Content-Type: ").append(contentType).append(NEW_LINE).append(NEW_LINE); + if (value != null) { + sb.append(value).append(NEW_LINE); + } + return sb.toString().getBytes(StandardCharsets.UTF_8); + } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java index 400ae49..850bec0 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java @@ -10,7 +10,15 @@ public interface SenderHandler { default HttpRequest.BodyPublisher bodyPublisher(Object requestBody) { - return HttpRequest.BodyPublishers.ofString((String) requestBody); + if (requestBody instanceof HttpRequest.BodyPublisher) { + return (HttpRequest.BodyPublisher) requestBody; + } else if (requestBody instanceof String) { + return HttpRequest.BodyPublishers.ofString((String) requestBody); + } else if (requestBody.getClass().isArray()) { + return HttpRequest.BodyPublishers.ofByteArray((byte[]) requestBody); + } else { + throw new AssertionError(); + } } HttpResponse.BodyHandler bodyHandler(); From e9242e3bb1de1e357e6ecd4b2f49cd9807fd74e6 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 15 Sep 2020 22:02:53 +0800 Subject: [PATCH 085/178] =?UTF-8?q?=E6=96=B0http=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-base/pom.xml | 5 ++ .../base/components/HttpClientHelper.java | 2 +- .../toolkit/base/utils/HttpAdvice.java | 1 + .../toolkit/base/utils/JacksonAdvice.java | 84 +++++++++++++++++++ .../src/main/java/module-info.java | 1 + pom.xml | 5 ++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index ba9aa04..87f462e 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -29,5 +29,10 @@ jackson-databind true + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + true + \ No newline at end of file diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 6503f74..e050089 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -25,7 +25,7 @@ public HttpClientHelper(Duration connectTimeout) { .newBuilder() .version(HttpClient.Version.HTTP_1_1) .connectTimeout(connectTimeout) - .followRedirects(HttpClient.Redirect.NORMAL) + .followRedirects(HttpClient.Redirect.NEVER) .build(); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java index c407992..fe27777 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java @@ -22,6 +22,7 @@ * Http增强工具 */ @Slf4j +@Deprecated @SuppressWarnings("unused") public final class HttpAdvice { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java new file mode 100644 index 0000000..1e3105a --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -0,0 +1,84 @@ +package develop.toolkit.base.utils; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.type.ArrayType; +import com.fasterxml.jackson.databind.type.CollectionType; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import develop.toolkit.base.constants.DateFormatConstants; +import lombok.SneakyThrows; + +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collection; + +/** + * @author qiushui on 2020-09-15. + */ +public final class JacksonAdvice { + + /** + * 常用默认的ObjectMapper配置 + */ + public static ObjectMapper defaultObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + objectMapper.setDateFormat(new SimpleDateFormat(DateFormatConstants.STANDARD)); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); + JavaTimeModule javaTimeModule = new JavaTimeModule(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateFormatConstants.STANDARD); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter)); + objectMapper.registerModule(javaTimeModule); + return objectMapper; + } + + /** + * 快速序列化 + */ + @SneakyThrows + public static String quickSerialize(Object object, boolean pretty) { + if (pretty) { + return defaultObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(object); + } else { + return defaultObjectMapper().writeValueAsString(object); + } + } + + /** + * 快速反序列化 + */ + @SneakyThrows + public static T quickDeserialize(String json, Class clazz) { + return defaultObjectMapper().readValue(json, clazz); + } + + /** + * 快速反序列化数组 + */ + @SneakyThrows + public static T quickDeserializeArray(String json, Class clazz) { + ObjectMapper objectMapper = defaultObjectMapper(); + ArrayType arrayType = objectMapper.getTypeFactory().constructArrayType(clazz); + return defaultObjectMapper().readValue(json, arrayType); + } + + /** + * 快速反序列化集合 + */ + @SneakyThrows + public static Collection quickDeserializeCollection(String json, Class clazz, Class> type) { + ObjectMapper objectMapper = defaultObjectMapper(); + CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(type, clazz); + return defaultObjectMapper().readValue(json, collectionType); + } +} diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index b3da22f..8f1c242 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -7,6 +7,7 @@ requires org.apache.commons.lang3; requires java.net.http; requires com.fasterxml.jackson.databind; + requires com.fasterxml.jackson.datatype.jsr310; exports develop.toolkit.base.components; exports develop.toolkit.base.constants; diff --git a/pom.xml b/pom.xml index 3b5944b..b39d1b3 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,11 @@ jackson-databind ${version.jackson} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${version.jackson} + From 9db256f9520c65789c895637c0d4ce8029c08d60 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 21 Sep 2020 16:32:31 +0800 Subject: [PATCH 086/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-base/pom.xml | 2 -- .../base/components/HttpClientHelper.java | 4 ++++ .../base/struct/http/HttpClientSender.java | 18 ++++++++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 87f462e..636f63c 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -27,12 +27,10 @@ com.fasterxml.jackson.core jackson-databind - true com.fasterxml.jackson.datatype jackson-datatype-jsr310 - true \ No newline at end of file diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index e050089..3b4245b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -48,4 +48,8 @@ public HttpClientSender put(String url) { public HttpClientSender delete(String url) { return new HttpClientSender(httpClient, "DELETE", url); } + + public HttpClientSender request(String method, String url) { + return new HttpClientSender(httpClient, method, url); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index aae8dbc..145f30d 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -60,7 +60,19 @@ public HttpClientSender header(String header, String value) { } public HttpClientSender headers(Map headers) { - this.headers.putAll(headers); + if (headers != null) { + this.headers.putAll(headers); + } + return this; + } + + public HttpClientSender headerAuthorization(String value) { + this.headers.put("Authorization", value); + return this; + } + + public HttpClientSender headerContentType(String value) { + this.headers.put("Content-Type", value); return this; } @@ -70,7 +82,9 @@ public HttpClientSender parameter(String parameter, String value) { } public HttpClientSender parameters(Map parameters) { - this.parameters.putAll(parameters); + if (parameters != null) { + this.parameters.putAll(parameters); + } return this; } From 50ff8be6f7f6c027ce9e4a562a04e20e4a5d71e2 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 28 Sep 2020 15:49:49 +0800 Subject: [PATCH 087/178] 1.0.4 --- pom.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pom.xml b/pom.xml index b39d1b3..dd3ad09 100644 --- a/pom.xml +++ b/pom.xml @@ -97,18 +97,6 @@ HEAD - - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-releases/ - - - From 04a0a4b93cf2b5999cc15f4f7790ff93a318d2a1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 28 Sep 2020 15:50:56 +0800 Subject: [PATCH 088/178] [maven-release-plugin] prepare release v1.0.4 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 636f63c..7c851f5 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 9acb61e..e6904d1 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index e212560..a470708 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.4-SNAPSHOT + 1.0.4 4.0.0 diff --git a/pom.xml b/pom.xml index dd3ad09..bd4614b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.4-SNAPSHOT + 1.0.4 开发工具箱 2018 Develop Toolkit @@ -29,17 +29,17 @@ com.github.developframework develop-toolkit-base - 1.0.4-SNAPSHOT + 1.0.4 com.github.developframework develop-toolkit-db - 1.0.4-SNAPSHOT + 1.0.4 com.github.developframework develop-toolkit-world - 1.0.4-SNAPSHOT + 1.0.4 org.projectlombok @@ -94,7 +94,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.4 From 9bcd8b74958390cb4f9032354f15361575a47d9c Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 28 Sep 2020 15:51:13 +0800 Subject: [PATCH 089/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 7c851f5..1d44102 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.4 + 1.0.5-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index e6904d1..e6d25d6 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.4 + 1.0.5-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index a470708..24582bc 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.4 + 1.0.5-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index bd4614b..0e55b57 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.4 + 1.0.5-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -29,17 +29,17 @@ com.github.developframework develop-toolkit-base - 1.0.4 + 1.0.5-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.4 + 1.0.5-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.4 + 1.0.5-SNAPSHOT org.projectlombok @@ -94,7 +94,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.4 + HEAD From 96745655e51f7f674bd180e12bc7972e699addf0 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 30 Sep 2020 09:37:47 +0800 Subject: [PATCH 090/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/http/HttpClientSender.java | 5 +++++ pom.xml | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 145f30d..9b9d5fa 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -115,6 +115,11 @@ public HttpClientSender bodyXml(String xml) { return this; } + public HttpClientSender bodyText(String text) { + this.requestBody = text; + return this; + } + public HttpClientSender bodyMultiPartFormData(MultiPartFormDataBody multiPartFormDataBody) { headers.put("Content-Type", "multipart/form-data; boundary=" + multiPartFormDataBody.getBoundary()); this.requestBody = multiPartFormDataBody.buildBodyPublisher(); diff --git a/pom.xml b/pom.xml index 0e55b57..4163f26 100644 --- a/pom.xml +++ b/pom.xml @@ -155,6 +155,18 @@ + + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-releases/ + + + release From c4f35b60cdbb180c132ea436fe2f95f6833f22bb Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 1 Dec 2020 10:45:12 +0800 Subject: [PATCH 091/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/http/FormUrlencodedBody.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java index 1a7d7ca..3b752bb 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java @@ -5,6 +5,7 @@ import java.net.URLEncoder; import java.net.http.HttpRequest; import java.nio.charset.StandardCharsets; +import java.util.Map; import java.util.stream.Collectors; /** @@ -12,7 +13,15 @@ */ public class FormUrlencodedBody { - private final KeyValuePairs pairs = new KeyValuePairs<>(); + private final KeyValuePairs pairs; + + public FormUrlencodedBody() { + pairs = new KeyValuePairs<>(); + } + + public FormUrlencodedBody(Map map) { + pairs = KeyValuePairs.fromMap(map); + } public HttpRequest.BodyPublisher buildBodyPublisher() { return HttpRequest.BodyPublishers.ofString( From b7bca4ac7ac9af56cc655a3d0456a5366bc1d32f Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 3 Dec 2020 08:50:39 +0800 Subject: [PATCH 092/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/base/utils/ObjectAdvice.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 088fd84..363d9d4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -153,6 +153,11 @@ public static T newInstanceQuietly(Class clazz) { return clazz.getConstructor().newInstance(); } + @SneakyThrows + public static T newInstanceQuietly(Class clazz, Class[] parameterClasses, Object... values) { + return clazz.getConstructor(parameterClasses).newInstance(values); + } + /** * 字符串值转化成基本类型值 */ From e7a60347ed0bb5fd9b943f36e51dab7712571047 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 6 Dec 2020 20:49:13 +0800 Subject: [PATCH 093/178] =?UTF-8?q?=E8=BD=A6=E7=89=8C=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E5=92=8C=E6=8F=90=E5=8D=87=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/world/verify/CarPlateVerify.java | 11 ++--------- pom.xml | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java index ec421cf..26561f4 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java @@ -7,15 +7,8 @@ */ public final class CarPlateVerify { - private static final String PLATE_CHARS_NUMBER = "0123456789"; - - private static final String PLATE_CHARS_OTHER = "学挂"; - /** * 参考https://my.oschina.net/chenyoca/blog/1571062 - * - * @param plate - * @return */ public static boolean checkValid(String plate) { final String PROVINCES = "京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新"; @@ -36,7 +29,7 @@ public static boolean checkValid(String plate) { * 普通民用车牌 */ private static boolean validNormal(String plate) { - final String PLATE_CHARS_ORG = "ABCDEFGHJKLMNPQRSTUVWXY"; + final String PLATE_CHARS_ORG = "ABCDEFGHJKLMNPQRSTUVWXYZ"; final String PLATE_CHARS = "ABCDEFGHJKLMNPQRSTUVWXYZ0123456789"; if (PLATE_CHARS_ORG.contains(String.valueOf(plate.charAt(1)))) { for (int i = 2; i < 7; i++) { @@ -54,7 +47,7 @@ private static boolean validNormal(String plate) { * 新能源车牌 */ private static boolean validNewEnergy(String plate) { - final String PLATE_CHARS_ORG = "ABCDEFGHJKLMNPQRSTUVWXY"; + final String PLATE_CHARS_ORG = "ABCDEFGHJKLMNPQRSTUVWXYZ"; if (PLATE_CHARS_ORG.contains(String.valueOf(plate.charAt(1)))) { if ( "123456789DF".contains(String.valueOf(plate.charAt(2))) && diff --git a/pom.xml b/pom.xml index 4163f26..3a3b6ac 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 1.18.12 1.7.30 1.5.0 - 2.10.2 + 2.11.3 From 3a81c511b6a7136b1cb4b0190809d0c135bc6d02 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 7 Dec 2020 10:50:24 +0800 Subject: [PATCH 094/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3a3b6ac..d950082 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ - 1.18.12 + 1.18.16 1.7.30 1.5.0 2.11.3 From e524b43374dea599ac73ef881c81752d87ce76a1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 8 Dec 2020 17:13:40 +0800 Subject: [PATCH 095/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/FormUrlencodedBody.java | 29 ++++++------------- .../base/struct/http/HttpClientSender.java | 2 +- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java index 3b752bb..ed74afb 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java @@ -1,40 +1,29 @@ package develop.toolkit.base.struct.http; -import develop.toolkit.base.struct.KeyValuePairs; +import develop.toolkit.base.utils.StringAdvice; +import lombok.RequiredArgsConstructor; -import java.net.URLEncoder; -import java.net.http.HttpRequest; -import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; /** * @author qiushui on 2020-09-15. */ +@RequiredArgsConstructor public class FormUrlencodedBody { - private final KeyValuePairs pairs; + private final Map pairs; public FormUrlencodedBody() { - pairs = new KeyValuePairs<>(); + pairs = new HashMap<>(); } - public FormUrlencodedBody(Map map) { - pairs = KeyValuePairs.fromMap(map); - } - - public HttpRequest.BodyPublisher buildBodyPublisher() { - return HttpRequest.BodyPublishers.ofString( - pairs - .stream() - .filter(pair -> pair.getValue() != null) - .map(pair -> pair.getKey() + "=" + URLEncoder.encode(pair.getValue().toString(), StandardCharsets.UTF_8)) - .collect(Collectors.joining("&")) - ); + public String buildBody() { + return StringAdvice.urlParametersFormat(pairs, false); } public FormUrlencodedBody addPair(String name, Object value) { - pairs.addKeyValue(name, value); + pairs.put(name, value); return this; } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 9b9d5fa..da9a487 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -128,7 +128,7 @@ public HttpClientSender bodyMultiPartFormData(MultiPartFormDataBody multiPartFor public HttpClientSender bodyFormUrlencoded(FormUrlencodedBody formUrlencodedBody) { headers.put("Content-Type", "application/x-www-form-urlencoded"); - this.requestBody = formUrlencodedBody.buildBodyPublisher(); + this.requestBody = formUrlencodedBody.buildBody(); return this; } From 280b104ce95f99502ae8c32cb4f0a9509e2a3715 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 9 Dec 2020 14:06:02 +0800 Subject: [PATCH 096/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/develop/toolkit/world/verify/CarPlateVerify.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java index 26561f4..c9ed175 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java @@ -52,7 +52,7 @@ private static boolean validNewEnergy(String plate) { if ( "123456789DF".contains(String.valueOf(plate.charAt(2))) && "ABCDEFGHJKLMNPQRSTUVWXYZ123456789".contains(String.valueOf(plate.charAt(3))) && - "123456789DF".contains(String.valueOf(plate.charAt(7))) + "0123456789DF".contains(String.valueOf(plate.charAt(7))) ) { for (int i = 4; i < 6; i++) { if ("0123456789".contains(String.valueOf(plate.charAt(i)))) { From 6f98469df6f54c78808b07d77114a9e457ec7ef1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 10 Dec 2020 15:05:54 +0800 Subject: [PATCH 097/178] =?UTF-8?q?=E5=B7=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/utils/ArrayAdvice.java | 10 ++++++++++ .../develop/toolkit/base/utils/CollectionAdvice.java | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index 4fdf15a..30944c0 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -248,12 +248,22 @@ public static Set intersection(E[] master, E[]... other) { /** * 补集 */ + @Deprecated public static Set complementary(E[] master, E[] other) { Set set = new HashSet<>(Set.of(master)); set.removeIf(item -> contains(other, item)); return set; } + /** + * 差集 + */ + public static Set difference(E[] master, E[] other) { + Set set = new HashSet<>(Set.of(master)); + set.removeIf(item -> contains(other, item)); + return set; + } + /** * 合并多数组 */ diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 18512c8..95552e2 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -236,12 +236,22 @@ public static Set intersection(Collection master, Collection... oth /** * 补集 */ + @Deprecated public static Set complementary(Collection master, Collection other) { Set set = new HashSet<>(master); set.removeIf(other::contains); return set; } + /** + * 差集 + */ + public static Set difference(Collection master, Collection other) { + Set set = new HashSet<>(master); + set.removeIf(other::contains); + return set; + } + /** * 合并多集合 */ From 457531956e4a33b3a72c88c8c69ed7139e0b244d Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 16 Dec 2020 13:48:56 +0800 Subject: [PATCH 098/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/http/HttpClientSender.java | 6 +++--- .../develop/toolkit/base/utils/DateTimeAdvice.java | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index da9a487..1d1a5c4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -220,13 +220,13 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver) { request .headers() .map() - .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); + .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); sb.append(" body: ").append(printBody(requestBody)).append("\n"); if (receiver != null) { sb - .append("\nhttp response:\n status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); + .append("\nhttp response:\n status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); for (Map.Entry> entry : receiver.getHeaders().entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); + sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } sb.append(" cost: ").append(DateTimeAdvice.millisecondPretty(receiver.getCostTime())).append("\n"); sb.append(" body: ").append(printBody(receiver.getBody())); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java index 720a996..2adeb24 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/DateTimeAdvice.java @@ -177,4 +177,14 @@ public static String millisecondPretty(long millisecond) { return day + "d" + hour + "h" + minute + "m" + second + "s" + milli + "ms"; } } + + /** + * 秒美化成HHmmSS格式 + */ + public static String secondPrettyToHHmmss(long seconds) { + long hours = seconds / 3600; + long minutes = (seconds - hours * 3600) / 60; + long second = seconds % 60; + return String.format("%02d:%02d:%02d", hours, minutes, second); + } } From 614b0ccc0bef9ae0945372f82650a43a144634f2 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 17 Dec 2020 17:16:00 +0800 Subject: [PATCH 099/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/develop/toolkit/base/utils/K.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java index 2d4b8ad..bd9405f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java @@ -22,6 +22,18 @@ public static T def(T value, Supplier defaultSupplier) { return value != null ? value : defaultSupplier.get(); } + /** + * 如果为null返回默认值 + * + * @param value 值 + * @param defaultValue 默认值 + * @param 泛型 + * @return 值 + */ + public static T def(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + /** * 如果不为null则执行consumer * From 4583b8974e205967e88f71d87b287b0b5e20d44f Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 18 Dec 2020 23:23:11 +0800 Subject: [PATCH 100/178] =?UTF-8?q?=E8=BD=A6=E7=89=8C=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E5=92=8C=E6=8F=90=E5=8D=87=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/world/verify/CarPlateVerify.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java index c9ed175..e2475a0 100644 --- a/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java +++ b/develop-toolkit-world/src/main/java/develop/toolkit/world/verify/CarPlateVerify.java @@ -25,6 +25,13 @@ public static boolean checkValid(String plate) { } } + /** + * 宽松的验证 + */ + public static boolean checkValidRelaxed(String plate) { + return plate.matches("^[京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新][A-Z].{5,6}$"); + } + /** * 普通民用车牌 */ From 9a77aeb62b60f6cf0f90ae64d6df9443906401af Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 30 Dec 2020 17:10:04 +0800 Subject: [PATCH 101/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/StringAdvice.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 1ab7f9a..174e294 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -123,4 +123,23 @@ public static String urlParametersFormat(Map parameters, boolean .map(kv -> String.format("%s=%s", kv.getKey(), URLEncoder.encode(kv.getValue().toString(), StandardCharsets.UTF_8))) .collect(Collectors.joining("&")); } + + /** + * 去除字符串左边的ch字符 + */ + public static String trimLeft(String str, char ch) { + if (str == null) { + return null; + } + int skip = 0; + for (int i = 0, len = str.length(); i < len; i++) { + char c = str.charAt(i); + if (c == ch) { + skip++; + } else { + break; + } + } + return str.substring(skip); + } } From 66443599ea543ab5aeebc24cfd12a495ecd40b6e Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 30 Dec 2020 22:05:27 +0800 Subject: [PATCH 102/178] =?UTF-8?q?K=20=E6=96=B0=E5=A2=9E=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=AE=80=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/constants/DateFormatConstants.java | 1 + .../toolkit/base/utils/HttpAdvice.java | 227 ------------------ .../java/develop/toolkit/base/utils/K.java | 90 ++++++- 3 files changed, 90 insertions(+), 228 deletions(-) delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java index 80332f8..1bde0a7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/constants/DateFormatConstants.java @@ -13,6 +13,7 @@ public interface DateFormatConstants { String STANDARD = "yyyy-MM-dd HH:mm:ss"; String COMPACT = "yyyyMMddHHmmss"; String DATE = "yyyy-MM-dd"; + String MONTH = "yyyy-MM"; String TIME = "HH:mm:ss"; String MYSQL_FORMAT_DATETIME = "%Y-%m-%d %H:%i:%S"; String MYSQL_FORMAT_DATE = "%Y-%m-%d"; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java deleted file mode 100644 index fe27777..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/HttpAdvice.java +++ /dev/null @@ -1,227 +0,0 @@ -package develop.toolkit.base.utils; - -import develop.toolkit.base.struct.HttpAdviceResponse; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -import javax.net.ssl.SSLContext; -import java.io.IOException; -import java.net.URI; -import java.net.URLEncoder; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * Http增强工具 - */ -@Slf4j -@Deprecated -@SuppressWarnings("unused") -public final class HttpAdvice { - - /** - * 默认的httpClient - */ - public static HttpClient defaultHttpClient() { - return HttpClient - .newBuilder() - .version(HttpClient.Version.HTTP_1_1) - .connectTimeout(Duration.ofSeconds(5L)) - .followRedirects(HttpClient.Redirect.NORMAL) - .build(); - } - - /** - * 带ssl的httpClient - * - * @param sslContext - * @return - */ - public static HttpClient sslHttpClient(SSLContext sslContext) { - return HttpClient - .newBuilder() - .version(HttpClient.Version.HTTP_1_1) - .connectTimeout(Duration.ofSeconds(5L)) - .followRedirects(HttpClient.Redirect.NORMAL) - .sslContext(sslContext) - .build(); - } - - /** - * 通用请求 - */ - public static HttpAdviceResponse request( - String label, - HttpClient httpClient, - String httpMethod, - String url, - Map headers, - Map parameters, - String content - ) throws IOException { - return send( - label, - httpClient, - httpMethod, - builder(url, headers, parameters), - content - ); - } - - /** - * GET请求 - */ - public static HttpAdviceResponse get(String label, HttpClient httpClient, String url, Map headers, Map parameters) throws IOException { - return send( - label, - httpClient, - "GET", - builder(url, headers, parameters), - null - ); - } - - public static HttpAdviceResponse post(String label, HttpClient httpClient, String url, Map headers, String content) throws IOException { - return send( - label, - httpClient, - "POST", - builder(url, headers, null), - content - ); - } - - public static HttpAdviceResponse put(String label, HttpClient httpClient, String url, Map headers, String content) throws IOException { - return send( - label, - httpClient, - "PUT", - builder(url, headers, null), - content - ); - } - - public static HttpAdviceResponse delete(String label, HttpClient httpClient, String url, Map headers, String content) throws IOException { - return send( - label, - httpClient, - "DELETE", - builder(url, headers, null), - content - ); - } - - /** - * 发送x-www-form-urlencoded格式请求 - */ - public static HttpAdviceResponse sendFormUrlencoded(String label, HttpClient httpClient, String httpMethod, String url, Map headers, Map form) throws IOException { - return send( - label, - httpClient, - httpMethod, - builder(url, headers, null).header("Content-Type", "application/x-www-form-urlencoded"), - form - .entrySet() - .stream() - .filter(kv -> kv.getValue() != null) - .map(kv -> String.format("%s=%s", kv.getKey(), URLEncoder.encode(kv.getValue().toString(), StandardCharsets.UTF_8))) - .collect(Collectors.joining("&")) - ); - } - - /** - * 发送json请求 - */ - public static HttpAdviceResponse sendJson(String label, HttpClient httpClient, String httpMethod, String url, Map headers, String json) throws IOException { - return send( - label, - httpClient, - httpMethod, - builder(url, headers, null).header("Content-Type", "application/json;charset=UTF-8"), - json - ); - } - - /** - * 发送xml请求 - */ - public static HttpAdviceResponse sendXml(String label, HttpClient httpClient, String httpMethod, String url, Map headers, String xml) throws IOException { - return send( - label, - httpClient, - httpMethod, - builder(url, headers, null).header("Content-Type", "application/xml;charset=UTF-8"), - xml - ); - } - - private static HttpRequest.Builder builder(String url, Map headers, Map parameters) { - if (parameters != null) { - url += parameters - .entrySet() - .stream() - .filter(kv -> kv.getValue() != null) - .map(kv -> String.format("%s=%s", kv.getKey(), URLEncoder.encode(kv.getValue().toString(), StandardCharsets.UTF_8))) - .collect(Collectors.joining("&", "?", "")); - } - final HttpRequest.Builder builder = HttpRequest - .newBuilder() - .version(HttpClient.Version.HTTP_1_1) - .uri(URI.create(url)); - if (headers != null) { - headers.forEach(builder::header); - } - return builder; - } - - private static HttpAdviceResponse send(String label, HttpClient httpClient, String httpMethod, HttpRequest.Builder builder, String content) throws IOException { - HttpAdviceResponse response = null; - HttpRequest httpRequest = null; - try { - httpRequest = builder - .method( - httpMethod, - content == null ? HttpRequest.BodyPublishers.noBody() : HttpRequest.BodyPublishers.ofString(content, StandardCharsets.UTF_8) - ) - .timeout(Duration.ofMinutes(5L)) - .build(); - - Instant start = Instant.now(); - HttpResponse httpResponse = K.def(httpClient, HttpAdvice::defaultHttpClient).send(httpRequest, HttpResponse.BodyHandlers.ofByteArray()); - Instant end = Instant.now(); - response = new HttpAdviceResponse( - httpResponse.statusCode(), - httpResponse.headers().map(), - httpResponse.body(), - start.until(end, ChronoUnit.MILLIS) - ); - return response; - } catch (InterruptedException e) { - throw new RuntimeException(e); - } finally { - if (log.isDebugEnabled() && httpRequest != null) { - StringBuilder sb = new StringBuilder(); - sb - .append("\nlabel: ").append(label) - .append("\nhttp request:\n url: ") - .append(httpRequest.uri().toString()).append("\n headers:\n"); - httpRequest - .headers() - .map() - .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); - sb.append(" body: ").append(content != null ? content : "(no content)").append("\n"); - if (response != null) { - sb.append(response.toString()); - } - log.debug(sb.toString()); - } - } - } -} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java index bd9405f..8d267f8 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/K.java @@ -1,5 +1,7 @@ package develop.toolkit.base.utils; +import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -46,6 +48,49 @@ public static void let(T value, Consumer consumer) { } } + /** + * 如果map的取值不为null则消费 + * + * @param map map + * @param key 键 + * @param consumer 消费者 + * @param 键类型 + * @param 值类型 + */ + public static void let(Map map, KEY key, Consumer consumer) { + if (map != null) { + let(map.get(key), consumer); + } + } + + /** + * 如果列表的值不为null则消费 + * + * @param list 列表 + * @param i 索引 + * @param consumer 消费者 + * @param 列表元素类型 + */ + public static void let(List list, int i, Consumer consumer) { + if (list != null) { + let(list.get(i), consumer); + } + } + + /** + * 如果数组的值不为null则消费 + * + * @param array 数组 + * @param i 索引 + * @param consumer 消费者 + * @param 数组元素类型 + */ + public static void let(T[] array, int i, Consumer consumer) { + if (array != null) { + let(array[i], consumer); + } + } + /** * 如果不为null则返回转化值 * @@ -54,6 +99,49 @@ public static void let(T value, Consumer consumer) { * @return 转化值 */ public static R map(T value, Function function) { - return value != null ? function.apply(value) : null; + return value == null ? null : function.apply(value); + } + + /** + * 如果map的取值不为null则转化 + * + * @param map map + * @param key 键 + * @param function 函数 + * @param 键类型 + * @param 值类型 + * @param 转化类型 + * @return 转化值 + */ + public static T map(Map map, KEY key, Function function) { + return map == null ? null : map(map.get(key), function); + } + + /** + * 如果列表的值不为null则消费 + * + * @param list 列表 + * @param i 索引 + * @param function 函数 + * @param 列表值类型 + * @param 转化类型 + * @return 转化值 + */ + public static T map(List list, int i, Function function) { + return list == null ? null : map(list.get(i), function); + } + + /** + * 如果数组的值不为null则消费 + * + * @param array 数组 + * @param i 索引 + * @param function 函数 + * @param 列表值类型 + * @param 转化类型 + * @return 转化值 + */ + public static T map(V[] array, int i, Function function) { + return array == null ? null : map(array[i], function); } } From 57c53ad48e52e9aca76063d8ec7b4b6e114f6a68 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 30 Dec 2020 22:51:01 +0800 Subject: [PATCH 103/178] =?UTF-8?q?IOAdvice=20StringAdvice=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=83=A8=E5=88=86=E7=AE=80=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/IOAdvice.java | 34 +++++++++++++++++-- .../toolkit/base/utils/StringAdvice.java | 29 ++++++++++------ 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index c9c837a..4493411 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -6,9 +6,7 @@ import java.lang.reflect.Constructor; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; -import java.util.Scanner; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -149,6 +147,21 @@ public static ListInMap splitGroupingFormClasspath(String filen return map; } + /** + * 从classpath读取文件并每行用regex切分,然后按keyFunction分组,明确值是唯一的 + */ + public static Map splitGroupingUniqueFormClasspath(String filename, String regex, Function keyFunction) { + Map map = new HashMap<>(); + splitFromClasspath(filename, regex).forEach(objs -> { + K k = keyFunction.apply(objs); + if (map.containsKey(k)) { + throw new IllegalStateException("exists key \"" + k + "\""); + } + map.put(k, objs); + }); + return map; + } + /** * 从classpath读取文件并每行用regex切分,装填到实体类,然后按keyFunction分组 */ @@ -176,6 +189,21 @@ public static ListInMap splitGroupingFormClasspath(String filena return map; } + /** + * 从classpath读取文件并每行用regex切分,然后按keyFunction分组,明确值是唯一的 + */ + public static Map splitGroupingUniqueFormClasspath(String filename, String regex, Function keyFunction, Function valueFunction) { + Map map = new HashMap<>(); + splitFromClasspath(filename, regex).forEach(objs -> { + K k = keyFunction.apply(objs); + if (map.containsKey(k)) { + throw new IllegalStateException("exists key \"" + k + "\""); + } + map.put(k, valueFunction.apply(objs)); + }); + return map; + } + /** * 读取文本 */ diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 174e294..ce28614 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -125,21 +125,30 @@ public static String urlParametersFormat(Map parameters, boolean } /** - * 去除字符串左边的ch字符 + * 去除字符串左右指定的字符 */ - public static String trimLeft(String str, char ch) { + public static String trim(String str, char ch) { if (str == null) { return null; } - int skip = 0; - for (int i = 0, len = str.length(); i < len; i++) { - char c = str.charAt(i); - if (c == ch) { - skip++; - } else { - break; + int skipLeft = 0, skipRight = 0, len = str.length(); + boolean left = true, right = true; + for (int i = 0; i < len && (left || right); i++) { + if (left) { + if (str.charAt(i) == ch) { + skipLeft++; + } else { + left = false; + } + } + if (right) { + if (str.charAt(len - 1 - i) == ch) { + skipRight++; + } else { + right = false; + } } } - return str.substring(skip); + return str.substring(skipLeft, len - skipRight); } } From 5d53e8fffbbd3286c185e3c6a728598ea3973c16 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 30 Dec 2020 22:58:10 +0800 Subject: [PATCH 104/178] =?UTF-8?q?IOAdvice=20StringAdvice=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=83=A8=E5=88=86=E7=AE=80=E5=8C=96=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/StringAdvice.java | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index ce28614..5eadad5 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -66,7 +66,7 @@ public static TwoValues cutOff(String string, int index) { string.substring(0, index), string.substring(index) ); - } + } /** * 切掉尾部字符串 @@ -131,24 +131,12 @@ public static String trim(String str, char ch) { if (str == null) { return null; } - int skipLeft = 0, skipRight = 0, len = str.length(); + int leftSkip = 0, rightSkip = 0, len = str.length(); boolean left = true, right = true; for (int i = 0; i < len && (left || right); i++) { - if (left) { - if (str.charAt(i) == ch) { - skipLeft++; - } else { - left = false; - } - } - if (right) { - if (str.charAt(len - 1 - i) == ch) { - skipRight++; - } else { - right = false; - } - } + if (left && (left = str.charAt(i) == ch)) leftSkip++; + if (right && (right = str.charAt(len - 1 - i) == ch)) rightSkip++; } - return str.substring(skipLeft, len - skipRight); + return str.substring(leftSkip, len - rightSkip); } } From f002d0d9c7b69ca0391cf2f6ee1461f3471f6a64 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 14 Jan 2021 13:26:37 +0800 Subject: [PATCH 105/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/struct/http/HttpClientSender.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 1d1a5c4..ddbfa7e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -76,12 +76,12 @@ public HttpClientSender headerContentType(String value) { return this; } - public HttpClientSender parameter(String parameter, String value) { + public HttpClientSender parameter(String parameter, Object value) { this.parameters.put(parameter, value); return this; } - public HttpClientSender parameters(Map parameters) { + public HttpClientSender parameters(Map parameters) { if (parameters != null) { this.parameters.putAll(parameters); } @@ -215,7 +215,7 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver) { StringBuilder sb = new StringBuilder("\n=========================================================================================================\n"); sb .append("\nlabel: ").append(debugLabel == null ? "(Undefined)" : debugLabel) - .append("\nhttp request:\n url: ") + .append("\nhttp request:\n method: ").append(method).append("\n url: ") .append(request.uri().toString()).append("\n headers:\n"); request .headers() From 02a3ee0fc3eed8456b4c67ecf329aa17904ee7f8 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 14 Jan 2021 22:37:11 +0800 Subject: [PATCH 106/178] =?UTF-8?q?Jackson=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/JacksonAdvice.java | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 1e3105a..da2a458 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -1,12 +1,8 @@ package develop.toolkit.base.utils; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.PropertyNamingStrategy; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.type.ArrayType; -import com.fasterxml.jackson.databind.type.CollectionType; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; @@ -43,42 +39,38 @@ public static ObjectMapper defaultObjectMapper() { } /** - * 快速序列化 + * 安静地序列化 */ - @SneakyThrows - public static String quickSerialize(Object object, boolean pretty) { + @SneakyThrows(JsonProcessingException.class) + public static String serializeQuietly(ObjectMapper objectMapper, Object object, boolean pretty) { if (pretty) { - return defaultObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(object); + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); } else { - return defaultObjectMapper().writeValueAsString(object); + return objectMapper.writeValueAsString(object); } } /** - * 快速反序列化 + * 安静地反序列化 */ - @SneakyThrows - public static T quickDeserialize(String json, Class clazz) { - return defaultObjectMapper().readValue(json, clazz); + @SneakyThrows({JsonProcessingException.class, JsonMappingException.class}) + public static T deserializeQuietly(ObjectMapper objectMapper, String json, Class clazz) { + return objectMapper.readValue(json, clazz); } /** - * 快速反序列化数组 + * 安静地反序列化数组 */ - @SneakyThrows - public static T quickDeserializeArray(String json, Class clazz) { - ObjectMapper objectMapper = defaultObjectMapper(); - ArrayType arrayType = objectMapper.getTypeFactory().constructArrayType(clazz); - return defaultObjectMapper().readValue(json, arrayType); + @SneakyThrows({JsonProcessingException.class, JsonMappingException.class}) + public static T deserializeArrayQuietly(ObjectMapper objectMapper, String json, Class clazz) { + return objectMapper.readValue(json, objectMapper.getTypeFactory().constructArrayType(clazz)); } /** - * 快速反序列化集合 + * 安静地反序列化集合 */ - @SneakyThrows - public static Collection quickDeserializeCollection(String json, Class clazz, Class> type) { - ObjectMapper objectMapper = defaultObjectMapper(); - CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(type, clazz); - return defaultObjectMapper().readValue(json, collectionType); + @SneakyThrows({JsonProcessingException.class, JsonMappingException.class}) + public static Collection deserializeCollectionQuietly(ObjectMapper objectMapper, String json, Class clazz, Class> type) { + return objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(type, clazz)); } } From dbf49ed478eb2d43ebf914f4ef8d84674efd06af Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 18 Jan 2021 17:05:30 +0800 Subject: [PATCH 107/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/JacksonAdvice.java | 38 +++++++++++++++++++ .../src/main/java/module-info.java | 1 + 2 files changed, 39 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index da2a458..5da1420 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.github.developframework.expression.*; import develop.toolkit.base.constants.DateFormatConstants; import lombok.SneakyThrows; @@ -73,4 +74,41 @@ public static T deserializeArrayQuietly(ObjectMapper objectMapper, String js public static Collection deserializeCollectionQuietly(ObjectMapper objectMapper, String json, Class clazz, Class> type) { return objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(type, clazz)); } + + /** + * 用表达式从json中取值 + */ + @SneakyThrows(JsonProcessingException.class) + public static T getValue(ObjectMapper objectMapper, String json, String expressionValue, Class clazz) { + if (json == null) { + return null; + } + Expression expression = Expression.parse(expressionValue); + if (expression == EmptyExpression.INSTANCE) { + return objectMapper.readValue(json, clazz); + } + JsonNode jsonNode = objectMapper.readTree(json); + for (Expression singleExpression : expression.expressionTree()) { + if (singleExpression instanceof ObjectExpression) { + jsonNode = existsJsonNode(jsonNode, ((ObjectExpression) singleExpression).getPropertyName()); + } else if (singleExpression instanceof ArrayExpression) { + ArrayExpression ae = (ArrayExpression) singleExpression; + jsonNode = existsJsonNode(jsonNode, ae.getPropertyName()); + if (jsonNode.isArray()) { + jsonNode = jsonNode.get(ae.getIndex()); + } + } else if (singleExpression instanceof MethodExpression) { + throw new IllegalArgumentException("not support method expression."); + } + } + return objectMapper.treeToValue(jsonNode, clazz); + } + + private static JsonNode existsJsonNode(JsonNode parentNode, String propertyName) { + final JsonNode node = parentNode.get(propertyName); + if (node == null) { + throw new IllegalArgumentException("Not found node \"" + propertyName + "\""); + } + return node; + } } diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index 8f1c242..1b54da5 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -8,6 +8,7 @@ requires java.net.http; requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.datatype.jsr310; + requires expression; exports develop.toolkit.base.components; exports develop.toolkit.base.constants; From bcf76b440992d2316d32afa5f85b18d61e5df0cc Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 19 Jan 2021 17:05:56 +0800 Subject: [PATCH 108/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/JacksonAdvice.java | 90 +++++++++++-------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 5da1420..98d063a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -8,12 +8,13 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.github.developframework.expression.*; import develop.toolkit.base.constants.DateFormatConstants; +import develop.toolkit.base.struct.KeyValuePair; import lombok.SneakyThrows; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Collection; +import java.util.List; /** * @author qiushui on 2020-09-15. @@ -52,56 +53,75 @@ public static String serializeQuietly(ObjectMapper objectMapper, Object object, } /** - * 安静地反序列化 + * 用表达式从json中取值 */ - @SneakyThrows({JsonProcessingException.class, JsonMappingException.class}) - public static T deserializeQuietly(ObjectMapper objectMapper, String json, Class clazz) { - return objectMapper.readValue(json, clazz); + @SneakyThrows(JsonProcessingException.class) + public static T deserializeValue(ObjectMapper objectMapper, JsonNode rootNode, String expressionValue, Class clazz) { + return objectMapper.treeToValue( + parseExpressionToJsonNode(rootNode, Expression.parse(expressionValue)), + clazz + ); } /** - * 安静地反序列化数组 + * 用表达式从json中取数组 */ - @SneakyThrows({JsonProcessingException.class, JsonMappingException.class}) - public static T deserializeArrayQuietly(ObjectMapper objectMapper, String json, Class clazz) { - return objectMapper.readValue(json, objectMapper.getTypeFactory().constructArrayType(clazz)); + @SneakyThrows(JsonProcessingException.class) + public static T[] deserializeArray(ObjectMapper objectMapper, JsonNode rootNode, String expressionValue, Class clazz) { + final JsonNode jsonNode = parseExpressionToJsonNode(rootNode, Expression.parse(expressionValue)); + if (!jsonNode.isArray()) { + throw new IllegalArgumentException("\"" + expressionValue + "\" value is not a array."); + } + return objectMapper.readValue( + jsonNode.toString(), + objectMapper.getTypeFactory().constructArrayType(clazz) + ); } /** - * 安静地反序列化集合 + * 用表达式从json中取列表 */ - @SneakyThrows({JsonProcessingException.class, JsonMappingException.class}) - public static Collection deserializeCollectionQuietly(ObjectMapper objectMapper, String json, Class clazz, Class> type) { - return objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(type, clazz)); + @SneakyThrows(JsonProcessingException.class) + public static List deserializeList(ObjectMapper objectMapper, JsonNode rootNode, String expressionValue, Class clazz) { + final JsonNode jsonNode = parseExpressionToJsonNode(rootNode, Expression.parse(expressionValue)); + if (!jsonNode.isArray()) { + throw new IllegalArgumentException("\"" + expressionValue + "\" value is not a list."); + } + return objectMapper.readValue( + jsonNode.toString(), + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz) + ); } - /** - * 用表达式从json中取值 - */ @SneakyThrows(JsonProcessingException.class) - public static T getValue(ObjectMapper objectMapper, String json, String expressionValue, Class clazz) { - if (json == null) { - return null; + public static Object[] deserializeValues(ObjectMapper objectMapper, JsonNode rootNode, KeyValuePair>... expressionValues) { + final Object[] values = new Object[expressionValues.length]; + for (int i = 0; i < expressionValues.length; i++) { + final KeyValuePair> kv = expressionValues[i]; + final Expression expression = Expression.parse(kv.getKey()); + JsonNode jsonNode = parseExpressionToJsonNode(rootNode, expression); + values[i] = objectMapper.treeToValue(jsonNode, kv.getValue()); } - Expression expression = Expression.parse(expressionValue); - if (expression == EmptyExpression.INSTANCE) { - return objectMapper.readValue(json, clazz); - } - JsonNode jsonNode = objectMapper.readTree(json); - for (Expression singleExpression : expression.expressionTree()) { - if (singleExpression instanceof ObjectExpression) { - jsonNode = existsJsonNode(jsonNode, ((ObjectExpression) singleExpression).getPropertyName()); - } else if (singleExpression instanceof ArrayExpression) { - ArrayExpression ae = (ArrayExpression) singleExpression; - jsonNode = existsJsonNode(jsonNode, ae.getPropertyName()); - if (jsonNode.isArray()) { - jsonNode = jsonNode.get(ae.getIndex()); + return values; + } + + private static JsonNode parseExpressionToJsonNode(JsonNode jsonNode, Expression expression) { + if (expression != EmptyExpression.INSTANCE) { + for (Expression singleExpression : expression.expressionTree()) { + if (singleExpression instanceof ObjectExpression) { + jsonNode = existsJsonNode(jsonNode, ((ObjectExpression) singleExpression).getPropertyName()); + } else if (singleExpression instanceof ArrayExpression) { + ArrayExpression ae = (ArrayExpression) singleExpression; + jsonNode = existsJsonNode(jsonNode, ae.getPropertyName()); + if (jsonNode.isArray()) { + jsonNode = jsonNode.get(ae.getIndex()); + } + } else if (singleExpression instanceof MethodExpression) { + throw new IllegalArgumentException("not support method expression."); } - } else if (singleExpression instanceof MethodExpression) { - throw new IllegalArgumentException("not support method expression."); } } - return objectMapper.treeToValue(jsonNode, clazz); + return jsonNode; } private static JsonNode existsJsonNode(JsonNode parentNode, String propertyName) { From 0a0c4b0fc7b990d1752062f6dcddd2756846b974 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 19 Jan 2021 23:20:25 +0800 Subject: [PATCH 109/178] =?UTF-8?q?Jackson=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/utils/JacksonAdvice.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 98d063a..4cfc3b4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -13,7 +13,6 @@ import java.text.SimpleDateFormat; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -33,9 +32,8 @@ public static ObjectMapper defaultObjectMapper() { objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); JavaTimeModule javaTimeModule = new JavaTimeModule(); - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateFormatConstants.STANDARD); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter)); - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter)); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateFormatConstants.STANDARD_FORMATTER)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateFormatConstants.STANDARD_FORMATTER)); objectMapper.registerModule(javaTimeModule); return objectMapper; } @@ -93,6 +91,7 @@ public static List deserializeList(ObjectMapper objectMapper, JsonNode ro ); } + @SafeVarargs @SneakyThrows(JsonProcessingException.class) public static Object[] deserializeValues(ObjectMapper objectMapper, JsonNode rootNode, KeyValuePair>... expressionValues) { final Object[] values = new Object[expressionValues.length]; From 8404ce00cfbbeb5f0bc61baa5c0ba1a9a3b79d7b Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 26 Jan 2021 13:32:48 +0800 Subject: [PATCH 110/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/ArrayAdvice.java | 36 +++++++++---------- .../toolkit/base/utils/CollectionAdvice.java | 26 ++++++-------- 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index 30944c0..7cdbbc3 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -225,10 +225,10 @@ public static Counter groupingCount(E[] array, Function keySuppl * 并集 */ @SafeVarargs - public static Set union(E[] master, E[]... other) { - Set set = new HashSet<>(Set.of(master)); - for (E[] array : other) { - set.addAll(Set.of(array)); + public static Set union(E[]... arrays) { + Set set = new HashSet<>(); + for (E[] array : arrays) { + set.addAll(Arrays.asList(array)); } return set; } @@ -238,29 +238,27 @@ public static Set union(E[] master, E[]... other) { */ @SafeVarargs public static Set intersection(E[] master, E[]... other) { - Set set = new HashSet<>(Set.of(master)); - for (E[] array : other) { - set.removeIf(Predicate.not(item -> contains(array, item))); + Set set = new HashSet<>(); + a: + for (E e : master) { + for (E[] array : other) { + if (!contains(array, e)) continue a; + } + set.add(e); } return set; } - /** - * 补集 - */ - @Deprecated - public static Set complementary(E[] master, E[] other) { - Set set = new HashSet<>(Set.of(master)); - set.removeIf(item -> contains(other, item)); - return set; - } - /** * 差集 */ public static Set difference(E[] master, E[] other) { - Set set = new HashSet<>(Set.of(master)); - set.removeIf(item -> contains(other, item)); + Set set = new HashSet<>(); + for (E e : master) { + if (!contains(other, e)) { + set.add(e); + } + } return set; } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 95552e2..254521f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -213,9 +213,9 @@ public static Counter groupingCount(Collection collection, Function * 并集 */ @SafeVarargs - public static Set union(Collection master, Collection... other) { - Set set = new HashSet<>(master); - for (Collection collection : other) { + public static Set union(Collection... collections) { + Set set = new HashSet<>(); + for (Collection collection : collections) { set.addAll(collection); } return set; @@ -226,23 +226,17 @@ public static Set union(Collection master, Collection... other) { */ @SafeVarargs public static Set intersection(Collection master, Collection... other) { - Set set = new HashSet<>(master); - for (Collection collection : other) { - set.removeIf(Predicate.not(collection::contains)); + Set set = new HashSet<>(); + a: + for (E e : master) { + for (Collection collection : other) { + if (!contains(collection, e)) continue a; + } + set.add(e); } return set; } - /** - * 补集 - */ - @Deprecated - public static Set complementary(Collection master, Collection other) { - Set set = new HashSet<>(master); - set.removeIf(other::contains); - return set; - } - /** * 差集 */ From 2fec4c3510de1e60b69ca327066b2e49f1d38d0b Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 28 Jan 2021 16:23:39 +0800 Subject: [PATCH 111/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 6 +-- .../base/struct/http/HttpClientReceiver.java | 22 +++++--- .../base/struct/http/HttpClientSender.java | 52 ++++++++++--------- .../base/struct/http/SenderHandler.java | 2 + 4 files changed, 47 insertions(+), 35 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 3b4245b..e98d660 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -1,6 +1,7 @@ package develop.toolkit.base.components; import develop.toolkit.base.struct.http.HttpClientSender; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.net.http.HttpClient; @@ -12,14 +13,11 @@ * @author qiushui on 2020-09-10. */ @Slf4j +@RequiredArgsConstructor public final class HttpClientHelper { private final HttpClient httpClient; - public HttpClientHelper(HttpClient httpClient) { - this.httpClient = httpClient; - } - public HttpClientHelper(Duration connectTimeout) { this.httpClient = HttpClient .newBuilder() diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java index e6028be..d59bd85 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -1,8 +1,8 @@ package develop.toolkit.base.struct.http; import develop.toolkit.base.utils.IOAdvice; -import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import java.io.IOException; @@ -19,23 +19,31 @@ * @author qiushui on 2020-09-10. */ @Getter -@AllArgsConstructor +@Setter public final class HttpClientReceiver { - private final int httpStatus; + private int httpStatus; - private final Map> headers; + private Map> headers; - private final T body; + private T body; - private final long costTime; + private long costTime; + + private boolean connectTimeout; + + private boolean readTimeout; public String getHeader(String header) { return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); } + public boolean isTimeout() { + return connectTimeout || readTimeout; + } + public boolean isSuccess() { - return httpStatus >= 200 && httpStatus < 300; + return !isTimeout() && httpStatus >= 200 && httpStatus < 300; } public void save(Path path, OpenOption... openOptions) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index ddbfa7e..c1d65a5 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -8,9 +8,7 @@ import java.io.IOException; import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; +import java.net.http.*; import java.nio.file.OpenOption; import java.nio.file.Path; import java.time.Duration; @@ -142,8 +140,7 @@ public void download(Path path, OpenOption... openOptions) throws IOException { } public void downloadQuietly(Path path, OpenOption... openOptions) { - sendQuietly(HttpResponse.BodyHandlers::ofByteArray) - .ifPresent(receiver -> receiver.save(path, openOptions)); + sendQuietly(HttpResponse.BodyHandlers::ofByteArray).ifPresent(receiver -> receiver.save(path, openOptions)); } public HttpClientReceiver send() throws IOException { @@ -151,12 +148,7 @@ public HttpClientReceiver send() throws IOException { } public Optional> sendQuietly() { - try { - return Optional.of(send(new StringBodySenderHandler())); - } catch (IOException e) { - e.printStackTrace(); - return Optional.empty(); - } + return sendQuietly(new StringBodySenderHandler()); } public Optional> sendQuietly(SenderHandler senderHandler) { @@ -168,6 +160,14 @@ public Optional> sendQuietly(SenderHandler } } + /** + * 核心发送逻辑 + * + * @param senderHandler 发送器扩展逻辑 + * @param 响应内容 + * @return receiver + * @throws IOException IO异常 + */ public HttpClientReceiver send(SenderHandler senderHandler) throws IOException { final HttpRequest.Builder builder = HttpRequest .newBuilder() @@ -178,21 +178,22 @@ public HttpClientReceiver send(SenderHandler senderHandler) t .method(method, requestBody == null ? HttpRequest.BodyPublishers.noBody() : senderHandler.bodyPublisher(requestBody)) .timeout(readTimeout) .build(); - HttpClientReceiver receiver = null; + final HttpClientReceiver receiver = new HttpClientReceiver<>(); try { Instant start = Instant.now(); HttpResponse response = httpClient.send(request, senderHandler.bodyHandler()); - Instant end = Instant.now(); - receiver = new HttpClientReceiver<>( - response.statusCode(), - response.headers().map(), - response.body(), - start.until(end, ChronoUnit.MILLIS) - ); + receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); + receiver.setHttpStatus(response.statusCode()); + receiver.setHeaders(response.headers().map()); + receiver.setBody(response.body()); } catch (InterruptedException e) { throw new RuntimeException(e); + } catch (HttpConnectTimeoutException e) { + receiver.setConnectTimeout(true); + } catch (HttpTimeoutException e) { + receiver.setReadTimeout(true); } finally { - if (log.isDebugEnabled() && (!onlyPrintFailed || receiver == null || !receiver.isSuccess())) { + if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { printDebug(request, receiver); } } @@ -221,10 +222,13 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver) { .headers() .map() .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); - sb.append(" body: ").append(printBody(requestBody)).append("\n"); - if (receiver != null) { - sb - .append("\nhttp response:\n status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); + sb.append(" body: ").append(printBody(requestBody)).append("\n").append("\nhttp response:\n"); + if (receiver.isConnectTimeout()) { + sb.append(" (connect timeout ").append(httpClient.connectTimeout().map(Duration::getSeconds).orElse(0L)).append("s)\n"); + } else if (receiver.isReadTimeout()) { + sb.append(" (read timeout ").append(readTimeout).append("s)\n"); + } else { + sb.append(" status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); for (Map.Entry> entry : receiver.getHeaders().entrySet()) { sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java index 850bec0..8a03516 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java @@ -4,6 +4,8 @@ import java.net.http.HttpResponse; /** + * 发送器扩展逻辑 + * * @author qiushui on 2020-09-11. */ @FunctionalInterface From 1acfe87eafaca4ab9b925ee75dc725cea340729b Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 28 Jan 2021 17:02:48 +0800 Subject: [PATCH 112/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/HttpClientReceiver.java | 11 +++++- .../base/struct/http/HttpClientSender.java | 35 ++++++------------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java index d59bd85..f03e65c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientReceiver.java @@ -12,6 +12,7 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.function.Consumer; /** * Http接收器 @@ -34,6 +35,8 @@ public final class HttpClientReceiver { private boolean readTimeout; + private String errorMessage; + public String getHeader(String header) { return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); } @@ -43,7 +46,13 @@ public boolean isTimeout() { } public boolean isSuccess() { - return !isTimeout() && httpStatus >= 200 && httpStatus < 300; + return errorMessage == null && !isTimeout() && httpStatus >= 200 && httpStatus < 300; + } + + public void ifSuccess(Consumer> consumer) { + if (isSuccess()) { + consumer.accept(this); + } } public void save(Path path, OpenOption... openOptions) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index c1d65a5..19b727f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -17,7 +17,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; /** * Http发送器 @@ -135,40 +134,22 @@ public HttpClientSender bodyBytes(byte[] bytes) { return this; } - public void download(Path path, OpenOption... openOptions) throws IOException { - send(HttpResponse.BodyHandlers::ofByteArray).save(path, openOptions); + public void download(Path path, OpenOption... openOptions) { + send(HttpResponse.BodyHandlers::ofByteArray).ifSuccess(r -> r.save(path, openOptions)); } - public void downloadQuietly(Path path, OpenOption... openOptions) { - sendQuietly(HttpResponse.BodyHandlers::ofByteArray).ifPresent(receiver -> receiver.save(path, openOptions)); - } - - public HttpClientReceiver send() throws IOException { + public HttpClientReceiver send() { return send(new StringBodySenderHandler()); } - public Optional> sendQuietly() { - return sendQuietly(new StringBodySenderHandler()); - } - - public Optional> sendQuietly(SenderHandler senderHandler) { - try { - return Optional.of(send(senderHandler)); - } catch (IOException e) { - e.printStackTrace(); - return Optional.empty(); - } - } - /** * 核心发送逻辑 * * @param senderHandler 发送器扩展逻辑 * @param 响应内容 * @return receiver - * @throws IOException IO异常 */ - public HttpClientReceiver send(SenderHandler senderHandler) throws IOException { + public HttpClientReceiver send(SenderHandler senderHandler) { final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(httpClient.version()) @@ -192,6 +173,8 @@ public HttpClientReceiver send(SenderHandler senderHandler) t receiver.setConnectTimeout(true); } catch (HttpTimeoutException e) { receiver.setReadTimeout(true); + } catch (IOException e) { + receiver.setErrorMessage(e.getMessage()); } finally { if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { printDebug(request, receiver); @@ -224,9 +207,11 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver) { .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); sb.append(" body: ").append(printBody(requestBody)).append("\n").append("\nhttp response:\n"); if (receiver.isConnectTimeout()) { - sb.append(" (connect timeout ").append(httpClient.connectTimeout().map(Duration::getSeconds).orElse(0L)).append("s)\n"); + sb.append(" (connect timeout ").append(httpClient.connectTimeout().map(Duration::getSeconds).orElse(0L)).append("s)"); } else if (receiver.isReadTimeout()) { - sb.append(" (read timeout ").append(readTimeout).append("s)\n"); + sb.append(" (read timeout ").append(readTimeout).append("s)"); + } else if (receiver.getErrorMessage() != null) { + sb.append(" (ioerror ").append(receiver.getErrorMessage()).append(")"); } else { sb.append(" status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); for (Map.Entry> entry : receiver.getHeaders().entrySet()) { From ac7aa65eba9043585db9bc8ea520332a6f850ea6 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 29 Jan 2021 09:06:50 +0800 Subject: [PATCH 113/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/HttpClientHelper.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index e98d660..1d5905e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -2,6 +2,7 @@ import develop.toolkit.base.struct.http.HttpClientSender; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import java.net.http.HttpClient; @@ -18,6 +19,9 @@ public final class HttpClientHelper { private final HttpClient httpClient; + @Setter + private boolean onlyPrintFailed = true; + public HttpClientHelper(Duration connectTimeout) { this.httpClient = HttpClient .newBuilder() @@ -32,22 +36,22 @@ public HttpClientHelper() { } public HttpClientSender get(String url) { - return new HttpClientSender(httpClient, "GET", url); + return new HttpClientSender(httpClient, "GET", url).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender post(String url) { - return new HttpClientSender(httpClient, "POST", url); + return new HttpClientSender(httpClient, "POST", url).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender put(String url) { - return new HttpClientSender(httpClient, "PUT", url); + return new HttpClientSender(httpClient, "PUT", url).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender delete(String url) { - return new HttpClientSender(httpClient, "DELETE", url); + return new HttpClientSender(httpClient, "DELETE", url).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender request(String method, String url) { - return new HttpClientSender(httpClient, method, url); + return new HttpClientSender(httpClient, method, url).onlyPrintFailed(onlyPrintFailed); } } From d692836f93e3fbbc0d95f315b070c8d242a0709c Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 4 Feb 2021 15:14:45 +0800 Subject: [PATCH 114/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/struct/http/HttpClientSender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 19b727f..7cca72a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -209,7 +209,7 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver) { if (receiver.isConnectTimeout()) { sb.append(" (connect timeout ").append(httpClient.connectTimeout().map(Duration::getSeconds).orElse(0L)).append("s)"); } else if (receiver.isReadTimeout()) { - sb.append(" (read timeout ").append(readTimeout).append("s)"); + sb.append(" (read timeout ").append(readTimeout.getSeconds()).append("s)"); } else if (receiver.getErrorMessage() != null) { sb.append(" (ioerror ").append(receiver.getErrorMessage()).append(")"); } else { From d946964d36f97c4ea040c0fd2e5fd1263345290b Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 7 Feb 2021 17:29:49 +0800 Subject: [PATCH 115/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/SortAdvice.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/SortAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/SortAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/SortAdvice.java new file mode 100644 index 0000000..7e4388d --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/SortAdvice.java @@ -0,0 +1,78 @@ +package develop.toolkit.base.utils; + +/** + * 排序算法 + * + * @author qiushui on 2021-02-07. + */ +public abstract class SortAdvice { + + /** + * 快速排序 + * + * @param array 数组 + * @param 数组类型 + */ + public static > void quickSort(T[] array) { + if (array == null || array.length < 2) return; + quickSortRecursive(array, 0, array.length - 1); + } + + /** + * 快速排序递归 + *

+ * 以第一个元素作为基准值 + * 从左往右找出第一个大于基准值的元素 和 从右往左找出第一个小于基准值的元素 交换 + * 划分出的两个区间继续用该方法交换,直到每个区间只有单个元素 + * + * @param array 数组 + * @param start 开始区间 + * @param end 结束区间 + * @param 数组类型 + */ + private static > void quickSortRecursive(T[] array, int start, int end) { + if (start >= end) return; + int l = start, r = end; + // 基准值 + final T standard = array[start]; + while (l != r) { + // 从左边找大于基准值 + while (l < end && array[l].compareTo(standard) < 0) l++; + // 从右边找小于基准值 + while (start < r && array[r].compareTo(standard) > 0) r--; + // 交换值 + T t = array[l]; + array[l] = array[r]; + array[r] = t; + } + // 分成两份继续递归 + quickSortRecursive(array, 0, l - 1); + quickSortRecursive(array, l + 1, end); + } + + /** + * 选择排序 + *

+ * 从左往右依次遍历 + * 每次选出剩余数组里最小的值,与当前值替换 + * + * @param array 数组 + * @param 数组类型 + */ + public static > void selectSort(T[] array) { + if (array == null || array.length < 2) return; + for (int i = 0; i < array.length; i++) { + int minIndex = i; + for (int j = i + 1; j < array.length; j++) { + if (array[j].compareTo(array[minIndex]) < 0) { + minIndex = j; + } + } + if (i != minIndex) { + T t = array[i]; + array[i] = array[minIndex]; + array[minIndex] = t; + } + } + } +} From ffcec266054c011278c0ad1c44b9c3c351ab71d7 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 24 Feb 2021 10:29:45 +0800 Subject: [PATCH 116/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/pom.xml b/pom.xml index d950082..0806ab3 100644 --- a/pom.xml +++ b/pom.xml @@ -155,18 +155,6 @@ - - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ - - - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-releases/ - - - release From d98a7caa2cba9629e4237f0449ba241a09e27713 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 24 Feb 2021 10:30:42 +0800 Subject: [PATCH 117/178] [maven-release-plugin] prepare release v1.0.5 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 1d44102..c6a9924 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.5-SNAPSHOT + 1.0.5 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index e6d25d6..132edc3 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.5-SNAPSHOT + 1.0.5 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index 24582bc..990865c 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.5-SNAPSHOT + 1.0.5 4.0.0 diff --git a/pom.xml b/pom.xml index 0806ab3..b3d8ef6 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.5-SNAPSHOT + 1.0.5 开发工具箱 2018 Develop Toolkit @@ -29,17 +29,17 @@ com.github.developframework develop-toolkit-base - 1.0.5-SNAPSHOT + 1.0.5 com.github.developframework develop-toolkit-db - 1.0.5-SNAPSHOT + 1.0.5 com.github.developframework develop-toolkit-world - 1.0.5-SNAPSHOT + 1.0.5 org.projectlombok @@ -94,7 +94,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.5 From d11c57de52c17e7ca0c3d3cd5d8e40a668baa11b Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 24 Feb 2021 10:30:57 +0800 Subject: [PATCH 118/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index c6a9924..6e5c7cc 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.5 + 1.0.6-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 132edc3..181e4c8 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.5 + 1.0.6-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index 990865c..79ec887 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.5 + 1.0.6-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index b3d8ef6..cc5b35a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.5 + 1.0.6-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -29,17 +29,17 @@ com.github.developframework develop-toolkit-base - 1.0.5 + 1.0.6-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.5 + 1.0.6-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.5 + 1.0.6-SNAPSHOT org.projectlombok @@ -94,7 +94,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.5 + HEAD From 38880eee097b1de600dbca54ba2fc5046e86eab0 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 15 Mar 2021 13:37:43 +0800 Subject: [PATCH 119/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/JacksonAdvice.java | 12 ++++++++---- pom.xml | 12 ++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 4cfc3b4..eacb5b4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -124,10 +124,14 @@ private static JsonNode parseExpressionToJsonNode(JsonNode jsonNode, Expression } private static JsonNode existsJsonNode(JsonNode parentNode, String propertyName) { - final JsonNode node = parentNode.get(propertyName); - if (node == null) { - throw new IllegalArgumentException("Not found node \"" + propertyName + "\""); + if (propertyName.isEmpty() && parentNode.isArray()) { + return parentNode; + } else { + final JsonNode node = parentNode.get(propertyName); + if (node == null) { + throw new IllegalArgumentException("Not found node \"" + propertyName + "\""); + } + return node; } - return node; } } diff --git a/pom.xml b/pom.xml index cc5b35a..455d0ed 100644 --- a/pom.xml +++ b/pom.xml @@ -155,6 +155,18 @@ + + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ + + + hclc nexus + http://nexus.hclc-tech.com:8081/repository/maven-releases/ + + + release From a92d8cf523fb2382ea086ae8d8676e2c555357e9 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 15 Mar 2021 17:19:52 +0800 Subject: [PATCH 120/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/FileAdvice.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java new file mode 100644 index 0000000..b5482e3 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java @@ -0,0 +1,31 @@ +package develop.toolkit.base.utils; + +import java.io.File; +import java.io.FileFilter; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * @author qiushui on 2021-03-15. + */ +public abstract class FileAdvice { + + public static List files(File dir, FileFilter filter) { + if (dir.isFile()) { + return Collections.emptyList(); + } + List files = new LinkedList<>(); + recursiveFiles(dir, filter, files); + return Collections.unmodifiableList(files); + } + + private static void recursiveFiles(File dir, FileFilter filter, List files) { + if (dir.isDirectory()) { + final File[] subFiles = dir.listFiles(filter); + if (subFiles != null && subFiles.length > 0) { + files.addAll(List.of(subFiles)); + } + } + } +} From f2e251107cc3d17c47a4f02677d4c24b1e48645f Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 16 Mar 2021 17:55:08 +0800 Subject: [PATCH 121/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/FileAdvice.java | 68 ++++++++++++++++--- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java index b5482e3..6cf2f9f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java @@ -1,30 +1,78 @@ package develop.toolkit.base.utils; -import java.io.File; -import java.io.FileFilter; +import lombok.SneakyThrows; + +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Stack; +import java.util.function.Predicate; /** * @author qiushui on 2021-03-15. */ public abstract class FileAdvice { - public static List files(File dir, FileFilter filter) { + /** + * 打开缓冲写 + */ + public static BufferedWriter open(File file, boolean append) throws IOException { + return new BufferedWriter( + new OutputStreamWriter( + new FileOutputStream(file, append), + StandardCharsets.UTF_8 + ) + ); + } + + @SneakyThrows(IOException.class) + public static void write(File file, String text, boolean append) { + if (file.exists() || file.getParentFile().mkdirs()) { + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file, append), StandardCharsets.UTF_8)) { + writer.write(text); + } + } + } + + @SneakyThrows(IOException.class) + public static void write(File file, List lines, boolean append) { + if (file.exists() || file.getParentFile().mkdirs()) { + try (BufferedWriter writer = open(file, append)) { + for (String line : lines) { + writer.write(line); + writer.newLine(); + } + } + } + } + + /** + * 遍历目录 找到所有满足条件的文件 + */ + public static List files(File dir, Predicate predicate) { if (dir.isFile()) { return Collections.emptyList(); } List files = new LinkedList<>(); - recursiveFiles(dir, filter, files); - return Collections.unmodifiableList(files); + Stack stack = new Stack<>(); + stack.push(dir); + do { + eachFiles(stack.pop(), stack, files, predicate); + } while (!stack.empty()); + return List.copyOf(files); } - private static void recursiveFiles(File dir, FileFilter filter, List files) { - if (dir.isDirectory()) { - final File[] subFiles = dir.listFiles(filter); - if (subFiles != null && subFiles.length > 0) { - files.addAll(List.of(subFiles)); + private static void eachFiles(File dir, Stack stack, List files, Predicate predicate) { + final File[] listFiles = dir.listFiles(); + if (listFiles != null) { + for (File file : listFiles) { + if (file.isDirectory()) { + stack.push(file); + } else if (predicate.test(file)) { + files.add(file); + } } } } From 95d6565d1dc803e2c1bc4b29ead24c2794108ad6 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 16 Apr 2021 17:13:47 +0800 Subject: [PATCH 122/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 455d0ed..81f36c0 100644 --- a/pom.xml +++ b/pom.xml @@ -158,12 +158,12 @@ - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-snapshots/ + hclc aliyun nexus + http://nexus.hclcaliyun.com:8082/repository/maven-snapshots/ - hclc nexus - http://nexus.hclc-tech.com:8081/repository/maven-releases/ + hclc aliyun nexus + http://nexus.hclcaliyun.com:8082/repository/maven-releases/ From 59414ab37b7afb822729e7d199c70f07d1f57287 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 23 Apr 2021 17:22:55 +0800 Subject: [PATCH 123/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/CryptAdvice.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java new file mode 100644 index 0000000..70a4870 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java @@ -0,0 +1,39 @@ +package develop.toolkit.base.utils; + +import lombok.SneakyThrows; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.util.Base64; + +/** + * @author qiushui on 2021-04-23. + */ +public abstract class CryptAdvice { + + public static String encryptDES(String original, String secretKey) { + final byte[] data = initCipher(original.getBytes(StandardCharsets.UTF_8), secretKey, Cipher.ENCRYPT_MODE); + return Base64.getEncoder().encodeToString(data); + } + + public static String decryptDES(String cryptograph, String secretKey) { + final byte[] data = Base64.getDecoder().decode(cryptograph); + return new String(initCipher(data, secretKey, Cipher.DECRYPT_MODE), StandardCharsets.UTF_8); + } + + @SneakyThrows(Exception.class) + private static byte[] initCipher(byte[] data, String secretKey, int mode) { + final String algorithm = "DES"; + SecureRandom random = new SecureRandom(); + DESKeySpec dks = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8)); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); + SecretKey secureKey = keyFactory.generateSecret(dks); + Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); + cipher.init(mode, secureKey, random); + return cipher.doFinal(data); + } +} From 7fbd5a4e504b5412092c92f63f639c23b476d835 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 7 May 2021 17:16:13 +0800 Subject: [PATCH 124/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 1d5905e..7015cfb 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -5,7 +5,12 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import java.io.InputStream; import java.net.http.HttpClient; +import java.security.KeyStore; +import java.security.SecureRandom; import java.time.Duration; /** @@ -31,6 +36,27 @@ public HttpClientHelper(Duration connectTimeout) { .build(); } + public HttpClientHelper(Duration connectTimeout, String password, InputStream pkcs12) { + try { + KeyStore ks = KeyStore.getInstance("PKCS12"); + char[] passwordChar = password.toCharArray(); + ks.load(pkcs12, passwordChar); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(ks, passwordChar); + SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); + this.httpClient = HttpClient + .newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .connectTimeout(Duration.ofSeconds(5L)) + .followRedirects(HttpClient.Redirect.NEVER) + .sslContext(sslContext) + .build(); + } catch (Exception e) { + throw new RuntimeException("read pkcs12 failed"); + } + } + public HttpClientHelper() { this(Duration.ofSeconds(5L)); } From eec4e98af20a6412994466ebde202c68b8f7095e Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 8 May 2021 17:05:25 +0800 Subject: [PATCH 125/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/struct/http/HttpClientSender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 7cca72a..1c3cac6 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -212,7 +212,7 @@ private void printDebug(HttpRequest request, HttpClientReceiver receiver) { sb.append(" (read timeout ").append(readTimeout.getSeconds()).append("s)"); } else if (receiver.getErrorMessage() != null) { sb.append(" (ioerror ").append(receiver.getErrorMessage()).append(")"); - } else { + } else if (receiver.getHeaders() != null) { sb.append(" status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); for (Map.Entry> entry : receiver.getHeaders().entrySet()) { sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); From 3cf07e368bddfb9c5e7c72715bc4241a0c4f2a58 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 11 May 2021 14:00:47 +0800 Subject: [PATCH 126/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/HttpClientSender.java | 1 + .../struct/http/MultiPartFormDataBody.java | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 1c3cac6..1afa9bc 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -174,6 +174,7 @@ public HttpClientReceiver send(SenderHandler senderHandler) { } catch (HttpTimeoutException e) { receiver.setReadTimeout(true); } catch (IOException e) { + e.printStackTrace(); receiver.setErrorMessage(e.getMessage()); } finally { if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index bbd0bd3..6a3e855 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -3,6 +3,7 @@ import lombok.Getter; import org.apache.commons.lang3.RandomStringUtils; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; @@ -52,11 +53,13 @@ public MultiPartFormDataBody addPart(String name, Path path) { return this; } - public MultiPartFormDataBody addPart(String name, byte[] bytes) { + public MultiPartFormDataBody addPart(String name, String filename, String contentType, byte[] bytes) { PartsSpecification newPart = new PartsSpecification(); - newPart.type = PartsSpecification.Type.FILE; + newPart.type = PartsSpecification.Type.BYTES; newPart.name = name; newPart.bytes = bytes; + newPart.filename = filename; + newPart.contentType = contentType; partsSpecificationList.add(newPart); return this; } @@ -144,13 +147,15 @@ private byte[] computeNext() throws IOException { return nextPart.value.getBytes(StandardCharsets.UTF_8); } case BYTES: { - return nextPart.bytes; + filename = nextPart.filename; + contentType = nextPart.contentType; + currentFileInput = new ByteArrayInputStream(nextPart.bytes); } + break; case FILE: { - Path path = nextPart.path; - filename = path.getFileName().toString(); - contentType = Files.probeContentType(path); - currentFileInput = Files.newInputStream(path); + filename = nextPart.path.getFileName().toString(); + contentType = Files.probeContentType(nextPart.path); + currentFileInput = Files.newInputStream(nextPart.path); } break; case STREAM: { From 9cca7abdc18394fd90a85e5ac4829c38dc28f912 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 11 May 2021 18:06:07 +0800 Subject: [PATCH 127/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/http/MultiPartFormDataBody.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index 6a3e855..8d1ee0e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -15,7 +15,6 @@ import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; -import java.util.function.Supplier; /** * @author qiushui on 2020-09-14. @@ -64,7 +63,7 @@ public MultiPartFormDataBody addPart(String name, String filename, String conten return this; } - public MultiPartFormDataBody addPart(String name, String filename, String contentType, Supplier stream) { + public MultiPartFormDataBody addPart(String name, String filename, String contentType, InputStream stream) { PartsSpecification newPart = new PartsSpecification(); newPart.type = PartsSpecification.Type.STREAM; newPart.name = name; @@ -93,7 +92,7 @@ public enum Type { public String value; public Path path; public byte[] bytes; - public Supplier stream; + public InputStream stream; public String filename; public String contentType; @@ -161,7 +160,7 @@ private byte[] computeNext() throws IOException { case STREAM: { filename = nextPart.filename; contentType = nextPart.contentType; - currentFileInput = nextPart.stream.get(); + currentFileInput = nextPart.stream; } break; } From 7bd4b0450db63d927df3809036abd8f9e927b876 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 12 May 2021 18:15:55 +0800 Subject: [PATCH 128/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../struct/http/MultiPartFormDataBody.java | 134 +++++++++--------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index 8d1ee0e..066e0ac 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -14,7 +14,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.NoSuchElementException; +import java.util.function.Supplier; /** * @author qiushui on 2020-09-14. @@ -63,7 +63,7 @@ public MultiPartFormDataBody addPart(String name, String filename, String conten return this; } - public MultiPartFormDataBody addPart(String name, String filename, String contentType, InputStream stream) { + public MultiPartFormDataBody addPart(String name, String filename, String contentType, Supplier stream) { PartsSpecification newPart = new PartsSpecification(); newPart.type = PartsSpecification.Type.STREAM; newPart.name = name; @@ -81,7 +81,7 @@ private void addFinalBoundaryPart() { partsSpecificationList.add(newPart); } - static class PartsSpecification { + private static class PartsSpecification { public enum Type { STRING, FILE, BYTES, STREAM, FINAL_BOUNDARY @@ -92,95 +92,98 @@ public enum Type { public String value; public Path path; public byte[] bytes; - public InputStream stream; + public Supplier stream; public String filename; public String contentType; } - class PartsIterator implements Iterator { + private class PartsIterator implements Iterator { private final Iterator iterator = partsSpecificationList.iterator(); - private InputStream currentFileInput; - private boolean done; - private byte[] next; + private InputStream currentInputStream; + + private byte[] nextBytes; private static final String NEW_LINE = "\r\n"; @Override public boolean hasNext() { - if (done) return false; - if (next != null) return true; try { - next = computeNext(); + nextBytes = currentInputStream == null ? determineNextPart() : readCurrentInputStream(); + return nextBytes != null; } catch (IOException e) { throw new UncheckedIOException(e); } - if (next == null) { - done = true; - return false; - } - return true; } @Override public byte[] next() { - if (!hasNext()) throw new NoSuchElementException(); - byte[] res = next; - next = null; - return res; + byte[] result = nextBytes; + System.out.println(result.length); + nextBytes = null; + return result; } - private byte[] computeNext() throws IOException { - if (currentFileInput == null) { - if (!iterator.hasNext()) return null; - PartsSpecification nextPart = iterator.next(); - String filename = null; - String contentType = "application/octet-stream"; - switch (nextPart.type) { - case STRING: { - return headerBytes(nextPart.name, nextPart.value, null, "text/plain; charset=UTF-8"); - } - case FINAL_BOUNDARY: { - return nextPart.value.getBytes(StandardCharsets.UTF_8); - } - case BYTES: { - filename = nextPart.filename; - contentType = nextPart.contentType; - currentFileInput = new ByteArrayInputStream(nextPart.bytes); - } - break; - case FILE: { - filename = nextPart.path.getFileName().toString(); - contentType = Files.probeContentType(nextPart.path); - currentFileInput = Files.newInputStream(nextPart.path); - } - break; - case STREAM: { - filename = nextPart.filename; - contentType = nextPart.contentType; - currentFileInput = nextPart.stream; - } - break; + /** + * 决定下一个Part + */ + private byte[] determineNextPart() throws IOException { + if (!iterator.hasNext()) return null; + final PartsSpecification nextPart = iterator.next(); + switch (nextPart.type) { + case FINAL_BOUNDARY: { + return nextPart.value.getBytes(StandardCharsets.UTF_8); } - return headerBytes(nextPart.name, null, filename, contentType); - } else { - byte[] buf = new byte[8192]; - int r = currentFileInput.read(buf); - if (r > 0) { - byte[] actualBytes = new byte[r]; - System.arraycopy(buf, 0, actualBytes, 0, r); - return actualBytes; - } else { - currentFileInput.close(); - currentFileInput = null; - return NEW_LINE.getBytes(); + case STRING: { + currentInputStream = new ByteArrayInputStream((nextPart.value).getBytes(StandardCharsets.UTF_8)); + return headerBytes(nextPart.name, null, "text/plain; charset=UTF-8"); + } + case BYTES: { + currentInputStream = new ByteArrayInputStream(nextPart.bytes); + return headerBytes( + nextPart.name, + nextPart.filename, + nextPart.contentType + ); + } + case FILE: { + currentInputStream = Files.newInputStream(nextPart.path); + return headerBytes( + nextPart.name, + nextPart.path.getFileName().toString(), + Files.probeContentType(nextPart.path) + ); + } + case STREAM: { + currentInputStream = nextPart.stream.get(); + return headerBytes( + nextPart.name, + nextPart.filename, + nextPart.contentType + ); } + default: + throw new AssertionError(); } } - private byte[] headerBytes(String name, String value, String filename, String contentType) { + private byte[] readCurrentInputStream() throws IOException { + byte[] buffer = new byte[8192]; + int r = currentInputStream.read(buffer); + if (r > 0) { + byte[] actualBytes = new byte[r]; + System.arraycopy(buffer, 0, actualBytes, 0, r); + return actualBytes; + } else { + currentInputStream.close(); + currentInputStream = null; + return NEW_LINE.getBytes(); + } + } + + private byte[] headerBytes(String name, String filename, String contentType) { StringBuilder sb = new StringBuilder("--") .append(boundary).append(NEW_LINE) .append("Content-Disposition: form-data; name=").append(name); @@ -188,9 +191,6 @@ private byte[] headerBytes(String name, String value, String filename, String co sb.append("; filename=").append(filename); } sb.append(NEW_LINE).append("Content-Type: ").append(contentType).append(NEW_LINE).append(NEW_LINE); - if (value != null) { - sb.append(value).append(NEW_LINE); - } return sb.toString().getBytes(StandardCharsets.UTF_8); } } From cdb24f4ce06827b38264cb505fffc576aad365ae Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 13 May 2021 10:31:46 +0800 Subject: [PATCH 129/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/http/HttpClientSender.java | 4 +-- .../struct/http/MultiPartFormDataBody.java | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 1afa9bc..2c8b614 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -189,10 +189,8 @@ private String printBody(Object body) { return "(No content)"; } else if (body instanceof String) { return (String) body; - } else if (body.getClass().isArray()) { - return "(Bytes data)"; } else { - return "(Unknown data)"; + return "(Binary byte data)"; } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index 066e0ac..24b1c34 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -28,10 +28,17 @@ public class MultiPartFormDataBody { public HttpRequest.BodyPublisher buildBodyPublisher() { if (partsSpecificationList.isEmpty()) { - throw new IllegalStateException("Must have at least one part to build multipart message."); + return HttpRequest.BodyPublishers.noBody(); } addFinalBoundaryPart(); - return HttpRequest.BodyPublishers.ofByteArrays(PartsIterator::new); + + /* + * 直接使用迭代器获取字节数据会报错 Too few bytes returned by the publisher + * JDK的bug 参考 https://bugs.openjdk.java.net/browse/JDK-8222968 + */ + // return HttpRequest.BodyPublishers.ofByteArrays(PartsIterator::new); + final byte[] data = assemble(); + return HttpRequest.BodyPublishers.ofByteArray(data); } public MultiPartFormDataBody addPart(String name, String value) { @@ -121,7 +128,6 @@ public boolean hasNext() { @Override public byte[] next() { byte[] result = nextBytes; - System.out.println(result.length); nextBytes = null; return result; } @@ -194,4 +200,21 @@ private byte[] headerBytes(String name, String filename, String contentType) { return sb.toString().getBytes(StandardCharsets.UTF_8); } } + + private byte[] assemble() { + // 使用以下方法 自己拼装byte[] + int length = 0, pos = 0; + PartsIterator iteratorForCount = new PartsIterator(); + while (iteratorForCount.hasNext()) { + length += iteratorForCount.next().length; + } + byte[] data = new byte[length]; + PartsIterator iteratorForBytes = new PartsIterator(); + while (iteratorForBytes.hasNext()) { + final byte[] nextBytes = iteratorForBytes.next(); + System.arraycopy(nextBytes, 0, data, pos, nextBytes.length); + pos += nextBytes.length; + } + return data; + } } From 85d70466a04b6b758add6f2a859507c7dbce8e61 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 13 May 2021 10:32:31 +0800 Subject: [PATCH 130/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/components/HttpClientHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 7015cfb..254a8c7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -48,7 +48,7 @@ public HttpClientHelper(Duration connectTimeout, String password, InputStream pk this.httpClient = HttpClient .newBuilder() .version(HttpClient.Version.HTTP_1_1) - .connectTimeout(Duration.ofSeconds(5L)) + .connectTimeout(connectTimeout) .followRedirects(HttpClient.Redirect.NEVER) .sslContext(sslContext) .build(); From c9e4e05c0e407e36e2e3e020e18176a2ce247634 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 13 May 2021 16:47:03 +0800 Subject: [PATCH 131/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/components/HttpClientHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 254a8c7..d8a5da9 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -53,7 +53,7 @@ public HttpClientHelper(Duration connectTimeout, String password, InputStream pk .sslContext(sslContext) .build(); } catch (Exception e) { - throw new RuntimeException("read pkcs12 failed"); + throw new RuntimeException("read pkcs12 failed:" + e.getMessage()); } } From 384cdbfdd44027476972509e5baaea58d6f26737 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 17 May 2021 15:46:18 +0800 Subject: [PATCH 132/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 108 ++++++++++++------ .../base/struct/http/HttpClientSender.java | 4 +- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index d8a5da9..87a63df 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -1,13 +1,16 @@ package develop.toolkit.base.components; import develop.toolkit.base.struct.http.HttpClientSender; +import develop.toolkit.base.utils.K; +import lombok.AccessLevel; import lombok.RequiredArgsConstructor; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import java.io.InputStream; +import java.net.InetSocketAddress; +import java.net.ProxySelector; import java.net.http.HttpClient; import java.security.KeyStore; import java.security.SecureRandom; @@ -19,65 +22,94 @@ * @author qiushui on 2020-09-10. */ @Slf4j -@RequiredArgsConstructor +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) public final class HttpClientHelper { private final HttpClient httpClient; - @Setter - private boolean onlyPrintFailed = true; + private final boolean onlyPrintFailed; - public HttpClientHelper(Duration connectTimeout) { - this.httpClient = HttpClient - .newBuilder() - .version(HttpClient.Version.HTTP_1_1) - .connectTimeout(connectTimeout) - .followRedirects(HttpClient.Redirect.NEVER) - .build(); + public static Builder builder() { + return new Builder(); } - public HttpClientHelper(Duration connectTimeout, String password, InputStream pkcs12) { - try { - KeyStore ks = KeyStore.getInstance("PKCS12"); - char[] passwordChar = password.toCharArray(); - ks.load(pkcs12, passwordChar); - KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - kmf.init(ks, passwordChar); - SSLContext sslContext = SSLContext.getInstance("SSL"); - sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); - this.httpClient = HttpClient - .newBuilder() - .version(HttpClient.Version.HTTP_1_1) - .connectTimeout(connectTimeout) - .followRedirects(HttpClient.Redirect.NEVER) - .sslContext(sslContext) - .build(); - } catch (Exception e) { - throw new RuntimeException("read pkcs12 failed:" + e.getMessage()); - } + public static HttpClientHelper buildDefault() { + return builder().build(); } - public HttpClientHelper() { - this(Duration.ofSeconds(5L)); + public HttpClientSender request(String method, String url) { + return new HttpClientSender(httpClient, method, url).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender get(String url) { - return new HttpClientSender(httpClient, "GET", url).onlyPrintFailed(onlyPrintFailed); + return request("GET", url); } public HttpClientSender post(String url) { - return new HttpClientSender(httpClient, "POST", url).onlyPrintFailed(onlyPrintFailed); + return request("POST", url); } public HttpClientSender put(String url) { - return new HttpClientSender(httpClient, "PUT", url).onlyPrintFailed(onlyPrintFailed); + return request("PUT", url); } public HttpClientSender delete(String url) { - return new HttpClientSender(httpClient, "DELETE", url).onlyPrintFailed(onlyPrintFailed); + return request("DELETE", url); } - public HttpClientSender request(String method, String url) { - return new HttpClientSender(httpClient, method, url).onlyPrintFailed(onlyPrintFailed); + public static class Builder { + + private boolean onlyPrintFailed = true; + + private SSLContext sslContext; + + private Duration connectTimeout; + + private InetSocketAddress proxyAddress; + + public Builder onlyPrintFailed(boolean onlyPrintFailed) { + this.onlyPrintFailed = onlyPrintFailed; + return this; + } + + public Builder connectTimeout(Duration connectTimeout) { + this.connectTimeout = connectTimeout; + return this; + } + + public Builder proxyAddress(InetSocketAddress proxyAddress) { + this.proxyAddress = proxyAddress; + return this; + } + + public Builder ssl(InputStream pkcs12, String password) { + try { + KeyStore ks = KeyStore.getInstance("PKCS12"); + char[] passwordChar = password.toCharArray(); + ks.load(pkcs12, passwordChar); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(ks, passwordChar); + sslContext = SSLContext.getInstance("SSL"); + sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); + } catch (Exception e) { + throw new RuntimeException("read pkcs12 failed:" + e.getMessage()); + } + return this; + } + + public HttpClientHelper build() { + final HttpClient.Builder builder = HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_1_1) + .followRedirects(HttpClient.Redirect.NEVER) + .connectTimeout(K.def(connectTimeout, () -> Duration.ofSeconds(5L))); + if (sslContext != null) { + builder.sslContext(sslContext); + } + if (proxyAddress != null) { + builder.proxy(ProxySelector.of(proxyAddress)); + } + final HttpClient httpClient = builder.build(); + return new HttpClientHelper(httpClient, onlyPrintFailed); + } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index 2c8b614..ef1dafa 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -178,7 +178,7 @@ public HttpClientReceiver send(SenderHandler senderHandler) { receiver.setErrorMessage(e.getMessage()); } finally { if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { - printDebug(request, receiver); + printLog(request, receiver); } } return receiver; @@ -194,7 +194,7 @@ private String printBody(Object body) { } } - private void printDebug(HttpRequest request, HttpClientReceiver receiver) { + private void printLog(HttpRequest request, HttpClientReceiver receiver) { StringBuilder sb = new StringBuilder("\n=========================================================================================================\n"); sb .append("\nlabel: ").append(debugLabel == null ? "(Undefined)" : debugLabel) From b208593355761a03b2f9057929043837c72225f3 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 17 May 2021 16:10:24 +0800 Subject: [PATCH 133/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/HttpClientHelper.java | 4 ++++ .../develop/toolkit/base/struct/http/HttpClientSender.java | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 87a63df..cf92c66 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -37,6 +37,10 @@ public static HttpClientHelper buildDefault() { return builder().build(); } + public static HttpClientHelper buildCustomize(HttpClient httpClient, boolean onlyPrintFailed) { + return new HttpClientHelper(httpClient, onlyPrintFailed); + } + public HttpClientSender request(String method, String url) { return new HttpClientSender(httpClient, method, url).onlyPrintFailed(onlyPrintFailed); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java index ef1dafa..cf27d15 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java @@ -167,13 +167,11 @@ public HttpClientReceiver send(SenderHandler senderHandler) { receiver.setHttpStatus(response.statusCode()); receiver.setHeaders(response.headers().map()); receiver.setBody(response.body()); - } catch (InterruptedException e) { - throw new RuntimeException(e); } catch (HttpConnectTimeoutException e) { receiver.setConnectTimeout(true); } catch (HttpTimeoutException e) { receiver.setReadTimeout(true); - } catch (IOException e) { + } catch (InterruptedException | IOException e) { e.printStackTrace(); receiver.setErrorMessage(e.getMessage()); } finally { From 50ed3332cd2d6fa745b364b971c4f1bc63b3be76 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 17 May 2021 16:18:03 +0800 Subject: [PATCH 134/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/struct/HttpAdviceResponse.java | 47 ------------------- .../base/struct/http/FormUrlencodedBody.java | 2 +- .../toolkit/base/struct/http/HttpContent.java | 13 ----- .../struct/http/MultiPartFormDataBody.java | 2 +- .../struct/http/StringBodySenderHandler.java | 2 +- 5 files changed, 3 insertions(+), 63 deletions(-) delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java deleted file mode 100644 index 1471cf2..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/HttpAdviceResponse.java +++ /dev/null @@ -1,47 +0,0 @@ -package develop.toolkit.base.struct; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.apache.commons.lang3.StringUtils; - -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Map; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@SuppressWarnings("unused") -public class HttpAdviceResponse { - - private int httpStatus; - - private Map> headers; - - private byte[] body; - - private long costTime; - - public String bodyOfString() { - return new String(body, StandardCharsets.UTF_8); - } - - public String getHeader(String header) { - return StringUtils.join(headers.getOrDefault(header, List.of()), ";"); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb - .append("\nhttp response:\n status: ").append(httpStatus).append("\n headers:\n"); - for (Map.Entry> entry : headers.entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); - } - sb.append(" body: ").append(bodyOfString()); - return sb.toString(); - } -} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java index ed74afb..f1ba5d1 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java @@ -10,7 +10,7 @@ * @author qiushui on 2020-09-15. */ @RequiredArgsConstructor -public class FormUrlencodedBody { +public final class FormUrlencodedBody { private final Map pairs; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java deleted file mode 100644 index 534bc84..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpContent.java +++ /dev/null @@ -1,13 +0,0 @@ -package develop.toolkit.base.struct.http; - -/** - * @author qiushui on 2020-09-14. - */ -public enum HttpContent { - - URL, - - HEADERS, - - BODY -} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index 24b1c34..5a519c4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -19,7 +19,7 @@ /** * @author qiushui on 2020-09-14. */ -public class MultiPartFormDataBody { +public final class MultiPartFormDataBody { private final List partsSpecificationList = new ArrayList<>(); diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java index f4f74c0..9e6a916 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/StringBodySenderHandler.java @@ -5,7 +5,7 @@ /** * @author qiushui on 2020-09-11. */ -public class StringBodySenderHandler implements SenderHandler { +public final class StringBodySenderHandler implements SenderHandler { @Override public HttpResponse.BodyHandler bodyHandler() { From e684521031fdf441304c99f3a48a1e1191e5ec45 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 18 May 2021 17:50:00 +0800 Subject: [PATCH 135/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/ArrayAdvice.java | 11 ++++++++--- .../toolkit/base/utils/CollectionAdvice.java | 15 ++++++++++++--- .../develop/toolkit/base/utils/JacksonAdvice.java | 8 ++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index 7cdbbc3..2048888 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -9,7 +9,6 @@ import java.lang.reflect.Array; import java.util.*; import java.util.function.BiPredicate; -import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -347,14 +346,14 @@ public static List> zip(T[] master, S[] other) { /** * 分页处理 */ - public static void pagingProcess(E[] array, int size, Consumer consumer) { + public static void pagingProcess(E[] array, int size, PagingProcessor consumer) { final int total = array.length; final int page = total % size == 0 ? (total / size) : (total / size + 1); for (int i = 0; i < page; i++) { int fromIndex = i * size; int toIndex = fromIndex + Math.min(total - fromIndex, size); E[] subArray = ArrayUtils.subarray(array, fromIndex, toIndex); - consumer.accept(subArray); + consumer.process(i, page, subArray); } } @@ -375,4 +374,10 @@ public static List sort(T[] master, Collection sortTarget, BiPredic .map(s -> ArrayAdvice.getFirstTrue(master, c -> predicate.test(c, s)).orElse(null)) .collect(Collectors.toList()); } + + @FunctionalInterface + public interface PagingProcessor { + + void process(int page, int total, T[] subArray); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 254521f..d0c725f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -6,7 +6,10 @@ import develop.toolkit.base.struct.TwoValues; import java.util.*; -import java.util.function.*; +import java.util.function.BiPredicate; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -324,14 +327,14 @@ public static List> zip(List master, List other) { /** * 分页处理 */ - public static void pagingProcess(List list, int size, Consumer> consumer) { + public static void pagingProcess(List list, int size, PagingProcessor consumer) { final int total = list.size(); final int page = total % size == 0 ? (total / size) : (total / size + 1); for (int i = 0; i < page; i++) { int fromIndex = i * size; int toIndex = fromIndex + Math.min(total - fromIndex, size); List subList = list.subList(fromIndex, toIndex); - consumer.accept(subList); + consumer.process(i, page, subList); } } @@ -352,4 +355,10 @@ public static List sort(Collection master, S[] sortTarget, BiPredic .map(s -> CollectionAdvice.getFirstTrue(master, c -> predicate.test(c, s)).orElse(null)) .collect(Collectors.toList()); } + + @FunctionalInterface + public interface PagingProcessor { + + void process(int page, int total, List subList); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index eacb5b4..877ce33 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -38,6 +38,14 @@ public static ObjectMapper defaultObjectMapper() { return objectMapper; } + /** + * 反序列化树结构 + */ + @SneakyThrows(JsonProcessingException.class) + public static JsonNode readTreeQuietly(ObjectMapper objectMapper, String json) { + return objectMapper.readTree(json); + } + /** * 安静地序列化 */ From 33ee161d0c033b824c38832dcd14afd7a69e0295 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 27 May 2021 08:36:10 +0800 Subject: [PATCH 136/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/struct/ThreeValues.java | 3 + .../toolkit/base/struct/TwoValues.java | 3 + .../toolkit/base/utils/ArrayAdvice.java | 45 ++++- .../toolkit/base/utils/CollectionAdvice.java | 64 ++++++- ...{StatisticsAdvice.java => MathAdvice.java} | 158 +++++++++--------- 5 files changed, 181 insertions(+), 92 deletions(-) rename develop-toolkit-base/src/main/java/develop/toolkit/base/utils/{StatisticsAdvice.java => MathAdvice.java} (93%) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java index 66250b3..aba46fa 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ThreeValues.java @@ -31,6 +31,9 @@ public static ThreeValues of(T firstValue, S secondValue, U t } public static ThreeValues of(T[] objs) { + if (objs.length != 3) { + throw new IllegalArgumentException("TwoValues of array length is " + objs.length); + } return new ThreeValues<>(objs[0], objs[1], objs[2]); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java index b9cf56c..4517ef9 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/TwoValues.java @@ -29,6 +29,9 @@ public static TwoValues of(T firstValue, S secondValue) { } public static TwoValues of(T[] objs) { + if (objs.length != 2) { + throw new IllegalArgumentException("TwoValues of array length is " + objs.length); + } return new TwoValues<>(objs[0], objs[1]); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index 2048888..7f6ecbe 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -8,6 +8,7 @@ import java.lang.reflect.Array; import java.util.*; +import java.util.function.BiFunction; import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; @@ -325,7 +326,10 @@ public static TwoValues, List> partition(E[] collection, Predicat notMatch.add(e); } } - return TwoValues.of(match, notMatch); + return TwoValues.of( + Collections.unmodifiableList(match), + Collections.unmodifiableList(notMatch) + ); } /** @@ -333,11 +337,12 @@ public static TwoValues, List> partition(E[] collection, Predicat * 将两个集合的元素按索引捆绑到一起 */ public static List> zip(T[] master, S[] other) { - if (master.length != other.length) { + final int length = master.length; + if (length != other.length) { throw new IllegalArgumentException("list size must be same"); } - List> list = new LinkedList<>(); - for (int i = 0; i < master.length; i++) { + List> list = new ArrayList<>(length); + for (int i = 0; i < length; i++) { list.add(TwoValues.of(master[i], other[i])); } return list; @@ -346,17 +351,39 @@ public static List> zip(T[] master, S[] other) { /** * 分页处理 */ - public static void pagingProcess(E[] array, int size, PagingProcessor consumer) { + public static void pagingProcess(T[] array, int size, PagingProcessor consumer) { final int total = array.length; final int page = total % size == 0 ? (total / size) : (total / size + 1); for (int i = 0; i < page; i++) { int fromIndex = i * size; int toIndex = fromIndex + Math.min(total - fromIndex, size); - E[] subArray = ArrayUtils.subarray(array, fromIndex, toIndex); + T[] subArray = ArrayUtils.subarray(array, fromIndex, toIndex); consumer.process(i, page, subArray); } } + /** + * 分页处理 + */ + public static R pagingProcess( + T[] array, + int size, + R initialValue, + BiFunction reduceFunction, + PagingReduceProcessor consumer + ) { + final int total = array.length; + final int page = total % size == 0 ? (total / size) : (total / size + 1); + for (int i = 0; i < page; i++) { + int fromIndex = i * size; + int toIndex = fromIndex + Math.min(total - fromIndex, size); + T[] subArray = ArrayUtils.subarray(array, fromIndex, toIndex); + final R r = consumer.process(i, page, subArray); + initialValue = reduceFunction.apply(initialValue, r); + } + return initialValue; + } + /** * 指定排序 * 把master的元素值按sortTarget的元素值排序,条件按predicate @@ -380,4 +407,10 @@ public interface PagingProcessor { void process(int page, int total, T[] subArray); } + + @FunctionalInterface + public interface PagingReduceProcessor { + + R process(int page, int total, T[] subArray); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index d0c725f..4397e9c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -6,10 +6,7 @@ import develop.toolkit.base.struct.TwoValues; import java.util.*; -import java.util.function.BiPredicate; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; +import java.util.function.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -306,7 +303,10 @@ public static TwoValues, List> partition(Collection collection notMatch.add(e); } } - return TwoValues.of(match, notMatch); + return TwoValues.of( + Collections.unmodifiableList(match), + Collections.unmodifiableList(notMatch) + ); } /** @@ -327,17 +327,61 @@ public static List> zip(List master, List other) { /** * 分页处理 */ - public static void pagingProcess(List list, int size, PagingProcessor consumer) { + public static void pagingProcess(List list, int size, PagingProcessor processor) { final int total = list.size(); final int page = total % size == 0 ? (total / size) : (total / size + 1); for (int i = 0; i < page; i++) { int fromIndex = i * size; int toIndex = fromIndex + Math.min(total - fromIndex, size); List subList = list.subList(fromIndex, toIndex); - consumer.process(i, page, subList); + processor.process(i, page, subList); } } + /** + * 分页处理 (通过总数) + */ + public static void pagingProcess(int total, int size, BiConsumer consumer) { + final int page = total % size == 0 ? (total / size) : (total / size + 1); + for (int i = 0; i < page; i++) { + consumer.accept(i, page); + } + } + + /** + * 分页处理 (含返回值) + */ + public static R pagingProcess( + List list, + int size, + R initialValue, + BiFunction reduceFunction, + PagingReduceProcessor processor + ) { + final int total = list.size(); + final int page = total % size == 0 ? (total / size) : (total / size + 1); + for (int i = 0; i < page; i++) { + int fromIndex = i * size; + int toIndex = fromIndex + Math.min(total - fromIndex, size); + List subList = list.subList(fromIndex, toIndex); + final R r = processor.process(i, page, subList); + initialValue = reduceFunction.apply(initialValue, r); + } + return initialValue; + } + + /** + * 分页处理 (通过总数 含返回值) + */ + public static R pagingProcess(int total, int size, R initialValue, BiFunction reduceFunction, BiFunction function) { + final int page = total % size == 0 ? (total / size) : (total / size + 1); + for (int i = 0; i < page; i++) { + final R r = function.apply(i, page); + initialValue = reduceFunction.apply(initialValue, r); + } + return initialValue; + } + /** * 指定排序 * 把master的元素值按sortTarget的元素值排序,条件按predicate @@ -361,4 +405,10 @@ public interface PagingProcessor { void process(int page, int total, List subList); } + + @FunctionalInterface + public interface PagingReduceProcessor { + + R process(int page, int total, List subList); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/MathAdvice.java similarity index 93% rename from develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java rename to develop-toolkit-base/src/main/java/develop/toolkit/base/utils/MathAdvice.java index 0eff75b..46ed11d 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StatisticsAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/MathAdvice.java @@ -1,79 +1,79 @@ -package develop.toolkit.base.utils; - -import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 统计学指标 - * - * @author qiushui on 2020-01-02. - */ -@SuppressWarnings("unused") -public final class StatisticsAdvice { - - /** - * 最大值 - */ - public static double max(Collection numbers) { - return numbers - .stream() - .mapToDouble(Number::doubleValue) - .max().orElseThrow(); - } - - /** - * 最小值 - */ - public static double min(Collection numbers) { - return numbers - .stream() - .mapToDouble(Number::doubleValue) - .min().orElseThrow(); - } - - /** - * 平均值 - */ - public static double average(Collection numbers) { - return numbers - .stream() - .mapToDouble(Number::doubleValue) - .average().orElseThrow(); - } - - /** - * 方差 - */ - public static double variance(Collection numbers) { - final double average = average(numbers); - return numbers - .stream() - .mapToDouble(number -> Math.pow(number.doubleValue() - average, 2)) - .average().orElseThrow(); - } - - /** - * 标准差 - */ - public static double standardDeviation(Collection numbers) { - return Math.sqrt(variance(numbers)); - } - - /** - * 中位数 - */ - public static double median(Collection numbers) { - final List list = numbers - .stream() - .sorted() - .map(Number::doubleValue) - .collect(Collectors.toList()); - if (list.size() % 2 == 0) { - int half = list.size() / 2; - return (list.get(half) + list.get(half + 1)) / 2; - } else { - return list.get(list.size() / 2 + 1); - } - } -} +package develop.toolkit.base.utils; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 数学增强 + * + * @author qiushui on 2020-01-02. + */ +@SuppressWarnings("unused") +public final class MathAdvice { + + /** + * 最大值 + */ + public static double max(Collection numbers) { + return numbers + .stream() + .mapToDouble(Number::doubleValue) + .max().orElseThrow(); + } + + /** + * 最小值 + */ + public static double min(Collection numbers) { + return numbers + .stream() + .mapToDouble(Number::doubleValue) + .min().orElseThrow(); + } + + /** + * 平均值 + */ + public static double average(Collection numbers) { + return numbers + .stream() + .mapToDouble(Number::doubleValue) + .average().orElseThrow(); + } + + /** + * 方差 + */ + public static double variance(Collection numbers) { + final double average = average(numbers); + return numbers + .stream() + .mapToDouble(number -> Math.pow(number.doubleValue() - average, 2)) + .average().orElseThrow(); + } + + /** + * 标准差 + */ + public static double standardDeviation(Collection numbers) { + return Math.sqrt(variance(numbers)); + } + + /** + * 中位数 + */ + public static double median(Collection numbers) { + final List list = numbers + .stream() + .sorted() + .map(Number::doubleValue) + .collect(Collectors.toList()); + if (list.size() % 2 == 0) { + int half = list.size() / 2; + return (list.get(half) + list.get(half + 1)) / 2; + } else { + return list.get(list.size() / 2 + 1); + } + } +} From 5863dcb2fe20fb4b32154fe5bed76f0288ec54ee Mon Sep 17 00:00:00 2001 From: qiushui Date: Sun, 20 Jun 2021 17:30:50 +0800 Subject: [PATCH 137/178] multimedia --- .../toolkit/base/utils/CompareAdvice.java | 15 + develop-toolkit-multimedia/pom.xml | 27 ++ .../toolkit/multimedia/image/ImageAdvice.java | 195 ++++++++ .../toolkit/multimedia/image/ImageType.java | 31 ++ .../src/main/java/module-info.java | 11 + pom.xml | 424 +++++++++--------- 6 files changed, 497 insertions(+), 206 deletions(-) create mode 100644 develop-toolkit-multimedia/pom.xml create mode 100644 develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java create mode 100644 develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java create mode 100644 develop-toolkit-multimedia/src/main/java/module-info.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java index 4770692..f08a2cd 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompareAdvice.java @@ -86,4 +86,19 @@ public static > T max(@NonNull T a, @NonNull T b) { public static > T min(@NonNull T a, @NonNull T b) { return lte(a, b) ? a : b; } + + /** + * 调整边界值 + */ + public static > T adjustRange(T x, T start, T end) { + if (gt(start, end)) { + throw new IllegalArgumentException("start great than end"); + } else if (lt(x, start)) { + return start; + } else if (gt(x, end)) { + return end; + } else { + return x; + } + } } diff --git a/develop-toolkit-multimedia/pom.xml b/develop-toolkit-multimedia/pom.xml new file mode 100644 index 0000000..9f53f25 --- /dev/null +++ b/develop-toolkit-multimedia/pom.xml @@ -0,0 +1,27 @@ + + + + develop-toolkit + com.github.developframework + 1.0.6-SNAPSHOT + + 4.0.0 + + develop-toolkit-multimedia + + 开发工具箱 - 多媒体处理 + + + + com.github.developframework + develop-toolkit-base + + + com.drewnoakes + metadata-extractor + + + + \ No newline at end of file diff --git a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java new file mode 100644 index 0000000..3d739c8 --- /dev/null +++ b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java @@ -0,0 +1,195 @@ +package develop.toolkit.multimedia.image; + +import com.drew.imaging.ImageMetadataReader; +import com.drew.imaging.ImageProcessingException; +import com.drew.metadata.Metadata; +import com.drew.metadata.MetadataException; +import com.drew.metadata.exif.ExifIFD0Directory; +import develop.toolkit.base.utils.CompareAdvice; +import develop.toolkit.base.utils.IOAdvice; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * @author qiushui on 2021-06-20. + */ +public abstract class ImageAdvice { + + /** + * 修正图片角度后裁切图片 + * + * @param inputStream 图片输入流 + * @param outputStream 输出流 + * @param rectangle 裁切区域 + * @param outImageType 输出图片类型 + * @throws IOException + */ + public static void fixOrientationAndCut(InputStream inputStream, OutputStream outputStream, Rectangle rectangle, ImageType outImageType) throws IOException { + final byte[] data = IOAdvice.toByteArray(inputStream); + ByteArrayInputStream bais = new ByteArrayInputStream(data); + final int angle = readOrientationAngle(bais); + bais.close(); + bais = new ByteArrayInputStream(data); + final BufferedImage image = cut( + rotate(ImageIO.read(bais), angle), + rectangle + ); + bais.close(); + ImageIO.write(image, outImageType.getExtensionNames()[0], outputStream); + } + + /** + * 修正图片角度后定宽缩放 + * + * @param inputStream 图片输入流 + * @param outputStream 输出流 + * @param width 定宽 + * @param outImageType 输出图片类型 + * @throws IOException + */ + public static void fixOrientationAndZoom(InputStream inputStream, OutputStream outputStream, int width, ImageType outImageType) throws IOException { + final byte[] data = IOAdvice.toByteArray(inputStream); + ByteArrayInputStream bais = new ByteArrayInputStream(data); + final int angle = readOrientationAngle(bais); + bais.close(); + bais = new ByteArrayInputStream(data); + final BufferedImage image = zoom( + rotate(ImageIO.read(bais), angle), + width + ); + bais.close(); + ImageIO.write(image, outImageType.getExtensionNames()[0], outputStream); + } + + /** + * 裁切图片 + * + * @param originalImage 原图 + * @param rectangle 裁切区域 + * @return 新图片 + */ + public static BufferedImage cut(BufferedImage originalImage, Rectangle rectangle) { + final int MAX_WIDTH = originalImage.getWidth(); + final int MAX_HEIGHT = originalImage.getHeight(); + final int x = CompareAdvice.adjustRange((int) rectangle.getX(), 0, MAX_WIDTH - 1); + final int y = CompareAdvice.adjustRange((int) rectangle.getY(), 0, MAX_HEIGHT - 1); + final int width = CompareAdvice.adjustRange((int) rectangle.getWidth(), 1, MAX_WIDTH - x); + final int height = CompareAdvice.adjustRange((int) rectangle.getHeight(), 1, MAX_HEIGHT - y); + return originalImage.getSubimage(x, y, width, height); + } + + /** + * 旋转角度 + * + * @param originalImage 原图 + * @param angle 旋转角度 + * @return 新图片 + */ + public static BufferedImage rotate(BufferedImage originalImage, int angle) { + // 修正角度 + while (angle < 0) { + angle += 360; + } + angle %= 360; + if (angle == 0) { + return originalImage; + } + final int MAX_WIDTH = originalImage.getWidth(); + final int MAX_HEIGHT = originalImage.getHeight(); + Rectangle rectangle = computeRotatedSize(new Rectangle(new Dimension(MAX_WIDTH, MAX_HEIGHT)), angle); + BufferedImage newImage = new BufferedImage(rectangle.width, rectangle.height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = newImage.createGraphics(); + graphics.translate((rectangle.width - MAX_WIDTH) / 2, (rectangle.height - MAX_HEIGHT) / 2); + graphics.rotate(Math.toRadians(angle), (double) MAX_WIDTH / 2, (double) MAX_HEIGHT / 2); + graphics.drawImage(originalImage, null, null); + return newImage; + } + + /** + * 定宽缩放 + * + * @param originalImage 原图 + * @param width 定宽 + * @return 新图片 + */ + public static BufferedImage zoom(BufferedImage originalImage, int width) { + final int MAX_WIDTH = originalImage.getWidth(); + final int MAX_HEIGHT = originalImage.getHeight(); + if (MAX_WIDTH == width) { + return originalImage; + } + final int newHeight = (int) ((double) width / (double) MAX_WIDTH * (double) MAX_HEIGHT); + final BufferedImage newImage = new BufferedImage(width, newHeight, BufferedImage.TYPE_INT_RGB); + final Image image = originalImage.getScaledInstance(width, newHeight, BufferedImage.SCALE_FAST); + newImage.getGraphics().drawImage(image, 0, 0, null); + return newImage; + } + + /** + * 计算旋转后的画布大小 + */ + private static Rectangle computeRotatedSize(Rectangle rectangle, int angle) { + if (angle >= 90) { + if (angle / 90 % 2 == 1) { + int temp = rectangle.height; + rectangle.height = rectangle.width; + rectangle.width = temp; + } + angle %= 90; + } + double r = Math.sqrt(rectangle.height * rectangle.height + rectangle.width * rectangle.width) / 2; + double len = 2 * Math.sin(Math.toRadians(angle) / 2) * r; + double angelAlpha = (Math.PI - Math.toRadians(angle)) / 2; + double angelDeltaWidth = Math.atan((double) rectangle.height / rectangle.width); + double angelDeltaHeight = Math.atan((double) rectangle.width / rectangle.height); + int lenDeltaWidth = (int) (len * Math.cos(Math.PI - angelAlpha - angelDeltaWidth)); + int lenDeltaHeight = (int) (len * Math.cos(Math.PI - angelAlpha - angelDeltaHeight)); + int desWidth = rectangle.width + lenDeltaWidth * 2; + int des_height = rectangle.height + lenDeltaHeight * 2; + return new Rectangle(new Dimension(desWidth, des_height)); + } + + /** + * 读取图片拍摄角度 + * + * @param inputStream 文件输入流 + * @return 角度 + * @throws IOException + */ + private static int readOrientationAngle(InputStream inputStream) throws IOException { + final int orientation; + try { + final Metadata metadata = ImageMetadataReader.readMetadata(inputStream); + final ExifIFD0Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); + if (directory != null && directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) { + orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION); + } else { + orientation = 0; + } + } catch (ImageProcessingException | MetadataException e) { + throw new RuntimeException("read image metadata fail: " + e.getMessage()); + } + int angle; + switch (orientation) { + case 3: + angle = 180; + break; + case 6: + angle = 90; + break; + case 8: + angle = 270; + break; + default: + angle = 0; + break; + } + return angle; + } +} diff --git a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java new file mode 100644 index 0000000..c0acb49 --- /dev/null +++ b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java @@ -0,0 +1,31 @@ +package develop.toolkit.multimedia.image; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author qiushui on 2021-06-20. + */ +@RequiredArgsConstructor +public enum ImageType { + + JPEG(new String[]{"jpg", "jpeg"}), + + PNG(new String[]{"png"}), + + GIF(new String[]{"gif"}); + + @Getter + private final String[] extensionNames; + + public static ImageType of(String extensionName) { + for (ImageType type : ImageType.values()) { + for (String name : type.extensionNames) { + if (name.equalsIgnoreCase(extensionName)) { + return type; + } + } + } + throw new IllegalArgumentException("not support image type: " + extensionName); + } +} diff --git a/develop-toolkit-multimedia/src/main/java/module-info.java b/develop-toolkit-multimedia/src/main/java/module-info.java new file mode 100644 index 0000000..72874bc --- /dev/null +++ b/develop-toolkit-multimedia/src/main/java/module-info.java @@ -0,0 +1,11 @@ +/** + * @author qiushui on 2021-06-20. + */ +module develop.toolkit.multimedia { + requires metadata.extractor; + requires develop.toolkit.base; + requires java.desktop; + requires lombok; + + exports develop.toolkit.multimedia.image; +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 81f36c0..7f10a8b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,207 +1,219 @@ - - - 4.0.0 - - com.github.developframework - develop-toolkit - pom - 1.0.6-SNAPSHOT - 开发工具箱 - 2018 - Develop Toolkit - https://github.com/developframework/develop-toolkit - - - develop-toolkit-base - develop-toolkit-db - develop-toolkit-world - - - - 1.18.16 - 1.7.30 - 1.5.0 - 2.11.3 - - - - - - com.github.developframework - develop-toolkit-base - 1.0.6-SNAPSHOT - - - com.github.developframework - develop-toolkit-db - 1.0.6-SNAPSHOT - - - com.github.developframework - develop-toolkit-world - 1.0.6-SNAPSHOT - - - org.projectlombok - lombok - ${version.lombok} - - - org.slf4j - slf4j-api - ${version.slf4j-api} - - - com.github.developframework - expression - ${version.expression} - - - com.fasterxml.jackson.core - jackson-databind - ${version.jackson} - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${version.jackson} - - - - - - - qiuzhenhao - 408000511@qq.com - developframework - http://blog.qiushuicloud.xyz - - - - - GitHub Issues - https://github.com/developframework/develop-toolkit - - - - - The Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - - scm:git:git@github.com:developframework/develop-toolkit.git - scm:git:git@github.com:developframework/develop-toolkit.git - https://github.com/developframework/develop-toolkit - HEAD - - - - - - - maven-source-plugin - 3.1.0 - - - attach-sources - verify - - jar-no-fork - - - - - - maven-release-plugin - - v@{project.version} - true - - - - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - - - - - - maven-source-plugin - - - maven-compiler-plugin - 3.8.1 - - - - org.projectlombok - lombok - ${version.lombok} - - - - - - - - - - - hclc aliyun nexus - http://nexus.hclcaliyun.com:8082/repository/maven-snapshots/ - - - hclc aliyun nexus - http://nexus.hclcaliyun.com:8082/repository/maven-releases/ - - - - - - release - - - - performRelease - true - - - - - - - maven-gpg-plugin - - - maven-javadoc-plugin - - none - - - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - + + + 4.0.0 + + com.github.developframework + develop-toolkit + pom + 1.0.6-SNAPSHOT + 开发工具箱 + 2018 + Develop Toolkit + https://github.com/developframework/develop-toolkit + + + develop-toolkit-base + develop-toolkit-db + develop-toolkit-world + develop-toolkit-multimedia + + + + 1.18.16 + 1.7.30 + 1.5.0 + 2.11.3 + 2.15.0 + + + + + + com.github.developframework + develop-toolkit-base + 1.0.6-SNAPSHOT + + + com.github.developframework + develop-toolkit-db + 1.0.6-SNAPSHOT + + + com.github.developframework + develop-toolkit-world + 1.0.6-SNAPSHOT + + + com.github.developframework + develop-toolkit-multimedia + 1.0.6-SNAPSHOT + + + org.projectlombok + lombok + ${version.lombok} + + + org.slf4j + slf4j-api + ${version.slf4j-api} + + + com.github.developframework + expression + ${version.expression} + + + com.fasterxml.jackson.core + jackson-databind + ${version.jackson} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${version.jackson} + + + com.drewnoakes + metadata-extractor + ${version.metadata-extractor} + + + + + + + qiuzhenhao + 408000511@qq.com + developframework + http://blog.qiushuicloud.xyz + + + + + GitHub Issues + https://github.com/developframework/develop-toolkit + + + + + The Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + scm:git:git@github.com:developframework/develop-toolkit.git + scm:git:git@github.com:developframework/develop-toolkit.git + https://github.com/developframework/develop-toolkit + HEAD + + + + + + + maven-source-plugin + 3.1.0 + + + attach-sources + verify + + jar-no-fork + + + + + + maven-release-plugin + + v@{project.version} + true + + + + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + + + maven-source-plugin + + + maven-compiler-plugin + 3.8.1 + + + + org.projectlombok + lombok + ${version.lombok} + + + + + + + + + + + hclc aliyun nexus + http://nexus.hclcaliyun.com:8082/repository/maven-snapshots/ + + + hclc aliyun nexus + http://nexus.hclcaliyun.com:8082/repository/maven-releases/ + + + + + + release + + + + performRelease + true + + + + + + + maven-gpg-plugin + + + maven-javadoc-plugin + + none + + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + \ No newline at end of file From 43e6b0e30678562edb370caa3b318eb39debf798 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 22 Jun 2021 17:42:24 +0800 Subject: [PATCH 138/178] mybatis --- develop-toolkit-mybatis/pom.xml | 43 ++++++ .../toolkit/mybatis/ConfigurationHandler.java | 52 +++++++ .../toolkit/mybatis/MybatisAdvice.java | 39 ++++++ .../develop/toolkit/mybatis/MybatisPager.java | 26 ++++ .../toolkit/mybatis/PagingInterceptor.java | 129 ++++++++++++++++++ pom.xml | 6 + 6 files changed, 295 insertions(+) create mode 100644 develop-toolkit-mybatis/pom.xml create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/ConfigurationHandler.java create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisPager.java create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/PagingInterceptor.java diff --git a/develop-toolkit-mybatis/pom.xml b/develop-toolkit-mybatis/pom.xml new file mode 100644 index 0000000..b9f66bf --- /dev/null +++ b/develop-toolkit-mybatis/pom.xml @@ -0,0 +1,43 @@ + + + + develop-toolkit + com.github.developframework + 1.0.6-SNAPSHOT + + 4.0.0 + + develop-toolkit-mybatis + + + 3.5.5 + 8.0.20 + 4.0.3 + + + + + com.github.developframework + develop-toolkit-base + + + org.mybatis + mybatis + ${mybatis.version} + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + runtime + + + com.zaxxer + HikariCP + ${HikariCP.version} + + + + \ No newline at end of file diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/ConfigurationHandler.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/ConfigurationHandler.java new file mode 100644 index 0000000..3c8ae82 --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/ConfigurationHandler.java @@ -0,0 +1,52 @@ +package develop.toolkit.mybatis; + +import com.zaxxer.hikari.HikariConfig; +import org.apache.ibatis.binding.MapperRegistry; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.type.TypeAliasRegistry; + +import java.util.List; + +/** + * @author qiushui on 2021-06-22. + */ +@FunctionalInterface +public interface ConfigurationHandler { + + void configHikari(HikariConfig config); + + /** + * 配置Mapper + * + * @param mapperRegistry mapper注册器 + */ + default void configMapperRegistry(MapperRegistry mapperRegistry) { + + } + + /** + * 配置别名 + * + * @param typeAliasRegistry 别名注册器 + */ + default void configTypeAliasRegistry(TypeAliasRegistry typeAliasRegistry) { + + } + + /** + * 配置拦截器 + * + * @param interceptors 拦截器链 + */ + default void configInterceptors(List interceptors) { + + } + + /** + * 其它配置 + */ + default void configurationSettings(Configuration configuration) { + + } +} diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java new file mode 100644 index 0000000..20b80ff --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java @@ -0,0 +1,39 @@ +package develop.toolkit.mybatis; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; + +import javax.sql.DataSource; + +/** + * @author qiushui on 2021-06-22. + */ +public abstract class MybatisAdvice { + + /** + * 构建SqlSessionFactory + * + * @param configurationHandler 配置处理接口 + */ + public static SqlSessionFactory buildSqlSessionFactory(ConfigurationHandler configurationHandler) { + final Configuration configuration = new Configuration(); + configuration.setMapUnderscoreToCamelCase(true); + configuration.setUseGeneratedKeys(true); + configuration.setLogPrefix("mybatis."); + final HikariConfig hikariConfig = new HikariConfig(); + configurationHandler.configHikari(hikariConfig); + final DataSource dataSource = new HikariDataSource(hikariConfig); + final TransactionFactory transactionFactory = new JdbcTransactionFactory(); + configuration.setEnvironment(new Environment("default", transactionFactory, dataSource)); + configurationHandler.configMapperRegistry(configuration.getMapperRegistry()); + configurationHandler.configTypeAliasRegistry(configuration.getTypeAliasRegistry()); + configurationHandler.configInterceptors(configuration.getInterceptors()); + return new SqlSessionFactoryBuilder().build(configuration); + } +} diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisPager.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisPager.java new file mode 100644 index 0000000..a755a92 --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisPager.java @@ -0,0 +1,26 @@ +package develop.toolkit.mybatis; + +import develop.toolkit.base.struct.Pager; + +/** + * @author qiushui on 2021-06-22. + */ +public final class MybatisPager extends Pager { + + public MybatisPager() { + super(); + } + + public MybatisPager(int index, int size) { + super(index, size); + } + + /** + * 生成 LIMIT 语句 + * + * @return LIMIT 语句 + */ + public String limitSQL() { + return String.format("LIMIT %d, %d", page * size, size); + } +} diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/PagingInterceptor.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/PagingInterceptor.java new file mode 100644 index 0000000..7c65182 --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/PagingInterceptor.java @@ -0,0 +1,129 @@ +package develop.toolkit.mybatis; + +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.cache.CacheKey; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.ResultMap; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.lang.reflect.Field; +import java.sql.SQLException; +import java.util.*; + +/** + * @author qiushui on 2021-06-18. + */ +@Intercepts(@Signature( + type = Executor.class, + method = "query", + args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} +)) +@SuppressWarnings("unchecked") +public class PagingInterceptor implements Interceptor { + + @Override + public Object intercept(Invocation invocation) throws Throwable { + final Object[] args = invocation.getArgs(); + final MappedStatement ms = (MappedStatement) args[0]; + final Object parameterObject = args[1]; +// final RowBounds rowBounds = (RowBounds) args[2]; + + final Optional mybatisPagerOptional = extractPager(parameterObject); + if (mybatisPagerOptional.isEmpty()) { + //不需要分页,直接返回结果 + return invocation.proceed(); + } + final ResultHandler resultHandler = (ResultHandler) args[3]; + final MybatisPager mybatisPager = mybatisPagerOptional.get(); + final Executor executor = (Executor) invocation.getTarget(); + final BoundSql boundSql = ms.getBoundSql(parameterObject); + final Map additionalParameters = getAdditionalParameters(boundSql); + final long count = queryCount(executor, ms, boundSql, parameterObject, additionalParameters, resultHandler); + if (count == 0) { + return new ArrayList<>(); + } + return queryList(executor, ms, boundSql, parameterObject, additionalParameters, resultHandler, mybatisPager); + } + + /** + * 查询总条数 + */ + private long queryCount(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameterObject, Map additionalParameters, ResultHandler resultHandler) throws SQLException { + MappedStatement countMs = newMappedStatement(ms); + CacheKey countKey = executor.createCacheKey(countMs, parameterObject, RowBounds.DEFAULT, boundSql); + String countSql = String.format("SELECT COUNT(*) FROM (%s) total", boundSql.getSql()); + BoundSql countBoundSql = new BoundSql(ms.getConfiguration(), countSql, boundSql.getParameterMappings(), parameterObject); + additionalParameters.forEach(countBoundSql::setAdditionalParameter); + List countQueryResult = executor.query(countMs, parameterObject, RowBounds.DEFAULT, resultHandler, countKey, countBoundSql); + return (Long) countQueryResult.get(0); + } + + /** + * 查询列表 + */ + private List queryList(Executor executor, MappedStatement ms, BoundSql boundSql, Object parameterObject, Map additionalParameters, ResultHandler resultHandler, MybatisPager pager) throws SQLException { + CacheKey pageKey = executor.createCacheKey(ms, parameterObject, RowBounds.DEFAULT, boundSql); + String pageSql = boundSql.getSql() + " " + pager.limitSQL(); + BoundSql pageBoundSql = new BoundSql(ms.getConfiguration(), pageSql, boundSql.getParameterMappings(), parameterObject); + additionalParameters.forEach(pageBoundSql::setAdditionalParameter); + return executor.query(ms, parameterObject, RowBounds.DEFAULT, resultHandler, pageKey, pageBoundSql); + } + + private MappedStatement newMappedStatement(MappedStatement ms) { + return new MappedStatement.Builder( + ms.getConfiguration(), + ms.getId() + "_count", + ms.getSqlSource(), + ms.getSqlCommandType() + ) + .resource(ms.getResource()) + .fetchSize(ms.getFetchSize()) + .statementType(ms.getStatementType()) + .timeout(ms.getTimeout()) + .parameterMap(ms.getParameterMap()) + .resultSetType(ms.getResultSetType()) + .cache(ms.getCache()) + .flushCacheRequired(ms.isFlushCacheRequired()) + .useCache(ms.isUseCache()) + .resultMaps( + Collections.singletonList( + new ResultMap.Builder( + ms.getConfiguration(), + ms.getId(), + Long.class, + Collections.emptyList() + ).build() + ) + ) + .keyProperty(StringUtils.join(ms.getKeyProperties(), ",")) + .build(); + } + + private Optional extractPager(Object parameterObject) { + if (parameterObject instanceof MybatisPager) { + return Optional.of((MybatisPager) parameterObject); + } else if (parameterObject instanceof Map) { + return ((Map) parameterObject) + .values() + .stream() + .filter(v -> v instanceof MybatisPager) + .map(v -> (MybatisPager) v) + .findFirst(); + } else { + return Optional.empty(); + } + } + + private Map getAdditionalParameters(BoundSql boundSql) throws NoSuchFieldException, IllegalAccessException { + Field additionalParametersField = BoundSql.class.getDeclaredField("additionalParameters"); + additionalParametersField.setAccessible(true); + return (Map) additionalParametersField.get(boundSql); + } +} diff --git a/pom.xml b/pom.xml index 7f10a8b..7310fb0 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ develop-toolkit-db develop-toolkit-world develop-toolkit-multimedia + develop-toolkit-mybatis @@ -48,6 +49,11 @@ develop-toolkit-multimedia 1.0.6-SNAPSHOT + + com.github.developframework + develop-toolkit-mybatis + 1.0.6-SNAPSHOT + org.projectlombok lombok From 50c531b0c7b6e8ddef078fdaf8c920e9dea6e17c Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 7 Jul 2021 14:05:51 +0800 Subject: [PATCH 139/178] lombok --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7310fb0..416f09b 100644 --- a/pom.xml +++ b/pom.xml @@ -20,9 +20,9 @@ - 1.18.16 + 1.18.20 1.7.30 - 1.5.0 + 1.5.1 2.11.3 2.15.0 From 4d281ef24267ed01111c6e8a1532a7a66b08348c Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 19 Jul 2021 09:48:51 +0800 Subject: [PATCH 140/178] http --- .../base/components/HttpClientHelper.java | 23 ++++++++++++------- .../http => components}/HttpClientSender.java | 8 ++++--- 2 files changed, 20 insertions(+), 11 deletions(-) rename develop-toolkit-base/src/main/java/develop/toolkit/base/{struct/http => components}/HttpClientSender.java (96%) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index cf92c66..b4e2928 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -1,7 +1,5 @@ package develop.toolkit.base.components; -import develop.toolkit.base.struct.http.HttpClientSender; -import develop.toolkit.base.utils.K; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -29,6 +27,8 @@ public final class HttpClientHelper { private final boolean onlyPrintFailed; + private final Duration readTimeout; + public static Builder builder() { return new Builder(); } @@ -37,12 +37,12 @@ public static HttpClientHelper buildDefault() { return builder().build(); } - public static HttpClientHelper buildCustomize(HttpClient httpClient, boolean onlyPrintFailed) { - return new HttpClientHelper(httpClient, onlyPrintFailed); + public static HttpClientHelper buildCustomize(HttpClient httpClient, boolean onlyPrintFailed, Duration readTimeout) { + return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout); } public HttpClientSender request(String method, String url) { - return new HttpClientSender(httpClient, method, url).onlyPrintFailed(onlyPrintFailed); + return new HttpClientSender(httpClient, method, url, readTimeout).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender get(String url) { @@ -67,7 +67,9 @@ public static class Builder { private SSLContext sslContext; - private Duration connectTimeout; + private Duration connectTimeout = Duration.ofSeconds(10L); + + private Duration readTimeout = Duration.ofSeconds(30L); private InetSocketAddress proxyAddress; @@ -81,6 +83,11 @@ public Builder connectTimeout(Duration connectTimeout) { return this; } + public Builder readTimeout(Duration readTimeout) { + this.readTimeout = readTimeout; + return this; + } + public Builder proxyAddress(InetSocketAddress proxyAddress) { this.proxyAddress = proxyAddress; return this; @@ -105,7 +112,7 @@ public HttpClientHelper build() { final HttpClient.Builder builder = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .followRedirects(HttpClient.Redirect.NEVER) - .connectTimeout(K.def(connectTimeout, () -> Duration.ofSeconds(5L))); + .connectTimeout(connectTimeout); if (sslContext != null) { builder.sslContext(sslContext); } @@ -113,7 +120,7 @@ public HttpClientHelper build() { builder.proxy(ProxySelector.of(proxyAddress)); } final HttpClient httpClient = builder.build(); - return new HttpClientHelper(httpClient, onlyPrintFailed); + return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout); } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java similarity index 96% rename from develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java rename to develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index cf27d15..a275d75 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -1,5 +1,6 @@ -package develop.toolkit.base.struct.http; +package develop.toolkit.base.components; +import develop.toolkit.base.struct.http.*; import develop.toolkit.base.utils.DateTimeAdvice; import develop.toolkit.base.utils.StringAdvice; import lombok.Getter; @@ -37,7 +38,7 @@ public final class HttpClientSender { private final Map parameters = new HashMap<>(); - private Duration readTimeout = Duration.ofSeconds(10L); + private Duration readTimeout; private String debugLabel; @@ -45,10 +46,11 @@ public final class HttpClientSender { private boolean onlyPrintFailed; - public HttpClientSender(HttpClient httpClient, String method, String url) { + protected HttpClientSender(HttpClient httpClient, String method, String url, Duration readTimeout) { this.httpClient = httpClient; this.method = method; this.url = url; + this.readTimeout = readTimeout; } public HttpClientSender header(String header, String value) { From 41d3c2db9e41c5573ee93eeaaf08ed45fbf1e7e2 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 20 Jul 2021 11:13:39 +0800 Subject: [PATCH 141/178] rsa --- .../toolkit/base/utils/JacksonAdvice.java | 10 +++ .../develop/toolkit/base/utils/RSAAdvice.java | 81 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 877ce33..689f824 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -58,6 +58,16 @@ public static String serializeQuietly(ObjectMapper objectMapper, Object object, } } + @SneakyThrows(JsonProcessingException.class) + public static JsonNode deserializeTreeQuietly(ObjectMapper objectMapper, String json) { + return objectMapper.readTree(json); + } + + @SneakyThrows(JsonProcessingException.class) + public static T deserializeQuietly(ObjectMapper objectMapper, String json, Class clazz) { + return objectMapper.readValue(json, clazz); + } + /** * 用表达式从json中取值 */ diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java new file mode 100644 index 0000000..76e779a --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java @@ -0,0 +1,81 @@ +package develop.toolkit.base.utils; + +import develop.toolkit.base.struct.TwoValues; + +import javax.crypto.Cipher; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; + +/** + * RSA加密 + * + * @author qiushui on 2021-07-20. + */ +public abstract class RSAAdvice { + + private static final String KEY_ALGORITHM = "RSA"; + private static final int KEY_SIZE = 1024; + + /** + * 生成公钥和私钥对 + */ + public static TwoValues createRSAKeys() { + try { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGenerator.initialize(KEY_SIZE, new SecureRandom()); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + PublicKey publicKey = keyPair.getPublic(); + PrivateKey privateKey = keyPair.getPrivate(); + final Base64.Encoder encoder = Base64.getEncoder(); + String publicKeyValue = encoder.encodeToString(publicKey.getEncoded()); + String privateKeyValue = encoder.encodeToString(privateKey.getEncoded()); + return TwoValues.of(publicKeyValue, privateKeyValue); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } + + /** + * RSA公钥加密 + * + * @param original 原文 + * @param publicKey 公钥 + * @return 密文 + */ + public static String encrypt(String original, String publicKey) { + try { + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePublic( + new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)) + ); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + return Base64.getEncoder().encodeToString(cipher.doFinal(original.getBytes(StandardCharsets.UTF_8))); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * RSA私钥解密 + * + * @param encryptString 加密字符串 + * @param privateKey 私钥 + * @return 铭文 + */ + public static String decrypt(String encryptString, String privateKey) throws Exception { + final Base64.Decoder decoder = Base64.getDecoder(); + byte[] inputByte = decoder.decode(encryptString.getBytes(StandardCharsets.UTF_8)); + PrivateKey priKey = KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePrivate(new PKCS8EncodedKeySpec(decoder.decode(privateKey))); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, priKey); + return new String(cipher.doFinal(inputByte)); + } +} From e18461aa303ed58e8fc7ef5aee9483262c2fa857 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 20 Jul 2021 15:41:03 +0800 Subject: [PATCH 142/178] rsa --- .../develop/toolkit/base/utils/RSAAdvice.java | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java index 76e779a..8a1ea7a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java @@ -19,6 +19,7 @@ public abstract class RSAAdvice { private static final String KEY_ALGORITHM = "RSA"; private static final int KEY_SIZE = 1024; + private static final String SIGNATURE_ALGORITHM = "Sha1WithRSA"; /** * 生成公钥和私钥对 @@ -66,7 +67,7 @@ public static String encrypt(String original, String publicKey) { * * @param encryptString 加密字符串 * @param privateKey 私钥 - * @return 铭文 + * @return 明文 */ public static String decrypt(String encryptString, String privateKey) throws Exception { final Base64.Decoder decoder = Base64.getDecoder(); @@ -78,4 +79,45 @@ public static String decrypt(String encryptString, String privateKey) throws Exc cipher.init(Cipher.DECRYPT_MODE, priKey); return new String(cipher.doFinal(inputByte)); } + + /** + * 生成签名 + * + * @param data 数据 + * @param privateKey 私钥 + * @return 签名 + */ + public static String signature(byte[] data, String privateKey) { + try { + Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM); + PrivateKey priKey = KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey))); + sign.initSign(priKey); + sign.update(data); + return Base64.getEncoder().encodeToString(sign.sign()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 用公钥验证签名 + */ + public static boolean verifysSignature(byte[] data, String signatureBase64, String publicKey) { + try { + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePublic( + new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)) + ); + Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM); + sign.initVerify(pubKey); + sign.update(data); + return sign.verify(Base64.getDecoder().decode(signatureBase64)); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } } From 7f9f1a765703d8a9c5af28949badd135ee0aacef Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 5 Aug 2021 15:47:04 +0800 Subject: [PATCH 143/178] =?UTF-8?q?=E9=9B=AA=E8=8A=B1=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/SnowflakeIdWorker.java | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/SnowflakeIdWorker.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/SnowflakeIdWorker.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/SnowflakeIdWorker.java new file mode 100644 index 0000000..70b72b7 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/SnowflakeIdWorker.java @@ -0,0 +1,128 @@ +package develop.toolkit.base.components; + +import java.time.Instant; + +/** + * 雪花算法ID生成器 + * + * @author qiushui on 2021-08-05. + */ +public class SnowflakeIdWorker { + + /** + * 机器id所占的位数 + */ + private final long workerIdBits = 5L; + + /** + * 数据标识id所占的位数 + */ + private final long datacenterIdBits = 5L; + + /** + * 工作机器ID(0~31) + */ + private final long workerId; + + /** + * 数据中心ID(0~31) + */ + private final long datacenterId; + + /** + * 毫秒内序列(0~4095) + */ + private long sequence = 0L; + + /** + * 上次生成ID的时间截 + */ + private long lastTimestamp = -1L; + + /** + * 构造函数 + * + * @param workerId 工作ID (0~31) + * @param datacenterId 数据中心ID (0~31) + */ + public SnowflakeIdWorker(long workerId, long datacenterId) { + // 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) + long maxWorkerId = ~(-1L << workerIdBits); + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + // 支持的最大数据标识id,结果是31 + long maxDatacenterId = ~(-1L << datacenterIdBits); + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + /** + * 获得下一个ID (该方法是线程安全的) + * + * @return SnowflakeId + */ + public synchronized long nextId() { + long timestamp = timeGen(); + // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 + if (timestamp < lastTimestamp) { + throw new RuntimeException( + String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + // 如果是同一时间生成的,则进行毫秒内序列 + // 序列在id中占的位数 + long sequenceBits = 12L; + if (lastTimestamp == timestamp) { + // 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) + long sequenceMask = ~(-1L << sequenceBits); + sequence = (sequence + 1) & sequenceMask; + // 毫秒内序列溢出 + if (sequence == 0) { + // 阻塞到下一个毫秒,获得新的时间戳 + timestamp = tilNextMillis(lastTimestamp); + } + } + // 时间戳改变,毫秒内序列重置 + else { + sequence = 0L; + } + + // 上次生成ID的时间截 + lastTimestamp = timestamp; + long datacenterIdShift = sequenceBits + workerIdBits; + // 时间截向左移22位(5+5+12) + long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + // 开始时间截 (2020-01-01) + long twepoch = 1577808000000L; + return ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << sequenceBits) + | sequence; + } + + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + * + * @param lastTimestamp 上次生成ID的时间截 + * @return 当前时间戳 + */ + private long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + /** + * 高并发环境下,返回以毫秒为单位的当前时间 + * + * @return 当前时间(毫秒) + */ + private long timeGen() { + return Instant.now().toEpochMilli(); + } +} From 4da7fe11939eabcc3c9156614711ad8137d23841 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 13 Aug 2021 13:16:11 +0800 Subject: [PATCH 144/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/JacksonAdvice.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 689f824..b4847c7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -13,6 +13,7 @@ import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; /** @@ -38,14 +39,6 @@ public static ObjectMapper defaultObjectMapper() { return objectMapper; } - /** - * 反序列化树结构 - */ - @SneakyThrows(JsonProcessingException.class) - public static JsonNode readTreeQuietly(ObjectMapper objectMapper, String json) { - return objectMapper.readTree(json); - } - /** * 安静地序列化 */ @@ -68,6 +61,16 @@ public static T deserializeQuietly(ObjectMapper objectMapper, String json, C return objectMapper.readValue(json, clazz); } + @SneakyThrows(JsonProcessingException.class) + public static T deserializeArrayQuietly(ObjectMapper objectMapper, String json, Class clazz) { + return objectMapper.readValue(json, objectMapper.getTypeFactory().constructArrayType(clazz)); + } + + @SneakyThrows(JsonProcessingException.class) + public static , E> T deserializeCollectionQuietly(ObjectMapper objectMapper, String json, Class collectionClass, Class itemClass) { + return objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(collectionClass, itemClass)); + } + /** * 用表达式从json中取值 */ From 324c73cc21778d9f35db9875068533b7aae2c049 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 13 Aug 2021 17:50:04 +0800 Subject: [PATCH 145/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/CollectionAdvice.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 4397e9c..2c010e2 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -16,7 +16,17 @@ * @author qiushui on 2018-12-20. */ @SuppressWarnings("unused") -public final class CollectionAdvice { +public abstract class CollectionAdvice { + + /** + * 获得第一个元素 + */ + public static Optional getFirst(List list) { + return Optional + .ofNullable(list) + .filter(Predicate.not(List::isEmpty)) + .map(c -> c.get(0)); + } /** * 检查元素存在 @@ -250,8 +260,8 @@ public static Set difference(Collection master, Collection other) { * 合并多集合 */ @SafeVarargs - public static Collection merge(Supplier> supplier, Collection... collections) { - Collection collection = supplier.get(); + public static , E> T merge(Supplier supplier, Collection... collections) { + T collection = supplier.get(); for (Collection coll : collections) { if (coll != null) { collection.addAll(coll); From 5e5a637417e837fa1cbab69d7da6df42e71e4e82 Mon Sep 17 00:00:00 2001 From: developframework <408000511@qq.com> Date: Sun, 22 Aug 2021 14:46:24 +0800 Subject: [PATCH 146/178] =?UTF-8?q?java=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pom.xml b/pom.xml index 416f09b..16ea223 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ + 11 1.18.20 1.7.30 1.5.1 @@ -161,6 +162,8 @@ maven-compiler-plugin 3.8.1 + ${java.version} + ${java.version} org.projectlombok From ce69feb0a271fcfe78e038d220275f2f15c05dbe Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 26 Aug 2021 17:44:57 +0800 Subject: [PATCH 147/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/StopWatch.java | 8 ++++++-- .../java/develop/toolkit/base/utils/ArrayAdvice.java | 8 ++++++++ .../develop/toolkit/base/utils/CollectionAdvice.java | 12 +++++++++--- pom.xml | 6 +++--- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java index 0dd8725..ec9934b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/StopWatch.java @@ -3,6 +3,7 @@ import develop.toolkit.base.utils.DateTimeAdvice; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -31,8 +32,11 @@ public long end() { } public long end(String name) { - final Instant end = Instant.now(); - return end.toEpochMilli() - startInstantMap.get(name).toEpochMilli(); + return startInstantMap.get(name).until(Instant.now(), ChronoUnit.MILLIS); + } + + public long interval(String startName, String endName) { + return startInstantMap.get(startName).until(startInstantMap.get(endName), ChronoUnit.MILLIS); } public String formatEnd() { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java index 7f6ecbe..e549526 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ArrayAdvice.java @@ -210,6 +210,14 @@ public static Map groupingUniqueKey(V[] array, Function keySu return map; } + public static Map groupingUniqueKey(E[] array, Function keySupplier, Function valueSupplier) { + Map map = new HashMap<>(); + for (E item : array) { + map.put(keySupplier.apply(item), valueSupplier.apply(item)); + } + return map; + } + /** * 分组求数量 */ diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java index 2c010e2..b465a3d 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CollectionAdvice.java @@ -19,13 +19,13 @@ public abstract class CollectionAdvice { /** - * 获得第一个元素 + * 获得元素 */ - public static Optional getFirst(List list) { + public static Optional get(List list, int index) { return Optional .ofNullable(list) .filter(Predicate.not(List::isEmpty)) - .map(c -> c.get(0)); + .map(c -> c.get(index)); } /** @@ -210,6 +210,12 @@ public static Map groupingUniqueKey(Collection collection, Funct return map; } + public static Map groupingUniqueKey(Collection collection, Function keySupplier, Function valueSupplier) { + Map map = new HashMap<>(); + collection.forEach(item -> map.put(keySupplier.apply(item), valueSupplier.apply(item))); + return map; + } + /** * 分组求数量 */ diff --git a/pom.xml b/pom.xml index 16ea223..9b14abd 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,9 @@ - 11 + 11 + 11 + 1.18.20 1.7.30 1.5.1 @@ -162,8 +164,6 @@ maven-compiler-plugin 3.8.1 - ${java.version} - ${java.version} org.projectlombok From 9cd5c432733e296c2892bd877a143843c4a06426 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 27 Aug 2021 16:10:53 +0800 Subject: [PATCH 148/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/utils/RSAAdvice.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java index 8a1ea7a..a28fa30 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java @@ -1,6 +1,7 @@ package develop.toolkit.base.utils; import develop.toolkit.base.struct.TwoValues; +import org.apache.commons.lang3.ArrayUtils; import javax.crypto.Cipher; import java.nio.charset.StandardCharsets; @@ -56,7 +57,14 @@ public static String encrypt(String original, String publicKey) { ); Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, pubKey); - return Base64.getEncoder().encodeToString(cipher.doFinal(original.getBytes(StandardCharsets.UTF_8))); + final byte[] bytes = original.getBytes(StandardCharsets.UTF_8); + final int offset = 64; + byte[] enBytes = null; + for (int i = 0; i < bytes.length; i += offset) { + byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(bytes, i, i + 64)); + enBytes = ArrayUtils.addAll(enBytes, doFinal); + } + return Base64.getEncoder().encodeToString(enBytes); } catch (Exception e) { throw new RuntimeException(e); } @@ -71,13 +79,20 @@ public static String encrypt(String original, String publicKey) { */ public static String decrypt(String encryptString, String privateKey) throws Exception { final Base64.Decoder decoder = Base64.getDecoder(); - byte[] inputByte = decoder.decode(encryptString.getBytes(StandardCharsets.UTF_8)); + byte[] inputBytes = decoder.decode(encryptString.getBytes(StandardCharsets.UTF_8)); PrivateKey priKey = KeyFactory .getInstance(KEY_ALGORITHM) .generatePrivate(new PKCS8EncodedKeySpec(decoder.decode(privateKey))); Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, priKey); - return new String(cipher.doFinal(inputByte)); + + StringBuilder sb = new StringBuilder(); + final int offset = 128; + for (int i = 0; i < inputBytes.length; i += offset) { + byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(inputBytes, i, i + offset)); + sb.append(new String(doFinal)); + } + return sb.toString(); } /** From 408d03793e764a6e84398d3d1227492f72edaab4 Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 15 Sep 2021 09:48:59 +0800 Subject: [PATCH 149/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 11 ++++ .../base/components/HttpClientSender.java | 51 ++++++++++++++++++- .../toolkit/base/utils/JacksonAdvice.java | 2 +- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index b4e2928..b545981 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -13,6 +13,7 @@ import java.security.KeyStore; import java.security.SecureRandom; import java.time.Duration; +import java.util.concurrent.Executor; /** * Http发送助手 @@ -73,6 +74,8 @@ public static class Builder { private InetSocketAddress proxyAddress; + private Executor executor; + public Builder onlyPrintFailed(boolean onlyPrintFailed) { this.onlyPrintFailed = onlyPrintFailed; return this; @@ -93,6 +96,11 @@ public Builder proxyAddress(InetSocketAddress proxyAddress) { return this; } + public Builder executor(Executor executor) { + this.executor = executor; + return this; + } + public Builder ssl(InputStream pkcs12, String password) { try { KeyStore ks = KeyStore.getInstance("PKCS12"); @@ -119,6 +127,9 @@ public HttpClientHelper build() { if (proxyAddress != null) { builder.proxy(ProxySelector.of(proxyAddress)); } + if (executor != null) { + builder.executor(executor); + } final HttpClient httpClient = builder.build(); return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index a275d75..e2f4f89 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; /** * Http发送器 @@ -144,6 +145,10 @@ public HttpClientReceiver send() { return send(new StringBodySenderHandler()); } + public CompletableFuture> sendAsync() { + return sendAsync(new StringBodySenderHandler()); + } + /** * 核心发送逻辑 * @@ -162,10 +167,9 @@ public HttpClientReceiver send(SenderHandler senderHandler) { .timeout(readTimeout) .build(); final HttpClientReceiver receiver = new HttpClientReceiver<>(); + Instant start = Instant.now(); try { - Instant start = Instant.now(); HttpResponse response = httpClient.send(request, senderHandler.bodyHandler()); - receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); receiver.setHttpStatus(response.statusCode()); receiver.setHeaders(response.headers().map()); receiver.setBody(response.body()); @@ -177,6 +181,7 @@ public HttpClientReceiver send(SenderHandler senderHandler) { e.printStackTrace(); receiver.setErrorMessage(e.getMessage()); } finally { + receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { printLog(request, receiver); } @@ -184,6 +189,48 @@ public HttpClientReceiver send(SenderHandler senderHandler) { return receiver; } + /** + * 核心发送逻辑(异步) + * + * @param senderHandler 发送器扩展逻辑 + * @param 响应内容 + * @return completableFuture + */ + public CompletableFuture> sendAsync(SenderHandler senderHandler) { + final HttpRequest.Builder builder = HttpRequest + .newBuilder() + .version(httpClient.version()) + .uri(URI.create(url + StringAdvice.urlParametersFormat(parameters, true))); + headers.forEach(builder::header); + final HttpRequest request = builder + .method(method, requestBody == null ? HttpRequest.BodyPublishers.noBody() : senderHandler.bodyPublisher(requestBody)) + .timeout(readTimeout) + .build(); + Instant start = Instant.now(); + return httpClient + .sendAsync(request, senderHandler.bodyHandler()) + .handle((response, e) -> { + final HttpClientReceiver receiver = new HttpClientReceiver<>(); + if (e == null) { + receiver.setHttpStatus(response.statusCode()); + receiver.setHeaders(response.headers().map()); + receiver.setBody(response.body()); + } else if (e instanceof HttpConnectTimeoutException) { + receiver.setConnectTimeout(true); + } else if (e instanceof HttpTimeoutException) { + receiver.setReadTimeout(true); + } else if (e instanceof InterruptedException || e instanceof IOException) { + e.printStackTrace(); + receiver.setErrorMessage(e.getMessage()); + } + receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); + if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { + printLog(request, receiver); + } + return receiver; + }); + } + private String printBody(Object body) { if (body == null) { return "(No content)"; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index b4847c7..2114bb5 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -62,7 +62,7 @@ public static T deserializeQuietly(ObjectMapper objectMapper, String json, C } @SneakyThrows(JsonProcessingException.class) - public static T deserializeArrayQuietly(ObjectMapper objectMapper, String json, Class clazz) { + public static T[] deserializeArrayQuietly(ObjectMapper objectMapper, String json, Class clazz) { return objectMapper.readValue(json, objectMapper.getTypeFactory().constructArrayType(clazz)); } From 13c5db3904ebc74d3b065dafe23ca9987f54f7dd Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 15 Sep 2021 10:40:42 +0800 Subject: [PATCH 150/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/HttpClientHelper.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index b545981..c1026fd 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -2,7 +2,6 @@ import lombok.AccessLevel; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; @@ -20,7 +19,6 @@ * * @author qiushui on 2020-09-10. */ -@Slf4j @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public final class HttpClientHelper { @@ -104,10 +102,10 @@ public Builder executor(Executor executor) { public Builder ssl(InputStream pkcs12, String password) { try { KeyStore ks = KeyStore.getInstance("PKCS12"); - char[] passwordChar = password.toCharArray(); - ks.load(pkcs12, passwordChar); + char[] passwordChars = password.toCharArray(); + ks.load(pkcs12, passwordChars); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - kmf.init(ks, passwordChar); + kmf.init(ks, passwordChars); sslContext = SSLContext.getInstance("SSL"); sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); } catch (Exception e) { From b0238b5b4e6b048f6fcbc4f2d787f53111fd8148 Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 16 Sep 2021 18:07:45 +0800 Subject: [PATCH 151/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 20 +++- .../base/components/HttpClientSender.java | 109 +++++++----------- .../base/struct/http/ByteRequestBody.java | 22 ++++ .../base/struct/http/FormUrlencodedBody.java | 10 +- .../base/struct/http/HttpPostProcessor.java | 14 +++ .../base/struct/http/HttpRequestBody.java | 13 +++ .../struct/http/MultiPartFormDataBody.java | 16 ++- .../http/PrintLogHttpPostProcessor.java | 63 ++++++++++ .../base/struct/http/RawRequestBody.java | 22 ++++ .../base/struct/http/SenderHandler.java | 18 +-- 10 files changed, 223 insertions(+), 84 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/ByteRequestBody.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpRequestBody.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/RawRequestBody.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index c1026fd..4f82263 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -1,5 +1,6 @@ package develop.toolkit.base.components; +import develop.toolkit.base.struct.http.HttpPostProcessor; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -12,6 +13,8 @@ import java.security.KeyStore; import java.security.SecureRandom; import java.time.Duration; +import java.util.LinkedList; +import java.util.List; import java.util.concurrent.Executor; /** @@ -28,6 +31,8 @@ public final class HttpClientHelper { private final Duration readTimeout; + private final List globalPostProcessors; + public static Builder builder() { return new Builder(); } @@ -36,12 +41,12 @@ public static HttpClientHelper buildDefault() { return builder().build(); } - public static HttpClientHelper buildCustomize(HttpClient httpClient, boolean onlyPrintFailed, Duration readTimeout) { - return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout); + public static HttpClientHelper buildCustomize(HttpClient httpClient, boolean onlyPrintFailed, Duration readTimeout, List globalPostProcessors) { + return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout, globalPostProcessors); } public HttpClientSender request(String method, String url) { - return new HttpClientSender(httpClient, method, url, readTimeout).onlyPrintFailed(onlyPrintFailed); + return new HttpClientSender(httpClient, method, url, readTimeout, globalPostProcessors).onlyPrintFailed(onlyPrintFailed); } public HttpClientSender get(String url) { @@ -74,6 +79,8 @@ public static class Builder { private Executor executor; + private final List globalPostProcessors = new LinkedList<>(); + public Builder onlyPrintFailed(boolean onlyPrintFailed) { this.onlyPrintFailed = onlyPrintFailed; return this; @@ -99,6 +106,11 @@ public Builder executor(Executor executor) { return this; } + public Builder addGlobalPostProcessor(HttpPostProcessor globalPostProcessor) { + this.globalPostProcessors.add(globalPostProcessor); + return this; + } + public Builder ssl(InputStream pkcs12, String password) { try { KeyStore ks = KeyStore.getInstance("PKCS12"); @@ -129,7 +141,7 @@ public HttpClientHelper build() { builder.executor(executor); } final HttpClient httpClient = builder.build(); - return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout); + return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout, globalPostProcessors); } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index e2f4f89..90fbbd7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -1,11 +1,8 @@ package develop.toolkit.base.components; import develop.toolkit.base.struct.http.*; -import develop.toolkit.base.utils.DateTimeAdvice; import develop.toolkit.base.utils.StringAdvice; import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.net.URI; @@ -15,7 +12,7 @@ import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -25,7 +22,6 @@ * * @author qiushui on 2020-09-10. */ -@Slf4j @Getter public final class HttpClientSender { @@ -35,23 +31,30 @@ public final class HttpClientSender { private final String url; - private final Map headers = new HashMap<>(); + private final Map headers = new LinkedHashMap<>(); - private final Map parameters = new HashMap<>(); + private final Map parameters = new LinkedHashMap<>(); + + private final List postProcessors; private Duration readTimeout; private String debugLabel; - private Object requestBody; + private HttpRequestBody requestBody; + + private String requestStringBody; private boolean onlyPrintFailed; - protected HttpClientSender(HttpClient httpClient, String method, String url, Duration readTimeout) { + private URI uri; + + protected HttpClientSender(HttpClient httpClient, String method, String url, Duration readTimeout, List globalPostProcessors) { this.httpClient = httpClient; this.method = method; this.url = url; this.readTimeout = readTimeout; + this.postProcessors = globalPostProcessors; } public HttpClientSender header(String header, String value) { @@ -103,37 +106,43 @@ public HttpClientSender onlyPrintFailed(boolean onlyPrintFailed) { return this; } + public HttpClientSender addPostProcessor(HttpPostProcessor postProcessor) { + postProcessors.add(postProcessor); + return this; + } + public HttpClientSender bodyJson(String json) { headers.put("Content-Type", "application/json;charset=utf-8"); - this.requestBody = json; + this.requestBody = new RawRequestBody(json); return this; } public HttpClientSender bodyXml(String xml) { headers.put("Content-Type", "application/xml;charset=utf-8"); - this.requestBody = xml; + this.requestBody = new RawRequestBody(xml); return this; } public HttpClientSender bodyText(String text) { - this.requestBody = text; + headers.put("Content-Type", "text/plain;charset=utf-8"); + this.requestBody = new RawRequestBody(text); + return this; + } + + public HttpClientSender bodyBytes(byte[] bytes) { + this.requestBody = new ByteRequestBody(bytes); return this; } public HttpClientSender bodyMultiPartFormData(MultiPartFormDataBody multiPartFormDataBody) { headers.put("Content-Type", "multipart/form-data; boundary=" + multiPartFormDataBody.getBoundary()); - this.requestBody = multiPartFormDataBody.buildBodyPublisher(); + this.requestBody = multiPartFormDataBody; return this; } public HttpClientSender bodyFormUrlencoded(FormUrlencodedBody formUrlencodedBody) { headers.put("Content-Type", "application/x-www-form-urlencoded"); - this.requestBody = formUrlencodedBody.buildBody(); - return this; - } - - public HttpClientSender bodyBytes(byte[] bytes) { - this.requestBody = bytes; + this.requestBody = formUrlencodedBody; return this; } @@ -157,15 +166,17 @@ public CompletableFuture> sendAsync() { * @return receiver */ public HttpClientReceiver send(SenderHandler senderHandler) { + this.uri = URI.create(url + StringAdvice.urlParametersFormat(parameters, true)); final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(httpClient.version()) - .uri(URI.create(url + StringAdvice.urlParametersFormat(parameters, true))); + .uri(uri); headers.forEach(builder::header); final HttpRequest request = builder - .method(method, requestBody == null ? HttpRequest.BodyPublishers.noBody() : senderHandler.bodyPublisher(requestBody)) + .method(method, senderHandler.bodyPublisher(requestBody)) .timeout(readTimeout) .build(); + requestStringBody = HttpRequestBody.bodyToString(requestBody); final HttpClientReceiver receiver = new HttpClientReceiver<>(); Instant start = Instant.now(); try { @@ -182,10 +193,11 @@ public HttpClientReceiver send(SenderHandler senderHandler) { receiver.setErrorMessage(e.getMessage()); } finally { receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); - if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { - printLog(request, receiver); + for (HttpPostProcessor postProcessor : postProcessors) { + postProcessor.process(this, receiver); } } + return receiver; } @@ -197,16 +209,18 @@ public HttpClientReceiver send(SenderHandler senderHandler) { * @return completableFuture */ public CompletableFuture> sendAsync(SenderHandler senderHandler) { + this.uri = URI.create(url + StringAdvice.urlParametersFormat(parameters, true)); final HttpRequest.Builder builder = HttpRequest .newBuilder() .version(httpClient.version()) - .uri(URI.create(url + StringAdvice.urlParametersFormat(parameters, true))); + .uri(uri); headers.forEach(builder::header); final HttpRequest request = builder - .method(method, requestBody == null ? HttpRequest.BodyPublishers.noBody() : senderHandler.bodyPublisher(requestBody)) + .method(method, senderHandler.bodyPublisher(requestBody)) .timeout(readTimeout) .build(); - Instant start = Instant.now(); + requestStringBody = HttpRequestBody.bodyToString(requestBody); + final Instant start = Instant.now(); return httpClient .sendAsync(request, senderHandler.bodyHandler()) .handle((response, e) -> { @@ -224,49 +238,14 @@ public CompletableFuture> sendAsync(SenderHandle receiver.setErrorMessage(e.getMessage()); } receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); - if (log.isDebugEnabled() && (!onlyPrintFailed || !receiver.isSuccess())) { - printLog(request, receiver); - } + doPostProcessors(receiver); return receiver; }); } - private String printBody(Object body) { - if (body == null) { - return "(No content)"; - } else if (body instanceof String) { - return (String) body; - } else { - return "(Binary byte data)"; - } - } - - private void printLog(HttpRequest request, HttpClientReceiver receiver) { - StringBuilder sb = new StringBuilder("\n=========================================================================================================\n"); - sb - .append("\nlabel: ").append(debugLabel == null ? "(Undefined)" : debugLabel) - .append("\nhttp request:\n method: ").append(method).append("\n url: ") - .append(request.uri().toString()).append("\n headers:\n"); - request - .headers() - .map() - .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); - sb.append(" body: ").append(printBody(requestBody)).append("\n").append("\nhttp response:\n"); - if (receiver.isConnectTimeout()) { - sb.append(" (connect timeout ").append(httpClient.connectTimeout().map(Duration::getSeconds).orElse(0L)).append("s)"); - } else if (receiver.isReadTimeout()) { - sb.append(" (read timeout ").append(readTimeout.getSeconds()).append("s)"); - } else if (receiver.getErrorMessage() != null) { - sb.append(" (ioerror ").append(receiver.getErrorMessage()).append(")"); - } else if (receiver.getHeaders() != null) { - sb.append(" status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); - for (Map.Entry> entry : receiver.getHeaders().entrySet()) { - sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); - } - sb.append(" cost: ").append(DateTimeAdvice.millisecondPretty(receiver.getCostTime())).append("\n"); - sb.append(" body: ").append(printBody(receiver.getBody())); + private void doPostProcessors(HttpClientReceiver receiver) { + for (HttpPostProcessor postProcessor : postProcessors) { + postProcessor.process(this, receiver); } - sb.append("\n\n=========================================================================================================\n"); - log.debug(sb.toString()); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/ByteRequestBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/ByteRequestBody.java new file mode 100644 index 0000000..6052fff --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/ByteRequestBody.java @@ -0,0 +1,22 @@ +package develop.toolkit.base.struct.http; + +import lombok.RequiredArgsConstructor; + +/** + * @author qiushui on 2021-09-16. + */ +@RequiredArgsConstructor +public class ByteRequestBody implements HttpRequestBody { + + private final byte[] bytes; + + @Override + public String toString() { + return "(Binary byte data)"; + } + + @Override + public byte[] getBody() { + return bytes; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java index f1ba5d1..2571ba6 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/FormUrlencodedBody.java @@ -10,7 +10,7 @@ * @author qiushui on 2020-09-15. */ @RequiredArgsConstructor -public final class FormUrlencodedBody { +public final class FormUrlencodedBody implements HttpRequestBody { private final Map pairs; @@ -18,10 +18,16 @@ public FormUrlencodedBody() { pairs = new HashMap<>(); } - public String buildBody() { + @Override + public String getBody() { return StringAdvice.urlParametersFormat(pairs, false); } + @Override + public String toString() { + return getBody(); + } + public FormUrlencodedBody addPair(String name, Object value) { pairs.put(name, value); return this; diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java new file mode 100644 index 0000000..d4c7751 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java @@ -0,0 +1,14 @@ +package develop.toolkit.base.struct.http; + +import develop.toolkit.base.components.HttpClientSender; + +/** + * Http发送器后置处理 + * + * @author qiushui on 2021-09-16. + */ +@FunctionalInterface +public interface HttpPostProcessor { + + void process(HttpClientSender sender, HttpClientReceiver receiver); +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpRequestBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpRequestBody.java new file mode 100644 index 0000000..9cb31b2 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpRequestBody.java @@ -0,0 +1,13 @@ +package develop.toolkit.base.struct.http; + +/** + * @author qiushui on 2021-09-16. + */ +public interface HttpRequestBody { + + BODY getBody(); + + static String bodyToString(HttpRequestBody requestBody) { + return requestBody == null ? "(No content)" : requestBody.toString(); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java index 5a519c4..e812da9 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/MultiPartFormDataBody.java @@ -7,7 +7,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; -import java.net.http.HttpRequest; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -19,16 +18,17 @@ /** * @author qiushui on 2020-09-14. */ -public final class MultiPartFormDataBody { +public final class MultiPartFormDataBody implements HttpRequestBody { private final List partsSpecificationList = new ArrayList<>(); @Getter private final String boundary = RandomStringUtils.randomAlphabetic(10); - public HttpRequest.BodyPublisher buildBodyPublisher() { + @Override + public byte[] getBody() { if (partsSpecificationList.isEmpty()) { - return HttpRequest.BodyPublishers.noBody(); + return new byte[0]; } addFinalBoundaryPart(); @@ -37,8 +37,12 @@ public HttpRequest.BodyPublisher buildBodyPublisher() { * JDK的bug 参考 https://bugs.openjdk.java.net/browse/JDK-8222968 */ // return HttpRequest.BodyPublishers.ofByteArrays(PartsIterator::new); - final byte[] data = assemble(); - return HttpRequest.BodyPublishers.ofByteArray(data); + return assemble(); + } + + @Override + public String toString() { + return "(Binary byte data)"; } public MultiPartFormDataBody addPart(String name, String value) { diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java new file mode 100644 index 0000000..d93ddc7 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java @@ -0,0 +1,63 @@ +package develop.toolkit.base.struct.http; + +import develop.toolkit.base.components.HttpClientSender; +import develop.toolkit.base.utils.DateTimeAdvice; +import develop.toolkit.base.utils.K; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.time.Duration; +import java.util.List; +import java.util.Map; + +/** + * @author qiushui on 2021-09-16. + */ +@Slf4j +public class PrintLogHttpPostProcessor implements HttpPostProcessor { + + @Override + public void process(HttpClientSender sender, HttpClientReceiver receiver) { + if (log.isDebugEnabled() && (!sender.isOnlyPrintFailed() || !receiver.isSuccess())) { + debugPrintLog(sender, receiver); + } + } + + private void debugPrintLog(HttpClientSender sender, HttpClientReceiver receiver) { + StringBuilder sb = new StringBuilder("\n=========================================================================================================\n"); + sb + .append("\nlabel: ").append(K.def(sender.getDebugLabel(), "(Undefined)")) + .append("\nhttp request:\n method: ").append(sender.getMethod()).append("\n url: ") + .append(request.uri().toString()).append("\n headers:\n"); + sender + .getHeaders() + .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); + sb.append(" body: ").append(sender.getRequestStringBody()).append("\n").append("\nhttp response:\n"); + if (receiver.isConnectTimeout()) { + sb.append(" (connect timeout ").append(sender.getHttpClient().connectTimeout().map(Duration::getSeconds).orElse(0L)).append("s)"); + } else if (receiver.isReadTimeout()) { + sb.append(" (read timeout ").append(sender.getReadTimeout().getSeconds()).append("s)"); + } else if (receiver.getErrorMessage() != null) { + sb.append(" (ioerror ").append(receiver.getErrorMessage()).append(")"); + } else if (receiver.getHeaders() != null) { + sb.append(" status: ").append(receiver.getHttpStatus()).append("\n headers:\n"); + for (Map.Entry> entry : receiver.getHeaders().entrySet()) { + sb.append(" ").append(entry.getKey()).append(": ").append(StringUtils.join(entry.getValue(), ";")).append("\n"); + } + sb.append(" cost: ").append(DateTimeAdvice.millisecondPretty(receiver.getCostTime())).append("\n"); + sb.append(" body: ").append(bodyToString(receiver.getBody())); + } + sb.append("\n\n=========================================================================================================\n"); + log.debug(sb.toString()); + } + + private String bodyToString(Object body) { + if (body == null) { + return "(No content)"; + } else if (body instanceof String) { + return (String) body; + } else { + return "(Binary byte data)"; + } + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/RawRequestBody.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/RawRequestBody.java new file mode 100644 index 0000000..8718fd4 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/RawRequestBody.java @@ -0,0 +1,22 @@ +package develop.toolkit.base.struct.http; + +import lombok.RequiredArgsConstructor; + +/** + * @author qiushui on 2021-09-16. + */ +@RequiredArgsConstructor +public class RawRequestBody implements HttpRequestBody { + + private final String raw; + + @Override + public String toString() { + return raw; + } + + @Override + public String getBody() { + return raw; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java index 8a03516..848d41c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/SenderHandler.java @@ -11,13 +11,17 @@ @FunctionalInterface public interface SenderHandler { - default HttpRequest.BodyPublisher bodyPublisher(Object requestBody) { - if (requestBody instanceof HttpRequest.BodyPublisher) { - return (HttpRequest.BodyPublisher) requestBody; - } else if (requestBody instanceof String) { - return HttpRequest.BodyPublishers.ofString((String) requestBody); - } else if (requestBody.getClass().isArray()) { - return HttpRequest.BodyPublishers.ofByteArray((byte[]) requestBody); + default HttpRequest.BodyPublisher bodyPublisher(HttpRequestBody requestBody) { + if (requestBody == null) { + return HttpRequest.BodyPublishers.noBody(); + } else if (requestBody instanceof RawRequestBody) { + return HttpRequest.BodyPublishers.ofString(((RawRequestBody) requestBody).getBody()); + } else if (requestBody instanceof FormUrlencodedBody) { + return HttpRequest.BodyPublishers.ofString(((FormUrlencodedBody) requestBody).getBody()); + } else if (requestBody instanceof ByteRequestBody) { + return HttpRequest.BodyPublishers.ofByteArray(((ByteRequestBody) requestBody).getBody()); + } else if (requestBody instanceof MultiPartFormDataBody) { + return HttpRequest.BodyPublishers.ofByteArray(((MultiPartFormDataBody) requestBody).getBody()); } else { throw new AssertionError(); } From 2f06ed1eeb0b9f0744300b673a1cd415d8cc9dc6 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Sep 2021 13:32:54 +0800 Subject: [PATCH 152/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientHelper.java | 52 +++++++++---------- .../base/components/HttpClientSender.java | 22 ++++---- .../base/struct/http/HttpClientConstants.java | 36 +++++++++++++ .../struct/http/HttpClientGlobalOptions.java | 19 +++++++ .../base/struct/http/HttpPostProcessor.java | 2 +- .../http/PrintLogHttpPostProcessor.java | 6 +-- 6 files changed, 97 insertions(+), 40 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientConstants.java create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientGlobalOptions.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 4f82263..8580c14 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -1,5 +1,6 @@ package develop.toolkit.base.components; +import develop.toolkit.base.struct.http.HttpClientGlobalOptions; import develop.toolkit.base.struct.http.HttpPostProcessor; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -13,8 +14,7 @@ import java.security.KeyStore; import java.security.SecureRandom; import java.time.Duration; -import java.util.LinkedList; -import java.util.List; +import java.util.Map; import java.util.concurrent.Executor; /** @@ -22,16 +22,13 @@ * * @author qiushui on 2020-09-10. */ +@SuppressWarnings("unused") @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public final class HttpClientHelper { private final HttpClient httpClient; - private final boolean onlyPrintFailed; - - private final Duration readTimeout; - - private final List globalPostProcessors; + private final HttpClientGlobalOptions options; public static Builder builder() { return new Builder(); @@ -41,12 +38,8 @@ public static HttpClientHelper buildDefault() { return builder().build(); } - public static HttpClientHelper buildCustomize(HttpClient httpClient, boolean onlyPrintFailed, Duration readTimeout, List globalPostProcessors) { - return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout, globalPostProcessors); - } - public HttpClientSender request(String method, String url) { - return new HttpClientSender(httpClient, method, url, readTimeout, globalPostProcessors).onlyPrintFailed(onlyPrintFailed); + return new HttpClientSender(httpClient, method, url, options); } public HttpClientSender get(String url) { @@ -67,22 +60,18 @@ public HttpClientSender delete(String url) { public static class Builder { - private boolean onlyPrintFailed = true; - private SSLContext sslContext; private Duration connectTimeout = Duration.ofSeconds(10L); - private Duration readTimeout = Duration.ofSeconds(30L); - private InetSocketAddress proxyAddress; private Executor executor; - private final List globalPostProcessors = new LinkedList<>(); + private final HttpClientGlobalOptions globalOptions = new HttpClientGlobalOptions(); public Builder onlyPrintFailed(boolean onlyPrintFailed) { - this.onlyPrintFailed = onlyPrintFailed; + globalOptions.onlyPrintFailed = onlyPrintFailed; return this; } @@ -91,11 +80,6 @@ public Builder connectTimeout(Duration connectTimeout) { return this; } - public Builder readTimeout(Duration readTimeout) { - this.readTimeout = readTimeout; - return this; - } - public Builder proxyAddress(InetSocketAddress proxyAddress) { this.proxyAddress = proxyAddress; return this; @@ -106,8 +90,23 @@ public Builder executor(Executor executor) { return this; } + public Builder readTimeout(Duration readTimeout) { + globalOptions.readTimeout = readTimeout; + return this; + } + public Builder addGlobalPostProcessor(HttpPostProcessor globalPostProcessor) { - this.globalPostProcessors.add(globalPostProcessor); + globalOptions.postProcessors.add(globalPostProcessor); + return this; + } + + public Builder constant(String key, String value) { + globalOptions.constants.putConstant(key, value); + return this; + } + + public Builder constantMap(Map constantMap) { + globalOptions.constants.putConstantMap(constantMap); return this; } @@ -121,7 +120,7 @@ public Builder ssl(InputStream pkcs12, String password) { sslContext = SSLContext.getInstance("SSL"); sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); } catch (Exception e) { - throw new RuntimeException("read pkcs12 failed:" + e.getMessage()); + throw new IllegalStateException(e.getMessage()); } return this; } @@ -140,8 +139,7 @@ public HttpClientHelper build() { if (executor != null) { builder.executor(executor); } - final HttpClient httpClient = builder.build(); - return new HttpClientHelper(httpClient, onlyPrintFailed, readTimeout, globalPostProcessors); + return new HttpClientHelper(builder.build(), globalOptions); } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index 90fbbd7..dd2357f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -13,6 +13,7 @@ import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -49,28 +50,31 @@ public final class HttpClientSender { private URI uri; - protected HttpClientSender(HttpClient httpClient, String method, String url, Duration readTimeout, List globalPostProcessors) { + private final HttpClientConstants constants; + + protected HttpClientSender(HttpClient httpClient, String method, String url, HttpClientGlobalOptions options) { this.httpClient = httpClient; this.method = method; - this.url = url; - this.readTimeout = readTimeout; - this.postProcessors = globalPostProcessors; + this.readTimeout = options.readTimeout; + this.postProcessors = new LinkedList<>(options.postProcessors); + this.constants = options.constants; + this.url = constants.replace(url); } public HttpClientSender header(String header, String value) { - this.headers.put(header, value); + this.headers.put(header, constants.replace(value)); return this; } - public HttpClientSender headers(Map headers) { - if (headers != null) { - this.headers.putAll(headers); + public HttpClientSender headers(Map customHeaders) { + if (customHeaders != null) { + customHeaders.forEach((k, v) -> this.headers.put(k, constants.replace(v))); } return this; } public HttpClientSender headerAuthorization(String value) { - this.headers.put("Authorization", value); + this.headers.put("Authorization", constants.replace(value)); return this; } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientConstants.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientConstants.java new file mode 100644 index 0000000..faadd1e --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientConstants.java @@ -0,0 +1,36 @@ +package develop.toolkit.base.struct.http; + +import develop.toolkit.base.utils.StringAdvice; + +import java.util.HashMap; +import java.util.Map; + +/** + * 常量可以被{{}}占位符取代 + * + * @author qiushui on 2021-09-17. + */ +public final class HttpClientConstants { + + private final Map constants = new HashMap<>(); + + public void putConstant(String key, String value) { + constants.put(key, value); + } + + public void putConstantMap(Map constantMap) { + constants.putAll(constantMap); + } + + public String replace(String string) { + if (!constants.isEmpty()) { + for (String key : StringAdvice.regexMatchStartEnd(string, "\\{\\{", "\\}\\}")) { + final String value = constants.get(key); + if (value != null) { + string = string.replace("{{" + key + "}}", value); + } + } + } + return string; + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientGlobalOptions.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientGlobalOptions.java new file mode 100644 index 0000000..5b09daa --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpClientGlobalOptions.java @@ -0,0 +1,19 @@ +package develop.toolkit.base.struct.http; + +import java.time.Duration; +import java.util.LinkedList; +import java.util.List; + +/** + * @author qiushui on 2021-09-17. + */ +public class HttpClientGlobalOptions { + + public boolean onlyPrintFailed = true; + + public Duration readTimeout = Duration.ofSeconds(30L); + + public List postProcessors = new LinkedList<>(List.of(new PrintLogHttpPostProcessor())); + + public HttpClientConstants constants = new HttpClientConstants(); +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java index d4c7751..d6d9bd0 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/HttpPostProcessor.java @@ -10,5 +10,5 @@ @FunctionalInterface public interface HttpPostProcessor { - void process(HttpClientSender sender, HttpClientReceiver receiver); + void process(HttpClientSender sender, HttpClientReceiver receiver); } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java index d93ddc7..5f05c3f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/http/PrintLogHttpPostProcessor.java @@ -14,10 +14,10 @@ * @author qiushui on 2021-09-16. */ @Slf4j -public class PrintLogHttpPostProcessor implements HttpPostProcessor { +public final class PrintLogHttpPostProcessor implements HttpPostProcessor { @Override - public void process(HttpClientSender sender, HttpClientReceiver receiver) { + public void process(HttpClientSender sender, HttpClientReceiver receiver) { if (log.isDebugEnabled() && (!sender.isOnlyPrintFailed() || !receiver.isSuccess())) { debugPrintLog(sender, receiver); } @@ -28,7 +28,7 @@ private void debugPrintLog(HttpClientSender sender, HttpClientReceiver receiv sb .append("\nlabel: ").append(K.def(sender.getDebugLabel(), "(Undefined)")) .append("\nhttp request:\n method: ").append(sender.getMethod()).append("\n url: ") - .append(request.uri().toString()).append("\n headers:\n"); + .append(sender.getUri().toString()).append("\n headers:\n"); sender .getHeaders() .forEach((k, v) -> sb.append(" ").append(k).append(": ").append(StringUtils.join(v, ";")).append("\n")); From f0a251633bdc5930ee01924fb0a2b5a98d9e15f5 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Sep 2021 14:52:42 +0800 Subject: [PATCH 153/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientSender.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index dd2357f..55fecc1 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -78,8 +78,8 @@ public HttpClientSender headerAuthorization(String value) { return this; } - public HttpClientSender headerContentType(String value) { - this.headers.put("Content-Type", value); + public HttpClientSender headerContentType(String contentType) { + this.headers.put("Content-Type", contentType); return this; } @@ -88,9 +88,15 @@ public HttpClientSender parameter(String parameter, Object value) { return this; } - public HttpClientSender parameters(Map parameters) { - if (parameters != null) { - this.parameters.putAll(parameters); + public HttpClientSender parameters(Map parameterMap) { + if (parameterMap != null) { + parameterMap.forEach((k, v) -> { + if (v instanceof String) { + this.parameters.put(k, constants.replace((String) v)); + } else { + this.parameters.put(k, v); + } + }); } return this; } From fbe2008e7b166c0b54a7f0f36d50aaf2a122c174 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Sep 2021 17:49:24 +0800 Subject: [PATCH 154/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/HttpClientSender.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index 55fecc1..e30159c 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -203,11 +203,8 @@ public HttpClientReceiver send(SenderHandler senderHandler) { receiver.setErrorMessage(e.getMessage()); } finally { receiver.setCostTime(start.until(Instant.now(), ChronoUnit.MILLIS)); - for (HttpPostProcessor postProcessor : postProcessors) { - postProcessor.process(this, receiver); - } + doPostProcessors(receiver); } - return receiver; } From a853032bc8afa039cde8caadf834b4a14e98ca09 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 24 Sep 2021 22:08:50 +0800 Subject: [PATCH 155/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/components/HttpClientSender.java | 1 + 1 file changed, 1 insertion(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index e30159c..f09556e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -58,6 +58,7 @@ protected HttpClientSender(HttpClient httpClient, String method, String url, Htt this.readTimeout = options.readTimeout; this.postProcessors = new LinkedList<>(options.postProcessors); this.constants = options.constants; + this.onlyPrintFailed = options.onlyPrintFailed; this.url = constants.replace(url); } From ef66f14cd9bcfeb8958a83d4d9f9eac0111be4f3 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 24 Sep 2021 22:31:00 +0800 Subject: [PATCH 156/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/components/HttpClientHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java index 8580c14..e3f2943 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientHelper.java @@ -24,7 +24,7 @@ */ @SuppressWarnings("unused") @RequiredArgsConstructor(access = AccessLevel.PRIVATE) -public final class HttpClientHelper { +public class HttpClientHelper { private final HttpClient httpClient; From d9c12bbd302030dedaeeabe0b0b95c2109748ee1 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 8 Oct 2021 16:05:07 +0800 Subject: [PATCH 157/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/exception/CryptException.java | 13 ++ .../toolkit/base/utils/CryptAdvice.java | 194 ++++++++++++++++-- .../develop/toolkit/base/utils/RSAAdvice.java | 138 ------------- 3 files changed, 189 insertions(+), 156 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/exception/CryptException.java delete mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/CryptException.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/CryptException.java new file mode 100644 index 0000000..209635a --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/exception/CryptException.java @@ -0,0 +1,13 @@ +package develop.toolkit.base.exception; + +/** + * 加密解密异常 + * + * @author qiushui on 2021-10-08. + */ +public class CryptException extends RuntimeException { + + public CryptException(Throwable cause) { + super(cause); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java index 70a4870..bba112f 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java @@ -1,39 +1,197 @@ package develop.toolkit.base.utils; +import develop.toolkit.base.exception.CryptException; +import develop.toolkit.base.struct.TwoValues; import lombok.SneakyThrows; +import org.apache.commons.lang3.ArrayUtils; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.nio.charset.StandardCharsets; -import java.security.SecureRandom; +import java.security.*; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; import java.util.Base64; /** + * 加密解密增强 + * * @author qiushui on 2021-04-23. */ public abstract class CryptAdvice { - public static String encryptDES(String original, String secretKey) { - final byte[] data = initCipher(original.getBytes(StandardCharsets.UTF_8), secretKey, Cipher.ENCRYPT_MODE); - return Base64.getEncoder().encodeToString(data); - } + /** + * DES算法 + */ + public static class DES { + + /** + * 加密 + * + * @param original 原文 + * @param secretKey 密钥 + * @return 密文 + */ + public static String encrypt(String original, String secretKey) { + final byte[] data = initCipher(original.getBytes(StandardCharsets.UTF_8), secretKey, Cipher.ENCRYPT_MODE); + return Base64.getEncoder().encodeToString(data); + } + + /** + * 解密 + * + * @param ciphertext 密文 + * @param secretKey 密钥 + * @return 原文 + */ + public static String decrypt(String ciphertext, String secretKey) { + final byte[] data = Base64.getDecoder().decode(ciphertext); + return new String(initCipher(data, secretKey, Cipher.DECRYPT_MODE), StandardCharsets.UTF_8); + } - public static String decryptDES(String cryptograph, String secretKey) { - final byte[] data = Base64.getDecoder().decode(cryptograph); - return new String(initCipher(data, secretKey, Cipher.DECRYPT_MODE), StandardCharsets.UTF_8); + @SneakyThrows(Exception.class) + private static byte[] initCipher(byte[] data, String secretKey, int mode) { + final DESKeySpec dks = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8)); + final SecretKey secureKey = SecretKeyFactory.getInstance("DES").generateSecret(dks); + final Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); + cipher.init(mode, secureKey, new SecureRandom()); + return cipher.doFinal(data); + } } - @SneakyThrows(Exception.class) - private static byte[] initCipher(byte[] data, String secretKey, int mode) { - final String algorithm = "DES"; - SecureRandom random = new SecureRandom(); - DESKeySpec dks = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8)); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm); - SecretKey secureKey = keyFactory.generateSecret(dks); - Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); - cipher.init(mode, secureKey, random); - return cipher.doFinal(data); + /** + * RSA算法 + */ + public static class RSA { + + private static final String KEY_ALGORITHM = "RSA"; + private static final int KEY_SIZE = 1024; + private static final String SIGNATURE_ALGORITHM = "Sha1WithRSA"; + + /** + * 生成公钥和私钥对 + * + * @return 公钥 私钥 + */ + @SneakyThrows(NoSuchAlgorithmException.class) + public static TwoValues createRSAKeys() { + final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGenerator.initialize(KEY_SIZE, new SecureRandom()); + final KeyPair keyPair = keyPairGenerator.generateKeyPair(); + final PublicKey publicKey = keyPair.getPublic(); + final PrivateKey privateKey = keyPair.getPrivate(); + final Base64.Encoder encoder = Base64.getEncoder(); + return TwoValues.of( + encoder.encodeToString(publicKey.getEncoded()), + encoder.encodeToString(privateKey.getEncoded()) + ); + } + + /** + * RSA公钥加密 + * + * @param original 原文 + * @param publicKeyBase64 base64公钥 + * @return 密文 + */ + public static String encrypt(String original, String publicKeyBase64) throws CryptException { + try { + final byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyBase64); + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePublic(new X509EncodedKeySpec(publicKeyBytes)); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + final byte[] bytes = original.getBytes(StandardCharsets.UTF_8); + final int offset = 64; + byte[] enBytes = null; + for (int i = 0; i < bytes.length; i += offset) { + byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(bytes, i, i + 64)); + enBytes = ArrayUtils.addAll(enBytes, doFinal); + } + return Base64.getEncoder().encodeToString(enBytes); + } catch (Exception e) { + throw new CryptException(e); + } + } + + /** + * RSA私钥解密 + * + * @param ciphertext 密文 + * @param privateKeyBase64 base64私钥 + * @return 明文 + */ + public static String decrypt(String ciphertext, String privateKeyBase64) throws CryptException { + try { + final Base64.Decoder decoder = Base64.getDecoder(); + final byte[] privateKeyBytes = decoder.decode(privateKeyBase64); + PrivateKey privateKey = KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + + byte[] inputBytes = decoder.decode(ciphertext.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + final int offset = 128; + for (int i = 0; i < inputBytes.length; i += offset) { + byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(inputBytes, i, i + offset)); + sb.append(new String(doFinal)); + } + return sb.toString(); + } catch (Exception e) { + throw new CryptException(e); + } + } + + /** + * 生成base64签名结果 + * + * @param data 数据 + * @param privateKeyBase64 base64私钥 + * @return base64签名 + */ + public static String signature(byte[] data, String privateKeyBase64) { + try { + final byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyBase64); + Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM); + PrivateKey privateKey = KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); + sign.initSign(privateKey); + sign.update(data); + return Base64.getEncoder().encodeToString(sign.sign()); + } catch (Exception e) { + throw new CryptException(e); + } + } + + /** + * 用公钥验证签名 + * + * @param data 数据 + * @param signatureBase64 base64签名字符串 + * @param publicKeyBase64 base64公钥 + */ + public static boolean verifySignature(byte[] data, String signatureBase64, String publicKeyBase64) { + try { + final Base64.Decoder decoder = Base64.getDecoder(); + final byte[] publicKeyBytes = decoder.decode(publicKeyBase64); + final byte[] signatureBytes = decoder.decode(signatureBase64); + RSAPublicKey publicKey = (RSAPublicKey) KeyFactory + .getInstance(KEY_ALGORITHM) + .generatePublic(new X509EncodedKeySpec(publicKeyBytes)); + Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM); + sign.initVerify(publicKey); + sign.update(data); + return sign.verify(signatureBytes); + } catch (Exception e) { + return false; + } + } } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java deleted file mode 100644 index a28fa30..0000000 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/RSAAdvice.java +++ /dev/null @@ -1,138 +0,0 @@ -package develop.toolkit.base.utils; - -import develop.toolkit.base.struct.TwoValues; -import org.apache.commons.lang3.ArrayUtils; - -import javax.crypto.Cipher; -import java.nio.charset.StandardCharsets; -import java.security.*; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.Base64; - -/** - * RSA加密 - * - * @author qiushui on 2021-07-20. - */ -public abstract class RSAAdvice { - - private static final String KEY_ALGORITHM = "RSA"; - private static final int KEY_SIZE = 1024; - private static final String SIGNATURE_ALGORITHM = "Sha1WithRSA"; - - /** - * 生成公钥和私钥对 - */ - public static TwoValues createRSAKeys() { - try { - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); - keyPairGenerator.initialize(KEY_SIZE, new SecureRandom()); - KeyPair keyPair = keyPairGenerator.generateKeyPair(); - PublicKey publicKey = keyPair.getPublic(); - PrivateKey privateKey = keyPair.getPrivate(); - final Base64.Encoder encoder = Base64.getEncoder(); - String publicKeyValue = encoder.encodeToString(publicKey.getEncoded()); - String privateKeyValue = encoder.encodeToString(privateKey.getEncoded()); - return TwoValues.of(publicKeyValue, privateKeyValue); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } - - /** - * RSA公钥加密 - * - * @param original 原文 - * @param publicKey 公钥 - * @return 密文 - */ - public static String encrypt(String original, String publicKey) { - try { - RSAPublicKey pubKey = (RSAPublicKey) KeyFactory - .getInstance(KEY_ALGORITHM) - .generatePublic( - new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)) - ); - Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); - cipher.init(Cipher.ENCRYPT_MODE, pubKey); - final byte[] bytes = original.getBytes(StandardCharsets.UTF_8); - final int offset = 64; - byte[] enBytes = null; - for (int i = 0; i < bytes.length; i += offset) { - byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(bytes, i, i + 64)); - enBytes = ArrayUtils.addAll(enBytes, doFinal); - } - return Base64.getEncoder().encodeToString(enBytes); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * RSA私钥解密 - * - * @param encryptString 加密字符串 - * @param privateKey 私钥 - * @return 明文 - */ - public static String decrypt(String encryptString, String privateKey) throws Exception { - final Base64.Decoder decoder = Base64.getDecoder(); - byte[] inputBytes = decoder.decode(encryptString.getBytes(StandardCharsets.UTF_8)); - PrivateKey priKey = KeyFactory - .getInstance(KEY_ALGORITHM) - .generatePrivate(new PKCS8EncodedKeySpec(decoder.decode(privateKey))); - Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); - cipher.init(Cipher.DECRYPT_MODE, priKey); - - StringBuilder sb = new StringBuilder(); - final int offset = 128; - for (int i = 0; i < inputBytes.length; i += offset) { - byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(inputBytes, i, i + offset)); - sb.append(new String(doFinal)); - } - return sb.toString(); - } - - /** - * 生成签名 - * - * @param data 数据 - * @param privateKey 私钥 - * @return 签名 - */ - public static String signature(byte[] data, String privateKey) { - try { - Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM); - PrivateKey priKey = KeyFactory - .getInstance(KEY_ALGORITHM) - .generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey))); - sign.initSign(priKey); - sign.update(data); - return Base64.getEncoder().encodeToString(sign.sign()); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * 用公钥验证签名 - */ - public static boolean verifysSignature(byte[] data, String signatureBase64, String publicKey) { - try { - RSAPublicKey pubKey = (RSAPublicKey) KeyFactory - .getInstance(KEY_ALGORITHM) - .generatePublic( - new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)) - ); - Signature sign = Signature.getInstance(SIGNATURE_ALGORITHM); - sign.initVerify(pubKey); - sign.update(data); - return sign.verify(Base64.getDecoder().decode(signatureBase64)); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } -} From 0e1932c257b833be146b159fd01cc1f5e616e1f0 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 25 Oct 2021 14:43:29 +0800 Subject: [PATCH 158/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/CryptAdvice.java | 144 ++++++++++++++++-- 1 file changed, 135 insertions(+), 9 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java index bba112f..072251e 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CryptAdvice.java @@ -2,16 +2,25 @@ import develop.toolkit.base.exception.CryptException; import develop.toolkit.base.struct.TwoValues; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.lang3.ArrayUtils; import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.interfaces.RSAPublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; @@ -36,8 +45,13 @@ public static class DES { * @return 密文 */ public static String encrypt(String original, String secretKey) { - final byte[] data = initCipher(original.getBytes(StandardCharsets.UTF_8), secretKey, Cipher.ENCRYPT_MODE); - return Base64.getEncoder().encodeToString(data); + try { + final Cipher cipher = initCipher(secretKey, Cipher.ENCRYPT_MODE); + final byte[] data = cipher.doFinal(original.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(data); + } catch (Exception e) { + throw new CryptException(e); + } } /** @@ -47,18 +61,131 @@ public static String encrypt(String original, String secretKey) { * @param secretKey 密钥 * @return 原文 */ - public static String decrypt(String ciphertext, String secretKey) { - final byte[] data = Base64.getDecoder().decode(ciphertext); - return new String(initCipher(data, secretKey, Cipher.DECRYPT_MODE), StandardCharsets.UTF_8); + public static String decrypt(String ciphertext, String secretKey) throws CryptException { + try { + final byte[] data = Base64.getDecoder().decode(ciphertext); + final Cipher cipher = initCipher(secretKey, Cipher.DECRYPT_MODE); + return new String(cipher.doFinal(data), StandardCharsets.UTF_8); + } catch (Exception e) { + throw new CryptException(e); + } } - @SneakyThrows(Exception.class) - private static byte[] initCipher(byte[] data, String secretKey, int mode) { + private static Cipher initCipher(String secretKey, int mode) throws Exception { final DESKeySpec dks = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8)); final SecretKey secureKey = SecretKeyFactory.getInstance("DES").generateSecret(dks); final Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(mode, secureKey, new SecureRandom()); - return cipher.doFinal(data); + return cipher; + } + } + + public static class AES { + + private static final String ALGORITHM = "AES"; + private static final String SECRET_KEY_ALGORITHM = "PBKDF2WithHmacSHA256"; + + /** + * 密钥长度枚举 + */ + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + public enum KeyLength { + + KEY_LENGTH_128(128), + KEY_LENGTH_192(192), + KEY_LENGTH_256(256); + + @Getter + private final int length; + } + + /** + * 创建密钥和iv + * + * @param keyLength 密钥长度 + * @return 密钥 + */ + @SneakyThrows(NoSuchAlgorithmException.class) + public static TwoValues createSecretKeyAndIv(KeyLength keyLength) { + final KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); + keyGenerator.init(keyLength.getLength()); + final byte[] iv = new byte[16]; + new SecureRandom().nextBytes(iv); + final Base64.Encoder encoder = Base64.getEncoder(); + return TwoValues.of( + encoder.encodeToString(keyGenerator.generateKey().getEncoded()), + encoder.encodeToString(iv) + ); + } + + /** + * 根据密码创建密钥和iv + * + * @param keyLength 密钥长度 + * @param password 密码 + * @param salt 盐 + * @return 密钥 + */ + @SneakyThrows({NoSuchAlgorithmException.class, InvalidKeySpecException.class}) + public static TwoValues createSecretKeyAndIvByPassword(KeyLength keyLength, String password, String salt) { + final SecretKeyFactory factory = SecretKeyFactory.getInstance(SECRET_KEY_ALGORITHM); + final KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, keyLength.getLength()); + final SecretKeySpec secretKeySpec = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), ALGORITHM); + final byte[] iv = new byte[16]; + new SecureRandom().nextBytes(iv); + final Base64.Encoder encoder = Base64.getEncoder(); + return TwoValues.of( + encoder.encodeToString(secretKeySpec.getEncoded()), + encoder.encodeToString(iv) + ); + } + + /** + * 加密 + * + * @param original 原文 + * @param secretKeyBase64 base64密钥 + * @param ivBase64 base64 iv + * @return 密文 + * @throws CryptException + */ + public static String encrypt(String original, String secretKeyBase64, String ivBase64) throws CryptException { + try { + final Base64.Decoder decoder = Base64.getDecoder(); + final byte[] secretKey = decoder.decode(secretKeyBase64); + final byte[] iv = decoder.decode(ivBase64); + final SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, SECRET_KEY_ALGORITHM); + final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(iv)); + final byte[] cipherText = cipher.doFinal(original.getBytes(StandardCharsets.UTF_8)); + return Base64.getEncoder().encodeToString(cipherText); + } catch (Exception e) { + throw new CryptException(e); + } + } + + /** + * 解密 + * + * @param cipherText 密文 + * @param secretKeyBase64 base64密钥 + * @param ivBase64 base64 iv + * @return 原文 + * @throws CryptException + */ + public static String decrypt(String cipherText, String secretKeyBase64, String ivBase64) throws CryptException { + try { + final Base64.Decoder decoder = Base64.getDecoder(); + final byte[] secretKey = decoder.decode(secretKeyBase64); + final byte[] iv = decoder.decode(ivBase64); + final SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, SECRET_KEY_ALGORITHM); + final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(iv)); + final byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText)); + return new String(plainText, StandardCharsets.UTF_8); + } catch (Exception e) { + throw new CryptException(e); + } } } @@ -134,7 +261,6 @@ public static String decrypt(String ciphertext, String privateKeyBase64) throws .generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] inputBytes = decoder.decode(ciphertext.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); final int offset = 128; From 2611d86bfd0d2f3e21a7a505e0a84ab9f7ba9155 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 29 Oct 2021 16:47:48 +0800 Subject: [PATCH 159/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/develop/toolkit/base/utils/StringAdvice.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 5eadad5..1245ae4 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -3,6 +3,7 @@ import develop.toolkit.base.struct.TwoValues; import java.net.URLEncoder; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -139,4 +140,11 @@ public static String trim(String str, char ch) { } return str.substring(leftSkip, len - rightSkip); } + + /** + * 修改编码 + */ + public static String changeCharset(String str, String charset) { + return new String(str.getBytes(StandardCharsets.ISO_8859_1), Charset.forName("GBK")); + } } From 71f7e41fd13f9ba083a9ca735ae1bba3a9016d4e Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 30 Oct 2021 09:25:10 +0800 Subject: [PATCH 160/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-base/pom.xml | 5 +++++ .../toolkit/base/utils/JacksonAdvice.java | 21 +++++++++++++++++-- .../src/main/java/module-info.java | 1 + pom.xml | 5 +++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index 6e5c7cc..b6435a1 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -32,5 +32,10 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + true + \ No newline at end of file diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 2114bb5..862a644 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; @@ -28,8 +29,7 @@ public static ObjectMapper defaultObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); objectMapper.setDateFormat(new SimpleDateFormat(DateFormatConstants.STANDARD)); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, SerializationFeature.FAIL_ON_EMPTY_BEANS); objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); JavaTimeModule javaTimeModule = new JavaTimeModule(); @@ -39,6 +39,23 @@ public static ObjectMapper defaultObjectMapper() { return objectMapper; } + /** + * 常用默认的XmlMapper配置 + */ + public static XmlMapper defaultXmlMapper() { + XmlMapper xmlMapper = new XmlMapper(); + xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + xmlMapper.setDateFormat(new SimpleDateFormat(DateFormatConstants.STANDARD)); + xmlMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, SerializationFeature.FAIL_ON_EMPTY_BEANS); + xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + xmlMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN); + JavaTimeModule javaTimeModule = new JavaTimeModule(); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateFormatConstants.STANDARD_FORMATTER)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateFormatConstants.STANDARD_FORMATTER)); + xmlMapper.registerModule(javaTimeModule); + return xmlMapper; + } + /** * 安静地序列化 */ diff --git a/develop-toolkit-base/src/main/java/module-info.java b/develop-toolkit-base/src/main/java/module-info.java index 1b54da5..71ae732 100644 --- a/develop-toolkit-base/src/main/java/module-info.java +++ b/develop-toolkit-base/src/main/java/module-info.java @@ -8,6 +8,7 @@ requires java.net.http; requires com.fasterxml.jackson.databind; requires com.fasterxml.jackson.datatype.jsr310; + requires com.fasterxml.jackson.dataformat.xml; requires expression; exports develop.toolkit.base.components; diff --git a/pom.xml b/pom.xml index 9b14abd..e48c9b6 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,11 @@ jackson-datatype-jsr310 ${version.jackson} + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${version.jackson} + com.drewnoakes metadata-extractor From e27a984f60372a6a8fcfaf3274ec615c074d4714 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 30 Oct 2021 14:34:49 +0800 Subject: [PATCH 161/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/IWantData.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java new file mode 100644 index 0000000..e8760bd --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java @@ -0,0 +1,41 @@ +package develop.toolkit.base.components; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Map; + +/** + * 我想要的数据 + * + * @author qiushui on 2021-10-30. + */ +@Getter +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class IWantData { + + private final boolean success; + + private final String message; + + private final Map data; + + /** + * 成功获取 + * + * @param data 数据 + */ + public static IWantData ok(Map data) { + return new IWantData(true, "OK", data); + } + + /** + * 获取失败 + * + * @param message 失败信息 + */ + public static IWantData fail(String message) { + return new IWantData(true, message, null); + } +} From 21d03f7006141c76db51b992dcf42b307a6f12ad Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 30 Oct 2021 17:14:16 +0800 Subject: [PATCH 162/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../develop/toolkit/base/components/IWantData.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java index e8760bd..6206b79 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java @@ -13,21 +13,21 @@ */ @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) -public class IWantData { +public class IWantData { private final boolean success; private final String message; - private final Map data; + private final Map data; /** * 成功获取 * * @param data 数据 */ - public static IWantData ok(Map data) { - return new IWantData(true, "OK", data); + public static IWantData ok(Map data) { + return new IWantData<>(true, "OK", data); } /** @@ -35,7 +35,7 @@ public static IWantData ok(Map data) { * * @param message 失败信息 */ - public static IWantData fail(String message) { - return new IWantData(true, message, null); + public static IWantData fail(String message) { + return new IWantData<>(true, message, null); } } From 23f5533ae1568cd67cec10321c77187f0f14cc88 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 26 Nov 2021 17:06:47 +0800 Subject: [PATCH 163/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/HttpClientSender.java | 9 +++++---- .../toolkit/base/components/IWantData.java | 19 ++++++++++++------- .../toolkit/base/utils/StringAdvice.java | 2 +- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java index f09556e..b2e4b9a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/HttpClientSender.java @@ -1,6 +1,7 @@ package develop.toolkit.base.components; import develop.toolkit.base.struct.http.*; +import develop.toolkit.base.utils.K; import develop.toolkit.base.utils.StringAdvice; import lombok.Getter; @@ -124,24 +125,24 @@ public HttpClientSender addPostProcessor(HttpPostProcessor postProcessor) { public HttpClientSender bodyJson(String json) { headers.put("Content-Type", "application/json;charset=utf-8"); - this.requestBody = new RawRequestBody(json); + this.requestBody = K.map(json, RawRequestBody::new); return this; } public HttpClientSender bodyXml(String xml) { headers.put("Content-Type", "application/xml;charset=utf-8"); - this.requestBody = new RawRequestBody(xml); + this.requestBody = K.map(xml, RawRequestBody::new); return this; } public HttpClientSender bodyText(String text) { headers.put("Content-Type", "text/plain;charset=utf-8"); - this.requestBody = new RawRequestBody(text); + this.requestBody = K.map(text, RawRequestBody::new); return this; } public HttpClientSender bodyBytes(byte[] bytes) { - this.requestBody = new ByteRequestBody(bytes); + this.requestBody = K.map(bytes, ByteRequestBody::new); return this; } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java index 6206b79..2d95f7b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java @@ -4,8 +4,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.util.Map; - /** * 我想要的数据 * @@ -13,29 +11,36 @@ */ @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) -public class IWantData { +public class IWantData { private final boolean success; private final String message; - private final Map data; + private final T data; /** * 成功获取 * * @param data 数据 */ - public static IWantData ok(Map data) { + public static IWantData ok(T data) { return new IWantData<>(true, "OK", data); } + /** + * 成功获取 + */ + public static IWantData ok() { + return ok(null); + } + /** * 获取失败 * * @param message 失败信息 */ - public static IWantData fail(String message) { - return new IWantData<>(true, message, null); + public static IWantData fail(String message) { + return new IWantData<>(false, message, null); } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java index 1245ae4..08a4f5a 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/StringAdvice.java @@ -114,7 +114,7 @@ public static String intervalFormat(String separator, Object... objs) { * 处理成url参数格式 */ public static String urlParametersFormat(Map parameters, boolean needQuestionMark) { - if (parameters.isEmpty()) { + if (parameters == null || parameters.isEmpty()) { return ""; } return (needQuestionMark ? "?" : "") + parameters From a98f8bf83456c0d37e299e386066f5fdbd2e3b76 Mon Sep 17 00:00:00 2001 From: qiushui Date: Sat, 4 Dec 2021 13:02:12 +0800 Subject: [PATCH 164/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/components/ConcurrentTesting.java | 60 +++++++++++++++++++ .../toolkit/base/utils/JacksonAdvice.java | 35 +++++++++++ 2 files changed, 95 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java new file mode 100644 index 0000000..1de235e --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java @@ -0,0 +1,60 @@ +package develop.toolkit.base.components; + +import develop.toolkit.base.struct.http.HttpClientReceiver; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * 并发测试工具 + * + * @author qiushui on 2021-12-04. + */ +public final class ConcurrentTesting { + + private final ExecutorService service; + + private final int cycleCount; + + private final int interval; + + private final HttpClientHelper helper; + + public ConcurrentTesting(int threadCount, int cycleCount, int interval) { + this.helper = HttpClientHelper.buildDefault(); + this.service = Executors.newFixedThreadPool(threadCount); + this.cycleCount = cycleCount; + this.interval = interval; + } + + public ConcurrentTesting(HttpClientHelper helper, int threadCount, int cycleCount, int interval) { + this.helper = helper; + this.service = Executors.newFixedThreadPool(threadCount); + this.cycleCount = cycleCount; + this.interval = interval; + } + + public void start(Function> function) { + start( + function, + receiver -> System.out.printf("【%s】%s\t%s%n", Thread.currentThread().getName(), receiver.getHttpStatus(), receiver.getBody()) + ); + } + + public void start(Function> function, Consumer> consumer) { + service.execute(() -> { + for (int i = 0; i < cycleCount; i++) { + if (interval > 0) { + try { + Thread.sleep(interval); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + consumer.accept(function.apply(helper)); + } + }); + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 862a644..39d6273 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -2,7 +2,9 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.TreeNode; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; @@ -12,10 +14,14 @@ import develop.toolkit.base.struct.KeyValuePair; import lombok.SneakyThrows; +import java.lang.reflect.Array; import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.function.Function; /** * @author qiushui on 2020-09-15. @@ -73,6 +79,11 @@ public static JsonNode deserializeTreeQuietly(ObjectMapper objectMapper, String return objectMapper.readTree(json); } + @SneakyThrows(JsonProcessingException.class) + public static T treeToValueQuietly(ObjectMapper objectMapper, TreeNode node, Class clazz) { + return objectMapper.treeToValue(node, clazz); + } + @SneakyThrows(JsonProcessingException.class) public static T deserializeQuietly(ObjectMapper objectMapper, String json, Class clazz) { return objectMapper.readValue(json, clazz); @@ -142,6 +153,30 @@ public static Object[] deserializeValues(ObjectMapper objectMapper, JsonNode roo return values; } + /** + * ArrayNode转到List + */ + public static List arrayNodeToList(ArrayNode arrayNode, Function function) { + List list = new ArrayList<>(arrayNode.size()); + for (JsonNode node : arrayNode) { + list.add(function.apply(node)); + } + return Collections.unmodifiableList(list); + } + + /** + * ArrayNode转到数组 + */ + @SuppressWarnings("unchecked") + public static T[] arrayNodeToArray(ArrayNode arrayNode, Class clazz, Function function) { + final T[] array = (T[]) Array.newInstance(clazz, arrayNode.size()); + int i = 0; + for (JsonNode node : arrayNode) { + array[i++] = function.apply(node); + } + return array; + } + private static JsonNode parseExpressionToJsonNode(JsonNode jsonNode, Expression expression) { if (expression != EmptyExpression.INSTANCE) { for (Expression singleExpression : expression.expressionTree()) { From 5d6b8be574c2d0ba9b10551b4d4df15cc8f6f2a9 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Dec 2021 11:18:21 +0800 Subject: [PATCH 165/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/components/IWantData.java | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java index 2d95f7b..5519583 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/IWantData.java @@ -4,6 +4,10 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + /** * 我想要的数据 * @@ -13,10 +17,13 @@ @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class IWantData { + // 是否成功 private final boolean success; + // 失败信息 private final String message; + // 想要的数据 private final T data; /** @@ -25,13 +32,13 @@ public class IWantData { * @param data 数据 */ public static IWantData ok(T data) { - return new IWantData<>(true, "OK", data); + return new IWantData<>(true, null, data); } /** * 成功获取 */ - public static IWantData ok() { + public static IWantData ok() { return ok(null); } @@ -43,4 +50,73 @@ public static IWantData ok() { public static IWantData fail(String message) { return new IWantData<>(false, message, null); } + + /** + * 转换 + * + * @param function 转换函数 + * @param 目标类型 + * @return 转换值 + */ + public IWantData map(Function function) { + return success ? IWantData.ok(function.apply(data)) : IWantData.fail(message); + } + + /** + * 扁平化转换 + * + * @param function 转换函数 + * @param 目标类型 + * @return 转换值 + */ + public IWantData flatMap(Function> function) { + return success ? function.apply(data) : IWantData.fail(message); + } + + /** + * 提供默认值的数据获取 + * + * @param defaultValue 默认值 + * @param messageConsumer 失败信息处理 + * @return 数据值 + */ + public T returnData(T defaultValue, Consumer messageConsumer) { + if (success) { + return data; + } + if (messageConsumer != null) { + messageConsumer.accept(message); + } + return defaultValue; + } + + /** + * 提供默认值的数据获取 + * + * @param defaultSupplier 默认值提供器 + * @param messageConsumer 失败信息处理 + * @return 数据值 + */ + public T returnData(Supplier defaultSupplier, Consumer messageConsumer) { + if (success) { + return data; + } + if (messageConsumer != null) { + messageConsumer.accept(message); + } + return defaultSupplier.get(); + } + + /** + * 会抛异常的数据获取 + * + * @param throwableFunction 异常函数 + * @return 数据值 + */ + public T returnDataThrows(Function throwableFunction) { + if (success) { + return data; + } + throw throwableFunction.apply(message); + } } From 7d079ce330a31a37974f0ffc925f20f4f6efb986 Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 17 Dec 2021 17:11:23 +0800 Subject: [PATCH 166/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- develop-toolkit-multimedia/pom.xml | 5 + .../toolkit/multimedia/image/ImageAdvice.java | 19 ++-- .../toolkit/multimedia/image/ImageType.java | 31 ------ .../multimedia/image/MediaMetadataAdvice.java | 99 +++++++++++++++++++ .../src/main/java/module-info.java | 1 + pom.xml | 2 +- 6 files changed, 116 insertions(+), 41 deletions(-) delete mode 100644 develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java create mode 100644 develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/MediaMetadataAdvice.java diff --git a/develop-toolkit-multimedia/pom.xml b/develop-toolkit-multimedia/pom.xml index 9f53f25..c1b857b 100644 --- a/develop-toolkit-multimedia/pom.xml +++ b/develop-toolkit-multimedia/pom.xml @@ -18,6 +18,11 @@ com.github.developframework develop-toolkit-base + + commons-io + commons-io + 2.11.0 + com.drewnoakes metadata-extractor diff --git a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java index 3d739c8..75f6db7 100644 --- a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java +++ b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageAdvice.java @@ -1,12 +1,13 @@ package develop.toolkit.multimedia.image; +import com.drew.imaging.FileType; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Metadata; import com.drew.metadata.MetadataException; import com.drew.metadata.exif.ExifIFD0Directory; import develop.toolkit.base.utils.CompareAdvice; -import develop.toolkit.base.utils.IOAdvice; +import org.apache.commons.io.IOUtils; import javax.imageio.ImageIO; import java.awt.*; @@ -27,11 +28,11 @@ public abstract class ImageAdvice { * @param inputStream 图片输入流 * @param outputStream 输出流 * @param rectangle 裁切区域 - * @param outImageType 输出图片类型 + * @param outFileType 输出图片类型 * @throws IOException */ - public static void fixOrientationAndCut(InputStream inputStream, OutputStream outputStream, Rectangle rectangle, ImageType outImageType) throws IOException { - final byte[] data = IOAdvice.toByteArray(inputStream); + public static void fixOrientationAndCut(InputStream inputStream, OutputStream outputStream, Rectangle rectangle, FileType outFileType) throws IOException { + final byte[] data = IOUtils.toByteArray(inputStream); ByteArrayInputStream bais = new ByteArrayInputStream(data); final int angle = readOrientationAngle(bais); bais.close(); @@ -41,7 +42,7 @@ public static void fixOrientationAndCut(InputStream inputStream, OutputStream ou rectangle ); bais.close(); - ImageIO.write(image, outImageType.getExtensionNames()[0], outputStream); + ImageIO.write(image, outFileType.getAllExtensions()[0], outputStream); } /** @@ -50,11 +51,11 @@ public static void fixOrientationAndCut(InputStream inputStream, OutputStream ou * @param inputStream 图片输入流 * @param outputStream 输出流 * @param width 定宽 - * @param outImageType 输出图片类型 + * @param outFileType 输出图片类型 * @throws IOException */ - public static void fixOrientationAndZoom(InputStream inputStream, OutputStream outputStream, int width, ImageType outImageType) throws IOException { - final byte[] data = IOAdvice.toByteArray(inputStream); + public static void fixOrientationAndZoom(InputStream inputStream, OutputStream outputStream, int width, FileType outFileType) throws IOException { + final byte[] data = IOUtils.toByteArray(inputStream); ByteArrayInputStream bais = new ByteArrayInputStream(data); final int angle = readOrientationAngle(bais); bais.close(); @@ -64,7 +65,7 @@ public static void fixOrientationAndZoom(InputStream inputStream, OutputStream o width ); bais.close(); - ImageIO.write(image, outImageType.getExtensionNames()[0], outputStream); + ImageIO.write(image, outFileType.getAllExtensions()[0], outputStream); } /** diff --git a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java deleted file mode 100644 index c0acb49..0000000 --- a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/ImageType.java +++ /dev/null @@ -1,31 +0,0 @@ -package develop.toolkit.multimedia.image; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -/** - * @author qiushui on 2021-06-20. - */ -@RequiredArgsConstructor -public enum ImageType { - - JPEG(new String[]{"jpg", "jpeg"}), - - PNG(new String[]{"png"}), - - GIF(new String[]{"gif"}); - - @Getter - private final String[] extensionNames; - - public static ImageType of(String extensionName) { - for (ImageType type : ImageType.values()) { - for (String name : type.extensionNames) { - if (name.equalsIgnoreCase(extensionName)) { - return type; - } - } - } - throw new IllegalArgumentException("not support image type: " + extensionName); - } -} diff --git a/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/MediaMetadataAdvice.java b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/MediaMetadataAdvice.java new file mode 100644 index 0000000..e072242 --- /dev/null +++ b/develop-toolkit-multimedia/src/main/java/develop/toolkit/multimedia/image/MediaMetadataAdvice.java @@ -0,0 +1,99 @@ +package develop.toolkit.multimedia.image; + +import com.drew.imaging.FileType; +import com.drew.imaging.ImageMetadataReader; +import com.drew.imaging.ImageProcessingException; +import com.drew.metadata.Directory; +import com.drew.metadata.Metadata; +import com.drew.metadata.Tag; +import com.drew.metadata.exif.ExifSubIFDDirectory; +import com.drew.metadata.mov.QuickTimeDirectory; +import com.drew.metadata.mp4.Mp4Directory; +import develop.toolkit.base.utils.DateTimeAdvice; +import lombok.SneakyThrows; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.Optional; + +/** + * @author qiushui on 2021-12-17. + */ +public abstract class MediaMetadataAdvice { + + /** + * 根据扩展名获取文件类型 + * + * @param extensionName 扩展名 + */ + public static FileType getFileTypeByExtensionName(String extensionName) { + for (FileType fileType : FileType.values()) { + for (String extension : fileType.getAllExtensions()) { + if (extension.equals(extensionName)) { + return fileType; + } + } + } + return FileType.Unknown; + } + + /** + * 根据媒体类型获取文件类型 + * + * @param mediaType 媒体类型 + */ + public static FileType getFileTypeByMediaType(String mediaType) { + for (FileType fileType : FileType.values()) { + if (fileType.getMimeType().equals(mediaType)) { + return fileType; + } + } + return FileType.Unknown; + } + + /** + * 打印所有值 + * + * @param inputStream 文件流 + */ + @SneakyThrows({ImageProcessingException.class, IOException.class}) + public static void printMetadataTags(InputStream inputStream) { + final Metadata metadata = ImageMetadataReader.readMetadata(inputStream); + final Iterable directories = metadata.getDirectories(); + for (Directory directory : directories) { + for (Tag tag : directory.getTags()) { + System.out.println(tag); + } + } + } + + /** + * 提取图片文件中的创建时间 + */ + @SneakyThrows({ImageProcessingException.class, IOException.class}) + public static LocalDateTime extractCreateTimeForImage(File file) { + Metadata metadata = ImageMetadataReader.readMetadata(file); + return getMetadataDate(metadata, ExifSubIFDDirectory.class, ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL).orElse(null); + } + + /** + * 提取视频文件中的创建时间 + */ + @SneakyThrows({ImageProcessingException.class, IOException.class}) + public static LocalDateTime extractCreateTimeForVideo(File file) { + Metadata metadata = ImageMetadataReader.readMetadata(file); + return getMetadataDate(metadata, Mp4Directory.class, Mp4Directory.TAG_CREATION_TIME) + .orElseGet(() -> + getMetadataDate(metadata, QuickTimeDirectory.class, QuickTimeDirectory.TAG_CREATION_TIME).orElse(null) + ); + } + + private static Optional getMetadataDate(Metadata metadata, Class directoryClass, int tag) { + return Optional + .ofNullable(metadata.getFirstDirectoryOfType(directoryClass)) + .map(directory -> directory.getDate(tag)) + .map(DateTimeAdvice::toLocalDateTime); + } +} diff --git a/develop-toolkit-multimedia/src/main/java/module-info.java b/develop-toolkit-multimedia/src/main/java/module-info.java index 72874bc..86811a3 100644 --- a/develop-toolkit-multimedia/src/main/java/module-info.java +++ b/develop-toolkit-multimedia/src/main/java/module-info.java @@ -6,6 +6,7 @@ requires develop.toolkit.base; requires java.desktop; requires lombok; + requires org.apache.commons.io; exports develop.toolkit.multimedia.image; } \ No newline at end of file diff --git a/pom.xml b/pom.xml index e48c9b6..65c54fd 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 1.7.30 1.5.1 2.11.3 - 2.15.0 + 2.16.0 From 22eda5c0f4ced37d306e3e3dcb6d0d817d431345 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 21 Dec 2021 10:36:37 +0800 Subject: [PATCH 167/178] =?UTF-8?q?=E6=88=AA=E5=8F=96=E5=AD=97=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/FileAdvice.java | 24 +++++++++++++++++++ .../develop/toolkit/base/utils/IOAdvice.java | 22 +++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java index 6cf2f9f..4f7f958 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java @@ -76,4 +76,28 @@ private static void eachFiles(File dir, Stack stack, List files, Pre } } } + + /** + * 截取文件中某一段的字节数据 + * + * @param bufferSize 缓冲区大小 + * @param offset 偏移量 + * @param chunkSize 截取块大小 + * @param file 文件 内部会采用随机读取文件RandomAccessFile + * @param out 输出流 + * @throws IOException IO异常 + */ + public static long sliceBytes(int bufferSize, long offset, long chunkSize, File file, OutputStream out) throws IOException { + try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) { + randomAccessFile.seek(offset); + long transferred = 0L; + int read; + final byte[] buffer = new byte[bufferSize]; + while (transferred < chunkSize && (read = randomAccessFile.read(buffer, 0, (int) Math.min(buffer.length, chunkSize - transferred))) != -1) { + transferred += read; + out.write(buffer, 0, read); + } + return transferred; + } + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java index 4493411..37d84b7 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/IOAdvice.java @@ -353,4 +353,26 @@ public static void printInputStream(InputStream inputStream, Charset charset) { public static void printInputStream(InputStream inputStream) { readLines(inputStream, StandardCharsets.UTF_8).forEach(System.out::println); } + + /** + * 截取输入流中某一段的字节数据 + * + * @param bufferSize 缓冲区大小 + * @param offset 偏移量 + * @param chunkSize 截取块大小 + * @param in 输入流 + * @param out 输出流 + * @throws IOException IO异常 + */ + public static long sliceBytes(int bufferSize, long offset, long chunkSize, InputStream in, OutputStream out) throws IOException { + in.skip(offset); + long transferred = 0L; + int read; + final byte[] buffer = new byte[bufferSize]; + while (transferred < chunkSize && (read = in.read(buffer, 0, (int) Math.min(buffer.length, chunkSize - transferred))) != -1) { + transferred += read; + out.write(buffer, 0, read); + } + return transferred; + } } From 4e40f52052a4e87a91e23fc226871dde45ce68df Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 10 Feb 2022 17:04:43 +0800 Subject: [PATCH 168/178] mybatis --- .../develop/toolkit/mybatis/BaseMapper.java | 14 ++++ .../mybatis/BaseMapperMysqlProvider.java | 11 +++ .../toolkit/mybatis/MybatisAdvice.java | 9 +++ .../toolkit/mybatis/SimpleMapperHelper.java | 79 +++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapper.java create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapperMysqlProvider.java create mode 100644 develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/SimpleMapperHelper.java diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapper.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapper.java new file mode 100644 index 0000000..01fcd13 --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapper.java @@ -0,0 +1,14 @@ +package develop.toolkit.mybatis; + +import org.apache.ibatis.annotations.SelectProvider; + +import java.util.List; + +/** + * @author qiushui on 2022-02-10. + */ +public interface BaseMapper { + + @SelectProvider(type = BaseMapperMysqlProvider.class, method = "select") + List select(Object search); +} diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapperMysqlProvider.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapperMysqlProvider.java new file mode 100644 index 0000000..c53b5e1 --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/BaseMapperMysqlProvider.java @@ -0,0 +1,11 @@ +package develop.toolkit.mybatis; + +/** + * @author qiushui on 2022-02-10. + */ +public class BaseMapperMysqlProvider { + + public String select(Object search) { + return null; + } +} diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java index 20b80ff..fa1ff9d 100644 --- a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/MybatisAdvice.java @@ -3,6 +3,7 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; @@ -34,6 +35,14 @@ public static SqlSessionFactory buildSqlSessionFactory(ConfigurationHandler conf configurationHandler.configMapperRegistry(configuration.getMapperRegistry()); configurationHandler.configTypeAliasRegistry(configuration.getTypeAliasRegistry()); configurationHandler.configInterceptors(configuration.getInterceptors()); + + for (MappedStatement mappedStatement : configuration.getMappedStatements()) { + try { + SimpleMapperHelper.changeMs(mappedStatement); + } catch (Exception e) { + e.printStackTrace(); + } + } return new SqlSessionFactoryBuilder().build(configuration); } } diff --git a/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/SimpleMapperHelper.java b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/SimpleMapperHelper.java new file mode 100644 index 0000000..a5d85ff --- /dev/null +++ b/develop-toolkit-mybatis/src/main/java/develop/toolkit/mybatis/SimpleMapperHelper.java @@ -0,0 +1,79 @@ +package develop.toolkit.mybatis; + +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.SystemMetaObject; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; + +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +/** + * @author qiushui on 2022-02-10. + */ +public class SimpleMapperHelper { + + public static final XMLLanguageDriver XML_LANGUAGE_DRIVER = new XMLLanguageDriver(); + + /** + * 获取泛型类型 + */ + public static Class getEntityClass(Class mapperClass) { + Type[] types = mapperClass.getGenericInterfaces(); + Class entityClass = null; + for (Type type : types) { + if (type instanceof ParameterizedType) { + ParameterizedType t = (ParameterizedType) type; + //判断父接口是否为 BaseMapper.class + if (t.getRawType() == BaseMapper.class) { + //得到泛型类型 + entityClass = (Class) t.getActualTypeArguments()[0]; + break; + } + } + } + return entityClass; + } + + /** + * 替换 SqlSource + */ + public static void changeMs(MappedStatement ms) throws Exception { + String msId = ms.getId(); + //标准msId为 包名.接口名.方法名 + int lastIndex = msId.lastIndexOf("."); + String methodName = msId.substring(lastIndex + 1); + String interfaceName = msId.substring(0, lastIndex); + Class mapperClass = Class.forName(interfaceName); + //判断是否继承了通用接口 + if (BaseMapper.class.isAssignableFrom(mapperClass)) { + //判断当前方法是否为通用 select 方法 + if (methodName.equals("select")) { + Class entityClass = getEntityClass(mapperClass); + //必须使用"); + //解析 sqlSource + SqlSource sqlSource = XML_LANGUAGE_DRIVER.createSqlSource(ms.getConfiguration(), sqlBuilder.toString(), entityClass); + //替换 + MetaObject msObject = SystemMetaObject.forObject(ms); + msObject.setValue("sqlSource", sqlSource); + } + } + } +} From 730ae557cc2761b47f60887a993b66cc47e4ba69 Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 19 Apr 2022 09:58:56 +0800 Subject: [PATCH 169/178] advice --- .../toolkit/base/utils/CompressAdvice.java | 68 +++++++++++ .../toolkit/base/utils/FileAdvice.java | 113 ++++++++++-------- 2 files changed, 131 insertions(+), 50 deletions(-) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java new file mode 100644 index 0000000..63601a1 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java @@ -0,0 +1,68 @@ +package develop.toolkit.base.utils; + +import java.io.*; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +/** + * 压缩增强 + * + * @author qiushui on 2022-04-17. + */ +public abstract class CompressAdvice { + + public static class GZip { + + public static void compress(InputStream inputStream, OutputStream outputStream) throws IOException { + try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream)) { + inputStream.transferTo(gzipOutputStream); + } + } + + public static void compress(byte[] data, OutputStream outputStream) throws IOException { + try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) { + compress(bais, outputStream); + } + } + + public static byte[] compress(InputStream inputStream) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + compress(inputStream, baos); + return baos.toByteArray(); + } + } + + public static byte[] compress(byte[] data) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + compress(data, baos); + return baos.toByteArray(); + } + } + + public static void uncompress(InputStream inputStream, OutputStream outputStream) throws IOException { + try (GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream)) { + gzipInputStream.transferTo(outputStream); + } + } + + public static void uncompress(byte[] data, OutputStream outputStream) throws IOException { + try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) { + uncompress(bais, outputStream); + } + } + + public static byte[] uncompress(InputStream inputStream) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + uncompress(inputStream, baos); + return baos.toByteArray(); + } + } + + public static byte[] uncompress(byte[] data) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + uncompress(data, baos); + return baos.toByteArray(); + } + } + } +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java index 4f7f958..6938d20 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/FileAdvice.java @@ -1,13 +1,12 @@ package develop.toolkit.base.utils; -import lombok.SneakyThrows; - import java.io.*; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Stack; import java.util.function.Predicate; /** @@ -15,65 +14,79 @@ */ public abstract class FileAdvice { - /** - * 打开缓冲写 - */ - public static BufferedWriter open(File file, boolean append) throws IOException { - return new BufferedWriter( - new OutputStreamWriter( - new FileOutputStream(file, append), - StandardCharsets.UTF_8 - ) - ); + public static void write(Path filePath, CharSequence text, Charset charset, boolean append) { + try { + touch(filePath); + Files.writeString( + filePath, + text, + charset, + StandardOpenOption.WRITE, + append ? StandardOpenOption.APPEND : StandardOpenOption.TRUNCATE_EXISTING + ); + } catch (IOException e) { + throw new UncheckedIOException(e); + } } - @SneakyThrows(IOException.class) - public static void write(File file, String text, boolean append) { - if (file.exists() || file.getParentFile().mkdirs()) { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file, append), StandardCharsets.UTF_8)) { - writer.write(text); - } + public static void write(Path filePath, Iterable lines, Charset charset, boolean append) { + try { + touch(filePath); + Files.write( + filePath, + lines, + charset, + StandardOpenOption.WRITE, + append ? StandardOpenOption.APPEND : StandardOpenOption.TRUNCATE_EXISTING + ); + } catch (IOException e) { + throw new UncheckedIOException(e); } } - @SneakyThrows(IOException.class) - public static void write(File file, List lines, boolean append) { - if (file.exists() || file.getParentFile().mkdirs()) { - try (BufferedWriter writer = open(file, append)) { - for (String line : lines) { - writer.write(line); - writer.newLine(); - } - } + public static void touch(Path path) throws IOException { + final Path parent = path.getParent(); + if (Files.notExists(parent)) { + Files.createDirectories(parent); + } + if (Files.notExists(path)) { + Files.createFile(path); } } /** * 遍历目录 找到所有满足条件的文件 */ - public static List files(File dir, Predicate predicate) { - if (dir.isFile()) { - return Collections.emptyList(); - } - List files = new LinkedList<>(); - Stack stack = new Stack<>(); - stack.push(dir); - do { - eachFiles(stack.pop(), stack, files, predicate); - } while (!stack.empty()); - return List.copyOf(files); - } + public static List files(Path path, Predicate predicate) { + List paths = new LinkedList<>(); + try { + Files.walkFileTree(path, new FileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + return FileVisitResult.CONTINUE; + } - private static void eachFiles(File dir, Stack stack, List files, Predicate predicate) { - final File[] listFiles = dir.listFiles(); - if (listFiles != null) { - for (File file : listFiles) { - if (file.isDirectory()) { - stack.push(file); - } else if (predicate.test(file)) { - files.add(file); + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (predicate.test(file)) { + paths.add(path); + } + return FileVisitResult.CONTINUE; } - } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + }); + return Collections.unmodifiableList(paths); + } catch (IOException e) { + throw new UncheckedIOException(e); } } From 4959a2224aee0eb79d943233dd5daa5731916d4b Mon Sep 17 00:00:00 2001 From: qiushui Date: Wed, 20 Apr 2022 17:33:36 +0800 Subject: [PATCH 170/178] zip --- .../toolkit/base/struct/ZipWrapper.java | 24 +++++++++++++++++ .../toolkit/base/utils/CompressAdvice.java | 26 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java new file mode 100644 index 0000000..5cf7b94 --- /dev/null +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java @@ -0,0 +1,24 @@ +package develop.toolkit.base.struct; + +import lombok.Getter; +import lombok.Setter; + +import java.io.InputStream; +import java.util.List; +import java.util.function.Supplier; + +/** + * @author qiushui on 2022-04-19. + */ +@Getter +@Setter +public class ZipWrapper { + + private String filename; + + private Supplier inputStreamSupplier; + + private boolean file; + + private List children; +} diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java index 63601a1..015d9de 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java @@ -1,8 +1,12 @@ package develop.toolkit.base.utils; +import develop.toolkit.base.struct.ZipWrapper; + import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * 压缩增强 @@ -65,4 +69,26 @@ public static byte[] uncompress(byte[] data) throws IOException { } } } + + public static class Zip { + + public static void compress(ZipWrapper zipWrapper, OutputStream outputStream) { + ZipOutputStream zos = new ZipOutputStream(outputStream); + + + } + + private static void recursiveCompress(ZipWrapper zipWrapper, String parentPath, ZipOutputStream zos) throws IOException { + if (zipWrapper.isFile()) { + final ZipEntry zipEntry = new ZipEntry(parentPath + File.separator + zipWrapper.getFilename()); + zos.putNextEntry(zipEntry); + try (InputStream is = zipWrapper.getInputStreamSupplier().get()) { + is.transferTo(zos); + } + zos.closeEntry(); + } else { + + } + } + } } From 85692f9c368fd7879932528ac646152a02136ca0 Mon Sep 17 00:00:00 2001 From: developframework <408000511@qq.com> Date: Wed, 20 Apr 2022 22:21:01 +0800 Subject: [PATCH 171/178] zip --- .../toolkit/base/struct/ZipWrapper.java | 39 ++++++++++ .../toolkit/base/utils/CompressAdvice.java | 73 ++++++++++++++++++- 2 files changed, 108 insertions(+), 4 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java index 5cf7b94..8efc582 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/struct/ZipWrapper.java @@ -4,8 +4,11 @@ import lombok.Setter; import java.io.InputStream; +import java.nio.file.attribute.FileTime; +import java.time.LocalDateTime; import java.util.List; import java.util.function.Supplier; +import java.util.zip.ZipEntry; /** * @author qiushui on 2022-04-19. @@ -21,4 +24,40 @@ public class ZipWrapper { private boolean file; private List children; + + private boolean stored; + + private long compressedSize; + + private long size; + + private long crc; + + private FileTime creationTime; + + private FileTime lastAccessTime; + + private FileTime lastModifyTime; + + private long time; + + private String comment; + + private LocalDateTime timeLocal; + + private byte[] extra; + + public void configureZipEntry(ZipEntry zipEntry) { + zipEntry.setMethod(stored ? ZipEntry.STORED : ZipEntry.DEFLATED); + zipEntry.setCompressedSize(compressedSize); + zipEntry.setSize(size); + zipEntry.setCrc(crc); + zipEntry.setCreationTime(creationTime); + zipEntry.setLastAccessTime(lastAccessTime); + zipEntry.setLastModifiedTime(lastModifyTime); + zipEntry.setTime(time); + zipEntry.setTimeLocal(timeLocal); + zipEntry.setExtra(extra); + zipEntry.setComment(comment); + } } diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java index 015d9de..7455026 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java @@ -3,6 +3,13 @@ import develop.toolkit.base.struct.ZipWrapper; import java.io.*; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; +import java.nio.file.attribute.FileTime; +import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import java.util.zip.ZipEntry; @@ -72,22 +79,80 @@ public static byte[] uncompress(byte[] data) throws IOException { public static class Zip { - public static void compress(ZipWrapper zipWrapper, OutputStream outputStream) { - ZipOutputStream zos = new ZipOutputStream(outputStream); + public static void compress(Path path, OutputStream outputStream) throws IOException { + try (ZipOutputStream zos = new ZipOutputStream(outputStream)) { + Files.walkFileTree(path, new FileVisitor<>() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) throws IOException { + String currentName = filePath.subpath(path.getNameCount(), filePath.getNameCount()).toString(); + File file = filePath.toFile(); + final ZipEntry zipEntry = new ZipEntry(currentName); + zipEntry.setMethod(ZipEntry.DEFLATED); + zipEntry.setLastModifiedTime(FileTime.fromMillis(file.lastModified())); + zos.putNextEntry(zipEntry); + try (InputStream is = new FileInputStream(file)) { + is.transferTo(zos); + } + zos.closeEntry(); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + }); + } + } + public static byte[] compress(Path path) throws IOException { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + compress(path, baos); + return baos.toByteArray(); + } + } + public static void compress(Path path, Path outPath) throws IOException { + try (OutputStream os = new FileOutputStream(outPath.toFile())) { + compress(path, os); + } + } + + + public static void compress(ZipWrapper zipWrapper, OutputStream outputStream) throws IOException { + try (ZipOutputStream zos = new ZipOutputStream(outputStream)) { + recursiveCompress(zipWrapper, "", zos); + } } private static void recursiveCompress(ZipWrapper zipWrapper, String parentPath, ZipOutputStream zos) throws IOException { + final String currentName = parentPath + zipWrapper.getFilename(); if (zipWrapper.isFile()) { - final ZipEntry zipEntry = new ZipEntry(parentPath + File.separator + zipWrapper.getFilename()); + final ZipEntry zipEntry = new ZipEntry(currentName); + zipWrapper.configureZipEntry(zipEntry); zos.putNextEntry(zipEntry); try (InputStream is = zipWrapper.getInputStreamSupplier().get()) { is.transferTo(zos); } zos.closeEntry(); } else { - + List children = zipWrapper.getChildren(); + if (children != null) { + for (ZipWrapper childZipWrapper : children) { + recursiveCompress(childZipWrapper, currentName + File.separator, zos); + } + } } } } From 3c54e77af7ff1bbedcb28d04f52fb6be60fb1129 Mon Sep 17 00:00:00 2001 From: developframework <408000511@qq.com> Date: Wed, 20 Apr 2022 22:22:39 +0800 Subject: [PATCH 172/178] zip --- .../main/java/develop/toolkit/base/utils/CompressAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java index 7455026..5e097ee 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/CompressAdvice.java @@ -93,7 +93,7 @@ public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) throw String currentName = filePath.subpath(path.getNameCount(), filePath.getNameCount()).toString(); File file = filePath.toFile(); final ZipEntry zipEntry = new ZipEntry(currentName); - zipEntry.setMethod(ZipEntry.DEFLATED); + zipEntry.setMethod(currentName.endsWith(".zip") ? ZipEntry.STORED : ZipEntry.DEFLATED); zipEntry.setLastModifiedTime(FileTime.fromMillis(file.lastModified())); zos.putNextEntry(zipEntry); try (InputStream is = new FileInputStream(file)) { From 880a659b87ac877686e86726ca84b01f390e78f5 Mon Sep 17 00:00:00 2001 From: qiushui Date: Mon, 6 Jun 2022 17:30:06 +0800 Subject: [PATCH 173/178] ConcurrentTesting.java --- .../base/components/ConcurrentTesting.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java index 1de235e..7edfd1b 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/components/ConcurrentTesting.java @@ -18,20 +18,24 @@ public final class ConcurrentTesting { private final int cycleCount; + private final int triggerCount; + private final int interval; private final HttpClientHelper helper; - public ConcurrentTesting(int threadCount, int cycleCount, int interval) { + public ConcurrentTesting(int threadCount, int triggerCount, int cycleCount, int interval) { this.helper = HttpClientHelper.buildDefault(); this.service = Executors.newFixedThreadPool(threadCount); + this.triggerCount = triggerCount; this.cycleCount = cycleCount; this.interval = interval; } - public ConcurrentTesting(HttpClientHelper helper, int threadCount, int cycleCount, int interval) { + public ConcurrentTesting(HttpClientHelper helper, int threadCount, int triggerCount, int cycleCount, int interval) { this.helper = helper; this.service = Executors.newFixedThreadPool(threadCount); + this.triggerCount = triggerCount; this.cycleCount = cycleCount; this.interval = interval; } @@ -44,17 +48,20 @@ public void start(Function> functio } public void start(Function> function, Consumer> consumer) { - service.execute(() -> { - for (int i = 0; i < cycleCount; i++) { - if (interval > 0) { - try { - Thread.sleep(interval); - } catch (InterruptedException e) { - e.printStackTrace(); + for (int i = 0; i < triggerCount; i++) { + service.execute(() -> { + for (int j = 0; j < cycleCount; j++) { + if (interval > 0) { + try { + Thread.sleep(interval); + } catch (InterruptedException e) { + e.printStackTrace(); + } } + consumer.accept(function.apply(helper)); } - consumer.accept(function.apply(helper)); - } - }); + }); + } + service.shutdown(); } } From da57eae16a25175f3e117be936823788de07fb8c Mon Sep 17 00:00:00 2001 From: qiushui Date: Thu, 4 May 2023 17:01:09 +0800 Subject: [PATCH 174/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 65c54fd..7c3fc1b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 11 11 + UTF-8 1.18.20 1.7.30 @@ -181,18 +182,6 @@ - - - - hclc aliyun nexus - http://nexus.hclcaliyun.com:8082/repository/maven-snapshots/ - - - hclc aliyun nexus - http://nexus.hclcaliyun.com:8082/repository/maven-releases/ - - - release From 24f463ba6438c31128a614c7afda8759b310cadd Mon Sep 17 00:00:00 2001 From: qiushui Date: Tue, 9 May 2023 23:13:26 +0800 Subject: [PATCH 175/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/JacksonAdvice.java | 22 ++++++++++++------- pom.xml | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java index 39d6273..e72e9fd 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/JacksonAdvice.java @@ -9,7 +9,9 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.github.developframework.expression.*; +import com.github.developframework.expression.ArrayExpression; +import com.github.developframework.expression.EmptyExpression; +import com.github.developframework.expression.Expression; import develop.toolkit.base.constants.DateFormatConstants; import develop.toolkit.base.struct.KeyValuePair; import lombok.SneakyThrows; @@ -180,15 +182,19 @@ public static T[] arrayNodeToArray(ArrayNode arrayNode, Class clazz, Func private static JsonNode parseExpressionToJsonNode(JsonNode jsonNode, Expression expression) { if (expression != EmptyExpression.INSTANCE) { for (Expression singleExpression : expression.expressionTree()) { - if (singleExpression instanceof ObjectExpression) { - jsonNode = existsJsonNode(jsonNode, ((ObjectExpression) singleExpression).getPropertyName()); - } else if (singleExpression instanceof ArrayExpression) { + if (singleExpression.isObject()) { + jsonNode = existsJsonNode(jsonNode, singleExpression.getName()); + } else if (singleExpression.isArray()) { ArrayExpression ae = (ArrayExpression) singleExpression; - jsonNode = existsJsonNode(jsonNode, ae.getPropertyName()); - if (jsonNode.isArray()) { - jsonNode = jsonNode.get(ae.getIndex()); + jsonNode = existsJsonNode(jsonNode, ae.getName()); + for (int i : ae.getIndexArray()) { + if (jsonNode.isArray()) { + jsonNode = jsonNode.get(i); + } else { + throw new IllegalArgumentException("jsonNode is not Array,for expression:" + singleExpression); + } } - } else if (singleExpression instanceof MethodExpression) { + } else if (singleExpression.isMethod()) { throw new IllegalArgumentException("not support method expression."); } } diff --git a/pom.xml b/pom.xml index 7c3fc1b..f4f6169 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ 11 UTF-8 - 1.18.20 + 1.18.26 1.7.30 - 1.5.1 + 1.6.0 2.11.3 2.16.0 From 5b0ebbb41c3738992eda2c12388783138faa0b8e Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 15 Nov 2024 11:43:58 +0800 Subject: [PATCH 176/178] =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolkit/base/utils/ObjectAdvice.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java index 363d9d4..de614eb 100644 --- a/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java +++ b/develop-toolkit-base/src/main/java/develop/toolkit/base/utils/ObjectAdvice.java @@ -48,19 +48,20 @@ public static boolean valueNotIn(@NonNull T obj, T... targets) { * * @param instance 实例 * @param field 字段 + * @param value 值 * @param firstUseSetterMethod 优先使用setter方法 */ @SneakyThrows - public static void set(Object instance, Field field, boolean firstUseSetterMethod) { + public static void set(Object instance, Field field, Object value, boolean firstUseSetterMethod) { if (firstUseSetterMethod) { try { final String setterMethodName = JavaBeanUtils.getSetterMethodName(field.getName()); MethodUtils.invokeMethod(instance, true, setterMethodName); } catch (NoSuchMethodException e) { - FieldUtils.writeField(field, instance, true); + FieldUtils.writeField(field, instance, value, true); } } else { - FieldUtils.writeField(field, instance, true); + FieldUtils.writeField(field, instance, value, true); } } @@ -69,27 +70,28 @@ public static void set(Object instance, Field field, boolean firstUseSetterMetho * * @param instance 实例 * @param fieldName 字段 + * @param value 值 * @param firstUseSetterMethod 优先使用setter方法 */ @SneakyThrows - public static void set(Object instance, String fieldName, boolean firstUseSetterMethod) { + public static void set(Object instance, String fieldName, Object value, boolean firstUseSetterMethod) { if (firstUseSetterMethod) { try { final String setterMethodName = JavaBeanUtils.getSetterMethodName(fieldName); MethodUtils.invokeMethod(instance, true, setterMethodName); } catch (NoSuchMethodException e) { - FieldUtils.writeField(instance, fieldName, true); + FieldUtils.writeField(instance, fieldName, value, true); } } else { - FieldUtils.writeField(instance, fieldName, true); + FieldUtils.writeField(instance, fieldName, value, true); } } /** * 反射获取值 * - * @param instance 实例 - * @param field 字段 + * @param instance 实例 + * @param field 字段 * @param firstUseGetterMethod 优先使用getter方法 * @return 反射值 */ @@ -110,8 +112,8 @@ public static Object get(Object instance, Field field, boolean firstUseGetterMet /** * 反射获取值 * - * @param instance 实例 - * @param fieldName 字段 + * @param instance 实例 + * @param fieldName 字段 * @param firstUseGetterMethod 优先使用getter方法 * @return 反射值 */ From 74b760924d38cfd83d7a1417ac66d9806b92295b Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 15 Nov 2024 11:47:56 +0800 Subject: [PATCH 177/178] [maven-release-plugin] prepare release v1.0.6 --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-multimedia/pom.xml | 6 ++---- develop-toolkit-mybatis/pom.xml | 6 ++---- develop-toolkit-world/pom.xml | 2 +- pom.xml | 14 +++++++------- 6 files changed, 14 insertions(+), 18 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index b6435a1..d743c9c 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.6-SNAPSHOT + 1.0.6 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 181e4c8..61a2b8c 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.6-SNAPSHOT + 1.0.6 4.0.0 diff --git a/develop-toolkit-multimedia/pom.xml b/develop-toolkit-multimedia/pom.xml index c1b857b..3dc69e9 100644 --- a/develop-toolkit-multimedia/pom.xml +++ b/develop-toolkit-multimedia/pom.xml @@ -1,11 +1,9 @@ - + develop-toolkit com.github.developframework - 1.0.6-SNAPSHOT + 1.0.6 4.0.0 diff --git a/develop-toolkit-mybatis/pom.xml b/develop-toolkit-mybatis/pom.xml index b9f66bf..1c2e14f 100644 --- a/develop-toolkit-mybatis/pom.xml +++ b/develop-toolkit-mybatis/pom.xml @@ -1,11 +1,9 @@ - + develop-toolkit com.github.developframework - 1.0.6-SNAPSHOT + 1.0.6 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index 79ec887..4186ed5 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.6-SNAPSHOT + 1.0.6 4.0.0 diff --git a/pom.xml b/pom.xml index f4f6169..401793b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.6-SNAPSHOT + 1.0.6 开发工具箱 2018 Develop Toolkit @@ -36,27 +36,27 @@ com.github.developframework develop-toolkit-base - 1.0.6-SNAPSHOT + 1.0.6 com.github.developframework develop-toolkit-db - 1.0.6-SNAPSHOT + 1.0.6 com.github.developframework develop-toolkit-world - 1.0.6-SNAPSHOT + 1.0.6 com.github.developframework develop-toolkit-multimedia - 1.0.6-SNAPSHOT + 1.0.6 com.github.developframework develop-toolkit-mybatis - 1.0.6-SNAPSHOT + 1.0.6 org.projectlombok @@ -121,7 +121,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - HEAD + v1.0.6 From 4d26fa7d4c01bceba3096a60f4919a5a48410aae Mon Sep 17 00:00:00 2001 From: qiushui Date: Fri, 15 Nov 2024 11:48:05 +0800 Subject: [PATCH 178/178] [maven-release-plugin] prepare for next development iteration --- develop-toolkit-base/pom.xml | 2 +- develop-toolkit-db/pom.xml | 2 +- develop-toolkit-multimedia/pom.xml | 2 +- develop-toolkit-mybatis/pom.xml | 2 +- develop-toolkit-world/pom.xml | 2 +- pom.xml | 14 +++++++------- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/develop-toolkit-base/pom.xml b/develop-toolkit-base/pom.xml index d743c9c..5128436 100644 --- a/develop-toolkit-base/pom.xml +++ b/develop-toolkit-base/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.6 + 1.0.7-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-db/pom.xml b/develop-toolkit-db/pom.xml index 61a2b8c..eb52012 100644 --- a/develop-toolkit-db/pom.xml +++ b/develop-toolkit-db/pom.xml @@ -3,7 +3,7 @@ com.github.developframework develop-toolkit - 1.0.6 + 1.0.7-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-multimedia/pom.xml b/develop-toolkit-multimedia/pom.xml index 3dc69e9..42432cc 100644 --- a/develop-toolkit-multimedia/pom.xml +++ b/develop-toolkit-multimedia/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.6 + 1.0.7-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-mybatis/pom.xml b/develop-toolkit-mybatis/pom.xml index 1c2e14f..08a65c5 100644 --- a/develop-toolkit-mybatis/pom.xml +++ b/develop-toolkit-mybatis/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.6 + 1.0.7-SNAPSHOT 4.0.0 diff --git a/develop-toolkit-world/pom.xml b/develop-toolkit-world/pom.xml index 4186ed5..c984d84 100644 --- a/develop-toolkit-world/pom.xml +++ b/develop-toolkit-world/pom.xml @@ -3,7 +3,7 @@ develop-toolkit com.github.developframework - 1.0.6 + 1.0.7-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 401793b..5656813 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.developframework develop-toolkit pom - 1.0.6 + 1.0.7-SNAPSHOT 开发工具箱 2018 Develop Toolkit @@ -36,27 +36,27 @@ com.github.developframework develop-toolkit-base - 1.0.6 + 1.0.7-SNAPSHOT com.github.developframework develop-toolkit-db - 1.0.6 + 1.0.7-SNAPSHOT com.github.developframework develop-toolkit-world - 1.0.6 + 1.0.7-SNAPSHOT com.github.developframework develop-toolkit-multimedia - 1.0.6 + 1.0.7-SNAPSHOT com.github.developframework develop-toolkit-mybatis - 1.0.6 + 1.0.7-SNAPSHOT org.projectlombok @@ -121,7 +121,7 @@ scm:git:git@github.com:developframework/develop-toolkit.git scm:git:git@github.com:developframework/develop-toolkit.git https://github.com/developframework/develop-toolkit - v1.0.6 + HEAD