1 // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package org.jetbrains.idea.maven.project;
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.util.Pair;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.openapi.vfs.VfsUtilCore;
8 import com.intellij.openapi.vfs.VirtualFile;
9 import com.intellij.util.containers.CollectionFactory;
10 import com.intellij.util.containers.ContainerUtil;
11 import org.jdom.Element;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
14 import org.jetbrains.idea.maven.dom.converters.MavenConsumerPomUtil;
15 import org.jetbrains.idea.maven.model.*;
16 import org.jetbrains.idea.maven.server.MavenEmbedderWrapper;
17 import org.jetbrains.idea.maven.server.MavenServerExecutionResult;
18 import org.jetbrains.idea.maven.server.MavenServerManager;
19 import org.jetbrains.idea.maven.server.ProfileApplicationResult;
20 import org.jetbrains.idea.maven.utils.MavenJDOMUtil;
21 import org.jetbrains.idea.maven.utils.MavenLog;
22 import org.jetbrains.idea.maven.utils.MavenProcessCanceledException;
23 import org.jetbrains.idea.maven.utils.MavenUtil;
26 import java.io.IOException;
28 import java.util.function.Function;
30 import static com.intellij.openapi.util.io.FileUtil.toSystemIndependentName;
31 import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces;
32 import static com.intellij.util.containers.ContainerUtil.getFirstItem;
33 import static java.util.stream.Collectors.toMap;
34 import static org.jetbrains.idea.maven.utils.MavenUtil.getBaseDir;
36 public final class MavenProjectReader {
37 private static final String UNKNOWN = MavenId.UNKNOWN_VALUE;
39 private final Map<VirtualFile, RawModelReadResult> myRawModelsCache = new HashMap<>();
40 private final Project myProject;
41 private SettingsProfilesCache mySettingsProfilesCache;
43 public MavenProjectReader(@NotNull Project project) {
47 public MavenProjectReaderResult readProject(MavenGeneralSettings generalSettings,
49 MavenExplicitProfiles explicitProfiles,
50 MavenProjectReaderProjectLocator locator) {
51 File basedir = getBaseDir(file).toFile();
53 Pair<RawModelReadResult, MavenExplicitProfiles> readResult =
54 doReadProjectModel(generalSettings, basedir, file, explicitProfiles, new HashSet<>(), locator);
56 MavenModel model = MavenServerManager.getInstance().getConnector(myProject, basedir.getPath())
57 .interpolateAndAlignModel(readResult.first.model, basedir);
59 Map<String, String> modelMap = new HashMap<>();
60 modelMap.put("groupId", model.getMavenId().getGroupId());
61 modelMap.put("artifactId", model.getMavenId().getArtifactId());
62 modelMap.put("version", model.getMavenId().getVersion());
63 modelMap.put("build.outputDirectory", model.getBuild().getOutputDirectory());
64 modelMap.put("build.testOutputDirectory", model.getBuild().getTestOutputDirectory());
65 modelMap.put("build.finalName", model.getBuild().getFinalName());
66 modelMap.put("build.directory", model.getBuild().getDirectory());
68 return new MavenProjectReaderResult(model,
72 readResult.first.problems,
76 private Pair<RawModelReadResult, MavenExplicitProfiles> doReadProjectModel(MavenGeneralSettings generalSettings,
79 MavenExplicitProfiles explicitProfiles,
80 Set<VirtualFile> recursionGuard,
81 MavenProjectReaderProjectLocator locator) {
82 RawModelReadResult cachedModel = myRawModelsCache.get(file);
83 if (cachedModel == null) {
84 cachedModel = doReadProjectModel(file, false);
85 myRawModelsCache.put(file, cachedModel);
88 // todo modifying cached model and problems here??????
89 MavenModel model = cachedModel.model;
90 Set<String> alwaysOnProfiles = cachedModel.alwaysOnProfiles;
91 Collection<MavenProjectProblem> problems = cachedModel.problems;
93 model = resolveInheritance(generalSettings, model, projectPomDir, file, explicitProfiles, recursionGuard, locator, problems);
94 addSettingsProfiles(generalSettings, model, alwaysOnProfiles, problems);
96 ProfileApplicationResult applied = applyProfiles(model, projectPomDir, getBaseDir(file).toFile(), explicitProfiles, alwaysOnProfiles);
97 model = applied.getModel();
99 repairModelBody(model);
101 return Pair.create(new RawModelReadResult(model, problems, alwaysOnProfiles),
102 applied.getActivatedProfiles());
105 private RawModelReadResult doReadProjectModel(VirtualFile file, boolean headerOnly) {
106 MavenModel result = null;
107 Collection<MavenProjectProblem> problems = MavenProjectProblem.createProblemsList();
108 Set<String> alwaysOnProfiles = new HashSet<>();
110 String fileExtension = file.getExtension();
111 if (!"pom".equalsIgnoreCase(fileExtension) && !"xml".equalsIgnoreCase(fileExtension)) {
112 String basedir = getBaseDir(file).toString();
113 MavenEmbeddersManager manager = MavenProjectsManager.getInstance(myProject).getEmbeddersManager();
114 MavenEmbedderWrapper embedder = manager.getEmbedder(MavenEmbeddersManager.FOR_MODEL_READ, basedir, basedir);
116 result = embedder.readModel(VfsUtilCore.virtualToIoFile(file));
118 catch (MavenProcessCanceledException ignore) {
121 manager.release(embedder);
124 if (result == null) {
125 result = new MavenModel();
126 result.setPackaging(MavenConstants.TYPE_JAR);
128 return new RawModelReadResult(result, problems, alwaysOnProfiles);
131 result = new MavenModel();
132 Element xmlProject = readXml(file, problems, MavenProjectProblem.ProblemType.SYNTAX);
133 if (xmlProject == null || !"project".equals(xmlProject.getName())) {
134 result.setPackaging(MavenConstants.TYPE_JAR);
135 return new RawModelReadResult(result, problems, alwaysOnProfiles);
139 if (MavenJDOMUtil.hasChildByPath(xmlProject, "parent")) {
140 parent = new MavenParent(new MavenId(MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.groupId", UNKNOWN),
141 MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.artifactId", UNKNOWN),
142 calculateParentVersion(xmlProject, problems, file)),
143 MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.relativePath", "../pom.xml"));
144 result.setParent(parent);
147 parent = new MavenParent(new MavenId(UNKNOWN, UNKNOWN, UNKNOWN), "../pom.xml");
150 result.setMavenId(new MavenId(MavenJDOMUtil.findChildValueByPath(xmlProject, "groupId", parent.getMavenId().getGroupId()),
151 MavenJDOMUtil.findChildValueByPath(xmlProject, "artifactId", UNKNOWN),
152 MavenJDOMUtil.findChildValueByPath(xmlProject, "version", parent.getMavenId().getVersion())));
154 if (headerOnly) return new RawModelReadResult(result, problems, alwaysOnProfiles);
156 result.setPackaging(MavenJDOMUtil.findChildValueByPath(xmlProject, "packaging", MavenConstants.TYPE_JAR));
157 result.setName(MavenJDOMUtil.findChildValueByPath(xmlProject, "name"));
159 readModelBody(result, result.getBuild(), xmlProject);
161 result.setProfiles(collectProfiles(file, xmlProject, problems, alwaysOnProfiles));
162 return new RawModelReadResult(result, problems, alwaysOnProfiles);
166 private String calculateParentVersion(Element xmlProject,
167 Collection<MavenProjectProblem> problems,
169 String version = MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.version");
170 if (version != null || !MavenConsumerPomUtil.isConsumerPomResolutionApplicable(myProject)) {
171 return StringUtil.notNullize(version, UNKNOWN);
173 String parentGroupId = MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.groupId");
174 String parentArtifactId = MavenJDOMUtil.findChildValueByPath(xmlProject, "parent.artifactId");
175 if (parentGroupId == null || parentArtifactId == null) {
176 problems.add(new MavenProjectProblem(file.getPath(), MavenProjectBundle.message("consumer.pom.cannot.determine.parent.version"),
177 MavenProjectProblem.ProblemType.STRUCTURE,
181 VirtualFile parentFile = file.findFileByRelativePath("../../pom.xml");
182 if (parentFile == null) {
183 problems.add(new MavenProjectProblem(file.getPath(), MavenProjectBundle.message("consumer.pom.cannot.determine.parent.version"),
184 MavenProjectProblem.ProblemType.STRUCTURE,
189 Element parentXmlProject = readXml(parentFile, problems, MavenProjectProblem.ProblemType.SYNTAX);
190 version = MavenJDOMUtil.findChildValueByPath(parentXmlProject, "version");
191 if (version != null) {
194 return calculateParentVersion(parentXmlProject, problems, parentFile);
197 private static void readModelBody(MavenModelBase mavenModelBase, MavenBuildBase mavenBuildBase, Element xmlModel) {
198 mavenModelBase.setModules(MavenJDOMUtil.findChildrenValuesByPath(xmlModel, "modules", "module"));
199 collectProperties(MavenJDOMUtil.findChildByPath(xmlModel, "properties"), mavenModelBase);
201 Element xmlBuild = MavenJDOMUtil.findChildByPath(xmlModel, "build");
203 mavenBuildBase.setFinalName(MavenJDOMUtil.findChildValueByPath(xmlBuild, "finalName"));
204 mavenBuildBase.setDefaultGoal(MavenJDOMUtil.findChildValueByPath(xmlBuild, "defaultGoal"));
205 mavenBuildBase.setDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "directory"));
206 mavenBuildBase.setResources(collectResources(MavenJDOMUtil.findChildrenByPath(xmlBuild, "resources", "resource")));
207 mavenBuildBase.setTestResources(collectResources(MavenJDOMUtil.findChildrenByPath(xmlBuild, "testResources", "testResource")));
208 mavenBuildBase.setFilters(MavenJDOMUtil.findChildrenValuesByPath(xmlBuild, "filters", "filter"));
210 if (mavenBuildBase instanceof MavenBuild) {
211 MavenBuild mavenBuild = (MavenBuild)mavenBuildBase;
213 String source = MavenJDOMUtil.findChildValueByPath(xmlBuild, "sourceDirectory");
214 if (!isEmptyOrSpaces(source)) mavenBuild.addSource(source);
215 String testSource = MavenJDOMUtil.findChildValueByPath(xmlBuild, "testSourceDirectory");
216 if (!isEmptyOrSpaces(testSource)) mavenBuild.addTestSource(testSource);
218 mavenBuild.setOutputDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "outputDirectory"));
219 mavenBuild.setTestOutputDirectory(MavenJDOMUtil.findChildValueByPath(xmlBuild, "testOutputDirectory"));
223 private static List<MavenResource> collectResources(List<Element> xmlResources) {
224 List<MavenResource> result = new ArrayList<>();
225 for (Element each : xmlResources) {
226 result.add(new MavenResource(MavenJDOMUtil.findChildValueByPath(each, "directory"),
227 "true".equals(MavenJDOMUtil.findChildValueByPath(each, "filtering")),
228 MavenJDOMUtil.findChildValueByPath(each, "targetPath"),
229 MavenJDOMUtil.findChildrenValuesByPath(each, "includes", "include"),
230 MavenJDOMUtil.findChildrenValuesByPath(each, "excludes", "exclude")));
235 private void repairModelBody(MavenModel model) {
236 MavenBuild build = model.getBuild();
238 if (isEmptyOrSpaces(build.getFinalName())) {
239 build.setFinalName("${project.artifactId}-${project.version}");
242 if (build.getSources().isEmpty()) build.addSource("src/main/java");
243 if (build.getTestSources().isEmpty()) build.addTestSource("src/test/java");
245 build.setResources(repairResources(build.getResources(), "src/main/resources"));
246 build.setTestResources(repairResources(build.getTestResources(), "src/test/resources"));
248 build.setDirectory(isEmptyOrSpaces(build.getDirectory()) ? "target" : build.getDirectory());
249 build.setOutputDirectory(isEmptyOrSpaces(build.getOutputDirectory())
250 ? "${project.build.directory}/classes" : build.getOutputDirectory());
251 build.setTestOutputDirectory(isEmptyOrSpaces(build.getTestOutputDirectory())
252 ? "${project.build.directory}/test-classes" : build.getTestOutputDirectory());
255 private List<MavenResource> repairResources(List<MavenResource> resources, String defaultDir) {
256 List<MavenResource> result = new ArrayList<>();
257 if (resources.isEmpty()) {
258 result.add(createResource(defaultDir));
262 for (MavenResource each : resources) {
263 if (isEmptyOrSpaces(each.getDirectory())) continue;
269 private MavenResource createResource(String directory) {
270 return new MavenResource(directory, false, null, Collections.emptyList(), Collections.emptyList());
273 private List<MavenProfile> collectProfiles(VirtualFile projectFile,
275 Collection<MavenProjectProblem> problems,
276 Set<String> alwaysOnProfiles) {
277 List<MavenProfile> result = new ArrayList<>();
278 collectProfiles(MavenJDOMUtil.findChildrenByPath(xmlProject, "profiles", "profile"), result, MavenConstants.PROFILE_FROM_POM);
280 VirtualFile profilesFile = MavenUtil.findProfilesXmlFile(projectFile);
281 if (profilesFile != null) {
282 collectProfilesFromSettingsXmlOrProfilesXml(profilesFile,
285 MavenConstants.PROFILE_FROM_PROFILES_XML,
294 private void addSettingsProfiles(MavenGeneralSettings generalSettings,
296 Set<String> alwaysOnProfiles,
297 Collection<MavenProjectProblem> problems) {
298 if (mySettingsProfilesCache == null) {
300 List<MavenProfile> settingsProfiles = new ArrayList<>();
301 Collection<MavenProjectProblem> settingsProblems = MavenProjectProblem.createProblemsList();
302 Set<String> settingsAlwaysOnProfiles = new HashSet<>();
304 for (VirtualFile each : generalSettings.getEffectiveSettingsFiles()) {
305 collectProfilesFromSettingsXmlOrProfilesXml(each,
308 MavenConstants.PROFILE_FROM_SETTINGS_XML,
310 settingsAlwaysOnProfiles,
313 mySettingsProfilesCache = new SettingsProfilesCache(settingsProfiles, settingsAlwaysOnProfiles, settingsProblems);
316 List<MavenProfile> modelProfiles = new ArrayList<>(model.getProfiles());
317 for (MavenProfile each : mySettingsProfilesCache.profiles) {
318 addProfileIfDoesNotExist(each, modelProfiles);
320 model.setProfiles(modelProfiles);
322 problems.addAll(mySettingsProfilesCache.problems);
323 alwaysOnProfiles.addAll(mySettingsProfilesCache.alwaysOnProfiles);
326 private void collectProfilesFromSettingsXmlOrProfilesXml(VirtualFile profilesFile,
327 String rootElementName,
328 boolean wrapRootIfNecessary,
329 String profilesSource,
330 List<MavenProfile> result,
331 Set<String> alwaysOnProfiles,
332 Collection<MavenProjectProblem> problems) {
333 Element rootElement = readXml(profilesFile, problems, MavenProjectProblem.ProblemType.SETTINGS_OR_PROFILES);
334 if (rootElement == null) return;
336 if (wrapRootIfNecessary && !rootElementName.equals(rootElement.getName())) {
337 Element wrapper = new Element(rootElementName);
338 wrapper.addContent(rootElement);
339 rootElement = wrapper;
342 List<Element> xmlProfiles = MavenJDOMUtil.findChildrenByPath(rootElement, "profiles", "profile");
343 collectProfiles(xmlProfiles, result, profilesSource);
345 alwaysOnProfiles.addAll(MavenJDOMUtil.findChildrenValuesByPath(rootElement, "activeProfiles", "activeProfile"));
348 private void collectProfiles(List<Element> xmlProfiles, List<MavenProfile> result, String source) {
349 for (Element each : xmlProfiles) {
350 String id = MavenJDOMUtil.findChildValueByPath(each, "id");
351 if (isEmptyOrSpaces(id)) continue;
353 MavenProfile profile = new MavenProfile(id, source);
354 if (!addProfileIfDoesNotExist(profile, result)) continue;
356 Element xmlActivation = MavenJDOMUtil.findChildByPath(each, "activation");
357 if (xmlActivation != null) {
358 MavenProfileActivation activation = new MavenProfileActivation();
359 activation.setActiveByDefault("true".equals(MavenJDOMUtil.findChildValueByPath(xmlActivation, "activeByDefault")));
361 Element xmlOS = MavenJDOMUtil.findChildByPath(xmlActivation, "os");
363 activation.setOs(new MavenProfileActivationOS(
364 MavenJDOMUtil.findChildValueByPath(xmlOS, "name"),
365 MavenJDOMUtil.findChildValueByPath(xmlOS, "family"),
366 MavenJDOMUtil.findChildValueByPath(xmlOS, "arch"),
367 MavenJDOMUtil.findChildValueByPath(xmlOS, "version")));
370 activation.setJdk(MavenJDOMUtil.findChildValueByPath(xmlActivation, "jdk"));
372 Element xmlProperty = MavenJDOMUtil.findChildByPath(xmlActivation, "property");
373 if (xmlProperty != null) {
374 activation.setProperty(new MavenProfileActivationProperty(
375 MavenJDOMUtil.findChildValueByPath(xmlProperty, "name"),
376 MavenJDOMUtil.findChildValueByPath(xmlProperty, "value")));
379 Element xmlFile = MavenJDOMUtil.findChildByPath(xmlActivation, "file");
380 if (xmlFile != null) {
381 activation.setFile(new MavenProfileActivationFile(
382 MavenJDOMUtil.findChildValueByPath(xmlFile, "exists"),
383 MavenJDOMUtil.findChildValueByPath(xmlFile, "missing")));
386 profile.setActivation(activation);
389 readModelBody(profile, profile.getBuild(), each);
393 private boolean addProfileIfDoesNotExist(MavenProfile profile, List<MavenProfile> result) {
394 for (MavenProfile each : result) {
395 if (Objects.equals(each.getId(), profile.getId())) return false;
401 private static void collectProperties(Element xmlProperties, MavenModelBase mavenModelBase) {
402 if (xmlProperties == null) return;
404 Properties props = mavenModelBase.getProperties();
406 for (Element each : xmlProperties.getChildren()) {
407 String name = each.getName();
408 String value = each.getTextTrim();
409 if (!props.containsKey(name) && !isEmptyOrSpaces(name)) {
410 props.setProperty(name, value);
415 private ProfileApplicationResult applyProfiles(MavenModel model,
418 MavenExplicitProfiles explicitProfiles,
419 Collection<String> alwaysOnProfiles) {
420 return MavenServerManager.getInstance().getConnector(myProject, projectPomDir.getAbsolutePath())
421 .applyProfiles(model, basedir, explicitProfiles, alwaysOnProfiles);
424 private MavenModel resolveInheritance(final MavenGeneralSettings generalSettings,
426 final File projectPomDir,
427 final VirtualFile file,
428 final MavenExplicitProfiles explicitProfiles,
429 final Set<VirtualFile> recursionGuard,
430 final MavenProjectReaderProjectLocator locator,
431 Collection<MavenProjectProblem> problems) {
432 if (recursionGuard.contains(file)) {
434 .add(MavenProjectProblem.createProblem(file.getPath(), MavenProjectBundle.message("maven.project.problem.recursiveInheritance"),
435 MavenProjectProblem.ProblemType.PARENT, false));
438 recursionGuard.add(file);
441 final MavenParentDesc[] parentDesc = new MavenParentDesc[1];
442 MavenParent parent = model.getParent();
443 if (parent != null) {
444 if (model.getMavenId().equals(parent.getMavenId())) {
446 .add(MavenProjectProblem.createProblem(file.getPath(), MavenProjectBundle.message("maven.project.problem.selfInheritance"),
447 MavenProjectProblem.ProblemType.PARENT, false));
450 parentDesc[0] = new MavenParentDesc(parent.getMavenId(), parent.getRelativePath());
453 Pair<VirtualFile, RawModelReadResult> parentModelWithProblems =
454 new MavenParentProjectFileProcessor<Pair<VirtualFile, RawModelReadResult>>() {
457 protected VirtualFile findManagedFile(@NotNull MavenId id) {
458 return locator.findProjectFile(id);
463 protected Pair<VirtualFile, RawModelReadResult> processRelativeParent(VirtualFile parentFile) {
464 MavenModel parentModel = doReadProjectModel(parentFile, true).model;
465 MavenId parentId = parentDesc[0].getParentId();
466 if (!parentId.equals(parentModel.getMavenId())) return null;
468 return super.processRelativeParent(parentFile);
472 protected Pair<VirtualFile, RawModelReadResult> processSuperParent(VirtualFile parentFile) {
473 return null; // do not process superPom
477 protected Pair<VirtualFile, RawModelReadResult> doProcessParent(VirtualFile parentFile) {
478 RawModelReadResult result =
479 doReadProjectModel(generalSettings, projectPomDir, parentFile, explicitProfiles, recursionGuard, locator).first;
480 return Pair.create(parentFile, result);
482 }.process(generalSettings, file, parentDesc[0]);
484 if (parentModelWithProblems == null) return model; // no parent or parent not found;
486 MavenModel parentModel = parentModelWithProblems.second.model;
487 if (!parentModelWithProblems.second.problems.isEmpty()) {
488 problems.add(MavenProjectProblem.createProblem(parentModelWithProblems.first.getPath(),
489 MavenProjectBundle.message("maven.project.problem.parentHasProblems",
490 parentModel.getMavenId()),
491 MavenProjectProblem.ProblemType.PARENT, false));
494 model = MavenServerManager.getInstance().getConnector(myProject, projectPomDir.getAbsolutePath())
495 .assembleInheritance(model, parentModel);
497 // todo: it is a quick-hack here - we add inherited dummy profiles to correctly collect activated profiles in 'applyProfiles'.
498 List<MavenProfile> profiles = model.getProfiles();
499 for (MavenProfile each : parentModel.getProfiles()) {
500 MavenProfile copyProfile = new MavenProfile(each.getId(), each.getSource());
501 if (each.getActivation() != null) {
502 copyProfile.setActivation(each.getActivation().clone());
505 addProfileIfDoesNotExist(copyProfile, profiles);
510 recursionGuard.remove(file);
514 public Collection<MavenProjectReaderResult> resolveProject(final MavenGeneralSettings generalSettings,
515 MavenEmbedderWrapper embedder,
516 Collection<VirtualFile> files,
517 final MavenExplicitProfiles explicitProfiles,
518 final MavenProjectReaderProjectLocator locator)
519 throws MavenProcessCanceledException {
521 Collection<MavenServerExecutionResult> executionResults = embedder
522 .resolveProject(files, explicitProfiles.getEnabledProfiles(), explicitProfiles.getDisabledProfiles());
523 Map<String, VirtualFile> filesMap = CollectionFactory.createFilePathMap();
524 filesMap.putAll(files.stream().collect(toMap(VirtualFile::getPath, Function.identity())));
526 Collection<MavenProjectReaderResult> readerResults = new ArrayList<>();
527 for (MavenServerExecutionResult result : executionResults) {
528 MavenServerExecutionResult.ProjectData projectData = result.projectData;
529 if (projectData == null) {
530 VirtualFile file = detectPomFile(filesMap, result);
532 MavenProjectReaderResult temp = readProject(generalSettings, file, explicitProfiles, locator);
533 temp.readingProblems.addAll(result.problems);
534 temp.unresolvedArtifactIds.addAll(result.unresolvedArtifacts);
535 readerResults.add(temp);
539 readerResults.add(new MavenProjectReaderResult(
540 projectData.mavenModel,
541 projectData.mavenModelMap,
542 new MavenExplicitProfiles(projectData.activatedProfiles, explicitProfiles.getDisabledProfiles()),
543 projectData.nativeMavenProject,
545 result.unresolvedArtifacts));
549 return readerResults;
551 catch (MavenProcessCanceledException e) {
554 catch (final Throwable e) {
555 MavenLog.LOG.info(e);
556 MavenLog.printInTests(e); // print exception since we need to know if something wrong with our logic
558 return ContainerUtil.mapNotNull(files, file -> {
559 MavenProjectReaderResult result = readProject(generalSettings, file, explicitProfiles, locator);
560 String message = e.getMessage();
561 if (message != null) {
562 result.readingProblems.add(MavenProjectProblem.createStructureProblem(file.getPath(), message));
565 result.readingProblems.add(MavenProjectProblem.createSyntaxProblem(file.getPath(), MavenProjectProblem.ProblemType.SYNTAX));
573 private static VirtualFile detectPomFile(Map<String, VirtualFile> filesMap, MavenServerExecutionResult result) {
574 if (filesMap.size() == 1) {
575 return getFirstItem(filesMap.values());
577 if (!result.problems.isEmpty()) {
578 String path = getFirstItem(result.problems).getPath();
580 return filesMap.get(toSystemIndependentName(path));
587 public static MavenProjectReaderResult generateSources(MavenEmbedderWrapper embedder,
588 MavenImportingSettings importingSettings,
590 MavenExplicitProfiles profiles,
591 MavenConsole console) throws MavenProcessCanceledException {
593 List<String> goals = Collections.singletonList(importingSettings.getUpdateFoldersOnImportPhase());
594 MavenServerExecutionResult result = embedder.execute(file, profiles.getEnabledProfiles(), profiles.getDisabledProfiles(), goals);
595 MavenServerExecutionResult.ProjectData projectData = result.projectData;
596 if (projectData == null) return null;
598 return new MavenProjectReaderResult(projectData.mavenModel,
599 projectData.mavenModelMap,
600 new MavenExplicitProfiles(projectData.activatedProfiles, profiles.getDisabledProfiles()),
601 projectData.nativeMavenProject,
603 result.unresolvedArtifacts);
605 catch (Throwable e) {
606 console.printException(e);
607 MavenLog.LOG.warn(e);
612 private static Element readXml(final VirtualFile file,
613 final Collection<MavenProjectProblem> problems,
614 final MavenProjectProblem.ProblemType type) {
615 return MavenJDOMUtil.read(file, new MavenJDOMUtil.ErrorHandler() {
617 public void onReadError(IOException e) {
618 MavenLog.LOG.warn("Cannot read the pom file: " + e);
619 problems.add(MavenProjectProblem.createProblem(file.getPath(), e.getMessage(), type, false));
623 public void onSyntaxError() {
624 problems.add(MavenProjectProblem.createSyntaxProblem(file.getPath(), type));
629 private static final class SettingsProfilesCache {
630 final List<MavenProfile> profiles;
631 final Set<String> alwaysOnProfiles;
632 final Collection<MavenProjectProblem> problems;
634 private SettingsProfilesCache(List<MavenProfile> profiles, Set<String> alwaysOnProfiles, Collection<MavenProjectProblem> problems) {
635 this.profiles = profiles;
636 this.alwaysOnProfiles = alwaysOnProfiles;
637 this.problems = problems;
641 private static final class RawModelReadResult {
642 public MavenModel model;
643 public Collection<MavenProjectProblem> problems;
644 public Set<String> alwaysOnProfiles;
646 private RawModelReadResult(MavenModel model, Collection<MavenProjectProblem> problems, Set<String> alwaysOnProfiles) {
648 this.problems = problems;
649 this.alwaysOnProfiles = alwaysOnProfiles;