[296345] A new extension point to allow adopters to add additional controls and behaviour to first page of server wizard
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.properties b/plugins/org.eclipse.wst.server.ui/plugin.properties
index 1cd998b..9c47881 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.properties
+++ b/plugins/org.eclipse.wst.server.ui/plugin.properties
@@ -18,6 +18,7 @@
 extensionPointWizardFragments=Wizard Fragments
 extensionPointInitialSelectionProvider=Initial Selection Provider
 extensionPointAudio=Audio
+extensionPointServerCreationWizardPageExtension=Server Creation Wizard Page Extension
 
 # --------------- Wizards and Views ---------------
 
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.xml b/plugins/org.eclipse.wst.server.ui/plugin.xml
index 57aae19..b4ca617 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.server.ui/plugin.xml
@@ -10,6 +10,7 @@
   <extension-point id="initialSelectionProvider" name="%extensionPointInitialSelectionProvider" schema="schema/initialSelectionProvider.exsd"/>
   <extension-point id="audio" name="%extensionPointAudio" schema="schema/audio.exsd"/>
   <extension-point id="serverToolTip" name="%extensionPointServerToolTip" schema="schema/serverToolTip.exsd"/>
+  <extension-point id="serverCreationWizardPageExtension" name="%extensionPointServerCreationWizardPageExtension" schema="schema/serverCreationWizardPageExtension.exsd"/>
 
 <extension point="org.eclipse.ui.newWizards">
   <category
diff --git a/plugins/org.eclipse.wst.server.ui/schema/serverCreationWizardPageExtension.exsd b/plugins/org.eclipse.wst.server.ui/schema/serverCreationWizardPageExtension.exsd
new file mode 100644
index 0000000..52cc1ea
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/schema/serverCreationWizardPageExtension.exsd
@@ -0,0 +1,138 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.server.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.server.ui" id="serverCreationWizardPageExtension" name="Server Creation Wizard Page Extension"/>
+      </appInfo>
+      <documentation>
+         This extension point provides a way to for adopters to modify the first page of the server creation wizard page.  It provides mechanisms to add custom UI to different sections of the server creation wizard page.  It also allow adopter to control the display of some existing UI on the server creation wizard page.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="serverCreationWizardPageExtension"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="serverCreationWizardPageExtension">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="name"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies a unique identifier for this extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  specifies the fully qualified name of the Java class that extends &lt;samp&gt;org.eclipse.wst.server.ui.wizard.ServerCreationWizardPageExtension&lt;/samp&gt;. The class must have a public 0-arg constructor.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.server.ui.wizard.ServerCreationWizardPageExtension:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         Value of the attribute &lt;b&gt;class&lt;/b&gt; must be a fully qualified name of a Java class that extends &lt;code&gt;org.eclipse.wst.server.ui.editor.ServerCreationWizardPageExtension&lt;/code&gt;.
+
+This extension point currently only supports the control on the following fields on the implementation of org.eclipse.wst.server.ui.AbstractUIControl.IUIControlListener.handleUIControlMapChanged(Map&lt;String, UIControlEntry&gt;):
+Server&apos;s host name
+
+This extension point currently only issue property change event on the following property change:
+Server type selection change
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point is part of an interim API that is still under development and expected to change significantly before reaching stability. It is being made available at this early stage to solicit feedback from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken (repeatedly) as the API evolves.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         3.2
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         The following is an example of the extension point:
+
+&lt;pre&gt;
+   &lt;extension
+         point=&quot;org.eclipse.wst.server.ui.serverCreationWizardPageExtension&quot;&gt;
+      &lt;serverCreationWizardPageExtension
+            id=&quot;org.eclipse.wst.server.ui.test.serverCreationWizardPageExtension&quot;
+                        class=&quot;org.eclipse.wst.server.ui.test.internal.serverCreationWizardPageExtension.ServerCreationWizardPageExtensionTest&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2009 IBM Corporation and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/AbstractUIControl.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/AbstractUIControl.java
new file mode 100644
index 0000000..fae84ef
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/AbstractUIControl.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui;
+
+import java.beans.PropertyChangeEvent;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Abstract UI control that allows adopter to control the UI
+ */
+public abstract class AbstractUIControl {
+	// Control map describing the UI that needs to be controlled. 
+	public Map<String, UIControlEntry> controlMap = new HashMap<String, UIControlEntry>();
+	// UI Control listener that listens to changes in event on GUI provided by this UI control
+	public IUIControlListener controlListener;
+	
+	// The list of properties supported by the existing UI control.
+	public static final String PROP_HOSTNAME = "PROP_HOSTNAME";
+	public static final String PROP_SERVER_TYPE = "PROP_SERVERTYPE";
+
+	/**
+	 * UI Control listener that listens to changes in event on GUI provided by this UI control
+	 * IUIControlListener
+	 */
+	public interface IUIControlListener {
+		/**
+		 * Handle the UI control map change by the listener based on the given control map.
+		 * @param controlMap the control map that describes the UI control.
+		 */
+		public void handleUIControlMapChanged(Map<String, UIControlEntry> controlMap);
+		/**
+		 * Get the value of a given control UI on the listener's page.
+		 * @param controlId control ID of the UI on the listener's page.
+		 * @return the String value of the given control ID field.
+		 */
+		public String getControlStringValue(String controlId);
+	}
+	
+	/**
+	 * UI control entry class that describes the behaviour of the UI control of specific fields or widget.
+	 */
+	public class UIControlEntry {
+		private boolean isEnabled;
+		private String newTextValue;
+		
+		public UIControlEntry(boolean curIsEnabled, String curNewTextValue) {
+			isEnabled = curIsEnabled;
+			newTextValue = curNewTextValue;
+		}
+
+		/**
+		 * Gives the new text value of the given field.
+		 * @return the new text value of the given field. If the value returns <code>null</code>, then it means
+		 * the field do not need to be modified.
+		 */
+		public String getNewTextValue() {
+			return newTextValue;
+		}
+
+		/**
+		 * Return if the UI control needs to be enabled.
+		 * @return true if value needs to be enabled; otherwise, return false.
+		 */
+		public boolean isEnabled() {
+			return isEnabled;
+		}
+	}
+
+	/**
+	 * Fire the control change event for the changed control map to take effect.
+	 */
+	protected void fireUIControlChangedEvent() {
+		if (controlListener != null) {
+			controlListener.handleUIControlMapChanged(controlMap);
+		}
+	}
+	
+	/**
+	 * Allow UI Control to react based on a property change and change the UI control.
+	 * @param event property change event that describes the change.
+	 */
+	public abstract void handlePropertyChanged(PropertyChangeEvent event);
+	
+	/**
+	 * Set the UI control listener that listens to the changes initialed by this UI control. 
+	 * @param curControlListener the UI control listener
+	 */
+	public void setUIControlListener(IUIControlListener curControlListener) {
+		controlListener = curControlListener;
+	}
+}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java
index 231fdae..3170c8c 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/ServerUIPlugin.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 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
@@ -43,6 +43,7 @@
 import org.eclipse.wst.server.ui.internal.wizard.fragment.NewRuntimeWizardFragment;
 import org.eclipse.wst.server.ui.internal.wizard.fragment.NewServerWizardFragment;
 import org.eclipse.wst.server.ui.internal.wizard.fragment.TasksWizardFragment;
+import org.eclipse.wst.server.ui.wizard.ServerCreationWizardPageExtension;
 import org.eclipse.wst.server.ui.wizard.WizardFragment;
 
 import org.eclipse.osgi.util.NLS;
@@ -87,6 +88,9 @@
 
 	// cached copy of all runtime wizards
 	private static Map<String, WizardFragmentData> wizardFragments;
+	
+	// Cached copy of all server wizard UI modifier
+	private static List<ServerCreationWizardPageExtension> serverCreationWizardPageExtensions;
 
 	// cached initial selection provider
 	private static InitialSelectionProvider selectionProvider;
@@ -716,6 +720,47 @@
 	}
 
 	/**
+	 * Returns the list of server creation wizard modifier.
+	 *
+	 * @return the list of server creation wizard modifier, or an empty list if none could be found
+	 */
+	public static List<ServerCreationWizardPageExtension> getServerCreationWizardPageExtensions() {
+		if (serverCreationWizardPageExtensions == null) {
+			loadServerCreationWizardPageExtensions();
+		}
+		return serverCreationWizardPageExtensions;
+	}
+
+	/**
+	 * Load the Server creation wizard page modifiers.
+	 */
+	private static synchronized void loadServerCreationWizardPageExtensions() {
+		if (serverCreationWizardPageExtensions != null)
+			return;
+		
+		Trace.trace(Trace.CONFIG, "->- Loading .serverCreationWizardPageExtension extension point ->-");
+		serverCreationWizardPageExtensions = new ArrayList<ServerCreationWizardPageExtension>();
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(ServerUIPlugin.PLUGIN_ID, "serverCreationWizardPageExtension");
+		
+		for (IConfigurationElement curConfigElement: cf) {
+			try {
+				// Create the class here already since the usage of the server wizard page will need to use all the extensions
+				// in all the calls.  Therefore, there is no need for lazy loading here.
+				ServerCreationWizardPageExtension curExtension = (ServerCreationWizardPageExtension)curConfigElement.createExecutableExtension("class");
+				Trace.trace(Trace.CONFIG, "  Loaded serverCreationWizardPageExtension: " + cf[0].getAttribute("id") + ", loaded class=" + curExtension);
+				if (curExtension != null)
+					serverCreationWizardPageExtensions.add(curExtension);
+
+			} catch (Throwable t) {
+				Trace.trace(Trace.SEVERE, "  Could not load serverCreationWizardPageExtension: " + cf[0].getAttribute("id"), t);
+			}
+		}
+		
+		Trace.trace(Trace.CONFIG, "-<- Done loading .serverCreationWizardPageExtension extension point -<-");
+	}
+
+	/**
 	 * Load the initial selection provider.
 	 */
 	private static synchronized void loadInitialSelectionProvider() {
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 4439abf..d199ece 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
@@ -10,9 +10,11 @@
  *******************************************************************************/
 package org.eclipse.wst.server.ui.internal.wizard.page;
 
+import java.beans.PropertyChangeEvent;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
@@ -43,17 +45,21 @@
 import org.eclipse.wst.server.core.*;
 import org.eclipse.wst.server.core.internal.ServerWorkingCopy;
 import org.eclipse.wst.server.core.util.SocketUtil;
+import org.eclipse.wst.server.ui.*;
 import org.eclipse.wst.server.ui.internal.*;
+import org.eclipse.wst.server.ui.AbstractUIControl.IUIControlListener;
+import org.eclipse.wst.server.ui.AbstractUIControl.UIControlEntry;
 import org.eclipse.wst.server.ui.internal.viewers.ServerTypeComposite;
 import org.eclipse.wst.server.ui.internal.wizard.TaskWizard;
 import org.eclipse.wst.server.ui.internal.wizard.WizardTaskUtil;
 import org.eclipse.wst.server.ui.internal.wizard.page.HostnameComposite.IHostnameSelectionListener;
+import org.eclipse.wst.server.ui.wizard.ServerCreationWizardPageExtension;
 import org.eclipse.wst.server.ui.wizard.WizardFragment;
 
 /**
  * Wizard page used to create a server and configuration at the same time.
  */
-public class NewManualServerComposite extends Composite {
+public class NewManualServerComposite extends Composite implements IUIControlListener {
 	public interface ServerSelectionListener {
 		public void serverSelected(IServerAttributes server);
 		public void runtimeSelected(IRuntime runtime);
@@ -95,10 +101,13 @@
 	protected String lastHostname;
 	protected HostnameComposite manualHostComp;
 	IHostnameSelectionListener hostnameListener;
+	protected Label hostnameLabel;
 	protected Text hostname;
 	protected ControlDecoration hostnameDecoration;
 
 	protected ServerCreationCache cache = new ServerCreationCache();
+	
+	private IServerType oldServerType;
 
 	/**
 	 * Creates a new server and server configuration.  If the initial
@@ -144,6 +153,13 @@
 		IWorkbenchHelpSystem whs = PlatformUI.getWorkbench().getHelpSystem();
 		whs.setHelp(this, ContextIds.NEW_SERVER_WIZARD);
 		
+		List<ServerCreationWizardPageExtension> pageExtensionLst = ServerUIPlugin.getServerCreationWizardPageExtensions();
+		// Add the page modifier top section UI. 
+		for (ServerCreationWizardPageExtension curPageExtension : pageExtensionLst) {
+			curPageExtension.createControl(ServerCreationWizardPageExtension.UI_POSITION.TOP, this);
+			curPageExtension.setUIControlListener(this);
+		}
+		
 		serverTypeComposite = new ServerTypeComposite(this, moduleType, serverTypeId, new ServerTypeComposite.ServerTypeSelectionListener() {
 			public void serverTypeSelected(IServerType type2) {
 				handleTypeSelection(type2);
@@ -156,13 +172,18 @@
 		serverTypeComposite.setLayoutData(data);
 		whs.setHelp(serverTypeComposite, ContextIds.NEW_SERVER_TYPE);
 		
+		// Add the page modifier middle section UI. 
+		for (ServerCreationWizardPageExtension curPageExtension : pageExtensionLst) {
+			curPageExtension.createControl(ServerCreationWizardPageExtension.UI_POSITION.MIDDLE, this);
+		}
+		
 		hostnameListener = 	new IHostnameSelectionListener() {
 			public void hostnameSelected(String selectedHostname) {
 				lastHostname = selectedHostname;
 				setHost(selectedHostname);
 			}
 	    };		
-		Label hostnameLabel = new Label(this, SWT.NONE);
+		hostnameLabel = new Label(this, SWT.NONE);
 		hostnameLabel.setText(Messages.hostname);
 		hostname = new Text(this, SWT.SINGLE | SWT.BORDER | SWT.CANCEL);
 		hostname.setText(HostnameComposite.LOCALHOST);
@@ -298,6 +319,12 @@
 				}
 			}
 		});
+		
+		// Add the page modifier bottom section UI. 
+		for (ServerCreationWizardPageExtension curPageExtension : pageExtensionLst) {
+			curPageExtension.createControl(ServerCreationWizardPageExtension.UI_POSITION.TOP, this);
+		}
+		
 		Dialog.applyDialogFont(this);
 	}
 
@@ -344,6 +371,13 @@
 		return returnValue;
 	}
 
+	public String getControlStringValue(String controlId) {
+		if (controlId != null && AbstractUIControl.PROP_HOSTNAME.equals(controlId)) {
+			return host;
+		}	
+		return null;
+	}
+	
 	public void setHost(String host) {
 		this.host = host;
 		if (serverTypeComposite == null)
@@ -387,6 +421,7 @@
 			((ServerWorkingCopy)server).setDefaults(null);
 			runtime = server.getRuntime();
 			listener.runtimeSelected(runtime);
+			fireServerWorkingCopyChanged();
 			return;
 		}
 		
@@ -412,6 +447,7 @@
 				}
 				
 				((ServerWorkingCopy)server).setDefaults(null);
+				fireServerWorkingCopyChanged();
 			}
 		} catch (CoreException ce) {
 			Trace.trace(Trace.SEVERE, "Error creating server", ce);
@@ -419,7 +455,7 @@
 			runtime = null;
 			wizard.setMessage(ce.getLocalizedMessage(), IMessageProvider.ERROR);
 		}
-		
+			
 		if (server == null)
 			wizard.setMessage(Messages.wizErrorServerCreationError, IMessageProvider.ERROR);
 	}
@@ -550,6 +586,14 @@
 		}
 		listener.runtimeSelected(runtime);
 	}
+	
+	protected void fireServerWorkingCopyChanged() {
+		List<ServerCreationWizardPageExtension> pageExtensionLst = ServerUIPlugin.getServerCreationWizardPageExtensions();
+		// Add the page modifier top section UI. 
+		for (ServerCreationWizardPageExtension curPageExtension : pageExtensionLst) {
+			curPageExtension.setServerWorkingCopy(getServer());
+		}
+	}
 
 	/**
 	 * Handle the server type selection.
@@ -610,6 +654,13 @@
 			}
 		}
 		listener.serverSelected(server);
+		// Fire the property change event. 
+		List<ServerCreationWizardPageExtension> pageExtensionLst = ServerUIPlugin.getServerCreationWizardPageExtensions();
+		for (ServerCreationWizardPageExtension curPageExtension : pageExtensionLst) {
+			curPageExtension.handlePropertyChanged(new PropertyChangeEvent(this, AbstractUIControl.PROP_SERVER_TYPE, oldServerType, serverType));
+		}
+		// Update the old server type value.
+		oldServerType = serverType;
 		wizard.update();
 	}
 
@@ -657,4 +708,25 @@
 		host = newHost;
 		hostnameListener.hostnameSelected(host);
 	}
+
+	public void handleUIControlMapChanged(Map<String, UIControlEntry> controlMap) {
+		if (controlMap == null) {
+			return;
+		}
+		
+		for (String curControlId : controlMap.keySet()) {
+			if (AbstractUIControl.PROP_HOSTNAME.equals(curControlId)) {
+				UIControlEntry curControlEntry = controlMap.get(curControlId);
+				if (hostnameLabel != null)
+					hostnameLabel.setEnabled(curControlEntry.isEnabled());
+				
+				if (hostname != null){
+					if (curControlEntry.getNewTextValue() != null)
+						hostname.setText(curControlEntry.getNewTextValue());
+					
+					hostname.setEnabled(curControlEntry.isEnabled());
+				}
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/wizard/ServerCreationWizardPageExtension.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/wizard/ServerCreationWizardPageExtension.java
new file mode 100644
index 0000000..adc60dc
--- /dev/null
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/wizard/ServerCreationWizardPageExtension.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.server.ui.wizard;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.server.core.IServerWorkingCopy;
+import org.eclipse.wst.server.ui.AbstractUIControl;
+
+/**
+ * A modifier class that allow adopter to modify the behaviour of the server creation wizard page.
+ * It also has places where adopter can inject custom GUI into the server creation wizard page.
+ */
+public abstract class ServerCreationWizardPageExtension extends AbstractUIControl {
+	protected IServerWorkingCopy serverWc = null;
+	
+	/**
+	 * The list of position on the server creation wizard page that allows inserting custom GUI.
+	 * UI_POSITION
+	 */
+	public enum UI_POSITION { TOP, MIDDLE, BOTTOM }
+
+	/**
+	 * Create the customer UI on the specified position.
+	 * @param position the position on the server creation wizard page that allows inserting custom GUI.
+	 * @param parent parent composite.
+	 */
+	public abstract void createControl(UI_POSITION position, Composite parent);
+	
+	/**
+	 * Set the server working copy to the control to allow extension to store the extension values.
+	 * @param curServerWc
+	 */
+	public void setServerWorkingCopy(IServerWorkingCopy curServerWc) {
+		serverWc = curServerWc;
+	}
+}