Author: scabanovich
Date: 2010-12-23 09:53:19 -0500 (Thu, 23 Dec 2010)
New Revision: 27711
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/META-INF/MANIFEST.MF
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/actions/ChangeTimeStampActionDelegate.java
Log:
JBIDE-7854
https://issues.jboss.org/browse/JBIDE-7854
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.ui/META-INF/MANIFEST.MF
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.ui/META-INF/MANIFEST.MF 2010-12-23 13:58:06
UTC (rev 27710)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.ui/META-INF/MANIFEST.MF 2010-12-23 14:53:19
UTC (rev 27711)
@@ -24,6 +24,7 @@
org.eclipse.search;bundle-version="[3.5.0,4.0.0)",
org.eclipse.ui.forms;bundle-version="[3.4.0,4.0.0)",
org.eclipse.core.resources,
+ org.eclipse.jface,
com.ibm.icu,
org.eclipse.jst.server.ui,
org.eclipse.wst.server.core,
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java 2010-12-23
13:58:06 UTC (rev 27710)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.java 2010-12-23
14:53:19 UTC (rev 27711)
@@ -236,6 +236,9 @@
public static String RequiredCredentialsDialog_IgnoreButton;
public static String RequiredCredentialsDialog_ShellText;
+
+ public static String ChangeTimestampServerListDialog_Title;
+ public static String ChangeTimestampServerListDialog_Message;
static {
NLS.initializeMessages(BUNDLE_NAME,
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties 2010-12-23
13:58:06 UTC (rev 27710)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/Messages.properties 2010-12-23
14:53:19 UTC (rev 27711)
@@ -207,3 +207,8 @@
RequiredCredentialsDialog_IgnoreButton=Ignore
RequiredCredentialsDialog_ShellText=Server Credentials Required
+
+#Change Timestamp
+ChangeTimestampServerListDialog_Title=Touch project
+ChangeTimestampServerListDialog_Message=Project {0} has no files to touch.\nSelect
servers in which to republish the project.
+
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/actions/ChangeTimeStampActionDelegate.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/actions/ChangeTimeStampActionDelegate.java 2010-12-23
13:58:06 UTC (rev 27710)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/actions/ChangeTimeStampActionDelegate.java 2010-12-23
14:53:19 UTC (rev 27711)
@@ -10,29 +10,51 @@
******************************************************************************/
package org.jboss.ide.eclipse.as.ui.actions;
+
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.IServerWorkingCopy;
+import org.eclipse.wst.server.core.ServerCore;
+import org.eclipse.wst.server.core.ServerUtil;
+import org.eclipse.wst.server.core.internal.ServerType;
+import org.jboss.ide.eclipse.as.ui.Messages;
import org.jboss.ide.eclipse.as.ui.JBossServerUIPlugin;
public class ChangeTimeStampActionDelegate implements IWorkbenchWindowActionDelegate {
@@ -99,6 +121,55 @@
f.setLocalTimeStamp(System.currentTimeMillis());
f.touch(new NullProgressMonitor()); // done so deployers/listeners can detect the
actual change.
}
+ if(fs.isEmpty() && JavaEEProjectUtilities.isDynamicWebProject(project)) {
+ List<IServer> servers = getServers(project);
+
+ final IServer[] ss = servers.toArray(new IServer[0]);
+
+ final Object input = new Object();
+
+ Shell shell =
JBossServerUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
+ CheckedTreeSelectionDialog dialog = new CheckedTreeSelectionDialog(shell, new
LabelProvider(), new ITreeContentProvider() {
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ public void dispose() {
+ }
+ public boolean hasChildren(Object element) {
+ return element == input;
+ }
+ public Object getParent(Object element) {
+ return null;
+ }
+ public Object[] getElements(Object inputElement) {
+ return ss;
+ }
+ public Object[] getChildren(Object parentElement) {
+ return null;
+ }
+ });
+ dialog.setInput(input);
+ dialog.setInitialSelections(ss);
+ String message = NLS.bind(Messages.ChangeTimestampServerListDialog_Message,
project.getName());
+ dialog.setMessage(message);
+ dialog.create();
+ dialog.getShell().setText(Messages.ChangeTimestampServerListDialog_Title);
+
+ dialog.open();
+ Object[] os = dialog.getResult();
+
+ if(os == null || os.length == 0) {
+ return;
+ }
+
+ servers.clear();
+ for (Object s: os) {
+ if(s instanceof IServer) {
+ servers.add((IServer)s);
+ }
+ }
+
+ new RegisterServerJob(project, servers.toArray(new IServer[0])).schedule();
+ }
}
private static List<IFile> getFilesToTouch(IProject project) {
@@ -159,4 +230,130 @@
}
return false;
}
+
+ static List<IServer> getServers(IProject project) {
+ List<IServer> result = new ArrayList<IServer>();
+ IServer[] servers = ServerCore.getServers();
+ for (IServer s: servers) {
+ if(isRegistered(project, s)) {
+ result.add(s);
+ }
+ }
+ return result;
+ }
+
+ public static boolean isRegistered(IProject project, IServer server) {
+ if(server == null || project == null) return false;
+ IModule[] ms = server.getModules();
+ IModule m = findModule(project);
+ return (contains(ms, m));
+ }
+
+ public static IModule findModule(IProject project) {
+ //
https://jira.jboss.org/jira/browse/JBIDE-3972
+ // There may be a few modules for resources from the same project.
+ // Ignore module with jboss.singlefile type if there are other module types.
+ IModule[] modules = ServerUtil.getModules(project);
+ if(modules != null && modules.length>0) {
+ for (int i = 0; i < modules.length; i++) {
+ if(!"jboss.singlefile".equals(modules[i].getModuleType().getId())) {
//$NON-NLS-1$
+ return modules[i];
+ }
+ }
+ }
+ return null;
+ }
+
+ private static boolean contains(IModule[] modules, IModule module) {
+ if(modules == null || module == null) return false;
+ for (int i = 0; i < modules.length; i++) {
+ if(modules[i].getName() != null &&
modules[i].getName().equals(module.getName())) return true;
+ }
+ return false;
+ }
+
+ public static void register(IProject project, IServer server) {
+ if(server == null) return;
+ IModule m = findModule(project);
+ if(m == null) return;
+ if(contains(server.getModules(), m)) return;
+ IModule[] add = new IModule[]{m};
+ IModule[] remove = new IModule[0];
+ try {
+ IProgressMonitor monitor = new NullProgressMonitor();
+ IServerWorkingCopy copy = server.createWorkingCopy();
+ IStatus status = copy.canModifyModules(add, remove, monitor);
+ if(status != null && !status.isOK()) return;
+ ServerUtil.modifyModules(copy, add, remove, monitor);
+ copy.save(true, monitor);
+ if(canPublish(server)) {
+ server.publish(IServer.PUBLISH_INCREMENTAL, monitor);
+ }
+ } catch (CoreException e) {
+// WebModelPlugin.getPluginLog().logError(e);
+ }
+ }
+
+ public static boolean canPublish(IServer server) {
+ if(server == null || server.getRuntime() == null) return false;
+ if (((ServerType)server.getServerType()).startBeforePublish() &&
+ (server.getServerState() != IServer.STATE_STARTED)) {
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean unregister(IProject project, IServer server) {
+ if(server == null) return false;
+ IModule m = findModule(project);
+ if(!contains(server.getModules(), m)) return false;
+ IModule[] add = new IModule[0];
+ IModule[] remove = new IModule[]{m};
+ try {
+ IProgressMonitor monitor = new NullProgressMonitor();
+ IServerWorkingCopy copy = server.createWorkingCopy();
+ ServerUtil.modifyModules(copy, add, remove, monitor);
+ copy.save(true, monitor);
+ if(canPublish(server)) {
+ server.publish(IServer.PUBLISH_INCREMENTAL, monitor);
+ }
+ } catch (CoreException e) {
+ e.printStackTrace();
+// WebModelPlugin.getPluginLog().logError(e);
+ }
+ return true;
+ }
+
+ private static class RegisterServerJob extends Job {
+ long counter = 100;
+ IProject project;
+ IServer[] servers;
+ public RegisterServerJob(IProject p, IServer[] servers) {
+ super("Touch");
+ this.project = p;
+ this.servers = servers;
+ }
+
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ ResourcesPlugin.getWorkspace().run(new WR(), monitor);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return Status.OK_STATUS;
+ }
+
+ class WR implements IWorkspaceRunnable {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ for (IServer s: servers) {
+ unregister(project, s);
+ }
+ for (IServer s: servers) {
+ register(project, s);
+ }
+ }
+
+ }
+ }
+
}
\ No newline at end of file