66
66
import org .apache .maven .api .model .Exclusion ;
67
67
import org .apache .maven .api .model .InputLocation ;
68
68
import org .apache .maven .api .model .InputSource ;
69
+ import org .apache .maven .api .model .Mixin ;
69
70
import org .apache .maven .api .model .Model ;
70
71
import org .apache .maven .api .model .Parent ;
71
72
import org .apache .maven .api .model .Profile ;
@@ -838,12 +839,11 @@ void buildEffectiveModel(Collection<String> importIds) throws ModelBuilderExcept
838
839
}
839
840
}
840
841
841
- Model readParent (Model childModel , DefaultProfileActivationContext profileActivationContext ) {
842
+ Model readParent (Model childModel , Parent parent , DefaultProfileActivationContext profileActivationContext ) {
842
843
Model parentModel ;
843
844
844
- Parent parent = childModel .getParent ();
845
845
if (parent != null ) {
846
- parentModel = resolveParent (childModel , profileActivationContext );
846
+ parentModel = resolveParent (childModel , parent , profileActivationContext );
847
847
848
848
if (!"pom" .equals (parentModel .getPackaging ())) {
849
849
add (
@@ -868,23 +868,26 @@ Model readParent(Model childModel, DefaultProfileActivationContext profileActiva
868
868
return parentModel ;
869
869
}
870
870
871
- private Model resolveParent (Model childModel , DefaultProfileActivationContext profileActivationContext )
871
+ private Model resolveParent (
872
+ Model childModel , Parent parent , DefaultProfileActivationContext profileActivationContext )
872
873
throws ModelBuilderException {
873
874
Model parentModel = null ;
874
875
if (isBuildRequest ()) {
875
- parentModel = readParentLocally (childModel , profileActivationContext );
876
+ parentModel = readParentLocally (childModel , parent , profileActivationContext );
876
877
}
877
878
if (parentModel == null ) {
878
- parentModel = resolveAndReadParentExternally (childModel , profileActivationContext );
879
+ parentModel = resolveAndReadParentExternally (childModel , parent , profileActivationContext );
879
880
}
880
881
return parentModel ;
881
882
}
882
883
883
- private Model readParentLocally (Model childModel , DefaultProfileActivationContext profileActivationContext )
884
+ private Model readParentLocally (
885
+ Model childModel , Parent parent , DefaultProfileActivationContext profileActivationContext )
884
886
throws ModelBuilderException {
885
887
ModelSource candidateSource ;
886
888
887
- Parent parent = childModel .getParent ();
889
+ boolean isParentOrSimpleMixin = !(parent instanceof Mixin )
890
+ || (((Mixin ) parent ).getClassifier () == null && ((Mixin ) parent ).getExtension () == null );
888
891
String parentPath = parent .getRelativePath ();
889
892
if (request .getRequestType () == ModelBuilderRequest .RequestType .BUILD_PROJECT ) {
890
893
if (parentPath != null && !parentPath .isEmpty ()) {
@@ -893,14 +896,16 @@ private Model readParentLocally(Model childModel, DefaultProfileActivationContex
893
896
wrongParentRelativePath (childModel );
894
897
return null ;
895
898
}
896
- } else {
899
+ } else if ( isParentOrSimpleMixin ) {
897
900
candidateSource =
898
901
resolveReactorModel (parent .getGroupId (), parent .getArtifactId (), parent .getVersion ());
899
902
if (candidateSource == null && parentPath == null ) {
900
903
candidateSource = request .getSource ().resolve (modelProcessor ::locateExistingPom , ".." );
901
904
}
905
+ } else {
906
+ candidateSource = null ;
902
907
}
903
- } else {
908
+ } else if ( isParentOrSimpleMixin ) {
904
909
candidateSource = resolveReactorModel (parent .getGroupId (), parent .getArtifactId (), parent .getVersion ());
905
910
if (candidateSource == null ) {
906
911
if (parentPath == null ) {
@@ -910,6 +915,8 @@ private Model readParentLocally(Model childModel, DefaultProfileActivationContex
910
915
candidateSource = request .getSource ().resolve (modelProcessor ::locateExistingPom , parentPath );
911
916
}
912
917
}
918
+ } else {
919
+ candidateSource = null ;
913
920
}
914
921
915
922
if (candidateSource == null ) {
@@ -925,11 +932,10 @@ private Model readParentLocally(Model childModel, DefaultProfileActivationContex
925
932
String version = getVersion (candidateModel );
926
933
927
934
// Ensure that relative path and GA match, if both are provided
928
- if (groupId == null
929
- || !groupId .equals (parent .getGroupId ())
930
- || artifactId == null
931
- || !artifactId .equals (parent .getArtifactId ())) {
932
- mismatchRelativePathAndGA (childModel , groupId , artifactId );
935
+ if (parent .getGroupId () != null && (groupId == null || !groupId .equals (parent .getGroupId ()))
936
+ || parent .getArtifactId () != null
937
+ && (artifactId == null || !artifactId .equals (parent .getArtifactId ()))) {
938
+ mismatchRelativePathAndGA (childModel , parent , groupId , artifactId );
933
939
return null ;
934
940
}
935
941
@@ -968,8 +974,7 @@ private Model readParentLocally(Model childModel, DefaultProfileActivationContex
968
974
return candidateModel ;
969
975
}
970
976
971
- private void mismatchRelativePathAndGA (Model childModel , String groupId , String artifactId ) {
972
- Parent parent = childModel .getParent ();
977
+ private void mismatchRelativePathAndGA (Model childModel , Parent parent , String groupId , String artifactId ) {
973
978
StringBuilder buffer = new StringBuilder (256 );
974
979
buffer .append ("'parent.relativePath'" );
975
980
if (childModel != getRootModel ()) {
@@ -1000,16 +1005,17 @@ private void wrongParentRelativePath(Model childModel) {
1000
1005
add (Severity .FATAL , Version .BASE , buffer .toString (), parent .getLocation ("" ));
1001
1006
}
1002
1007
1003
- Model resolveAndReadParentExternally (Model childModel , DefaultProfileActivationContext profileActivationContext )
1008
+ Model resolveAndReadParentExternally (
1009
+ Model childModel , Parent parent , DefaultProfileActivationContext profileActivationContext )
1004
1010
throws ModelBuilderException {
1005
1011
ModelBuilderRequest request = this .request ;
1006
1012
setSource (childModel );
1007
1013
1008
- Parent parent = childModel .getParent ();
1009
-
1010
1014
String groupId = parent .getGroupId ();
1011
1015
String artifactId = parent .getArtifactId ();
1012
1016
String version = parent .getVersion ();
1017
+ String classifier = parent instanceof Mixin ? ((Mixin ) parent ).getClassifier () : null ;
1018
+ String extension = parent instanceof Mixin ? ((Mixin ) parent ).getExtension () : null ;
1013
1019
1014
1020
// add repositories specified by the current model so that we can resolve the parent
1015
1021
if (!childModel .getRepositories ().isEmpty ()) {
@@ -1027,12 +1033,23 @@ Model resolveAndReadParentExternally(Model childModel, DefaultProfileActivationC
1027
1033
1028
1034
ModelSource modelSource ;
1029
1035
try {
1030
- modelSource = resolveReactorModel (parent .getGroupId (), parent .getArtifactId (), parent .getVersion ());
1036
+ modelSource = classifier == null && extension == null
1037
+ ? resolveReactorModel (groupId , artifactId , version )
1038
+ : null ;
1031
1039
if (modelSource == null ) {
1032
- AtomicReference <Parent > modified = new AtomicReference <>();
1033
- modelSource = modelResolver .resolveModel (request .getSession (), repositories , parent , modified );
1034
- if (modified .get () != null ) {
1035
- parent = modified .get ();
1040
+ ModelResolver .ModelResolverRequest req = new ModelResolver .ModelResolverRequest (
1041
+ request .getSession (),
1042
+ null ,
1043
+ repositories ,
1044
+ groupId ,
1045
+ artifactId ,
1046
+ version ,
1047
+ classifier ,
1048
+ extension != null ? extension : "pom" );
1049
+ ModelResolver .ModelResolverResult result = modelResolver .resolveModel (req );
1050
+ modelSource = result .source ();
1051
+ if (result .version () != null ) {
1052
+ parent = parent .withVersion (result .version ());
1036
1053
}
1037
1054
}
1038
1055
} catch (ModelResolverException e ) {
@@ -1148,7 +1165,8 @@ private Model readEffectiveModel() throws ModelBuilderException {
1148
1165
profileActivationContext .setUserProperties (profileProps );
1149
1166
}
1150
1167
1151
- Model parentModel = readParent (activatedFileModel , profileActivationContext );
1168
+ Model parentModel =
1169
+ readParent (activatedFileModel , activatedFileModel .getParent (), profileActivationContext );
1152
1170
1153
1171
// Now that we have read the parent, we can set the relative
1154
1172
// path correctly if it was not set in the input model
@@ -1170,6 +1188,15 @@ private Model readEffectiveModel() throws ModelBuilderException {
1170
1188
1171
1189
Model model = inheritanceAssembler .assembleModelInheritance (inputModel , parentModel , request , this );
1172
1190
1191
+ // Mixins
1192
+ for (Mixin mixin : model .getMixins ()) {
1193
+ Model parent = resolveParent (model , mixin , profileActivationContext );
1194
+ model = inheritanceAssembler .assembleModelInheritance (model , parent , request , this );
1195
+ }
1196
+
1197
+ // model normalization
1198
+ model = modelNormalizer .mergeDuplicates (model , request , this );
1199
+
1173
1200
// profile activation
1174
1201
profileActivationContext .setModel (model );
1175
1202
@@ -1354,7 +1381,7 @@ Model doReadFileModel() throws ModelBuilderException {
1354
1381
.version (parentVersion )
1355
1382
.build ());
1356
1383
} else {
1357
- mismatchRelativePathAndGA (model , parentGroupId , parentArtifactId );
1384
+ mismatchRelativePathAndGA (model , parent , parentGroupId , parentArtifactId );
1358
1385
}
1359
1386
} else {
1360
1387
if (!MODEL_VERSION_4_0_0 .equals (model .getModelVersion ()) && path != null ) {
@@ -1575,8 +1602,9 @@ Model readAsParentModel(DefaultProfileActivationContext profileActivationContext
1575
1602
private ParentModelWithProfiles doReadAsParentModel (
1576
1603
DefaultProfileActivationContext childProfileActivationContext ) throws ModelBuilderException {
1577
1604
Model raw = readRawModel ();
1578
- Model parentData = readParent (raw , childProfileActivationContext );
1579
- Model parent = new DefaultInheritanceAssembler (new DefaultInheritanceAssembler .InheritanceModelMerger () {
1605
+ Model parentData = readParent (raw , raw .getParent (), childProfileActivationContext );
1606
+ DefaultInheritanceAssembler defaultInheritanceAssembler =
1607
+ new DefaultInheritanceAssembler (new DefaultInheritanceAssembler .InheritanceModelMerger () {
1580
1608
@ Override
1581
1609
protected void mergeModel_Modules (
1582
1610
Model .Builder builder ,
@@ -1592,8 +1620,12 @@ protected void mergeModel_Subprojects(
1592
1620
Model source ,
1593
1621
boolean sourceDominant ,
1594
1622
Map <Object , Object > context ) {}
1595
- })
1596
- .assembleModelInheritance (raw , parentData , request , this );
1623
+ });
1624
+ Model parent = defaultInheritanceAssembler .assembleModelInheritance (raw , parentData , request , this );
1625
+ for (Mixin mixin : parent .getMixins ()) {
1626
+ Model parentModel = resolveParent (parent , mixin , childProfileActivationContext );
1627
+ parent = defaultInheritanceAssembler .assembleModelInheritance (parent , parentModel , request , this );
1628
+ }
1597
1629
1598
1630
// Profile injection SHOULD be performed on parent models to ensure
1599
1631
// that profile content becomes part of the parent model before inheritance.
0 commit comments