diff --git a/web.project/nbproject/project.xml b/web.project/nbproject/project.xml --- a/web.project/nbproject/project.xml +++ b/web.project/nbproject/project.xml @@ -301,7 +301,7 @@ 1 - 1.42 + 1.43 @@ -435,7 +435,7 @@ - 6.2 + 7.22 diff --git a/web.project/src/org/netbeans/modules/web/project/WebProject.java b/web.project/src/org/netbeans/modules/web/project/WebProject.java --- a/web.project/src/org/netbeans/modules/web/project/WebProject.java +++ b/web.project/src/org/netbeans/modules/web/project/WebProject.java @@ -514,7 +514,6 @@ } private Lookup createLookup(AuxiliaryConfiguration aux, ClassPathProviderImpl cpProvider) { - SubprojectProvider spp = refHelper.createSubprojectProvider(); WebSources webSources = new WebSources(this, helper, evaluator(), getSourceRoots(), getTestSourceRoots()); FileEncodingQueryImplementation encodingQuery = QuerySupport.createFileEncodingQuery(evaluator(), WebProjectProperties.SOURCE_ENCODING); @@ -523,7 +522,7 @@ aux, helper.createCacheDirectoryProvider(), helper.createAuxiliaryProperties(), - spp, + refHelper.createSubprojectProvider(), new ProjectWebModuleProvider (), new ProjectWebServicesSupportProvider(), webModule, //implements J2eeModuleProvider @@ -532,7 +531,7 @@ new WebModuleImpl(apiWebModule), enterpriseResourceSupport, new WebActionProvider( this, this.updateHelper, this.eval ), - new WebLogicalViewProvider(this, this.updateHelper, evaluator (), refHelper), + new WebLogicalViewProvider(this, this.updateHelper, evaluator (), refHelper, webModule), new CustomizerProviderImpl(this, this.updateHelper, evaluator(), refHelper), LookupMergerSupport.createClassPathProviderMerger(cpProvider), QuerySupport.createCompiledSourceForBinaryQuery(helper, evaluator(), getSourceRoots(), getTestSourceRoots(), diff --git a/web.project/src/org/netbeans/modules/web/project/ui/Bundle.properties b/web.project/src/org/netbeans/modules/web/project/ui/Bundle.properties --- a/web.project/src/org/netbeans/modules/web/project/ui/Bundle.properties +++ b/web.project/src/org/netbeans/modules/web/project/ui/Bundle.properties @@ -38,17 +38,10 @@ # made subject to such option by the copyright holder. #Actions -LBL_CleanAction_Name=Clean -LBL_BuildAction_Name=Build -LBL_RebuildAction_Name=Clean and Build -LBL_JavadocAction_Name=Generate Javadoc -LBL_RunAction_Name=Run -LBL_DebugAction_Name=Debug LBL_RedeployAction_Name=Deploy LBL_VerifyAction_Name=Verify LBL_SetViewAction_Name=Set Project View LBL_Properties_Action=Properties -LBL_TestAction_Name=Test #Customizer provider #{0} Name of the project diff --git a/web.project/src/org/netbeans/modules/web/project/ui/WebLogicalViewProvider.java b/web.project/src/org/netbeans/modules/web/project/ui/WebLogicalViewProvider.java --- a/web.project/src/org/netbeans/modules/web/project/ui/WebLogicalViewProvider.java +++ b/web.project/src/org/netbeans/modules/web/project/ui/WebLogicalViewProvider.java @@ -47,18 +47,13 @@ import java.beans.PropertyChangeListener; import java.io.CharConversionException; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.ResourceBundle; +import java.util.Collection; import java.util.StringTokenizer; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; -import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import org.netbeans.api.db.explorer.ConnectionListener; -import org.netbeans.api.db.explorer.ConnectionManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; @@ -69,16 +64,12 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.RequestProcessor; -import org.openide.util.Utilities; import org.openide.util.WeakListeners; -import org.openide.util.actions.SystemAction; import org.openide.util.lookup.Lookups; import org.openide.xml.XMLUtil; import org.netbeans.api.java.platform.JavaPlatformManager; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; -import org.netbeans.spi.project.ActionProvider; -import org.netbeans.api.java.project.JavaProjectConstants; import org.netbeans.spi.java.project.support.ui.BrokenReferencesSupport; import org.netbeans.spi.java.project.support.ui.PackageView; import org.netbeans.api.project.FileOwnerQuery; @@ -88,14 +79,15 @@ import org.netbeans.spi.project.support.ant.AntProjectHelper; import org.netbeans.spi.project.support.ant.PropertyEvaluator; import org.netbeans.spi.project.support.ant.ReferenceHelper; -import org.netbeans.spi.project.ui.support.CommonProjectActions; import org.netbeans.spi.project.ui.support.DefaultProjectOperations; -import org.netbeans.spi.project.ui.support.ProjectSensitiveActions; import org.netbeans.modules.j2ee.common.ui.BrokenServerSupport; import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment; import org.netbeans.modules.j2ee.deployment.devmodules.api.InstanceRemovedException; import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule; import org.netbeans.api.j2ee.core.Profile; +import org.netbeans.api.java.platform.JavaPlatform; +import org.netbeans.api.java.platform.Specification; +import org.netbeans.modules.j2ee.deployment.devmodules.spi.ConfigurationFilesListener; import org.netbeans.modules.j2ee.deployment.devmodules.spi.InstanceListener; import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider; import org.netbeans.modules.java.api.common.SourceRoots; @@ -107,28 +99,36 @@ import org.netbeans.modules.web.project.ui.customizer.WebProjectProperties; import org.netbeans.spi.project.AuxiliaryConfiguration; import org.netbeans.spi.project.support.ant.EditableProperties; +import org.netbeans.spi.project.ui.support.CommonProjectActions; import org.netbeans.spi.project.ui.support.NodeFactorySupport; +import org.netbeans.spi.project.ui.support.ProjectSensitiveActions; +import org.openide.ErrorManager; +import org.openide.awt.DynamicMenuContent; import org.openide.loaders.DataFolder; +import org.openide.modules.SpecificationVersion; import org.openide.util.ChangeSupport; +import org.openide.util.ContextAwareAction; import org.openide.util.Exceptions; import org.w3c.dom.Element; /** * Support for creating logical views. - * @author Petr Hrebejk */ public class WebLogicalViewProvider implements LogicalViewProvider2 { - private static final RequestProcessor BROKEN_LINKS_RP = new RequestProcessor("WebLogicalViewProvider.BROKEN_LINKS_RP"); // NOI18N - private static final RequestProcessor BROKEN_DATASOURCE_RP = new RequestProcessor("WebLogicalViewProvider.BROKEN_DATASOURCE_RP"); //NOI18N + private static final RequestProcessor RP = new RequestProcessor("WebPhysicalViewProvider.RP"); // NOI18N private final WebProject project; private final UpdateHelper helper; private final PropertyEvaluator evaluator; private final ReferenceHelper resolver; private final ChangeSupport changeSupport = new ChangeSupport(this); + private final PropertyChangeListener pcl; + private final InstanceListener il; + private final ConfigurationFilesListener cfl; - public WebLogicalViewProvider(WebProject project, UpdateHelper helper, PropertyEvaluator evaluator, ReferenceHelper resolver) { + public WebLogicalViewProvider(WebProject project, UpdateHelper helper, + PropertyEvaluator evaluator, ReferenceHelper resolver, J2eeModuleProvider j2eeModuleProvider) { this.project = project; assert project != null; this.helper = helper; @@ -136,21 +136,63 @@ this.evaluator = evaluator; assert evaluator != null; this.resolver = resolver; + assert j2eeModuleProvider != null; + pcl = new PropertyChangeListener() { + public @Override void propertyChange(PropertyChangeEvent evt) { + testBroken(); + } + }; + il = new InstanceListener() { + + @Override + public void instanceAdded(String serverInstanceID) { + testBroken(); } + @Override + public void instanceRemoved(String serverInstanceID) { + testBroken(); + } + }; + cfl = new ConfigurationFilesListener() { + + @Override + public void fileCreated(FileObject added) { + testBroken(); + } + + @Override + public void fileDeleted(FileObject removed) { + testBroken(); + } + }; + evaluator.addPropertyChangeListener(pcl); + // When evaluator fires changes that platform properties were + // removed the platform still exists in JavaPlatformManager. + // That's why I have to listen here also on JPM: + JavaPlatformManager.getDefault().addPropertyChangeListener(WeakListeners.propertyChange(pcl, JavaPlatformManager.getDefault())); + + j2eeModuleProvider.addInstanceListener((InstanceListener)WeakListeners.create( + InstanceListener.class, il, j2eeModuleProvider)); +// j2eeModuleProvider.addConfigurationFilesListener((ConfigurationFilesListener)WeakListeners.create( +// ConfigurationFilesListener.class, cfl, j2eeModuleProvider)); + } + + @Override public Node createLogicalView() { return new WebLogicalViewRootNode(); } + @Override public Node findPath(Node root, Object target) { - Project project = root.getLookup().lookup(Project.class); - if (project == null) + Project proj = root.getLookup().lookup(Project.class); + if (proj == null) return null; if (target instanceof FileObject) { FileObject fo = (FileObject) target; Project owner = FileOwnerQuery.getOwner(fo); - if (!project.equals(owner)) + if (!proj.equals(owner)) return null; // Don't waste time if project does not own the fo // trying to find node in sources @@ -246,13 +288,44 @@ changeSupport.removeChangeListener(l); } + private final RequestProcessor.Task task = RP.create(new Runnable() { + public @Override void run() { + boolean old = broken; + boolean _broken = hasBrokenLinks(); + if (old != _broken) { + setBroken(_broken); + } + old = illegalState; + boolean _illegalState = hasInvalidJdkVersion(); + if (old != _illegalState) { + setIllegalState(_illegalState); + } + old = deployOnSaveDisabled; + boolean _deployOnSaveDisabled = isDeployOnSaveSupportedAndDisabled(); + if (old != _deployOnSaveDisabled) { + setDeployOnSaveDisabled(_deployOnSaveDisabled); + } + old = brokenServer; + boolean _brokenServer = hasBrokenServer(); + if (old != _brokenServer) { + setBrokenServer(_brokenServer); + } + old = brokenDataSource; + boolean _brokenDataSource = hasBrokenDataSource(); + if (old != _brokenDataSource) { + setBrokenDataSource(_brokenDataSource); + } + } + }); + /** * Used by WebProjectCustomizer to mark the project as broken when it warns user * about project's broken references and advices him to use BrokenLinksAction to correct it. * */ + @Override public void testBroken () { - changeSupport.fireChange(); + task.schedule(100); } private static Lookup createLookup( Project project ) { @@ -290,6 +363,55 @@ return result; } + /** + * Returns the active platform used by the project or null if the active + * project platform is broken. + * @param activePlatformId the name of platform used by Ant script or null + * for default platform. + * @return active {@link JavaPlatform} or null if the project's platform + * is broken + */ + public static JavaPlatform getActivePlatform (final String activePlatformId) { + final JavaPlatformManager pm = JavaPlatformManager.getDefault(); + if (activePlatformId == null) { + return pm.getDefaultPlatform(); + } + else { + JavaPlatform[] installedPlatforms = pm.getPlatforms(null, new Specification ("j2se",null)); //NOI18N + for (JavaPlatform p : installedPlatforms) { + String antName = p.getProperties().get("platform.ant.name"); // NOI18N + if (antName != null && antName.equals(activePlatformId)) { + return p; + } + } + return null; + } + } + + private boolean hasInvalidJdkVersion() { + String javaSource = this.evaluator.getProperty("javac.source"); //NOI18N + String javaTarget = this.evaluator.getProperty("javac.target"); //NOI18N + if (javaSource == null && javaTarget == null) { + //No need to check anything + return false; + } + + final String platformId = this.evaluator.getProperty("platform.active"); //NOI18N + final JavaPlatform activePlatform = getActivePlatform (platformId); + if (activePlatform == null) { + return true; + } + SpecificationVersion platformVersion = activePlatform.getSpecification().getVersion(); + try { + return (javaSource != null && new SpecificationVersion (javaSource).compareTo(platformVersion)>0) + || (javaTarget != null && new SpecificationVersion (javaTarget).compareTo(platformVersion)>0); + } catch (NumberFormatException nfe) { + ErrorManager.getDefault().log("Invalid javac.source: "+javaSource+" or javac.target: "+javaTarget+" of project:" + +this.project.getProjectDirectory().getPath()); + return true; + } + } + private boolean isDeployOnSaveSupportedAndDisabled() { boolean deployOnSaveEnabled = Boolean.valueOf(project.evaluator().getProperty( WebProjectProperties.J2EE_DEPLOY_ON_SAVE)); @@ -312,30 +434,23 @@ /** Filter node containin additional features for the J2SE physical */ - private final class WebLogicalViewRootNode extends AbstractNode { + private final class WebLogicalViewRootNode extends AbstractNode implements ChangeListener { - private final Action brokenLinksAction; - private final BrokenServerAction brokenServerAction; - private final BrokenDatasourceAction brokenDatasourceAction; - private boolean broken; - private boolean deployOnSaveDisabled; - + @SuppressWarnings("LeakingThisInConstructor") public WebLogicalViewRootNode() { -// super( new WebViews.LogicalViewChildren( project, helper, evaluator, resolver ), createLookup( project ) ); super(NodeFactorySupport.createCompositeChildren(project, "Projects/org-netbeans-modules-web-project/Nodes"), createLookup(project)); setIconBaseWithExtension("org/netbeans/modules/web/project/ui/resources/webProjectIcon.gif"); //NOI18N super.setName( ProjectUtils.getInformation( project ).getDisplayName() ); - if (hasBrokenLinks()) { - broken = true; - } - brokenLinksAction = new BrokenLinksAction(); - brokenServerAction = new BrokenServerAction(); - brokenDatasourceAction = new BrokenDatasourceAction(); - J2eeModuleProvider moduleProvider = (J2eeModuleProvider)project.getLookup().lookup(J2eeModuleProvider.class); - moduleProvider.addInstanceListener((InstanceListener)WeakListeners.create( - InstanceListener.class, brokenServerAction, moduleProvider)); - deployOnSaveDisabled = isDeployOnSaveSupportedAndDisabled(); +// if (hasBrokenLinks()) { +// broken = true; +// } +// else if (hasInvalidJdkVersion ()) { +// illegalState = true; +// } +// deployOnSaveDisabled = isDeployOnSaveSupportedAndDisabled(); + addChangeListener(WeakListeners.change(this, WebLogicalViewProvider.this)); + testBroken(); } @Override @@ -347,7 +462,7 @@ @Override public Image getIcon( int type ) { Image original = super.getIcon( type ); - if (broken || brokenServerAction.isEnabled() || brokenDatasourceAction.isEnabled()) { + if (isBroken()) { return ImageUtilities.mergeImages(original, ProjectProperties.ICON_BROKEN_BADGE.getImage(), 8, 0); } else if (deployOnSaveDisabled) { return DeployOnSaveUtils.badgeDisabledDeployOnSave(original); @@ -359,7 +474,7 @@ @Override public Image getOpenedIcon( int type ) { Image original = super.getOpenedIcon(type); - if (broken || brokenServerAction.isEnabled() || brokenDatasourceAction.isEnabled()) { + if (isBroken()) { return ImageUtilities.mergeImages(original, ProjectProperties.ICON_BROKEN_BADGE.getImage(), 8, 0); } else if (deployOnSaveDisabled) { return DeployOnSaveUtils.badgeDisabledDeployOnSave(original); @@ -368,6 +483,7 @@ } } + @Override public String getHtmlDisplayName() { String dispName = super.getDisplayName(); try { @@ -375,171 +491,193 @@ } catch (CharConversionException ex) { return dispName; } - return broken || brokenServerAction.isEnabled() || brokenDatasourceAction.isEnabled() ? "" + dispName + "" : null; //NOI18N + return isBroken() ? "" + dispName + "" : null; //NOI18N } + @Override public Action[] getActions( boolean context ) { - return getAdditionalActions(); + return CommonProjectActions.forType("org-netbeans-modules-web-project"); // NOI18N } + @Override public boolean canRename() { return true; } + @Override public void setName(String s) { DefaultProjectOperations.performDefaultRenameOperation(project, s); } + @Override public HelpCtx getHelpCtx() { return new HelpCtx(WebLogicalViewRootNode.class); } // Private methods ------------------------------------------------- - private void setDeployOnSaveDisabled (boolean value) { - this.deployOnSaveDisabled = value; + private boolean isBroken() { + return broken || brokenServer || brokenDataSource || illegalState; + } + + public @Override void stateChanged(ChangeEvent e) { fireIconChange(); fireOpenedIconChange(); fireDisplayNameChange(null, null); } - private Action[] getAdditionalActions() { + } - ResourceBundle bundle = NbBundle.getBundle(WebLogicalViewProvider.class); + private boolean broken; //Represents a state where project has a broken reference repairable by broken reference support + private boolean illegalState; //Represents a state where project is not in legal state, eg invalid source/target level + private boolean deployOnSaveDisabled; //true iff Deploy-on-Save is disabled + private boolean brokenServer; + private boolean brokenDataSource; - J2eeModuleProvider provider = (J2eeModuleProvider) project.getLookup().lookup(J2eeModuleProvider.class); - List actions = new ArrayList(); - actions.add(CommonProjectActions.newFileAction()); - actions.add(null); - actions.add(ProjectSensitiveActions.projectCommandAction( ActionProvider.COMMAND_BUILD, bundle.getString( "LBL_BuildAction_Name" ), null )); // NOI18N - actions.add(ProjectSensitiveActions.projectCommandAction( ActionProvider.COMMAND_REBUILD, bundle.getString( "LBL_RebuildAction_Name" ), null )); // NOI18N - actions.add(ProjectSensitiveActions.projectCommandAction( ActionProvider.COMMAND_CLEAN, bundle.getString( "LBL_CleanAction_Name" ), null )); // NOI18N - if (provider != null && provider.hasVerifierSupport()) { - actions.add(ProjectSensitiveActions.projectCommandAction( "verify", bundle.getString( "LBL_VerifyAction_Name" ), null )); // NOI18N + // Private methods ------------------------------------------------- + + private void setBroken(boolean broken) { + this.broken = broken; + changeSupport.fireChange(); } - actions.add(ProjectSensitiveActions.projectCommandAction( JavaProjectConstants.COMMAND_JAVADOC, bundle.getString( "LBL_JavadocAction_Name" ), null )); // NOI18N - actions.add(null); - actions.add(ProjectSensitiveActions.projectCommandAction( ActionProvider.COMMAND_RUN, bundle.getString( "LBL_RunAction_Name" ), null )); // NOI18N - actions.add(ProjectSensitiveActions.projectCommandAction( WebProjectConstants.COMMAND_REDEPLOY, bundle.getString( "LBL_RedeployAction_Name" ), null )); // NOI18N - actions.add(ProjectSensitiveActions.projectCommandAction( ActionProvider.COMMAND_DEBUG, bundle.getString( "LBL_DebugAction_Name" ), null )); // NOI18N - actions.addAll(Utilities.actionsForPath("Projects/Profiler_Actions_temporary")); //NOI18N - actions.addAll(Utilities.actionsForPath("Projects/Rest_Actions_holder")); //NOI18N - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_TEST, bundle.getString("LBL_TestAction_Name"), null)); // NOI18N - actions.add(null); - actions.add(CommonProjectActions.setAsMainProjectAction()); - actions.add(CommonProjectActions.openSubprojectsAction()); - actions.add(CommonProjectActions.closeProjectAction()); - actions.add(null); - actions.add(CommonProjectActions.renameProjectAction()); - actions.add(CommonProjectActions.moveProjectAction()); - actions.add(CommonProjectActions.copyProjectAction()); - actions.add(CommonProjectActions.deleteProjectAction()); - actions.add(null); - actions.add(SystemAction.get( org.openide.actions.FindAction.class )); - // honor 57874 contact + private void setIllegalState (boolean illegalState) { + this.illegalState = illegalState; + changeSupport.fireChange(); + } - actions.addAll(Utilities.actionsForPath("Projects/Actions")); //NOI18N + private void setDeployOnSaveDisabled (boolean value) { + this.deployOnSaveDisabled = value; + changeSupport.fireChange(); + } - actions.add(null); + private void setBrokenDataSource(boolean brokenDataSource) { + this.brokenDataSource = brokenDataSource; + changeSupport.fireChange(); + } - if (brokenLinksAction != null && brokenLinksAction.isEnabled()) { - actions.add(brokenLinksAction); - } - if (brokenServerAction.isEnabled()) { - actions.add(brokenServerAction); - } - if (brokenDatasourceAction.isEnabled()) { - actions.add(brokenDatasourceAction); - } - actions.add(CommonProjectActions.customizeProjectAction()); - - return actions.toArray(new Action[actions.size()]); + private void setBrokenServer(boolean brokenServer) { + this.brokenServer = brokenServer; + changeSupport.fireChange(); } /** This action is created only when project has broken references. * Once these are resolved the action is disabled. */ - private class BrokenLinksAction extends AbstractAction implements PropertyChangeListener, ChangeListener, Runnable { + private static final class ActionFactory extends AbstractAction implements ContextAwareAction { - private RequestProcessor.Task task = null; + private int mode; - private final PropertyChangeListener weakPCL; - - public BrokenLinksAction() { - putValue(Action.NAME,NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_Fix_Broken_Links_Action")); - setEnabled(broken); - evaluator.addPropertyChangeListener( this ); - // When evaluator fires changes that platform properties were - // removed the platform still exists in JavaPlatformManager. - // That's why I have to listen here also on JPM: - weakPCL = WeakListeners.propertyChange( this, JavaPlatformManager.getDefault() ); - JavaPlatformManager.getDefault().addPropertyChangeListener( weakPCL ); - WebLogicalViewProvider.this.addChangeListener ((ChangeListener)WeakListeners.change(this,WebLogicalViewProvider.this)); + private ActionFactory(int mode) { + this.mode = mode; + setEnabled(false); + putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true); } + @Override public void actionPerformed(ActionEvent e) { - try { - helper.requestUpdate(); - BrokenReferencesSupport.showCustomizer(helper.getAntProjectHelper(), resolver, getBreakableProperties(), new String[]{WebProjectProperties.JAVA_PLATFORM}); - run(); - } catch (IOException ioe) { - Exceptions.printStackTrace(ioe); - } + assert false; } - public void propertyChange(PropertyChangeEvent evt) { - refsMayChanged(); + public @Override Action createContextAwareInstance(Lookup actionContext) { + Collection p = actionContext.lookupAll(Project.class); + if (p.size() != 1) { + return this; } - - public void stateChanged (ChangeEvent evt) { - refsMayChanged (); + WebLogicalViewProvider lvp = p.iterator().next().getLookup().lookup(WebLogicalViewProvider.class); + if (lvp == null) { + return this; } - - public synchronized void run() { - boolean old = WebLogicalViewRootNode.this.broken; - broken = hasBrokenLinks(); - if (old != broken) { - setEnabled(broken); - fireIconChange(); - fireOpenedIconChange(); - fireDisplayNameChange(null, null); - } - old = WebLogicalViewRootNode.this.deployOnSaveDisabled; - boolean dosDisabled = isDeployOnSaveSupportedAndDisabled(); - if (old != dosDisabled) { - setDeployOnSaveDisabled(dosDisabled); - } - } - - public void refsMayChanged() { - // check project state whenever there was a property change - // or change in list of platforms. - // Coalesce changes since they can come quickly: - if (task == null) { - task = BROKEN_LINKS_RP.create(this); - } - task.schedule(100); + switch (mode) { + case 1: return lvp.new BrokenLinksAction(); + case 2: return lvp.new BrokenServerAction(); + default: return lvp.new BrokenDataSourceAction(); } } - private class BrokenServerAction extends AbstractAction implements - InstanceListener, PropertyChangeListener { + } - private boolean brokenServer; + public static Action brokenLinksActionFactory() { + return new ActionFactory(1); + } + + public static Action brokenServerActionFactory() { + return new ActionFactory(2); + } + + public static Action brokenDataSourceActionFactory() { + return new ActionFactory(3); + } + + public static Action redeploy() { + return ProjectSensitiveActions.projectCommandAction( WebProjectConstants.COMMAND_REDEPLOY, NbBundle.getBundle(WebLogicalViewProvider.class).getString( "LBL_RedeployAction_Name" ), null ); // NOI18N + } + + public static final class VerifyAction extends AbstractAction implements ContextAwareAction { + + public VerifyAction() { + putValue(Action.NAME, NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_VerifyAction_Name")); + } + + @Override + public void actionPerformed(ActionEvent e) { + assert false; + } + + public @Override Action createContextAwareInstance(Lookup actionContext) { + Project p = actionContext.lookup(Project.class); + if (p == null) { + return null; + } + J2eeModuleProvider provider = (J2eeModuleProvider) p.getLookup().lookup(J2eeModuleProvider.class); + if (provider == null) { + return null; + } + if (!provider.hasVerifierSupport()) { + return null; + } + return ProjectSensitiveActions.projectCommandAction( "verify", NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_VerifyAction_Name" ), null ); + } + + } + + /** This action is created only when project has broken references. + * Once these are resolved the action is disabled. + */ + private class BrokenLinksAction extends AbstractAction { + + public BrokenLinksAction() { + putValue(Action.NAME, NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_Fix_Broken_Links_Action")); + setEnabled(broken); + putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true); + } + + @Override + public void actionPerformed(ActionEvent e) { + try { + helper.requestUpdate(); + BrokenReferencesSupport.showCustomizer(helper.getAntProjectHelper(), resolver, getBreakableProperties(), new String[] {WebProjectProperties.JAVA_PLATFORM}); + testBroken(); + } catch (IOException ioe) { + ErrorManager.getDefault().notify(ioe); + } + } + + } + + private class BrokenServerAction extends AbstractAction { public BrokenServerAction() { - putValue(Action.NAME,NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_Fix_Missing_Server_Action")); // NOI18N - evaluator.addPropertyChangeListener(this); - checkMissingServer(); + putValue(Action.NAME, NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_Fix_Missing_Server_Action")); + setEnabled(brokenServer); + putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true); } - public boolean isEnabled() { - return brokenServer; - } - + @Override public void actionPerformed(ActionEvent e) { + try { + helper.requestUpdate(); Profile j2eeProfile = Profile.fromPropertiesString(helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH). getProperty(WebProjectProperties.J2EE_PLATFORM)); if (j2eeProfile == null) { @@ -554,11 +692,15 @@ WebProjectProperties.setServerInstance( project, helper, instance); } - checkMissingServer(); + testBroken(); + } catch (IOException ioe) { + ErrorManager.getDefault().notify(ioe); + } } private void updateJ2EESpec(final Project project, final AntProjectHelper helper, final Profile j2eeProfile) { ProjectManager.mutex().postWriteRequest(new Runnable() { + @Override public void run() { try { EditableProperties projectProps = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); @@ -572,55 +714,32 @@ }); } - public void propertyChange(PropertyChangeEvent evt) { - if (WebProjectProperties.J2EE_SERVER_INSTANCE.equals(evt.getPropertyName())) { - checkMissingServer(); - } } - public void changeDefaultInstance(String oldServerInstanceID, String newServerInstanceID) { + private class BrokenDataSourceAction extends AbstractAction { + + public BrokenDataSourceAction() { + putValue(Action.NAME, NbBundle.getMessage(WebLogicalViewProvider.class, "LBL_Fix_Broken_Datasource_Action")); + setEnabled(brokenDataSource); + putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true); } - public void instanceAdded(String serverInstanceID) { - checkMissingServer(); + @Override + public void actionPerformed(ActionEvent e) { + try { + helper.requestUpdate(); + BrokenDatasourceSupport.fixDatasources(project); + BrokenDatasourceSupport.showAlert(); + } catch (IOException ioe) { + ErrorManager.getDefault().notify(ioe); + } } - public void instanceRemoved(String serverInstanceID) { - checkMissingServer(); } - private void checkMissingServer() { - boolean old = brokenServer; + private boolean hasBrokenServer() { String servInstID = evaluator.getProperty(WebProjectProperties.J2EE_SERVER_INSTANCE); - brokenServer = BrokenServerSupport.isBroken(servInstID); - if (old != brokenServer) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - fireIconChange(); - fireOpenedIconChange(); - fireDisplayNameChange(null, null); - } - }); - } - } - } - - // For checking projects that use database connections to see if these connections are available - private class BrokenDatasourceAction extends AbstractAction implements Runnable, ConnectionListener { - private volatile boolean brokenDatasource; - private RequestProcessor.Task task = null; - - public BrokenDatasourceAction() { - // Create a weak listener so that the connection listener can be GC'd when listener for a project is no longer referenced - ConnectionManager.getDefault().addConnectionListener(WeakListeners.create(ConnectionListener.class, this, ConnectionManager.getDefault())); - - - // For now make sure BrokenDatasourceAction only applies to visualweb/Creator projects - // The if-statement here can be expanded to support other types of projects - putValue(Action.NAME, - NbBundle.getMessage(WebLogicalViewProvider.class, - "LBL_Fix_Broken_Datasource_Action")); //NOI18N - checkMissingDatabaseConnection(); + return BrokenServerSupport.isBroken(servInstID); } // Used to check to see if project is a visualweb or Creator project @@ -644,63 +763,16 @@ return isLegacyProject; } - public boolean isEnabled() { - return brokenDatasource; - } - - public void actionPerformed(ActionEvent e) {// - BrokenDatasourceSupport.fixDatasources(project); - checkMissingDatabaseConnection(); - } - - private void checkMissingDatabaseConnection() { - // Checking for valid database connections for each data source - // may take awhile, so run in a separate thread - if (task == null) { - task = BROKEN_DATASOURCE_RP.create(this); - } - task.schedule(100); - - } - - public void run() { - doCheckMissingDatabaseConnection(); - } - /* * Badge project node, change font color of display name to red and * post an alert dialog if not the first time */ - private void doCheckMissingDatabaseConnection() { - boolean old = brokenDatasource; - + private boolean hasBrokenDataSource() { + if (isVisualWebLegacyProject()) { + return false; + } // if the project has any broken data sources then set the brokenDatasource flag to true - if (!BrokenDatasourceSupport.getBrokenDatasources(project).isEmpty()) { - brokenDatasource = true; - } else { - brokenDatasource = false; - } - - if (old != brokenDatasource) { - // make changes in EDT thread - javax.swing.SwingUtilities.invokeLater(new Runnable() { - public void run() { - setEnabled(brokenDatasource); - fireIconChange(); - fireOpenedIconChange(); - fireDisplayNameChange(null, null); - if (brokenDatasource && !isVisualWebLegacyProject()) { - BrokenDatasourceSupport.showAlert(); - } - } - }); - } - } - - public void connectionsChanged() { - checkMissingDatabaseConnection(); - } - } + return !BrokenDatasourceSupport.getBrokenDatasources(project).isEmpty(); } } diff --git a/web.project/src/org/netbeans/modules/web/project/ui/resources/layer.xml b/web.project/src/org/netbeans/modules/web/project/ui/resources/layer.xml --- a/web.project/src/org/netbeans/modules/web/project/ui/resources/layer.xml +++ b/web.project/src/org/netbeans/modules/web/project/ui/resources/layer.xml @@ -126,6 +126,23 @@ + + + + + + + + + + + + + + + + + @@ -146,6 +163,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +