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 extends Project> 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+