[98779] Runtime locator fix
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Handler.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Handler.java
index 35e7c6e..d15e1b0 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Handler.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat40Handler.java
@@ -29,8 +29,7 @@
 		if (installPath == null)
 			return false;
 
-		String s = installPath.lastSegment();
-		if (s != null && s.startsWith("jakarta-tomcat-") && !s.startsWith("jakarta-tomcat-4.0"))
+		if (!TomcatPlugin.verifyTomcatVersionFromPath(installPath, TomcatPlugin.TOMCAT_40))
 			return false;
 		return TomcatPlugin.verifyInstallPath(installPath, TomcatPlugin.TOMCAT_40);
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Handler.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Handler.java
index ba87235..8d262c1 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Handler.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat41Handler.java
@@ -29,8 +29,7 @@
 		if (installPath == null)
 			return false;
 
-		String s = installPath.lastSegment();
-		if (s != null && s.startsWith("jakarta-tomcat-") && !s.startsWith("jakarta-tomcat-4.1"))
+		if (!TomcatPlugin.verifyTomcatVersionFromPath(installPath, TomcatPlugin.TOMCAT_41))
 			return false;
 		return TomcatPlugin.verifyInstallPath(installPath, TomcatPlugin.TOMCAT_41);
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Handler.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Handler.java
index 23eb661..ab030d2 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Handler.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat50Handler.java
@@ -29,8 +29,7 @@
 		if (installPath == null)
 			return false;
 
-		String s = installPath.lastSegment();
-		if (s != null && s.startsWith("jakarta-tomcat-") && !s.startsWith("jakarta-tomcat-5.0"))
+if (!TomcatPlugin.verifyTomcatVersionFromPath(installPath, TomcatPlugin.TOMCAT_50))
 			return false;
 		return TomcatPlugin.verifyInstallPath(installPath, TomcatPlugin.TOMCAT_50);
 	}
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Handler.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Handler.java
index b9fef29..d14713f 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Handler.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Tomcat55Handler.java
@@ -25,8 +25,7 @@
 		if (installPath == null)
 			return false;
 
-		String s = installPath.lastSegment();
-		if (s != null && s.startsWith("jakarta-tomcat-") && !s.startsWith("jakarta-tomcat-5.5"))
+		if (!TomcatPlugin.verifyTomcatVersionFromPath(installPath, TomcatPlugin.TOMCAT_55))
 			return false;
 		return TomcatPlugin.verifyInstallPath(installPath, TomcatPlugin.TOMCAT_55);
 	}
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 26165a5..b80cdf2 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
@@ -30,20 +30,20 @@
 	protected static TomcatPlugin singleton;
 
 	public static final String PLUGIN_ID = "org.eclipse.jst.server.tomcat.core";
-	
+
 	public static final String TOMCAT_32 = "org.eclipse.jst.server.tomcat.32";
 	public static final String TOMCAT_40 = "org.eclipse.jst.server.tomcat.40";
 	public static final String TOMCAT_41 = "org.eclipse.jst.server.tomcat.41";
 	public static final String TOMCAT_50 = "org.eclipse.jst.server.tomcat.50";
 	public static final String TOMCAT_55 = "org.eclipse.jst.server.tomcat.55";
-	
+
 	protected static final String VERIFY_INSTALL_FILE = "verifyInstall.properties";
 	protected static String[] verify32;
 	protected static String[] verify40;
 	protected static String[] verify41;
 	protected static String[] verify50;
 	protected static String[] verify55;
-	
+
 	/**
 	 * TomcatPlugin constructor comment.
 	 */
@@ -102,6 +102,12 @@
 		}
 	}
 
+	/**
+	 * Return the Tomcat version handler.
+	 * 
+	 * @param id
+	 * @return a version handler
+	 */
 	public static ITomcatVersionHandler getTomcatVersionHandler(String id) {
 		if (id.indexOf("runtime") > 0)
 			id = id.substring(0, 30) + id.substring(38);
@@ -203,6 +209,14 @@
 		}
 	}
 
+	/**
+	 * Verify the Tomcat installation directory.
+	 * 
+	 * @param installPath
+	 * @param id
+	 * @return <code>true</code> if the directory may be a Tomcat installation,
+	 *    and <code>false</code> otherwise
+	 */
 	public static boolean verifyInstallPath(IPath installPath, String id) {
 		if (installPath == null)
 			return false;
@@ -236,6 +250,23 @@
 		return true;
 	}
 
+	public static boolean verifyTomcatVersionFromPath(IPath installPath, String version) {
+		if (installPath == null || version == null)
+			return false;
+		String s = installPath.lastSegment();
+		if (s.indexOf("-3.2") > 0 || s.indexOf(" 3.2") > 0)
+			return TOMCAT_32.equals(version);
+		if (s.indexOf("-4.0") > 0 || s.indexOf(" 4.0") > 0)
+			return TOMCAT_40.equals(version);
+		if (s.indexOf("-4.1") > 0 || s.indexOf(" 4.1") > 0)
+			return TOMCAT_41.equals(version);
+		if (s.indexOf("-5.0") > 0 || s.indexOf(" 5.0") > 0)
+			return TOMCAT_50.equals(version);
+		if (s.indexOf("-5.5") > 0 || s.indexOf(" 5.5") > 0)
+			return TOMCAT_55.equals(version);
+		return true;
+	}
+
 	/**
 	 * Return a <code>java.io.File</code> object that corresponds to the specified
 	 * <code>IPath</code> in the plugin directory.
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeLocator.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeLocator.java
index 9094bff..a2f564a 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeLocator.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeLocator.java
@@ -101,7 +101,7 @@
 				IRuntimeWorkingCopy runtime = runtimeType.createRuntime(id, monitor);
 				runtime.setName(dir.getName());
 				runtime.setLocation(new Path(absolutePath));
-				ITomcatRuntimeWorkingCopy wc = (ITomcatRuntimeWorkingCopy) runtime.getAdapter(ITomcatRuntimeWorkingCopy.class);
+				ITomcatRuntimeWorkingCopy wc = (ITomcatRuntimeWorkingCopy) runtime.loadAdapter(ITomcatRuntimeWorkingCopy.class, null);
 				wc.setVMInstall(JavaRuntime.getDefaultVMInstall());
 				IStatus status = runtime.validate(monitor);
 				if (status == null || status.getSeverity() != IStatus.ERROR)
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Trace.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Trace.java
index dc9bf41..fae3fbc 100644
--- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Trace.java
+++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/Trace.java
@@ -9,6 +9,9 @@
  *    IBM Corporation - Initial API and implementation
  **********************************************************************/
 package org.eclipse.jst.server.tomcat.core.internal;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
 /**
  * Helper class to route trace output.
  */
@@ -18,6 +21,14 @@
 	public static byte SEVERE = 2;
 	public static byte FINEST = 3;
 	public static byte FINER = 4;
+	
+	private static final String[] levelNames = new String[] {
+		"CONFIG   ", "WARNING  ", "SEVERE   ", "FINER    ", "FINEST   "};
+	private static final String spacer = "                                   ";
+	
+	private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm.ss.SSS");
+	
+	protected static int pluginLength = -1;
 
 	/**
 	 * Trace constructor comment.
@@ -47,7 +58,40 @@
 		if (!TomcatPlugin.getInstance().isDebugging())
 			return;
 
-		System.out.println(TomcatPlugin.PLUGIN_ID + " " + s);
+		/*System.out.println(TomcatPlugin.PLUGIN_ID + " " + s);
+		if (t != null)
+			t.printStackTrace();*/
+		trace(TomcatPlugin.PLUGIN_ID, level, s, t);
+	}
+
+	/**
+	 * Trace the given message and exception.
+	 *
+	 * @param level a trace level
+	 * @param s a message
+	 * @param t a throwable
+	 */
+	private static void trace(String pluginId, int level, String s, Throwable t) {
+		if (pluginId == null || s == null)
+			return;
+
+		if (!TomcatPlugin.getInstance().isDebugging())
+			return;
+		
+		StringBuffer sb = new StringBuffer(pluginId);
+		if (pluginId.length() > pluginLength)
+			pluginLength = pluginId.length();
+		else if (pluginId.length() < pluginLength)
+			sb.append(spacer.substring(0, pluginLength - pluginId.length()));
+		sb.append(" ");
+		sb.append(levelNames[level]);
+		sb.append(" ");
+		sb.append(sdf.format(new Date()));
+		sb.append(" ");
+		sb.append(s);
+		//Platform.getDebugOption(ServerCore.PLUGIN_ID + "/" + "resources");
+
+		System.out.println(sb.toString());
 		if (t != null)
 			t.printStackTrace();
 	}