[98374] Cactus test wizard
diff --git a/plugins/org.eclipse.jst.server.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.server.ui/META-INF/MANIFEST.MF
index 9adaac1..e450c24 100644
--- a/plugins/org.eclipse.jst.server.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.server.ui/META-INF/MANIFEST.MF
@@ -17,5 +17,7 @@
  org.eclipse.jdt.junit,
  org.eclipse.wst.server.core,
  org.eclipse.wst.server.ui,
- org.eclipse.jst.server.core
+ org.eclipse.jst.server.core,
+ org.eclipse.ui.ide,
+ org.eclipse.jdt.ui
 Eclipse-AutoStart: true
diff --git a/plugins/org.eclipse.jst.server.ui/icons/obj16/new_testcase.gif b/plugins/org.eclipse.jst.server.ui/icons/obj16/new_testcase.gif
new file mode 100644
index 0000000..1ff93cb
--- /dev/null
+++ b/plugins/org.eclipse.jst.server.ui/icons/obj16/new_testcase.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.server.ui/icons/wizban/new_test_wiz.gif b/plugins/org.eclipse.jst.server.ui/icons/wizban/new_test_wiz.gif
new file mode 100644
index 0000000..4a71e95
--- /dev/null
+++ b/plugins/org.eclipse.jst.server.ui/icons/wizban/new_test_wiz.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.server.ui/plugin.properties b/plugins/org.eclipse.jst.server.ui/plugin.properties
index 8a2af62..d238a55 100644
--- a/plugins/org.eclipse.jst.server.ui/plugin.properties
+++ b/plugins/org.eclipse.jst.server.ui/plugin.properties
@@ -11,4 +11,5 @@
 pluginName=Java Server UI Support
 providerName=Eclipse.org
 
-cactusJUnitClient=JUnit Client
\ No newline at end of file
+cactusJUnitClient=JUnit Client
+cactusServletTestCase=Servlet Test Case
diff --git a/plugins/org.eclipse.jst.server.ui/plugin.xml b/plugins/org.eclipse.jst.server.ui/plugin.xml
index f32e52c..70c7f15 100644
--- a/plugins/org.eclipse.jst.server.ui/plugin.xml
+++ b/plugins/org.eclipse.jst.server.ui/plugin.xml
@@ -48,4 +48,15 @@
         name="%cactusJUnitClient"/>
   </extension>
 
+  <extension point="org.eclipse.ui.newWizards">
+     <wizard
+        id="org.eclipse.jst.server.ui.internal.cactus.NewServletTestCaseWizard"
+        canFinishEarly="false"
+        category="org.eclipse.jdt.ui.java/org.eclipse.jdt.junit"
+        class="org.eclipse.jst.server.ui.internal.cactus.NewServletTestCaseWizard"
+        hasPages="true"
+        icon="icons/obj16/new_testcase.gif"
+        name="%cactusServletTestCase"/>
+  </extension>
+
 </plugin>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/GenericRuntimeComposite.java b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/GenericRuntimeComposite.java
index 751d769..1e26184 100644
--- a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/GenericRuntimeComposite.java
+++ b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/GenericRuntimeComposite.java
@@ -59,7 +59,7 @@
 		
 		wizard.setTitle(Messages.runtimeTypeTitle);
 		wizard.setDescription(Messages.runtimeTypeDescription);
-		wizard.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_RUNTIME_TYPE));
+		wizard.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_WIZ_RUNTIME_TYPE));
 		
 		createControl();
 	}
diff --git a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/ImageResource.java b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/ImageResource.java
index 9def455..7403446 100644
--- a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/ImageResource.java
+++ b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/ImageResource.java
@@ -45,7 +45,8 @@
 
 	private static final String URL_WIZBAN = "wizban/";
 
-	protected static final String IMG_RUNTIME_TYPE = "runtimeType";
+	protected static final String IMG_WIZ_RUNTIME_TYPE = "wiz_runtimeType";
+	public static final String IMG_WIZ_CACTUS_TEST = "wiz_cactus_test";
 
 	/**
 	 * Cannot construct an ImageResource. Use static methods only.
@@ -101,7 +102,8 @@
 		imageRegistry = new ImageRegistry();
 		imageDescriptors = new HashMap();
 	
-		registerImage(IMG_RUNTIME_TYPE, URL_WIZBAN + "new_runtime_wiz.gif");
+		registerImage(IMG_WIZ_RUNTIME_TYPE, URL_WIZBAN + "new_runtime_wiz.gif");
+		registerImage(IMG_WIZ_CACTUS_TEST, URL_WIZBAN + "new_test_wiz.gif");
 	}
 
 	/**
diff --git a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.java b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.java
index 36645f8..dd13be8 100644
--- a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.java
+++ b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.java
@@ -30,6 +30,14 @@
 	public static String LaunchTestAction_message_selectDebugConfiguration;
 	public static String LaunchTestAction_message_selectRunConfiguration;
 
+	public static String NewServletTestCaseWizard_WindowTitle;
+	public static String NewServletTestCaseWizard_ErrorMessageTitleMissingLibrary;
+	public static String NewServletTestCaseWizard_ErrorMessageMissingType;
+	public static String NewServletTestCaseWizard_ErrorMessageMissingLibrary;
+	public static String NewServletTestCaseWizard_ErrorTitleNew;
+	public static String NewServletTestCaseWizard_ErrorTitleCreateOfElementFailed;
+	public static String NewServletTestCaseWizard_ErrorMessageSeeErrorLog;
+
 	static {
 		NLS.initializeMessages(JavaServerUIPlugin.PLUGIN_ID + ".internal.Messages", Messages.class);
 	}
diff --git a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.properties b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.properties
index e49fde1..97930c9 100644
--- a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.properties
+++ b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/Messages.properties
@@ -23,4 +23,12 @@
 
 LaunchTestAction_message_selectConfiguration=Select a Test Configuration
 LaunchTestAction_message_selectDebugConfiguration=Select JUnit configuration to debug
-LaunchTestAction_message_selectRunConfiguration=Select JUnit configuration to run
\ No newline at end of file
+LaunchTestAction_message_selectRunConfiguration=Select JUnit configuration to run
+
+NewServletTestCaseWizard_WindowTitle=New JUnit Test Case
+NewServletTestCaseWizard_ErrorMessageTitleMissingLibrary=Missing library
+NewServletTestCaseWizard_ErrorMessageMissingType=Missing type
+NewServletTestCaseWizard_ErrorMessageMissingLibrary=You are missing cactus dependencies in your web project. The following libraries are required: {0}, {1}, {2}, {3} and {4}. Other versions might work but have not necessarily been tested. All libraries can be downloaded at http://jakarta.apache.org/cactus/.
+NewServletTestCaseWizard_ErrorTitleNew=New
+NewServletTestCaseWizard_ErrorTitleCreateOfElementFailed=Creation of element failed.
+NewServletTestCaseWizard_ErrorMessageSeeErrorLog=See error log for more details.
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/cactus/NewServletTestCaseWizard.java b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/cactus/NewServletTestCaseWizard.java
new file mode 100644
index 0000000..f7fd896
--- /dev/null
+++ b/plugins/org.eclipse.jst.server.ui/sjavaui/org/eclipse/jst/server/ui/internal/cactus/NewServletTestCaseWizard.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc. 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:
+ *    Daniel R. Somerfield - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.server.ui.internal.cactus;
+
+import java.io.StringWriter;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.junit.wizards.NewTestCaseWizardPageOne;
+import org.eclipse.jdt.junit.wizards.NewTestCaseWizardPageTwo;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jst.server.ui.internal.ImageResource;
+import org.eclipse.jst.server.ui.internal.JavaServerUIPlugin;
+import org.eclipse.jst.server.ui.internal.Messages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.*;
+import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
+/**
+ *
+ */
+public class NewServletTestCaseWizard extends Wizard implements INewWizard {
+	private static final String SUPERCLASS_NAME = "org.apache.cactus.ServletTestCase"; //$NON-NLS-1$
+
+	protected static final String[] CLASSES_TO_CHECK = {
+		"org.apache.cactus.ServletTestCase", "junit.framework.TestCase",
+		"org.apache.commons.logging.Log", "org.aspectj.lang.JoinPoint",
+		"org.apache.commons.httpclient.HttpClient" };
+
+	protected static final String[] REQUIRED_LIBRARIES = {
+		"cactus-1.7.jar", "junit-3.8.1.jar", "aspectjrt-1.2.1.jar",
+		"commons-logging-1.0.4.jar", "commons-httpclient-2.0.2.jar" };
+
+	private IWorkbench fWorkbench;
+	private IStructuredSelection fSelection;
+	private NewTestCaseWizardPageTwo fPage2;
+	private NewTestCaseWizardPageOne fPage1;
+	
+	public NewServletTestCaseWizard() {
+		super();
+		setWindowTitle(Messages.NewServletTestCaseWizard_WindowTitle);
+		setDefaultPageImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_WIZ_CACTUS_TEST));
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		fWorkbench = workbench;
+		fSelection = selection;
+	}
+
+	public void addPages() {
+		super.addPages();
+		fPage2 = new NewTestCaseWizardPageTwo();
+		fPage1 = new NewTestCaseWizardPageOne(fPage2) {
+			public void createControl(Composite parent) {
+				super.createControl(parent);
+				setSuperClass(SUPERCLASS_NAME, true);
+			}
+
+			protected IStatus validateIfJUnitProject() {
+				IPackageFragmentRoot root = getPackageFragmentRoot();
+				if (root == null)
+					return Status.OK_STATUS;
+
+				IJavaProject project = root.getJavaProject();
+				try {
+					for (int i = 0; i < CLASSES_TO_CHECK.length; i++) {
+						IType type = project.findType(CLASSES_TO_CHECK[i]);
+						if (type == null) {
+							MessageDialog.openError(getShell(),
+									Messages.NewServletTestCaseWizard_ErrorMessageTitleMissingLibrary,
+									NLS.bind(Messages.NewServletTestCaseWizard_ErrorMessageMissingLibrary, REQUIRED_LIBRARIES));
+							return Status.OK_STATUS;
+						}
+					}
+				} catch (JavaModelException e) {
+					JavaServerUIPlugin.log(e);
+				}
+				return Status.OK_STATUS;
+			}
+		};
+		addPage(fPage1);
+		fPage1.init(getSelection());
+		addPage(fPage2);
+
+	}
+
+	private IStructuredSelection getSelection() {
+		return fSelection;
+	}
+
+	public boolean performFinish() {
+		if (finishPage(fPage1.getRunnable())) {
+			IType newClass = fPage1.getCreatedType();
+
+			IResource resource = newClass.getCompilationUnit().getResource();
+			if (resource != null) {
+				BasicNewResourceWizard.selectAndReveal(resource, fWorkbench
+						.getActiveWorkbenchWindow());
+				openResource(resource);
+				// checkLibraryMissing();
+			}
+			return true;
+		}
+		return false;
+	}
+
+	/*private void checkLibraryMissing() {
+		IType newClass = fPage1.getCreatedType();
+		IJavaProject project = newClass.getJavaProject();
+		try {
+			IType type = project.findType(SUPERCLASS_NAME);
+			MessageDialog.openError(getShell(), NLS.bind(
+					Messages.NewServletTestCaseWizard_ErrorMessageMissingLibrary, REQUIRED_LIBRARIES),
+					Messages.NewServletTestCaseWizard_ErrorMessageMissingType);
+		} catch (JavaModelException e) {
+			JavaServerUIPlugin.log(e);
+		}
+	}*/
+
+	protected boolean finishPage(IRunnableWithProgress runnable) {
+		IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(runnable);
+		try {
+			PlatformUI.getWorkbench().getProgressService().runInUI(getContainer(), op,
+					ResourcesPlugin.getWorkspace().getRoot());
+		} catch (InvocationTargetException e) {
+			String title = Messages.NewServletTestCaseWizard_ErrorTitleNew; // NewJUnitWizard_op_error_title
+			String message = Messages.NewServletTestCaseWizard_ErrorTitleCreateOfElementFailed; // NewJUnitWizard_op_error_message
+			// ExceptionHandler.handle(e, shell, title, message);
+			displayMessageDialog(e, e.getMessage(), getShell(), title, message);
+			return false;
+		} catch (InterruptedException e) {
+			return false;
+		}
+		return true;
+	}
+
+	public static void displayMessageDialog(Throwable t, String exceptionMessage,
+			Shell shell, String title, String message) {
+		StringWriter msg = new StringWriter();
+		if (message != null) {
+			msg.write(message);
+			msg.write("\n\n"); //$NON-NLS-1$
+		}
+		if (exceptionMessage == null || exceptionMessage.length() == 0)
+			msg.write(Messages.NewServletTestCaseWizard_ErrorMessageSeeErrorLog);
+		else
+			msg.write(exceptionMessage);
+		MessageDialog.openError(shell, title, msg.toString());
+	}
+
+	protected void openResource(final IResource resource) {
+		if (resource.getType() == IResource.FILE) {
+			final IWorkbenchPage activePage = getActivePage();
+			if (activePage != null) {
+				final Display display = Display.getDefault();
+				if (display != null) {
+					display.asyncExec(new Runnable() {
+						public void run() {
+							try {
+								IDE.openEditor(activePage, (IFile) resource, true);
+							} catch (PartInitException e) {
+								JavaServerUIPlugin.log(e);
+							}
+						}
+					});
+				}
+			}
+		}
+	}
+
+	public static IWorkbenchPage getActivePage() {
+		IWorkbenchWindow activeWorkbenchWindow = getActiveWorkbenchWindow();
+		if (activeWorkbenchWindow == null)
+			return null;
+		return activeWorkbenchWindow.getActivePage();
+	}
+
+	public static IWorkbenchWindow getActiveWorkbenchWindow() {
+		IWorkbench workbench = JavaServerUIPlugin.getInstance().getWorkbench();
+		if (workbench != null)
+			return workbench.getActiveWorkbenchWindow();
+		
+		return null;
+	}
+}
\ No newline at end of file