From 1e9863a05f6995d79e793df01b6f52d16d9bfe26 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 16 Sep 2022 08:45:59 +0000
Subject: [PATCH 01/70] chore(deps): bump maven-jar-plugin from 3.2.2 to 3.3.0
Bumps [maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.2.2 to 3.3.0.
- [Release notes](https://github.com/apache/maven-jar-plugin/releases)
- [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.2.2...maven-jar-plugin-3.3.0)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-jar-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 3b497b2..4199a53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -319,7 +319,7 @@
maven-jar-plugin
- 3.2.2
+ 3.3.0
maven-source-plugin
From a6d176b2de175c3853223b0cf2175567f9e2a042 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 21 Sep 2022 08:51:00 +0000
Subject: [PATCH 02/70] chore(deps): bump junit-bom from 5.9.0 to 5.9.1
Bumps [junit-bom](https://github.com/junit-team/junit5) from 5.9.0 to 5.9.1.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.9.0...r5.9.1)
---
updated-dependencies:
- dependency-name: org.junit:junit-bom
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 4199a53..ebac7a5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,7 +61,7 @@
${maven.compiler.source}
- 5.9.0
+ 5.9.1
5.4.2
From 08747f4cc3ad8e0270f4066501c6864684f0e0b1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 30 Sep 2022 08:44:04 +0000
Subject: [PATCH 03/70] chore(deps): bump kotlin.version from 1.7.10 to 1.7.20
Bumps `kotlin.version` from 1.7.10 to 1.7.20.
Updates `kotlin-bom` from 1.7.10 to 1.7.20
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.7.20/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.10...v1.7.20)
Updates `kotlin-maven-plugin` from 1.7.10 to 1.7.20
---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin:kotlin-bom
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlin:kotlin-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index ebac7a5..cd0fd53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
${maven.compiler.source}
UTF-8
- 1.7.10
+ 1.7.20
${maven.compiler.source}
From 21f1f4e040d2d7e4d28549f9f74a872d93f03cc4 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sat, 8 Oct 2022 13:04:36 +0800
Subject: [PATCH 04/70] chore(ci): add new ci jdks
---
.github/workflows/ci.yaml | 3 ++-
README.md | 2 +-
scripts/integration_test | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index bb880f1..1994679 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -6,10 +6,11 @@ on: [ push, pull_request ]
jobs:
test:
runs-on: ${{ matrix.os }}
+ timeout-minutes: 10
strategy:
matrix:
os: [ ubuntu-latest, windows-latest ]
- java: [ 8, 11, 16, 17, 18, 19-ea ]
+ java: [ 8, 11, 17, 18, 19, 20-ea ]
fail-fast: false
max-parallel: 64
name: Test JDK ${{ matrix.java }}, ${{ matrix.os }}
diff --git a/README.md b/README.md
index a16f437..9c141f1 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@
Java Dns Cache Manipulator(`DCM`) contains 2 subprojects:
- [**`DCM` Library**](library)
- A tiny 0-dependency thread-safe lib for setting/viewing dns programmatically without touching host file, make unit/integration test portable. Support `Java 8/11/17/18/19`, support `IPv6`.
+ A tiny 0-dependency thread-safe lib for setting/viewing dns programmatically without touching host file, make unit/integration test portable. Support `Java 8~20`, support `IPv6`.
- [**`DCM` Tool**](tool)
A tiny tool for setting/viewing dns of running JVM processes.
diff --git a/scripts/integration_test b/scripts/integration_test
index ea39be2..00f9dd2 100755
--- a/scripts/integration_test
+++ b/scripts/integration_test
@@ -17,6 +17,7 @@ readonly PREPARE_JDKS_INSTALL_BY_SDKMAN=(
"$default_build_jdk_version"
17
18
+ 19
)
source bash-buddy/lib/prepare_jdks.sh
From dca2bc73adb29f414101fc7101b46c86fe0b2782 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 3 Oct 2022 08:50:05 +0000
Subject: [PATCH 05/70] chore(deps): bump kotest.version from 5.4.2 to 5.5.0
Bumps `kotest.version` from 5.4.2 to 5.5.0.
Updates `kotest-runner-junit5-jvm` from 5.4.2 to 5.5.0
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.4.2...v5.5.0)
Updates `kotest-assertions-core-jvm` from 5.4.2 to 5.5.0
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.4.2...v5.5.0)
Updates `kotest-property-jvm` from 5.4.2 to 5.5.0
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.4.2...v5.5.0)
---
updated-dependencies:
- dependency-name: io.kotest:kotest-runner-junit5-jvm
dependency-type: direct:production
update-type: version-update:semver-minor
- dependency-name: io.kotest:kotest-assertions-core-jvm
dependency-type: direct:production
update-type: version-update:semver-minor
- dependency-name: io.kotest:kotest-property-jvm
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index cd0fd53..b4974e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
5.9.1
- 5.4.2
+ 5.5.0
From c028216d90dd3d325c37705005a4fcc79bb1745b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 10 Oct 2022 08:31:21 +0000
Subject: [PATCH 06/70] chore(deps): bump spotbugs-maven-plugin from 4.7.2.0 to
4.7.2.1
Bumps [spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.2.0 to 4.7.2.1.
- [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases)
- [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.2.0...spotbugs-maven-plugin-4.7.2.1)
---
updated-dependencies:
- dependency-name: com.github.spotbugs:spotbugs-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b4974e2..fcee2a3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -531,7 +531,7 @@
com.github.spotbugs
spotbugs-maven-plugin
- 4.7.2.0
+ 4.7.2.1
test-compile
From eff0c00c39550cb63d67887605a0826a1b974b75 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 10 Oct 2022 08:31:17 +0000
Subject: [PATCH 07/70] chore(deps): bump kotest.version from 5.5.0 to 5.5.1
Bumps `kotest.version` from 5.5.0 to 5.5.1.
Updates `kotest-runner-junit5-jvm` from 5.5.0 to 5.5.1
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.5.0...v5.5.1)
Updates `kotest-assertions-core-jvm` from 5.5.0 to 5.5.1
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.5.0...v5.5.1)
Updates `kotest-property-jvm` from 5.5.0 to 5.5.1
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.5.0...v5.5.1)
---
updated-dependencies:
- dependency-name: io.kotest:kotest-runner-junit5-jvm
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: io.kotest:kotest-assertions-core-jvm
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: io.kotest:kotest-property-jvm
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index fcee2a3..961a924 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
5.9.1
- 5.5.0
+ 5.5.1
From 720ddee0231e155eaf98648989060c49e700248a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 17 Oct 2022 08:30:44 +0000
Subject: [PATCH 08/70] chore(deps): bump spotbugs-annotations from 4.7.2 to
4.7.3
Bumps [spotbugs-annotations](https://github.com/spotbugs/spotbugs) from 4.7.2 to 4.7.3.
- [Release notes](https://github.com/spotbugs/spotbugs/releases)
- [Changelog](https://github.com/spotbugs/spotbugs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/spotbugs/spotbugs/compare/4.7.2...4.7.3)
---
updated-dependencies:
- dependency-name: com.github.spotbugs:spotbugs-annotations
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 961a924..9ac14ec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -148,7 +148,7 @@
com.github.spotbugs
spotbugs-annotations
- 4.7.2
+ 4.7.3
true
From 2ca8499cdb9303dd646f936ee4ab7d559ccf225b Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sat, 17 Dec 2022 19:30:58 +0800
Subject: [PATCH 09/70] docs: fix github action badges
https://github.com/badges/shields/issues/8671
---
README.md | 2 +-
docs/developer-guide.md | 16 ++++++++--------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index 9c141f1..0f6142e 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
#
-
+
diff --git a/docs/developer-guide.md b/docs/developer-guide.md
index 455bd93..82cb2b5 100644
--- a/docs/developer-guide.md
+++ b/docs/developer-guide.md
@@ -1,21 +1,21 @@
# 🎓 Developer Guide
-
-
+
+
-
-
-
-
+
+
+
-
+
-
+
+
From c5df4e5ff823e5f442536dffec0bdb93a0171e28 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 02:05:34 +0800
Subject: [PATCH 10/70] fix JDK `8u352` failure #115
---
.../com/alibaba/dcm/DnsCacheManipulator.java | 14 +++++------
.../internal/InetAddressCacheUtilCommons.java | 24 +++++++++++++++++++
.../alibaba/dcm/DnsCacheManipulatorTests.kt | 12 ++++++----
library/src/test/java/com/alibaba/dcm/Util.kt | 6 ++---
4 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java b/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
index 4e70337..6afcd12 100644
--- a/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
+++ b/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
@@ -16,7 +16,7 @@
import java.util.regex.Pattern;
import static com.alibaba.dcm.internal.InetAddressCacheUtilCommons.NEVER_EXPIRATION;
-import static com.alibaba.dcm.internal.JavaVersionUtil.isJavaVersionAtMost8;
+import static com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isInetAddressImplOld;
/**
@@ -42,7 +42,7 @@ public final class DnsCacheManipulator {
*/
public static void setDnsCache(String host, String... ips) {
try {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, NEVER_EXPIRATION);
} else {
InetAddressCacheUtilForJava9Plus.setInetAddressCache(host, ips, NEVER_EXPIRATION);
@@ -64,7 +64,7 @@ public static void setDnsCache(String host, String... ips) {
*/
public static void setDnsCache(long expireMillis, String host, String... ips) {
try {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, expireMillis);
} else {
InetAddressCacheUtilForJava9Plus.setInetAddressCache(host, ips, expireMillis);
@@ -152,7 +152,7 @@ public static void loadDnsCacheConfig(String propertiesFileName) {
@Nullable
public static DnsCacheEntry getDnsCache(String host) {
try {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
return InetAddressCacheUtilForJava8.getInetAddressCache(host);
} else {
return InetAddressCacheUtilForJava9Plus.getInetAddressCache(host);
@@ -174,7 +174,7 @@ public static DnsCacheEntry getDnsCache(String host) {
*/
public static DnsCache getWholeDnsCache() {
try {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
return InetAddressCacheUtilForJava8.listInetAddressCache();
} else {
return InetAddressCacheUtilForJava9Plus.listInetAddressCache();
@@ -235,7 +235,7 @@ public static List listDnsNegativeCache() {
*/
public static void removeDnsCache(String host) {
try {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
InetAddressCacheUtilForJava8.removeInetAddressCache(host);
} else {
InetAddressCacheUtilForJava9Plus.removeInetAddressCache(host);
@@ -253,7 +253,7 @@ public static void removeDnsCache(String host) {
*/
public static void clearDnsCache() {
try {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
InetAddressCacheUtilForJava8.clearInetAddressCache();
} else {
InetAddressCacheUtilForJava9Plus.clearInetAddressCache();
diff --git a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
index 3eabefe..259ced1 100644
--- a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
+++ b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
@@ -181,6 +181,30 @@ private static void initFieldsOfInetAddressCachePolicy() throws NoSuchFieldExcep
}
}
+ private static volatile Boolean isOld;
+
+ /**
+ * Check the new or old implementation of {@link InetAddress}
+ * by whether the field {@link InetAddress.expirySet} is existed or not.
+ */
+ public static boolean isInetAddressImplOld() {
+ if (isOld != null) return isOld;
+
+ synchronized (InetAddressCacheUtilCommons.class) {
+ // double check
+ if (isOld != null) return isOld;
+
+ try {
+ InetAddress.class.getDeclaredField("expirySet");
+ isOld = false;
+ } catch (NoSuchFieldException e) {
+ isOld = true;
+ }
+
+ return isOld;
+ }
+ }
+
private InetAddressCacheUtilCommons() {
}
}
diff --git a/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt b/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt
index b160a6d..0ff2837 100644
--- a/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt
+++ b/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt
@@ -1,6 +1,6 @@
package com.alibaba.dcm
-import com.alibaba.dcm.internal.JavaVersionUtil
+import com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isInetAddressImplOld
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.collections.shouldBeEmpty
@@ -31,9 +31,11 @@ class DnsCacheManipulatorTests : AnnotationSpec() {
// System Properties
// https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html
println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
- System.out.printf("Env info:%njava home: %s%njdk version: %s%n",
- System.getProperty("java.home"),
- System.getProperty("java.version"))
+ System.out.printf(
+ "Env info:%njava home: %s%njdk version: %s%n",
+ System.getProperty("java.home"),
+ System.getProperty("java.version")
+ )
println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
}
@@ -237,7 +239,7 @@ class DnsCacheManipulatorTests : AnnotationSpec() {
// 3. touch dns cache with external other host operation
//////////////////////////////////////////////////
EXISTED_DOMAIN.lookupIpByName()
- if (JavaVersionUtil.isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
shouldContainOnlyOneNegativeCacheWitchExpirationBetween(tick, tick + 1020)
} else {
DnsCacheManipulator.listDnsNegativeCache().shouldBeEmpty()
diff --git a/library/src/test/java/com/alibaba/dcm/Util.kt b/library/src/test/java/com/alibaba/dcm/Util.kt
index afa8ef7..ee8d1c6 100644
--- a/library/src/test/java/com/alibaba/dcm/Util.kt
+++ b/library/src/test/java/com/alibaba/dcm/Util.kt
@@ -1,6 +1,6 @@
package com.alibaba.dcm
-import com.alibaba.dcm.internal.JavaVersionUtil.isJavaVersionAtMost8
+import com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isInetAddressImplOld
import com.alibaba.dcm.internal.TestTimeUtil.NEVER_EXPIRATION_NANO_TIME_TO_TIME_MILLIS
import io.kotest.assertions.fail
import io.kotest.assertions.throwables.shouldThrow
@@ -54,7 +54,7 @@ infix fun DnsCacheEntry?.shouldBeEqual(expected: DnsCacheEntry?) {
}
infix fun String.shouldBeEqualAsHostName(expected: String) {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
// hard-coded test logic for jdk 8-
// host name is unified to lower case by InetAddress
this shouldBeEqualIgnoringCase expected
@@ -65,7 +65,7 @@ infix fun String.shouldBeEqualAsHostName(expected: String) {
private infix fun Long.shouldBeEqualAsExpiration(expected: Long) {
if (expected == Long.MAX_VALUE) {
- if (isJavaVersionAtMost8()) {
+ if (isInetAddressImplOld()) {
this shouldBe expected
} else {
// hard-coded test logic for jdk 9+
From 23b902bb82a7ff370c4651ec0bc5e340c41dd9c5 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 02:06:21 +0800
Subject: [PATCH 11/70] chore(ci): add CI for JDK `8.0.345`
---
.github/workflows/ci.yaml | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 1994679..5dc03ad 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -2,31 +2,31 @@
# https://docs.github.com/en/actions/quickstart
name: CI
-on: [ push, pull_request ]
+on: [ push, pull_request, workflow_dispatch ]
+
jobs:
+
test:
runs-on: ${{ matrix.os }}
timeout-minutes: 10
strategy:
matrix:
os: [ ubuntu-latest, windows-latest ]
- java: [ 8, 11, 17, 18, 19, 20-ea ]
+ java: [ 8.0.345, 8, 11, 17, 19, 20-ea ]
fail-fast: false
max-parallel: 64
- name: Test JDK ${{ matrix.java }}, ${{ matrix.os }}
+ name: Test on JDK ${{ matrix.java }} OS ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: ${{ matrix.java }}
- distribution: 'zulu'
- cache: 'maven'
- - name: Build with Maven
- run: ./mvnw -V --no-transfer-progress -Pgen-code-cov clean package
- - name: Upload coverage to Codecov
- # https://github.com/marketplace/actions/codecov
- uses: codecov/codecov-action@v3
+ distribution: zulu
+ cache: maven
+ - run: ./mvnw -V --no-transfer-progress -Pgen-code-cov clean package
+ # https://github.com/marketplace/actions/codecov
+ - uses: codecov/codecov-action@v3
with:
name: codecov-umbrella
token: ${{ secrets.CODECOV_TOKEN }}
From 57af3935588a7b0a34a0cd17f0349cbf341673ad Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 02:10:40 +0800
Subject: [PATCH 12/70] refactor: invert if conditions for
`isNewInetAddressImpl()`
---
.../com/alibaba/dcm/DnsCacheManipulator.java | 38 +++++++++----------
.../internal/InetAddressCacheUtilCommons.java | 14 +++----
.../alibaba/dcm/DnsCacheManipulatorTests.kt | 8 ++--
library/src/test/java/com/alibaba/dcm/Util.kt | 18 ++++-----
4 files changed, 39 insertions(+), 39 deletions(-)
diff --git a/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java b/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
index 6afcd12..f901e98 100644
--- a/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
+++ b/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
@@ -16,7 +16,7 @@
import java.util.regex.Pattern;
import static com.alibaba.dcm.internal.InetAddressCacheUtilCommons.NEVER_EXPIRATION;
-import static com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isInetAddressImplOld;
+import static com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isNewInetAddressImpl;
/**
@@ -42,10 +42,10 @@ public final class DnsCacheManipulator {
*/
public static void setDnsCache(String host, String... ips) {
try {
- if (isInetAddressImplOld()) {
- InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, NEVER_EXPIRATION);
- } else {
+ if (isNewInetAddressImpl()) {
InetAddressCacheUtilForJava9Plus.setInetAddressCache(host, ips, NEVER_EXPIRATION);
+ } else {
+ InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, NEVER_EXPIRATION);
}
} catch (Exception e) {
final String message = String.format("Fail to setDnsCache for host %s ip %s, cause: %s",
@@ -64,10 +64,10 @@ public static void setDnsCache(String host, String... ips) {
*/
public static void setDnsCache(long expireMillis, String host, String... ips) {
try {
- if (isInetAddressImplOld()) {
- InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, expireMillis);
- } else {
+ if (isNewInetAddressImpl()) {
InetAddressCacheUtilForJava9Plus.setInetAddressCache(host, ips, expireMillis);
+ } else {
+ InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, expireMillis);
}
} catch (Exception e) {
final String message = String.format("Fail to setDnsCache for host %s ip %s expireMillis %s, cause: %s",
@@ -152,10 +152,10 @@ public static void loadDnsCacheConfig(String propertiesFileName) {
@Nullable
public static DnsCacheEntry getDnsCache(String host) {
try {
- if (isInetAddressImplOld()) {
- return InetAddressCacheUtilForJava8.getInetAddressCache(host);
- } else {
+ if (isNewInetAddressImpl()) {
return InetAddressCacheUtilForJava9Plus.getInetAddressCache(host);
+ } else {
+ return InetAddressCacheUtilForJava8.getInetAddressCache(host);
}
} catch (Exception e) {
throw new DnsCacheManipulatorException("Fail to getDnsCache, cause: " + e, e);
@@ -174,10 +174,10 @@ public static DnsCacheEntry getDnsCache(String host) {
*/
public static DnsCache getWholeDnsCache() {
try {
- if (isInetAddressImplOld()) {
- return InetAddressCacheUtilForJava8.listInetAddressCache();
- } else {
+ if (isNewInetAddressImpl()) {
return InetAddressCacheUtilForJava9Plus.listInetAddressCache();
+ } else {
+ return InetAddressCacheUtilForJava8.listInetAddressCache();
}
} catch (Exception e) {
throw new DnsCacheManipulatorException("Fail to getWholeDnsCache, cause: " + e, e);
@@ -235,10 +235,10 @@ public static List listDnsNegativeCache() {
*/
public static void removeDnsCache(String host) {
try {
- if (isInetAddressImplOld()) {
- InetAddressCacheUtilForJava8.removeInetAddressCache(host);
- } else {
+ if (isNewInetAddressImpl()) {
InetAddressCacheUtilForJava9Plus.removeInetAddressCache(host);
+ } else {
+ InetAddressCacheUtilForJava8.removeInetAddressCache(host);
}
} catch (Exception e) {
final String message = String.format("Fail to removeDnsCache for host %s, cause: %s", host, e);
@@ -253,10 +253,10 @@ public static void removeDnsCache(String host) {
*/
public static void clearDnsCache() {
try {
- if (isInetAddressImplOld()) {
- InetAddressCacheUtilForJava8.clearInetAddressCache();
- } else {
+ if (isNewInetAddressImpl()) {
InetAddressCacheUtilForJava9Plus.clearInetAddressCache();
+ } else {
+ InetAddressCacheUtilForJava8.clearInetAddressCache();
}
} catch (Exception e) {
throw new DnsCacheManipulatorException("Fail to clearDnsCache, cause: " + e, e);
diff --git a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
index 259ced1..c4dc527 100644
--- a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
+++ b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
@@ -181,27 +181,27 @@ private static void initFieldsOfInetAddressCachePolicy() throws NoSuchFieldExcep
}
}
- private static volatile Boolean isOld;
+ private static volatile Boolean isNew;
/**
* Check the new or old implementation of {@link InetAddress}
* by whether the field {@link InetAddress.expirySet} is existed or not.
*/
- public static boolean isInetAddressImplOld() {
- if (isOld != null) return isOld;
+ public static boolean isNewInetAddressImpl() {
+ if (isNew != null) return isNew;
synchronized (InetAddressCacheUtilCommons.class) {
// double check
- if (isOld != null) return isOld;
+ if (isNew != null) return isNew;
try {
InetAddress.class.getDeclaredField("expirySet");
- isOld = false;
+ isNew = true;
} catch (NoSuchFieldException e) {
- isOld = true;
+ isNew = false;
}
- return isOld;
+ return isNew;
}
}
diff --git a/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt b/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt
index 0ff2837..d3671d6 100644
--- a/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt
+++ b/library/src/test/java/com/alibaba/dcm/DnsCacheManipulatorTests.kt
@@ -1,6 +1,6 @@
package com.alibaba.dcm
-import com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isInetAddressImplOld
+import com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isNewInetAddressImpl
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.collections.shouldBeEmpty
@@ -239,10 +239,10 @@ class DnsCacheManipulatorTests : AnnotationSpec() {
// 3. touch dns cache with external other host operation
//////////////////////////////////////////////////
EXISTED_DOMAIN.lookupIpByName()
- if (isInetAddressImplOld()) {
- shouldContainOnlyOneNegativeCacheWitchExpirationBetween(tick, tick + 1020)
- } else {
+ if (isNewInetAddressImpl()) {
DnsCacheManipulator.listDnsNegativeCache().shouldBeEmpty()
+ } else {
+ shouldContainOnlyOneNegativeCacheWitchExpirationBetween(tick, tick + 1020)
}
//////////////////////////////////////////////////
diff --git a/library/src/test/java/com/alibaba/dcm/Util.kt b/library/src/test/java/com/alibaba/dcm/Util.kt
index ee8d1c6..2690409 100644
--- a/library/src/test/java/com/alibaba/dcm/Util.kt
+++ b/library/src/test/java/com/alibaba/dcm/Util.kt
@@ -1,6 +1,6 @@
package com.alibaba.dcm
-import com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isInetAddressImplOld
+import com.alibaba.dcm.internal.InetAddressCacheUtilCommons.isNewInetAddressImpl
import com.alibaba.dcm.internal.TestTimeUtil.NEVER_EXPIRATION_NANO_TIME_TO_TIME_MILLIS
import io.kotest.assertions.fail
import io.kotest.assertions.throwables.shouldThrow
@@ -54,22 +54,22 @@ infix fun DnsCacheEntry?.shouldBeEqual(expected: DnsCacheEntry?) {
}
infix fun String.shouldBeEqualAsHostName(expected: String) {
- if (isInetAddressImplOld()) {
- // hard-coded test logic for jdk 8-
+ if (isNewInetAddressImpl()) {
+ this shouldBe expected
+ } else {
+ // hard-coded test logic for old jdk 8-
// host name is unified to lower case by InetAddress
this shouldBeEqualIgnoringCase expected
- } else {
- this shouldBe expected
}
}
private infix fun Long.shouldBeEqualAsExpiration(expected: Long) {
if (expected == Long.MAX_VALUE) {
- if (isInetAddressImplOld()) {
- this shouldBe expected
- } else {
- // hard-coded test logic for jdk 9+
+ if (isNewInetAddressImpl()) {
+ // hard-coded test logic for new jdk 9+
this.shouldBeEqualsWithTolerance(NEVER_EXPIRATION_NANO_TIME_TO_TIME_MILLIS, 5)
+ } else {
+ this shouldBe expected
}
} else {
this shouldBe expected
From 9e754afee254c8027cfa992521ef0ccc5a1f3040 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 02:14:32 +0800
Subject: [PATCH 13/70] chore(ci): remove `jdk 18` from `appveyor CI`
---
scripts/integration_test | 1 -
1 file changed, 1 deletion(-)
diff --git a/scripts/integration_test b/scripts/integration_test
index 00f9dd2..0a398b0 100755
--- a/scripts/integration_test
+++ b/scripts/integration_test
@@ -16,7 +16,6 @@ readonly PREPARE_JDKS_INSTALL_BY_SDKMAN=(
8
"$default_build_jdk_version"
17
- 18
19
)
From 521acf67b31fce50f9a88dc8b8b13befb5253072 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 02:21:36 +0800
Subject: [PATCH 14/70] refactor: rename classes `InetAddressCacheUtil*`; add
`@ApiStatus.Internal` for internal classes
---
.../com/alibaba/dcm/DnsCacheManipulator.java | 28 +++++++++----------
.../internal/InetAddressCacheUtilCommons.java | 2 ++
...s.java => InetAddressCacheUtilForNew.java} | 14 ++++++----
...8.java => InetAddressCacheUtilForOld.java} | 14 ++++++----
pom.xml | 7 +++++
5 files changed, 39 insertions(+), 26 deletions(-)
rename library/src/main/java/com/alibaba/dcm/internal/{InetAddressCacheUtilForJava9Plus.java => InetAddressCacheUtilForNew.java} (96%)
rename library/src/main/java/com/alibaba/dcm/internal/{InetAddressCacheUtilForJava8.java => InetAddressCacheUtilForOld.java} (96%)
diff --git a/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java b/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
index f901e98..6c6f71f 100644
--- a/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
+++ b/library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java
@@ -1,8 +1,8 @@
package com.alibaba.dcm;
import com.alibaba.dcm.internal.InetAddressCacheUtilCommons;
-import com.alibaba.dcm.internal.InetAddressCacheUtilForJava8;
-import com.alibaba.dcm.internal.InetAddressCacheUtilForJava9Plus;
+import com.alibaba.dcm.internal.InetAddressCacheUtilForOld;
+import com.alibaba.dcm.internal.InetAddressCacheUtilForNew;
import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;
import sun.net.InetAddressCachePolicy;
@@ -43,9 +43,9 @@ public final class DnsCacheManipulator {
public static void setDnsCache(String host, String... ips) {
try {
if (isNewInetAddressImpl()) {
- InetAddressCacheUtilForJava9Plus.setInetAddressCache(host, ips, NEVER_EXPIRATION);
+ InetAddressCacheUtilForNew.setInetAddressCache(host, ips, NEVER_EXPIRATION);
} else {
- InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, NEVER_EXPIRATION);
+ InetAddressCacheUtilForOld.setInetAddressCache(host, ips, NEVER_EXPIRATION);
}
} catch (Exception e) {
final String message = String.format("Fail to setDnsCache for host %s ip %s, cause: %s",
@@ -65,9 +65,9 @@ public static void setDnsCache(String host, String... ips) {
public static void setDnsCache(long expireMillis, String host, String... ips) {
try {
if (isNewInetAddressImpl()) {
- InetAddressCacheUtilForJava9Plus.setInetAddressCache(host, ips, expireMillis);
+ InetAddressCacheUtilForNew.setInetAddressCache(host, ips, expireMillis);
} else {
- InetAddressCacheUtilForJava8.setInetAddressCache(host, ips, expireMillis);
+ InetAddressCacheUtilForOld.setInetAddressCache(host, ips, expireMillis);
}
} catch (Exception e) {
final String message = String.format("Fail to setDnsCache for host %s ip %s expireMillis %s, cause: %s",
@@ -153,9 +153,9 @@ public static void loadDnsCacheConfig(String propertiesFileName) {
public static DnsCacheEntry getDnsCache(String host) {
try {
if (isNewInetAddressImpl()) {
- return InetAddressCacheUtilForJava9Plus.getInetAddressCache(host);
+ return InetAddressCacheUtilForNew.getInetAddressCache(host);
} else {
- return InetAddressCacheUtilForJava8.getInetAddressCache(host);
+ return InetAddressCacheUtilForOld.getInetAddressCache(host);
}
} catch (Exception e) {
throw new DnsCacheManipulatorException("Fail to getDnsCache, cause: " + e, e);
@@ -175,9 +175,9 @@ public static DnsCacheEntry getDnsCache(String host) {
public static DnsCache getWholeDnsCache() {
try {
if (isNewInetAddressImpl()) {
- return InetAddressCacheUtilForJava9Plus.listInetAddressCache();
+ return InetAddressCacheUtilForNew.listInetAddressCache();
} else {
- return InetAddressCacheUtilForJava8.listInetAddressCache();
+ return InetAddressCacheUtilForOld.listInetAddressCache();
}
} catch (Exception e) {
throw new DnsCacheManipulatorException("Fail to getWholeDnsCache, cause: " + e, e);
@@ -236,9 +236,9 @@ public static List listDnsNegativeCache() {
public static void removeDnsCache(String host) {
try {
if (isNewInetAddressImpl()) {
- InetAddressCacheUtilForJava9Plus.removeInetAddressCache(host);
+ InetAddressCacheUtilForNew.removeInetAddressCache(host);
} else {
- InetAddressCacheUtilForJava8.removeInetAddressCache(host);
+ InetAddressCacheUtilForOld.removeInetAddressCache(host);
}
} catch (Exception e) {
final String message = String.format("Fail to removeDnsCache for host %s, cause: %s", host, e);
@@ -254,9 +254,9 @@ public static void removeDnsCache(String host) {
public static void clearDnsCache() {
try {
if (isNewInetAddressImpl()) {
- InetAddressCacheUtilForJava9Plus.clearInetAddressCache();
+ InetAddressCacheUtilForNew.clearInetAddressCache();
} else {
- InetAddressCacheUtilForJava8.clearInetAddressCache();
+ InetAddressCacheUtilForOld.clearInetAddressCache();
}
} catch (Exception e) {
throw new DnsCacheManipulatorException("Fail to clearDnsCache, cause: " + e, e);
diff --git a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
index c4dc527..402afb3 100644
--- a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
+++ b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java
@@ -1,6 +1,7 @@
package com.alibaba.dcm.internal;
import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;
+import org.jetbrains.annotations.ApiStatus;
import sun.net.InetAddressCachePolicy;
import javax.annotation.Nullable;
@@ -17,6 +18,7 @@
*/
@ParametersAreNonnullByDefault
@ReturnValuesAreNonnullByDefault
+@ApiStatus.Internal
public final class InetAddressCacheUtilCommons {
/**
* We never really have "never".
diff --git a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava9Plus.java b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForNew.java
similarity index 96%
rename from library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava9Plus.java
rename to library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForNew.java
index 9c3f41c..9b094f9 100644
--- a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava9Plus.java
+++ b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForNew.java
@@ -3,6 +3,7 @@
import com.alibaba.dcm.DnsCache;
import com.alibaba.dcm.DnsCacheEntry;
import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;
+import org.jetbrains.annotations.ApiStatus;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
@@ -23,7 +24,7 @@
import static com.alibaba.dcm.internal.TimeUtil.getNanoTimeAfterMs;
/**
- * Util class to manipulate dns cache for {@code JDK 9+}.
+ * Util class to manipulate dns cache for new {@code JDK 9+}.
*
* dns cache is {@link InetAddress#cache}.
*
@@ -33,7 +34,8 @@
*/
@ParametersAreNonnullByDefault
@ReturnValuesAreNonnullByDefault
-public final class InetAddressCacheUtilForJava9Plus {
+@ApiStatus.Internal
+public final class InetAddressCacheUtilForNew {
/**
* {@link InetAddress.CachedAddresses}
*
@@ -120,7 +122,7 @@ private static void removeHostFromExpirySetOfInetAddress(String host)
private static String getHostOfInetAddress$CacheAddress(Object cachedAddresses)
throws NoSuchFieldException, IllegalAccessException {
if (hostFieldOfInetAddress$CacheAddress == null) {
- synchronized (InetAddressCacheUtilForJava9Plus.class) {
+ synchronized (InetAddressCacheUtilForNew.class) {
if (hostFieldOfInetAddress$CacheAddress == null) { // double check
final Field f = cachedAddresses.getClass().getDeclaredField("host");
f.setAccessible(true);
@@ -169,7 +171,7 @@ private static Object[] getCacheAndExpirySetOfInetAddress0()
throws NoSuchFieldException, IllegalAccessException {
if (ADDRESS_CACHE_AND_EXPIRY_SET != null) return ADDRESS_CACHE_AND_EXPIRY_SET;
- synchronized (InetAddressCacheUtilForJava9Plus.class) {
+ synchronized (InetAddressCacheUtilForNew.class) {
if (ADDRESS_CACHE_AND_EXPIRY_SET != null) return ADDRESS_CACHE_AND_EXPIRY_SET;
final Field cacheField = InetAddress.class.getDeclaredField("cache");
@@ -266,7 +268,7 @@ public static DnsCache listInetAddressCache()
private static void initFieldsOfAddresses() throws ClassNotFoundException, NoSuchFieldException {
if (inetAddressesFieldOfInetAddress$CacheAddress != null) return;
- synchronized (InetAddressCacheUtilForJava9Plus.class) {
+ synchronized (InetAddressCacheUtilForNew.class) {
if (inetAddressesFieldOfInetAddress$CacheAddress != null) return;
///////////////////////////////////////////////
@@ -289,6 +291,6 @@ public static void clearInetAddressCache() throws NoSuchFieldException, IllegalA
getCacheOfInetAddress().clear();
}
- private InetAddressCacheUtilForJava9Plus() {
+ private InetAddressCacheUtilForNew() {
}
}
diff --git a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava8.java b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java
similarity index 96%
rename from library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava8.java
rename to library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java
index 3e420a1..5b14286 100644
--- a/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava8.java
+++ b/library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java
@@ -3,6 +3,7 @@
import com.alibaba.dcm.DnsCache;
import com.alibaba.dcm.DnsCacheEntry;
import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;
+import org.jetbrains.annotations.ApiStatus;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
@@ -20,7 +21,7 @@
import static com.alibaba.dcm.internal.InetAddressCacheUtilCommons.*;
/**
- * Util class to manipulate dns cache for {@code JDK 8-}.
+ * Util class to manipulate dns cache for old {@code JDK 8-}.
*
* dns cache is {@link InetAddress.Cache#cache} in {@link InetAddress#addressCache}.
*
@@ -39,7 +40,8 @@
*/
@ParametersAreNonnullByDefault
@ReturnValuesAreNonnullByDefault
-public final class InetAddressCacheUtilForJava8 {
+@ApiStatus.Internal
+public final class InetAddressCacheUtilForOld {
/**
* Need convert host to lowercase, see {@link InetAddress#cacheAddresses(String, InetAddress[], boolean)}.
*/
@@ -134,7 +136,7 @@ private static Map getNegativeCache()
private static Map getCacheOfInetAddress$Cache0(Object inetAddressCache)
throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException {
if (cacheMapFieldOfInetAddress$Cache == null) {
- synchronized (InetAddressCacheUtilForJava8.class) {
+ synchronized (InetAddressCacheUtilForOld.class) {
if (cacheMapFieldOfInetAddress$Cache == null) { // double check
final Class> clazz = Class.forName("java.net.InetAddress$Cache");
final Field f = clazz.getDeclaredField("cache");
@@ -172,7 +174,7 @@ private static Object[] getAddressCacheAndNegativeCacheOfInetAddress0()
throws NoSuchFieldException, IllegalAccessException {
if (ADDRESS_CACHE_AND_NEGATIVE_CACHE != null) return ADDRESS_CACHE_AND_NEGATIVE_CACHE;
- synchronized (InetAddressCacheUtilForJava8.class) {
+ synchronized (InetAddressCacheUtilForOld.class) {
// double check
if (ADDRESS_CACHE_AND_NEGATIVE_CACHE != null) return ADDRESS_CACHE_AND_NEGATIVE_CACHE;
@@ -262,7 +264,7 @@ private static List convert(Map cache)
private static void initFieldsOfInetAddress$CacheEntry() throws ClassNotFoundException, NoSuchFieldException {
if (expirationFieldOfInetAddress$CacheEntry != null && addressesFieldOfInetAddress$CacheEntry != null) return;
- synchronized (InetAddressCacheUtilForJava8.class) {
+ synchronized (InetAddressCacheUtilForOld.class) {
final Class> cacheEntryClass = Class.forName("java.net.InetAddress$CacheEntry");
// double check
if (expirationFieldOfInetAddress$CacheEntry != null && addressesFieldOfInetAddress$CacheEntry != null)
@@ -297,6 +299,6 @@ public static void clearInetAddressCache()
}
}
- private InetAddressCacheUtilForJava8() {
+ private InetAddressCacheUtilForOld() {
}
}
diff --git a/pom.xml b/pom.xml
index 9ac14ec..b237056 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,6 +77,13 @@
jsr305
true
+
+
+ org.jetbrains
+ annotations
+ 23.1.0
+ true
+
From 1d68b9f5aa172470477b914f1372dd8121929a50 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 02:24:54 +0800
Subject: [PATCH 15/70] refactor: remove unused `JavaVersion*` classes
---
.../com/alibaba/dcm/internal/JavaVersion.java | 365 ------------------
.../alibaba/dcm/internal/JavaVersionUtil.java | 40 --
.../dcm/internal/JavaVersionUtilTests.kt | 12 -
3 files changed, 417 deletions(-)
delete mode 100644 library/src/main/java/com/alibaba/dcm/internal/JavaVersion.java
delete mode 100644 library/src/main/java/com/alibaba/dcm/internal/JavaVersionUtil.java
delete mode 100644 library/src/test/java/com/alibaba/dcm/internal/JavaVersionUtilTests.kt
diff --git a/library/src/main/java/com/alibaba/dcm/internal/JavaVersion.java b/library/src/main/java/com/alibaba/dcm/internal/JavaVersion.java
deleted file mode 100644
index 1c38ddb..0000000
--- a/library/src/main/java/com/alibaba/dcm/internal/JavaVersion.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.alibaba.dcm.internal;
-
-
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-// This source code file is copied and small adopted from commons-lang-3.12.0:
-//
-// https://github.com/apache/commons-lang/blob/rel/commons-lang-3.12.0/src/main/java/org/apache/commons/lang3/JavaVersion.java
-//
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-/**
- * An enum representing all the versions of the Java specification.
- * This is intended to mirror available values from the
- * java.specification.version System property.
- *
- * @since 3.0
- */
-@SuppressWarnings({"unused", "SameParameterValue"})
-enum JavaVersion {
-
- /**
- * The Java version reported by Android. This is not an official Java version number.
- */
- JAVA_0_9(1.5f, "0.9"),
-
- /**
- * Java 1.1.
- */
- JAVA_1_1(1.1f, "1.1"),
-
- /**
- * Java 1.2.
- */
- JAVA_1_2(1.2f, "1.2"),
-
- /**
- * Java 1.3.
- */
- JAVA_1_3(1.3f, "1.3"),
-
- /**
- * Java 1.4.
- */
- JAVA_1_4(1.4f, "1.4"),
-
- /**
- * Java 1.5.
- */
- JAVA_1_5(1.5f, "1.5"),
-
- /**
- * Java 1.6.
- */
- JAVA_1_6(1.6f, "1.6"),
-
- /**
- * Java 1.7.
- */
- JAVA_1_7(1.7f, "1.7"),
-
- /**
- * Java 1.8.
- */
- JAVA_1_8(1.8f, "1.8"),
-
- /**
- * Java 1.9.
- *
- * @deprecated As of release 3.5, replaced by {@link #JAVA_9}
- */
- @Deprecated
- JAVA_1_9(9.0f, "9"),
-
- /**
- * Java 9.
- *
- * @since 3.5
- */
- JAVA_9(9.0f, "9"),
-
- /**
- * Java 10.
- *
- * @since 3.7
- */
- JAVA_10(10.0f, "10"),
-
- /**
- * Java 11.
- *
- * @since 3.8
- */
- JAVA_11(11.0f, "11"),
-
- /**
- * Java 12.
- *
- * @since 3.9
- */
- JAVA_12(12.0f, "12"),
-
- /**
- * Java 13.
- *
- * @since 3.9
- */
- JAVA_13(13.0f, "13"),
-
- /**
- * Java 14.
- *
- * @since 3.11
- */
- JAVA_14(14.0f, "14"),
-
- /**
- * Java 15.
- *
- * @since 3.11
- */
- JAVA_15(15.0f, "15"),
-
- /**
- * Java 16.
- *
- * @since 3.11
- */
- JAVA_16(16.0f, "16"),
-
- /**
- * Java 17.
- *
- * @since 3.12.0
- */
- JAVA_17(17.0f, "17"),
-
- /**
- * The most recent java version. Mainly introduced to avoid to break when a new version of Java is used.
- */
- JAVA_RECENT(maxVersion(), Float.toString(maxVersion()));
-
- /**
- * The float value.
- */
- private final float value;
-
- /**
- * The standard name.
- */
- private final String name;
-
- /**
- * Constructor.
- *
- * @param value the float value
- * @param name the standard name, not null
- */
- JavaVersion(final float value, final String name) {
- this.value = value;
- this.name = name;
- }
-
- //-----------------------------------------------------------------------
-
- /**
- * Whether this version of Java is at least the version of Java passed in.
- *
- * For example:
- * {@code myVersion.atLeast(JavaVersion.JAVA_1_4)}
- *
- * @param requiredVersion the version to check against, not null
- * @return true if this version is equal to or greater than the specified version
- */
- public boolean atLeast(final JavaVersion requiredVersion) {
- return this.value >= requiredVersion.value;
- }
-
- //-----------------------------------------------------------------------
-
- /**
- *
Whether this version of Java is at most the version of Java passed in.
- *
- * For example:
- * {@code myVersion.atMost(JavaVersion.JAVA_1_4)}
- *
- * @param requiredVersion the version to check against, not null
- * @return true if this version is equal to or greater than the specified version
- * @since 3.9
- */
- public boolean atMost(final JavaVersion requiredVersion) {
- return this.value <= requiredVersion.value;
- }
-
- /**
- * Transforms the given string with a Java version number to the
- * corresponding constant of this enumeration class. This method is used
- * internally.
- *
- * @param nom the Java version as string
- * @return the corresponding enumeration constant or null if the
- * version is unknown
- */
- // helper for static importing
- static JavaVersion getJavaVersion(final String nom) {
- return get(nom);
- }
-
- /**
- * Transforms the given string with a Java version number to the
- * corresponding constant of this enumeration class. This method is used
- * internally.
- *
- * @param versionStr the Java version as string
- * @return the corresponding enumeration constant or null if the
- * version is unknown
- */
- static JavaVersion get(final String versionStr) {
- if (versionStr == null) {
- return null;
- }
- switch (versionStr) {
- case "0.9":
- return JAVA_0_9;
- case "1.1":
- return JAVA_1_1;
- case "1.2":
- return JAVA_1_2;
- case "1.3":
- return JAVA_1_3;
- case "1.4":
- return JAVA_1_4;
- case "1.5":
- return JAVA_1_5;
- case "1.6":
- return JAVA_1_6;
- case "1.7":
- return JAVA_1_7;
- case "1.8":
- return JAVA_1_8;
- case "9":
- return JAVA_9;
- case "10":
- return JAVA_10;
- case "11":
- return JAVA_11;
- case "12":
- return JAVA_12;
- case "13":
- return JAVA_13;
- case "14":
- return JAVA_14;
- case "15":
- return JAVA_15;
- case "16":
- return JAVA_16;
- case "17":
- return JAVA_17;
- }
- final float v = toFloatVersion(versionStr);
- if ((v - 1.) < 1.) { // then we need to check decimals > .9
- final int firstComma = Math.max(versionStr.indexOf('.'), versionStr.indexOf(','));
- final int end = Math.max(versionStr.length(), versionStr.indexOf(',', firstComma));
- if (Float.parseFloat(versionStr.substring(firstComma + 1, end)) > .9f) {
- return JAVA_RECENT;
- }
- } else if (v > 10) {
- return JAVA_RECENT;
- }
- return null;
- }
-
- //-----------------------------------------------------------------------
-
- /**
- *
The string value is overridden to return the standard name.
- *
- * For example, {@code "1.5"}.
- *
- * @return the name, not null
- */
- @Override
- public String toString() {
- return name;
- }
-
- /**
- * Gets the Java Version from the system or 99.0 if the {@code java.specification.version} system property is not set.
- *
- * @return the value of {@code java.specification.version} system property or 99.0 if it is not set.
- */
- private static float maxVersion() {
- final float v = toFloatVersion(System.getProperty("java.specification.version", "99.0"));
- if (v > 0) {
- return v;
- }
- return 99f;
- }
-
- /**
- * Parses a float value from a String.
- *
- * @param value the String to parse.
- * @return the float value represented by the string or -1 if the given String can not be parsed.
- */
- private static float toFloatVersion(final String value) {
- final int defaultReturnValue = -1;
- if (value.contains(".")) {
- final String[] toParse = value.split("\\.");
- if (toParse.length >= 2) {
- return toFloat(toParse[0] + '.' + toParse[1], defaultReturnValue);
- }
- } else {
- return toFloat(value, defaultReturnValue);
- }
- return defaultReturnValue;
- }
-
- /**
- * Convert a {@code String} to a {@code float}, returning a
- * default value if the conversion fails.
- *
- * If the string {@code str} is {@code null}, the default
- * value is returned.
- *
- *
- * NumberUtils.toFloat(null, 1.1f) = 1.0f
- * NumberUtils.toFloat("", 1.1f) = 1.1f
- * NumberUtils.toFloat("1.5", 0.0f) = 1.5f
- *
- *
- * @param str the string to convert, may be {@code null}
- * @param defaultValue the default value
- * @return the float represented by the string, or defaultValue
- * if conversion fails
- * @since 2.1
- */
- private static float toFloat(final String str, final float defaultValue) {
- if (str == null) {
- return defaultValue;
- }
- try {
- return Float.parseFloat(str);
- } catch (final NumberFormatException nfe) {
- return defaultValue;
- }
- }
-}
diff --git a/library/src/main/java/com/alibaba/dcm/internal/JavaVersionUtil.java b/library/src/main/java/com/alibaba/dcm/internal/JavaVersionUtil.java
deleted file mode 100644
index 2c2a62c..0000000
--- a/library/src/main/java/com/alibaba/dcm/internal/JavaVersionUtil.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.alibaba.dcm.internal;
-
-/**
- * @author antfling (ding_zhengang at hithinksoft dot com)
- * @author Jerry Lee (oldratlee at gmail dot com)
- * @since 1.6.0
- */
-public final class JavaVersionUtil {
- public static boolean isJavaVersionAtMost8() {
- return JAVA_SPECIFICATION_VERSION_AS_ENUM.atMost(JavaVersion.JAVA_1_8);
- }
-
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //
- // Blow source code is copied from commons-lang-3.12.0:
- //
- // https://github.com/apache/commons-lang/blob/rel/commons-lang-3.12.0/src/main/java/org/apache/commons/lang3/SystemUtils.java
- //
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
- private static final String JAVA_SPECIFICATION_VERSION = getSystemProperty("java.specification.version");
- private static final JavaVersion JAVA_SPECIFICATION_VERSION_AS_ENUM = JavaVersion.get(JAVA_SPECIFICATION_VERSION);
-
- @SuppressWarnings({"CommentedOutCode", "SameParameterValue"})
- private static String getSystemProperty(final String property) {
- try {
- return System.getProperty(property);
- } catch (final SecurityException ex) {
- // we are not allowed to look at this property
- // System.err.println("Caught a SecurityException reading the system property '" + property
- // + "'; the SystemUtils property value will default to null.");
- return null;
- }
- }
-
- private JavaVersionUtil() {
- }
-}
diff --git a/library/src/test/java/com/alibaba/dcm/internal/JavaVersionUtilTests.kt b/library/src/test/java/com/alibaba/dcm/internal/JavaVersionUtilTests.kt
deleted file mode 100644
index 7fa5088..0000000
--- a/library/src/test/java/com/alibaba/dcm/internal/JavaVersionUtilTests.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.alibaba.dcm.internal
-
-import io.kotest.core.spec.style.FunSpec
-import io.kotest.matchers.shouldBe
-import org.apache.commons.lang3.JavaVersion
-import org.apache.commons.lang3.SystemUtils
-
-class JavaVersionUtilTests : FunSpec({
- test("JavaVersionUtil.isJavaVersionAtMost8") {
- JavaVersionUtil.isJavaVersionAtMost8() shouldBe SystemUtils.isJavaVersionAtMost(JavaVersion.JAVA_1_8)
- }
-})
From 3f7de9a6f056495b27d57ca257d4d05829ec64b6 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 00:01:29 +0800
Subject: [PATCH 16/70] chore(pom): use default `javadoc` dir instead of
customized; change `spotbugs-maven-plugin` phase
---
library/src/{api => javadoc}/overview.html | 0
pom.xml | 3 +--
tool/src/{api => javadoc}/overview.html | 0
3 files changed, 1 insertion(+), 2 deletions(-)
rename library/src/{api => javadoc}/overview.html (100%)
rename tool/src/{api => javadoc}/overview.html (100%)
diff --git a/library/src/api/overview.html b/library/src/javadoc/overview.html
similarity index 100%
rename from library/src/api/overview.html
rename to library/src/javadoc/overview.html
diff --git a/pom.xml b/pom.xml
index b237056..f275f36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -414,7 +414,6 @@
UTF-8
${javadoc.default.exclude.packages}
- src/api/overview.html
all,-missing
From 73271e92594359359442cf7086cae5903d9dbc27 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 25 Dec 2022 02:36:18 +0800
Subject: [PATCH 18/70] chore(deps): bump maven-install-plugin from 3.0.1 to
3.1.0 (#122)
Bumps [maven-install-plugin](https://github.com/apache/maven-install-plugin) from 3.0.1 to 3.1.0.
- [Release notes](https://github.com/apache/maven-install-plugin/releases)
- [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.0.1...maven-install-plugin-3.1.0)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-install-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index de870c9..b124181 100644
--- a/pom.xml
+++ b/pom.xml
@@ -354,7 +354,7 @@
maven-install-plugin
- 3.0.1
+ 3.1.0
maven-deploy-plugin
From 506f09bf329481dfd30d25fe9d990f28854fd94a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 25 Dec 2022 02:36:32 +0800
Subject: [PATCH 19/70] chore(deps): bump spotbugs-maven-plugin from 4.7.2.1 to
4.7.3.0 (#120)
Bumps [spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.2.1 to 4.7.3.0.
- [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases)
- [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.2.1...spotbugs-maven-plugin-4.7.3.0)
---
updated-dependencies:
- dependency-name: com.github.spotbugs:spotbugs-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b124181..e7ca334 100644
--- a/pom.xml
+++ b/pom.xml
@@ -537,7 +537,7 @@
com.github.spotbugs
spotbugs-maven-plugin
- 4.7.2.1
+ 4.7.3.0
verify
From 9960871690a3d67490b91da55b52bd4ad26a63ec Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 25 Dec 2022 02:36:43 +0800
Subject: [PATCH 20/70] chore(deps): bump kotest.version from 5.5.1 to 5.5.4
(#119)
Bumps `kotest.version` from 5.5.1 to 5.5.4.
Updates `kotest-runner-junit5-jvm` from 5.5.1 to 5.5.4
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.5.1...v5.5.4)
Updates `kotest-assertions-core-jvm` from 5.5.1 to 5.5.4
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.5.1...v5.5.4)
Updates `kotest-property-jvm` from 5.5.1 to 5.5.4
- [Release notes](https://github.com/kotest/kotest/releases)
- [Commits](https://github.com/kotest/kotest/compare/v5.5.1...v5.5.4)
---
updated-dependencies:
- dependency-name: io.kotest:kotest-runner-junit5-jvm
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: io.kotest:kotest-assertions-core-jvm
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: io.kotest:kotest-property-jvm
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index e7ca334..facdec4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
5.9.1
- 5.5.1
+ 5.5.4
From 53f1ce2605a9893bf91d51bf17b1d939c521ca99 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 25 Dec 2022 02:37:23 +0800
Subject: [PATCH 21/70] chore(deps): bump versions-maven-plugin from 2.12.0 to
2.14.2 (#125)
Bumps [versions-maven-plugin](https://github.com/mojohaus/versions) from 2.12.0 to 2.14.2.
- [Release notes](https://github.com/mojohaus/versions/releases)
- [Changelog](https://github.com/mojohaus/versions/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/mojohaus/versions/compare/versions-maven-plugin-2.12.0...2.14.2)
---
updated-dependencies:
- dependency-name: org.codehaus.mojo:versions-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index facdec4..c73d7ac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -307,7 +307,7 @@
-->
org.codehaus.mojo
versions-maven-plugin
- 2.12.0
+ 2.14.2
file://${maven.multiModuleProjectDirectory}/library/src/versions-rules.xml
false
From bfcfd07da4132bb10a0030970f7c647e46511015 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 11:25:47 +0800
Subject: [PATCH 22/70] chore(ci): add JDK `8.0.345` into `appveyor CI`
---
scripts/codecov | 10 +++++++---
scripts/integration_test | 1 +
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/scripts/codecov b/scripts/codecov
index a236692..9dd2d2c 100755
--- a/scripts/codecov
+++ b/scripts/codecov
@@ -19,16 +19,20 @@ source bash-buddy/lib/java_build_utils.sh
cd ..
export DCM_AGENT_SUPPRESS_EXCEPTION_STACK=true
+readonly SIMPLE_RUN_ARGUMENTS=(-Pgen-code-cov jacoco:prepare-agent surefire:test jacoco:report)
prepare_jdks::switch_to_jdk 11
if [ "${1:-}" = "-s" ]; then
- jvb::mvn_cmd -Pgen-code-cov jacoco:prepare-agent surefire:test jacoco:report
+ jvb::mvn_cmd "${SIMPLE_RUN_ARGUMENTS[@]}"
else
jvb::mvn_cmd -Pgen-code-cov clean test
fi
-prepare_jdks::switch_to_jdk 8
-jvb::mvn_cmd -Pgen-code-cov jacoco:prepare-agent surefire:test jacoco:report coveralls:report
+prepare_jdks::switch_to_jdk 8.0.345
+jvb::mvn_cmd "${SIMPLE_RUN_ARGUMENTS[@]}"
+
+prepare_jdks::switch_to_jdk 17
+jvb::mvn_cmd "${SIMPLE_RUN_ARGUMENTS[@]}" coveralls:report
bash <(curl -s https://codecov.io/bash)
diff --git a/scripts/integration_test b/scripts/integration_test
index 0a398b0..0e79d27 100755
--- a/scripts/integration_test
+++ b/scripts/integration_test
@@ -13,6 +13,7 @@ readonly default_build_jdk_version=11
# shellcheck disable=SC2034
readonly PREPARE_JDKS_INSTALL_BY_SDKMAN=(
+ 8.0.345
8
"$default_build_jdk_version"
17
From f14383481c6224017e7e392605db413467819d6a Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 03:32:47 +0800
Subject: [PATCH 23/70] ! update after release `v1.8.0`
---
README.md | 8 ++++----
docs/developer-guide.md | 10 +++++-----
docs/zh-CN/README.md | 7 ++++---
docs/zh-CN/library.md | 12 ++++++------
docs/zh-CN/tool.md | 6 +++---
library/pom.xml | 2 +-
pom.xml | 2 +-
tool/pom.xml | 2 +-
8 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/README.md b/README.md
index 0f6142e..2ed8dc3 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
-
+
@@ -17,7 +17,7 @@
-
+
@@ -306,7 +306,7 @@ Java API document:
com.alibaba
dns-cache-manipulator
- 1.7.2
+ 1.8.0
```
@@ -341,7 +341,7 @@ You can view the latest version at [search.maven.org](https://search.maven.org/a
### Download
-[](https://github.com/alibaba/java-dns-cache-manipulator/releases/download/v1.7.2/dcm-1.7.2.tar.gz) download the file `dcm-x.y.z.tar.gz`.
+[](https://github.com/alibaba/java-dns-cache-manipulator/releases/download/v1.8.0/dcm-1.8.0.tar.gz) download the file `dcm-x.y.z.tar.gz`.
After decompression, run `dcm` in the `bin` directory.
diff --git a/docs/developer-guide.md b/docs/developer-guide.md
index 82cb2b5..fc4b6cf 100644
--- a/docs/developer-guide.md
+++ b/docs/developer-guide.md
@@ -5,7 +5,7 @@
-
+
@@ -17,7 +17,7 @@
-
+
## How to set the DNS Cache of `JVM` safely
@@ -26,8 +26,8 @@ The DNS Cache of the JVM is maintained in the private field of the InetAddress c
- [`InetAddressCacheUtilCommons.java`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java)
-- [`InetAddressCacheUtilForJava8Minus.java`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava8Minus.java)
-- [`InetAddressCacheUtilForJava9Plus.java`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava9Plus.java)
+- [`InetAddressCacheUtilForOld.java`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java)
+- [`InetAddressCacheUtilForNew.java`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForNew.java)
Pay attention to the thread safety of setting the DNS Cache of JVM
The DNS Cache of the JVM is obviously shared globally, so the setting is guaranteed to be thread-safe and there is no concurrency problem.
@@ -55,7 +55,7 @@ private static void cacheAddresses(String hostname,
}
```
-In the [`InetAddressCacheUtilForJava8Minus`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava8Minus.java) class, the read and write to the DNS Cache also consistently adds a synchronized block with `addressCache` field as the lock to ensure thread safety.
+In the [`InetAddressCacheUtilForOld`](../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java) class, the read and write to the DNS Cache also consistently adds a synchronized block with `addressCache` field as the lock to ensure thread safety.
## Need test different `JDK` versions
diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md
index fb8673a..4af685c 100644
--- a/docs/zh-CN/README.md
+++ b/docs/zh-CN/README.md
@@ -1,10 +1,11 @@
#
-
+
+
-
+
@@ -16,7 +17,7 @@
-
+
[📖 English Documentation](../../README.md) | 📖 中文文档
diff --git a/docs/zh-CN/library.md b/docs/zh-CN/library.md
index 1ec21c4..a4fa9fe 100644
--- a/docs/zh-CN/library.md
+++ b/docs/zh-CN/library.md
@@ -5,7 +5,7 @@ Java Dns Cache Manipulator(DCM) Library
-
+
@@ -218,7 +218,7 @@ content = m2.getResponseBodyAsString();
更多详细功能
----------------------------------
-参见类[`DnsCacheManipulator`](src/main/java/com/alibaba/dcm/DnsCacheManipulator.java)的文档说明。
+参见类[`DnsCacheManipulator`](../../library/src/main/java/com/alibaba/dcm/DnsCacheManipulator.java)的文档说明。
:electric_plug: Java API Docs
=====================================
@@ -234,7 +234,7 @@ content = m2.getResponseBodyAsString();
com.alibaba
dns-cache-manipulator
- 1.7.2
+ 1.8.0
```
@@ -271,8 +271,8 @@ PS:
`JVM`的`DNS Cache`维护在类`InetAddress`的私有字段中,通过反射来设置,具体实现参见
- [`InetAddressCacheUtilCommons.java`](../../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilCommons.java)
-- [`InetAddressCacheUtilForJava9Plus.java`](../../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava8Minus.java)
-- [`InetAddressCacheUtilForJava9Plus.java`](../../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJava9Plus.java)
+- [`InetAddressCacheUtilForOld.java`](../../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java)
+- [`InetAddressCacheUtilForNew.java`](../../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForNew.java)
注意设置`JVM`的`DNS Cache`的线程安全问题
----------------------------------
@@ -302,7 +302,7 @@ private static void cacheAddresses(String hostname,
}
```
-[`InetAddressCacheUtilForJdk8Minus`](src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForJdk8Minus.java)类中对`DNS Cache`的读写也一致地加了以`addressCache`为锁的`synchronized`块,以保证线程安全。
+[`InetAddressCacheUtilForOld`](../../library/src/main/java/com/alibaba/dcm/internal/InetAddressCacheUtilForOld.java)类中对`DNS Cache`的读写也一致地加了以`addressCache`为锁的`synchronized`块,以保证线程安全。
需要测试不同版本`JDK`
----------------------------------
diff --git a/docs/zh-CN/tool.md b/docs/zh-CN/tool.md
index 4626084..4e62c7b 100644
--- a/docs/zh-CN/tool.md
+++ b/docs/zh-CN/tool.md
@@ -5,7 +5,7 @@ Java Dns Cache Manipulator Tool
-
+
@@ -17,7 +17,7 @@ Java Dns Cache Manipulator Tool
-
+
:point_right: 设置/查看 运行中`JVM`进程的`DNS Cache`,支持`IPv6`。
@@ -52,7 +52,7 @@ Java Dns Cache Manipulator Tool
下载
----------
-[](https://github.com/alibaba/java-dns-cache-manipulator/releases/download/v1.7.2/dcm-1.7.2.tar.gz) 下载文件`dcm-x.y.z.tar.gz`。
+[](https://github.com/alibaba/java-dns-cache-manipulator/releases/download/v1.8.0/dcm-1.8.0.tar.gz) 下载文件`dcm-x.y.z.tar.gz`。
解压后,运行`bin`目录下的`dcm`。
diff --git a/library/pom.xml b/library/pom.xml
index a78832d..ffe79b1 100644
--- a/library/pom.xml
+++ b/library/pom.xml
@@ -4,7 +4,7 @@
com.alibaba
dns-cache-manipulator-parent
- 1.8.0-SNAPSHOT
+ 1.x-SNAPSHOT
../pom.xml
diff --git a/pom.xml b/pom.xml
index c73d7ac..8381128 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.alibaba
dns-cache-manipulator-parent
- 1.8.0-SNAPSHOT
+ 1.x-SNAPSHOT
pom
${project.artifactId}
🌏 A tiny lib/tool for setting/viewing java dns.
diff --git a/tool/pom.xml b/tool/pom.xml
index b7c8460..343b6ad 100644
--- a/tool/pom.xml
+++ b/tool/pom.xml
@@ -4,7 +4,7 @@
com.alibaba
dns-cache-manipulator-parent
- 1.8.0-SNAPSHOT
+ 1.x-SNAPSHOT
../pom.xml
From c0b2fb67ce164a926f12059e1a3efba7950b66dd Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sun, 25 Dec 2022 11:11:17 +0800
Subject: [PATCH 24/70] build: exclude `org.jetbrains:annotations` when
assembly DCM tool
---
tool/src/assembly/assembly.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/tool/src/assembly/assembly.xml b/tool/src/assembly/assembly.xml
index 025c456..6964eda 100644
--- a/tool/src/assembly/assembly.xml
+++ b/tool/src/assembly/assembly.xml
@@ -12,6 +12,7 @@
com.github.spotbugs:*
com.google.code.findbugs:*
+ org.jetbrains:annotations:*
dependencies
From 7055e550b915cc0fd3f3c96257a39cdd12f66c10 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Tue, 27 Dec 2022 14:02:55 +0800
Subject: [PATCH 25/70] chore(pom): improve pom
---
pom.xml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 8381128..1191308 100644
--- a/pom.xml
+++ b/pom.xml
@@ -81,7 +81,6 @@
org.jetbrains
annotations
- 23.1.0
true
@@ -164,6 +163,14 @@
3.0.2
true
+
+
+ org.jetbrains
+ annotations
+ 23.1.0
+ true
+
+
From 8c88a13c21a40342414350db7f5f813b2239bce9 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Dec 2022 17:37:25 +0800
Subject: [PATCH 26/70] chore(deps): bump kotlin.version from 1.7.22 to 1.8.0
(#127)
Bumps `kotlin.version` from 1.7.22 to 1.8.0.
Updates `kotlin-bom` from 1.7.22 to 1.8.0
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.22...v1.8.0)
Updates `kotlin-maven-plugin` from 1.7.22 to 1.8.0
---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin:kotlin-bom
dependency-type: direct:production
update-type: version-update:semver-minor
- dependency-name: org.jetbrains.kotlin:kotlin-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 1191308..47145aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
${maven.compiler.source}
UTF-8
- 1.7.22
+ 1.8.0
${maven.compiler.source}
From bf92a095d45b84c6c808663e4e66d0f294b7fba7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 2 Jan 2023 17:26:26 +0800
Subject: [PATCH 27/70] chore(deps-dev): bump maven-artifact from 3.8.6 to
3.8.7 (#128)
Bumps [maven-artifact](https://github.com/apache/maven) from 3.8.6 to 3.8.7.
- [Release notes](https://github.com/apache/maven/releases)
- [Commits](https://github.com/apache/maven/compare/maven-3.8.6...maven-3.8.7)
---
updated-dependencies:
- dependency-name: org.apache.maven:maven-artifact
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 47145aa..1f69dda 100644
--- a/pom.xml
+++ b/pom.xml
@@ -139,7 +139,7 @@
org.apache.maven
maven-artifact
- 3.8.6
+ 3.8.7
- 5.9.1
+ 5.9.2
5.5.4
From d0227e37eda58602c81998ace23ffe8471fece82 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 12 Jan 2023 17:49:11 +0800
Subject: [PATCH 29/70] chore(deps): bump annotations from 23.1.0 to 24.0.0
(#130)
Bumps [annotations](https://github.com/JetBrains/java-annotations) from 23.1.0 to 24.0.0.
- [Release notes](https://github.com/JetBrains/java-annotations/releases)
- [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md)
- [Commits](https://github.com/JetBrains/java-annotations/compare/23.1.0...24.0.0)
---
updated-dependencies:
- dependency-name: org.jetbrains:annotations
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index a8a2f72..0e7f8d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -167,7 +167,7 @@
org.jetbrains
annotations
- 23.1.0
+ 24.0.0
true
From c8826540aa16628bf77ed708284543d37e757d39 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 3 Feb 2023 17:48:56 +0800
Subject: [PATCH 30/70] chore(deps): bump kotlin.version from 1.8.0 to 1.8.10
(#132)
Bumps `kotlin.version` from 1.8.0 to 1.8.10.
Updates `kotlin-bom` from 1.8.0 to 1.8.10
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.8.10/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.8.0...v1.8.10)
Updates `kotlin-maven-plugin` from 1.8.0 to 1.8.10
---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin:kotlin-bom
dependency-type: direct:production
update-type: version-update:semver-patch
- dependency-name: org.jetbrains.kotlin:kotlin-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 0e7f8d0..145b5e6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
${maven.compiler.source}
UTF-8
- 1.8.0
+ 1.8.10
${maven.compiler.source}
From ed25a22d5a97bc6dab857557805127173a24ff27 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 3 Feb 2023 17:52:19 +0800
Subject: [PATCH 31/70] chore(deps): bump maven-enforcer-plugin from 3.1.0 to
3.2.1 (#131)
Bumps [maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.1.0 to 3.2.1.
- [Release notes](https://github.com/apache/maven-enforcer/releases)
- [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.1.0...enforcer-3.2.1)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-enforcer-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 145b5e6..83ee3b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -288,7 +288,7 @@
-->
maven-enforcer-plugin
- 3.1.0
+ 3.2.1
enforce-maven
From aba98727eb3f388bd10c7a8a7fd6db485f12958d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 8 Feb 2023 22:00:59 +0800
Subject: [PATCH 32/70] chore(deps-dev): bump maven-artifact from 3.8.7 to
3.9.0 (#134)
Bumps [maven-artifact](https://github.com/apache/maven) from 3.8.7 to 3.9.0.
- [Release notes](https://github.com/apache/maven/releases)
- [Commits](https://github.com/apache/maven/compare/maven-3.8.7...maven-3.9.0)
---
updated-dependencies:
- dependency-name: org.apache.maven:maven-artifact
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 83ee3b1..ea1dfce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -139,7 +139,7 @@
org.apache.maven
maven-artifact
- 3.8.7
+ 3.9.0
5.9.2
- 5.5.4
+ 5.5.5
From 3e3a86c8c35c64b63a0aa1bae5431a06417a6e12 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 16 Feb 2023 17:56:40 +0800
Subject: [PATCH 35/70] chore(deps): bump maven-javadoc-plugin from 3.4.1 to
3.5.0 (#136)
Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.4.1 to 3.5.0.
- [Release notes](https://github.com/apache/maven-javadoc-plugin/releases)
- [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.4.1...maven-javadoc-plugin-3.5.0)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-javadoc-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index dc78395..d62ca88 100644
--- a/pom.xml
+++ b/pom.xml
@@ -345,7 +345,7 @@
maven-javadoc-plugin
- 3.4.1
+ 3.5.0
maven-surefire-plugin
From 03589a002eee64d4fbec3efa29948c5c56130abe Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 22 Feb 2023 18:33:27 +0800
Subject: [PATCH 36/70] chore(deps): bump versions-maven-plugin from 2.14.2 to
2.15.0 (#137)
Bumps [versions-maven-plugin](https://github.com/mojohaus/versions) from 2.14.2 to 2.15.0.
- [Release notes](https://github.com/mojohaus/versions/releases)
- [Changelog](https://github.com/mojohaus/versions/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/mojohaus/versions/compare/2.14.2...2.15.0)
---
updated-dependencies:
- dependency-name: org.codehaus.mojo:versions-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index d62ca88..614d342 100644
--- a/pom.xml
+++ b/pom.xml
@@ -314,7 +314,7 @@
-->
org.codehaus.mojo
versions-maven-plugin
- 2.14.2
+ 2.15.0
file://${maven.multiModuleProjectDirectory}/library/src/versions-rules.xml
false
From da8efb93aad5e0592013da2be29130d475e956aa Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 23 Feb 2023 18:38:11 +0800
Subject: [PATCH 37/70] chore(deps): bump maven-assembly-plugin from 3.4.2 to
3.5.0 (#138)
Bumps [maven-assembly-plugin](https://github.com/apache/maven-assembly-plugin) from 3.4.2 to 3.5.0.
- [Release notes](https://github.com/apache/maven-assembly-plugin/releases)
- [Commits](https://github.com/apache/maven-assembly-plugin/compare/maven-assembly-plugin-3.4.2...maven-assembly-plugin-3.5.0)
---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-assembly-plugin
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
tool/pom.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/pom.xml b/pom.xml
index 614d342..63a84c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -353,7 +353,7 @@
maven-assembly-plugin
- 3.4.2
+ 3.5.0
maven-site-plugin
diff --git a/tool/pom.xml b/tool/pom.xml
index 343b6ad..4e22e8d 100644
--- a/tool/pom.xml
+++ b/tool/pom.xml
@@ -93,7 +93,7 @@
https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
-->
maven-assembly-plugin
- 3.4.2
+ 3.5.0
dcm-${project.version}
false
From 9c77cbacd9f04abc818af48fe778e0c79162e874 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 25 Feb 2023 20:26:05 +0800
Subject: [PATCH 38/70] chore(deps): bump spotbugs-maven-plugin from 4.7.3.0 to
4.7.3.1 (#139)
Bumps [spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) from 4.7.3.0 to 4.7.3.1.
- [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases)
- [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.7.3.0...spotbugs-maven-plugin-4.7.3.1)
---
updated-dependencies:
- dependency-name: com.github.spotbugs:spotbugs-maven-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 63a84c0..633a30e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -544,7 +544,7 @@
com.github.spotbugs
spotbugs-maven-plugin
- 4.7.3.0
+ 4.7.3.1
verify
From ed3eec587d70853bde2f58111da9c4402f09fa45 Mon Sep 17 00:00:00 2001
From: Jerry Lee
Date: Sat, 25 Feb 2023 20:47:38 +0800
Subject: [PATCH 39/70] chore: upgrade maven wrapper to 3.9.0
`mvn wrapper:wrapper -Dmaven=3.9.0`
more info see:
https://maven.apache.org/wrapper/
---
.mvn/wrapper/MavenWrapperDownloader.java | 117 -----------------------
.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 59925 bytes
.mvn/wrapper/maven-wrapper.properties | 20 +++-
mvnw | 99 ++++++++-----------
mvnw.cmd | 39 ++++----
5 files changed, 78 insertions(+), 197 deletions(-)
delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
deleted file mode 100644
index b901097..0000000
--- a/.mvn/wrapper/MavenWrapperDownloader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2007-present the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import java.net.*;
-import java.io.*;
-import java.nio.channels.*;
-import java.util.Properties;
-
-public class MavenWrapperDownloader {
-
- private static final String WRAPPER_VERSION = "0.5.6";
- /**
- * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
- */
- private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
- + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
-
- /**
- * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
- * use instead of the default one.
- */
- private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
- ".mvn/wrapper/maven-wrapper.properties";
-
- /**
- * Path where the maven-wrapper.jar will be saved to.
- */
- private static final String MAVEN_WRAPPER_JAR_PATH =
- ".mvn/wrapper/maven-wrapper.jar";
-
- /**
- * Name of the property which should be used to override the default download url for the wrapper.
- */
- private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
-
- public static void main(String args[]) {
- System.out.println("- Downloader started");
- File baseDirectory = new File(args[0]);
- System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
-
- // If the maven-wrapper.properties exists, read it and check if it contains a custom
- // wrapperUrl parameter.
- File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
- String url = DEFAULT_DOWNLOAD_URL;
- if(mavenWrapperPropertyFile.exists()) {
- FileInputStream mavenWrapperPropertyFileInputStream = null;
- try {
- mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
- Properties mavenWrapperProperties = new Properties();
- mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
- url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
- } catch (IOException e) {
- System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
- } finally {
- try {
- if(mavenWrapperPropertyFileInputStream != null) {
- mavenWrapperPropertyFileInputStream.close();
- }
- } catch (IOException e) {
- // Ignore ...
- }
- }
- }
- System.out.println("- Downloading from: " + url);
-
- File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
- if(!outputFile.getParentFile().exists()) {
- if(!outputFile.getParentFile().mkdirs()) {
- System.out.println(
- "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
- }
- }
- System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
- try {
- downloadFileFromURL(url, outputFile);
- System.out.println("Done");
- System.exit(0);
- } catch (Throwable e) {
- System.out.println("- Error downloading");
- e.printStackTrace();
- System.exit(1);
- }
- }
-
- private static void downloadFileFromURL(String urlString, File destination) throws Exception {
- if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
- String username = System.getenv("MVNW_USERNAME");
- char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
- Authenticator.setDefault(new Authenticator() {
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
- });
- }
- URL website = new URL(urlString);
- ReadableByteChannel rbc;
- rbc = Channels.newChannel(website.openStream());
- FileOutputStream fos = new FileOutputStream(destination);
- fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
- fos.close();
- rbc.close();
- }
-
-}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 100644
GIT binary patch
literal 59925
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