diff options
7 files changed, 195 insertions, 143 deletions
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java index ca6f2907b..6b15a846b 100644 --- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java +++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/ServerUtil.java @@ -19,12 +19,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.osgi.util.NLS; -import org.eclipse.wst.server.core.internal.IModuleVisitor; -import org.eclipse.wst.server.core.internal.Messages; -import org.eclipse.wst.server.core.internal.ModuleFactory; -import org.eclipse.wst.server.core.internal.Server; -import org.eclipse.wst.server.core.internal.ServerPlugin; -import org.eclipse.wst.server.core.internal.Trace; +import org.eclipse.wst.server.core.internal.*; /** * Server utility methods. These static methods can be used to perform * common operations on server artifacts. @@ -418,7 +413,7 @@ public class ServerUtil { * @param type a server type * @return an unused file within the given project */ - public static IFile getUnusedServerFile(IProject project, IServerType type) { + /*public static IFile getUnusedServerFile(IProject project, IServerType type) { if (project == null || type == null) throw new IllegalArgumentException(); @@ -430,6 +425,27 @@ public class ServerUtil { i++; } return project.getFile(name); + }*/ + + /** + * Returns an unused file in the given project. + * + * @param project a project + * @param server a server + * @return an unused file within the given project + */ + public static IFile getUnusedServerFile(IProject project, IServer server) { + if (project == null || server == null) + throw new IllegalArgumentException(); + + String typeName = getValidFileName(server.getName()); + String name = NLS.bind(Messages.defaultServerName3, typeName)+ "." + Server.FILE_EXTENSION; + int i = 2; + while (isFileNameInUse(project, name)) { + name = NLS.bind(Messages.defaultServerName4, new String[] {typeName, i + ""}) + "." + Server.FILE_EXTENSION; + i++; + } + return project.getFile(name); } /** @@ -722,4 +738,26 @@ public class ServerUtil { public static IStatus validateEdit(Object context, IServer server) { return ((Server)server).validateEdit(context); } + + /** + * Returns the port that is being used to monitor the given port on the server. + * This method can be used whenever creating a 'client' for the server, and allows + * the client to seamlessly use a monitored port instead of going directly to the + * server. + * + * <b>Provisional API:</b> This class/interface is part of an interim API that is still under development and expected to + * change significantly before reaching stability. It is being made available at this early stage to solicit feedback + * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken + * (repeatedly) as the API evolves. + * </p> + * + * @param server a server + * @param port a port on the server + * @param contentType the content type, e.g. "web" + * @return the monitored port, or the original port number if the port is not + * currently being monitored + */ + public static int getMonitoredPort(IServer server, int port, String contentType) { + return ServerMonitorManager.getInstance().getMonitoredPort(server, port, contentType); + } }
\ No newline at end of file diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java index 7f99d3b8e..c4f9b43e5 100644 --- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java +++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ResourceManager.java @@ -24,7 +24,7 @@ import org.eclipse.wst.server.core.util.ProjectModuleFactoryDelegate; * and servers or server configurations, and creates * notification of servers or server configurations * being added and removed. - * + * * <p>Servers and server configurations may be a single * resource, or they may be a folder that contains a group * of files. Folder-resource may not contain other servers @@ -52,12 +52,13 @@ public class ResourceManager { protected List activeBundles; // resource change listeners - private IResourceChangeListener modelResourceChangeListener; - private IResourceChangeListener publishResourceChangeListener; + private IResourceChangeListener resourceChangeListener; private Preferences.IPropertyChangeListener pcl; protected boolean ignorePreferenceChanges = false; /** + * Server resource change listener. + * * Resource listener - tracks changes on server resources so that * we can reload/drop server instances and configurations that * may change outside of our control. @@ -69,11 +70,11 @@ public class ResourceManager { * attached to the project at this point - OTI defect) * 2. Projects being deleted. */ - public class ServerModelResourceChangeListener implements IResourceChangeListener { + public class ServerResourceChangeListener implements IResourceChangeListener { /** - * Create a new ServerModelResourceChangeListener. + * Create a new ServerResourceChangeListener. */ - public ServerModelResourceChangeListener() { + public ServerResourceChangeListener() { super(); } @@ -87,7 +88,7 @@ public class ResourceManager { if (delta == null) return; - Trace.trace(Trace.RESOURCES, "->- ServerModelResourceManager responding to resource change: " + event.getType() + " ->-"); + Trace.trace(Trace.RESOURCES, "->- ServerResourceChangeListener responding to resource change: " + event.getType() + " ->-"); IResourceDelta[] children = delta.getAffectedChildren(); if (children != null) { int size = children.length; @@ -98,10 +99,28 @@ public class ResourceManager { } } } - - Trace.trace(Trace.RESOURCES, "-<- Done ServerModelResourceManager responding to resource change -<-"); + + // search for changes to any project using a visitor + try { + delta.accept(new IResourceDeltaVisitor() { + public boolean visit(IResourceDelta visitorDelta) { + IResource resource = visitorDelta.getResource(); + + // only respond to project changes + if (resource != null && resource instanceof IProject) { + publishHandleProjectChange(visitorDelta); + return false; + } + return true; + } + }); + } catch (Exception e) { + Trace.trace(Trace.SEVERE, "Error responding to resource change", e); + } + + Trace.trace(Trace.RESOURCES, "-<- Done ServerResourceChangeListener responding to resource change -<-"); } - + /** * React to a change within a possible server project. * @@ -132,49 +151,6 @@ public class ResourceManager { } } } - - /** - * Publish resource listener - */ - public class PublishResourceChangeListener implements IResourceChangeListener { - /** - * Create a new PublishResourceChangeListener. - */ - public PublishResourceChangeListener() { - super(); - } - - /** - * Listen for projects being added or removed and act accordingly. - * - * @param event org.eclipse.core.resources.IResourceChangeEvent - */ - public void resourceChanged(IResourceChangeEvent event) { - IResourceDelta delta = event.getDelta(); - if (delta == null) - return; - - Trace.trace(Trace.FINEST, "->- PublishResourceManager responding to resource change: " + event.getType() + " ->-"); - // search for changes to any project using a visitor - try { - delta.accept(new IResourceDeltaVisitor() { - public boolean visit(IResourceDelta visitorDelta) { - IResource resource = visitorDelta.getResource(); - - // only respond to project changes - if (resource != null && resource instanceof IProject) { - publishHandleProjectChange(visitorDelta); - return false; - } - return true; - } - }); - } catch (Exception e) { - Trace.trace(Trace.SEVERE, "Error responding to resource change", e); - } - Trace.trace(Trace.FINEST, "-<- Done PublishResourceManager responding to resource change -<-"); - } - } protected List moduleServerEventHandlers; protected List moduleServerEventHandlerIndexes; @@ -211,15 +187,11 @@ public class ResourceManager { ServerPlugin.getInstance().getPluginPreferences().addPropertyChangeListener(pcl); resolveServers(); - + // keep track of future changes to the file system - modelResourceChangeListener = new ServerModelResourceChangeListener(); - ResourcesPlugin.getWorkspace().addResourceChangeListener(modelResourceChangeListener, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE); - - // add listener for future changes - publishResourceChangeListener = new PublishResourceChangeListener(); - ResourcesPlugin.getWorkspace().addResourceChangeListener(publishResourceChangeListener, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_DELETE); - + resourceChangeListener = new ServerResourceChangeListener(); + ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE); + /*configurationListener = new IServerConfigurationListener() { public void childProjectChange(IServerConfiguration configuration) { handleConfigurationChildProjectsChange(configuration); @@ -336,10 +308,8 @@ public class ResourceManager { protected void shutdownImpl() { IWorkspace workspace = ResourcesPlugin.getWorkspace(); - if (workspace != null) { - workspace.removeResourceChangeListener(modelResourceChangeListener); - workspace.removeResourceChangeListener(publishResourceChangeListener); - } + if (workspace != null) + workspace.removeResourceChangeListener(resourceChangeListener); ServerPlugin.getInstance().getPluginPreferences().removePropertyChangeListener(pcl); @@ -742,25 +712,30 @@ public class ResourceManager { */ protected boolean handleResourceDelta(IResourceDelta delta) { int kind = delta.getKind(); + int flags = delta.getFlags(); IResource resource2 = delta.getResource(); - + // ignore markers - if (kind == IResourceDelta.CHANGED && (delta.getFlags() & IResourceDelta.MARKERS) != 0) + if (kind == IResourceDelta.CHANGED && (flags & IResourceDelta.MARKERS) != 0) return false; - + Trace.trace(Trace.RESOURCES, "Resource changed: " + resource2 + " " + kind); if (resource2 instanceof IFile) { IFile file = (IFile) resource2; - IProgressMonitor monitor = null; - if (kind == IResourceDelta.ADDED) { - handleNewFile(file, monitor); - } else if (kind == IResourceDelta.REMOVED) { - handleRemovedFile(file); - } else - handleChangedFile(file, monitor); - if (monitor != null) - monitor.done(); + if (Server.FILE_EXTENSION.equals(file.getFileExtension())) { + IProgressMonitor monitor = null; + if ((flags & IResourceDelta.MOVED_FROM) != 0 || (flags & IResourceDelta.MOVED_TO) != 0) + handleMovedFile(file, delta, monitor); + else if (kind == IResourceDelta.ADDED) + handleNewFile(file, monitor); + else if (kind == IResourceDelta.REMOVED) + handleRemovedFile(file); + else + handleChangedFile(file, monitor); + if (monitor != null) + monitor.done(); + } return false; } IFolder folder = (IFolder) resource2; @@ -777,39 +752,6 @@ public class ResourceManager { } } return true; - - /*IProgressMonitor monitor = new NullProgressMonitor(); - List list = getResourceParentList(resource2); - monitor.beginTask("", list.size() * 1000); - - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - IResource resource = (IResource) iterator.next(); - if (!visited.contains(resource.getFullPath())) { - visited.add(resource.getFullPath()); - if (kind == IResourceDelta.REMOVED) { - boolean b = handleRemovedFile(resource); - if (b) { - if (resource instanceof IContainer) - removeServerResourcesBelow((IContainer) resource); - return false; - } else - return true; - } else if (kind == IResourceDelta.ADDED) { - return !handleNewServerResource(resource, monitor); - } else { - boolean b = handleChangedServerResource(resource, monitor); - if (!b) { - handleRemovedFile(resource); - } - return true; - } - } - } - - monitor.done(); - Trace.trace(Trace.RESOURCES, "Ignored resource change: " + resource2); - return true;*/ } protected IServer loadServer(IFile file, IProgressMonitor monitor) throws CoreException { @@ -845,11 +787,50 @@ public class ResourceManager { Trace.trace(Trace.SEVERE, "Error loading server", e); } } - + monitor.done(); return false; } - + + /** + * Tries to load a new server resource from the given resource. + * Returns true if the load and register were successful. + * + * @param file + * @param monitor + * @return boolean + */ + protected boolean handleMovedFile(IFile file, IResourceDelta delta, IProgressMonitor monitor) { + Trace.trace(Trace.RESOURCES, "handleMovedFile: " + file); + monitor = ProgressUtil.getMonitorFor(monitor); + monitor.beginTask("", 2000); + + IPath fromPath = delta.getMovedFromPath(); + if (fromPath != null) { + IFile fromFile = ResourcesPlugin.getWorkspace().getRoot().getFile(fromPath); + if (((ProjectProperties)ServerCore.getProjectProperties(fromFile.getProject())).isServerProject()) { + Server server = (Server) findServer(fromFile); + if (server != null) + server.file = file; + } else { + handleNewFile(file, monitor); + } + } else { + IPath toPath = delta.getMovedToPath(); + IFile toFile = ResourcesPlugin.getWorkspace().getRoot().getFile(toPath); + if (((ProjectProperties)ServerCore.getProjectProperties(toFile.getProject())).isServerProject()) { + Server server = (Server) findServer(file); + if (server != null) + server.file = toFile; + } else { + handleRemovedFile(file); + } + } + + monitor.done(); + return false; + } + /** * Returns the server that came from the given file, or <code>null</code> * if none. This convenience method searches the list of known @@ -900,10 +881,9 @@ public class ResourceManager { Trace.trace(Trace.SEVERE, "Error reloading server " + server.getName() + " from " + file + ": " + e.getMessage()); deregisterServer(server); } - } - - Trace.trace(Trace.RESOURCES, "No server resource found at: " + file); - + } else + Trace.trace(Trace.RESOURCES, "No server found at: " + file); + monitor.done(); return found; } @@ -916,15 +896,15 @@ public class ResourceManager { * @return boolean */ protected boolean handleRemovedFile(IFile file) { - Trace.trace(Trace.RESOURCES, "handleRemovedServerResource: " + file); - + Trace.trace(Trace.RESOURCES, "handleRemovedFile: " + file); + IServer server = findServer(file); if (server != null) { deregisterServer(server); return true; } - - Trace.trace(Trace.RESOURCES, "No server resource found at: " + file); + + Trace.trace(Trace.RESOURCES, "No server found at: " + file); return false; } diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java index b83c784b1..02491ddfb 100644 --- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java +++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java @@ -969,7 +969,7 @@ public class Server extends Base implements IServer { try { ILaunchConfiguration launchConfig = getLaunchConfiguration(true, monitor); - ILaunch launch = launchConfig.launch(mode2, monitor); + ILaunch launch = launchConfig.launch(mode2, monitor, true); Trace.trace(Trace.FINEST, "Launch: " + launch); } catch (CoreException e) { Trace.trace(Trace.SEVERE, "Error starting server " + toString(), e); @@ -1713,7 +1713,7 @@ public class Server extends Base implements IServer { } protected void setInternal(ServerWorkingCopy wc) { - map = wc.map; + map = new HashMap(wc.map); configuration = wc.configuration; runtime = wc.runtime; serverSyncState = wc.serverSyncState; @@ -2062,7 +2062,7 @@ public class Server extends Base implements IServer { server.delete(); if (file == null) { IProject project = ServerType.getServerProject(); - file = ServerUtil.getUnusedServerFile(project, wc.getServerType()); + file = ServerUtil.getUnusedServerFile(project, wc); wc.setFile(file); server.file = file; } else { diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java index bfdce4ffd..b60ae41d9 100644 --- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java +++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerWorkingCopy.java @@ -418,7 +418,22 @@ public class ServerWorkingCopy extends Server implements IServerWorkingCopy { Trace.trace(Trace.SEVERE, "Error calling delegate setDefaults() " + toString(), e); } } - + + public void renameFiles(IProgressMonitor monitor) throws CoreException { + if (getServerConfiguration() != null) { + IFolder folder = getServerConfiguration(); + IFolder folder2 = ServerType.getServerProject().getFolder(getName() + "-config"); + folder.move(folder2.getFullPath(), true, true, monitor); + setServerConfiguration(folder2); + save(true, monitor); + } + + if (file != null) { + IFile file2 = ServerUtil.getUnusedServerFile(file.getProject(), this); + file.move(file2.getFullPath(), true, true, monitor); + } + } + public String toString() { return "ServerWorkingCopy " + getId(); } diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java index af519319e..e345cd967 100644 --- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java +++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.java @@ -223,6 +223,7 @@ public class Messages extends NLS { public static String viewSyncPublishing2; public static String editorServerEditor; public static String editorPromptIrreversible; + public static String editorRenameFiles; public static String errorEditorCantSave; public static String editorReadOnly; public static String editorWritable; diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties index e685f32fe..7b18578a6 100644 --- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties +++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/Messages.properties @@ -391,6 +391,7 @@ editorReadOnlyFiles=Read Only files: {0} editorServerEditor=Server Editor editorPromptIrreversible=This operation cannot be undone. Do you want to proceed? +editorRenameFiles=The server has been renamed. Do you want to rename the corresponding files to match? # message if a dirty resource is deleted editorResourceDeleteTitle=Server Deleted diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/ServerEditor.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/ServerEditor.java index 7aa9124df..42a8e1396 100644 --- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/ServerEditor.java +++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/ServerEditor.java @@ -32,6 +32,7 @@ import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.wst.server.core.*; import org.eclipse.wst.server.core.internal.Server; +import org.eclipse.wst.server.core.internal.ServerWorkingCopy; import org.eclipse.wst.server.ui.ServerUICore; import org.eclipse.wst.server.ui.editor.*; import org.eclipse.wst.server.ui.internal.*; @@ -101,6 +102,7 @@ public class ServerEditor extends MultiPageEditorPart { protected IServerWorkingCopy server; protected String serverId; + protected String serverName; protected GlobalCommandManager commandManager; @@ -143,7 +145,7 @@ public class ServerEditor extends MultiPageEditorPart { super(); ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); - + undoAction = new Action() { public void run() { getCommandManager().undo(serverId); @@ -153,7 +155,7 @@ public class ServerEditor extends MultiPageEditorPart { undoAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)); //undoAction.setHoverImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_HOVER)); //undoAction.setDisabledImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED)); - + redoAction = new Action() { public void run() { getCommandManager().redo(serverId); @@ -269,7 +271,21 @@ public class ServerEditor extends MultiPageEditorPart { if (resourceListener != null) ServerCore.removeServerLifecycleListener(resourceListener); - + + if (serverName != null && !server.getName().equals(serverName)) { + // only prompt if the server is in the workspace or there is a configuration + if (server.getServerConfiguration() != null || ((Server)server).getFile() != null) { + String title = Messages.editorServerEditor; + String message = Messages.editorRenameFiles; + if (MessageDialog.openQuestion(getEditorSite().getShell(), title, message)) + try { + ((ServerWorkingCopy)server).renameFiles(null); + } catch (Exception e) { + Trace.trace(Trace.SEVERE, "Error renaming server", e); + } + } + } + super.dispose(); if (commandManager != null) commandManager.removePropertyChangeListener(listener); @@ -288,7 +304,7 @@ public class ServerEditor extends MultiPageEditorPart { * @see IEditorPart */ public void doSave(IProgressMonitor monitor) { - // Set the isSaving flag to true. + // set the isSaving flag to true isSaving = true; // check pages for errors first @@ -316,7 +332,7 @@ public class ServerEditor extends MultiPageEditorPart { EclipseUtil.openError(getEditorSite().getShell(), sb.toString()); monitor.setCanceled(true); - // Reset the isSaving flag. + // reset the isSaving flag isSaving = false; return; } @@ -330,7 +346,7 @@ public class ServerEditor extends MultiPageEditorPart { monitor.beginTask(NLS.bind(Messages.savingTask, name), ticks); if (server != null) ticks /= 2; - + if (server != null) { server.save(false, ProgressUtil.getSubMonitorFor(monitor, ticks)); getCommandManager().resourceSaved(serverId); @@ -341,17 +357,17 @@ public class ServerEditor extends MultiPageEditorPart { if (server != null) setPartName(labelProvider.getText(server)); } catch (Exception e) { - Trace.trace(Trace.SEVERE, "Error saving from configuration editor", e); - + Trace.trace(Trace.SEVERE, "Error saving server editor", e); + monitor.setCanceled(true); - + String title = Messages.editorSaveErrorDialog; String message = NLS.bind(Messages.editorSaveErrorMessage, e.getLocalizedMessage()); MessageDialog.openError(getEditorSite().getShell(), title, message); } finally { monitor.done(); } - // Reset the isSaving flag. + // reset the isSaving flag isSaving = false; } @@ -660,6 +676,7 @@ public class ServerEditor extends MultiPageEditorPart { setPartName(labelProvider.getText(server)); setTitleImage(labelProvider.getImage(server)); setTitleToolTip(serverId); + serverName = server.getName(); } else setPartName("-"); @@ -877,9 +894,9 @@ public class ServerEditor extends MultiPageEditorPart { * */ protected void checkResourceState() { - // Do not check the resource state change if saving through the editor. + // do not check the resource state change if saving through the editor if (isSaving) { - // Do nothing. + // do nothing return; } |