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 (+9 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/>
(-)a/j2ee.archive/src/org/netbeans/modules/j2ee/archive/project/ArchiveProject.java (-75 / +21 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 59-64 Link Here
59
import org.netbeans.api.project.Project;
57
import org.netbeans.api.project.Project;
60
import org.netbeans.api.project.ProjectInformation;
58
import org.netbeans.api.project.ProjectInformation;
61
import org.netbeans.api.project.ProjectManager;
59
import org.netbeans.api.project.ProjectManager;
60
import org.netbeans.api.project.ProjectUtils;
62
import org.netbeans.api.project.ant.AntArtifact;
61
import org.netbeans.api.project.ant.AntArtifact;
63
import org.netbeans.modules.j2ee.archive.Util;
62
import org.netbeans.modules.j2ee.archive.Util;
64
import org.netbeans.modules.j2ee.archive.customizer.ProvidesCustomizer;
63
import org.netbeans.modules.j2ee.archive.customizer.ProvidesCustomizer;
Lines 74-79 Link Here
74
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleImplementation2;
73
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleImplementation2;
75
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
74
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
76
import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel;
75
import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel;
76
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
77
import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
77
import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
78
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
78
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
79
import org.netbeans.spi.project.AuxiliaryConfiguration;
79
import org.netbeans.spi.project.AuxiliaryConfiguration;
Lines 83-89 Link Here
83
import org.netbeans.spi.project.support.ant.AntProjectHelper;
83
import org.netbeans.spi.project.support.ant.AntProjectHelper;
84
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
84
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
85
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
85
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;
86
import org.netbeans.spi.project.ui.PrivilegedTemplates;
88
import org.netbeans.spi.project.ui.RecommendedTemplates;
87
import org.netbeans.spi.project.ui.RecommendedTemplates;
89
import org.openide.ErrorManager;
88
import org.openide.ErrorManager;
Lines 196-217 Link Here
196
    
195
    
197
    /** Return configured project name. */
196
    /** Return configured project name. */
198
    public String getName() {
197
    public String getName() {
199
        return (String) ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
198
        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
    }
199
    }
216
    
200
    
217
    public ArchiveProjectProperties getArchiveProjectProperties() {
201
    public ArchiveProjectProperties getArchiveProjectProperties() {
Lines 226-234 Link Here
226
    private final class HelpfulLookup extends Lookup {
210
    private final class HelpfulLookup extends Lookup {
227
        
211
        
228
        private boolean verbose = Boolean.getBoolean("archiveproject.lookup.verbose");
212
        private boolean verbose = Boolean.getBoolean("archiveproject.lookup.verbose");
229
        
213
230
        Lookup inner = LookupProviderSupport.createCompositeLookup(Lookups.fixed(new Object[] {
214
        Lookup inner = LookupProviderSupport.createCompositeLookup(Lookups.fixed(new Object[] {
231
            new Info(),
215
            new Info(ArchiveProject.this, helper, updateHelper, ArchiveProjectType.PROJECT_CONFIGURATION_NS, ARCHIVE_PROJECT_ICON),
232
            helper.createAuxiliaryConfiguration(),
216
            helper.createAuxiliaryConfiguration(),
233
            helper.createCacheDirectoryProvider(),
217
            helper.createCacheDirectoryProvider(),
234
            helper.createGlobFileBuiltQuery(eval, new String[] {"${src.dir}/*.java"},
218
            helper.createGlobFileBuiltQuery(eval, new String[] {"${src.dir}/*.java"},
Lines 311-374 Link Here
311
            return ret;
295
            return ret;
312
        }
296
        }
313
    }
297
    }
314
    //when #110886 gets implemented, this class is obsolete    
298
315
    private final class Info implements ProjectInformation {
299
    /**
316
        
300
     * Need to over-ride getPrimaryConfiguratoinData.
317
        private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
301
     */
318
        private WeakReference<String> cachedName = null;
302
    private final class Info extends ProjectInfoImpl {
319
        
303
320
        Info() {}
304
        private final UpdateHelper updateHelper;
321
        
305
322
        void firePropertyChange(String prop) {
306
        public Info(Project project, AntProjectHelper projectHelper, UpdateHelper updateHelper, String configurationNameSpace, Icon icon) {
323
            pcs.firePropertyChange(prop, null, null);
307
            super(project, projectHelper, configurationNameSpace, icon);
324
            synchronized (pcs) {
308
            this.updateHelper = updateHelper;
325
                cachedName = null;
326
            }
327
        }
309
        }
328
        
310
329
        @Override
311
        @Override
330
        public String getName() {
312
        protected Element getPrimaryConfigurationData(boolean shared) {
331
            return PropertyUtils.getUsablePropertyName(getDisplayName());
313
            return updateHelper.getPrimaryConfigurationData(true);
332
        }
314
        }
333
        
315
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
    }
316
    }
371
    
317
372
    private final class MyAntProvider implements AntArtifactProvider {
318
    private final class MyAntProvider implements AntArtifactProvider {
373
        // TODO - Need to fix for ejb-jar/app-client/resource-adapter cases
319
        // TODO - Need to fix for ejb-jar/app-client/resource-adapter cases
374
        @Override
320
        @Override
(-)a/j2ee.clientproject/nbproject/project.xml (-1 / +1 lines)
Lines 206-212 Link Here
206
                    <compile-dependency/>
206
                    <compile-dependency/>
207
                    <run-dependency>
207
                    <run-dependency>
208
                        <release-version>0-1</release-version>
208
                        <release-version>0-1</release-version>
209
                        <specification-version>1.15</specification-version>
209
                        <specification-version>1.18</specification-version>
210
                    </run-dependency>
210
                    </run-dependency>
211
                </dependency>
211
                </dependency>
212
                <dependency>
212
                <dependency>
(-)a/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/AppClientProject.java (-105 / +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 62-67 Link Here
62
import org.netbeans.api.project.Project;
60
import org.netbeans.api.project.Project;
63
import org.netbeans.api.project.ProjectInformation;
61
import org.netbeans.api.project.ProjectInformation;
64
import org.netbeans.api.project.ProjectManager;
62
import org.netbeans.api.project.ProjectManager;
63
import org.netbeans.api.project.ProjectUtils;
65
import org.netbeans.api.project.SourceGroup;
64
import org.netbeans.api.project.SourceGroup;
66
import org.netbeans.api.project.ant.AntArtifact;
65
import org.netbeans.api.project.ant.AntArtifact;
67
import org.netbeans.api.project.ant.AntBuildExtender;
66
import org.netbeans.api.project.ant.AntBuildExtender;
Lines 88-93 Link Here
88
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation;
87
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation;
89
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation2;
88
import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation2;
90
import org.netbeans.modules.java.api.common.SourceRoots;
89
import org.netbeans.modules.java.api.common.SourceRoots;
90
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
91
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
91
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
92
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
92
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
93
import org.netbeans.modules.java.api.common.project.ProjectProperties;
93
import org.netbeans.modules.java.api.common.project.ProjectProperties;
Lines 106-119 Link Here
106
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
106
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
107
import org.netbeans.spi.project.support.LookupProviderSupport;
107
import org.netbeans.spi.project.support.LookupProviderSupport;
108
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
108
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;
109
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;
110
import org.netbeans.spi.project.support.ant.EditableProperties;
113
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
111
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
114
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
112
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
115
import org.netbeans.spi.project.support.ant.PropertyEvaluator;
113
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;
114
import org.netbeans.spi.project.support.ant.ReferenceHelper;
118
import org.netbeans.spi.project.ui.PrivilegedTemplates;
115
import org.netbeans.spi.project.ui.PrivilegedTemplates;
119
import org.netbeans.spi.project.ui.ProjectOpenedHook;
116
import org.netbeans.spi.project.ui.ProjectOpenedHook;
Lines 134-147 Link Here
134
import org.openide.util.Exceptions;
131
import org.openide.util.Exceptions;
135
import org.openide.util.ImageUtilities;
132
import org.openide.util.ImageUtilities;
136
import org.openide.util.Lookup;
133
import org.openide.util.Lookup;
137
import org.openide.util.Mutex;
138
import org.openide.util.NbBundle;
134
import org.openide.util.NbBundle;
139
import org.openide.util.RequestProcessor;
135
import org.openide.util.RequestProcessor;
140
import org.openide.util.lookup.Lookups;
136
import org.openide.util.lookup.Lookups;
141
import org.w3c.dom.Element;
137
import org.w3c.dom.Element;
142
import org.w3c.dom.Node;
143
import org.w3c.dom.NodeList;
138
import org.w3c.dom.NodeList;
144
import org.w3c.dom.Text;
145
139
146
/**
140
/**
147
 * Represents one plain Application Client project.
141
 * Represents one plain Application Client project.
Lines 153-159 Link Here
153
    sharedNamespace=AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE,
147
    sharedNamespace=AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE,
154
    privateNamespace=AppClientProjectType.PRIVATE_CONFIGURATION_NAMESPACE
148
    privateNamespace=AppClientProjectType.PRIVATE_CONFIGURATION_NAMESPACE
155
)
149
)
156
public final class AppClientProject implements Project, AntProjectListener, FileChangeListener {
150
public final class AppClientProject implements Project, FileChangeListener {
157
    
151
    
158
    private final Icon CAR_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/clientproject/ui/resources/appclient.gif", false); // NOI18N
152
    private final Icon CAR_PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/clientproject/ui/resources/appclient.gif", false); // NOI18N
159
    
153
    
Lines 216-222 Link Here
216
            getClassPathUiSupportCallback());
210
            getClassPathUiSupportCallback());
217
        classPathExtender = new ClassPathExtender(cpMod, ProjectProperties.JAVAC_CLASSPATH, ClassPathSupportCallbackImpl.ELEMENT_INCLUDED_LIBRARIES);
211
        classPathExtender = new ClassPathExtender(cpMod, ProjectProperties.JAVAC_CLASSPATH, ClassPathSupportCallbackImpl.ELEMENT_INCLUDED_LIBRARIES);
218
        lookup = createLookup(aux, cpProvider);
212
        lookup = createLookup(aux, cpProvider);
219
        helper.addAntProjectListener(this);
220
    }
213
    }
221
    
214
    
222
    private ClassPathModifier.Callback createClassPathModifierCallback() {
215
    private ClassPathModifier.Callback createClassPathModifierCallback() {
Lines 298-304 Link Here
298
        FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), AppClientProjectProperties.SOURCE_ENCODING);
291
        FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), AppClientProjectProperties.SOURCE_ENCODING);
299
        AppClientSources sources = new AppClientSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots());
292
        AppClientSources sources = new AppClientSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots());
300
        Lookup base = Lookups.fixed(new Object[] {
293
        Lookup base = Lookups.fixed(new Object[] {
301
            new Info(),
294
            new ProjectInfoImpl(this, helper, AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE, CAR_PROJECT_ICON),
302
            aux,
295
            aux,
303
            helper.createCacheDirectoryProvider(),
296
            helper.createCacheDirectoryProvider(),
304
            helper.createAuxiliaryProperties(),
297
            helper.createAuxiliaryProperties(),
Lines 354-372 Link Here
354
        return this.cpProvider;
347
        return this.cpProvider;
355
    }
348
    }
356
    
349
    
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 -------------------------------------------------
350
    // Package private methods -------------------------------------------------
371
    
351
    
372
    /**
352
    /**
Lines 422-441 Link Here
422
    
402
    
423
    /** Return configured project name. */
403
    /** Return configured project name. */
424
    public String getName() {
404
    public String getName() {
425
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
405
        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
    }
406
    }
440
407
441
    public void fileAttributeChanged (FileAttributeEvent fe) {
408
    public void fileAttributeChanged (FileAttributeEvent fe) {
Lines 587-659 Link Here
587
    }
554
    }
588
    
555
    
589
    // Private innerclasses ----------------------------------------------------
556
    // Private innerclasses ----------------------------------------------------
590
    //when #110886 gets implemented, this class is obsolete    
591
    private final class Info implements ProjectInformation {
592
        
593
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
594
        
595
        private WeakReference<String> cachedName = null;
596
        
597
        Info() {}
598
        
599
        void firePropertyChange(String prop) {
600
            pcs.firePropertyChange(prop, null, null);
601
            synchronized (pcs) {
602
                cachedName = null;
603
            }
604
        }
605
        
606
        public String getName() {
607
            return PropertyUtils.getUsablePropertyName(getDisplayName());
608
        }
609
        
610
        public String getDisplayName() {
611
            synchronized (pcs) {
612
                if (cachedName != null) {
613
                    String dn = cachedName.get();
614
                    if (dn != null) {
615
                        return dn;
616
                    }
617
                }
618
            }
619
            String dn = ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
620
                public String run() {
621
                    Element data = updateHelper.getPrimaryConfigurationData(true);
622
                    // XXX replace by XMLUtil when that has findElement, findText, etc.
623
                    NodeList nl = data.getElementsByTagNameNS(AppClientProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N
624
                    if (nl.getLength() == 1) {
625
                        nl = nl.item(0).getChildNodes();
626
                        if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) {
627
                            return ((Text) nl.item(0)).getNodeValue();
628
                        }
629
                    }
630
                    return "???"; // NOI18N
631
                }
632
            });
633
            synchronized (pcs) {
634
                cachedName = new WeakReference<String>(dn);
635
            }
636
            return dn;
637
        }
638
        
639
        public Icon getIcon() {
640
            return CAR_PROJECT_ICON;
641
        }
642
        
643
        public Project getProject() {
644
            return AppClientProject.this;
645
        }
646
        
647
        public void addPropertyChangeListener(PropertyChangeListener listener) {
648
            pcs.addPropertyChangeListener(listener);
649
        }
650
        
651
        public void removePropertyChangeListener(PropertyChangeListener listener) {
652
            pcs.removePropertyChangeListener(listener);
653
        }
654
        
655
    }
656
    
657
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
557
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
658
        
558
        
659
        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, EarProjectType.PROJECT_CONFIGURATION_NAMESPACE, 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 350-410 Link Here
350
    }
328
    }
351
    
329
    
352
    // Private innerclasses ----------------------------------------------------
330
    // Private innerclasses ----------------------------------------------------
353
    //when #110886 gets implemented, this class is obsolete
354
    private final class Info implements ProjectInformation {
355
        
356
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
357
        
358
        
359
        private WeakReference<String> cachedName = null;
360
        
361
        Info() {}
362
        
363
        void firePropertyChange(String prop) {
364
            pcs.firePropertyChange(prop, null, null);
365
            synchronized (pcs) {
366
                cachedName = null;
367
            }
368
        }
369
        
370
        public String getName() {
371
            return PropertyUtils.getUsablePropertyName(getDisplayName());
372
        }
373
        
374
        public String getDisplayName() {
375
            synchronized (pcs) {
376
                if (cachedName != null) {
377
                    String dn = cachedName.get();
378
                    if (dn != null) {
379
                        return dn;
380
                    }
381
                }
382
            }        
383
            String dn = EarProject.this.getName();
384
            synchronized (pcs) {
385
                cachedName = new WeakReference<String>(dn);
386
            }
387
            return dn;
388
        }
389
        
390
        public Icon getIcon() {
391
            return EAR_PROJECT_ICON;
392
        }
393
        
394
        public Project getProject() {
395
            return EarProject.this;
396
        }
397
        
398
        public void addPropertyChangeListener(PropertyChangeListener listener) {
399
            pcs.addPropertyChangeListener(listener);
400
        }
401
        
402
        public void removePropertyChangeListener(PropertyChangeListener listener) {
403
            pcs.removePropertyChangeListener(listener);
404
        }
405
        
406
    }
407
    
408
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
331
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
409
        
332
        
410
        ProjectXmlSavedHookImpl() {}
333
        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 (-95 / +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 106-114 Link Here
106
import org.netbeans.spi.project.ant.AntArtifactProvider;
104
import org.netbeans.spi.project.ant.AntArtifactProvider;
107
import org.netbeans.spi.project.ant.AntBuildExtenderFactory;
105
import org.netbeans.spi.project.ant.AntBuildExtenderFactory;
108
import org.netbeans.spi.project.ant.AntBuildExtenderImplementation;
106
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;
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.GeneratedFilesHelper;
108
import org.netbeans.spi.project.support.ant.GeneratedFilesHelper;
113
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
109
import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook;
114
import org.netbeans.spi.project.ui.PrivilegedTemplates;
110
import org.netbeans.spi.project.ui.PrivilegedTemplates;
Lines 122-128 Link Here
122
import org.openide.loaders.DataObject;
118
import org.openide.loaders.DataObject;
123
import org.openide.util.ImageUtilities;
119
import org.openide.util.ImageUtilities;
124
import org.openide.util.Lookup;
120
import org.openide.util.Lookup;
125
import org.openide.util.Mutex;
126
import org.openide.util.RequestProcessor;
121
import org.openide.util.RequestProcessor;
127
import org.openide.util.lookup.Lookups;
122
import org.openide.util.lookup.Lookups;
128
import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment;
123
import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment;
Lines 132-143 Link Here
132
import org.netbeans.modules.j2ee.common.project.ui.UserProjectSettings;
127
import org.netbeans.modules.j2ee.common.project.ui.UserProjectSettings;
133
import org.netbeans.modules.j2ee.deployment.devmodules.api.InstanceRemovedException;
128
import org.netbeans.modules.j2ee.deployment.devmodules.api.InstanceRemovedException;
134
import org.netbeans.api.j2ee.core.Profile;
129
import org.netbeans.api.j2ee.core.Profile;
130
import org.netbeans.api.project.ProjectUtils;
135
import org.netbeans.modules.j2ee.deployment.devmodules.spi.ArtifactListener;
131
import org.netbeans.modules.j2ee.deployment.devmodules.spi.ArtifactListener;
136
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider.DeployOnSaveSupport;
132
import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider.DeployOnSaveSupport;
137
import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.CustomizerProviderImpl;
133
import org.netbeans.modules.j2ee.ejbjarproject.ui.customizer.CustomizerProviderImpl;
138
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation;
134
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation;
139
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation2;
135
import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation2;
140
import org.netbeans.modules.java.api.common.SourceRoots;
136
import org.netbeans.modules.java.api.common.SourceRoots;
137
import org.netbeans.modules.java.api.common.ant.ProjectInfoImpl;
141
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
138
import org.netbeans.modules.java.api.common.ant.UpdateHelper;
142
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
139
import org.netbeans.modules.java.api.common.ant.UpdateImplementation;
143
import org.netbeans.modules.java.api.common.project.ProjectProperties;
140
import org.netbeans.modules.java.api.common.project.ProjectProperties;
Lines 149-159 Link Here
149
import org.openide.DialogDisplayer;
146
import org.openide.DialogDisplayer;
150
import org.openide.util.NbBundle;
147
import org.openide.util.NbBundle;
151
import org.w3c.dom.Document;
148
import org.w3c.dom.Document;
152
import org.w3c.dom.Comment;
153
import org.w3c.dom.Element;
149
import org.w3c.dom.Element;
154
import org.w3c.dom.Node;
155
import org.w3c.dom.NodeList;
150
import org.w3c.dom.NodeList;
156
import org.w3c.dom.Text;
157
import org.netbeans.modules.websvc.api.webservices.WebServicesSupport;
151
import org.netbeans.modules.websvc.api.webservices.WebServicesSupport;
158
import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
152
import org.netbeans.modules.websvc.api.client.WebServicesClientSupport;
159
import org.netbeans.modules.websvc.spi.webservices.WebServicesSupportFactory;
153
import org.netbeans.modules.websvc.spi.webservices.WebServicesSupportFactory;
Lines 161-167 Link Here
161
import org.netbeans.spi.java.project.support.LookupMergerSupport;
155
import org.netbeans.spi.java.project.support.LookupMergerSupport;
162
import org.netbeans.spi.project.support.LookupProviderSupport;
156
import org.netbeans.spi.project.support.LookupProviderSupport;
163
import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration;
157
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;
158
import org.netbeans.spi.project.ui.support.UILookupMergerSupport;
166
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
159
import org.netbeans.spi.queries.FileEncodingQueryImplementation;
167
import org.openide.NotifyDescriptor;
160
import org.openide.NotifyDescriptor;
Lines 184-190 Link Here
184
    sharedNamespace=EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE,
177
    sharedNamespace=EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE,
185
    privateNamespace=EjbJarProjectType.PRIVATE_CONFIGURATION_NAMESPACE
178
    privateNamespace=EjbJarProjectType.PRIVATE_CONFIGURATION_NAMESPACE
186
)
179
)
187
public class EjbJarProject implements Project, AntProjectListener, FileChangeListener {
180
public class EjbJarProject implements Project, FileChangeListener {
188
    
181
    
189
    private final Icon PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/ejbjarproject/ui/resources/ejbjarProjectIcon.gif", false); // NOI18N
182
    private final Icon PROJECT_ICON = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/ejbjarproject/ui/resources/ejbjarProjectIcon.gif", false); // NOI18N
190
    
183
    
Lines 312-318 Link Here
312
        css = new CopyOnSaveSupport();
305
        css = new CopyOnSaveSupport();
313
        artifactSupport = new ArtifactCopySupport();
306
        artifactSupport = new ArtifactCopySupport();
314
        deployOnSaveSupport = new DeployOnSaveSupportProxy();
307
        deployOnSaveSupport = new DeployOnSaveSupportProxy();
315
        helper.addAntProjectListener(this);
316
        ProjectManager.mutex().postWriteRequest(
308
        ProjectManager.mutex().postWriteRequest(
317
             new Runnable () {
309
             new Runnable () {
318
                 public void run() {
310
                 public void run() {
Lines 409-415 Link Here
409
        Lookup base = Lookups.fixed(new Object[] {
401
        Lookup base = Lookups.fixed(new Object[] {
410
                EjbJarProject.this, // never cast an externally obtained Project to EjbJarProject - use lookup instead
402
                EjbJarProject.this, // never cast an externally obtained Project to EjbJarProject - use lookup instead
411
                buildExtender,
403
                buildExtender,
412
                new Info(),
404
                new ProjectInfoImpl(this, helper, EjbJarProjectType.PROJECT_CONFIGURATION_NAMESPACE, PROJECT_ICON),
413
                aux,
405
                aux,
414
                helper.createCacheDirectoryProvider(),
406
                helper.createCacheDirectoryProvider(),
415
                helper.createAuxiliaryProperties(),
407
                helper.createAuxiliaryProperties(),
Lines 468-487 Link Here
468
        return this.cpProvider;
460
        return this.cpProvider;
469
    }
461
    }
470
    
462
    
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() {
463
    String getBuildXmlName() {
486
        String storedName = helper.getStandardPropertyEvaluator().getProperty(EjbJarProjectProperties.BUILD_FILE);
464
        String storedName = helper.getStandardPropertyEvaluator().getProperty(EjbJarProjectProperties.BUILD_FILE);
487
        return storedName == null ? GeneratedFilesHelper.BUILD_XML_PATH : storedName;
465
        return storedName == null ? GeneratedFilesHelper.BUILD_XML_PATH : storedName;
Lines 583-602 Link Here
583
    
561
    
584
    /** Return configured project name. */
562
    /** Return configured project name. */
585
    public String getName() {
563
    public String getName() {
586
        return ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
564
        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
    }
565
    }
601
566
602
    /** Store configured project name. */
567
    /** Store configured project name. */
Lines 782-842 Link Here
782
    }
747
    }
783
748
784
    // Private innerclasses ----------------------------------------------------
749
    // Private innerclasses ----------------------------------------------------
785
    
786
    //when #110886 gets implemented, this class is obsolete
787
    private final class Info implements ProjectInformation {
788
        
789
        private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
790
        
791
        private WeakReference<String> cachedName = null;
792
        
793
        Info() {}
794
        
795
        void firePropertyChange(String prop) {
796
            pcs.firePropertyChange(prop, null, null);
797
            synchronized (pcs) {
798
                cachedName = null;
799
            }
800
        }
801
        
802
        public String getName() {
803
            return PropertyUtils.getUsablePropertyName(getDisplayName());
804
        }
805
        
806
        public String getDisplayName() {
807
            synchronized (pcs) {
808
                if (cachedName != null) {
809
                    String dn = cachedName.get();
810
                    if (dn != null) {
811
                        return dn;
812
                    }
813
                }
814
            }        
815
            String dn = EjbJarProject.this.getName();
816
            synchronized (pcs) {
817
                cachedName = new WeakReference<String>(dn);
818
            }
819
            return dn;
820
        }
821
        
822
        public Icon getIcon() {
823
            return PROJECT_ICON;
824
        }
825
        
826
        public Project getProject() {
827
            return EjbJarProject.this;
828
        }
829
        
830
        public void addPropertyChangeListener(PropertyChangeListener listener) {
831
            pcs.addPropertyChangeListener(listener);
832
        }
833
        
834
        public void removePropertyChangeListener(PropertyChangeListener listener) {
835
            pcs.removePropertyChangeListener(listener);
836
        }
837
        
838
    }
839
    
840
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
750
    private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook {
841
        
751
        
842
        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 (+199 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 class ProjectInfoImpl implements ProjectInformation, AntProjectListener {
60
61
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
62
    private final Project project;
63
    private final AntProjectHelper projectHelper;
64
    private final String configurationNameSpace;
65
    private final Icon icon;
66
    private String name;
67
    private String displayName;
68
69
    /**
70
     * Create an instance with all items that will not change during the lifetime
71
     * of the project.
72
     *
73
     * @param project project that we hold information for
74
     * @param projectHelper class to read/update the project configuration
75
     * @param configurationNameSpace the specific name space that this project type uses
76
     * @param icon project icon
77
     */
78
    public ProjectInfoImpl(Project project, AntProjectHelper projectHelper, String configurationNameSpace, Icon icon) {
79
        this.project = project;
80
        this.projectHelper = projectHelper;
81
        this.configurationNameSpace = configurationNameSpace;
82
        this.icon = icon;
83
84
        projectHelper.addAntProjectListener(this);
85
    }
86
87
    @Override
88
    protected void finalize() throws Throwable {
89
        super.finalize();
90
        projectHelper.removeAntProjectListener(this);
91
    }
92
93
    @Override
94
    public String getName() {
95
        if (name == null) {
96
            name = PropertyUtils.getUsablePropertyName(getDisplayName());
97
        }
98
        return name;
99
    }
100
101
    @Override
102
    public String getDisplayName() {
103
        if (displayName == null) {
104
            displayName = getPropertyFromConfiguration(ProjectInformation.PROP_NAME);
105
        }
106
107
        return displayName;
108
    }
109
110
    @Override
111
    public Icon getIcon() {
112
        return icon;
113
    }
114
115
    @Override
116
    public Project getProject() {
117
        return project;
118
    }
119
120
    /**
121
     * Return the primary configuration node for this project.  Delegates to
122
     * <code>AntProjectHelper</code>.  Meant to be over-ridden when different
123
     * logic is needed.
124
     *
125
     * @param if true, refers to <code>project.xml</code>, else refers to
126
     *               <code>private.xml</code>
127
     * @return the configuration data that is available
128
     */
129
    protected Element getPrimaryConfigurationData(final boolean shared) {
130
        return projectHelper.getPrimaryConfigurationData(shared);
131
    }
132
133
    /**
134
     * Get the specified property from the primary configuration node.
135
     *
136
     * @param property name of the property to retrieve
137
     * @return the property value, or '???' if not found
138
     */
139
    protected String getPropertyFromConfiguration(final String property) {
140
        String propertyValue = ProjectManager.mutex().readAccess(new Mutex.Action<String>() {
141
142
            @Override
143
            public String run() {
144
                Element data = getPrimaryConfigurationData(true);
145
                Element nameElement = XMLUtil.findElement(data, property, configurationNameSpace);
146
                String propertyValue = "???"; // NOI18N
147
                if (nameElement != null) {
148
                    propertyValue = XMLUtil.findText(nameElement);
149
                }
150
                return propertyValue;
151
            }
152
        });
153
154
        return propertyValue;
155
    }
156
157
    /**
158
     * Notify all listeners of the property change passing the old and new values.
159
     *
160
     * @param prop property name
161
     * @param oldValue old value of the property
162
     * @param newValue new value of the property
163
     */
164
    protected void firePropertyChange(String prop, Object oldValue, Object newValue) {
165
        pcs.firePropertyChange(prop, oldValue, newValue);
166
    }
167
168
    @Override
169
    public void addPropertyChangeListener(PropertyChangeListener listener) {
170
        pcs.addPropertyChangeListener(listener);
171
    }
172
173
    @Override
174
    public void removePropertyChangeListener(PropertyChangeListener listener) {
175
        pcs.removePropertyChangeListener(listener);
176
    }
177
178
    @Override
179
    public void configurationXmlChanged(AntProjectEvent ev) {
180
        // only interested in changes to nbproject/project.xml
181
        if (ev.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) {
182
            // Could be various kinds of changes, but name & displayName might have changed.
183
            String oldName = name;
184
            String oldDisplayName = displayName;
185
            // reset so they are re-read
186
            name = null;
187
            displayName = null;
188
189
            // Must reset displayName before calling getName
190
            firePropertyChange(ProjectInformation.PROP_NAME, oldName, getName());
191
            firePropertyChange(ProjectInformation.PROP_NAME, oldDisplayName, getDisplayName());
192
        }
193
    }
194
195
    @Override
196
    public void propertiesChanged(AntProjectEvent ev) {
197
        // not interested in any properties
198
    }
199
}
(-)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, J2SEProjectType.PROJECT_CONFIGURATION_NAMESPACE, 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() {}

Return to bug 110886