Skip to content

Commit 03dba69

Browse files
[59] Fix content package dependency rewriting when auto-dependencies-mode is OFF (#67)
Co-authored-by: Christoph Nagel <christoph.nagel@diva-e.com> Co-authored-by: Stefan Seifert <stefanseifert@users.noreply.github.com>
1 parent b1af0e2 commit 03dba69

File tree

4 files changed

+86
-17
lines changed

4 files changed

+86
-17
lines changed

changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
<action type="update" dev="sseifert">
3131
Eliminate usage of Guava.
3232
</action>
33+
<action type="fix" dev="cnagel" issue="59">
34+
conga-aem-maven-plugin: Fix content package dependency rewriting when autoDependenciesMode=OFF.
35+
</action>
3336
</release>
3437

3538
<release version="2.19.4" date="2023-03-27">

tooling/conga-aem-maven-plugin/src/main/java/io/wcm/devops/conga/plugins/aem/maven/allpackage/AllPackageBuilder.java

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.HashSet;
4444
import java.util.List;
4545
import java.util.Map;
46+
import java.util.Optional;
4647
import java.util.Properties;
4748
import java.util.Set;
4849
import java.util.stream.Collectors;
@@ -598,7 +599,7 @@ private List<TemporaryContentPackageFile> processContentPackage(ContentPackageFi
598599
if (autoDependenciesMode == AutoDependenciesMode.OFF) {
599600
dependencyFile = null;
600601
}
601-
updateDependencies(props, dependencyFile, environmentRunMode, allPackagesFromFileSets);
602+
updateDependencies(pkg, props, dependencyFile, environmentRunMode, allPackagesFromFileSets);
602603

603604
// if package type is missing in package properties, put in the type defined in model
604605
String packageType = pkg.getPackageType();
@@ -678,28 +679,27 @@ else if (in.getLastModifiedTime() != null) {
678679

679680
/**
680681
* Add dependency information to dependencies string in properties (if it does not exist already).
682+
* @param pkg Current content package
681683
* @param props Properties
682684
* @param dependencyFile Dependency package
683685
* @param allPackagesFromFileSets Set with all packages from all file sets as dependency instances
684686
*/
685-
private void updateDependencies(Properties props, ContentPackageFile dependencyFile, String environmentRunMode,
686-
Set<Dependency> allPackagesFromFileSets) {
687+
private void updateDependencies(ContentPackageFile pkg, Properties props, ContentPackageFile dependencyFile,
688+
String environmentRunMode, Set<Dependency> allPackagesFromFileSets) {
687689
String[] existingDepsStrings = StringUtils.split(props.getProperty(NAME_DEPENDENCIES), ",");
688690
Dependency[] existingDeps = null;
689691
if (existingDepsStrings != null && existingDepsStrings.length > 0) {
690692
existingDeps = Dependency.fromString(existingDepsStrings);
691693
}
692694
if (existingDeps != null) {
693-
existingDeps = removeReferencesToManagedPackages(existingDeps, allPackagesFromFileSets);
695+
existingDeps = autoDependenciesMode == AutoDependenciesMode.OFF
696+
? rewriteReferencesToManagedPackages(pkg, environmentRunMode, allPackagesFromFileSets, existingDeps)
697+
: removeReferencesToManagedPackages(existingDeps, allPackagesFromFileSets);
694698
}
695699

696700
Dependency[] deps;
697701
if (dependencyFile != null) {
698-
String runModeSuffix = buildRunModeSuffix(dependencyFile, environmentRunMode);
699-
String dependencyVersion = dependencyFile.getVersion() + buildVersionSuffix(dependencyFile, true);
700-
Dependency newDependency = new Dependency(dependencyFile.getGroup(),
701-
dependencyFile.getName() + runModeSuffix,
702-
VersionRange.fromString(dependencyVersion));
702+
Dependency newDependency = createDependencyFromContentPackageFile(dependencyFile, environmentRunMode);
703703
deps = addDependency(existingDeps, newDependency);
704704
}
705705
else {
@@ -712,6 +712,15 @@ private void updateDependencies(Properties props, ContentPackageFile dependencyF
712712
}
713713
}
714714

715+
private @NotNull Dependency createDependencyFromContentPackageFile(@NotNull ContentPackageFile dependencyFile,
716+
@NotNull String environmentRunMode) {
717+
String runModeSuffix = buildRunModeSuffix(dependencyFile, environmentRunMode);
718+
String dependencyVersion = dependencyFile.getVersion() + buildVersionSuffix(dependencyFile, true);
719+
return new Dependency(dependencyFile.getGroup(),
720+
dependencyFile.getName() + runModeSuffix,
721+
VersionRange.fromString(dependencyVersion));
722+
}
723+
715724
private static Dependency[] addDependency(Dependency[] existingDeps, Dependency newDependency) {
716725
if (existingDeps != null) {
717726
return DependencyUtil.add(existingDeps, newDependency);
@@ -736,6 +745,55 @@ private void addSuffixToVersion(Properties props, ContentPackageFile pkg) {
736745
props.put(NAME_VERSION, suffixedVersion);
737746
}
738747

748+
private @NotNull Dependency[] rewriteReferencesToManagedPackages(@NotNull ContentPackageFile pkg,
749+
@NotNull String environmentRunMode, @NotNull Set<Dependency> allPackagesFromFileSets, @NotNull Dependency[] deps) {
750+
return Arrays.stream(deps)
751+
.map(dep -> rewriteReferenceIfDependencyIsManagedPackage(pkg, environmentRunMode, allPackagesFromFileSets, dep))
752+
.toArray(Dependency[]::new);
753+
}
754+
755+
private @NotNull Dependency rewriteReferenceIfDependencyIsManagedPackage(@NotNull ContentPackageFile pkg,
756+
@NotNull String environmentRunMode, @NotNull Set<Dependency> allPackagesFromFileSets, @NotNull Dependency dep) {
757+
// not a managed package, return as is
758+
if (!allPackagesFromFileSets.contains(dep)) {
759+
return dep;
760+
}
761+
return findContentPackageFileForDependency(pkg, dep)
762+
// found a content package file for the dependency, rewrite the dependency
763+
.map(contentPackageFile -> createDependencyFromContentPackageFile(contentPackageFile, environmentRunMode))
764+
// found no content package file for the dependency, use current run mode suffix
765+
.orElseGet(() -> createDependencyWithCurrentPackageRunModeSuffix(pkg, environmentRunMode, dep));
766+
}
767+
768+
private @NotNull Optional<ContentPackageFile> findContentPackageFileForDependency(@NotNull ContentPackageFile pkg,
769+
@NotNull Dependency dep) {
770+
// look for content package in all file sets
771+
return contentPackageFileSets.stream()
772+
// prefer file set which contains the current package to use current run mode
773+
.sorted((fileSet1, fileSet2) -> sortFileSetsContainingPackageFirst(pkg, fileSet1, fileSet2))
774+
.flatMap(fileSet -> fileSet.getFiles().stream())
775+
.filter(contentPackageFile -> isContentPackageForDependency(contentPackageFile, dep))
776+
.findFirst();
777+
}
778+
779+
private int sortFileSetsContainingPackageFirst(@NotNull ContentPackageFile pkg,
780+
@NotNull ContentPackageFileSet fileSet1, @NotNull ContentPackageFileSet fileSet2) {
781+
int fileSet1ContainsPackage = fileSet1.getFiles().contains(pkg) ? 1 : 0;
782+
int fileSet2ContainsPackage = fileSet2.getFiles().contains(pkg) ? 1 : 0;
783+
return fileSet2ContainsPackage - fileSet1ContainsPackage;
784+
}
785+
786+
private boolean isContentPackageForDependency(@NotNull ContentPackageFile contentPackageFile, @NotNull Dependency dep) {
787+
return contentPackageFile.getGroup().equals(dep.getGroup())
788+
&& contentPackageFile.getName().equals(dep.getName());
789+
}
790+
791+
private @NotNull Dependency createDependencyWithCurrentPackageRunModeSuffix(@NotNull ContentPackageFile pkg,
792+
@NotNull String environmentRunMode, @NotNull Dependency dep) {
793+
String runModeSuffix = buildRunModeSuffix(pkg, environmentRunMode);
794+
return new Dependency(dep.getGroup(), dep.getName() + runModeSuffix, dep.getRange());
795+
}
796+
739797
/**
740798
* Removes existing references to packages contained in the list of packages to manage by this builder because
741799
* they are added new (and probably with a different package name) during processing.

tooling/conga-aem-maven-plugin/src/test/java/io/wcm/devops/conga/plugins/aem/maven/allpackage/AllPackageBuilderAuthorPublishTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ void testBuild_AUTODEPENDENCIES_OFF_RUNMODEOPTIMIZATION_OFF() throws Exception {
8585
contentPackage("accesscontroltool-oakindex-package{runmode}", "3.0.0"),
8686
contentPackage("core.wcm.components.content{runmode}", "2.17.0",
8787
dep("day/cq60/product:cq-platform-content:1.3.248")),
88-
contentPackage("core.wcm.components.extensions.amp.content{runmode}", "2.17.0"),
88+
contentPackage("core.wcm.components.extensions.amp.content{runmode}", "2.17.0",
89+
dep("adobe/cq60:core.wcm.components.content{runmode}:2.17.0")),
8990
contentPackage("acs-aem-commons-ui.apps{runmode}", "4.10.0",
9091
dep("day/cq60/product:cq-content:6.3.64")),
9192
contentPackage("aem-cms-system-config{runmode}",
@@ -97,7 +98,8 @@ void testBuild_AUTODEPENDENCIES_OFF_RUNMODEOPTIMIZATION_OFF() throws Exception {
9798
assertFiles(applicationInstallDirPublish, ".publish",
9899
contentPackage("core.wcm.components.content{runmode}", "2.17.0",
99100
dep("day/cq60/product:cq-platform-content:1.3.248")),
100-
contentPackage("core.wcm.components.extensions.amp.content{runmode}", "2.17.0"),
101+
contentPackage("core.wcm.components.extensions.amp.content{runmode}", "2.17.0",
102+
dep("adobe/cq60:core.wcm.components.content{runmode}:2.17.0")),
101103
contentPackage("acs-aem-commons-ui.apps{runmode}", "4.10.0",
102104
dep("day/cq60/product:cq-content:6.3.64")),
103105
contentPackage("aem-cms-system-config{runmode}",
@@ -110,12 +112,14 @@ void testBuild_AUTODEPENDENCIES_OFF_RUNMODEOPTIMIZATION_OFF() throws Exception {
110112

111113
File contentInstallDirAuthor = new File(contentDir, "install.author");
112114
assertFiles(contentInstallDirAuthor, ".author",
113-
contentPackage("acs-aem-commons-ui.content{runmode}", "4.10.0"),
115+
contentPackage("acs-aem-commons-ui.content{runmode}", "4.10.0",
116+
dep("adobe/consulting:acs-aem-commons-ui.apps{runmode}:4.10.0")),
114117
contentPackage("aem-cms-author-replicationagents{runmode}"),
115118
contentPackage("wcm-io-samples-sample-content{runmode}", "1.3.1-SNAPSHOT"));
116119
File contentInstallDirPublish = new File(contentDir, "install.publish");
117120
assertFiles(contentInstallDirPublish, ".publish",
118-
contentPackage("acs-aem-commons-ui.content{runmode}", "4.10.0"),
121+
contentPackage("acs-aem-commons-ui.content{runmode}", "4.10.0",
122+
dep("adobe/consulting:acs-aem-commons-ui.apps{runmode}:4.10.0")),
119123
contentPackage("wcm-io-samples-sample-content{runmode}", "1.3.1-SNAPSHOT"),
120124
contentPackage("aem-cms-publish-sling-mapping{runmode}"));
121125

@@ -161,7 +165,8 @@ void testBuild_AUTODEPENDENCIES_OFF() throws Exception {
161165
assertFiles(applicationInstallDir, "",
162166
contentPackage("core.wcm.components.content", "2.17.0",
163167
dep("day/cq60/product:cq-platform-content:1.3.248")),
164-
contentPackage("core.wcm.components.extensions.amp.content", "2.17.0"),
168+
contentPackage("core.wcm.components.extensions.amp.content", "2.17.0",
169+
dep("adobe/cq60:core.wcm.components.content:2.17.0")),
165170
contentPackage("acs-aem-commons-ui.apps", "4.10.0",
166171
dep("day/cq60/product:cq-content:6.3.64")),
167172
contentPackage("aem-cms-system-config",
@@ -179,7 +184,8 @@ void testBuild_AUTODEPENDENCIES_OFF() throws Exception {
179184

180185
File contentInstallDir = new File(contentDir, "install");
181186
assertFiles(contentInstallDir, "",
182-
contentPackage("acs-aem-commons-ui.content", "4.10.0"),
187+
contentPackage("acs-aem-commons-ui.content", "4.10.0",
188+
dep("adobe/consulting:acs-aem-commons-ui.apps:4.10.0")),
183189
contentPackage("wcm-io-samples-sample-content", "1.3.1-SNAPSHOT"));
184190
File contentInstallDirAuthor = new File(contentDir, "install.author");
185191
assertFiles(contentInstallDirAuthor, ".author",

tooling/conga-aem-maven-plugin/src/test/java/io/wcm/devops/conga/plugins/aem/maven/allpackage/AllPackageBuilderTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ void testBuild_AUTODEPENDENCIES_OFF(Set<String> cloudManagerTarget, List<String>
9696
contentPackage("accesscontroltool-oakindex-package{runmode}", "3.0.0"),
9797
contentPackage("core.wcm.components.content{runmode}", "2.17.0",
9898
dep("day/cq60/product:cq-platform-content:1.3.248")),
99-
contentPackage("core.wcm.components.extensions.amp.content{runmode}", "2.17.0"),
99+
contentPackage("core.wcm.components.extensions.amp.content{runmode}", "2.17.0",
100+
dep("adobe/cq60:core.wcm.components.content{runmode}:2.17.0")),
100101
contentPackage("acs-aem-commons-ui.apps{runmode}", "4.10.0",
101102
dep("day/cq60/product:cq-content:6.3.64")),
102103
contentPackage("aem-cms-system-config{runmode}",
@@ -112,7 +113,8 @@ void testBuild_AUTODEPENDENCIES_OFF(Set<String> cloudManagerTarget, List<String>
112113
for (String runmodeSuffix : runmodeSuffixes) {
113114
File contentInstallDir = new File(contentDir, "install" + runmodeSuffix);
114115
assertFiles(contentInstallDir, runmodeSuffix,
115-
contentPackage("acs-aem-commons-ui.content{runmode}", "4.10.0"),
116+
contentPackage("acs-aem-commons-ui.content{runmode}", "4.10.0",
117+
dep("adobe/consulting:acs-aem-commons-ui.apps{runmode}:4.10.0")),
116118
contentPackage("aem-cms-author-replicationagents{runmode}"),
117119
contentPackage("wcm-io-samples-sample-content{runmode}", "1.3.1-SNAPSHOT"));
118120
}

0 commit comments

Comments
 (0)