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

Reply via email to