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 110886
Collapse All | Expand All

(-)a/j2ee.archive/nbproject/project.xml (+23 lines)
Lines 164-169 Link Here
164
                    </run-dependency>
164
                    </run-dependency>
165
                </dependency>
165
                </dependency>
166
                <dependency>
166
                <dependency>
167
                    <code-name-base>org.netbeans.modules.java.api.common</code-name-base>
168
                    <build-prerequisite/>
169
                    <compile-dependency/>
170
                    <run-dependency>
171
                        <release-version>0-1</release-version>
172
                        <specification-version>1.18</specification-version>
173
                    </run-dependency>
174
                </dependency>
175
                <dependency>
167
                    <code-name-base>org.netbeans.modules.java.project</code-name-base>
176
                    <code-name-base>org.netbeans.modules.java.project</code-name-base>
168
                    <build-prerequisite/>
177
                    <build-prerequisite/>
169
                    <compile-dependency/>
178
                    <compile-dependency/>
Lines 314-319 Link Here
314
                    </run-dependency>
323
                    </run-dependency>
315
                </dependency>
324
                </dependency>
316
            </module-dependencies>
325
            </module-dependencies>
326
            <test-dependencies>
327
                <test-type>
328
                    <name>qa-functional</name>
329
                    <test-dependency>
330
                        <code-name-base>org.netbeans.libs.junit4</code-name-base>
331
                        <compile-dependency/>
332
                    </test-dependency>
333
                    <test-dependency>
334
                        <code-name-base>org.netbeans.modules.nbjunit</code-name-base>
335
                        <recursive/>
336
                        <compile-dependency/>
337
                    </test-dependency>
338
                </test-type>
339
            </test-dependencies>
317
            <public-packages/>
340
            <public-packages/>
318
        </data>
341
        </data>
319
    </configuration>
342
    </configuration>
(-)a/j2ee.archive/src/org/netbeans/modules/j2ee/archive/project/ArchiveProject.java (-80 / +6 lines)
Lines 42-51 Link Here
42
package org.netbeans.modules.j2ee.archive.project;
42
package org.netbeans.modules.j2ee.archive.project;
43
43
44
import java.beans.PropertyChangeListener;
44
import java.beans.PropertyChangeListener;
45
import java.beans.PropertyChangeSupport;
46
import java.io.File;
45
import java.io.File;
47
import java.io.IOException;
46
import java.io.IOException;
48
import java.lang.ref.WeakReference;
49
import java.util.ArrayList;
47
import java.util.ArrayList;
50
import java.util.Collection;
48
import java.util.Collection;
51
import java.util.HashMap;
49
import java.util.HashMap;
Lines 57-64 Link Here
57
import org.netbeans.api.java.classpath.ClassPath;
55
import org.netbeans.api.java.classpath.ClassPath;
58
import org.netbeans.api.java.classpath.GlobalPathRegistry;
56
import org.netbeans.api.java.classpath.GlobalPathRegistry;
59
import org.netbeans.api.project.Project;
57
import org.netbeans.api.project.Project;
60
import org.netbeans.api.project.ProjectInformation;
61
import org.netbeans.api.project.ProjectManager;
58
import org.netbeans.api.project.ProjectManager;
59
import org.netbeans.api.project.ProjectUtils;
62
import org.netbeans.api.project.ant.AntArtifact;
60
import org.netbeans.api.project.ant.AntArtifact;
63
import org.netbeans.modules.j2ee.archive.Util;
61
import org.netbeans.modules.j2ee.archive.Util;
64
import org.netbeans.modules.j2ee.archive.customizer.ProvidesCustomizer;
62
import org.netbeans.modules.j2ee.archive.customizer.ProvidesCustomizer;
Lines 74-79 Link Here
74
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleImplementation2;
72
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleImplementation2;
75
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
73
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
76
import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel;
74
import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel;
75
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
77
import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
76
import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
78
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
77
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
79
import org.netbeans.spi.project.AuxiliaryConfiguration;
78
import org.netbeans.spi.project.AuxiliaryConfiguration;
Lines 83-89 Link Here
83
import org.netbeans.spi.project.support.ant.AntProjectHelper;
82
import org.netbeans.spi.project.support.ant.AntProjectHelper;
84
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
83
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
85
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
84
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
86
import org.netbeans.spi.project.support.ant.PropertyUtils;
87
import org.netbeans.spi.project.ui.PrivilegedTemplates;
85
import org.netbeans.spi.project.ui.PrivilegedTemplates;
88
import org.netbeans.spi.project.ui.RecommendedTemplates;
86
import org.netbeans.spi.project.ui.RecommendedTemplates;
89
import org.openide.ErrorManager;
87
import org.openide.ErrorManager;
Lines 196-217 Link Here
196
    
194
    
197
    /** Return configured project name. */
195
    /** Return configured project name. */
198
    public String getName() {
196
    public String getName() {
199
        return (String) ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
197
        return ProjectUtils.getInformation(this).getName();
200
            @Override
201
            public String run() {
202
                Element data = updateHelper.getPrimaryConfigurationData(true);
203
                // XXX replace by XMLUtil when that has findElement, findText, etc.
204
                NodeList nl = data.getElementsByTagNameNS(ArchiveProjectType.PROJECT_CONFIGURATION_NS, NAME_LIT);
205
                if (nl.getLength() == 1) {
206
                    nl = nl.item(0).getChildNodes();
207
                    if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
208
                        return ((Text) nl.item(0)).getNodeValue();
209
                    }
210
                }
211
                return "BINARCHIVE???"; // NOI18N
212
            }
213
        });
214
        
215
    }
198
    }
216
    
199
    
217
    public ArchiveProjectProperties getArchiveProjectProperties() {
200
    public ArchiveProjectProperties getArchiveProjectProperties() {
Lines 226-234 Link Here
226
    private final class HelpfulLookup extends Lookup {
209
    private final class HelpfulLookup extends Lookup {
227
        
210
        
228
        private boolean verbose = Boolean.getBoolean("archiveproject.lookup.verbose");
211
        private boolean verbose = Boolean.getBoolean("archiveproject.lookup.verbose");
229
        
212
230
        Lookup inner = LookupProviderSupport.createCompositeLookup(Lookups.fixed(new Object[] {
213
        Lookup inner = LookupProviderSupport.createCompositeLookup(Lookups.fixed(new Object[] {
231
            new Info(),
214
            new ProjectInfoImpl(ArchiveProject.this, helper, ARCHIVE_PROJECT_ICON),
232
            helper.createAuxiliaryConfiguration(),
215
            helper.createAuxiliaryConfiguration(),
233
            helper.createCacheDirectoryProvider(),
216
            helper.createCacheDirectoryProvider(),
234
            helper.createGlobFileBuiltQuery(eval, new String[] {"${src.dir}/*.java"},
217
            helper.createGlobFileBuiltQuery(eval, new String[] {"${src.dir}/*.java"},
Lines 311-374 Link Here
311
            return ret;
294
            return ret;
312
        }
295
        }
313
    }
296
    }
314
    //when #110886 gets implemented, this class is obsolete    
297
315
    private final class Info implements ProjectInformation {
316
        
317
        private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
318
        private WeakReference<String> cachedName = null;
319
        
320
        Info() {}
321
        
322
        void firePropertyChange(String prop) {
323
            pcs.firePropertyChange(prop, null, null);
324
            synchronized (pcs) {
325
                cachedName = null;
326
            }
327
        }
328
        
329
        @Override
330
        public String getName() {
331
            return PropertyUtils.getUsablePropertyName(getDisplayName());
332
        }
333
        
334
        @Override
335
        public String getDisplayName() {
336
            synchronized (pcs) {
337
                if (cachedName != null) {
338
                    String dn = cachedName.get();
339
                    if (dn != null) {
340
                        return dn;
341
                    }
342
                }
343
            }
344
            String dn = ArchiveProject.this.getNamedProjectAttribute(NAME_LIT);
345
            synchronized (pcs) {
346
                cachedName = new WeakReference<String>(dn);
347
            }
348
            return dn;
349
        }
350
        
351
        @Override
352
        public Icon getIcon() {
353
            return ARCHIVE_PROJECT_ICON;
354
        }
355
        
356
        @Override
357
        public Project getProject() {
358
            return ArchiveProject.this;
359
        }
360
        
361
        @Override
362
        public void addPropertyChangeListener(PropertyChangeListener listener) {
363
            pcs.addPropertyChangeListener(listener);
364
        }
365
        
366
        @Override
367
        public void removePropertyChangeListener(PropertyChangeListener listener) {
368
            pcs.removePropertyChangeListener(listener);
369
        }
370
    }
371
    
372
    private final class MyAntProvider implements AntArtifactProvider {
298
    private final class MyAntProvider implements AntArtifactProvider {
373
        // TODO - Need to fix for ejb-jar/app-client/resource-adapter cases
299
        // TODO - Need to fix for ejb-jar/app-client/resource-adapter cases
374
        @Override
300
        @Override
(-)a/j2ee.clientproject/nbproject/project.xml (-1 / +1 lines)
Lines 215-221 Link Here
215
                    <compile-dependency/>
215
                    <compile-dependency/>
216
                    <run-dependency>
216
                    <run-dependency>
217
                        <release-version>0-1</release-version>
217
                        <release-version>0-1</release-version>
218
                        <specification-version>1.15</specification-version>
218
                        <specification-version>1.18</specification-version>
219
                    </run-dependency>
219
                    </run-dependency>
220
                </dependency>
220
                </dependency>
221
                <dependency>
221
                <dependency>
(-)a/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/AppClientProject.java (-106 / +5 lines)
Lines 43-52 Link Here
43
43
44
import java.beans.PropertyChangeEvent;
44
import java.beans.PropertyChangeEvent;
45
import java.beans.PropertyChangeListener;
45
import java.beans.PropertyChangeListener;
46
import java.beans.PropertyChangeSupport;
47
import java.io.File;
46
import java.io.File;
48
import java.io.IOException;
47
import java.io.IOException;
49
import java.lang.ref.WeakReference;
50
import java.net.URI;
48
import java.net.URI;
51
import java.util.Arrays;
49
import java.util.Arrays;
52
import java.util.LinkedList;
50
import java.util.LinkedList;
Lines 60-67 Link Here
60
import org.netbeans.api.java.classpath.GlobalPathRegistry;
58
import org.netbeans.api.java.classpath.GlobalPathRegistry;
61
import org.netbeans.api.java.project.JavaProjectConstants;
59
import org.netbeans.api.java.project.JavaProjectConstants;
62
import org.netbeans.api.project.Project;
60
import org.netbeans.api.project.Project;
63
import org.netbeans.api.project.ProjectInformation;
64
import org.netbeans.api.project.ProjectManager;
61
import org.netbeans.api.project.ProjectManager;
62
import org.netbeans.api.project.ProjectUtils;
65
import org.netbeans.api.project.SourceGroup;
63
import org.netbeans.api.project.SourceGroup;
66
import org.netbeans.api.project.ant.AntArtifact;
64
import org.netbeans.api.project.ant.AntArtifact;
67
import org.netbeans.api.project.ant.AntBuildExtender;
65
import org.netbeans.api.project.ant.AntBuildExtender;
Lines 88-93 Link Here
88
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation;
86
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation;
89
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation2;
87
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation2;
90
import org.netbeans.modules.java.api.common.SourceRoots;
88
import org.netbeans.modules.java.api.common.SourceRoots;
89
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
91
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
90
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
92
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
91
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
93
import org.netbeans.modules.java.api.common.project.ProjectProperties;
92
import org.netbeans.modules.java.api.common.project.ProjectProperties;
Lines 106-119 Link Here
106
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
105
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
107
import org.netbeans.spi.project.support.LookupProviderSupport;
106
import org.netbeans.spi.project.support.LookupProviderSupport;
108
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
107
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
109
import org.netbeans.spi.project.support.ant.AntProjectEvent;
110
import org.netbeans.spi.project.support.ant.AntProjectHelper;
108
import org.netbeans.spi.project.support.ant.AntProjectHelper;
111
import org.netbeans.spi.project.support.ant.AntProjectListener;
112
import org.netbeans.spi.project.support.ant.EditableProperties;
109
import org.netbeans.spi.project.support.ant.EditableProperties;
113
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
110
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
114
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
111
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
115
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
112
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
116
import org.netbeans.spi.project.support.ant.PropertyUtils;
117
import org.netbeans.spi.project.support.ant.ReferenceHelper;
113
import org.netbeans.spi.project.support.ant.ReferenceHelper;
118
import org.netbeans.spi.project.ui.PrivilegedTemplates;
114
import org.netbeans.spi.project.ui.PrivilegedTemplates;
119
import org.netbeans.spi.project.ui.ProjectOpenedHook;
115
import org.netbeans.spi.project.ui.ProjectOpenedHook;
Lines 134-147 Link Here
134
import org.openide.util.Exceptions;
130
import org.openide.util.Exceptions;
135
import org.openide.util.ImageUtilities;
131
import org.openide.util.ImageUtilities;
136
import org.openide.util.Lookup;
132
import org.openide.util.Lookup;
137
import org.openide.util.Mutex;
138
import org.openide.util.NbBundle;
133
import org.openide.util.NbBundle;
139
import org.openide.util.RequestProcessor;
134
import org.openide.util.RequestProcessor;
140
import org.openide.util.lookup.Lookups;
135
import org.openide.util.lookup.Lookups;
141
import org.w3c.dom.Element;
136
import org.w3c.dom.Element;
142
import org.w3c.dom.Node;
143
import org.w3c.dom.NodeList;
137
import org.w3c.dom.NodeList;
144
import org.w3c.dom.Text;
145
138
146
/**
139
/**
147
 * Represents one plain Application Client project.
140
 * Represents one plain Application Client project.
Lines 153-159 Link Here
153
    sharedNamespace=AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE,
146
    sharedNamespace=AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE,
154
    privateNamespace=AppClientProjectType.PRIVATE_CONFIGURATION_NAMESPACE
147
    privateNamespace=AppClientProjectType.PRIVATE_CONFIGURATION_NAMESPACE
155
)
148
)
156
public final class AppClientProject implements Project, AntProjectListener, FileChangeListener {
149
public final class AppClientProject implements Project, FileChangeListener {
157
    
150
    
158
    private final Icon CAR_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/clientproject/ui/resources/appclient.gif", false); // NOI18N
151
    private final Icon CAR_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/clientproject/ui/resources/appclient.gif", false); // NOI18N
159
    
152
    
Lines 216-222 Link Here
216
            getClassPathUiSupportCallback());
209
            getClassPathUiSupportCallback());
217
        classPathExtender = new ClassPathExtender(cpMod, ProjectProperties.JAVAC_CLASSPATH, ClassPathSupportCallbackImpl.ELEMENT_INCLUDED_LIBRARIES);
210
        classPathExtender = new ClassPathExtender(cpMod, ProjectProperties.JAVAC_CLASSPATH, ClassPathSupportCallbackImpl.ELEMENT_INCLUDED_LIBRARIES);
218
        lookup = createLookup(aux, cpProvider);
211
        lookup = createLookup(aux, cpProvider);
219
        helper.addAntProjectListener(this);
220
    }
212
    }
221
    
213
    
222
    private ClassPathModifier.Callback createClassPathModifierCallback() {
214
    private ClassPathModifier.Callback createClassPathModifierCallback() {
Lines 298-304 Link Here
298
        FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), AppClientProjectProperties.SOURCE_ENCODING);
290
        FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), AppClientProjectProperties.SOURCE_ENCODING);
299
        AppClientSources sources = new AppClientSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots());
291
        AppClientSources sources = new AppClientSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots());
300
        Lookup base = Lookups.fixed(new Object[] {
292
        Lookup base = Lookups.fixed(new Object[] {
301
            new Info(),
293
            new ProjectInfoImpl(this, helper, CAR_PROJECT_ICON),
302
            aux,
294
            aux,
303
            helper.createCacheDirectoryProvider(),
295
            helper.createCacheDirectoryProvider(),
304
            helper.createAuxiliaryProperties(),
296
            helper.createAuxiliaryProperties(),
Lines 354-372 Link Here
354
        return this.cpProvider;
346
        return this.cpProvider;
355
    }
347
    }
356
    
348
    
357
    public void configurationXmlChanged(AntProjectEvent ev) {
358
        if (ev.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) {
359
            // Could be various kinds of changes, but name & displayName might have changed.
360
            Info info = (Info)getLookup().lookup(ProjectInformation.class);
361
            info.firePropertyChange(ProjectInformation.PROP_NAME);
362
            info.firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME);
363
        }
364
    }
365
    
366
    public void propertiesChanged(AntProjectEvent ev) {
367
        // currently ignored (probably better to listen to evaluator() if you need to)
368
    }
369
    
370
    // Package private methods -------------------------------------------------
349
    // Package private methods -------------------------------------------------
371
    
350
    
372
    /**
351
    /**
Lines 422-441 Link Here
422
    
401
    
423
    /** Return configured project name. */
402
    /** Return configured project name. */
424
    public String getName() {
403
    public String getName() {
425
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
404
        return ProjectUtils.getInformation(this).getName();
426
            public String run() {
427
                Element data = updateHelper.getPrimaryConfigurationData(true);
428
                // XXX replace by XMLUtil when that has findElement, findText, etc.
429
                NodeList nl = data.getElementsByTagNameNS(AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N
430
                if (nl.getLength() == 1) {
431
                    nl = nl.item(0).getChildNodes();
432
                    if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
433
                        return ((Text) nl.item(0)).getNodeValue();
434
                    }
435
                }
436
                return "CAR???"; // NOI18N
437
            }
438
        });
439
    }
405
    }
440
406
441
    public void fileAttributeChanged (FileAttributeEvent fe) {
407
    public void fileAttributeChanged (FileAttributeEvent fe) {
Lines 588-660 Link Here
588
    }
554
    }
589
    
555
    
590
    // Private innerclasses ----------------------------------------------------
556
    // Private innerclasses ----------------------------------------------------
591
    //when #110886 gets implemented, this class is obsolete    
592
    private final class Info implements ProjectInformation {
593
        
594
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
595
        
596
        private WeakReference<String> cachedName = null;
597
        
598
        Info() {}
599
        
600
        void firePropertyChange(String prop) {
601
            pcs.firePropertyChange(prop, null, null);
602
            synchronized (pcs) {
603
                cachedName = null;
604
            }
605
        }
606
        
607
        public String getName() {
608
            return PropertyUtils.getUsablePropertyName(getDisplayName());
609
        }
610
        
611
        public String getDisplayName() {
612
            synchronized (pcs) {
613
                if (cachedName != null) {
614
                    String dn = cachedName.get();
615
                    if (dn != null) {
616
                        return dn;
617
                    }
618
                }
619
            }
620
            String dn = ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
621
                public String run() {
622
                    Element data = updateHelper.getPrimaryConfigurationData(true);
623
                    // XXX replace by XMLUtil when that has findElement, findText, etc.
624
                    NodeList nl = data.getElementsByTagNameNS(AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N
625
                    if (nl.getLength() == 1) {
626
                        nl = nl.item(0).getChildNodes();
627
                        if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
628
                            return ((Text) nl.item(0)).getNodeValue();
629
                        }
630
                    }
631
                    return "???"; // NOI18N
632
                }
633
            });
634
            synchronized (pcs) {
635
                cachedName = new WeakReference<String>(dn);
636
            }
637
            return dn;
638
        }
639
        
640
        public Icon getIcon() {
641
            return CAR_PROJECT_ICON;
642
        }
643
        
644
        public Project getProject() {
645
            return AppClientProject.this;
646
        }
647
        
648
        public void addPropertyChangeListener(PropertyChangeListener listener) {
649
            pcs.addPropertyChangeListener(listener);
650
        }
651
        
652
        public void removePropertyChangeListener(PropertyChangeListener listener) {
653
            pcs.removePropertyChangeListener(listener);
654
        }
655
        
656
    }
657
    
658
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
557
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
659
        
558
        
660
        ProjectXmlSavedHookImpl() {}
559
        ProjectXmlSavedHookImpl() {}
(-)a/j2ee.earproject/nbproject/project.xml (-1 / +1 lines)
Lines 188-194 Link Here
188
                    <compile-dependency/>
188
                    <compile-dependency/>
189
                    <run-dependency>
189
                    <run-dependency>
190
                        <release-version>0-1</release-version>
190
                        <release-version>0-1</release-version>
191
                        <specification-version>1.6</specification-version>
191
                        <specification-version>1.18</specification-version>
192
                    </run-dependency>
192
                    </run-dependency>
193
                </dependency>
193
                </dependency>
194
                <dependency>
194
                <dependency>
(-)a/j2ee.earproject/src/org/netbeans/modules/j2ee/earproject/EarProject.java (-79 / +2 lines)
Lines 43-52 Link Here
43
43
44
import java.beans.PropertyChangeEvent;
44
import java.beans.PropertyChangeEvent;
45
import java.beans.PropertyChangeListener;
45
import java.beans.PropertyChangeListener;
46
import java.beans.PropertyChangeSupport;
47
import java.io.File;
46
import java.io.File;
48
import java.io.IOException;
47
import java.io.IOException;
49
import java.lang.ref.WeakReference;
50
import java.util.Arrays;
48
import java.util.Arrays;
51
import java.util.List;
49
import java.util.List;
52
import java.util.logging.Level;
50
import java.util.logging.Level;
Lines 55-61 Link Here
55
import org.netbeans.api.java.classpath.ClassPath;
53
import org.netbeans.api.java.classpath.ClassPath;
56
import org.netbeans.api.java.classpath.GlobalPathRegistry;
54
import org.netbeans.api.java.classpath.GlobalPathRegistry;
57
import org.netbeans.api.project.Project;
55
import org.netbeans.api.project.Project;
58
import org.netbeans.api.project.ProjectInformation;
59
import org.netbeans.api.project.ProjectManager;
56
import org.netbeans.api.project.ProjectManager;
60
import org.netbeans.api.project.ant.AntArtifact;
57
import org.netbeans.api.project.ant.AntArtifact;
61
import org.netbeans.api.project.ant.AntBuildExtender;
58
import org.netbeans.api.project.ant.AntBuildExtender;
Lines 81-86 Link Here
81
import org.netbeans.modules.j2ee.spi.ejbjar.EarImplementation;
78
import org.netbeans.modules.j2ee.spi.ejbjar.EarImplementation;
82
import org.netbeans.modules.j2ee.spi.ejbjar.EarImplementation2;
79
import org.netbeans.modules.j2ee.spi.ejbjar.EarImplementation2;
83
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarFactory;
80
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarFactory;
81
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
84
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
82
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
85
import org.netbeans.modules.web.api.webmodule.WebModule;
83
import org.netbeans.modules.web.api.webmodule.WebModule;
86
import org.netbeans.spi.java.project.support.LookupMergerSupport;
84
import org.netbeans.spi.java.project.support.LookupMergerSupport;
Lines 116-124 Link Here
116
import org.openide.util.NbBundle;
114
import org.openide.util.NbBundle;
117
import org.openide.util.lookup.Lookups;
115
import org.openide.util.lookup.Lookups;
118
import org.w3c.dom.Element;
116
import org.w3c.dom.Element;
119
import org.w3c.dom.Node;
120
import org.w3c.dom.NodeList;
117
import org.w3c.dom.NodeList;
121
import org.w3c.dom.Text;
122
118
123
/**
119
/**
124
 * Represents an Enterprise Application project.
120
 * Represents an Enterprise Application project.
Lines 213-219 Link Here
213
    private Lookup createLookup(AuxiliaryConfiguration aux, ClassPathProviderImpl cpProvider) {
209
    private Lookup createLookup(AuxiliaryConfiguration aux, ClassPathProviderImpl cpProvider) {
214
        SubprojectProvider spp = refHelper.createSubprojectProvider();
210
        SubprojectProvider spp = refHelper.createSubprojectProvider();
215
        Lookup base = Lookups.fixed(new Object[] {
211
        Lookup base = Lookups.fixed(new Object[] {
216
            new Info(),
212
            new ProjectInfoImpl(this, helper, EAR_PROJECT_ICON),
217
            aux,
213
            aux,
218
            spp,
214
            spp,
219
            helper.createAuxiliaryProperties(),
215
            helper.createAuxiliaryProperties(),
Lines 272-295 Link Here
272
        return ear;
268
        return ear;
273
    }
269
    }
274
    
270
    
275
    /** Return configured project name. */
276
    public String getName() {
277
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
278
            public String run() {
279
                Element data = updateHelper.getPrimaryConfigurationData(true);
280
                // XXX replace by XMLUtil when that has findElement, findText, etc.
281
                NodeList nl = data.getElementsByTagNameNS(EarProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N
282
                if (nl.getLength() == 1) {
283
                    nl = nl.item(0).getChildNodes();
284
                    if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
285
                        return ((Text) nl.item(0)).getNodeValue();
286
                    }
287
                }
288
                return "EAR????"; // NOI18N
289
            }
290
        });
291
    }
292
    
293
    /** Store configured project name. */
271
    /** Store configured project name. */
294
    public void setName(final String name) {
272
    public void setName(final String name) {
295
        ProjectManager.mutex().writeAccess(new Mutex.Action<Void>() {
273
        ProjectManager.mutex().writeAccess(new Mutex.Action<Void>() {
Lines 351-411 Link Here
351
    }
329
    }
352
    
330
    
353
    // Private innerclasses ----------------------------------------------------
331
    // Private innerclasses ----------------------------------------------------
354
    //when #110886 gets implemented, this class is obsolete
355
    private final class Info implements ProjectInformation {
356
        
357
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
358
        
359
        
360
        private WeakReference<String> cachedName = null;
361
        
362
        Info() {}
363
        
364
        void firePropertyChange(String prop) {
365
            pcs.firePropertyChange(prop, null, null);
366
            synchronized (pcs) {
367
                cachedName = null;
368
            }
369
        }
370
        
371
        public String getName() {
372
            return PropertyUtils.getUsablePropertyName(getDisplayName());
373
        }
374
        
375
        public String getDisplayName() {
376
            synchronized (pcs) {
377
                if (cachedName != null) {
378
                    String dn = cachedName.get();
379
                    if (dn != null) {
380
                        return dn;
381
                    }
382
                }
383
            }        
384
            String dn = EarProject.this.getName();
385
            synchronized (pcs) {
386
                cachedName = new WeakReference<String>(dn);
387
            }
388
            return dn;
389
        }
390
        
391
        public Icon getIcon() {
392
            return EAR_PROJECT_ICON;
393
        }
394
        
395
        public Project getProject() {
396
            return EarProject.this;
397
        }
398
        
399
        public void addPropertyChangeListener(PropertyChangeListener listener) {
400
            pcs.addPropertyChangeListener(listener);
401
        }
402
        
403
        public void removePropertyChangeListener(PropertyChangeListener listener) {
404
            pcs.removePropertyChangeListener(listener);
405
        }
406
        
407
    }
408
    
409
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
332
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
410
        
333
        
411
        ProjectXmlSavedHookImpl() {}
334
        ProjectXmlSavedHookImpl() {}
(-)a/j2ee.earproject/src/org/netbeans/modules/j2ee/earproject/EarProjectOperations.java (-3 / +4 lines)
Lines 50-55 Link Here
50
import org.apache.tools.ant.module.api.support.ActionUtils;
50
import org.apache.tools.ant.module.api.support.ActionUtils;
51
import org.netbeans.api.project.FileOwnerQuery;
51
import org.netbeans.api.project.FileOwnerQuery;
52
import org.netbeans.api.project.Project;
52
import org.netbeans.api.project.Project;
53
import org.netbeans.api.project.ProjectInformation;
53
import org.netbeans.api.project.ProjectManager;
54
import org.netbeans.api.project.ProjectManager;
54
import org.netbeans.modules.j2ee.earproject.ui.customizer.EarProjectProperties;
55
import org.netbeans.modules.j2ee.earproject.ui.customizer.EarProjectProperties;
55
import org.netbeans.spi.project.ActionProvider;
56
import org.netbeans.spi.project.ActionProvider;
Lines 167-175 Link Here
167
        
168
        
168
        EarProjectOperations origOperations = original.getLookup().lookup(EarProjectOperations.class);
169
        EarProjectOperations origOperations = original.getLookup().lookup(EarProjectOperations.class);
169
        fixLibraryLocation(origOperations);
170
        fixLibraryLocation(origOperations);
170
	
171
171
	final String oldProjectName = project.getName();
172
        final String oldProjectName = project.getLookup().lookup(ProjectInformation.class).getName();
172
        
173
173
        project.setName(newName);
174
        project.setName(newName);
174
	
175
	
175
        ProjectManager.mutex().writeAccess(new Runnable() {
176
        ProjectManager.mutex().writeAccess(new Runnable() {
(-)a/j2ee.ejbjarproject/nbproject/project.xml (-1 / +1 lines)
Lines 241-247 Link Here
241
                    <compile-dependency/>
241
                    <compile-dependency/>
242
                    <run-dependency>
242
                    <run-dependency>
243
                        <release-version>0-1</release-version>
243
                        <release-version>0-1</release-version>
244
                        <specification-version>1.15</specification-version>
244
                        <specification-version>1.18</specification-version>
245
                    </run-dependency>
245
                    </run-dependency>
246
                </dependency>
246
                </dependency>
247
                <dependency>
247
                <dependency>
(-)a/j2ee.ejbjarproject/src/org/netbeans/modules/j2ee/ejbjarproject/EjbJarProject.java (-96 / +5 lines)
Lines 45-56 Link Here
45
import java.awt.Dialog;
45
import java.awt.Dialog;
46
import java.beans.PropertyChangeEvent;
46
import java.beans.PropertyChangeEvent;
47
import java.beans.PropertyChangeListener;
47
import java.beans.PropertyChangeListener;
48
import java.beans.PropertyChangeSupport;
49
import java.io.File;
48
import java.io.File;
50
import java.io.IOException;
49
import java.io.IOException;
51
import java.io.InputStream;
50
import java.io.InputStream;
52
import java.io.OutputStream;
51
import java.io.OutputStream;
53
import java.lang.ref.WeakReference;
54
import java.util.Arrays;
52
import java.util.Arrays;
55
import java.util.Collections;
53
import java.util.Collections;
56
import java.util.HashMap;
54
import java.util.HashMap;
Lines 82-88 Link Here
82
import org.netbeans.modules.j2ee.ejbjarproject.jaxws.EjbProjectJAXWSSupport;
80
import org.netbeans.modules.j2ee.ejbjarproject.jaxws.EjbProjectJAXWSSupport;
83
import org.netbeans.modules.j2ee.ejbjarproject.ui.EjbJarLogicalViewProvider;
81
import org.netbeans.modules.j2ee.ejbjarproject.ui.EjbJarLogicalViewProvider;
84
import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.EjbJarProjectProperties;
82
import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.EjbJarProjectProperties;
85
import org.netbeans.api.project.ProjectInformation;
86
import org.netbeans.api.project.SourceGroup;
83
import org.netbeans.api.project.SourceGroup;
87
import org.netbeans.modules.j2ee.common.SharabilityUtility;
84
import org.netbeans.modules.j2ee.common.SharabilityUtility;
88
import org.netbeans.modules.j2ee.common.Util;
85
import org.netbeans.modules.j2ee.common.Util;
Lines 106-114 Link Here
106
import org.netbeans.spi.project.ant.AntArtifactProvider;
103
import org.netbeans.spi.project.ant.AntArtifactProvider;
107
import org.netbeans.spi.project.ant.AntBuildExtenderFactory;
104
import org.netbeans.spi.project.ant.AntBuildExtenderFactory;
108
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
105
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
109
import org.netbeans.spi.project.support.ant.AntProjectEvent;
110
import org.netbeans.spi.project.support.ant.AntProjectHelper;
106
import org.netbeans.spi.project.support.ant.AntProjectHelper;
111
import org.netbeans.spi.project.support.ant.AntProjectListener;
112
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
107
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
113
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
108
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
114
import org.netbeans.spi.project.ui.PrivilegedTemplates;
109
import org.netbeans.spi.project.ui.PrivilegedTemplates;
Lines 122-128 Link Here
122
import org.openide.loaders.DataObject;
117
import org.openide.loaders.DataObject;
123
import org.openide.util.ImageUtilities;
118
import org.openide.util.ImageUtilities;
124
import org.openide.util.Lookup;
119
import org.openide.util.Lookup;
125
import org.openide.util.Mutex;
126
import org.openide.util.RequestProcessor;
120
import org.openide.util.RequestProcessor;
127
import org.openide.util.lookup.Lookups;
121
import org.openide.util.lookup.Lookups;
128
import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment;
122
import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment;
Lines 132-143 Link Here
132
import org.netbeans.modules.j2ee.common.project.ui.UserProjectSettings;
126
import org.netbeans.modules.j2ee.common.project.ui.UserProjectSettings;
133
import org.netbeans.modules.j2ee.deployment.devmodules.api.InstanceRemovedException;
127
import org.netbeans.modules.j2ee.deployment.devmodules.api.InstanceRemovedException;
134
import org.netbeans.api.j2ee.core.Profile;
128
import org.netbeans.api.j2ee.core.Profile;
129
import org.netbeans.api.project.ProjectUtils;
135
import org.netbeans.modules.j2ee.deployment.devmodules.spi.ArtifactListener;
130
import org.netbeans.modules.j2ee.deployment.devmodules.spi.ArtifactListener;
136
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider.DeployOnSaveSupport;
131
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider.DeployOnSaveSupport;
137
import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.CustomizerProviderImpl;
132
import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.CustomizerProviderImpl;
138
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation;
133
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation;
139
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation2;
134
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation2;
140
import org.netbeans.modules.java.api.common.SourceRoots;
135
import org.netbeans.modules.java.api.common.SourceRoots;
136
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
141
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
137
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
142
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
138
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
143
import org.netbeans.modules.java.api.common.project.ProjectProperties;
139
import org.netbeans.modules.java.api.common.project.ProjectProperties;
Lines 149-159 Link Here
149
import org.openide.DialogDisplayer;
145
import org.openide.DialogDisplayer;
150
import org.openide.util.NbBundle;
146
import org.openide.util.NbBundle;
151
import org.w3c.dom.Document;
147
import org.w3c.dom.Document;
152
import org.w3c.dom.Comment;
153
import org.w3c.dom.Element;
148
import org.w3c.dom.Element;
154
import org.w3c.dom.Node;
155
import org.w3c.dom.NodeList;
149
import org.w3c.dom.NodeList;
156
import org.w3c.dom.Text;
157
import org.netbeans.modules.websvc.api.webservices.WebServicesSupport;
150
import org.netbeans.modules.websvc.api.webservices.WebServicesSupport;
158
import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
151
import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
159
import org.netbeans.modules.websvc.spi.webservices.WebServicesSupportFactory;
152
import org.netbeans.modules.websvc.spi.webservices.WebServicesSupportFactory;
Lines 161-167 Link Here
161
import org.netbeans.spi.java.project.support.LookupMergerSupport;
154
import org.netbeans.spi.java.project.support.LookupMergerSupport;
162
import org.netbeans.spi.project.support.LookupProviderSupport;
155
import org.netbeans.spi.project.support.LookupProviderSupport;
163
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
156
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
164
import org.netbeans.spi.project.support.ant.PropertyUtils;
165
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
157
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
166
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
158
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
167
import org.openide.NotifyDescriptor;
159
import org.openide.NotifyDescriptor;
Lines 184-190 Link Here
184
    sharedNamespace=EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE,
176
    sharedNamespace=EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE,
185
    privateNamespace=EjbJarProjectType.PRIVATE_CONFIGURATION_NAMESPACE
177
    privateNamespace=EjbJarProjectType.PRIVATE_CONFIGURATION_NAMESPACE
186
)
178
)
187
public class EjbJarProject implements Project, AntProjectListener, FileChangeListener {
179
public class EjbJarProject implements Project, FileChangeListener {
188
    
180
    
189
    private final Icon PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/ejbjarproject/ui/resources/ejbjarProjectIcon.gif", false); // NOI18N
181
    private final Icon PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/ejbjarproject/ui/resources/ejbjarProjectIcon.gif", false); // NOI18N
190
    
182
    
Lines 312-318 Link Here
312
        css = new CopyOnSaveSupport();
304
        css = new CopyOnSaveSupport();
313
        artifactSupport = new ArtifactCopySupport();
305
        artifactSupport = new ArtifactCopySupport();
314
        deployOnSaveSupport = new DeployOnSaveSupportProxy();
306
        deployOnSaveSupport = new DeployOnSaveSupportProxy();
315
        helper.addAntProjectListener(this);
316
        ProjectManager.mutex().postWriteRequest(
307
        ProjectManager.mutex().postWriteRequest(
317
             new Runnable () {
308
             new Runnable () {
318
                 public void run() {
309
                 public void run() {
Lines 409-415 Link Here
409
        Lookup base = Lookups.fixed(new Object[] {
400
        Lookup base = Lookups.fixed(new Object[] {
410
                EjbJarProject.this, // never cast an externally obtained Project to EjbJarProject - use lookup instead
401
                EjbJarProject.this, // never cast an externally obtained Project to EjbJarProject - use lookup instead
411
                buildExtender,
402
                buildExtender,
412
                new Info(),
403
                new ProjectInfoImpl(this, helper, PROJECT_ICON),
413
                aux,
404
                aux,
414
                helper.createCacheDirectoryProvider(),
405
                helper.createCacheDirectoryProvider(),
415
                helper.createAuxiliaryProperties(),
406
                helper.createAuxiliaryProperties(),
Lines 468-487 Link Here
468
        return this.cpProvider;
459
        return this.cpProvider;
469
    }
460
    }
470
    
461
    
471
    public void configurationXmlChanged(AntProjectEvent ev) {
472
        if (ev.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) {
473
            // Could be various kinds of changes, but name & displayName might have changed.
474
            Info info = (Info)getLookup().lookup(ProjectInformation.class);
475
            info.firePropertyChange(ProjectInformation.PROP_NAME);
476
            info.firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME);
477
        }
478
    }
479
    
480
    public void propertiesChanged(AntProjectEvent ev) {
481
        // currently ignored
482
        //TODO: should not be ignored!
483
    }
484
    
485
    String getBuildXmlName() {
462
    String getBuildXmlName() {
486
        String storedName = helper.getStandardPropertyEvaluator().getProperty(EjbJarProjectProperties.BUILD_FILE);
463
        String storedName = helper.getStandardPropertyEvaluator().getProperty(EjbJarProjectProperties.BUILD_FILE);
487
        return storedName == null ? GeneratedFilesHelper.BUILD_XML_PATH : storedName;
464
        return storedName == null ? GeneratedFilesHelper.BUILD_XML_PATH : storedName;
Lines 583-602 Link Here
583
    
560
    
584
    /** Return configured project name. */
561
    /** Return configured project name. */
585
    public String getName() {
562
    public String getName() {
586
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
563
        return ProjectUtils.getInformation(this).getName();
587
            public String run() {
588
                Element data = updateHelper.getPrimaryConfigurationData(true);
589
                // XXX replace by XMLUtil when that has findElement, findText, etc.
590
                NodeList nl = data.getElementsByTagNameNS(EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); //NOI18N
591
                if (nl.getLength() == 1) {
592
                    nl = nl.item(0).getChildNodes();
593
                    if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
594
                        return ((Text) nl.item(0)).getNodeValue();
595
                    }
596
                }
597
                return "A Broken EJB Project"; // NOI18N
598
            }
599
        });
600
    }
564
    }
601
565
602
    /** Store configured project name. */
566
    /** Store configured project name. */
Lines 783-843 Link Here
783
    }
747
    }
784
748
785
    // Private innerclasses ----------------------------------------------------
749
    // Private innerclasses ----------------------------------------------------
786
    
787
    //when #110886 gets implemented, this class is obsolete
788
    private final class Info implements ProjectInformation {
789
        
790
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
791
        
792
        private WeakReference<String> cachedName = null;
793
        
794
        Info() {}
795
        
796
        void firePropertyChange(String prop) {
797
            pcs.firePropertyChange(prop, null, null);
798
            synchronized (pcs) {
799
                cachedName = null;
800
            }
801
        }
802
        
803
        public String getName() {
804
            return PropertyUtils.getUsablePropertyName(getDisplayName());
805
        }
806
        
807
        public String getDisplayName() {
808
            synchronized (pcs) {
809
                if (cachedName != null) {
810
                    String dn = cachedName.get();
811
                    if (dn != null) {
812
                        return dn;
813
                    }
814
                }
815
            }        
816
            String dn = EjbJarProject.this.getName();
817
            synchronized (pcs) {
818
                cachedName = new WeakReference<String>(dn);
819
            }
820
            return dn;
821
        }
822
        
823
        public Icon getIcon() {
824
            return PROJECT_ICON;
825
        }
826
        
827
        public Project getProject() {
828
            return EjbJarProject.this;
829
        }
830
        
831
        public void addPropertyChangeListener(PropertyChangeListener listener) {
832
            pcs.addPropertyChangeListener(listener);
833
        }
834
        
835
        public void removePropertyChangeListener(PropertyChangeListener listener) {
836
            pcs.removePropertyChangeListener(listener);
837
        }
838
        
839
    }
840
    
841
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
750
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
842
        
751
        
843
        ProjectXmlSavedHookImpl() {}
752
        ProjectXmlSavedHookImpl() {}
(-)a/java.api.common/apichanges.xml (+16 lines)
Lines 175-180 Link Here
175
            <class package="org.netbeans.modules.java.api.common.project.ui.customizer" name="SourceRootsUi"/>
175
            <class package="org.netbeans.modules.java.api.common.project.ui.customizer" name="SourceRootsUi"/>
176
            <issue number="150357"/>
176
            <issue number="150357"/>
177
        </change>
177
        </change>
178
        <change id="ProjectInfoImpl">
179
            <api name="java-api-common"/>
180
            <summary>Create a reusable implementation for ProjectInformation.</summary>
181
            <version major="1" minor="18"/>
182
            <date day="18" month="4" year="2010"/>
183
            <author login="mvfranz"/>
184
            <compatibility addition="yes"/>
185
            <description>
186
                <p>
187
                    Created a re-usable implementation of ProjectInformation that can be
188
                    used within the Java language projects.
189
                </p>
190
            </description>
191
            <class package="org.netbeans.modules.java.api.common.ant" name="ProjectInfoImpl"/>
192
            <issue number="110886"/>
193
        </change>
178
194
179
    </changes>
195
    </changes>
180
196
(-)a/java.api.common/manifest.mf (-1 / +1 lines)
Lines 1-4 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.netbeans.modules.java.api.common/0
2
OpenIDE-Module: org.netbeans.modules.java.api.common/0
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/java/api/common/resources/Bundle.properties
3
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/java/api/common/resources/Bundle.properties
4
OpenIDE-Module-Specification-Version: 1.17
4
OpenIDE-Module-Specification-Version: 1.18
(-)a/java.api.common/nbproject/project.xml (+1 lines)
Lines 233-238 Link Here
233
                <friend>org.netbeans.modules.apisupport.project</friend>
233
                <friend>org.netbeans.modules.apisupport.project</friend>
234
                <friend>org.netbeans.modules.groovy.grailsproject</friend>
234
                <friend>org.netbeans.modules.groovy.grailsproject</friend>
235
                <friend>org.netbeans.modules.hudson.ant</friend>
235
                <friend>org.netbeans.modules.hudson.ant</friend>
236
                <friend>org.netbeans.modules.j2ee.archive</friend>
236
                <friend>org.netbeans.modules.j2ee.clientproject</friend>
237
                <friend>org.netbeans.modules.j2ee.clientproject</friend>
237
                <friend>org.netbeans.modules.j2ee.common</friend>
238
                <friend>org.netbeans.modules.j2ee.common</friend>
238
                <friend>org.netbeans.modules.j2ee.earproject</friend>
239
                <friend>org.netbeans.modules.j2ee.earproject</friend>
(-)a/java.api.common/src/org/netbeans/modules/java/api/common/ant/ProjectInfoImpl.java (+209 lines)
Line 0 Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
5
 *
6
 * The contents of this file are subject to the terms of either the GNU
7
 * General Public License Version 2 only ("GPL") or the Common
8
 * Development and Distribution License("CDDL") (collectively, the
9
 * "License"). You may not use this file except in compliance with the
10
 * License. You can obtain a copy of the License at
11
 * http://www.netbeans.org/cddl-gplv2.html
12
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
13
 * specific language governing permissions and limitations under the
14
 * License.  When distributing the software, include this License Header
15
 * Notice in each file and include the License file at
16
 * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
17
 * particular file as subject to the "Classpath" exception as provided
18
 * by Sun in the GPL Version 2 section of the License file that
19
 * accompanied this code. If applicable, add the following below the
20
 * License Header, with the fields enclosed by brackets [] replaced by
21
 * your own identifying information:
22
 * "Portions Copyrighted [year] [name of copyright owner]"
23
 *
24
 * If you wish your version of this file to be governed by only the CDDL
25
 * or only the GPL Version 2, indicate your decision by adding
26
 * "[Contributor] elects to include this software in this distribution
27
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
28
 * single choice of license, a recipient has the option to distribute
29
 * your version of this file under either the CDDL, the GPL Version 2 or
30
 * to extend the choice of license to its licensees as provided above.
31
 * However, if you add GPL Version 2 code and therefore, elected the GPL
32
 * Version 2 license, then the option applies only if the new code is
33
 * made subject to such option by the copyright holder.
34
 *
35
 * Contributor(s):
36
 *
37
 * Portions Copyrighted 2010 Sun Microsystems, Inc.
38
 */
39
package org.netbeans.modules.java.api.common.ant;
40
41
import java.beans.PropertyChangeListener;
42
import java.beans.PropertyChangeSupport;
43
import javax.swing.Icon;
44
import org.netbeans.api.project.Project;
45
import org.netbeans.api.project.ProjectInformation;
46
import org.netbeans.api.project.ProjectManager;
47
import org.netbeans.spi.project.support.ant.AntProjectEvent;
48
import org.netbeans.spi.project.support.ant.AntProjectHelper;
49
import org.netbeans.spi.project.support.ant.AntProjectListener;
50
import org.netbeans.spi.project.support.ant.PropertyUtils;
51
import org.openide.util.Mutex;
52
import org.openide.util.WeakListeners;
53
import org.openide.xml.XMLUtil;
54
import org.w3c.dom.Element;
55
56
/**
57
 * Default implementation for Java language based projects that use Ant as their
58
 * build tool.
59
 */
60
public class ProjectInfoImpl implements ProjectInformation, AntProjectListener {
61
62
    private static final String ELEMENT_NAME = "name"; // NOI18N
63
    private final Object guard = new Object(); // guard for property changes
64
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
65
    private final Project project;
66
    private final AntProjectHelper projectHelper;
67
    private final String elementName;
68
    private final Icon icon;
69
    private String name;
70
    private String displayName;
71
72
    /**
73
     * Create an instance with all items that will not change during the lifetime
74
     * of the project.
75
     * 
76
     * @param project project that we hold information for
77
     * @param projectHelper class to read/update the project configuration
78
     * @param configurationNameSpace the specific name space that this project type uses
79
     * @param icon project icon
80
     * @param elementName configuration element name
81
     */
82
    public ProjectInfoImpl(Project project, AntProjectHelper projectHelper, Icon icon, String elementName) {
83
        this.project = project;
84
        this.projectHelper = projectHelper;
85
        this.icon = icon;
86
        this.elementName = elementName;
87
88
89
        projectHelper.addAntProjectListener((AntProjectListener) WeakListeners.create(AntProjectListener.class, this, projectHelper));
90
    }
91
92
    /**
93
     * Create an instance with all items that will not change during the lifetime
94
     * of the project.
95
     *
96
     * Uses the default configuration element name 'name'.
97
     *
98
     * @param project project that we hold information for
99
     * @param projectHelper class to read/update the project configuration
100
     * @param configurationNameSpace the specific name space that this project type uses
101
     * @param icon project icon
102
     */
103
    public ProjectInfoImpl(Project project, AntProjectHelper projectHelper, Icon icon) {
104
        this(project, projectHelper, icon, ELEMENT_NAME);
105
    }
106
107
    @Override
108
    public String getName() {
109
        synchronized (guard) {
110
            if (name == null) {
111
                name = PropertyUtils.getUsablePropertyName(getDisplayName());
112
            }
113
            return name;
114
        }
115
    }
116
117
    @Override
118
    public String getDisplayName() {
119
        synchronized (guard) {
120
            if (displayName == null) {
121
                displayName = getElementTextFromConfiguration(elementName);
122
            }
123
124
            return displayName;
125
        }
126
    }
127
128
    @Override
129
    public Icon getIcon() {
130
        return icon;
131
    }
132
133
    @Override
134
    public Project getProject() {
135
        return project;
136
    }
137
138
    /**
139
     * Get the text from the named element of the primary configuration node.
140
     *
141
     * @param elementName name of the element that contains the property value
142
     * @return the property value, or '???' if not found
143
     */
144
    protected String getElementTextFromConfiguration(final String elementName) {
145
        String elementText = ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
146
147
            @Override
148
            public String run() {
149
                Element data = projectHelper.getPrimaryConfigurationData(true, false);
150
                Element element = XMLUtil.findElement(data, elementName, null);
151
152
                return (element != null) ? XMLUtil.findText(element) : "???"; // NOI18N
153
            }
154
        });
155
156
        return elementText;
157
    }
158
159
    /**
160
     * Notify all listeners of the property change passing the old and new values.
161
     *
162
     * @param prop property name
163
     * @param oldValue old value of the property
164
     * @param newValue new value of the property
165
     */
166
    protected void firePropertyChange(String prop, Object oldValue, Object newValue) {
167
        pcs.firePropertyChange(prop, oldValue, newValue);
168
    }
169
170
    @Override
171
    public void addPropertyChangeListener(PropertyChangeListener listener) {
172
        pcs.addPropertyChangeListener(listener);
173
    }
174
175
    @Override
176
    public void removePropertyChangeListener(PropertyChangeListener listener) {
177
        pcs.removePropertyChangeListener(listener);
178
    }
179
180
    @Override
181
    public void configurationXmlChanged(AntProjectEvent ev) {
182
        // only interested in changes to nbproject/project.xml
183
        if (AntProjectHelper.PROJECT_XML_PATH.equals(ev.getPath())) {
184
            // Could be various kinds of changes, but name & displayName might have changed.
185
            String oldName;
186
            String oldDisplayName;
187
            String newName;
188
            String newDisplayName;
189
190
            synchronized (guard) {
191
                oldName = name;
192
                oldDisplayName = displayName;
193
                // reset so they are re-read
194
                name = null;
195
                displayName = null;
196
                newName = getName();
197
                newDisplayName = getDisplayName();
198
            }
199
200
            firePropertyChange(ProjectInformation.PROP_NAME, oldName, newName);
201
            firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME, oldDisplayName, newDisplayName);
202
        }
203
    }
204
205
    @Override
206
    public void propertiesChanged(AntProjectEvent ev) {
207
        // not interested in any properties
208
    }
209
}
(-)a/java.j2seproject/nbproject/project.xml (-1 / +1 lines)
Lines 131-137 Link Here
131
                    <compile-dependency/>
131
                    <compile-dependency/>
132
                    <run-dependency>
132
                    <run-dependency>
133
                        <release-version>0-1</release-version>
133
                        <release-version>0-1</release-version>
134
                        <specification-version>1.15</specification-version>
134
                        <specification-version>1.18</specification-version>
135
                    </run-dependency>
135
                    </run-dependency>
136
                </dependency>
136
                </dependency>
137
                <dependency>
137
                <dependency>
(-)a/java.j2seproject/src/org/netbeans/modules/java/j2seproject/J2SEProject.java (-88 / +3 lines)
Lines 43-49 Link Here
43
43
44
import java.beans.PropertyChangeEvent;
44
import java.beans.PropertyChangeEvent;
45
import java.beans.PropertyChangeListener;
45
import java.beans.PropertyChangeListener;
46
import java.beans.PropertyChangeSupport;
47
import java.io.File;
46
import java.io.File;
48
import java.io.IOException;
47
import java.io.IOException;
49
import java.lang.ref.Reference;
48
import java.lang.ref.Reference;
Lines 71-83 Link Here
71
import org.netbeans.api.java.classpath.GlobalPathRegistry;
70
import org.netbeans.api.java.classpath.GlobalPathRegistry;
72
import org.netbeans.api.java.project.JavaProjectConstants;
71
import org.netbeans.api.java.project.JavaProjectConstants;
73
import org.netbeans.api.project.Project;
72
import org.netbeans.api.project.Project;
74
import org.netbeans.api.project.ProjectInformation;
75
import org.netbeans.api.project.ProjectManager;
73
import org.netbeans.api.project.ProjectManager;
76
import org.netbeans.api.project.SourceGroup;
74
import org.netbeans.api.project.SourceGroup;
77
import org.netbeans.api.project.ant.AntArtifact;
75
import org.netbeans.api.project.ant.AntArtifact;
78
import org.netbeans.api.project.ant.AntBuildExtender;
76
import org.netbeans.api.project.ant.AntBuildExtender;
79
import org.netbeans.api.queries.FileBuiltQuery.Status;
77
import org.netbeans.api.queries.FileBuiltQuery.Status;
80
import org.netbeans.modules.java.api.common.SourceRoots;
78
import org.netbeans.modules.java.api.common.SourceRoots;
79
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
81
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
80
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
82
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
81
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
83
import org.netbeans.modules.java.api.common.classpath.ClassPathModifier;
82
import org.netbeans.modules.java.api.common.classpath.ClassPathModifier;
Lines 97-105 Link Here
97
import org.netbeans.spi.project.support.LookupProviderSupport;
96
import org.netbeans.spi.project.support.LookupProviderSupport;
98
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
97
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
99
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
98
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
100
import org.netbeans.spi.project.support.ant.AntProjectEvent;
101
import org.netbeans.spi.project.support.ant.AntProjectHelper;
99
import org.netbeans.spi.project.support.ant.AntProjectHelper;
102
import org.netbeans.spi.project.support.ant.AntProjectListener;
103
import org.netbeans.spi.project.support.ant.EditableProperties;
100
import org.netbeans.spi.project.support.ant.EditableProperties;
104
import org.netbeans.spi.project.support.ant.FilterPropertyProvider;
101
import org.netbeans.spi.project.support.ant.FilterPropertyProvider;
105
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
102
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
Lines 130-136 Link Here
130
import org.openide.util.lookup.Lookups;
127
import org.openide.util.lookup.Lookups;
131
import org.w3c.dom.Document;
128
import org.w3c.dom.Document;
132
import org.w3c.dom.Element;
129
import org.w3c.dom.Element;
133
import org.w3c.dom.Text;
134
import org.w3c.dom.Node;
130
import org.w3c.dom.Node;
135
import org.w3c.dom.NodeList;
131
import org.w3c.dom.NodeList;
136
132
Lines 146-152 Link Here
146
    privateName=J2SEProjectType.PRIVATE_CONFIGURATION_NAME,
142
    privateName=J2SEProjectType.PRIVATE_CONFIGURATION_NAME,
147
    privateNamespace= J2SEProjectType.PRIVATE_CONFIGURATION_NAMESPACE
143
    privateNamespace= J2SEProjectType.PRIVATE_CONFIGURATION_NAMESPACE
148
)
144
)
149
public final class J2SEProject implements Project, AntProjectListener {
145
public final class J2SEProject implements Project {
150
    
146
    
151
    private static final Icon J2SE_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/java/j2seproject/ui/resources/j2seProject.png", false); // NOI18N
147
    private static final Icon J2SE_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/java/j2seproject/ui/resources/j2seProject.png", false); // NOI18N
152
    private static final Logger LOG = Logger.getLogger(J2SEProject.class.getName());
148
    private static final Logger LOG = Logger.getLogger(J2SEProject.class.getName());
Lines 194-200 Link Here
194
        final J2SEActionProvider actionProvider = new J2SEActionProvider( this, this.updateHelper );
190
        final J2SEActionProvider actionProvider = new J2SEActionProvider( this, this.updateHelper );
195
        lookup = createLookup(aux, actionProvider);
191
        lookup = createLookup(aux, actionProvider);
196
        actionProvider.startFSListener();
192
        actionProvider.startFSListener();
197
        helper.addAntProjectListener(this);
198
    }
193
    }
199
    
194
    
200
    private ClassPathModifier.Callback createClassPathModifierCallback() {
195
    private ClassPathModifier.Callback createClassPathModifierCallback() {
Lines 319-325 Link Here
319
        J2SESources srcs = new J2SESources(this, helper, eval, getSourceRoots(), getTestSourceRoots());
314
        J2SESources srcs = new J2SESources(this, helper, eval, getSourceRoots(), getTestSourceRoots());
320
        final Lookup base = Lookups.fixed(
315
        final Lookup base = Lookups.fixed(
321
            J2SEProject.this,
316
            J2SEProject.this,
322
            new Info(),
317
            new ProjectInfoImpl(this, helper, J2SE_PROJECT_ICON),
323
            aux,
318
            aux,
324
            helper.createCacheDirectoryProvider(),
319
            helper.createCacheDirectoryProvider(),
325
            helper.createAuxiliaryProperties(),
320
            helper.createAuxiliaryProperties(),
Lines 372-390 Link Here
372
        return this.cpMod;
367
        return this.cpMod;
373
    }
368
    }
374
369
375
    public void configurationXmlChanged(AntProjectEvent ev) {
376
        if (ev.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) {
377
            // Could be various kinds of changes, but name & displayName might have changed.
378
            Info info = (Info)getLookup().lookup(ProjectInformation.class);
379
            info.firePropertyChange(ProjectInformation.PROP_NAME);
380
            info.firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME);
381
        }
382
    }
383
384
    public void propertiesChanged(AntProjectEvent ev) {
385
        // currently ignored (probably better to listen to evaluator() if you need to)
386
    }
387
    
388
    // Package private methods -------------------------------------------------
370
    // Package private methods -------------------------------------------------
389
    
371
    
390
    /**
372
    /**
Lines 452-524 Link Here
452
    }
434
    }
453
    
435
    
454
    // Private innerclasses ----------------------------------------------------
436
    // Private innerclasses ----------------------------------------------------
455
    //when #110886 gets implemented, this class is obsolete
456
    private final class Info implements ProjectInformation {
457
        
458
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
459
        private WeakReference<String> cachedName = null;
460
        
461
        Info() {}
462
        
463
        void firePropertyChange(String prop) {
464
            pcs.firePropertyChange(prop, null, null);
465
            synchronized (pcs) {
466
                cachedName = null;
467
            }
468
        }
469
        
470
        public String getName() {
471
            return PropertyUtils.getUsablePropertyName(getDisplayName());
472
        }
473
        
474
        public String getDisplayName() {
475
            synchronized (pcs) {
476
                if (cachedName != null) {
477
                    String dn = cachedName.get();
478
                    if (dn != null) {
479
                        return dn;
480
                    }
481
                }
482
            }
483
            String dn = ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
484
                public String run() {
485
                    Element data = updateHelper.getPrimaryConfigurationData(true);
486
                    // XXX replace by XMLUtil when that has findElement, findText, etc.
487
                    NodeList nl = data.getElementsByTagNameNS(J2SEProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N
488
                    if (nl.getLength() == 1) {
489
                        nl = nl.item(0).getChildNodes();
490
                        if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
491
                            String val = ((Text) nl.item(0)).getNodeValue();
492
                            return val != null ? val : "???";   //NOI18N
493
                        }
494
                    }
495
                    return "???"; // NOI18N
496
                }
497
            });
498
            synchronized (pcs) {
499
                cachedName = new WeakReference<String>(dn);
500
            }
501
            return dn;
502
        }
503
        
504
        public Icon getIcon() {
505
            return J2SE_PROJECT_ICON;
506
        }
507
        
508
        public Project getProject() {
509
            return J2SEProject.this;
510
        }
511
        
512
        public void addPropertyChangeListener(PropertyChangeListener listener) {
513
            pcs.addPropertyChangeListener(listener);
514
        }
515
        
516
        public void removePropertyChangeListener(PropertyChangeListener listener) {
517
            pcs.removePropertyChangeListener(listener);
518
        }
519
        
520
    }
521
    
522
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
437
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
523
        
438
        
524
        ProjectXmlSavedHookImpl() {}
439
        ProjectXmlSavedHookImpl() {}
(-)a/project.ant/src/org/netbeans/spi/project/support/ant/AntProjectHelper.java (-3 / +26 lines)
Lines 772-781 Link Here
772
     * @return the configuration data that is available
772
     * @return the configuration data that is available
773
     */
773
     */
774
    public Element getPrimaryConfigurationData(final boolean shared) {
774
    public Element getPrimaryConfigurationData(final boolean shared) {
775
        return getPrimaryConfigurationData(shared, true);
776
    }
777
778
        /**
779
     * Get the primary configuration data for this project.
780
     * The returned element will be named according to
781
     * {@link AntBasedProjectType#getPrimaryConfigurationDataElementName} and
782
     * {@link AntBasedProjectType#getPrimaryConfigurationDataElementNamespace}.
783
     * The project may read this document fragment to get custom information
784
     * from <code>nbproject/project.xml</code> and <code>nbproject/private/private.xml</code>.
785
     * The fragment will have no parent node and while it may be modified, you must
786
     * use {@link #putPrimaryConfigurationData} to store any changes.
787
     * @param shared if true, refers to <code>project.xml</code>, else refers to
788
     *               <code>private.xml</code>
789
     * @param useNamespace use the name space when looking for the node
790
     * @return the configuration data that is available
791
     */
792
    public Element getPrimaryConfigurationData(final boolean shared, final boolean useNamespace) {
775
        final String name = type.getPrimaryConfigurationDataElementName(shared);
793
        final String name = type.getPrimaryConfigurationDataElementName(shared);
776
        assert name.indexOf(':') == -1;
794
        assert name.indexOf(':') == -1;
777
        final String namespace = type.getPrimaryConfigurationDataElementNamespace(shared);
795
        final String namespace;
778
        assert namespace != null && namespace.length() > 0;
796
        if (useNamespace) {
797
            namespace = type.getPrimaryConfigurationDataElementNamespace(shared);
798
            assert namespace != null && namespace.length() > 0;
799
        } else {
800
            namespace = null;
801
        }
779
        return ProjectManager.mutex().readAccess(new Mutex.Action<Element>() {
802
        return ProjectManager.mutex().readAccess(new Mutex.Action<Element>() {
780
            public Element run() {
803
            public Element run() {
781
                synchronized (modifiedMetadataPaths) {
804
                synchronized (modifiedMetadataPaths) {
Lines 790-796 Link Here
790
            }
813
            }
791
        });
814
        });
792
    }
815
    }
793
    
816
794
    /**
817
    /**
795
     * Store the primary configuration data for this project.
818
     * Store the primary configuration data for this project.
796
     * The supplied element must be named according to
819
     * The supplied element must be named according to

Return to bug 110886