#153045: build.xml not displayed if not directly beneath project root
authorJesse Glick <jglick@netbeans.org>
Wed, 16 Nov 2011 16:51:43 -0500
changeset 17676c0b1876d8bf2
parent 17675 a0cb4cf1f44b
child 17677 20c617d40685
#153045: build.xml not displayed if not directly beneath project root
autoproject.java/src/org/netbeans/modules/autoproject/java/NodeFactoryImpl.java
     1.1 --- a/autoproject.java/src/org/netbeans/modules/autoproject/java/NodeFactoryImpl.java	Wed Nov 16 16:26:39 2011 -0500
     1.2 +++ b/autoproject.java/src/org/netbeans/modules/autoproject/java/NodeFactoryImpl.java	Wed Nov 16 16:51:43 2011 -0500
     1.3 @@ -39,8 +39,11 @@
     1.4  
     1.5  package org.netbeans.modules.autoproject.java;
     1.6  
     1.7 +import java.beans.PropertyChangeEvent;
     1.8 +import java.beans.PropertyChangeListener;
     1.9  import java.util.ArrayList;
    1.10  import java.util.List;
    1.11 +import java.util.Map;
    1.12  import javax.swing.event.ChangeEvent;
    1.13  import javax.swing.event.ChangeListener;
    1.14  import org.netbeans.api.java.project.JavaProjectConstants;
    1.15 @@ -48,11 +51,13 @@
    1.16  import org.netbeans.api.project.ProjectUtils;
    1.17  import org.netbeans.api.project.SourceGroup;
    1.18  import org.netbeans.api.project.Sources;
    1.19 +import org.netbeans.modules.autoproject.spi.Cache;
    1.20  import org.netbeans.modules.autoproject.spi.PathFinder;
    1.21  import org.netbeans.spi.java.project.support.ui.PackageView;
    1.22  import org.netbeans.spi.project.ui.support.NodeFactory;
    1.23  import org.netbeans.spi.project.ui.support.NodeList;
    1.24  import org.openide.filesystems.FileObject;
    1.25 +import org.openide.filesystems.FileUtil;
    1.26  import org.openide.loaders.DataObject;
    1.27  import org.openide.loaders.DataObjectNotFoundException;
    1.28  import org.openide.nodes.Node;
    1.29 @@ -73,7 +78,7 @@
    1.30          return new SourceChildren(p);
    1.31      }
    1.32  
    1.33 -    private class SourceChildren implements NodeList<Object>, ChangeListener {
    1.34 +    private class SourceChildren implements NodeList<Object>, ChangeListener, PropertyChangeListener {
    1.35  
    1.36          private final Project p;
    1.37          private final Sources src;
    1.38 @@ -86,10 +91,12 @@
    1.39  
    1.40          public void addNotify() {
    1.41              src.addChangeListener(this);
    1.42 +            Cache.addPropertyChangeListener(this);
    1.43          }
    1.44  
    1.45          public void removeNotify() {
    1.46              src.removeChangeListener(this);
    1.47 +            Cache.removePropertyChangeListener(this);
    1.48          }
    1.49  
    1.50          public Node node(Object key) {
    1.51 @@ -111,14 +118,36 @@
    1.52              cs.fireChange();
    1.53          }
    1.54  
    1.55 +        public void propertyChange(PropertyChangeEvent e) {
    1.56 +            cs.fireChange();
    1.57 +        }
    1.58 +
    1.59          public List<Object> keys() {
    1.60              List<Object> keys = new ArrayList<Object>();
    1.61              for (SourceGroup g : src.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA)) {
    1.62                  keys.add(g);
    1.63              }
    1.64 -            FileObject f = p.getProjectDirectory().getFileObject("build.xml");
    1.65 -            if (f != null) {
    1.66 -                keys.add(f);
    1.67 +            String actionPrefix = FileUtil.toFile(p.getProjectDirectory()) + Cache.ACTION;
    1.68 +            boolean foundBuildScript = false;
    1.69 +            for (Map.Entry<String,String> entry : Cache.pairs()) {
    1.70 +                if (!entry.getKey().startsWith(actionPrefix)) {
    1.71 +                    continue;
    1.72 +                }
    1.73 +                String binding = entry.getValue();
    1.74 +                String[] protocolScriptAndTargets = binding.split(":", 3);
    1.75 +                if (protocolScriptAndTargets[0].equals("ant")) {
    1.76 +                    FileObject script = p.getProjectDirectory().getFileObject(protocolScriptAndTargets[1]); // XXX accept also absolute paths
    1.77 +                    if (script != null) {
    1.78 +                        keys.add(script);
    1.79 +                        foundBuildScript = true;
    1.80 +                    }
    1.81 +                }
    1.82 +             }
    1.83 +            if (!foundBuildScript) {
    1.84 +                FileObject f = p.getProjectDirectory().getFileObject("build.xml");
    1.85 +                if (f != null) {
    1.86 +                    keys.add(f);
    1.87 +                }
    1.88              }
    1.89              keys.add("libraries");
    1.90              return keys;