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 (-1 / +24 lines)
Lines 43-49 Link Here
43
<project xmlns="http://www.netbeans.org/ns/project/1">
43
<project xmlns="http://www.netbeans.org/ns/project/1">
44
    <type>org.netbeans.modules.apisupport.project</type>
44
    <type>org.netbeans.modules.apisupport.project</type>
45
    <configuration>
45
    <configuration>
46
        <data xmlns="http://www.netbeans.org/ns/nb-module-project/2">
46
        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
47
            <code-name-base>org.netbeans.modules.j2ee.archive</code-name-base>
47
            <code-name-base>org.netbeans.modules.j2ee.archive</code-name-base>
48
            <module-dependencies>
48
            <module-dependencies>
49
                <dependency>
49
                <dependency>
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.queries.QuerySupport;
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
            QuerySupport.createProjectInformation(helper, ArchiveProject.this, 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 / +4 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 106-119 Link Here
106
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
104
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
107
import org.netbeans.spi.project.support.LookupProviderSupport;
105
import org.netbeans.spi.project.support.LookupProviderSupport;
108
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
106
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;
107
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;
108
import org.netbeans.spi.project.support.ant.EditableProperties;
113
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
109
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
114
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
110
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
115
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
111
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;
112
import org.netbeans.spi.project.support.ant.ReferenceHelper;
118
import org.netbeans.spi.project.ui.PrivilegedTemplates;
113
import org.netbeans.spi.project.ui.PrivilegedTemplates;
119
import org.netbeans.spi.project.ui.ProjectOpenedHook;
114
import org.netbeans.spi.project.ui.ProjectOpenedHook;
Lines 134-147 Link Here
134
import org.openide.util.Exceptions;
129
import org.openide.util.Exceptions;
135
import org.openide.util.ImageUtilities;
130
import org.openide.util.ImageUtilities;
136
import org.openide.util.Lookup;
131
import org.openide.util.Lookup;
137
import org.openide.util.Mutex;
138
import org.openide.util.NbBundle;
132
import org.openide.util.NbBundle;
139
import org.openide.util.RequestProcessor;
133
import org.openide.util.RequestProcessor;
140
import org.openide.util.lookup.Lookups;
134
import org.openide.util.lookup.Lookups;
141
import org.w3c.dom.Element;
135
import org.w3c.dom.Element;
142
import org.w3c.dom.Node;
143
import org.w3c.dom.NodeList;
136
import org.w3c.dom.NodeList;
144
import org.w3c.dom.Text;
145
137
146
/**
138
/**
147
 * Represents one plain Application Client project.
139
 * Represents one plain Application Client project.
Lines 153-159 Link Here
153
    sharedNamespace=AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE,
145
    sharedNamespace=AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE,
154
    privateNamespace=AppClientProjectType.PRIVATE_CONFIGURATION_NAMESPACE
146
    privateNamespace=AppClientProjectType.PRIVATE_CONFIGURATION_NAMESPACE
155
)
147
)
156
public final class AppClientProject implements Project, AntProjectListener, FileChangeListener {
148
public final class AppClientProject implements Project, FileChangeListener {
157
    
149
    
158
    private final Icon CAR_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/clientproject/ui/resources/appclient.gif", false); // NOI18N
150
    private final Icon CAR_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/clientproject/ui/resources/appclient.gif", false); // NOI18N
159
    
151
    
Lines 216-222 Link Here
216
            getClassPathUiSupportCallback());
208
            getClassPathUiSupportCallback());
217
        classPathExtender = new ClassPathExtender(cpMod, ProjectProperties.JAVAC_CLASSPATH, ClassPathSupportCallbackImpl.ELEMENT_INCLUDED_LIBRARIES);
209
        classPathExtender = new ClassPathExtender(cpMod, ProjectProperties.JAVAC_CLASSPATH, ClassPathSupportCallbackImpl.ELEMENT_INCLUDED_LIBRARIES);
218
        lookup = createLookup(aux, cpProvider);
210
        lookup = createLookup(aux, cpProvider);
219
        helper.addAntProjectListener(this);
220
    }
211
    }
221
    
212
    
222
    private ClassPathModifier.Callback createClassPathModifierCallback() {
213
    private ClassPathModifier.Callback createClassPathModifierCallback() {
Lines 298-304 Link Here
298
        FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), AppClientProjectProperties.SOURCE_ENCODING);
289
        FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), AppClientProjectProperties.SOURCE_ENCODING);
299
        AppClientSources sources = new AppClientSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots());
290
        AppClientSources sources = new AppClientSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots());
300
        Lookup base = Lookups.fixed(new Object[] {
291
        Lookup base = Lookups.fixed(new Object[] {
301
            new Info(),
292
            QuerySupport.createProjectInformation(helper, this, CAR_PROJECT_ICON),
302
            aux,
293
            aux,
303
            helper.createCacheDirectoryProvider(),
294
            helper.createCacheDirectoryProvider(),
304
            helper.createAuxiliaryProperties(),
295
            helper.createAuxiliaryProperties(),
Lines 354-372 Link Here
354
        return this.cpProvider;
345
        return this.cpProvider;
355
    }
346
    }
356
    
347
    
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 -------------------------------------------------
348
    // Package private methods -------------------------------------------------
371
    
349
    
372
    /**
350
    /**
Lines 422-441 Link Here
422
    
400
    
423
    /** Return configured project name. */
401
    /** Return configured project name. */
424
    public String getName() {
402
    public String getName() {
425
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
403
        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
    }
404
    }
440
405
441
    public void fileAttributeChanged (FileAttributeEvent fe) {
406
    public void fileAttributeChanged (FileAttributeEvent fe) {
Lines 588-660 Link Here
588
    }
553
    }
589
    
554
    
590
    // Private innerclasses ----------------------------------------------------
555
    // 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 {
556
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
659
        
557
        
660
        ProjectXmlSavedHookImpl() {}
558
        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 82-87 Link Here
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;
84
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
81
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
82
import org.netbeans.modules.java.api.common.queries.QuerySupport;
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;
87
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport;
85
import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport;
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
            QuerySupport.createProjectInformation(helper, this, 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 / +4 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-137 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;
Lines 149-159 Link Here
149
import org.openide.DialogDisplayer;
144
import org.openide.DialogDisplayer;
150
import org.openide.util.NbBundle;
145
import org.openide.util.NbBundle;
151
import org.w3c.dom.Document;
146
import org.w3c.dom.Document;
152
import org.w3c.dom.Comment;
153
import org.w3c.dom.Element;
147
import org.w3c.dom.Element;
154
import org.w3c.dom.Node;
155
import org.w3c.dom.NodeList;
148
import org.w3c.dom.NodeList;
156
import org.w3c.dom.Text;
157
import org.netbeans.modules.websvc.api.webservices.WebServicesSupport;
149
import org.netbeans.modules.websvc.api.webservices.WebServicesSupport;
158
import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
150
import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
159
import org.netbeans.modules.websvc.spi.webservices.WebServicesSupportFactory;
151
import org.netbeans.modules.websvc.spi.webservices.WebServicesSupportFactory;
Lines 161-167 Link Here
161
import org.netbeans.spi.java.project.support.LookupMergerSupport;
153
import org.netbeans.spi.java.project.support.LookupMergerSupport;
162
import org.netbeans.spi.project.support.LookupProviderSupport;
154
import org.netbeans.spi.project.support.LookupProviderSupport;
163
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
155
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;
156
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
166
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
157
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
167
import org.openide.NotifyDescriptor;
158
import org.openide.NotifyDescriptor;
Lines 184-190 Link Here
184
    sharedNamespace=EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE,
175
    sharedNamespace=EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE,
185
    privateNamespace=EjbJarProjectType.PRIVATE_CONFIGURATION_NAMESPACE
176
    privateNamespace=EjbJarProjectType.PRIVATE_CONFIGURATION_NAMESPACE
186
)
177
)
187
public class EjbJarProject implements Project, AntProjectListener, FileChangeListener {
178
public class EjbJarProject implements Project, FileChangeListener {
188
    
179
    
189
    private final Icon PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/ejbjarproject/ui/resources/ejbjarProjectIcon.gif", false); // NOI18N
180
    private final Icon PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/ejbjarproject/ui/resources/ejbjarProjectIcon.gif", false); // NOI18N
190
    
181
    
Lines 312-318 Link Here
312
        css = new CopyOnSaveSupport();
303
        css = new CopyOnSaveSupport();
313
        artifactSupport = new ArtifactCopySupport();
304
        artifactSupport = new ArtifactCopySupport();
314
        deployOnSaveSupport = new DeployOnSaveSupportProxy();
305
        deployOnSaveSupport = new DeployOnSaveSupportProxy();
315
        helper.addAntProjectListener(this);
316
        ProjectManager.mutex().postWriteRequest(
306
        ProjectManager.mutex().postWriteRequest(
317
             new Runnable () {
307
             new Runnable () {
318
                 public void run() {
308
                 public void run() {
Lines 409-415 Link Here
409
        Lookup base = Lookups.fixed(new Object[] {
399
        Lookup base = Lookups.fixed(new Object[] {
410
                EjbJarProject.this, // never cast an externally obtained Project to EjbJarProject - use lookup instead
400
                EjbJarProject.this, // never cast an externally obtained Project to EjbJarProject - use lookup instead
411
                buildExtender,
401
                buildExtender,
412
                new Info(),
402
                QuerySupport.createProjectInformation(helper, this, PROJECT_ICON),
413
                aux,
403
                aux,
414
                helper.createCacheDirectoryProvider(),
404
                helper.createCacheDirectoryProvider(),
415
                helper.createAuxiliaryProperties(),
405
                helper.createAuxiliaryProperties(),
Lines 468-487 Link Here
468
        return this.cpProvider;
458
        return this.cpProvider;
469
    }
459
    }
470
    
460
    
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() {
461
    String getBuildXmlName() {
486
        String storedName = helper.getStandardPropertyEvaluator().getProperty(EjbJarProjectProperties.BUILD_FILE);
462
        String storedName = helper.getStandardPropertyEvaluator().getProperty(EjbJarProjectProperties.BUILD_FILE);
487
        return storedName == null ? GeneratedFilesHelper.BUILD_XML_PATH : storedName;
463
        return storedName == null ? GeneratedFilesHelper.BUILD_XML_PATH : storedName;
Lines 583-602 Link Here
583
    
559
    
584
    /** Return configured project name. */
560
    /** Return configured project name. */
585
    public String getName() {
561
    public String getName() {
586
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
562
        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
    }
563
    }
601
564
602
    /** Store configured project name. */
565
    /** Store configured project name. */
Lines 783-843 Link Here
783
    }
746
    }
784
747
785
    // Private innerclasses ----------------------------------------------------
748
    // 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 {
749
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
842
        
750
        
843
        ProjectXmlSavedHookImpl() {}
751
        ProjectXmlSavedHookImpl() {}
(-)a/java.api.common/apichanges.xml (+20 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, provide two implementations 
181
                     via QuerySupport factory methods..</summary>
182
            <version major="1" minor="18"/>
183
            <date day="2" month="5" year="2010"/>
184
            <author login="mvfranz"/>
185
            <compatibility addition="yes"/>
186
            <description>
187
                <p>
188
                    Created a re-usable implementation of ProjectInformation that can be
189
                    used within the Java language projects.  Provide two factory methods
190
                    for creation in QuerySupport, one that uses AntProjectHelper and one
191
                    that uses UpdateHelper. 
192
                </p>
193
            </description>
194
            <class package="org.netbeans.modules.java.api.common.ant" name="ProjectInfoImpl"/>
195
            <class package="org.netbeans.modules.java.api.common.queries" name="QuerySupport"/>
196
            <issue number="110886"/>
197
        </change>
178
198
179
    </changes>
199
    </changes>
180
200
(-)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 (+194 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.xml.XMLUtil;
53
import org.w3c.dom.Element;
54
55
/**
56
 * Default implementation for Java language based projects that use Ant as their
57
 * build tool.
58
 */
59
public abstract class ProjectInfoImpl implements ProjectInformation, AntProjectListener {
60
61
    public static final String DEFAULT_ELEMENT_NAME = "name"; // NOI18N
62
    private final Object guard = new Object(); // guard for property changes
63
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
64
    private final Project project;
65
    private final String elementName;
66
    private final Icon icon;
67
    private String name;
68
    private String displayName;
69
70
    /**
71
     * Create an instance with all items that will not change during the lifetime
72
     * of the project.
73
     * 
74
     * @param project project that we hold information for
75
     * @param projectHelper class to read/update the project configuration
76
     * @param configurationNameSpace the specific name space that this project type uses
77
     * @param icon project icon
78
     * @param elementName configuration element name
79
     */
80
    public ProjectInfoImpl(Project project, Icon icon, String elementName) {
81
        this.project = project;
82
        this.icon = icon;
83
        this.elementName = elementName;
84
    }
85
86
    @Override
87
    public String getName() {
88
        synchronized (guard) {
89
            if (name == null) {
90
                name = PropertyUtils.getUsablePropertyName(getDisplayName());
91
            }
92
            return name;
93
        }
94
    }
95
96
    @Override
97
    public String getDisplayName() {
98
        synchronized (guard) {
99
            if (displayName == null) {
100
                displayName = getElementTextFromConfiguration(elementName);
101
            }
102
103
            return displayName;
104
        }
105
    }
106
107
    @Override
108
    public Icon getIcon() {
109
        return icon;
110
    }
111
112
    @Override
113
    public Project getProject() {
114
        return project;
115
    }
116
117
    /**
118
     * Get the text from the named element of the primary configuration node.
119
     *
120
     * @param elementName name of the element that contains the property value
121
     * @return the property value, or '???' if not found
122
     */
123
    protected String getElementTextFromConfiguration(final String elementName) {
124
        String elementText = ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
125
126
            @Override
127
            public String run() {
128
                Element data = getPrimaryConfigurationData();
129
                Element element = XMLUtil.findElement(data, elementName, null);
130
                return (element != null) ? XMLUtil.findText(element) : "???"; // NOI18N
131
            }
132
        });
133
134
        return elementText;
135
    }
136
137
    /**
138
     * Get the primary configuration data for this project.
139
     * 
140
     * @return
141
     */
142
    protected abstract Element getPrimaryConfigurationData();
143
144
    /**
145
     * Notify all listeners of the property change passing the old and new values.
146
     *
147
     * @param prop property name
148
     * @param oldValue old value of the property
149
     * @param newValue new value of the property
150
     */
151
    protected void firePropertyChange(String prop, Object oldValue, Object newValue) {
152
        pcs.firePropertyChange(prop, oldValue, newValue);
153
    }
154
155
    @Override
156
    public void addPropertyChangeListener(PropertyChangeListener listener) {
157
        pcs.addPropertyChangeListener(listener);
158
    }
159
160
    @Override
161
    public void removePropertyChangeListener(PropertyChangeListener listener) {
162
        pcs.removePropertyChangeListener(listener);
163
    }
164
165
    @Override
166
    public void configurationXmlChanged(AntProjectEvent ev) {
167
        // only interested in changes to nbproject/project.xml
168
        if (AntProjectHelper.PROJECT_XML_PATH.equals(ev.getPath())) {
169
            // Could be various kinds of changes, but name & displayName might have changed.
170
            String oldName;
171
            String oldDisplayName;
172
            String newName;
173
            String newDisplayName;
174
175
            synchronized (guard) {
176
                oldName = name;
177
                oldDisplayName = displayName;
178
                // reset so they are re-read
179
                name = null;
180
                displayName = null;
181
                newName = getName();
182
                newDisplayName = getDisplayName();
183
            }
184
185
            firePropertyChange(ProjectInformation.PROP_NAME, oldName, newName);
186
            firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME, oldDisplayName, newDisplayName);
187
        }
188
    }
189
190
    @Override
191
    public void propertiesChanged(AntProjectEvent ev) {
192
        // not interested in any properties
193
    }
194
}
(-)a/java.api.common/src/org/netbeans/modules/java/api/common/queries/QuerySupport.java (+54 lines)
Lines 39-46 Link Here
39
39
40
package org.netbeans.modules.java.api.common.queries;
40
package org.netbeans.modules.java.api.common.queries;
41
41
42
import javax.swing.Icon;
42
import org.netbeans.modules.java.api.common.SourceRoots;
43
import org.netbeans.modules.java.api.common.SourceRoots;
43
import org.netbeans.api.java.queries.AnnotationProcessingQuery.Result;
44
import org.netbeans.api.java.queries.AnnotationProcessingQuery.Result;
45
import org.netbeans.api.project.Project;
46
import org.netbeans.api.project.ProjectInformation;
47
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
48
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
44
import org.netbeans.spi.java.queries.AnnotationProcessingQueryImplementation;
49
import org.netbeans.spi.java.queries.AnnotationProcessingQueryImplementation;
45
import org.netbeans.spi.java.queries.BinaryForSourceQueryImplementation;
50
import org.netbeans.spi.java.queries.BinaryForSourceQueryImplementation;
46
import org.netbeans.spi.java.queries.JavadocForBinaryQueryImplementation;
51
import org.netbeans.spi.java.queries.JavadocForBinaryQueryImplementation;
Lines 48-59 Link Here
48
import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation;
53
import org.netbeans.spi.java.queries.SourceForBinaryQueryImplementation;
49
import org.netbeans.spi.java.queries.SourceLevelQueryImplementation;
54
import org.netbeans.spi.java.queries.SourceLevelQueryImplementation;
50
import org.netbeans.spi.project.support.ant.AntProjectHelper;
55
import org.netbeans.spi.project.support.ant.AntProjectHelper;
56
import org.netbeans.spi.project.support.ant.AntProjectListener;
51
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
57
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
52
import org.netbeans.spi.queries.FileBuiltQueryImplementation;
58
import org.netbeans.spi.queries.FileBuiltQueryImplementation;
53
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
59
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
54
import org.netbeans.spi.queries.SharabilityQueryImplementation;
60
import org.netbeans.spi.queries.SharabilityQueryImplementation;
55
import org.openide.loaders.CreateFromTemplateAttributesProvider;
61
import org.openide.loaders.CreateFromTemplateAttributesProvider;
56
import org.openide.util.Parameters;
62
import org.openide.util.Parameters;
63
import org.openide.util.WeakListeners;
64
import org.w3c.dom.Element;
57
65
58
/**
66
/**
59
 * Support class for creating different types of queries implementations.
67
 * Support class for creating different types of queries implementations.
Lines 302-305 Link Here
302
            String annotationProcessingEnabledProperty, String annotationProcessingEnabledInEditorProperty, String runAllAnnotationProcessorsProperty, String annotationProcessorsProperty, String sourceOutputProperty, String processorOptionsProperty) {
310
            String annotationProcessingEnabledProperty, String annotationProcessingEnabledInEditorProperty, String runAllAnnotationProcessorsProperty, String annotationProcessorsProperty, String sourceOutputProperty, String processorOptionsProperty) {
303
        return new AnnotationProcessingQueryImpl(helper, evaluator, annotationProcessingEnabledProperty, annotationProcessingEnabledInEditorProperty, runAllAnnotationProcessorsProperty, annotationProcessorsProperty, sourceOutputProperty, processorOptionsProperty);
311
        return new AnnotationProcessingQueryImpl(helper, evaluator, annotationProcessingEnabledProperty, annotationProcessingEnabledInEditorProperty, runAllAnnotationProcessorsProperty, annotationProcessorsProperty, sourceOutputProperty, processorOptionsProperty);
304
    }
312
    }
313
314
    public static ProjectInformation createProjectInformation(AntProjectHelper projectHelper, Project project, Icon icon) {
315
        return new QuerySupport.AntHelper(projectHelper, project, icon, ProjectInfoImpl.DEFAULT_ELEMENT_NAME);
316
    }
317
318
    public static ProjectInformation createProjectInformation(UpdateHelper updateHelper, Project project, Icon icon) {
319
        return new QuerySupport.AntUpdateHelper(updateHelper, project, icon, ProjectInfoImpl.DEFAULT_ELEMENT_NAME);
320
    }
321
    
322
    private static class AntHelper extends ProjectInfoImpl {
323
324
        private final AntProjectHelper projectHelper;
325
326
        @SuppressWarnings("LeakingThisInConstructor")
327
        public AntHelper(AntProjectHelper projectHelper, Project project, Icon icon, String elementName) {
328
            super(project, icon, elementName);
329
            this.projectHelper = projectHelper;
330
331
            projectHelper.addAntProjectListener((AntProjectListener) WeakListeners.create(AntProjectListener.class, this, projectHelper));
332
        }
333
334
335
        @Override
336
        protected Element getPrimaryConfigurationData() {
337
            return projectHelper.getPrimaryConfigurationData(true);
338
        }
339
    }
340
341
    private static class AntUpdateHelper extends ProjectInfoImpl {
342
343
        private final UpdateHelper updateHelper;
344
345
        @SuppressWarnings("LeakingThisInConstructor")
346
        public AntUpdateHelper(UpdateHelper updateHelper, Project project, Icon icon, String elementName) {
347
            super(project, icon, elementName);
348
            this.updateHelper = updateHelper;
349
350
            AntProjectHelper projectHelper = updateHelper.getAntProjectHelper();
351
            projectHelper.addAntProjectListener((AntProjectListener) WeakListeners.create(AntProjectListener.class, this, projectHelper));
352
        }
353
354
        @Override
355
        protected Element getPrimaryConfigurationData() {
356
            return updateHelper.getPrimaryConfigurationData(true);
357
        }
358
    }
305
}
359
}
(-)a/java.api.common/test/unit/src/org/netbeans/modules/java/api/common/queries/QuerySupportTest.java (+158 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.queries;
40
41
import java.io.IOException;
42
import org.junit.Test;
43
import org.netbeans.api.project.Project;
44
import org.netbeans.api.project.ProjectInformation;
45
import org.netbeans.api.project.ProjectManager;
46
import org.netbeans.api.project.TestUtil;
47
import org.netbeans.junit.NbTestCase;
48
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
49
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
50
import org.netbeans.modules.project.ant.AntBasedProjectFactorySingleton;
51
import org.netbeans.spi.project.support.ant.AntBasedTestUtil;
52
import org.netbeans.spi.project.support.ant.AntProjectHelper;
53
import org.netbeans.spi.project.support.ant.EditableProperties;
54
import org.netbeans.spi.project.support.ant.ProjectGenerator;
55
import org.openide.filesystems.FileObject;
56
import org.openide.filesystems.FileUtil;
57
import org.openide.util.test.MockLookup;
58
import org.w3c.dom.Element;
59
60
/**
61
 *
62
 */
63
public class QuerySupportTest extends NbTestCase {
64
65
    public QuerySupportTest(String testName) {
66
        super(testName);
67
    }
68
    private FileObject scratch;
69
    private FileObject projdir;
70
71
    @Override
72
    protected void setUp() throws Exception {
73
        FileObject fo = FileUtil.getConfigFile("Services");
74
        if (fo != null) {
75
            fo.delete();
76
        }
77
        scratch = TestUtil.makeScratchDir(this);
78
        projdir = scratch.createFolder("proj");
79
        MockLookup.setInstances(
80
                new AntBasedProjectFactorySingleton(),
81
                AntBasedTestUtil.testAntBasedProjectType());
82
    }
83
84
    @Override
85
    protected void tearDown() throws Exception {
86
        scratch = null;
87
        projdir = null;
88
        super.tearDown();
89
    }
90
91
    @Test
92
    public void testAntHelperProject() throws IOException {
93
        AntProjectHelper h = ProjectGenerator.createProject(projdir, "test");
94
        Project p = ProjectManager.getDefault().findProject(projdir);
95
96
        ProjectInformation pi = QuerySupport.createProjectInformation(h, p, null);
97
        assertEquals("???", pi.getDisplayName());
98
        assertEquals("___", pi.getName());
99
        Element data = h.getPrimaryConfigurationData(true);
100
        Element name = data.getOwnerDocument().createElementNS("urn:test:shared", "name");
101
        name.setTextContent("Test AntProjectHelper");
102
        data.appendChild(name);
103
        h.putPrimaryConfigurationData(data, true);
104
105
        assertEquals("Test AntProjectHelper", pi.getDisplayName());
106
        assertEquals("Test_AntProjectHelper", pi.getName());
107
    }
108
109
    @Test
110
    public void testAntUpdateHelperProject() throws IOException {
111
        AntProjectHelper ah = ProjectGenerator.createProject(projdir, "test");
112
        Project p = ProjectManager.getDefault().findProject(projdir);
113
        UpdateImplementation upi = createUpdateImpl(ah);
114
        UpdateHelper uh = new UpdateHelper(upi, ah);
115
116
        ProjectInformation pi = QuerySupport.createProjectInformation(uh, p, null);
117
        assertEquals("???", pi.getDisplayName());
118
        assertEquals("___", pi.getName());
119
        Element data = uh.getPrimaryConfigurationData(true);
120
        Element name = data.getOwnerDocument().createElementNS("urn:test:shared", "name");
121
        name.setTextContent("Test UpdateHelper");
122
        data.appendChild(name);
123
        uh.putPrimaryConfigurationData(data, true);
124
125
        assertEquals("Test UpdateHelper", pi.getDisplayName());
126
        assertEquals("Test_UpdateHelper", pi.getName());
127
    }
128
129
    private UpdateImplementation createUpdateImpl(final AntProjectHelper ah) {
130
        return new UpdateImplementation() {
131
132
            @Override
133
            public boolean isCurrent() {
134
                return false;
135
            }
136
137
            @Override
138
            public boolean canUpdate() {
139
                return true;
140
            }
141
142
            @Override
143
            public void saveUpdate(EditableProperties props) throws IOException {
144
                // do nothing
145
            }
146
147
            @Override
148
            public Element getUpdatedSharedConfigurationData() {
149
                return ah.getPrimaryConfigurationData(true);
150
            }
151
152
            @Override
153
            public EditableProperties getUpdatedProjectProperties() {
154
                throw new UnsupportedOperationException("Not supported yet.");
155
            }
156
        };
157
    }
158
}
(-)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 / +2 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-77 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;
Lines 97-105 Link Here
97
import org.netbeans.spi.project.support.LookupProviderSupport;
95
import org.netbeans.spi.project.support.LookupProviderSupport;
98
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
96
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
99
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
97
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;
98
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;
99
import org.netbeans.spi.project.support.ant.EditableProperties;
104
import org.netbeans.spi.project.support.ant.FilterPropertyProvider;
100
import org.netbeans.spi.project.support.ant.FilterPropertyProvider;
105
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
101
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
Lines 130-136 Link Here
130
import org.openide.util.lookup.Lookups;
126
import org.openide.util.lookup.Lookups;
131
import org.w3c.dom.Document;
127
import org.w3c.dom.Document;
132
import org.w3c.dom.Element;
128
import org.w3c.dom.Element;
133
import org.w3c.dom.Text;
134
import org.w3c.dom.Node;
129
import org.w3c.dom.Node;
135
import org.w3c.dom.NodeList;
130
import org.w3c.dom.NodeList;
136
131
Lines 146-152 Link Here
146
    privateName=J2SEProjectType.PRIVATE_CONFIGURATION_NAME,
141
    privateName=J2SEProjectType.PRIVATE_CONFIGURATION_NAME,
147
    privateNamespace= J2SEProjectType.PRIVATE_CONFIGURATION_NAMESPACE
142
    privateNamespace= J2SEProjectType.PRIVATE_CONFIGURATION_NAMESPACE
148
)
143
)
149
public final class J2SEProject implements Project, AntProjectListener {
144
public final class J2SEProject implements Project {
150
    
145
    
151
    private static final Icon J2SE_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/java/j2seproject/ui/resources/j2seProject.png", false); // NOI18N
146
    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());
147
    private static final Logger LOG = Logger.getLogger(J2SEProject.class.getName());
Lines 194-200 Link Here
194
        final J2SEActionProvider actionProvider = new J2SEActionProvider( this, this.updateHelper );
189
        final J2SEActionProvider actionProvider = new J2SEActionProvider( this, this.updateHelper );
195
        lookup = createLookup(aux, actionProvider);
190
        lookup = createLookup(aux, actionProvider);
196
        actionProvider.startFSListener();
191
        actionProvider.startFSListener();
197
        helper.addAntProjectListener(this);
198
    }
192
    }
199
    
193
    
200
    private ClassPathModifier.Callback createClassPathModifierCallback() {
194
    private ClassPathModifier.Callback createClassPathModifierCallback() {
Lines 319-325 Link Here
319
        J2SESources srcs = new J2SESources(this, helper, eval, getSourceRoots(), getTestSourceRoots());
313
        J2SESources srcs = new J2SESources(this, helper, eval, getSourceRoots(), getTestSourceRoots());
320
        final Lookup base = Lookups.fixed(
314
        final Lookup base = Lookups.fixed(
321
            J2SEProject.this,
315
            J2SEProject.this,
322
            new Info(),
316
            QuerySupport.createProjectInformation(updateHelper, this, J2SE_PROJECT_ICON),
323
            aux,
317
            aux,
324
            helper.createCacheDirectoryProvider(),
318
            helper.createCacheDirectoryProvider(),
325
            helper.createAuxiliaryProperties(),
319
            helper.createAuxiliaryProperties(),
Lines 372-390 Link Here
372
        return this.cpMod;
366
        return this.cpMod;
373
    }
367
    }
374
368
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 -------------------------------------------------
369
    // Package private methods -------------------------------------------------
389
    
370
    
390
    /**
371
    /**
Lines 452-524 Link Here
452
    }
433
    }
453
    
434
    
454
    // Private innerclasses ----------------------------------------------------
435
    // 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 {
436
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
523
        
437
        
524
        ProjectXmlSavedHookImpl() {}
438
        ProjectXmlSavedHookImpl() {}

Return to bug 110886