4343import java .util .HashSet ;
4444import java .util .List ;
4545import java .util .Map ;
46+ import java .util .Optional ;
4647import java .util .Properties ;
4748import java .util .Set ;
4849import 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.
0 commit comments