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.

Reply via email to