529600 - generate unique id if server name is not in use but id is Signed-off-by: Rob Stryker <stryker@redhat.com>
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 e1afbd3..faba637 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, 2011 IBM Corporation and others. + * Copyright (c) 2003, 2018 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 @@ -424,18 +424,7 @@ } } - /** - * Returns true if a server or runtime exists with the given name. - * - * @param element an object - * @param name a name - * @return <code>true</code> if the name is in use, and <code>false</code> - * otherwise - */ - public static boolean isNameInUse(Object element, String name) { - if (name == null) - return true; - + private static List<Object> generateIsNameInUseList(Object element, String name) { List<Object> list = new ArrayList<Object>(); if (element == null || element instanceof IRuntime) @@ -451,20 +440,96 @@ if (list.contains(element)) list.remove(element); } - + return list; + } + + private static final int CHECK_ID = 0; + private static final int CHECK_NAME = 1; + private static final int CHECK_BOTH = 2; + + + /** + * Returns true if a server or runtime exists with the given name. + * + * @param element an object + * @param name a name + * @return <code>true</code> if the name is in use, and <code>false</code> + * otherwise + */ + public static boolean isNameInUse(Object element, String name) { + return isNameInUse(element, name, CHECK_BOTH); + } + + /** + * Returns true if a server or runtime exists with the given ID. + * + * @param element an object + * @param name a name + * @return <code>true</code> if the name is in use, and <code>false</code> + * otherwise + */ + public static boolean isIdInUse(Object element, String id) { + return isNameInUse(element, id, CHECK_ID); + } + + /** + * Returns true if a server or runtime exists with the given name. + * + * @param element an object + * @param name a name + * @return <code>true</code> if the name is in use, and <code>false</code> + * otherwise + */ + public static boolean isNameOnlyInUse(Object element, String id) { + return isNameInUse(element, id, CHECK_NAME); + } + + /** + * Returns true if a server or runtime exists with the given name only (ignoring id). + * + * @param element an object + * @param name a name + * @return <code>true</code> if the name is in use, and <code>false</code> + * otherwise + */ + private static boolean isNameInUse(Object element, String name, int type) { + if (name == null) + return true; + List<Object> list = generateIsNameInUseList(element, name); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object obj = iterator.next(); - if (obj instanceof IServerAttributes && - (name.equalsIgnoreCase(((IServerAttributes)obj).getName()) || name.equalsIgnoreCase(((IServerAttributes)obj).getId()))) - return true; - if (obj instanceof IRuntime && name.equalsIgnoreCase(((IRuntime)obj).getName())) - return true; + if (obj instanceof IServerAttributes) { + if( type == CHECK_NAME ) { + if( name.equalsIgnoreCase(((IServerAttributes)obj).getName()) ) + return true; + } else if( type == CHECK_ID) { + if( name.equalsIgnoreCase(((IServerAttributes)obj).getId()) ) + return true; + } else { + if( name.equalsIgnoreCase(((IServerAttributes)obj).getName()) || + name.equalsIgnoreCase(((IServerAttributes)obj).getId()) ) + return true; + } + } + if (obj instanceof IRuntime ) { + if( type == CHECK_NAME ) { + if( name.equalsIgnoreCase(((IRuntime)obj).getName()) ) + return true; + } else if( type == CHECK_ID) { + if( name.equalsIgnoreCase(((IRuntime)obj).getId()) ) + return true; + } else { /*if( type == CHECK_BOTH ) {*/ + if( name.equalsIgnoreCase(((IRuntime)obj).getName()) || + name.equalsIgnoreCase(((IRuntime)obj).getId()) ) + return true; + } + } } return false; } - + /** * Utility method to tokenize a string into an array. *
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/OverviewEditorPart.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/OverviewEditorPart.java index 93f9d8d..3663dc2 100644 --- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/OverviewEditorPart.java +++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/editor/OverviewEditorPart.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2017 IBM Corporation and others. + * Copyright (c) 2003, 2018 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 @@ -1033,7 +1033,7 @@ MultiStatus ms = new MultiStatus(ServerUIPlugin.PLUGIN_ID, 0, "Validating Overview Part", null); mForm.getMessageManager().removeMessage("name", serverName); if (server != null && serverName != null) { - if (ServerPlugin.isNameInUse(server, serverName.getText().trim())) { + if (ServerPlugin.isNameOnlyInUse(server, serverName.getText().trim())) { mForm.getMessageManager().addMessage("name", Messages.errorDuplicateName, null, IMessageProvider.ERROR, serverName); ms.add(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorDuplicateName)); }
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RenameAction.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RenameAction.java index 1fd8de5..d3e4ac4 100644 --- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RenameAction.java +++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/view/servers/RenameAction.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 IBM Corporation and others. + * Copyright (c) 2007, 2018 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 @@ -259,7 +259,7 @@ public void run() { try { if (!newName.equals(editedServer.getName())) { - if (ServerPlugin.isNameInUse(editedServer, newName)) { + if (ServerPlugin.isNameOnlyInUse(editedServer, newName)) { MessageDialog.openError(shell, Messages.defaultDialogTitle, Messages.errorDuplicateName); } else { try {
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java index 2c723ad..86a9f6f 100644 --- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java +++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/wizard/page/NewManualServerComposite.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2017 IBM Corporation and others. + * Copyright (c) 2003, 2018 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 @@ -263,6 +263,10 @@ if (server != null) { server.setName(name); + String base = serverName.getText().trim(); + if( ServerPlugin.isIdInUse(server, base) ) { + server.setAttribute("id", generateUniqueId(base)); + } IRuntime runtime2 = server.getRuntime(); if (runtime2 != null && runtime2 instanceof IRuntimeWorkingCopy) { IRuntimeWorkingCopy rwc = (IRuntimeWorkingCopy) runtime2; @@ -353,6 +357,17 @@ Dialog.applyDialogFont(this); } + String generateUniqueId(String base) { + // generate a temporary unique id + long time = System.currentTimeMillis(); + String toTest = new StringBuilder(base).append("_").append(time).toString(); + int num = 1; + while(ServerPlugin.isIdInUse(server, toTest) ) { + toTest = new StringBuilder(base).append("_").append(time).append("_").append(num++).toString(); + } + return toTest; + } + protected boolean showPreferencePage() { String id = "org.eclipse.wst.server.ui.preferencePage"; String id2 = "org.eclipse.wst.server.ui.runtime.preferencePage"; @@ -1094,7 +1109,7 @@ // server name, check to see if the name is in use if (!cacheServerNameCheck.equals(myServerName)){ cacheServerNameCheck = myServerName; - isServerNameInUse = ServerPlugin.isNameInUse(server, serverName.getText().trim()); + isServerNameInUse = ServerPlugin.isNameOnlyInUse(server, serverName.getText().trim()); } return isServerNameInUse; }