This is an automated email from the ASF dual-hosted git repository. sdedic pushed a commit to branch vsnetbeans_1703 in repository https://gitbox.apache.org/repos/asf/netbeans.git
commit 6fb42ee82bcf38615cd37d4efd5922ec71508be8 Author: Svatopluk Dedic <svatopluk.de...@oracle.com> AuthorDate: Thu Apr 6 07:20:43 2023 -0700 Force refresh of live subprojects when parent recovers from broken. (#5781) Force refresh of live subprojects when parent recovers from broken. --- .../netbeans/modules/maven/NbMavenProjectImpl.java | 51 ++++++++++++++++++- .../maven/modelcache/MavenProjectCache.java | 58 +++++++++++++++++++++- .../maven/problems/MavenModelProblemsProvider.java | 1 + 3 files changed, 107 insertions(+), 3 deletions(-) diff --git a/java/maven/src/org/netbeans/modules/maven/NbMavenProjectImpl.java b/java/maven/src/org/netbeans/modules/maven/NbMavenProjectImpl.java index b8caf9c811..7d753e2185 100644 --- a/java/maven/src/org/netbeans/modules/maven/NbMavenProjectImpl.java +++ b/java/maven/src/org/netbeans/modules/maven/NbMavenProjectImpl.java @@ -71,6 +71,7 @@ import org.netbeans.api.annotations.common.NullUnknown; import org.netbeans.api.java.project.classpath.ProjectClassPathModifier; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectActionContext; +import org.netbeans.api.project.ProjectManager; import org.netbeans.api.queries.VisibilityQuery; import org.netbeans.modules.maven.api.Constants; import org.netbeans.modules.maven.api.FileUtilities; @@ -134,8 +135,9 @@ public final class NbMavenProjectImpl implements Project { public void run() { problemReporter.clearReports(); //#167741 -this will trigger node refresh? MavenProject prj = loadOriginalMavenProject(true); + MavenProject old; synchronized (NbMavenProjectImpl.this) { - MavenProject old = project == null ? null : project.get(); + old = project == null ? null : project.get(); if (old != null && MavenProjectCache.isFallbackproject(prj)) { prj.setPackaging(old.getPackaging()); //#229366 preserve packaging for broken projects to avoid changing lookup. } @@ -146,6 +148,7 @@ public final class NbMavenProjectImpl implements Project { projectVariants.clear(); } ACCESSOR.doFireReload(watcher); + reloadPossibleBrokenModules(old, prj); } }); private final FileObject fileObject; @@ -552,6 +555,52 @@ public final class NbMavenProjectImpl implements Project { } return reloadTask; } + + private void reloadPossibleBrokenModules(MavenProject preceding, MavenProject p) { + // restrict to just poms that were marked as broken/incomplete. + if (!(MavenProjectCache.isFallbackproject(preceding) || + preceding.getContextValue("org.netbeans.modules.maven.problems.primingNotDone") != Boolean.TRUE)) { + return; + } + // but do not cascade from projects, which are themselves broken. + if (MavenProjectCache.isFallbackproject(p)) { + return; + } + File basePOMFile = p.getFile().getParentFile(); + for (String modName : p.getModules()) { + File modPom = new File(new File(basePOMFile, modName), "pom.xml"); + if (!modPom.exists() || !modPom.isFile()) { + LOG.log(Level.FINE, "POM file {0} for module {1} does not exist", new Object[] { modPom, modName }); + continue; + } + MavenProject child = MavenProjectCache.getMavenProject(modPom, true, false); + if (child == null) { + continue; + } + // the project may have more problems, more subtle, but now repair just total breakage + if (!MavenProjectCache.isFallbackproject(child)) { + LOG.log(Level.FINE, "Project for module {0} is not a fallback, skipping", modName); + } + FileObject dir = FileUtil.toFileObject(modPom.getParentFile()); + if (dir == null) { + LOG.log(Level.FINE, "Project directory for {0} is not a FileObject", modName); + continue; + } + try { + Project c = ProjectManager.getDefault().findProject(dir); + if (c == null) { + LOG.log(Level.FINE, "Module {0} is not a project", modName); + } else { + LOG.log(Level.INFO, "Recovering module {0}, pomfile {1}", new Object[] { modName, modPom }); + NbMavenProjectImpl childImpl = c.getLookup().lookup(NbMavenProjectImpl.class); + childImpl.fireProjectReload(); + } + } catch (IOException ex) { + LOG.log(Level.FINE, "Error getting module project {0} is not a project", modName); + LOG.log(Level.FINE, "Exception was: ", ex); + } + } + } public static void refreshLocalRepository(NbMavenProjectImpl project) { File file = project.getEmbedder().getLocalRepositoryFile(); diff --git a/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java b/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java index 31a3af2bbe..6d8c521e2b 100644 --- a/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java +++ b/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java @@ -39,6 +39,8 @@ import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.project.MavenProject; +import org.apache.maven.project.ProjectBuildingException; +import org.apache.maven.project.ProjectBuildingResult; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.project.ProjectActionContext; @@ -99,6 +101,10 @@ public final class MavenProjectCache { * @return */ public static MavenProject getMavenProject(final File pomFile, final boolean reload) { + return getMavenProject(pomFile, false, reload); + } + + public static MavenProject getMavenProject(final File pomFile, final boolean doNotLoadReturnNull, final boolean reload) { Mutex mutex = getMutex(pomFile); MavenProject mp = mutex.writeAccess(new Action<MavenProject>() { @Override @@ -112,6 +118,9 @@ public final class MavenProjectCache { return mp; } } + if (doNotLoadReturnNull) { + return null; + } } MavenProject mp = loadOriginalMavenProject(pomFile); file2Project.put(pomFile, new WeakReference<MavenProject>(mp)); @@ -329,7 +338,7 @@ public final class MavenProjectCache { res.addException(exc); } finally { if (newproject == null) { - newproject = getFallbackProject(pomFile); + newproject = getFallbackProject(res, pomFile); } //#215159 clear the project building request, it references multiple Maven Models via the RepositorySession cache //is not used in maven itself, most likely used by m2e only.. @@ -350,6 +359,46 @@ public final class MavenProjectCache { } return newproject; } + + private static final String CONTEXT_PARTIAL_PROJECT = "org.netbeans.modules.maven.partialProject"; // NOI18N + private static final String CONTEXT_FALLBACK_PROJECT = "org.netbeans.modules.maven.fallbackProject"; // NOI18N + + /** + * Create a fallback project, but patch the incomplete project from the building result into it. + * The method will eventually start to return the partial project but still flagged as a fallback - see {@link #isFallbackproject(org.apache.maven.project.MavenProject)}. + * + * @param result the maven execution / project building result. + * @param projectFile the project file. + * @return fallback project + * @throws AssertionError + */ + public static MavenProject getFallbackProject(MavenExecutionResult result, File projectFile) throws AssertionError { + MavenProject toReturn = getFallbackProject(projectFile); + if (result == null) { + return toReturn; + } + MavenProject partial = null; + + for (Throwable t : result.getExceptions()) { + if (t instanceof ProjectBuildingException) { + ProjectBuildingException pbe = (ProjectBuildingException)t; + if (pbe.getResults() != null) { + for (ProjectBuildingResult res : pbe.getResults()) { + if (projectFile.equals(res.getPomFile())) { + partial = res.getProject(); + break; + } + } + } + } + } + if (partial != null) { + toReturn.setContextValue(CONTEXT_PARTIAL_PROJECT, partial); + } + return toReturn; + + } + @NbBundle.Messages({ "LBL_Incomplete_Project_Name=<partially loaded Maven project>", "LBL_Incomplete_Project_Desc=Partially loaded Maven project; try building it." @@ -364,11 +413,16 @@ public final class MavenProjectCache { newproject.setName(Bundle.LBL_Incomplete_Project_Name()); newproject.setDescription(Bundle.LBL_Incomplete_Project_Desc()); newproject.setFile(projectFile); + newproject.setContextValue(CONTEXT_FALLBACK_PROJECT, true); return newproject; } public static boolean isFallbackproject(MavenProject prj) { - return "error".equals(prj.getGroupId()) && "error".equals(prj.getArtifactId()) && Bundle.LBL_Incomplete_Project_Name().equals(prj.getName()); + if ("error".equals(prj.getGroupId()) && "error".equals(prj.getArtifactId()) && Bundle.LBL_Incomplete_Project_Name().equals(prj.getName())) { + return true; + } else { + return prj.getContextValue(CONTEXT_PARTIAL_PROJECT) == Boolean.TRUE; + } } public static Properties createUserPropsForProjectLoading(Map<String, String> activeConfiguration) { diff --git a/java/maven/src/org/netbeans/modules/maven/problems/MavenModelProblemsProvider.java b/java/maven/src/org/netbeans/modules/maven/problems/MavenModelProblemsProvider.java index 3277d5a471..7fb3806f06 100644 --- a/java/maven/src/org/netbeans/modules/maven/problems/MavenModelProblemsProvider.java +++ b/java/maven/src/org/netbeans/modules/maven/problems/MavenModelProblemsProvider.java @@ -313,6 +313,7 @@ public class MavenModelProblemsProvider implements ProjectProblemsProvider, Inte } } a = new SanityBuildAction(project); + project.getLookup().lookup(NbMavenProject.class).getMavenProject().setContextValue("org.netbeans.modules.maven.problems.primingNotDone", true); cachedSanityBuild = new WeakReference<>(a); return a; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists