in compat/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java [254:426]
protected ModelBuildingResult build(ModelBuildingRequest request, Collection<String> importIds)
throws ModelBuildingException {
// phase 1
DefaultModelBuildingResult result = new DefaultModelBuildingResult();
DefaultModelProblemCollector problems = new DefaultModelProblemCollector(result);
// read and validate raw model
Model inputModel = request.getRawModel();
if (inputModel == null) {
inputModel = readModel(request.getModelSource(), request.getPomFile(), request, problems);
}
// profile activation
DefaultProfileActivationContext profileActivationContext = getProfileActivationContext(request, inputModel);
problems.setSource("(external profiles)");
List<Profile> activeExternalProfiles =
profileSelector.getActiveProfiles(request.getProfiles(), profileActivationContext, problems);
result.setActiveExternalProfiles(activeExternalProfiles);
if (!activeExternalProfiles.isEmpty()) {
Properties profileProps = new Properties();
for (Profile profile : activeExternalProfiles) {
profileProps.putAll(profile.getProperties());
}
profileProps.putAll(profileActivationContext.getUserProperties());
profileActivationContext.setUserProperties(profileProps);
}
problems.setRootModel(inputModel);
ModelData resultData = new ModelData(request.getModelSource(), inputModel);
ModelData superData = new ModelData(null, getSuperModel());
Collection<String> parentIds = new LinkedHashSet<>();
List<ModelData> lineage = new ArrayList<>();
for (ModelData currentData = resultData; currentData != null; ) {
lineage.add(currentData);
Model rawModel = currentData.getModel();
currentData.setRawModel(rawModel);
Model tmpModel = rawModel.clone();
currentData.setModel(tmpModel);
problems.setSource(tmpModel);
// model normalization
modelNormalizer.mergeDuplicates(tmpModel, request, problems);
profileActivationContext.setProjectProperties(tmpModel.getProperties());
List<Profile> interpolatedProfiles = getInterpolatedProfiles(rawModel, profileActivationContext, problems);
tmpModel.setProfiles(interpolatedProfiles);
List<Profile> activePomProfiles =
profileSelector.getActiveProfiles(tmpModel.getProfiles(), profileActivationContext, problems);
List<Profile> rawProfiles = new ArrayList<>();
for (Profile activePomProfile : activePomProfiles) {
rawProfiles.add(rawModel.getProfiles().get(interpolatedProfiles.indexOf(activePomProfile)));
}
currentData.setActiveProfiles(rawProfiles);
// profile injection
for (Profile activeProfile : activePomProfiles) {
profileInjector.injectProfile(tmpModel, activeProfile, request, problems);
}
if (currentData == resultData) {
for (Profile activeProfile : activeExternalProfiles) {
profileInjector.injectProfile(tmpModel, activeProfile, request, problems);
}
}
if (currentData == superData) {
break;
}
configureResolver(request.getModelResolver(), tmpModel, problems);
ModelData parentData = readParent(tmpModel, currentData.getSource(), request, problems);
if (parentData == null) {
currentData = superData;
} else if (currentData == resultData) { // First iteration - add initial id after version resolution.
currentData.setGroupId(
currentData.getRawModel().getGroupId() == null
? parentData.getGroupId()
: currentData.getRawModel().getGroupId());
currentData.setVersion(
currentData.getRawModel().getVersion() == null
? parentData.getVersion()
: currentData.getRawModel().getVersion());
currentData.setArtifactId(currentData.getRawModel().getArtifactId());
parentIds.add(currentData.getId());
// Reset - only needed for 'getId'.
currentData.setGroupId(null);
currentData.setArtifactId(null);
currentData.setVersion(null);
currentData = parentData;
} else if (!parentIds.add(parentData.getId())) {
StringBuilder message = new StringBuilder("The parents form a cycle: ");
for (String modelId : parentIds) {
message.append(modelId);
message.append(" -> ");
}
message.append(parentData.getId());
problems.add(new ModelProblemCollectorRequest(ModelProblem.Severity.FATAL, ModelProblem.Version.BASE)
.setMessage(message.toString()));
throw problems.newModelBuildingException();
} else {
currentData = parentData;
}
}
problems.setSource(inputModel);
checkPluginVersions(lineage, request, problems);
// inheritance assembly
assembleInheritance(lineage, request, problems);
Model resultModel = resultData.getModel();
problems.setSource(resultModel);
problems.setRootModel(resultModel);
// model interpolation
resultModel = interpolateModel(resultModel, request, problems);
resultData.setModel(resultModel);
if (resultModel.getParent() != null) {
final ModelData parentData = lineage.get(1);
if (parentData.getVersion() == null || parentData.getVersion().contains("${")) {
final Model interpolatedParent = interpolateModel(parentData.getModel(), request, problems);
// parentData.setModel( interpolatedParent );
parentData.setVersion(interpolatedParent.getVersion());
}
}
// url normalization
modelUrlNormalizer.normalize(resultModel, request);
// Now the fully interpolated model is available: reconfigure the resolver
configureResolver(request.getModelResolver(), resultModel, problems, true);
resultData.setGroupId(resultModel.getGroupId());
resultData.setArtifactId(resultModel.getArtifactId());
resultData.setVersion(resultModel.getVersion());
result.setEffectiveModel(resultModel);
for (ModelData currentData : lineage) {
String modelId = (currentData != superData) ? currentData.getId() : "";
result.addModelId(modelId);
result.setActivePomProfiles(modelId, currentData.getActiveProfiles());
result.setRawModel(modelId, currentData.getRawModel());
}
if (!request.isTwoPhaseBuilding()) {
build(request, result, importIds);
}
return result;
}