--- j2ee.common/src/org/netbeans/modules/j2ee/common/project/WhiteListUpdater.java +++ j2ee.common/src/org/netbeans/modules/j2ee/common/project/WhiteListUpdater.java @@ -105,6 +105,7 @@ List projs = new ArrayList(); projs.add(p); //mkleint: see subprojectprovider for official contract, maybe classpath should be checked instead? see #210465 + //XXX since projectapi/1.53 there is a more specialized contract (ProjectDependenciesProvider) that might be more useful especially in maven projects. projs.addAll(p.getLookup().lookup(SubprojectProvider.class).getSubprojects()); for (Project pp : projs) { if (oldWhiteListId != null) { --- j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/session/SessionEJBWizardDescriptor.java +++ j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/session/SessionEJBWizardDescriptor.java @@ -230,6 +230,7 @@ return false; } //mkleint: see subprojectprovider for official contract, maybe classpath should be checked instead? see #210465 + //XXX since projectapi/1.53 there is a more specialized contract (ProjectDependenciesProvider) that might be more useful especially in maven projects. SubprojectProvider subprojectProvider = projectToCheck.getLookup().lookup(SubprojectProvider.class); if (subprojectProvider != null) { Set subprojects = subprojectProvider.getSubprojects(); --- j2ee.ejbrefactoring/src/org/netbeans/modules/j2ee/ejbrefactoring/EjbRefactoringFactory.java +++ j2ee.ejbrefactoring/src/org/netbeans/modules/j2ee/ejbrefactoring/EjbRefactoringFactory.java @@ -193,6 +193,7 @@ } //mkleint: see subprojectprovider for official contract, maybe classpath should be checked instead? see #210465 //in this case J2eeApplicationprovider might provide the same results though. + //XXX since projectapi/1.53 there is a more specialized contract (ProjectDependenciesProvider) that might be more useful especially in maven projects. Object obj = project.getLookup().lookup(SubprojectProvider.class); if ((obj != null) && (obj instanceof SubprojectProvider)) { Set subprojects = ((SubprojectProvider) obj).getSubprojects(); --- maven.apisupport/manifest.mf +++ maven.apisupport/manifest.mf @@ -2,5 +2,5 @@ OpenIDE-Module: org.netbeans.modules.maven.apisupport/1 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/maven/apisupport/Bundle.properties AutoUpdate-Show-In-Client: false -OpenIDE-Module-Specification-Version: 1.40 +OpenIDE-Module-Specification-Version: 1.41 --- maven.apisupport/nbproject/project.xml +++ maven.apisupport/nbproject/project.xml @@ -197,7 +197,7 @@ 1 - 1.18 + 1.53 --- maven.apisupport/src/org/netbeans/modules/maven/apisupport/IDEOutputListenerProvider.java +++ maven.apisupport/src/org/netbeans/modules/maven/apisupport/IDEOutputListenerProvider.java @@ -45,6 +45,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Set; import org.netbeans.modules.maven.api.classpath.ProjectSourcesClassPathProvider; import org.netbeans.modules.maven.api.output.OutputProcessor; import org.netbeans.modules.maven.api.output.OutputUtils; @@ -52,6 +53,7 @@ import org.netbeans.api.java.classpath.ClassPath; import org.netbeans.api.project.Project; import org.netbeans.spi.java.classpath.support.ClassPathSupport; +import org.netbeans.spi.project.DependencyProjectProvider; import org.netbeans.spi.project.SubprojectProvider; import org.openide.windows.OutputListener; @@ -68,7 +70,7 @@ "mojo-execute#nbm:run-ide", //NOI18N "mojo-execute#nbm:run-platform" //NOI18N }; - private Project project; + private final Project project; private ClassPath classpath; /** Creates a new instance of TestOutputListenerProvider */ @@ -84,8 +86,17 @@ list.addAll(Arrays.asList(cp)); //for pom packaging projects subprojects/modules matter SubprojectProvider spp = prj.getLookup().lookup(SubprojectProvider.class); + DependencyProjectProvider dpp = prj.getLookup().lookup(DependencyProjectProvider.class); + Set prjs = new HashSet(); + if (spp != null) { - for (Project sub : spp.getSubprojects()) { + prjs.addAll(spp.getSubprojects()); + } + if (dpp != null) { + prjs.addAll(dpp.getDependencyProjects()); + } + + for (Project sub : prjs) { if (parents.contains(sub)) { continue; } @@ -94,7 +105,6 @@ list.add(c); } } - } if (list.size() > 0) { return ClassPathSupport.createProxyClassPath(list.toArray(new ClassPath[list.size()])); } --- maven.j2ee/src/org/netbeans/modules/maven/j2ee/ExecutionChecker.java +++ maven.j2ee/src/org/netbeans/modules/maven/j2ee/ExecutionChecker.java @@ -44,6 +44,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.logging.Level; @@ -70,6 +71,7 @@ import org.netbeans.modules.maven.spi.debug.MavenDebugger; import org.netbeans.modules.web.browser.spi.URLDisplayerImplementation; import org.netbeans.spi.project.AuxiliaryProperties; +import org.netbeans.spi.project.DependencyProjectProvider; import org.netbeans.spi.project.ProjectConfiguration; import org.netbeans.spi.project.ProjectConfigurationProvider; import org.netbeans.spi.project.ProjectServiceProvider; @@ -356,11 +358,13 @@ MavenProjectSupport.changeServer(project, true); // refresh all subprojects - SubprojectProvider spp = targetPrj.getLookup().lookup(SubprojectProvider.class); - //mkleint: we are assuming complete result (transitive projects included) - //that's ok as far as the current maven impl goes afaik, but not according to the - //documentation for SubProjectprovider - Set childrenProjs = spp.getSubprojects(); + Set childrenProjs = new HashSet(); + recurseSubProjects(targetPrj, childrenProjs); + DependencyProjectProvider dpp = targetPrj.getLookup().lookup(DependencyProjectProvider.class); + if (dpp != null) { + childrenProjs.addAll(dpp.getDependencyProjects()); + } + if (!childrenProjs.contains(project)) { NbMavenProject.fireMavenProjectReload(project); } @@ -369,4 +373,15 @@ } } + + private static void recurseSubProjects(Project prj, Set collected) { + SubprojectProvider subs = prj.getLookup().lookup(SubprojectProvider.class); + if (subs != null) { + Set prjs = subs.getSubprojects(); + collected.addAll(prjs); + for (Project p : prjs) { + recurseSubProjects(p, collected); } + } + } +} --- maven/manifest.mf +++ maven/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.maven/2 -OpenIDE-Module-Specification-Version: 2.74 +OpenIDE-Module-Specification-Version: 2.75 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/maven/Bundle.properties OpenIDE-Module-Layer: org/netbeans/modules/maven/layer.xml AutoUpdate-Show-In-Client: false --- maven/nbproject/project.xml +++ maven/nbproject/project.xml @@ -257,7 +257,7 @@ 1 - 1.49 + 1.53 --- maven/src/org/netbeans/modules/maven/ActionProviderImpl.java +++ maven/src/org/netbeans/modules/maven/ActionProviderImpl.java @@ -589,11 +589,22 @@ @Override public void run() { //mkleint: usage of subprojectprovider is correct here - SubprojectProvider subs = project.getLookup().lookup(SubprojectProvider.class); - Set lst = subs.getSubprojects(); + Set lst = new HashSet(); + recurse(project, lst); Project[] arr = lst.toArray(new Project[lst.size()]); OpenProjects.getDefault().close(arr); } + + private void recurse(Project prj, Set collected) { + SubprojectProvider subs = prj.getLookup().lookup(SubprojectProvider.class); + if (subs != null) { + Set prjs = subs.getSubprojects(); + collected.addAll(prjs); + for (Project p : prjs) { + recurse(p, collected); + } + } + } }); } --- maven/src/org/netbeans/modules/maven/DependencyProviderImpl.java +++ maven/src/org/netbeans/modules/maven/DependencyProviderImpl.java @@ -45,10 +45,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; -import java.io.IOException; -import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Set; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -56,12 +53,8 @@ import org.netbeans.modules.maven.api.NbMavenProject; import org.netbeans.modules.maven.queries.MavenFileOwnerQueryImpl; import org.netbeans.api.project.Project; -import org.netbeans.api.project.ProjectManager; +import org.netbeans.spi.project.DependencyProjectProvider; import org.netbeans.spi.project.ProjectServiceProvider; -import org.netbeans.spi.project.SubprojectProvider; -import org.openide.ErrorManager; -import org.openide.filesystems.FileObject; -import org.openide.filesystems.FileUtil; import org.openide.util.ChangeSupport; import org.openide.util.Utilities; import org.openide.util.WeakListeners; @@ -71,15 +64,15 @@ * and can be build as one unit. Uses maven multiproject infrastructure. (maven.multiproject.includes) * @author Milos Kleint */ -@ProjectServiceProvider(service=SubprojectProvider.class, projectType="org-netbeans-modules-maven") -public class SubprojectProviderImpl implements SubprojectProvider { +@ProjectServiceProvider(service=DependencyProjectProvider.class, projectType="org-netbeans-modules-maven") +public class DependencyProviderImpl implements DependencyProjectProvider { private final Project project; private final ChangeSupport cs = new ChangeSupport(this); private final ChangeListener listener2; private final PropertyChangeListener propertyChange; - public SubprojectProviderImpl(Project proj) { + public DependencyProviderImpl(Project proj) { project = proj; propertyChange = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -99,23 +92,16 @@ } - @Override public Set getSubprojects() { + @Override public Set getDependencyProjects() { Set projects = new HashSet(); - File basedir = FileUtil.toFile(project.getProjectDirectory()); - try { - addProjectModules(basedir, projects, project.getLookup().lookup(NbMavenProject.class).getMavenProject().getModules()); - } catch (InterruptedException x) { - // can be interrupted in the open project dialog.. - return Collections.emptySet(); - } addKnownOwners(projects); projects.remove(project); return projects; } private void addKnownOwners(Set resultset) { - List compileArtifacts = project.getLookup().lookup(NbMavenProject.class).getMavenProject().getCompileArtifacts(); - for (Artifact ar : compileArtifacts) { + Set artifacts = project.getLookup().lookup(NbMavenProject.class).getMavenProject().getDependencyArtifacts(); + for (Artifact ar : artifacts) { File f = ar.getFile(); if (f != null) { Project p = MavenFileOwnerQueryImpl.getInstance().getOwner(Utilities.toURI(f)); @@ -126,68 +112,6 @@ } } - private boolean isProcessed(Set resultset, FileObject projectDir) { - - for (Project p : resultset) { - if (p.getProjectDirectory().equals(projectDir)) { - return true; - } - } - - return false; - } - - private void addProjectModules(File basedir, Set resultset, List modules) throws InterruptedException { - if (modules == null) { - return; - } - for (String path : modules) { - if (Thread.interrupted()) { - throw new InterruptedException(); - } - if (path.trim().length() == 0) { - //#175331 - continue; - } - File sub = new File(basedir, path); - File projectFile = FileUtil.normalizeFile(sub); - if (!projectFile.equals(basedir) //#175331 - && projectFile.exists()) { - FileObject projectDir = FileUtil.toFileObject(projectFile); - if (projectDir != null && projectDir.isFolder() && !isProcessed(resultset, projectDir)) { - Project proj = processOneSubproject(projectDir); - NbMavenProjectImpl mv = proj != null ? proj.getLookup().lookup(NbMavenProjectImpl.class) : null; - if (mv != null) { - // ignore the pom type projects when resolving subprojects.. - // maybe make an user settable option?? - if (!NbMavenProject.TYPE_POM.equalsIgnoreCase(mv.getProjectWatcher().getPackagingType())) { - resultset.add(proj); - } - addProjectModules(FileUtil.toFile(mv.getProjectDirectory()), - resultset, mv.getOriginalMavenProject().getModules()); - } - } else { - // HUH? - ErrorManager.getDefault().log("fileobject not found=" + sub); //NOI18N - } - } else { - ErrorManager.getDefault().log("project file not found=" + sub); //NOI18N - } - } - } - - private Project processOneSubproject(FileObject projectDir) { - - - try { - return ProjectManager.getDefault().findProject(projectDir); - } catch (IOException exc) { - ErrorManager.getDefault().notify(exc); - } - - return null; - } - @Override public synchronized void addChangeListener(ChangeListener changeListener) { if (!cs.hasListeners()) { project.getLookup().lookup(NbMavenProject.class).addPropertyChangeListener(propertyChange); --- maven/src/org/netbeans/modules/maven/SubprojectProviderImpl.java +++ maven/src/org/netbeans/modules/maven/SubprojectProviderImpl.java @@ -50,11 +50,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import org.apache.maven.artifact.Artifact; import org.netbeans.modules.maven.api.NbMavenProject; -import org.netbeans.modules.maven.queries.MavenFileOwnerQueryImpl; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectManager; import org.netbeans.spi.project.ProjectServiceProvider; @@ -63,11 +60,9 @@ import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.ChangeSupport; -import org.openide.util.Utilities; -import org.openide.util.WeakListeners; /** - * finds subprojects (projects this one depends on) that are locally available + * finds subprojects that are locally available * and can be build as one unit. Uses maven multiproject infrastructure. (maven.multiproject.includes) * @author Milos Kleint */ @@ -76,7 +71,6 @@ private final Project project; private final ChangeSupport cs = new ChangeSupport(this); - private final ChangeListener listener2; private final PropertyChangeListener propertyChange; public SubprojectProviderImpl(Project proj) { @@ -88,15 +82,7 @@ } } }; - listener2 = new ChangeListener() { - @Override public void stateChanged(ChangeEvent event) { - cs.fireChange(); } - }; - MavenFileOwnerQueryImpl.getInstance().addChangeListener( - WeakListeners.change(listener2, - MavenFileOwnerQueryImpl.getInstance())); - } @Override public Set getSubprojects() { @@ -108,24 +94,10 @@ // can be interrupted in the open project dialog.. return Collections.emptySet(); } - addKnownOwners(projects); projects.remove(project); return projects; } - private void addKnownOwners(Set resultset) { - List compileArtifacts = project.getLookup().lookup(NbMavenProject.class).getMavenProject().getCompileArtifacts(); - for (Artifact ar : compileArtifacts) { - File f = ar.getFile(); - if (f != null) { - Project p = MavenFileOwnerQueryImpl.getInstance().getOwner(Utilities.toURI(f)); - if (p != null) { - resultset.add(p); - } - } - } - } - private boolean isProcessed(Set resultset, FileObject projectDir) { for (Project p : resultset) { @@ -158,14 +130,11 @@ Project proj = processOneSubproject(projectDir); NbMavenProjectImpl mv = proj != null ? proj.getLookup().lookup(NbMavenProjectImpl.class) : null; if (mv != null) { - // ignore the pom type projects when resolving subprojects.. - // maybe make an user settable option?? - if (!NbMavenProject.TYPE_POM.equalsIgnoreCase(mv.getProjectWatcher().getPackagingType())) { resultset.add(proj); +//make non recursive, only direct modules are required to be included. +// addProjectModules(FileUtil.toFile(mv.getProjectDirectory()), +// resultset, mv.getOriginalMavenProject().getModules()); } - addProjectModules(FileUtil.toFile(mv.getProjectDirectory()), - resultset, mv.getOriginalMavenProject().getModules()); - } } else { // HUH? ErrorManager.getDefault().log("fileobject not found=" + sub); //NOI18N --- profiler.loadgen/src/org/netbeans/modules/profiler/loadgen/LoadGenPluginImpl.java +++ profiler.loadgen/src/org/netbeans/modules/profiler/loadgen/LoadGenPluginImpl.java @@ -265,6 +265,9 @@ if (traverse) { // process possible subprojects //mkleint: see subprojectprovider for official contract, see #210465 + //XXX mkleint subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. + SubprojectProvider spp = project.getLookup().lookup(SubprojectProvider.class); if (spp != null) { for (Iterator it = spp.getSubprojects().iterator(); it.hasNext();) { --- profiler.nbimpl/src/org/netbeans/modules/profiler/nbimpl/project/ProjectUtilities.java +++ profiler.nbimpl/src/org/netbeans/modules/profiler/nbimpl/project/ProjectUtilities.java @@ -605,6 +605,9 @@ public static void fetchSubprojects(final Project project, final Set projects) { // process possible subprojects + //XXX mkleint subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. + // see issue #210465 SubprojectProvider spp = project.getLookup().lookup(SubprojectProvider.class); if (spp != null) { @@ -863,6 +866,9 @@ if (traverse) { // process possible subprojects //mkleint: see subprojectprovider for official contract, see #210465 + //XXX mkleint subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. + SubprojectProvider spp = project.getLookup().lookup(SubprojectProvider.class); if (spp != null) { --- profiler.projectsupport/src/org/netbeans/modules/profiler/projectsupport/utilities/ProjectUtilities.java +++ profiler.projectsupport/src/org/netbeans/modules/profiler/projectsupport/utilities/ProjectUtilities.java @@ -323,6 +323,8 @@ public static void fetchSubprojects(final Project project, final Set projects) { // process possible subprojects //mkleint: see subprojectprovider for official contract, see #210465 + //XXX subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. SubprojectProvider spp = project.getLookup().lookup(SubprojectProvider.class); if (spp != null) { @@ -493,6 +495,8 @@ if (traverse) { // process possible subprojects //mkleint: see subprojectprovider for official contract, maybe classpath should be checked instead? see #210465 + //XXX subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. SubprojectProvider spp = project.getLookup().lookup(SubprojectProvider.class); if (spp != null) { @@ -545,6 +549,8 @@ public static boolean hasSubprojects(Project project) { if (project == null) return false; + //XXX mkleint subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. SubprojectProvider spp = project.getLookup().lookup(SubprojectProvider.class); if (spp == null) { --- projectapi/apichanges.xml +++ projectapi/apichanges.xml @@ -107,6 +107,30 @@ + + + + + + + + + +

+ Newly introduced interface DependencyProjectProvider is meant as less general replacement for SubprojectProvider + as it's explicitly declaring it's contract to be the project's dependency projects. Code using SubprojectProvider currently + should evaluate if DependencyProjectProvider contract suits their usage. Please note that DependencyProjectProvider is not + mandatory for project types to implement and if it's missing, SubprojectProvider should be used. +

+

+ Implementation note: In Maven based projects, SubprojectProvider no longer returns project dependendencies and only returns submodules for + projects with pom packaging. DependencyProjectProvider is now the one returning project dependencies as the list depends on currently opened project list. +

+
+ + +
+ New method createCompositeLookup(Lookup, Lookup) in LookupProviderSupport --- projectapi/manifest.mf +++ projectapi/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.projectapi/1 -OpenIDE-Module-Specification-Version: 1.52 +OpenIDE-Module-Specification-Version: 1.53 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/projectapi/Bundle.properties OpenIDE-Module-Layer: org/netbeans/modules/projectapi/layer.xml --- projectapi/src/org/netbeans/spi/project/DependencyProjectProvider.java +++ projectapi/src/org/netbeans/spi/project/DependencyProjectProvider.java @@ -0,0 +1,74 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2013 Sun Microsystems, Inc. + */ + +package org.netbeans.spi.project; + +import java.util.Set; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; + +/** + * This is a less vague variant of the SubprojectProvider for code + * that wants to access project's dependencies that are also projects. + * Unlike some java level API this doesn't distinguish between compile, runtime, test level dependencies. + * The implementation by project types is nonmandatory and if it's missing in the project's lookup, users should fallback to SubprojectProvider + * @see Project#getLookup + * @author mkleint + * @since 1.53 + */ +public interface DependencyProjectProvider { + + Set getDependencyProjects(); + + /** + * Add a listener to changes in the set of dependency projects. + * @param listener a listener to add + */ + void addChangeListener(ChangeListener listener); + + /** + * Remove a listener to changes in the set of dependency projects. + * @param listener a listener to remove + */ + void removeChangeListener(ChangeListener listener); + +} --- projectapi/src/org/netbeans/spi/project/SubprojectProvider.java +++ projectapi/src/org/netbeans/spi/project/SubprojectProvider.java @@ -54,6 +54,9 @@ * but typically subprojects would be "built" as part of this project or somehow * used in it as dependencies; or they may just be contained or agglomerated in * it somehow. + * Note:Since 1.53, there is a more specifically defined variant DependencyProjectProvider that if defined in project provides a list of + * projects the current project depends on. In some project types ( currently maven support) that is the preferred and supported way of getting project's dependency projects. + * The SubprojectProvider implementation is then used just to point to aggregator's module projects that are built together but have no direct dependencies on) * @see Project#getLookup * @see ReferenceHelper.createSubprojectProvider * @author Jesse Glick --- spi.debugger.ui/src/org/netbeans/modules/debugger/ui/models/BreakpointGroup.java +++ spi.debugger.ui/src/org/netbeans/modules/debugger/ui/models/BreakpointGroup.java @@ -58,6 +58,7 @@ import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.ui.OpenProjects; +import org.netbeans.spi.project.DependencyProjectProvider; import org.netbeans.spi.project.SubprojectProvider; import org.openide.filesystems.FileObject; @@ -425,14 +426,19 @@ private static boolean isSubProjectOf(Project p, Project op, Map> subProjects, // cache of sub-projects Set allSubProjects) { // all inspected sub-projects - Set sps = subProjects.get(op); + Set sps = (Set) subProjects.get(op); if (sps == null) { + sps = new HashSet(); //mkleint: see subprojectprovider for official contract, see #210465 SubprojectProvider spp = op.getLookup().lookup(SubprojectProvider.class); - if (spp == null) { - return false; + if (spp != null) { + sps.addAll(spp.getSubprojects()); } - sps = spp.getSubprojects(); + // maven non-pom projects now only provide this list of dependency projects, not subprojects above + DependencyProjectProvider dpp = op.getLookup().lookup(DependencyProjectProvider.class); + if (dpp != null) { + sps.addAll(dpp.getDependencyProjects()); + } subProjects.put(op, sps); } for (Project sp : sps) { --- subversion/src/org/netbeans/modules/subversion/ui/update/UpdateWithDependenciesAction.java +++ subversion/src/org/netbeans/modules/subversion/ui/update/UpdateWithDependenciesAction.java @@ -123,8 +123,9 @@ Project project = (Project) node.getLookup().lookup(Project.class); projectsToUpdate.add(project); //mkleint: see subprojectprovider for official contract, see #210465 - // do we care if all or just the direct subprojects are included? - SubprojectProvider deps = (SubprojectProvider) project.getLookup().lookup(SubprojectProvider.class); + //XXX do we care if all or just the direct subprojects are included? + //XXX maybe also DependencyProjectProvider should be checked? + SubprojectProvider deps = project.getLookup().lookup(SubprojectProvider.class); if(deps != null) { Set children = deps.getSubprojects(); for (Project child : children) { --- versioning.util/src/org/netbeans/modules/versioning/util/ProjectUtilities.java +++ versioning.util/src/org/netbeans/modules/versioning/util/ProjectUtilities.java @@ -242,7 +242,9 @@ * @return collection of direct subprojects */ public static Set getSubProjects (Project p) { - Set subprojects = null; + Set subprojects; + //XXX mkleint subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. SubprojectProvider spp = p.getLookup().lookup(SubprojectProvider.class); if (spp != null) { subprojects = spp.getSubprojects(); @@ -263,6 +265,8 @@ Set subprojects = cache.get(p); if (subprojects == null) { // p's subprojects have not yet been searched + //XXX mkleint subprojectProvider semantics is fairly vague, + // there is also a new DependencyProjectProvider contract that is more specific. SubprojectProvider spp = p.getLookup().lookup(SubprojectProvider.class); if (spp != null) { subprojects = spp.getSubprojects(); --- xml/src/org/netbeans/modules/xml/wizard/impl/SchemaImportGUI.form +++ xml/src/org/netbeans/modules/xml/wizard/impl/SchemaImportGUI.form @@ -1,4 +1,4 @@ - +
--- xml/src/org/netbeans/modules/xml/wizard/impl/SchemaImportGUI.java +++ xml/src/org/netbeans/modules/xml/wizard/impl/SchemaImportGUI.java @@ -241,6 +241,7 @@ DataFolder folder = templateWizard.getTargetFolder(); Project project = FileOwnerQuery.getOwner(folder.getPrimaryFile()); //mkleint: see subprojectprovider for official contract, see #210465 + //XXX maybe also DependencyProjectProvider should be checked? SubprojectProvider provider = (SubprojectProvider)project.getLookup().lookup(SubprojectProvider.class); Set refProjects = null;