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 |
} |