diff --git a/maven.grammar/src/org/netbeans/modules/maven/navigator/POMModelVisitor.java b/maven.grammar/src/org/netbeans/modules/maven/navigator/POMModelVisitor.java --- a/maven.grammar/src/org/netbeans/modules/maven/navigator/POMModelVisitor.java +++ b/maven.grammar/src/org/netbeans/modules/maven/navigator/POMModelVisitor.java @@ -46,7 +46,6 @@ import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; @@ -107,7 +106,6 @@ import org.netbeans.modules.maven.model.pom.Scm; import org.netbeans.modules.maven.model.pom.Site; import org.netbeans.modules.maven.model.pom.StringList; -import org.netbeans.modules.xml.xam.Model; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Node; @@ -150,25 +148,9 @@ @Override public void visit(Project target) { Project t = target; - if (t != null && (!t.isInDocumentModel() || !t.getModel().getState().equals(Model.State.VALID))) { - POMModel mdl = t.getModel(); - if (!mdl.getState().equals(Model.State.VALID)) { - try { - mdl.sync(); - } catch (IOException ex) { - LOG.log(Level.INFO, null, ex); - } - } - t = t.getModel().getProject(); - } //ordered by appearance in pom schema.. POMQNames names = parent.getPOMQNames(); - try { checkChildString(names.MODELVERSION, NbBundle.getMessage(POMModelVisitor.class, "MODEL_VERSION"), t != null ? t.getModelVersion() : null); - } catch (IllegalStateException x) { - LOG.log(Level.WARNING, "#190041: invalid model: {0}", x.toString()); - return; - } checkChildString(names.GROUPID, NbBundle.getMessage(POMModelVisitor.class, "GROUPID"), t != null ? t.getGroupId() : null); checkChildString(names.ARTIFACTID, NbBundle.getMessage(POMModelVisitor.class, "ARTIFACTID"), t != null ? t.getArtifactId() : null); if (count == 0 && t != null && t.getPackaging() != null) { @@ -1471,16 +1453,34 @@ private List rescan(POMModelVisitor visitor) { try { Method m = POMModelVisitor.class.getMethod("visit", type); //NOI18N - POMModel[] models = parentHolder.getSource(); - Object[] cuts = parentHolder.getCutValues(); - for (int i = 0; i < cuts.length; i++) { - Object cut = cuts[i]; - // prevent deadlock 185923 + for (Object cut : parentHolder.getCutValues()) { if (cut != null && !type.isInstance(cut)) { LOG.log(Level.WARNING, "#185428: {0} is not assignable to {1}", new Object[] {cut, type}); continue; } - synchronized (i < models.length ? models[i] : /*#192042*/new Object()) { + if (cut instanceof POMComponent) { + POMModel model = ((POMComponent) cut).getModel(); + if (model.startTransaction()) { + try { + if (!((POMComponent) cut).isInDocumentModel()) { + LOG.log(Level.WARNING, "#190041: entry of {0} is no longer valid, skipping", type.getSimpleName()); + continue; + } + switch (model.getState()) { + case VALID: + m.invoke(visitor, cut); + break; + default: + LOG.log(Level.WARNING, "skipping invalid ({0}) model", model.getState()); + } + } finally { + model.endTransaction(); + } + } else { + LOG.warning("could not start transaction"); + } + } else { + // XXX is this even possible? m.invoke(visitor, cut); } }