Server Profiler support
diff --git a/plugins/org.eclipse.jst.server.generic.core/plugin.xml b/plugins/org.eclipse.jst.server.generic.core/plugin.xml
index a1bb37b..723f523 100644
--- a/plugins/org.eclipse.jst.server.generic.core/plugin.xml
+++ b/plugins/org.eclipse.jst.server.generic.core/plugin.xml
@@ -10,7 +10,7 @@
         id="org.eclipse.jst.server.generic.core.launchConfigurationType"
         name="%launchConfigurationTypeName"
         delegate="org.eclipse.jst.server.generic.core.internal.GenericServerLaunchConfigurationDelegate"
-        modes="run, debug"
+        modes="run, debug, profile"
         sourceLocatorId="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"
         sourcePathComputerId="org.eclipse.jst.server.generic.core.sourcePathComputer"/>
      <launchConfigurationType
diff --git a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.java b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.java
index d3f9f7f..93e72cb 100644
--- a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.java
+++ b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.java
@@ -29,6 +29,7 @@
 	public static String errorRemoveModuleAntpublisher;
 	public static String errorPublishAntpublisher;
 	public static String commandlineUnspecified;
+	public static String noProfiler;
 	public static String workingdirUnspecified;
 	public static String errorLaunchingExecutable;
 	public static String missingServer;
diff --git a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.properties b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.properties
index 36e088b..763914e 100644
--- a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.properties
+++ b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerCoreMessages.properties
@@ -28,3 +28,4 @@
 unableToCreatePublisher=Unable to create publisher {0}
 canNotPublishDeletedModule=Can not publish because module {0} is closed or deleted
 antLauncherMissing=Ant launcher is missing or disabled
+noProfiler=Could not launch in profiling mode because no profilers are configured.
diff --git a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerLaunchConfigurationDelegate.java b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerLaunchConfigurationDelegate.java
index e35d6bb..ad64ffa 100644
--- a/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerLaunchConfigurationDelegate.java
+++ b/plugins/org.eclipse.jst.server.generic.core/src/org/eclipse/jst/server/generic/core/internal/GenericServerLaunchConfigurationDelegate.java
@@ -17,12 +17,15 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchManager;
 import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate;
 import org.eclipse.jdt.launching.ExecutionArguments;
 import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
 import org.eclipse.jdt.launching.IVMInstall;
 import org.eclipse.jdt.launching.IVMRunner;
 import org.eclipse.jdt.launching.VMRunnerConfiguration;
+import org.eclipse.jst.server.core.internal.JavaServerPlugin;
+import org.eclipse.jst.server.core.internal.ServerProfiler;
 import org.eclipse.wst.server.core.IServer;
 import org.eclipse.wst.server.core.ServerUtil;
 import org.eclipse.wst.server.core.model.ServerBehaviourDelegate;
@@ -57,6 +60,10 @@
 			String mainTypeName = genericServer.getStartClassName();
 			IVMInstall vm = verifyVMInstall(configuration);
 			IVMRunner runner = vm.getVMRunner(mode);
+			
+			if(runner==null && mode == ILaunchManager.PROFILE_MODE){
+				runner = vm.getVMRunner(ILaunchManager.RUN_MODE);
+			}
 			if(runner== null){
 				throw new CoreException(new Status(IStatus.ERROR,CorePlugin.PLUGIN_ID,0,GenericServerCoreMessages.runModeNotSupported,null));
 			}
@@ -69,6 +76,15 @@
 			String pgmArgs = getProgramArguments(configuration);
 			String vmArgs = getVMArguments(configuration);
 
+			if (mode == ILaunchManager.PROFILE_MODE) {
+				ServerProfiler[] sp = JavaServerPlugin.getServerProfilers();
+				if (sp == null || sp.length==0 || runner == null) {
+					genericServer.stopImpl();
+					throw new CoreException(new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, 0, GenericServerCoreMessages.noProfiler, null));
+				}
+				String vmArgs2 = sp[0].getVMArgs(); //$NON-NLS-1$
+				vmArgs = vmArgs + " " + vmArgs2; //$NON-NLS-1$
+			}
 			ExecutionArguments execArgs = new ExecutionArguments(vmArgs,
 					pgmArgs);