diff --git a/pom.xml b/pom.xml
index 290b060218..0fe48e8fdd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-relational-parent
- 3.0.0-SNAPSHOT
+ 3.0.0-1058-archunit-SNAPSHOT
pom
Spring Data Relational Parent
diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml
index db3b7ddd1a..c7518bc76b 100644
--- a/spring-data-jdbc-distribution/pom.xml
+++ b/spring-data-jdbc-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-relational-parent
- 3.0.0-SNAPSHOT
+ 3.0.0-1058-archunit-SNAPSHOT
../pom.xml
diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml
index 55d2b7952b..a494f56dc2 100644
--- a/spring-data-jdbc/pom.xml
+++ b/spring-data-jdbc/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-jdbc
- 3.0.0-SNAPSHOT
+ 3.0.0-1058-archunit-SNAPSHOT
Spring Data JDBC
Spring Data module for JDBC repositories.
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-relational-parent
- 3.0.0-SNAPSHOT
+ 3.0.0-1058-archunit-SNAPSHOT
@@ -207,14 +207,6 @@
test
-
-
- de.schauderhaft.degraph
- degraph-check
- ${degraph-check.version}
- test
-
-
org.testcontainers
mysql
@@ -264,6 +256,13 @@
test
+
+ com.tngtech.archunit
+ archunit
+ 0.22.0
+ test
+
+
diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultJdbcTypeFactory.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultJdbcTypeFactory.java
index c70287d1ba..f29d9947a5 100644
--- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultJdbcTypeFactory.java
+++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultJdbcTypeFactory.java
@@ -18,7 +18,6 @@
import java.sql.Array;
import java.sql.JDBCType;
-import org.springframework.data.jdbc.core.dialect.JdbcArrayColumns;
import org.springframework.data.jdbc.support.JdbcUtil;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.JdbcOperations;
diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcArrayColumns.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcArrayColumns.java
similarity index 98%
rename from spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcArrayColumns.java
rename to spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcArrayColumns.java
index 63919dcd2d..fe03c15914 100644
--- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcArrayColumns.java
+++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/JdbcArrayColumns.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.data.jdbc.core.dialect;
+package org.springframework.data.jdbc.core.convert;
import java.sql.SQLType;
diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcDialect.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcDialect.java
index 0dc94d9aaf..2d40db0289 100644
--- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcDialect.java
+++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcDialect.java
@@ -15,6 +15,7 @@
*/
package org.springframework.data.jdbc.core.dialect;
+import org.springframework.data.jdbc.core.convert.JdbcArrayColumns;
import org.springframework.data.relational.core.dialect.Dialect;
/**
diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcPostgresDialect.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcPostgresDialect.java
index 6c7bc82945..c5e97cf9ef 100644
--- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcPostgresDialect.java
+++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/dialect/JdbcPostgresDialect.java
@@ -18,6 +18,7 @@
import java.sql.JDBCType;
import java.sql.SQLType;
+import org.springframework.data.jdbc.core.convert.JdbcArrayColumns;
import org.springframework.data.relational.core.dialect.PostgresDialect;
/**
diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.java
index 13ca2e865f..3c2fda3588 100644
--- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.java
+++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.java
@@ -42,7 +42,7 @@
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.core.convert.RelationResolver;
import org.springframework.data.jdbc.core.convert.SqlGeneratorSource;
-import org.springframework.data.jdbc.core.dialect.JdbcArrayColumns;
+import org.springframework.data.jdbc.core.convert.JdbcArrayColumns;
import org.springframework.data.jdbc.core.dialect.JdbcDialect;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.jdbc.core.mapping.JdbcSimpleTypes;
diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcAuditingRegistrar.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcAuditingRegistrar.java
index 0ceb8662c2..4e75b6d7f7 100644
--- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcAuditingRegistrar.java
+++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcAuditingRegistrar.java
@@ -24,7 +24,7 @@
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
import org.springframework.data.auditing.config.AuditingConfiguration;
-import org.springframework.data.relational.core.mapping.event.RelationalAuditingCallback;
+import org.springframework.data.relational.auditing.RelationalAuditingCallback;
import org.springframework.data.repository.config.PersistentEntitiesFactoryBean;
import org.springframework.util.Assert;
diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/DependencyTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/DependencyTests.java
new file mode 100644
index 0000000000..48f60f7f45
--- /dev/null
+++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/DependencyTests.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2017-2021 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
+ *
+ * https://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.springframework.data.jdbc;
+
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.data.auditing.config.AuditingHandlerBeanDefinitionParser;
+
+import com.tngtech.archunit.base.DescribedPredicate;
+import com.tngtech.archunit.core.domain.JavaClass;
+import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.importer.ClassFileImporter;
+import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.lang.ArchRule;
+import com.tngtech.archunit.library.dependencies.SliceAssignment;
+import com.tngtech.archunit.library.dependencies.SliceIdentifier;
+import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition;
+
+/**
+ * Test package dependencies for violations.
+ *
+ * @author Jens Schauder
+ */
+public class DependencyTests {
+
+ @Test
+ void cycleFree() {
+
+ JavaClasses importedClasses = new ClassFileImporter() //
+ .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) //
+ .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_JARS) // we just analyze the code of this module.
+ .importPackages("org.springframework.data.jdbc");
+
+ final JavaClasses relevantClasses = importedClasses.that( //
+ onlySpringData() //
+ );
+
+ ArchRule rule = SlicesRuleDefinition.slices() //
+ .matching("org.springframework.data.jdbc.(**)") //
+ .should() //
+ .beFreeOfCycles();
+
+ rule.check(relevantClasses);
+ }
+
+ @Test
+ void acrossModules() {
+
+ JavaClasses importedClasses = new ClassFileImporter().withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
+ .importPackages( //
+ "org.springframework.data.jdbc", // Spring Data Relational
+ "org.springframework.data.relational", // Spring Data Relational
+ "org.springframework.data" // Spring Data Commons
+ ).that(onlySpringData() //
+ .and(ignore(AuditingHandlerBeanDefinitionParser.class)));
+
+ ArchRule rule = SlicesRuleDefinition.slices() //
+ .assignedFrom(subModuleSlicing()) //
+ .should().beFreeOfCycles();
+
+ rule.check(importedClasses);
+ }
+
+ @Test // GH-1058
+ void testGetFirstPackagePart() {
+
+ SoftAssertions.assertSoftly(softly -> {
+ softly.assertThat(getFirstPackagePart("a.b.c")).isEqualTo("a");
+ softly.assertThat(getFirstPackagePart("a")).isEqualTo("a");
+ });
+ }
+
+ @Test // GH-1058
+ void testSubModule() {
+
+ SoftAssertions.assertSoftly(softly -> {
+ softly.assertThat(subModule("a.b", "a.b.c.d")).isEqualTo("c");
+ softly.assertThat(subModule("a.b", "a.b.c")).isEqualTo("c");
+ softly.assertThat(subModule("a.b", "a.b")).isEqualTo("");
+ });
+ }
+
+ private DescribedPredicate onlySpringData() {
+
+ return new DescribedPredicate<>("Spring Data Classes") {
+ @Override
+ public boolean apply(JavaClass input) {
+
+ return input.getPackageName().startsWith("org.springframework.data");
+ }
+ };
+ }
+
+ private DescribedPredicate ignore(Class> type) {
+
+ return new DescribedPredicate<>("ignored class " + type.getName()) {
+ @Override
+ public boolean apply(JavaClass input) {
+ return !input.getFullName().startsWith(type.getName());
+ }
+ };
+ }
+
+ private String getFirstPackagePart(String subpackage) {
+
+ int index = subpackage.indexOf(".");
+ if (index < 0) {
+ return subpackage;
+ }
+ return subpackage.substring(0, index);
+ }
+
+ private String subModule(String basePackage, String packageName) {
+
+ if (packageName.startsWith(basePackage) && packageName.length() > basePackage.length()) {
+ final int index = basePackage.length() + 1;
+ String subpackage = packageName.substring(index);
+ return getFirstPackagePart(subpackage);
+ }
+ return "";
+ }
+
+ private SliceAssignment subModuleSlicing() {
+ return new SliceAssignment() {
+
+ @Override
+ public SliceIdentifier getIdentifierOf(JavaClass javaClass) {
+
+ String packageName = javaClass.getPackageName();
+
+ String subModule = subModule("org.springframework.data.jdbc", packageName);
+ if (!subModule.isEmpty()) {
+ return SliceIdentifier.of(subModule);
+ }
+
+ subModule = subModule("org.springframework.data.relational", packageName);
+ if (!subModule.isEmpty()) {
+ return SliceIdentifier.of(subModule);
+ }
+
+ subModule = subModule("org.springframework.data", packageName);
+ if (!subModule.isEmpty()) {
+ return SliceIdentifier.of(subModule);
+ }
+
+ return SliceIdentifier.ignore();
+ }
+
+ @Override
+ public String getDescription() {
+ return "Submodule";
+ }
+ };
+ }
+
+}
diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/degraph/DependencyTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/degraph/DependencyTests.java
deleted file mode 100644
index 22cd930577..0000000000
--- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/degraph/DependencyTests.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2017-2021 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
- *
- * https://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.springframework.data.jdbc.degraph;
-
-import static de.schauderhaft.degraph.check.JCheck.*;
-import static org.hamcrest.MatcherAssert.*;
-
-import de.schauderhaft.degraph.check.JCheck;
-import scala.runtime.AbstractFunction1;
-
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-/**
- * Test package dependencies for violations.
- *
- * @author Jens Schauder
- */
-@Disabled("org.springframework.data.jdbc.core.dialect.** needs rework")
-public class DependencyTests {
-
- @Test // DATAJDBC-114
- @Disabled // Replace by ArchUnit test
- public void cycleFree() {
-
- assertThat( //
- classpath() //
- .noJars() //
- .including("org.springframework.data.jdbc.**") //
- .filterClasspath("*target/classes") // exclude test code
- .printOnFailure("degraph-jdbc.graphml"),
- JCheck.violationFree());
- }
-
- @Test // DATAJDBC-220
- @Disabled // Replace by ArchUnit test
- public void acrossModules() {
-
- assertThat( //
- classpath() //
- // include only Spring Data related classes (for example no JDK code)
- .including("org.springframework.data.**") //
- .filterClasspath(new AbstractFunction1() {
- @Override
- public Object apply(String s) { //
- // only the current module + commons
- return s.endsWith("target/classes") || s.contains("spring-data-commons");
- }
- }) // exclude test code
- .withSlicing("sub-modules", // sub-modules are defined by any of the following pattern.
- "org.springframework.data.jdbc.(*).**", //
- "org.springframework.data.relational.(*).**", //
- "org.springframework.data.(*).**") //
- .printTo("degraph-across-modules.graphml"), // writes a graphml to this location
- JCheck.violationFree());
- }
-}
diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestConfiguration.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestConfiguration.java
index c1804f217c..645db5b3da 100644
--- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestConfiguration.java
+++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/TestConfiguration.java
@@ -41,7 +41,7 @@
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.core.convert.RelationResolver;
import org.springframework.data.jdbc.core.convert.SqlGeneratorSource;
-import org.springframework.data.jdbc.core.dialect.JdbcArrayColumns;
+import org.springframework.data.jdbc.core.convert.JdbcArrayColumns;
import org.springframework.data.jdbc.core.dialect.JdbcDialect;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.jdbc.core.mapping.JdbcSimpleTypes;
diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml
index 7f1b64beaf..bc8cec1b56 100644
--- a/spring-data-relational/pom.xml
+++ b/spring-data-relational/pom.xml
@@ -6,7 +6,7 @@
4.0.0
spring-data-relational
- 3.0.0-SNAPSHOT
+ 3.0.0-1058-archunit-SNAPSHOT
Spring Data Relational
Spring Data Relational support
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-relational-parent
- 3.0.0-SNAPSHOT
+ 3.0.0-1058-archunit-SNAPSHOT
@@ -65,9 +65,9 @@
- de.schauderhaft.degraph
- degraph-check
- ${degraph-check.version}
+ com.tngtech.archunit
+ archunit
+ 0.22.0
test
diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/RelationalAuditingCallback.java b/spring-data-relational/src/main/java/org/springframework/data/relational/auditing/RelationalAuditingCallback.java
similarity index 93%
rename from spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/RelationalAuditingCallback.java
rename to spring-data-relational/src/main/java/org/springframework/data/relational/auditing/RelationalAuditingCallback.java
index 6dd04acbb8..27cb376a8e 100644
--- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/mapping/event/RelationalAuditingCallback.java
+++ b/spring-data-relational/src/main/java/org/springframework/data/relational/auditing/RelationalAuditingCallback.java
@@ -13,11 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springframework.data.relational.core.mapping.event;
+package org.springframework.data.relational.auditing;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
+import org.springframework.data.relational.core.mapping.event.BeforeConvertCallback;
import org.springframework.util.Assert;
/**
diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/DependencyTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/DependencyTests.java
new file mode 100644
index 0000000000..0d269200f3
--- /dev/null
+++ b/spring-data-relational/src/test/java/org/springframework/data/relational/DependencyTests.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2017-2021 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
+ *
+ * https://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.springframework.data.relational;
+
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.data.relational.core.dialect.RenderContextFactory;
+import org.springframework.data.relational.core.sql.render.SelectRenderContext;
+
+import com.tngtech.archunit.base.DescribedPredicate;
+import com.tngtech.archunit.core.domain.JavaClass;
+import com.tngtech.archunit.core.domain.JavaClasses;
+import com.tngtech.archunit.core.importer.ClassFileImporter;
+import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.lang.ArchRule;
+import com.tngtech.archunit.library.dependencies.SliceAssignment;
+import com.tngtech.archunit.library.dependencies.SliceIdentifier;
+import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition;
+
+/**
+ * Test package dependencies for violations.
+ *
+ * @author Jens Schauder
+ * @author Mark Paluch
+ */
+public class DependencyTests {
+
+ @Test
+ void cycleFree() {
+
+ JavaClasses importedClasses = new ClassFileImporter() //
+ .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) //
+ .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_JARS) // we just analyze the code of this module.
+ .importPackages("org.springframework.data.relational")
+ .that( //
+ onlySpringData() //
+ .and(ignore(SelectRenderContext.class)) //
+ .and(ignore(RenderContextFactory.class)) //
+ );
+
+ ArchRule rule = SlicesRuleDefinition.slices() //
+ .matching("org.springframework.data.relational.(**)") //
+ .should() //
+ .beFreeOfCycles();
+
+ rule.check(importedClasses);
+ }
+
+ @Test
+ void acrossModules() {
+
+ JavaClasses importedClasses = new ClassFileImporter().withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
+ .importPackages( //
+ "org.springframework.data.relational", // Spring Data Relational
+ "org.springframework.data" // Spring Data Commons
+ );
+
+ final JavaClasses relevantClasses = importedClasses.that(onlySpringData());
+
+ ArchRule rule = SlicesRuleDefinition.slices() //
+ .assignedFrom(subModuleSlicing()) //
+ .should().beFreeOfCycles();
+
+ rule.check(relevantClasses);
+ }
+
+ @Test // GH-1058
+ void testGetFirstPackagePart() {
+
+ SoftAssertions.assertSoftly(softly -> {
+ softly.assertThat(getFirstPackagePart("a.b.c")).isEqualTo("a");
+ softly.assertThat(getFirstPackagePart("a")).isEqualTo("a");
+ });
+ }
+
+ @Test // GH-1058
+ void testSubModule() {
+
+ SoftAssertions.assertSoftly(softly -> {
+ softly.assertThat(subModule("a.b", "a.b.c.d")).isEqualTo("c");
+ softly.assertThat(subModule("a.b", "a.b.c")).isEqualTo("c");
+ softly.assertThat(subModule("a.b", "a.b")).isEqualTo("");
+ });
+ }
+
+ private DescribedPredicate onlySpringData() {
+
+ return new DescribedPredicate<>("Spring Data Classes") {
+ @Override
+ public boolean apply(JavaClass input) {
+
+ return input.getPackageName().startsWith("org.springframework.data");
+ }
+ };
+ }
+
+ private DescribedPredicate ignore(Class> type) {
+
+ return new DescribedPredicate<>("ignored class " + type.getName()) {
+ @Override
+ public boolean apply(JavaClass input) {
+ return !input.getFullName().startsWith(type.getName());
+ }
+ };
+ }
+
+ private String getFirstPackagePart(String subpackage) {
+
+ int index = subpackage.indexOf(".");
+ if (index < 0) {
+ return subpackage;
+ }
+ return subpackage.substring(0, index);
+ }
+
+ private String subModule(String basePackage, String packageName) {
+
+ if (packageName.startsWith(basePackage) && packageName.length() > basePackage.length()) {
+ final int index = basePackage.length() + 1;
+ String subpackage = packageName.substring(index);
+ return getFirstPackagePart(subpackage);
+ }
+ return "";
+ }
+
+ private SliceAssignment subModuleSlicing() {
+ return new SliceAssignment() {
+
+ @Override
+ public SliceIdentifier getIdentifierOf(JavaClass javaClass) {
+
+ String packageName = javaClass.getPackageName();
+ String subModule = subModule("org.springframework.data.relational", packageName);
+ if (!subModule.isEmpty()) {
+ return SliceIdentifier.of(subModule);
+ }
+ subModule = subModule("org.springframework.data", packageName);
+ if (!subModule.isEmpty()) {
+ return SliceIdentifier.of(subModule);
+ }
+ return SliceIdentifier.ignore();
+ }
+
+ @Override
+ public String getDescription() {
+ return "Submodule";
+ }
+ };
+ }
+}
diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java
deleted file mode 100644
index 5c1ca46b1a..0000000000
--- a/spring-data-relational/src/test/java/org/springframework/data/relational/degraph/DependencyTests.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2017-2021 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
- *
- * https://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.springframework.data.relational.degraph;
-
-import static de.schauderhaft.degraph.check.JCheck.*;
-import static org.hamcrest.MatcherAssert.*;
-
-import de.schauderhaft.degraph.check.JCheck;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import scala.runtime.AbstractFunction1;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.data.relational.core.dialect.RenderContextFactory;
-import org.springframework.data.relational.core.sql.render.SelectRenderContext;
-
-/**
- * Test package dependencies for violations.
- *
- * @author Jens Schauder
- * @author Mark Paluch
- */
-public class DependencyTests {
-
- @Test // DATAJDBC-114
- @Disabled // Replace by ArchUnit test
- public void cycleFree() {
-
- assertThat( //
- classpath() //
- .noJars() //
- .including("org.springframework.data.relational.**") //
- .excluding(SelectRenderContext.class.getName()) //
- .excluding(RenderContextFactory.class.getName() + "*") //
- .filterClasspath("*target/classes") // exclude test code
- .printOnFailure("degraph-relational.graphml"),
- JCheck.violationFree());
- }
-
- @Test // DATAJDBC-220
- @Disabled // Replace by ArchUnit test
- public void acrossModules() {
-
- assertThat( //
- classpath() //
- // include only Spring Data related classes (for example no JDK code)
- .including("org.springframework.data.**") //
- .excluding("org.springframework.data.relational.core.sql.**") //
- .excluding("org.springframework.data.repository.query.parser.**") //
- .filterClasspath(new AbstractFunction1() {
- @Override
- public Object apply(String s) { //
- // only the current module + commons
- return s.endsWith("target/classes") || s.contains("spring-data-commons");
- }
- }) // exclude test code
- .withSlicing("sub-modules", // sub-modules are defined by any of the following pattern.
- "org.springframework.data.relational.(**).*", //
- "org.springframework.data.(**).*") //
- .printTo("degraph-across-modules.graphml"), // writes a graphml to this location
- JCheck.violationFree());
- }
-}