Skip to content

Commit e491dd5

Browse files
Fix calculation of base package
1 parent a531683 commit e491dd5

File tree

3 files changed

+55
-30
lines changed

3 files changed

+55
-30
lines changed

components/sbm-core/src/main/java/org/springframework/sbm/java/util/BasePackageCalculator.java

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,46 +20,52 @@
2020
import lombok.RequiredArgsConstructor;
2121
import org.springframework.stereotype.Component;
2222

23+
import java.util.List;
2324
import java.util.ArrayList;
2425
import java.util.Comparator;
25-
import java.util.List;
26-
import java.util.Optional;
2726

27+
/**
28+
* Calculates and returns the base package when given a list of JavaSource
29+
*
30+
* @author Soumya Prakash Behera
31+
*/
2832
@Component
2933
@RequiredArgsConstructor
3034
public class BasePackageCalculator {
3135

3236
private final SbmApplicationProperties sbmApplicationProperties;
3337

3438
public String calculateBasePackage(List<JavaSource> javaSources) {
35-
if(javaSources.isEmpty()) return sbmApplicationProperties.getDefaultBasePackage();
39+
if(javaSources.isEmpty()) {
40+
return sbmApplicationProperties.getDefaultBasePackage();
41+
}
42+
43+
if(javaSources.size() == 1) {
44+
return javaSources.get(0).getPackageName();
45+
}
46+
47+
List<String[]> javaSourcesAsStringArray = new ArrayList<>();
48+
49+
for(JavaSource javaSource : javaSources) {
50+
javaSourcesAsStringArray.add(javaSource.getPackageName().split("\\."));
51+
}
52+
53+
javaSourcesAsStringArray.sort(Comparator.comparingInt(str -> str.length));
3654

37-
List<JavaSource> sortableJavaSources = new ArrayList<>();
38-
sortableJavaSources.addAll(javaSources);
39-
javaSources = sortableJavaSources;
40-
javaSources.sort(Comparator.comparing(js -> js.getPackageName().split("\\.").length));
41-
JavaSource javaSourceInBasePackage = javaSources.get(0);
42-
if(javaSources.size() > 1) {
43-
JavaSource shortestPackage = javaSourceInBasePackage;
44-
String shortestPackageName = shortestPackage.getPackageName();
55+
String[] shortestPackage = javaSourcesAsStringArray.get(0);
4556

46-
Optional<JavaSource> javaSourceInDifferentBasePackage = javaSources.stream()
47-
.filter(js -> !js.getPackageName().startsWith(shortestPackageName))
48-
.findFirst();
57+
StringBuilder sb = new StringBuilder();
4958

50-
if(javaSourceInDifferentBasePackage.isPresent()) {
51-
return sbmApplicationProperties.getDefaultBasePackage();
52-
/*
53-
throw new RuntimeException(String.format("Could not calculate base package. Found at least two conflicting candidates: [%s] and [%s] found in these resources [%s] and [%s]",
54-
javaSources.get(0).getPackageName(),
55-
javaSourceInDifferentBasePackage.get().getPackageName(),
56-
javaSources.get(0).getAbsolutePath(),
57-
javaSourceInDifferentBasePackage.get().getAbsolutePath()));
58-
*/
59+
for(int i = 0; i < shortestPackage.length; i++) {
60+
for (String[] strArray : javaSourcesAsStringArray) {
61+
if(!strArray[i].equals(shortestPackage[i])) {
62+
return sb.isEmpty() ? "" : sb.substring(1);
63+
}
5964
}
65+
sb.append(".").append(shortestPackage[i]);
6066
}
6167

62-
return javaSourceInBasePackage.getPackageName();
68+
return String.join(".", shortestPackage);
6369
}
6470

6571
}

components/sbm-core/src/test/java/org/springframework/sbm/build/impl/JavaSourceSetImplTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void getBasePackageShouldReturnDefaultIfNoDistinctRootPackageExists() {
7878
.getMainJavaSourceSet();
7979

8080
JavaSourceLocation location = sut.getJavaSourceLocation();
81-
assertThat(location.getPackageName()).isEqualTo(sbmApplicationProperties.getDefaultBasePackage());
81+
assertThat(location.getPackageName()).isEqualTo("org.springframework.sbm");
8282
assertThat(location.getSourceFolder()).isEqualTo(TestProjectContext.getDefaultProjectRoot().resolve("src/main/java"));
8383
}
8484

@@ -104,7 +104,7 @@ void testGetBasePackageShouldConsiderLevelNotLength() {
104104
.getMainJavaSourceSet();
105105

106106
JavaSourceLocation location = sut.getJavaSourceLocation();
107-
assertThat(location.getPackageName()).isEqualTo(sbmApplicationProperties.getDefaultBasePackage());
107+
assertThat(location.getPackageName()).isEqualTo("org.springframework");
108108
}
109109

110110
@Test

components/sbm-core/src/test/java/org/springframework/sbm/java/util/BasePackageCalculatorTest.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void calculateBasePackageWithTwoAmbiguousPackages() {
6262

6363
List<JavaSource> javaSources = getJavaSources(package1, package2, package3);
6464

65-
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo(DEFAULT_PACKAGENAME);
65+
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo("");
6666
}
6767

6868
@Test
@@ -83,10 +83,29 @@ void calculateBasePackageWithOneBasePackage2() {
8383
String package1 = "com.example.foo";
8484
String package2 = "com.example.foo";
8585
String package3 = "com.example.bar";
86-
8786
List<JavaSource> javaSources = getJavaSources(package1, package2, package3);
8887

89-
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo(DEFAULT_PACKAGENAME);
88+
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo("com.example");
89+
}
90+
91+
@Test
92+
void calculateBasePackageWithOneBasePackage3() {
93+
String package1 = "com.acme.some.A.C";
94+
String package2 = "com.acme.other.B";
95+
96+
List<JavaSource> javaSources = getJavaSources(package1, package2);
97+
98+
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo("com.acme");
99+
}
100+
101+
@Test
102+
void calculateBasePackageWithSameBasePackages() {
103+
String package1 = "com.acme.some.B";
104+
String package2 = "com.acme.some.B";
105+
106+
List<JavaSource> javaSources = getJavaSources(package1, package2);
107+
108+
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo("com.acme.some.B");
90109
}
91110

92111
@Test
@@ -104,7 +123,7 @@ void calculateBasePackageWithAmbiguousBasePackage() {
104123
List<JavaSource> javaSources = getJavaSources(package1, package2, package3);
105124

106125
Path curDir = Path.of(".").toAbsolutePath().normalize();
107-
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo(DEFAULT_PACKAGENAME);
126+
assertThat(sut.calculateBasePackage(javaSources)).isEqualTo("com.example");
108127
}
109128

110129
@NotNull

0 commit comments

Comments
 (0)