[294664] Classpath entry attributes lost when updating runtime classpath container
[295494] RuntimeClasspathContainer should update runtime if it is null
[291960] XMLViewer makes (apparently) invalid assumptions about TransformerFactory
[282922] Server will not change to republish status after web module changed
[286960] Cannot delete a module using the delete key button on servers view.
[291261] Invalid matching rule shows in .log
diff --git a/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java b/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
index b1f40b0..f4f9509 100644
--- a/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
+++ b/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/RuntimeClasspathProviderDelegate.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,17 +11,12 @@
package org.eclipse.jst.server.core;
import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
@@ -151,7 +146,8 @@
for (int j = 0; j < size2; j++) {
SourceAttachmentUpdate sau = sourceAttachments.get(j);
if (sau.runtimeId.equals(runtime.getId()) && sau.entry.equals(entries[i].getPath())) {
- entries[i] = JavaCore.newLibraryEntry(entries[i].getPath(), sau.sourceAttachmentPath, sau.sourceAttachmentRootPath, new IAccessRule[0], sau.attributes, false);
+ IClasspathAttribute[] consolidatedClasspathAttributes = consolidateClasspathAttributes(sau.attributes, entries[i].getExtraAttributes());
+ entries[i] = JavaCore.newLibraryEntry(entries[i].getPath(), sau.sourceAttachmentPath, sau.sourceAttachmentRootPath, entries[i].getAccessRules(), consolidatedClasspathAttributes, false);
}
}
}
@@ -353,4 +349,23 @@
Trace.trace(Trace.SEVERE, "Error saving source path info", e);
}
}
+
+ public IClasspathAttribute[] consolidateClasspathAttributes(IClasspathAttribute[] sourceAttachmentAttributes, IClasspathAttribute[] classpathEntryAttributes) {
+ List classpathAttributeList = new ArrayList();
+ classpathAttributeList.addAll(Arrays.asList(sourceAttachmentAttributes));
+ for (int i = 0; i < classpathEntryAttributes.length; i++) {
+ boolean attributeCollision = false;
+ for (int j = 0; j < sourceAttachmentAttributes.length; j++) {
+ String name = classpathEntryAttributes[i].getName();
+ if(name != null && name.equals(sourceAttachmentAttributes[j].getName())) {
+ attributeCollision = true;
+ break;
+ }
+ }
+ if(!attributeCollision) {
+ classpathAttributeList.add(classpathEntryAttributes[i]);
+ }
+ }
+ return (IClasspathAttribute[]) classpathAttributeList.toArray(new IClasspathAttribute[classpathAttributeList.size()]);
+ }
}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/internal/RuntimeClasspathContainer.java b/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/internal/RuntimeClasspathContainer.java
index d044b05..e76f687 100644
--- a/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/internal/RuntimeClasspathContainer.java
+++ b/plugins/org.eclipse.jst.server.core/src/org/eclipse/jst/server/core/internal/RuntimeClasspathContainer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.IRuntimeType;
+import org.eclipse.wst.server.core.ServerCore;
/**
*
*/
@@ -69,8 +70,11 @@
*/
public IClasspathEntry[] getClasspathEntries() {
IClasspathEntry[] entries = null;
- if (delegate != null && runtime != null)
- entries = delegate.resolveClasspathContainerImpl(project, runtime);
+
+ IRuntime curRuntime = getRuntime();
+
+ if (delegate != null && curRuntime != null)
+ entries = delegate.resolveClasspathContainerImpl(project, curRuntime);
if (entries == null)
return new IClasspathEntry[0];
@@ -78,14 +82,24 @@
return entries;
}
+ private IRuntime getRuntime(){
+ if (runtime == null && runtimeId != null) {
+ // Make sure the runtime object is initialized.
+ runtime = ServerCore.findRuntime(runtimeId);
+ }
+ return runtime;
+ }
+
/** (non-Javadoc)
* @see org.eclipse.jdt.core.IClasspathContainer#getDescription()
*/
public String getDescription() {
- if (runtime != null) {
- IRuntimeType runtimeType = runtime.getRuntimeType();
+ IRuntime curRuntime = getRuntime();
+
+ if (curRuntime != null) {
+ IRuntimeType runtimeType = curRuntime.getRuntimeType();
if (runtimeType != null)
- return NLS.bind(Messages.classpathContainer, runtimeType.getName(), runtime.getName());
+ return NLS.bind(Messages.classpathContainer, runtimeType.getName(), curRuntime.getName());
}
return NLS.bind(Messages.classpathContainerUnbound, Messages.classpathContainerDescription, runtimeId);
}
diff --git a/plugins/org.eclipse.wst.internet.monitor.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.internet.monitor.ui/META-INF/MANIFEST.MF
index 938be77..9b4cc49 100644
--- a/plugins/org.eclipse.wst.internet.monitor.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.internet.monitor.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.wst.internet.monitor.ui; singleton:=true
-Bundle-Version: 1.0.304.qualifier
+Bundle-Version: 1.0.305.qualifier
Bundle-Activator: org.eclipse.wst.internet.monitor.ui.internal.MonitorUIPlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.internet.monitor.ui/monitorui/org/eclipse/wst/internet/monitor/ui/internal/viewers/XMLViewer.java b/plugins/org.eclipse.wst.internet.monitor.ui/monitorui/org/eclipse/wst/internet/monitor/ui/internal/viewers/XMLViewer.java
index 2029df3..36bce7f 100644
--- a/plugins/org.eclipse.wst.internet.monitor.ui/monitorui/org/eclipse/wst/internet/monitor/ui/internal/viewers/XMLViewer.java
+++ b/plugins/org.eclipse.wst.internet.monitor.ui/monitorui/org/eclipse/wst/internet/monitor/ui/internal/viewers/XMLViewer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -87,9 +87,16 @@
messageLabel.setText(Messages.xmlViewInvalid);
return;
}
- if (xmlTagMissing && finalMsg.toLowerCase().startsWith("<?xml version=\"1.0\" encoding=\"utf-8\"?>")) {
- int x = finalMsg.indexOf("\n") + 1;
+ if (xmlTagMissing && (finalMsg.toLowerCase().startsWith("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
+ || finalMsg.toLowerCase().startsWith("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>")
+ || finalMsg.toLowerCase().startsWith("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>"))) {
+ int x = finalMsg.indexOf(">") + 1;
+ //remove <?xml version="1.0" encoding="UTF-8"?>
String Msg = finalMsg.substring(x);
+ //remove starting newlines
+ while (Msg.substring(0, ls).indexOf(lineSeparator) >= 0){
+ Msg = Msg.substring(ls, Msg.length());
+ }
finalMsg = Msg;
messageText.setText(finalMsg);
@@ -211,6 +218,7 @@
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.STANDALONE, "no"); //$NON-NLS-1$
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
throw (IOException) (new IOException().initCause(e));
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 3d3d5f1..d3d8c2d 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
@@ -52,6 +52,12 @@
public static final int AUTO_PUBLISH_DISABLE = 1;
public static final int AUTO_PUBLISH_ENABLE = 2;
+ private static String PUBLISH_AUTO_STRING = "auto";
+ private static String PUBLISH_CLEAN_STRING = "clean";
+ private static String PUBLISH_FULL_STRING = "full";
+ private static String PUBLISH_INCREMENTAL_STRING = "incremental";
+ private static String PUBLISH_UNKOWN = "unkown";
+
protected static final String PROP_HOSTNAME = "hostname";
protected static final String SERVER_ID = "server-id";
protected static final String RUNTIME_ID = "runtime-id";
@@ -745,6 +751,10 @@
protected void handleModuleProjectChange(IModule module) {
Trace.trace(Trace.FINEST, "> handleDeployableProjectChange() " + this + " " + module);
+ if (!isModuleDeployed(module)){
+ return;
+ }
+
// check for duplicate jobs already waiting and don't create a new one
Job[] jobs = Job.getJobManager().find(ServerUtil.SERVER_JOB_FAMILY);
if (jobs != null) {
@@ -765,6 +775,36 @@
Trace.trace(Trace.FINEST, "< handleDeployableProjectChange()");
}
+
+ protected boolean isModuleDeployed(final IModule requestedModule){
+ Trace.trace(Trace.FINEST, "> isModuleDeployed()");
+
+ // no modules are deployed
+ if (modules.isEmpty())
+ return false;
+
+ // shallow search: check for root modules first
+ boolean deployed = modules.contains(requestedModule);
+
+ if(!deployed){
+ // deep search: look into all the child modules
+ Iterator<IModule> itr = modules.iterator();
+ while(itr.hasNext() && !deployed){
+ IModule[] m = new IModule[] {itr.next()};
+ deployed = !visitModule(m, new IModuleVisitor(){
+ public boolean visit(IModule[] modules2) {
+ for (int i =0;i<=modules2.length-1;i++){
+ if (modules2[i].equals(requestedModule))
+ return false;
+ }
+ return true;
+ }}, null);
+ }
+ }
+
+ Trace.trace(Trace.FINEST, "< isModuleDeployed() deployed="+deployed);
+ return deployed;
+ }
protected void stopAutoPublish() {
if (autoPublishThread == null)
@@ -2677,6 +2717,7 @@
protected IStatus publishImpl(int kind, List<IModule[]> modules4, IAdaptable info, IProgressMonitor monitor) {
Trace.trace(Trace.FINEST, "-->-- Publishing to server: " + Server.this.toString() + " -->--");
+ Trace.trace(Trace.FINEST, "Server.publishImpl(): kind=<"+getPublishKindString(kind)+"> modules=" + modules4);
stopAutoPublish();
@@ -2709,7 +2750,7 @@
getServerPublishInfo().save();
firePublishFinished(Status.OK_STATUS);
- Trace.trace(Trace.PERFORMANCE, "Server.publish(): <" + (System.currentTimeMillis() - time) + "> " + getServerType().getId());
+ Trace.trace(Trace.PERFORMANCE, "Server.publishImpl(): <" + (System.currentTimeMillis() - time) + "> " + getServerType().getId());
return status;
} catch (Exception e) {
Trace.trace(Trace.SEVERE, "Error calling delegate publish() " + Server.this.toString(), e);
@@ -3132,4 +3173,20 @@
public String toString() {
return getName();
}
-}
\ No newline at end of file
+
+ private String getPublishKindString(int kind){
+ if (kind == IServer.PUBLISH_AUTO){
+ return PUBLISH_AUTO_STRING;
+ }
+ else if (kind == IServer.PUBLISH_CLEAN){
+ return PUBLISH_CLEAN_STRING;
+ }
+ else if (kind == IServer.PUBLISH_FULL){
+ return PUBLISH_FULL_STRING;
+ }
+ else if (kind == IServer.PUBLISH_INCREMENTAL){
+ return PUBLISH_INCREMENTAL_STRING;
+ }
+ return PUBLISH_UNKOWN;
+ }
+}
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java
index c38aae8..157e636 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/ServerPlugin.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -1157,7 +1157,6 @@
|| (b.endsWith(".*") && a.startsWith(b.substring(0, b.length() - 1))))
return true;
if (a.startsWith(b) || b.startsWith(a)) {
- ServerPlugin.log(new Status(IStatus.ERROR, ServerPlugin.PLUGIN_ID, "Invalid matching rules used: " + a + "/" + b));
Trace.trace(Trace.WARNING, "Invalid matching rules used: " + a + "/" + b);
return true;
}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java
new file mode 100644
index 0000000..4666249
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/GlobalDeleteAction.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.internal.view.servers;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.actions.SelectionProviderAction;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.ui.internal.Messages;
+/**
+ * This global delete action handles both the server and module deletion.
+ */
+public class GlobalDeleteAction extends SelectionProviderAction {
+ protected Shell shell;
+ private DeleteAction serverDeleteAction = null;
+ private boolean isRemoveServer = false;
+
+ public GlobalDeleteAction(Shell shell, ISelectionProvider selectionProvider) {
+ super(selectionProvider, Messages.actionDelete);
+ this.shell = shell;
+ setEnabled(false);
+ serverDeleteAction = new DeleteAction(shell, selectionProvider);
+ }
+
+ private boolean isRemoveModuleActionEnabled(IStructuredSelection sel) {
+ if (sel == null || sel.isEmpty())
+ return false;
+
+ // get selection but avoid no selection or multiple selection
+ IModule[] moduleArray = null;
+ Iterator iterator = sel.iterator();
+ Object obj = iterator.next();
+ if (obj instanceof ModuleServer) {
+ ModuleServer ms = (ModuleServer) obj;
+ moduleArray = ms.module;
+ }
+
+ if (iterator.hasNext()) {
+ moduleArray = null;
+ }
+
+ return (moduleArray == null || moduleArray.length == 1);
+ }
+
+ /**
+ * Update the enabled state.
+ *
+ * @param sel a selection
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ if (sel.isEmpty()) {
+ setEnabled(false);
+ return;
+ }
+
+ // Check if the delete action is enabled or not.
+ serverDeleteAction.selectionChanged(sel);
+
+ if (serverDeleteAction.isEnabled()) {
+ // The server deletion action is already enabled.
+ isRemoveServer = true;
+ setEnabled(true);
+ return;
+ }
+
+ // Check the remove module action.
+ if (isRemoveModuleActionEnabled(sel)) {
+ isRemoveServer = false;
+ setEnabled(true);
+ } else {
+ setEnabled(false);
+ }
+ }
+
+ public void run() {
+ if (isRemoveServer) {
+ // Run the server delete action;
+ serverDeleteAction.run();
+ return;
+ }
+ // get selection but avoid no selection or multiple selection
+ IServer server = null;
+ IModule[] moduleArray = null;
+ IStructuredSelection sel = getStructuredSelection();
+ if (!sel.isEmpty()) {
+ Iterator iterator = sel.iterator();
+ Object obj = iterator.next();
+
+ // and the method calls serverDeleteAction, then returns
+ if (obj instanceof IServer)
+ server = (IServer) obj;
+ if (obj instanceof ModuleServer) {
+ ModuleServer ms = (ModuleServer) obj;
+ server = ms.server; // even though ms.server is public, let's stick to the getServer call
+ moduleArray = ms.module;
+ }
+
+ if (iterator.hasNext()) {
+ server = null;
+ moduleArray = null;
+ }
+ }
+
+ if (moduleArray != null && moduleArray.length == 1) {
+ new RemoveModuleAction(shell, server, moduleArray[0]).run();
+ }
+ }
+}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServersView.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServersView.java
index 5d754ad..21a1fa9 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServersView.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/ServersView.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -68,7 +68,7 @@
// actions on a server
protected Action[] actions;
protected Action actionModifyModules;
- protected Action openAction, showInConsoleAction, showInDebugAction, propertiesAction, monitorPropertiesAction;
+ protected Action openAction, showInConsoleAction, showInDebugAction, propertiesAction, monitorPropertiesAction, globalDeleteAction;
protected Action copyAction, pasteAction, deleteAction, renameAction;
/**
@@ -289,10 +289,13 @@
pasteAction = new PasteAction(shell, provider, tableViewer.clipboard);
copyAction = new CopyAction(provider, tableViewer.clipboard, pasteAction);
deleteAction = new DeleteAction(shell, provider);
+ // Create a second delete action that can act in modules, when the delete key is pressed
+ // the old DeleteAction only works for servers see bug# 286960
+ globalDeleteAction = new GlobalDeleteAction(shell, provider);
renameAction = new RenameAction(shell, tableViewer, provider);
actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
- actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
+ actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), globalDeleteAction);
actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction);
// create the other actions