This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 182407
Collapse All | Expand All

(-)a/maven.j2ee/nbproject/project.xml (-1 / +1 lines)
Lines 299-305 Link Here
299
                    <compile-dependency/>
299
                    <compile-dependency/>
300
                    <run-dependency>
300
                    <run-dependency>
301
                        <release-version>1</release-version>
301
                        <release-version>1</release-version>
302
                        <specification-version>1.18</specification-version>
302
                        <specification-version>1.56</specification-version>
303
                    </run-dependency>
303
                    </run-dependency>
304
                </dependency>
304
                </dependency>
305
                <dependency>
305
                <dependency>
(-)a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/Bundle.properties (-1 lines)
Lines 42-48 Link Here
42
OpenIDE-Module-Name=Maven Java EE
42
OpenIDE-Module-Name=Maven Java EE
43
OpenIDE-Module-Long-Description=Java EE-related parts of the Maven project type.
43
OpenIDE-Module-Long-Description=Java EE-related parts of the Maven project type.
44
44
45
LBL_WebPages=Web Pages
46
45
47
# Usage logging when an Maven enterprise project is opened
46
# Usage logging when an Maven enterprise project is opened
48
# {0} Server name
47
# {0} Server name
(-)a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/J2eeMavenSourcesImpl.java (-57 / +60 lines)
Lines 44-64 Link Here
44
44
45
import java.beans.PropertyChangeEvent;
45
import java.beans.PropertyChangeEvent;
46
import java.beans.PropertyChangeListener;
46
import java.beans.PropertyChangeListener;
47
import java.util.ArrayList;
48
import java.util.Collection;
49
import java.util.List;
47
import javax.swing.event.ChangeListener;
50
import javax.swing.event.ChangeListener;
48
import org.netbeans.modules.maven.api.FileUtilities;
49
import org.netbeans.modules.maven.api.NbMavenProject;
51
import org.netbeans.modules.maven.api.NbMavenProject;
50
import org.netbeans.api.project.Project;
52
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.SourceGroup;
53
import org.netbeans.api.project.SourceGroup;
52
import org.netbeans.api.project.Sources;
54
import org.netbeans.api.project.Sources;
53
import org.netbeans.modules.maven.spi.nodes.OtherSourcesExclude;
55
import org.netbeans.modules.maven.spi.nodes.OtherSourcesExclude;
56
import org.netbeans.modules.web.common.spi.ProjectWebRootProvider;
54
import org.netbeans.spi.project.ProjectServiceProvider;
57
import org.netbeans.spi.project.ProjectServiceProvider;
55
import org.netbeans.spi.project.support.GenericSources;
58
import org.netbeans.spi.project.support.GenericSources;
56
import org.openide.filesystems.FileObject;
59
import org.openide.filesystems.FileObject;
57
import org.openide.util.ChangeSupport;
60
import org.openide.util.ChangeSupport;
58
import org.openide.util.NbBundle;
61
import org.openide.util.NbBundle;
62
import static org.netbeans.modules.maven.j2ee.Bundle.*;
59
63
60
/**
64
/**
61
 * Implementation of Sources interface for Java EE Maven projects
65
 * Implementation of {@link Sources} interface for Java EE Maven projects.
66
 *
67
 * This class is <i>thread safe</i>.
68
 *
62
 * @author  Milos Kleint
69
 * @author  Milos Kleint
63
 */
70
 */
64
@ProjectServiceProvider(
71
@ProjectServiceProvider(
Lines 77-93 Link Here
77
)
84
)
78
public class J2eeMavenSourcesImpl implements Sources, OtherSourcesExclude {
85
public class J2eeMavenSourcesImpl implements Sources, OtherSourcesExclude {
79
    
86
    
80
    public static final String TYPE_DOC_ROOT="doc_root"; //NOI18N
87
    public static final String TYPE_DOC_ROOT = "doc_root"; // NOI18N
81
    public static final String TYPE_WEB_INF="web_inf"; //NOI18N
88
    public static final String TYPE_WEB_INF  = "web_inf";  // NOI18N
82
    
89
83
    private final Object lock = new Object();
84
    private final Project project;
90
    private final Project project;
85
    private final ChangeSupport cs = new ChangeSupport(this);
91
    private final ChangeSupport cs = new ChangeSupport(this);
86
    private final PropertyChangeListener pcl;
92
    private final PropertyChangeListener pcl;
87
    
88
    private SourceGroup webDocSrcGroup;
89
93
90
    
94
    // @GuardedBy("this")
95
    private List<SourceGroup> webResourceRoots;
96
97
91
    public J2eeMavenSourcesImpl(Project project) {
98
    public J2eeMavenSourcesImpl(Project project) {
92
        this.project = project;
99
        this.project = project;
93
        this.pcl = new PropertyChangeListener() {
100
        this.pcl = new PropertyChangeListener() {
Lines 95-116 Link Here
95
            @Override
102
            @Override
96
            public void propertyChange(PropertyChangeEvent event) {
103
            public void propertyChange(PropertyChangeEvent event) {
97
                if (NbMavenProject.PROP_PROJECT.equals(event.getPropertyName())) {
104
                if (NbMavenProject.PROP_PROJECT.equals(event.getPropertyName())) {
98
                    checkChanges();
105
                    if (hasChanged()) {
106
                        cs.fireChange();
107
                    }
99
                }
108
                }
100
            }
109
            }
101
        };
110
        };
102
    }
111
    }
103
    
112
104
    private void checkChanges() {
113
    private boolean hasChanged() {
105
        boolean changed;
114
        List<SourceGroup> resourceRoots = getWebSourceGroups();
106
        synchronized (lock) {
115
107
            changed = checkWebDocGroupCache(getWebAppDir());
116
        synchronized (this) {
117
            if (!this.webResourceRoots.equals(resourceRoots)) {
118
                // Set the cached value to the current resource roots
119
                this.webResourceRoots = resourceRoots;
120
                return true;
121
            }
108
        }
122
        }
109
        if (changed) {
123
110
            cs.fireChange();
124
        return false;
111
        }
112
    }
125
    }
113
    
126
114
    @Override
127
    @Override
115
    public void addChangeListener(ChangeListener changeListener) {
128
    public void addChangeListener(ChangeListener changeListener) {
116
        // If no listener were registered until now, start listening at project changes
129
        // If no listener were registered until now, start listening at project changes
Lines 129-184 Link Here
129
            NbMavenProject.removePropertyChangeListener(project, pcl);
142
            NbMavenProject.removePropertyChangeListener(project, pcl);
130
        }
143
        }
131
    }
144
    }
132
    
145
133
    @Override
146
    @Override
134
    public SourceGroup[] getSourceGroups(String str) {
147
    public SourceGroup[] getSourceGroups(String str) {
135
        if (TYPE_DOC_ROOT.equals(str)) {
148
        if (TYPE_DOC_ROOT.equals(str)) {
136
            return createWebDocRoot();
149
            synchronized (this) {
150
                if (webResourceRoots == null) {
151
                    webResourceRoots = getWebSourceGroups();
152
                }
153
                return webResourceRoots.toArray(new SourceGroup[webResourceRoots.size()]);
154
            }
137
        }
155
        }
138
        return new SourceGroup[0];
156
        return new SourceGroup[0];
139
    }
157
    }
140
    
158
141
    private SourceGroup[] createWebDocRoot() {
159
    private List<SourceGroup> getWebSourceGroups() {
142
        FileObject folder = getWebAppDir();
160
        List<SourceGroup> sourceGroups = new ArrayList<>();
143
        SourceGroup grp;
161
144
        synchronized (lock) {
162
        ProjectWebRootProvider webRootProvider = project.getLookup().lookup(ProjectWebRootProvider.class);
145
            checkWebDocGroupCache(folder);
163
        if (webRootProvider != null) {
146
            grp = webDocSrcGroup;
164
            Collection<FileObject> webRoots = webRootProvider.getWebRoots();
165
            for (FileObject webRoot : webRoots) {
166
                sourceGroups.add(GenericSources.group(project, webRoot, TYPE_DOC_ROOT, getDisplayName(webRoot), null, null));
167
            }
147
        }
168
        }
148
        if (grp != null) {
169
149
            return new SourceGroup[] {grp};
170
        return sourceGroups;
171
    }
172
173
    @NbBundle.Messages("LBL_WebPages=Web Pages")
174
    private String getDisplayName(FileObject webRoot) {
175
        // To preserve current behavior, don't show web root name in the node name for default "webapp"
176
        if ("webapp".equals(webRoot.getName())) { // NOI18N
177
            return LBL_WebPages();
150
        } else {
178
        } else {
151
            return new SourceGroup[0];
179
            return LBL_WebPages() + " (" + webRoot.getName() + ")"; // NOI18N
152
        }
180
        }
153
    }
181
    }
154
    
155
    private FileObject getWebAppDir() {
156
        NbMavenProject mavenproject = project.getLookup().lookup(NbMavenProject.class);
157
        return FileUtilities.convertURItoFileObject(mavenproject.getWebAppDirectory());
158
    }
159
    
160
    /**
161
     * consult the SourceGroup cache, return true if anything changed..
162
     */
163
    private boolean checkWebDocGroupCache(FileObject root) {
164
        if (root == null && webDocSrcGroup != null) {
165
            webDocSrcGroup = null;
166
            return true;
167
        }
168
        if (root == null) {
169
            return false;
170
        }
171
        boolean changed = false;
172
        if (webDocSrcGroup == null || !webDocSrcGroup.getRootFolder().equals(root)) {
173
            webDocSrcGroup = GenericSources.group(project, root, TYPE_DOC_ROOT, NbBundle.getMessage(J2eeMavenSourcesImpl.class, "LBL_WebPages"), null, null);
174
            changed = true;
175
        }
176
        return changed;
177
    }
178
182
179
    @Override
183
    @Override
180
    public String folderName() {
184
    public String folderName() {
181
        return "webapp";
185
        return "webapp"; // NOI18N
182
    }
186
    }
183
    
184
}
187
}
(-)a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/nodes/Bundle.properties (-41 lines)
Lines 1-41 Link Here
1
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
2
#
3
# Copyright 2013 Oracle and/or its affiliates. All rights reserved.
4
#
5
# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
6
# Other names may be trademarks of their respective owners.
7
#
8
# The contents of this file are subject to the terms of either the GNU
9
# General Public License Version 2 only ("GPL") or the Common
10
# Development and Distribution License("CDDL") (collectively, the
11
# "License"). You may not use this file except in compliance with the
12
# License. You can obtain a copy of the License at
13
# http://www.netbeans.org/cddl-gplv2.html
14
# or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
15
# specific language governing permissions and limitations under the
16
# License.  When distributing the software, include this License Header
17
# Notice in each file and include the License file at
18
# nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
19
# particular file as subject to the "Classpath" exception as provided
20
# by Oracle in the GPL Version 2 section of the License file that
21
# accompanied this code. If applicable, add the following below the
22
# License Header, with the fields enclosed by brackets [] replaced by
23
# your own identifying information:
24
# "Portions Copyrighted [year] [name of copyright owner]"
25
#
26
# If you wish your version of this file to be governed by only the CDDL
27
# or only the GPL Version 2, indicate your decision by adding
28
# "[Contributor] elects to include this software in this distribution
29
# under the [CDDL or GPL Version 2] license." If you do not indicate a
30
# single choice of license, a recipient has the option to distribute
31
# your version of this file under either the CDDL, the GPL Version 2 or
32
# to extend the choice of license to its licensees as provided above.
33
# However, if you add GPL Version 2 code and therefore, elected the GPL
34
# Version 2 license, then the option applies only if the new code is
35
# made subject to such option by the copyright holder.
36
#
37
# Contributor(s):
38
#
39
# Portions Copyrighted 2013 Sun Microsystems, Inc.
40
41
LBL_Web_Pages=Web Pages
(-)a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/nodes/WebPagesNode.java (-5 / +15 lines)
Lines 55-66 Link Here
55
import org.openide.nodes.Node;
55
import org.openide.nodes.Node;
56
import org.openide.util.ImageUtilities;
56
import org.openide.util.ImageUtilities;
57
import org.openide.util.NbBundle;
57
import org.openide.util.NbBundle;
58
import static org.netbeans.modules.maven.j2ee.ui.nodes.Bundle.*;
58
59
59
60
60
/**
61
/**
61
 * filter node for display of web sources
62
 * filter node for display of web sources
62
 * @author  Milos Kleint 
63
 * @author  Milos Kleint 
63
 */
64
 */
65
@NbBundle.Messages("LBL_Web_Pages=Web Pages")
64
class WebPagesNode extends FilterNode {
66
class WebPagesNode extends FilterNode {
65
    private boolean isTopLevelNode = false;
67
    private boolean isTopLevelNode = false;
66
    private FileObject file;
68
    private FileObject file;
Lines 81-95 Link Here
81
    @Override
83
    @Override
82
    public String getDisplayName() {
84
    public String getDisplayName() {
83
        if (isTopLevelNode) {
85
        if (isTopLevelNode) {
84
            String s = NbBundle.getMessage(WebPagesNode.class, "LBL_Web_Pages");
86
            String webRootName = file.getName();
85
            
87
            String displayName;
88
89
            // To preserve current behavior, don't show web root name in the node name for default "webapp"
90
            if ("webapp".equals(webRootName)) { // NOI18N
91
                displayName = LBL_Web_Pages();
92
            } else {
93
                displayName = LBL_Web_Pages() + " (" + file.getName() + ")"; // NOI18N
94
            }
95
86
            try {
96
            try {
87
                s = file.getFileSystem().getStatus().annotateName(s, Collections.singleton(file));
97
                displayName = file.getFileSystem().getStatus().annotateName(displayName, Collections.singleton(file));
88
            } catch (FileStateInvalidException e) {
98
            } catch (FileStateInvalidException e) {
89
                ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e);
99
                ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e);
90
            }
100
            }
91
            
101
            
92
            return s;
102
            return displayName;
93
        }
103
        }
94
        return getOriginal().getDisplayName();
104
        return getOriginal().getDisplayName();
95
        
105
        
Lines 105-111 Link Here
105
             if (stat instanceof FileSystem.HtmlStatus) {
115
             if (stat instanceof FileSystem.HtmlStatus) {
106
                 FileSystem.HtmlStatus hstat = (FileSystem.HtmlStatus) stat;
116
                 FileSystem.HtmlStatus hstat = (FileSystem.HtmlStatus) stat;
107
117
108
                String s = NbBundle.getMessage(WebPagesNode.class, "LBL_Web_Pages");
118
                 String s = LBL_Web_Pages();
109
                 String result = hstat.annotateNameHtml (
119
                 String result = hstat.annotateNameHtml (
110
                     s, Collections.singleton(file));
120
                     s, Collections.singleton(file));
111
121
(-)a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebProjectWebRootProvider.java (-27 / +6 lines)
Lines 51-65 Link Here
51
import org.netbeans.api.project.Project;
51
import org.netbeans.api.project.Project;
52
import org.netbeans.modules.maven.api.NbMavenProject;
52
import org.netbeans.modules.maven.api.NbMavenProject;
53
import org.netbeans.modules.maven.api.PluginPropertyUtils;
53
import org.netbeans.modules.maven.api.PluginPropertyUtils;
54
import org.netbeans.modules.web.api.webmodule.WebModule;
55
import org.netbeans.modules.web.common.spi.ProjectWebRootProvider;
54
import org.netbeans.modules.web.common.spi.ProjectWebRootProvider;
56
import org.netbeans.modules.web.spi.webmodule.WebModuleProvider;
57
import org.netbeans.spi.project.ProjectServiceProvider;
55
import org.netbeans.spi.project.ProjectServiceProvider;
58
import org.openide.filesystems.FileObject;
56
import org.openide.filesystems.FileObject;
59
import org.openide.util.Exceptions;
57
import org.openide.util.Exceptions;
60
58
61
/**
59
/**
62
 * This class is <i>thread safe</i>.
60
 * This class is immutable and thus <i>thread safe</i>.
63
 *
61
 *
64
 * @author marekfukala
62
 * @author marekfukala
65
 * @author Martin Janicek <mjanicek@netbeans.org>
63
 * @author Martin Janicek <mjanicek@netbeans.org>
Lines 77-84 Link Here
77
75
78
    private final Project project;
76
    private final Project project;
79
    private final FileObject projectDir;
77
    private final FileObject projectDir;
80
    // @GuardedBy("this")
81
    private WebModuleProvider webModuleProvider;
82
78
83
79
84
    public WebProjectWebRootProvider(Project project) {
80
    public WebProjectWebRootProvider(Project project) {
Lines 86-103 Link Here
86
        this.projectDir = project.getProjectDirectory();
82
        this.projectDir = project.getProjectDirectory();
87
    }
83
    }
88
84
89
    private synchronized WebModuleProvider getProvider() {
90
        if (webModuleProvider == null) {
91
            webModuleProvider = project.getLookup().lookup(WebModuleProvider.class);
92
        }
93
        return webModuleProvider;
94
    }
95
96
    @Override
85
    @Override
97
    public FileObject getWebRoot(FileObject file) {
86
    public FileObject getWebRoot(FileObject file) {
98
        WebModuleProvider provider = getProvider();
87
        return getDefaultWebRoot();
99
        WebModule wm = provider != null ? provider.findWebModule(file) : null;
100
        return wm != null ? wm.getDocumentBase() : null;
101
    }
88
    }
102
89
103
    @Override
90
    @Override
Lines 130-148 Link Here
130
    }
117
    }
131
118
132
    private FileObject getDefaultWebRoot() {
119
    private FileObject getDefaultWebRoot() {
133
        WebModuleProvider provider = getProvider();
120
        String webSourceDir = WebProjectUtils.getPluginProperty(project, "warSourceDirectory"); // NOI18N
134
        if (provider == null) {
121
        if (webSourceDir == null) {
135
            return null;
122
            webSourceDir = "src/main/webapp"; // NOI18N
136
        }
123
        }
137
        WebModule webModule = provider.findWebModule(project.getProjectDirectory());
124
        return projectDir.getFileObject(webSourceDir);
138
        if (webModule == null) {
139
            return null;
140
        }
141
        FileObject documentBase = webModule.getDocumentBase();
142
        if (documentBase == null) {
143
            return null;
144
        }
145
        return documentBase;
146
    }
125
    }
147
126
148
    /**
127
    /**
(-)a/projectapi/manifest.mf (-1 / +1 lines)
Lines 1-6 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.netbeans.modules.projectapi/1
2
OpenIDE-Module: org.netbeans.modules.projectapi/1
3
OpenIDE-Module-Specification-Version: 1.55
3
OpenIDE-Module-Specification-Version: 1.56
4
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/projectapi/Bundle.properties
4
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/projectapi/Bundle.properties
5
OpenIDE-Module-Layer: org/netbeans/modules/projectapi/layer.xml
5
OpenIDE-Module-Layer: org/netbeans/modules/projectapi/layer.xml
6
6
(-)a/projectapi/src/org/netbeans/spi/project/support/GenericSources.java (-1 / +34 lines)
Lines 193-199 Link Here
193
        public String toString() {
193
        public String toString() {
194
            return "GenericSources.Group[name=" + name + ",rootFolder=" + rootFolder + "]"; // NOI18N
194
            return "GenericSources.Group[name=" + name + ",rootFolder=" + rootFolder + "]"; // NOI18N
195
        }
195
        }
196
        
196
197
        @Override
198
        public int hashCode() {
199
            int hash = 7;
200
            hash = 89 * hash + (this.p != null ? this.p.hashCode() : 0);
201
            hash = 89 * hash + (this.rootFolder != null ? this.rootFolder.hashCode() : 0);
202
            hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0);
203
            hash = 89 * hash + (this.displayName != null ? this.displayName.hashCode() : 0);
204
            return hash;
205
        }
206
207
        @Override
208
        public boolean equals(Object obj) {
209
            if (obj == null) {
210
                return false;
211
            }
212
            if (getClass() != obj.getClass()) {
213
                return false;
214
            }
215
            final Group other = (Group) obj;
216
            if (this.p != other.p && (this.p == null || !this.p.equals(other.p))) {
217
                return false;
218
            }
219
            if (this.rootFolder != other.rootFolder && (this.rootFolder == null || !this.rootFolder.equals(other.rootFolder))) {
220
                return false;
221
            }
222
            if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
223
                return false;
224
            }
225
            if ((this.displayName == null) ? (other.displayName != null) : !this.displayName.equals(other.displayName)) {
226
                return false;
227
            }
228
            return true;
229
        }
197
    }
230
    }
198
    
231
    
199
}
232
}

Return to bug 182407