diff --git a/bookkeeper-admin-api/src/main/java/io/github/protocol/bookkeeper/admin/api/Configuration.java b/bookkeeper-admin-api/src/main/java/io/github/protocol/bookkeeper/admin/api/Configuration.java
new file mode 100644
index 0000000..38a0942
--- /dev/null
+++ b/bookkeeper-admin-api/src/main/java/io/github/protocol/bookkeeper/admin/api/Configuration.java
@@ -0,0 +1,34 @@
+package io.github.protocol.bookkeeper.admin.api;
+
+public class Configuration {
+ public String host = "localhost";
+
+ public int port;
+
+ public boolean tlsEnabled;
+
+ public TlsConfig tlsConfig;
+
+ public Configuration() {
+ }
+
+ public Configuration host(String host) {
+ this.host = host;
+ return this;
+ }
+
+ public Configuration port(int port) {
+ this.port = port;
+ return this;
+ }
+
+ public Configuration tlsEnabled(boolean tlsEnabled) {
+ this.tlsEnabled = tlsEnabled;
+ return this;
+ }
+
+ public Configuration tlsConfig(TlsConfig tlsConfig) {
+ this.tlsConfig = tlsConfig;
+ return this;
+ }
+}
diff --git a/bookkeeper-admin-common/pom.xml b/bookkeeper-admin-common/pom.xml
new file mode 100644
index 0000000..533e754
--- /dev/null
+++ b/bookkeeper-admin-common/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+
+ io.github.protocol-laboratory
+ bookkeeper-admin-parent
+ 0.0.3
+
+
+ bookkeeper-admin-common
+
+
+
+ io.github.protocol-laboratory
+ bookkeeper-admin-api
+ ${project.version}
+
+
+
+
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/JacksonService.java b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/JacksonService.java
similarity index 64%
rename from bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/JacksonService.java
rename to bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/JacksonService.java
index 5bd2282..67d01f0 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/JacksonService.java
+++ b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/JacksonService.java
@@ -1,22 +1,4 @@
-/*
- * 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 io.github.protocol.bookkeeper.admin.jdk;
+package io.github.protocol.bookkeeper.admin.common;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
diff --git a/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/package-info.java b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/package-info.java
new file mode 100644
index 0000000..33a68c1
--- /dev/null
+++ b/bookkeeper-admin-common/src/main/java/io/github/protocol/bookkeeper/admin/common/package-info.java
@@ -0,0 +1 @@
+package io.github.protocol.bookkeeper.admin.common;
diff --git a/bookkeeper-admin-jdk/pom.xml b/bookkeeper-admin-jdk/pom.xml
index 86b0b3c..b8d89f5 100644
--- a/bookkeeper-admin-jdk/pom.xml
+++ b/bookkeeper-admin-jdk/pom.xml
@@ -14,7 +14,7 @@
io.github.protocol-laboratory
- bookkeeper-admin-api
+ bookkeeper-admin-common
${project.version}
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java
index 12910b8..0e9c159 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java
+++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImpl.java
@@ -1,6 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
import com.fasterxml.jackson.core.type.TypeReference;
+import io.github.protocol.bookkeeper.admin.common.JacksonService;
import java.io.IOException;
import java.net.http.HttpResponse;
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java
index ea54fbf..3577150 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java
+++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImpl.java
@@ -1,6 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
import com.fasterxml.jackson.core.type.TypeReference;
+import io.github.protocol.bookkeeper.admin.common.JacksonService;
import java.io.IOException;
import java.net.http.HttpResponse;
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java
index e58ac36..6f18bf9 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java
+++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminBuilderImpl.java
@@ -1,5 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
+import io.github.protocol.bookkeeper.admin.api.Configuration;
+
public class BookkeeperAdminBuilderImpl implements BookkeeperAdminBuilder {
private final Configuration conf;
@@ -14,13 +16,13 @@ public BookkeeperAdmin build() {
@Override
public BookkeeperAdminBuilder host(String host) {
- this.conf.setHost(host);
+ this.conf.host(host);
return this;
}
@Override
public BookkeeperAdminBuilder port(int port) {
- this.conf.setPort(port);
+ this.conf.port(port);
return this;
}
}
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java
index 53f019b..73804f1 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java
+++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/BookkeeperAdminImpl.java
@@ -1,5 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
+import io.github.protocol.bookkeeper.admin.api.Configuration;
+
public class BookkeeperAdminImpl implements BookkeeperAdmin {
private final BookiesImpl bookies;
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java
index 4bb8323..6225855 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java
+++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImpl.java
@@ -1,6 +1,8 @@
package io.github.protocol.bookkeeper.admin.jdk;
+import io.github.protocol.bookkeeper.admin.common.JacksonService;
+
import java.io.IOException;
import java.net.http.HttpResponse;
import java.util.Map;
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/Configuration.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/Configuration.java
deleted file mode 100644
index 48b05e1..0000000
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/Configuration.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package io.github.protocol.bookkeeper.admin.jdk;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Setter
-@Getter
-public class Configuration {
- private String host = "localhost";
-
- private int port;
-
- public Configuration() {
- }
-}
diff --git a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java
index 0511936..86fe369 100644
--- a/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java
+++ b/bookkeeper-admin-jdk/src/main/java/io/github/protocol/bookkeeper/admin/jdk/InnerHttpClient.java
@@ -1,6 +1,8 @@
package io.github.protocol.bookkeeper.admin.jdk;
import com.fasterxml.jackson.core.JsonProcessingException;
+import io.github.protocol.bookkeeper.admin.api.Configuration;
+import io.github.protocol.bookkeeper.admin.common.JacksonService;
import java.io.IOException;
import java.net.URI;
@@ -22,7 +24,7 @@ public InnerHttpClient(Configuration conf) {
this.client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.build();
- this.httpPrefix = "http://" + conf.getHost() + ":" + conf.getPort();
+ this.httpPrefix = "http://" + conf.host + ":" + conf.port;
}
public HttpResponse get(String urlSuffix) throws Exception {
diff --git a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java
index aeaeb1e..d1f85a7 100644
--- a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java
+++ b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/AutoRecoveryImplTest.java
@@ -1,6 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
import io.github.embedded.bookkeeper.core.EmbeddedBookkeeperServer;
+import io.github.protocol.bookkeeper.admin.api.Configuration;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -18,8 +19,8 @@ public class AutoRecoveryImplTest {
public static void setup() throws Exception {
SERVER.start();
Configuration conf = new Configuration();
- conf.setHost("localhost");
- conf.setPort(SERVER.getBkWebPort());
+ conf.host("localhost");
+ conf.port(SERVER.getBkWebPort());
autoRecovery = new AutoRecoveryImpl(new InnerHttpClient(conf));
}
diff --git a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java
index 12965ec..0403f5a 100644
--- a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java
+++ b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/BookiesImplTest.java
@@ -1,6 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
import io.github.embedded.bookkeeper.core.EmbeddedBookkeeperServer;
+import io.github.protocol.bookkeeper.admin.api.Configuration;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -19,8 +20,8 @@ public class BookiesImplTest {
public static void setup() throws Exception {
SERVER.start();
Configuration conf = new Configuration();
- conf.setHost("localhost");
- conf.setPort(SERVER.getBkWebPort());
+ conf.host("localhost");
+ conf.port(SERVER.getBkWebPort());
bookiesImpl = new BookiesImpl(new InnerHttpClient(conf));
}
diff --git a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java
index 80e540d..9789c72 100644
--- a/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java
+++ b/bookkeeper-admin-jdk/src/test/java/io/github/protocol/bookkeeper/admin/jdk/ConfigsImplTest.java
@@ -1,6 +1,7 @@
package io.github.protocol.bookkeeper.admin.jdk;
import io.github.embedded.bookkeeper.core.EmbeddedBookkeeperServer;
+import io.github.protocol.bookkeeper.admin.api.Configuration;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
@@ -20,8 +21,8 @@ public class ConfigsImplTest {
public static void setup() throws Exception {
SERVER.start();
Configuration conf = new Configuration();
- conf.setHost("localhost");
- conf.setPort(SERVER.getBkWebPort());
+ conf.host("localhost");
+ conf.port(SERVER.getBkWebPort());
configsImpl = new ConfigsImpl(new InnerHttpClient(conf));
}
diff --git a/bookkeeper-admin-reactor/pom.xml b/bookkeeper-admin-reactive/pom.xml
similarity index 88%
rename from bookkeeper-admin-reactor/pom.xml
rename to bookkeeper-admin-reactive/pom.xml
index dc62f75..471ea59 100644
--- a/bookkeeper-admin-reactor/pom.xml
+++ b/bookkeeper-admin-reactive/pom.xml
@@ -9,12 +9,12 @@
0.0.3
- bookkeeper-admin-reactor
+ bookkeeper-admin-reactive
io.github.protocol-laboratory
- bookkeeper-admin-api
+ bookkeeper-admin-common
${project.version}
diff --git a/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/InnerReactiveClient.java b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/InnerReactiveClient.java
new file mode 100644
index 0000000..f3d2a96
--- /dev/null
+++ b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/InnerReactiveClient.java
@@ -0,0 +1,33 @@
+package io.github.protocol.bookkeeper.admin.reactive;
+
+import io.github.protocol.bookkeeper.admin.api.Configuration;
+import io.netty.handler.ssl.SslContext;
+import reactor.netty.http.client.HttpClient;
+import reactor.netty.http.client.HttpClientSecurityUtils;
+
+public class InnerReactiveClient {
+ private final HttpClient httpClient;
+
+ private final String httpPrefix;
+
+ public InnerReactiveClient(Configuration conf) {
+ HttpClient client = HttpClient.create();
+
+ if (conf.tlsEnabled) {
+ client = client.secure(spec -> {
+ SslContext context = SslContextUtil.build(conf.tlsConfig);
+ if (conf.tlsConfig.hostnameVerifyDisabled) {
+ spec.sslContext(context)
+ .handlerConfigurator(HttpClientSecurityUtils.HOSTNAME_VERIFICATION_CONFIGURER);
+ } else {
+ spec.sslContext(context);
+ }
+ });
+ this.httpPrefix = "https://" + conf.host + ":" + conf.port;
+ } else {
+ this.httpPrefix = "http://" + conf.host + ":" + conf.port;
+ }
+
+ this.httpClient = client;
+ }
+}
diff --git a/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/SslContextUtil.java b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/SslContextUtil.java
new file mode 100644
index 0000000..c540df4
--- /dev/null
+++ b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/SslContextUtil.java
@@ -0,0 +1,57 @@
+package io.github.protocol.bookkeeper.admin.reactive;
+
+import io.github.protocol.bookkeeper.admin.api.TlsConfig;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+
+import java.io.FileInputStream;
+import java.security.KeyStore;
+import java.util.Arrays;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManagerFactory;
+
+public class SslContextUtil {
+
+ public static SslContext build(TlsConfig config) {
+ try {
+ SslContextBuilder sslContextBuilder = SslContextBuilder.forClient();
+
+ if (config.keyStorePath != null && config.keyStorePassword != null) {
+ KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ try (FileInputStream keyStoreInputStream = new FileInputStream(config.keyStorePath)) {
+ keyStore.load(keyStoreInputStream, config.keyStorePassword);
+ }
+ String defaultKeyAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
+ KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(defaultKeyAlgorithm);
+ keyManagerFactory.init(keyStore, config.keyStorePassword);
+ sslContextBuilder.keyManager(keyManagerFactory);
+ }
+
+ if (config.verifyDisabled) {
+ sslContextBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE);
+ } else if (config.trustStorePath != null && config.trustStorePassword != null) {
+ KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ try (FileInputStream trustStoreInputStream = new FileInputStream(config.trustStorePath)) {
+ trustStore.load(trustStoreInputStream, config.trustStorePassword);
+ }
+ String defaultTrustAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
+ TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(defaultTrustAlgorithm);
+ trustManagerFactory.init(trustStore);
+ sslContextBuilder.trustManager(trustManagerFactory);
+ }
+
+ if (config.versions != null) {
+ sslContextBuilder.protocols(config.versions);
+ }
+
+ if (config.cipherSuites != null) {
+ sslContextBuilder.ciphers(Arrays.asList(config.cipherSuites));
+ }
+
+ return sslContextBuilder.build();
+ } catch (Exception e) {
+ throw new RuntimeException("Error setting up SSL configuration", e);
+ }
+ }
+}
diff --git a/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/package-info.java b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/package-info.java
new file mode 100644
index 0000000..5d2b272
--- /dev/null
+++ b/bookkeeper-admin-reactive/src/main/java/io/github/protocol/bookkeeper/admin/reactive/package-info.java
@@ -0,0 +1 @@
+package io.github.protocol.bookkeeper.admin.reactive;
diff --git a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/Configuration.java b/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/Configuration.java
deleted file mode 100644
index 7878eb4..0000000
--- a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/Configuration.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package io.github.protocol.bookkeeper.admin.reactor;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Setter
-@Getter
-public class Configuration {
- private String host = "localhost";
-
- private int port;
-
- public boolean tlsEnable;
-
- public Configuration() {
- }
-}
diff --git a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/InnerReactorClient.java b/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/InnerReactorClient.java
deleted file mode 100644
index 1bbd8c2..0000000
--- a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/InnerReactorClient.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package io.github.protocol.bookkeeper.admin.reactor;
-
-import reactor.netty.http.client.HttpClient;
-
-public class InnerReactorClient {
- private final HttpClient httpClient;
-
- private final String httpPrefix;
-
- public InnerReactorClient(Configuration conf) {
- HttpClient client = HttpClient.create();
-
- if (conf.isTlsEnable()) {
- this.httpPrefix = "https://" + conf.getHost() + ":" + conf.getPort();
- } else {
- this.httpPrefix = "http://" + conf.getHost() + ":" + conf.getPort();
- }
-
- this.httpClient = client;
- }
-}
diff --git a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/package-info.java b/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/package-info.java
deleted file mode 100644
index 82b9055..0000000
--- a/bookkeeper-admin-reactor/src/main/java/io/github/protocol/bookkeeper/admin/reactor/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package io.github.protocol.bookkeeper.admin.reactor;
diff --git a/pom.xml b/pom.xml
index d865c00..8b2cf1e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,8 +11,9 @@
bookkeeper-admin-api
+ bookkeeper-admin-common
bookkeeper-admin-jdk
- bookkeeper-admin-reactor
+ bookkeeper-admin-reactive