This is an automated email from the ASF dual-hosted git repository. ptupitsyn pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 453eb7eb2c IGNITE-20538 Fix internal classes in public API of ignite-client (#2651) 453eb7eb2c is described below commit 453eb7eb2c04bf380b3551117e0b368659a9b6b8 Author: Pavel Tupitsyn <ptupit...@apache.org> AuthorDate: Tue Oct 3 17:48:52 2023 +0300 IGNITE-20538 Fix internal classes in public API of ignite-client (#2651) * Change `ignite-client` dependency on `ignite-core` from `api` to `implementation` * Move `LoggerFactory` to public API * Add test for `ignite-client` public API imports --- .../org/apache/ignite/lang/IgniteException.java | 2 +- .../org/apache/ignite}/lang/LoggerFactory.java | 2 +- .../ignite/internal/cli/logger/CliLoggers.java | 2 +- modules/client/build.gradle | 2 +- .../org/apache/ignite/client/IgniteClient.java | 2 +- .../ignite/client/IgniteClientConfiguration.java | 2 +- ...ClientFeatureNotSupportedByServerException.java | 17 +-- .../apache/ignite/internal/client/ClientUtils.java | 2 +- .../client/IgniteClientConfigurationImpl.java | 2 +- .../ignite/internal/client/ProtocolContext.java | 2 +- .../apache/ignite/client/ClientApiArchTest.java | 128 +++++++++++++++++++++ .../apache/ignite/client/ClientLoggingTest.java | 2 +- .../apache/ignite/client/ConsoleLoggerFactory.java | 2 +- .../org/apache/ignite/client/RetryPolicyTest.java | 2 +- .../apache/ignite/client/TestLoggerFactory.java | 2 +- .../org/apache/ignite/internal/logger/Loggers.java | 2 +- 16 files changed, 146 insertions(+), 27 deletions(-) diff --git a/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java b/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java index 5e43c721e0..218941be99 100644 --- a/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java +++ b/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java @@ -169,7 +169,7 @@ public class IgniteException extends RuntimeException implements TraceableExcept * @param message Detailed message. * @param cause Optional nested exception (can be {@code null}). */ - public IgniteException(int code, String message, Throwable cause) { + public IgniteException(int code, String message, @Nullable Throwable cause) { this(getOrCreateTraceId(cause), code, message, cause); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/lang/LoggerFactory.java b/modules/api/src/main/java/org/apache/ignite/lang/LoggerFactory.java similarity index 96% rename from modules/core/src/main/java/org/apache/ignite/internal/lang/LoggerFactory.java rename to modules/api/src/main/java/org/apache/ignite/lang/LoggerFactory.java index eb4a27e259..34bed99c0c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/lang/LoggerFactory.java +++ b/modules/api/src/main/java/org/apache/ignite/lang/LoggerFactory.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.ignite.internal.lang; +package org.apache.ignite.lang; /** * An interface describing a factory to create a logger instance. diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java index de473ced59..e1b770924c 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java @@ -22,9 +22,9 @@ import java.lang.System.Logger; import java.util.Map; import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; -import org.apache.ignite.internal.lang.LoggerFactory; import org.apache.ignite.internal.logger.IgniteLogger; import org.apache.ignite.internal.logger.Loggers; +import org.apache.ignite.lang.LoggerFactory; import org.apache.ignite.rest.client.invoker.ApiClient; /** diff --git a/modules/client/build.gradle b/modules/client/build.gradle index 6d092bb37b..a1d08a055f 100644 --- a/modules/client/build.gradle +++ b/modules/client/build.gradle @@ -21,7 +21,7 @@ apply from: "$rootDir/buildscripts/java-junit5.gradle" dependencies { api project(':ignite-api') - api project(':ignite-core') + implementation project(':ignite-core') implementation project(':ignite-binary-tuple') implementation project(':ignite-client-common') implementation project(':ignite-marshaller-common') diff --git a/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java b/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java index 9acfe665e2..53ce6488f1 100644 --- a/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java +++ b/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java @@ -34,7 +34,7 @@ import java.util.function.Function; import org.apache.ignite.Ignite; import org.apache.ignite.internal.client.IgniteClientConfigurationImpl; import org.apache.ignite.internal.client.TcpIgniteClient; -import org.apache.ignite.internal.lang.LoggerFactory; +import org.apache.ignite.lang.LoggerFactory; import org.apache.ignite.network.ClusterNode; import org.jetbrains.annotations.Nullable; diff --git a/modules/client/src/main/java/org/apache/ignite/client/IgniteClientConfiguration.java b/modules/client/src/main/java/org/apache/ignite/client/IgniteClientConfiguration.java index 9984785b07..a5f1f242dd 100644 --- a/modules/client/src/main/java/org/apache/ignite/client/IgniteClientConfiguration.java +++ b/modules/client/src/main/java/org/apache/ignite/client/IgniteClientConfiguration.java @@ -20,7 +20,7 @@ package org.apache.ignite.client; import java.util.concurrent.Executor; import java.util.concurrent.ForkJoinPool; import java.util.function.Function; -import org.apache.ignite.internal.lang.LoggerFactory; +import org.apache.ignite.lang.LoggerFactory; import org.jetbrains.annotations.Nullable; /** diff --git a/modules/client/src/main/java/org/apache/ignite/client/IgniteClientFeatureNotSupportedByServerException.java b/modules/client/src/main/java/org/apache/ignite/client/IgniteClientFeatureNotSupportedByServerException.java index b74ca59ea1..bf9b28fe77 100644 --- a/modules/client/src/main/java/org/apache/ignite/client/IgniteClientFeatureNotSupportedByServerException.java +++ b/modules/client/src/main/java/org/apache/ignite/client/IgniteClientFeatureNotSupportedByServerException.java @@ -19,8 +19,8 @@ package org.apache.ignite.client; import static org.apache.ignite.lang.ErrorGroups.Client.PROTOCOL_COMPATIBILITY_ERR; -import org.apache.ignite.internal.client.ProtocolBitmaskFeature; import org.apache.ignite.lang.IgniteException; +import org.jetbrains.annotations.Nullable; /** * Indicates that thin client feature is not supported by the server. @@ -29,22 +29,13 @@ public class IgniteClientFeatureNotSupportedByServerException extends IgniteExce /** Serial version uid. */ private static final long serialVersionUID = 0L; - /** - * Constructs a new exception with the specified detail message. - * - * @param msg the detail message. - */ - public IgniteClientFeatureNotSupportedByServerException(String msg) { - this(msg, null); - } - /** * Constructs a new exception with the specified missing feature. * * @param feature Feature. */ - public IgniteClientFeatureNotSupportedByServerException(ProtocolBitmaskFeature feature) { - this("Feature " + feature.name() + " is not supported by the server"); + public IgniteClientFeatureNotSupportedByServerException(String feature) { + this("Feature " + feature + " is not supported by the server", null); } /** @@ -53,7 +44,7 @@ public class IgniteClientFeatureNotSupportedByServerException extends IgniteExce * @param msg the detail message. * @param cause the cause. */ - public IgniteClientFeatureNotSupportedByServerException(String msg, Throwable cause) { + public IgniteClientFeatureNotSupportedByServerException(String msg, @Nullable Throwable cause) { super(PROTOCOL_COMPATIBILITY_ERR, msg, cause); } } diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java b/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java index b26642e5d1..a4a5594743 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java @@ -22,10 +22,10 @@ import java.util.concurrent.ExecutionException; import org.apache.ignite.client.ClientOperationType; import org.apache.ignite.client.IgniteClientConfiguration; import org.apache.ignite.internal.client.proto.ClientOp; -import org.apache.ignite.internal.lang.LoggerFactory; import org.apache.ignite.internal.logger.IgniteLogger; import org.apache.ignite.internal.logger.Loggers; import org.apache.ignite.internal.util.ExceptionUtils; +import org.apache.ignite.lang.LoggerFactory; /** * Client utilities. diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/IgniteClientConfigurationImpl.java b/modules/client/src/main/java/org/apache/ignite/internal/client/IgniteClientConfigurationImpl.java index 5b185da342..4975c8eae6 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/IgniteClientConfigurationImpl.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/IgniteClientConfigurationImpl.java @@ -23,7 +23,7 @@ import org.apache.ignite.client.IgniteClientAuthenticator; import org.apache.ignite.client.IgniteClientConfiguration; import org.apache.ignite.client.RetryPolicy; import org.apache.ignite.client.SslConfiguration; -import org.apache.ignite.internal.lang.LoggerFactory; +import org.apache.ignite.lang.LoggerFactory; import org.jetbrains.annotations.Nullable; /** diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/ProtocolContext.java b/modules/client/src/main/java/org/apache/ignite/internal/client/ProtocolContext.java index 27af5c3e82..2060916c7c 100644 --- a/modules/client/src/main/java/org/apache/ignite/internal/client/ProtocolContext.java +++ b/modules/client/src/main/java/org/apache/ignite/internal/client/ProtocolContext.java @@ -83,7 +83,7 @@ public class ProtocolContext { */ public void checkFeatureSupported(ProtocolBitmaskFeature feature) throws IgniteClientFeatureNotSupportedByServerException { if (!isFeatureSupported(feature)) { - throw new IgniteClientFeatureNotSupportedByServerException(feature); + throw new IgniteClientFeatureNotSupportedByServerException(feature.name()); } } diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientApiArchTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientApiArchTest.java new file mode 100644 index 0000000000..5bb1186089 --- /dev/null +++ b/modules/client/src/test/java/org/apache/ignite/client/ClientApiArchTest.java @@ -0,0 +1,128 @@ +/* + * 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 org.apache.ignite.client; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Stream; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Checks client API imports. + */ +public class ClientApiArchTest { + @Test + public void testClientApiImportsArePublic() throws IOException { + Path clientApiDir = Path.of( + getRepoRoot(), + "modules", + "client", + "src", + "main", + "java", + "org", + "apache", + "ignite", + "client"); + + var fileCount = new AtomicInteger(); + + try (Stream<Path> walk = Files.walk(clientApiDir)) { + walk.forEach(f -> { + if (Files.isDirectory(f)) { + return; + } + + fileCount.incrementAndGet(); + assertPublicImports( + f, + "internal.client.IgniteClientConfigurationImpl;", + "internal.client.TcpIgniteClient;", + "internal.client.ClientUtils.sync;", + "internal.client.SslConfigurationBuilder;"); + }); + } + + assertThat("No files found in " + clientApiDir, fileCount.get(), greaterThan(0)); + } + + private static void assertPublicImports(Path path, String... excludes) { + if (path.endsWith("package-info.java")) { + return; + } + + List<String> code; + try { + code = Files.readAllLines(path); + } catch (IOException e) { + throw new RuntimeException(e); + } + + assertThat("Code is too short in " + path, code.size(), greaterThan(30)); + int lineNumber = 0; + + for (var line : code) { + lineNumber++; + + if (line.startsWith("import ")) { + boolean excluded = false; + + for (var exclude : excludes) { + if (line.contains(exclude)) { + excluded = true; + break; + } + } + + if (excluded) { + continue; + } + + if (line.contains(".internal.") || line.contains(".impl.")) { + Assertions.fail("Import is not public in " + path + ":" + lineNumber + " (" + line + ")"); + } + + if (line.contains("*")) { + Assertions.fail("Wildcard import is not allowed in " + path + ":" + lineNumber + " (" + line + ")"); + } + } + } + } + + private static String getRepoRoot() { + var currentDir = System.getProperty("user.dir"); + var path = Path.of(currentDir); + + while (path != null) { + if (Files.exists(path.resolve("gradlew.bat"))) { + return path.toString(); + } + + path = path.getParent(); + } + + throw new IllegalStateException("Can't find parent project directory from " + currentDir); + } +} diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientLoggingTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientLoggingTest.java index 2e96aa9d18..a80bf0a79b 100644 --- a/modules/client/src/test/java/org/apache/ignite/client/ClientLoggingTest.java +++ b/modules/client/src/test/java/org/apache/ignite/client/ClientLoggingTest.java @@ -26,9 +26,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import org.apache.ignite.client.fakes.FakeIgnite; import org.apache.ignite.client.fakes.FakeIgniteTables; -import org.apache.ignite.internal.lang.LoggerFactory; import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest; import org.apache.ignite.internal.util.IgniteUtils; +import org.apache.ignite.lang.LoggerFactory; import org.jetbrains.annotations.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; diff --git a/modules/client/src/test/java/org/apache/ignite/client/ConsoleLoggerFactory.java b/modules/client/src/test/java/org/apache/ignite/client/ConsoleLoggerFactory.java index 340437adff..a5d7c91596 100644 --- a/modules/client/src/test/java/org/apache/ignite/client/ConsoleLoggerFactory.java +++ b/modules/client/src/test/java/org/apache/ignite/client/ConsoleLoggerFactory.java @@ -20,7 +20,7 @@ package org.apache.ignite.client; import java.lang.System.Logger; import java.util.ResourceBundle; import java.util.function.Supplier; -import org.apache.ignite.internal.lang.LoggerFactory; +import org.apache.ignite.lang.LoggerFactory; import org.jetbrains.annotations.Nullable; /** diff --git a/modules/client/src/test/java/org/apache/ignite/client/RetryPolicyTest.java b/modules/client/src/test/java/org/apache/ignite/client/RetryPolicyTest.java index df4f418809..6bfeae043e 100644 --- a/modules/client/src/test/java/org/apache/ignite/client/RetryPolicyTest.java +++ b/modules/client/src/test/java/org/apache/ignite/client/RetryPolicyTest.java @@ -33,10 +33,10 @@ import org.apache.ignite.internal.client.ClientUtils; import org.apache.ignite.internal.client.IgniteClientConfigurationImpl; import org.apache.ignite.internal.client.RetryPolicyContextImpl; import org.apache.ignite.internal.client.proto.ClientOp; -import org.apache.ignite.internal.lang.LoggerFactory; import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest; import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.lang.IgniteException; +import org.apache.ignite.lang.LoggerFactory; import org.apache.ignite.table.RecordView; import org.apache.ignite.table.Tuple; import org.apache.ignite.tx.Transaction; diff --git a/modules/client/src/test/java/org/apache/ignite/client/TestLoggerFactory.java b/modules/client/src/test/java/org/apache/ignite/client/TestLoggerFactory.java index fa83a5f071..468aa75562 100644 --- a/modules/client/src/test/java/org/apache/ignite/client/TestLoggerFactory.java +++ b/modules/client/src/test/java/org/apache/ignite/client/TestLoggerFactory.java @@ -24,8 +24,8 @@ import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import java.util.function.Supplier; -import org.apache.ignite.internal.lang.LoggerFactory; import org.apache.ignite.internal.testframework.IgniteTestUtils; +import org.apache.ignite.lang.LoggerFactory; /** * Logger factory for tests. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/logger/Loggers.java b/modules/core/src/main/java/org/apache/ignite/internal/logger/Loggers.java index d0c4947d2e..33e64d839d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/logger/Loggers.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/logger/Loggers.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.logger; import java.util.Objects; -import org.apache.ignite.internal.lang.LoggerFactory; +import org.apache.ignite.lang.LoggerFactory; /** * This class contains different static factory methods to create an instance of logger.