|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.java.j2seproject; import java.awt.Dialog; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import java.io.IOException; import java.lang.ref.SoftReference; import java.util.*; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.SwingUtilities; import org.netbeans.api.java.classpath.ClassPath; import org.netbeans.api.java.classpath.GlobalPathRegistry; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.api.java.platform.JavaPlatformManager; import org.netbeans.api.java.project.JavaProjectConstants; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectManager; import org.netbeans.api.project.ant.AntArtifact; import org.netbeans.modules.java.j2seproject.classpath.ClassPathProviderImpl; import org.netbeans.modules.java.j2seproject.classpath.J2SEProjectClassPathExtender; import org.netbeans.modules.java.j2seproject.queries.CompiledSourceForBinaryQuery; import org.netbeans.modules.java.j2seproject.queries.JavadocForBinaryQueryImpl; import org.netbeans.modules.java.j2seproject.queries.SourceLevelQueryImpl; import org.netbeans.modules.java.j2seproject.queries.UnitTestForSourceQueryImpl; import org.netbeans.modules.java.j2seproject.ui.J2SECustomizerProvider; import org.netbeans.modules.java.j2seproject.ui.J2SEPhysicalViewProvider; import org.netbeans.spi.java.classpath.ClassPathFactory; import org.netbeans.spi.java.classpath.ClassPathProvider; import org.netbeans.spi.project.ActionProvider; import org.netbeans.spi.project.AuxiliaryConfiguration; import org.netbeans.api.project.ProjectInformation; import org.netbeans.api.project.Sources; import org.netbeans.modules.java.j2seproject.ui.FoldersListSettings; import org.netbeans.modules.java.j2seproject.ui.customizer.J2SEProjectProperties; import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport; import org.netbeans.spi.project.SubprojectProvider; import org.netbeans.spi.project.ant.AntArtifactProvider; import org.netbeans.spi.project.support.GenericSources; import org.netbeans.spi.project.support.ant.AntProjectEvent; import org.netbeans.spi.project.support.ant.AntProjectHelper; import org.netbeans.spi.project.support.ant.AntProjectListener; import org.netbeans.spi.project.support.ant.EditableProperties; import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook; import org.netbeans.spi.project.support.ant.PropertyEvaluator; import org.netbeans.spi.project.support.ant.PropertyUtils; import org.netbeans.spi.project.support.ant.ReferenceHelper; import org.netbeans.spi.project.support.ant.SourcesHelper; import org.netbeans.spi.project.ui.PrivilegedTemplates; import org.netbeans.spi.project.ui.ProjectOpenedHook; import org.netbeans.spi.project.ui.RecommendedTemplates; import org.netbeans.spi.queries.FileBuiltQueryImplementation; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.ErrorManager; import org.openide.NotifyDescriptor; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; import org.openide.util.Lookup; import org.openide.util.Mutex; import org.openide.util.NbBundle; import org.openide.util.RequestProcessor; import org.openide.util.Utilities; import org.openide.util.lookup.Lookups; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; /** * Represents one plain J2SE project. * @author Jesse Glick, et al. */ final class J2SEProject implements Project, AntProjectListener { private static final Icon J2SE_PROJECT_ICON = new ImageIcon(Utilities.loadImage("org/netbeans/modules/java/j2seproject/ui/resources/j2seProject.gif")); // NOI18N private final AntProjectHelper helper; private final PropertyEvaluator eval; private final ReferenceHelper refHelper; private final GeneratedFilesHelper genFilesHelper; private final Lookup lookup; J2SEProject(AntProjectHelper helper) throws IOException { this.helper = helper; eval = createEvaluator(); AuxiliaryConfiguration aux = helper.createAuxiliaryConfiguration(); refHelper = new ReferenceHelper(helper, aux, eval); genFilesHelper = new GeneratedFilesHelper(helper); lookup = createLookup(aux); helper.addAntProjectListener(this); } public FileObject getProjectDirectory() { return helper.getProjectDirectory(); } public String toString() { return "J2SEProject[" + getProjectDirectory() + "]"; // NOI18N } private PropertyEvaluator createEvaluator() { // XXX might need to use a custom evaluator to handle active platform substitutions... TBD return helper.getStandardPropertyEvaluator(); } PropertyEvaluator evaluator() { return eval; } ReferenceHelper getReferenceHelper () { return this.refHelper; } public Lookup getLookup() { return lookup; } private Lookup createLookup(AuxiliaryConfiguration aux) { SubprojectProvider spp = refHelper.createSubprojectProvider(); FileBuiltQueryImplementation fileBuilt = helper.createGlobFileBuiltQuery(evaluator(), new String[] { "${src.dir}/*.java", // NOI18N "${test.src.dir}/*.java", // NOI18N }, new String[] { "${build.classes.dir}/*.class", // NOI18N "${build.test.classes.dir}/*.class", // NOI18N }); final SourcesHelper sourcesHelper = new SourcesHelper(helper, evaluator()); sourcesHelper.addPrincipalSourceRoot("${src.dir}", NbBundle.getMessage (J2SEProject.class, "NAME_src.dir"), /*XXX*/null, null); sourcesHelper.addPrincipalSourceRoot("${test.src.dir}", NbBundle.getMessage (J2SEProject.class, "NAME_test.src.dir"), /*XXX*/null, null); // XXX add build dir too? sourcesHelper.addTypedSourceRoot("${src.dir}", JavaProjectConstants.SOURCES_TYPE_JAVA, NbBundle.getMessage (J2SEProject.class, "NAME_src.dir"), /*XXX*/null, null); sourcesHelper.addTypedSourceRoot("${test.src.dir}", JavaProjectConstants.SOURCES_TYPE_JAVA, NbBundle.getMessage (J2SEProject.class, "NAME_test.src.dir"), /*XXX*/null, null); ProjectManager.mutex().postWriteRequest(new Runnable() { public void run() { sourcesHelper.registerExternalRoots(FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT); } }); return Lookups.fixed(new Object[] { new Info(), aux, helper.createCacheDirectoryProvider(), spp, new J2SEActionProvider( this, helper ), new J2SEPhysicalViewProvider(this, helper, evaluator(), spp, refHelper), new J2SECustomizerProvider(this, helper, evaluator(), refHelper), new ClassPathProviderImpl(helper, evaluator()), new CompiledSourceForBinaryQuery(helper, evaluator()), new JavadocForBinaryQueryImpl(helper, evaluator()), new AntArtifactProviderImpl(), new ProjectXmlSavedHookImpl(), new ProjectOpenedHookImpl(), new UnitTestForSourceQueryImpl(helper, evaluator()), new SourceLevelQueryImpl(helper, evaluator()), sourcesHelper.createSources(), helper.createSharabilityQuery(evaluator(), new String[] { "${src.dir}", // NOI18N "${test.src.dir}", // NOI18N }, new String[] { "${dist.dir}", // NOI18N "${build.dir}", // NOI18N }), fileBuilt, new RecommendedTemplatesImpl (helper), new J2SEProjectClassPathExtender(this, helper, eval,refHelper), new AntProjectHelperProvider () }); } public void configurationXmlChanged(AntProjectEvent ev) { if (ev.getPath().equals(AntProjectHelper.PROJECT_XML_PATH)) { // Could be various kinds of changes, but name & displayName might have changed. Info info = (Info)getLookup().lookup(ProjectInformation.class); info.firePropertyChange(ProjectInformation.PROP_NAME); info.firePropertyChange(ProjectInformation.PROP_DISPLAY_NAME); } } public void propertiesChanged(AntProjectEvent ev) { // currently ignored (probably better to listen to evaluator() if you need to) } // Package private methods ------------------------------------------------- FileObject getSourceDirectory() { String srcDir = evaluator().getProperty("src.dir"); // NOI18N if (srcDir == null) { // XXX cleaner to define some simple defaults in the evaluator itself? return null; } return helper.resolveFileObject(srcDir); } FileObject getTestSourceDirectory() { String testSrcDir = evaluator().getProperty("test.src.dir"); // NOI18N if (testSrcDir == null) { return null; } return helper.resolveFileObject(testSrcDir); } File getTestClassesDirectory() { String testClassesDir = evaluator().getProperty("build.test.classes.dir"); // NOI18N if (testClassesDir == null) { return null; } return helper.resolveFile(testClassesDir); } final class AntProjectHelperProvider { AntProjectHelper getAntProjectHelper () { return helper; } } /** Return configured project name. */ public String getName() { return (String) ProjectManager.mutex().readAccess(new Mutex.Action() { public Object run() { Element data = helper.getPrimaryConfigurationData(true); // XXX replace by XMLUtil when that has findElement, findText, etc. NodeList nl = data.getElementsByTagNameNS(J2SEProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); // NOI18N if (nl.getLength() == 1) { nl = nl.item(0).getChildNodes(); if (nl.getLength() == 1 && nl.item(0).getNodeType() == Node.TEXT_NODE) { return ((Text) nl.item(0)).getNodeValue(); } } return "???"; // NOI18N } }); } /** Store configured project name. * / public void setName(final String name) { ProjectManager.mutex().writeAccess(new Mutex.Action() { public Object run() { Element data = helper.getPrimaryConfigurationData(true); // XXX replace by XMLUtil when that has findElement, findText, etc. NodeList nl = data.getElementsByTagNameNS(J2SEProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); Element nameEl; if (nl.getLength() == 1) { nameEl = (Element) nl.item(0); NodeList deadKids = nameEl.getChildNodes(); while (deadKids.getLength() > 0) { nameEl.removeChild(deadKids.item(0)); } } else { nameEl = data.getOwnerDocument().createElementNS(J2SEProjectType.PROJECT_CONFIGURATION_NAMESPACE, "name"); data.insertBefore(nameEl, / * OK if null * /data.getChildNodes().item(0)); } nameEl.appendChild(data.getOwnerDocument().createTextNode(name)); helper.putPrimaryConfigurationData(data, true); return null; } }); } */ // Private innerclasses ---------------------------------------------------- private final class Info implements ProjectInformation { private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); Info() {} void firePropertyChange(String prop) { pcs.firePropertyChange(prop, null, null); } public String getName() { return PropertyUtils.getUsablePropertyName(J2SEProject.this.getName()); } public String getDisplayName() { return J2SEProject.this.getName(); } public Icon getIcon() { return J2SE_PROJECT_ICON; } public Project getProject() { return J2SEProject.this; } public void addPropertyChangeListener(PropertyChangeListener listener) { pcs.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { pcs.removePropertyChangeListener(listener); } } private final class ProjectXmlSavedHookImpl extends ProjectXmlSavedHook { ProjectXmlSavedHookImpl() {} protected void projectXmlSaved() throws IOException { genFilesHelper.refreshBuildScript( GeneratedFilesHelper.BUILD_IMPL_XML_PATH, J2SEProject.class.getResource("resources/build-impl.xsl"), false); genFilesHelper.refreshBuildScript( GeneratedFilesHelper.BUILD_XML_PATH, J2SEProject.class.getResource("resources/build.xsl"), false); } } private final class ProjectOpenedHookImpl extends ProjectOpenedHook { ProjectOpenedHookImpl() {} protected void projectOpened() { // Check up on build scripts. try { genFilesHelper.refreshBuildScript( GeneratedFilesHelper.BUILD_IMPL_XML_PATH, J2SEProject.class.getResource("resources/build-impl.xsl"), true); genFilesHelper.refreshBuildScript( GeneratedFilesHelper.BUILD_XML_PATH, J2SEProject.class.getResource("resources/build.xsl"), true); } catch (IOException e) { ErrorManager.getDefault().notify(ErrorManager.INFORMATIONAL, e); } // register project's classpaths to GlobalPathRegistry ClassPathProviderImpl cpProvider = (ClassPathProviderImpl)lookup.lookup(ClassPathProviderImpl.class); GlobalPathRegistry.getDefault().register(ClassPath.BOOT, cpProvider.getProjectClassPaths(ClassPath.BOOT)); GlobalPathRegistry.getDefault().register(ClassPath.SOURCE, cpProvider.getProjectClassPaths(ClassPath.SOURCE)); GlobalPathRegistry.getDefault().register(ClassPath.COMPILE, cpProvider.getProjectClassPaths(ClassPath.COMPILE)); // Make it easier to run headless builds on the same machine at least. ProjectManager.mutex().writeAccess(new Mutex.Action() { public Object run() { EditableProperties ep = helper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); File buildProperties = new File(System.getProperty("netbeans.user"), "build.properties"); // NOI18N ep.setProperty("user.properties.file", buildProperties.getAbsolutePath()); //NOI18N helper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, ep); try { ProjectManager.getDefault().saveProject(J2SEProject.this); } catch (IOException e) { ErrorManager.getDefault().notify(e); } return null; } }); if (J2SEPhysicalViewProvider.hasBrokenLinks(helper, refHelper)) { BrokenReferencesSupport.showAlert(); } } protected void projectClosed() { // Probably unnecessary, but just in case: try { ProjectManager.getDefault().saveProject(J2SEProject.this); } catch (IOException e) { ErrorManager.getDefault().notify(e); } // unregister project's classpaths to GlobalPathRegistry ClassPathProviderImpl cpProvider = (ClassPathProviderImpl)lookup.lookup(ClassPathProviderImpl.class); GlobalPathRegistry.getDefault().unregister(ClassPath.BOOT, cpProvider.getProjectClassPaths(ClassPath.BOOT)); GlobalPathRegistry.getDefault().unregister(ClassPath.SOURCE, cpProvider.getProjectClassPaths(ClassPath.SOURCE)); GlobalPathRegistry.getDefault().unregister(ClassPath.COMPILE, cpProvider.getProjectClassPaths(ClassPath.COMPILE)); } } /** * Exports the main JAR as an official build product for use from other scripts. * The type of the artifact will be {@link AntArtifact#TYPE_JAR}. */ private final class AntArtifactProviderImpl implements AntArtifactProvider { public AntArtifact[] getBuildArtifacts() { return new AntArtifact[] { helper.createSimpleAntArtifact(JavaProjectConstants.ARTIFACT_TYPE_JAR, "dist.jar", evaluator(), "jar", "clean"), // NOI18N }; } } private static final class RecommendedTemplatesImpl implements RecommendedTemplates, PrivilegedTemplates { RecommendedTemplatesImpl (AntProjectHelper helper) { this.helper = helper; } private AntProjectHelper helper; // List of primarily supported templates private static final String[] APPLICATION_TYPES = new String[] { "java-classes", // NOI18N "java-main-class", // NOI18N "java-forms", // NOI18N "gui-java-application", // NOI18N "java-beans", // NOI18N "oasis-XML-catalogs", // NOI18N "XML", // NOI18N "ant-script", // NOI18N "ant-task", // NOI18N // "servlet-types", // NOI18N // "web-types", // NOI18N "junit", // NOI18N // "MIDP", // NOI18N "simple-files" // NOI18N }; private static final String[] LIBRARY_TYPES = new String[] { "java-classes", // NOI18N "java-main-class", // NOI18N "java-forms", // NOI18N //"gui-java-application", // NOI18N "java-beans", // NOI18N "oasis-XML-catalogs", // NOI18N "XML", // NOI18N "ant-script", // NOI18N "ant-task", // NOI18N "servlet-types", // NOI18N // "web-types", // NOI18N "junit", // NOI18N // "MIDP", // NOI18N "simple-files" // NOI18N }; private static final String[] PRIVILEGED_NAMES = new String[] { "Templates/Classes/Class.java", // NOI18N "Templates/Classes/Package", // NOI18N "Templates/Classes/Interface.java", // NOI18N "Templates/GUIForms/JPanel.java", // NOI18N "Templates/GUIForms/JFrame.java", // NOI18N }; public String[] getRecommendedTypes() { EditableProperties ep = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); // if the project has no main class, it's not really an application boolean isLibrary = ep.getProperty (J2SEProjectProperties.MAIN_CLASS) == null || "".equals (ep.getProperty (J2SEProjectProperties.MAIN_CLASS)); // NOI18N return isLibrary ? LIBRARY_TYPES : APPLICATION_TYPES; } public String[] getPrivilegedTemplates() { return PRIVILEGED_NAMES; } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.