[564110] Make it easier to find the server configuration files

Change-Id: I761e552eb30d108a33d532fd856808b43ca99641
diff --git a/features/org.eclipse.wst.server_core.feature/feature.xml b/features/org.eclipse.wst.server_core.feature/feature.xml
index 9d98ee7..da93bf2 100644
--- a/features/org.eclipse.wst.server_core.feature/feature.xml
+++ b/features/org.eclipse.wst.server_core.feature/feature.xml
@@ -15,7 +15,7 @@
 <feature
       id="org.eclipse.wst.server_core.feature"
       label="%featureName"
-      version="3.3.900.qualifier"
+      version="3.3.1000.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="1.0.1.qualifier">
diff --git a/features/org.eclipse.wst.server_core.feature/pom.xml b/features/org.eclipse.wst.server_core.feature/pom.xml
index c6ff39a..ed528ff 100644
--- a/features/org.eclipse.wst.server_core.feature/pom.xml
+++ b/features/org.eclipse.wst.server_core.feature/pom.xml
@@ -22,7 +22,7 @@
 
   <groupId>org.eclipse.webtools.servertools</groupId>
   <artifactId>org.eclipse.wst.server_core.feature</artifactId>
-  <version>3.3.900-SNAPSHOT</version>
+  <version>3.3.1000-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
   <build>
diff --git a/features/org.eclipse.wst.server_sdk.feature/feature.xml b/features/org.eclipse.wst.server_sdk.feature/feature.xml
index d8c03a9..459cef9 100644
--- a/features/org.eclipse.wst.server_sdk.feature/feature.xml
+++ b/features/org.eclipse.wst.server_sdk.feature/feature.xml
@@ -14,7 +14,7 @@
 <feature

       id="org.eclipse.wst.server_sdk.feature"

       label="%featureName"

-      version="3.3.800.qualifier"

+      version="3.3.900.qualifier"

       provider-name="%providerName"

       license-feature="org.eclipse.license"

       license-feature-version="1.0.1.qualifier">

diff --git a/features/org.eclipse.wst.server_sdk.feature/pom.xml b/features/org.eclipse.wst.server_sdk.feature/pom.xml
index 831d912..21930f5 100644
--- a/features/org.eclipse.wst.server_sdk.feature/pom.xml
+++ b/features/org.eclipse.wst.server_sdk.feature/pom.xml
@@ -22,6 +22,6 @@
 

   <groupId>org.eclipse.webtools.servertools</groupId>

   <artifactId>org.eclipse.wst.server_sdk.feature</artifactId>

-  <version>3.3.800-SNAPSHOT</version>

+  <version>3.3.900-SNAPSHOT</version>

   <packaging>eclipse-feature</packaging>

 </project>

diff --git a/features/org.eclipse.wst.server_ui.feature/feature.xml b/features/org.eclipse.wst.server_ui.feature/feature.xml
index 2ac97fc..2e30f59 100644
--- a/features/org.eclipse.wst.server_ui.feature/feature.xml
+++ b/features/org.eclipse.wst.server_ui.feature/feature.xml
@@ -14,7 +14,7 @@
 <feature
       id="org.eclipse.wst.server_ui.feature"
       label="%featureName"
-      version="3.3.1300.qualifier"
+      version="3.3.1400.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="1.0.1.qualifier">
diff --git a/features/org.eclipse.wst.server_ui.feature/pom.xml b/features/org.eclipse.wst.server_ui.feature/pom.xml
index 2dfc740..1b0a50e 100644
--- a/features/org.eclipse.wst.server_ui.feature/pom.xml
+++ b/features/org.eclipse.wst.server_ui.feature/pom.xml
@@ -22,7 +22,7 @@
 
   <groupId>org.eclipse.webtools.servertools</groupId>
   <artifactId>org.eclipse.wst.server_ui.feature</artifactId>
-  <version>3.3.1300-SNAPSHOT</version>
+  <version>3.3.1400-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatPlugin.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatPlugin.java
index 39e5479..d2f88cf 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatPlugin.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatPlugin.java
@@ -140,36 +140,36 @@
 	 * Return the Tomcat version handler.
 	 * 
 	 * @param id
-	 * @return a version handler
+	 * @return a version handler or <code>null</code> if the version strung is not understood
 	 */
 	public static ITomcatVersionHandler getTomcatVersionHandler(String id) {
 		if (id.indexOf("runtime") > 0)
 			id = id.substring(0, 30) + id.substring(38);
 		//id = id.substring(0, id.length() - 8);
-		if (TOMCAT_32.equals(id))
-			return new Tomcat32Handler();
-		else if (TOMCAT_40.equals(id))
-			return new Tomcat40Handler();
-		else if (TOMCAT_41.equals(id))
-			return new Tomcat41Handler();
-		else if (TOMCAT_50.equals(id))
-			return new Tomcat50Handler();
-		else if (TOMCAT_55.equals(id))
-			return new Tomcat55Handler();
-		else if (TOMCAT_60.equals(id))
-			return new Tomcat60Handler();
-		else if (TOMCAT_70.equals(id))
-			return new Tomcat70Handler();
-		else if (TOMCAT_80.equals(id))
-			return new Tomcat80Handler();
-		else if (TOMCAT_85.equals(id))
-			return new Tomcat85Handler();
-		else if (TOMCAT_90.equals(id))
-			return new Tomcat90Handler();
+		if (TOMCAT_101.equals(id))
+			return new Tomcat101Handler();
 		else if (TOMCAT_100.equals(id))
 			return new Tomcat100Handler();
-		else if (TOMCAT_101.equals(id))
-			return new Tomcat101Handler();
+		else if (TOMCAT_90.equals(id))
+			return new Tomcat90Handler();
+		else if (TOMCAT_85.equals(id))
+			return new Tomcat85Handler();
+		else if (TOMCAT_80.equals(id))
+			return new Tomcat80Handler();
+		else if (TOMCAT_70.equals(id))
+			return new Tomcat70Handler();
+		else if (TOMCAT_60.equals(id))
+			return new Tomcat60Handler();
+		else if (TOMCAT_55.equals(id))
+			return new Tomcat55Handler();
+		else if (TOMCAT_50.equals(id))
+			return new Tomcat50Handler();
+		else if (TOMCAT_41.equals(id))
+			return new Tomcat41Handler();
+		else if (TOMCAT_40.equals(id))
+			return new Tomcat40Handler();
+		else if (TOMCAT_32.equals(id))
+			return new Tomcat32Handler();
 		else
 			return null;
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntime.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntime.java
index 1d493bb..3a2c5b0 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntime.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntime.java
@@ -15,6 +15,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -93,7 +94,11 @@
 				// Ignore if there is a problem
 			}
 		}
-		return getVersionHandler().getRuntimeClasspath(installPath, configPath);
+		ITomcatVersionHandler versionHandler = getVersionHandler();
+		if (versionHandler == null) {
+			return new ArrayList(0);
+		}
+		return versionHandler.getRuntimeClasspath(installPath, configPath);
 	}
 
 	/**
@@ -107,7 +112,11 @@
 	}
 	
 	private IStatus verifyLocation(IPath loc) {
-		return getVersionHandler().verifyInstallPath(loc);
+		ITomcatVersionHandler versionHandler = getVersionHandler();
+		if (versionHandler == null) {
+			return new Status(IStatus.ERROR, getClass(), "No version handler able to handle location " + loc.toString());
+		}
+		return versionHandler.verifyInstallPath(loc);
 	}
 	
 	/*
diff --git a/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF
index d4e1228..8a2bd0d 100644
--- a/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.server.core; singleton:=true
-Bundle-Version: 1.10.200.qualifier
+Bundle-Version: 1.10.300.qualifier
 Bundle-Activator: org.eclipse.wst.server.core.internal.ServerPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.server.core/pom.xml b/plugins/org.eclipse.wst.server.core/pom.xml
index 1a504d1..0c205df 100644
--- a/plugins/org.eclipse.wst.server.core/pom.xml
+++ b/plugins/org.eclipse.wst.server.core/pom.xml
@@ -22,6 +22,6 @@
 

   <groupId>org.eclipse.webtools.servertools</groupId>

   <artifactId>org.eclipse.wst.server.core</artifactId>

-  <version>1.10.200-SNAPSHOT</version>

+  <version>1.10.300-SNAPSHOT</version>

   <packaging>eclipse-plugin</packaging>

 </project>

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 6e44ba6..177c759 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2018 IBM Corporation and others.
+ * Copyright (c) 2003, 2022 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
  * which accompanies this distribution, and is available at
@@ -2429,10 +2429,13 @@
 	protected void resolve() {
 		IServerType oldServerType = serverType;
 		String serverTypeId = getAttribute("server-type-id", (String)null);
-		if (serverTypeId != null)
+		if (serverTypeId != null) {
 			serverType = ServerCore.findServerType(serverTypeId);
-		else
+		}
+		else {
 			serverType = null;
+			ServerPlugin.log(Status.error("No server type was previously recorded for " + getName()));
+		}
 		if (serverType != null && !serverType.equals(oldServerType))
 			serverState = ((ServerType)serverType).getInitialState();
 		
diff --git a/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
index af06fad..f81110d 100644
--- a/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.server.ui; singleton:=true
-Bundle-Version: 1.5.800.qualifier
+Bundle-Version: 1.5.900.qualifier
 Bundle-Activator: org.eclipse.wst.server.ui.internal.ServerUIPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.server.ui/pom.xml b/plugins/org.eclipse.wst.server.ui/pom.xml
index 3ead6de..9cba354 100644
--- a/plugins/org.eclipse.wst.server.ui/pom.xml
+++ b/plugins/org.eclipse.wst.server.ui/pom.xml
@@ -22,6 +22,6 @@
 
   <groupId>org.eclipse.webtools.servertools</groupId>
   <artifactId>org.eclipse.wst.server.ui</artifactId>
-  <version>1.5.800-SNAPSHOT</version>
+  <version>1.5.900-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
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 9646867..252cda1 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, 2018 IBM Corporation and others.
+ * Copyright (c) 2003, 2022 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
  * which accompanies this distribution, and is available at
@@ -14,6 +14,8 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.*;
 import java.util.List;
 
@@ -28,6 +30,8 @@
 import org.eclipse.jface.viewers.CheckStateChangedEvent;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
 import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.osgi.util.NLS;
@@ -398,8 +402,9 @@
 			link.addHyperlinkListener(new HyperlinkAdapter() {
 				public void linkActivated(HyperlinkEvent e) {
 					IRuntime runtime = server2.getRuntime();
-					if (runtime != null && ServerUIPlugin.hasWizardFragment(runtime.getRuntimeType().getId()))
+					if (runtime != null && ServerUIPlugin.hasWizardFragment(runtime.getRuntimeType().getId())) {
 						editRuntime(runtime);
+					}
 				}
 			});
 			
@@ -512,13 +517,143 @@
 		
 		// server configuration path
 		if (server != null && server.getServerType() != null && server.getServerType().hasServerConfiguration()) {
-			createLabel(toolkit, composite, Messages.serverEditorOverviewServerConfigurationPath);
-			
+			Hyperlink openConfigurationLink = toolkit.createHyperlink(composite, Messages.serverEditorOverviewServerConfigurationPath, SWT.NONE);
+			final IServerWorkingCopy server2 = server;
+			openConfigurationLink.addHyperlinkListener(new HyperlinkAdapter() {
+				@Override
+				public void linkActivated(HyperlinkEvent e) {
+					super.linkActivated(e);
+					if (server2.getServerConfiguration() == null || server2.getServerConfiguration().getFullPath() == null) {
+						return;
+					}
+
+					IWorkbenchWindow window = getSite().getWorkbenchWindow();
+					if (window != null) {
+						IWorkbenchPage page = window.getActivePage();
+						if (page != null) {
+							IViewReference[] viewReferences = page.getViewReferences();
+							String[] targetIDs = new String[]{IPageLayout.ID_PROJECT_EXPLORER, "org.eclipse.jdt.ui.PackageExplorer", "org.eclipse.ui.views.ResourceNavigator"};
+							IPath path = server2.getServerConfiguration().getFullPath();
+							IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
+							IResource[] resources = new IResource[]{folder};
+							try {
+								resources = folder.members();
+							}
+							catch (CoreException e2) {
+								// fall back on the folder itself
+							}
+							boolean shown = false;
+							for (int i = 0; i < targetIDs.length && !shown; i++) {
+								for (int j = 0; j < viewReferences.length && !shown; j++) {
+									if (targetIDs[i].equals(viewReferences[j].getId())) {
+										IViewPart view = viewReferences[j].getView(true);
+										if (view != null) {
+											IWorkbenchPart part = view.getViewSite().getPart();
+											try {
+												if (!shown) {
+													try {
+														Method getViewer = part.getClass().getMethod("getViewer", new Class[0]);
+														if (getViewer != null && TreeViewer.class.isAssignableFrom(getViewer.getReturnType())) {
+															view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(resources));
+															page.activate(view);
+															((TreeViewer) getViewer.invoke(part, new Object[0])).reveal(folder);
+															view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(folder));
+															shown = true;
+														}
+													}
+													catch (NoSuchMethodException e1) {
+													}
+												}
+												if (!shown) {
+													try {
+														Method getTreeViewer = part.getClass().getMethod("getTreeViewer", null);
+														if (getTreeViewer != null && TreeViewer.class.isAssignableFrom(getTreeViewer.getReturnType())) {
+															view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(resources));
+															page.activate(view);
+															((TreeViewer) getTreeViewer.invoke(part, new Object[0])).reveal(folder);
+															view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(folder));
+															shown = true;
+														}
+													}
+													catch (NoSuchMethodException e1) {
+													}
+												}
+												if (!shown) {
+													try {
+														Method getCommonViewer = part.getClass().getMethod("getCommonViewer", null);
+														if (getCommonViewer != null && TreeViewer.class.isAssignableFrom(getCommonViewer.getReturnType())) {
+															view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(resources));
+															page.activate(view);
+															((TreeViewer) getCommonViewer.invoke(part, new Object[0])).reveal(folder);
+															view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(folder));
+															shown = true;
+														}
+													}
+													catch (NoSuchMethodException e1) {
+													}
+												}
+											}
+											catch (SecurityException e1) {
+												// ignore
+											}
+											catch (IllegalAccessException e1) {
+												// ignore
+											}
+											catch (IllegalArgumentException e1) {
+												// ignore
+											}
+											catch (InvocationTargetException e1) {
+												// ignore
+											}
+											if (!shown) {
+												view.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(resources));
+												page.activate(view);
+												shown = true;
+											}
+										}
+									}
+								}
+							}
+							if (!shown) {
+								try {
+									IViewPart part = page.showView(IPageLayout.ID_PROJECT_EXPLORER);
+
+									try {
+										Method getCommonViewer = part.getClass().getMethod("getCommonViewer", null);
+										if (getCommonViewer != null && TreeViewer.class.isAssignableFrom(getCommonViewer.getReturnType())) {
+											part.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(resources));
+											page.activate(part);
+											((TreeViewer) getCommonViewer.invoke(part, new Object[0])).reveal(folder);
+											part.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(folder));
+											shown = true;
+										}
+									}
+									catch (NoSuchMethodException e1) {
+									}
+									catch (InvocationTargetException e1) {
+									}
+									catch (IllegalAccessException e1) {
+									}
+									catch (IllegalArgumentException e1) {
+									}
+									part.getViewSite().getSelectionProvider().setSelection(new StructuredSelection(resources));
+								}
+								catch (PartInitException e1) {
+									ServerPlugin.log(Status.error("Could not open view to show server configuration", e1));
+								}
+							}
+						}
+					}
+				}
+			});
+
 			IFolder folder = server.getServerConfiguration();
-			if (folder == null)
+			if (folder == null) {
 				serverConfiguration = toolkit.createText(composite, Messages.elementUnknownName);
-			else
+			}
+			else {
 				serverConfiguration = toolkit.createText(composite, "" + server.getServerConfiguration().getFullPath());
+			}
 			
 			serverConfiguration.setEditable(false);
 			GridData data = new GridData(GridData.FILL_HORIZONTAL);