[426508] Support Servlet 3.1 Listeners in new Listener wizard
diff --git a/plugins/org.eclipse.jst.j2ee.web/templates/_methods.template b/plugins/org.eclipse.jst.j2ee.web/templates/_methods.template
index 5fe3d10..a424ce6 100644
--- a/plugins/org.eclipse.jst.j2ee.web/templates/_methods.template
+++ b/plugins/org.eclipse.jst.j2ee.web/templates/_methods.template
@@ -6,8 +6,9 @@
 	/**
      * @see <%= method.getContainingJavaClass() %>#<%= method.getName() %>(<%= method.getParamsForJavadoc() %>)
      */
-    public <%= method.getReturnType() %> <%= method.getName() %>(<%= method.getParamsForDeclaration() %>) {
-        // TODO Auto-generated method stub
+    public <%= method.getReturnType() %> <%= method.getName() %>(<%= method.getParamsForDeclaration() %>) <%  if (!method.getExceptions().isEmpty()){ %>throws <%=method.getExceptions()%> { 
+    <%}else {%> { <% } %>
+         // TODO Auto-generated method stub
 <% 
 			String defaultReturnValue = method.getDefaultReturnValue();
 			if (defaultReturnValue != null) { 
diff --git a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/ListenerTemplate.java b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/ListenerTemplate.java
index b28544b..cc7014b 100644
--- a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/ListenerTemplate.java
+++ b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/ListenerTemplate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2011 SAP AG and others.
+ * Copyright (c) 2007, 2014 SAP AG 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
@@ -7,6 +7,7 @@
  *
  * This class has been generated from a javajet template. 
  *******************************************************************************/
+
 package org.eclipse.jst.j2ee.internal.web.operations;
 
 import java.util.*;
@@ -59,12 +60,16 @@
   protected final String TEXT_33 = ")" + NL + "     */" + NL + "    public "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
   protected final String TEXT_34 = " "; //$NON-NLS-1$
   protected final String TEXT_35 = "("; //$NON-NLS-1$
-  protected final String TEXT_36 = ") {" + NL + "        // TODO Auto-generated method stub"; //$NON-NLS-1$ //$NON-NLS-2$
-  protected final String TEXT_37 = NL + "\t\t\treturn "; //$NON-NLS-1$
-  protected final String TEXT_38 = ";"; //$NON-NLS-1$
-  protected final String TEXT_39 = NL + "    }"; //$NON-NLS-1$
-  protected final String TEXT_40 = NL + "\t" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$
-  protected final String TEXT_41 = NL;
+  protected final String TEXT_36 = ") "; //$NON-NLS-1$
+  protected final String TEXT_37 = "throws "; //$NON-NLS-1$
+  protected final String TEXT_38 = " { "; //$NON-NLS-1$
+  protected final String TEXT_39 = " { "; //$NON-NLS-1$
+  protected final String TEXT_40 = NL + "         // TODO Auto-generated method stub"; //$NON-NLS-1$
+  protected final String TEXT_41 = NL + "\t\t\treturn "; //$NON-NLS-1$
+  protected final String TEXT_42 = ";"; //$NON-NLS-1$
+  protected final String TEXT_43 = NL + "    }"; //$NON-NLS-1$
+  protected final String TEXT_44 = NL + "\t" + NL + "}"; //$NON-NLS-1$ //$NON-NLS-2$
+  protected final String TEXT_45 = NL;
 
   public String generate(Object argument)
   {
@@ -107,7 +112,7 @@
 
     stringBuffer.append(TEXT_11);
      
-    if ("3.0".equals(model.getJavaEEVersion()) || "3.1".equals(model.getJavaEEVersion())) {  //$NON-NLS-1$ //$NON-NLS-2$
+	if ("3.0".equals(model.getJavaEEVersion()) || "3.1".equals(model.getJavaEEVersion())) {  //$NON-NLS-1$ //$NON-NLS-2$
 
     stringBuffer.append(TEXT_12);
     
@@ -212,23 +217,31 @@
     stringBuffer.append(TEXT_35);
     stringBuffer.append( method.getParamsForDeclaration() );
     stringBuffer.append(TEXT_36);
+      if (!method.getExceptions().isEmpty()){ 
+    stringBuffer.append(TEXT_37);
+    stringBuffer.append(method.getExceptions());
+    stringBuffer.append(TEXT_38);
+    }else {
+    stringBuffer.append(TEXT_39);
+     } 
+    stringBuffer.append(TEXT_40);
      
 			String defaultReturnValue = method.getDefaultReturnValue();
 			if (defaultReturnValue != null) { 
 
-    stringBuffer.append(TEXT_37);
+    stringBuffer.append(TEXT_41);
     stringBuffer.append( defaultReturnValue );
-    stringBuffer.append(TEXT_38);
+    stringBuffer.append(TEXT_42);
     
 			} 
 
-    stringBuffer.append(TEXT_39);
+    stringBuffer.append(TEXT_43);
      
 		}
 	} 
 
-    stringBuffer.append(TEXT_40);
-    stringBuffer.append(TEXT_41);
+    stringBuffer.append(TEXT_44);
+    stringBuffer.append(TEXT_45);
     return stringBuffer.toString();
   }
 }
diff --git a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewListenerClassDataModelProvider.java b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewListenerClassDataModelProvider.java
index bfe6dac..4e96df9 100644
--- a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewListenerClassDataModelProvider.java
+++ b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/internal/web/operations/NewListenerClassDataModelProvider.java
@@ -15,11 +15,13 @@
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_BINDING_LISTENER;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ID_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_CONTEXT_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_CONTEXT_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_LISTENER;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER;
 import static org.eclipse.jst.j2ee.internal.web.operations.INewWebClassDataModelProperties.USE_EXISTING_CLASS;
 
 import java.util.List;
@@ -72,8 +74,10 @@
 		QUALIFIED_HTTP_SESSION_ATTRIBUTE_LISTENER,
 		QUALIFIED_HTTP_SESSION_ACTIVATION_LISTENER,
 		QUALIFIED_HTTP_SESSION_BINDING_LISTENER,
+		QUALIFIED_HTTP_SESSION_ID_LISTENER,
 		QUALIFIED_SERVLET_REQUEST_LISTENER,
-		QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER
+		QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER,
+		QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER
 	};
 
 	/**
diff --git a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/web/IServletConstants.java b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/web/IServletConstants.java
index 07dd594..79a6d95 100644
--- a/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/web/IServletConstants.java
+++ b/plugins/org.eclipse.jst.j2ee.web/web/org/eclipse/jst/j2ee/web/IServletConstants.java
@@ -50,6 +50,8 @@
 	public static final String QUALIFIED_SERVLET_REQUEST_EVENT = "javax.servlet.ServletRequestEvent"; //$NON-NLS-1$
 	public static final String QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER = "javax.servlet.ServletRequestAttributeListener"; //$NON-NLS-1$
 	public static final String QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_EVENT = "javax.servlet.ServletRequestAttributeEvent"; //$NON-NLS-1$
+	public static final String QUALIFIED_HTTP_SESSION_ID_LISTENER = "javax.servlet.http.HttpSessionIdListener";//$NON-NLS-1$
+	public static final String QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER = "javax.servlet.AsyncListener";//$NON-NLS-1$
 	
 	public static final String METHOD_INIT = "init"; //$NON-NLS-1$
 	public static final String METHOD_DESTROY = "destroy"; //$NON-NLS-1$
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/BinaryMethod.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/BinaryMethod.java
index b9e10ea..0a3104d 100644
--- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/BinaryMethod.java
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/BinaryMethod.java
@@ -136,6 +136,31 @@
 		return result;
 	}
 	
+	
+	
+	/**
+	 * @see Method#getExceptions()
+	 */
+	
+	public String getExceptions(){
+		StringBuffer exceptions = new StringBuffer(); 
+		try {
+			String[] exceptionTypes = method.getExceptionTypes();
+			for (int i=0; i<exceptionTypes.length; i++){
+			   exceptions.append(Signature.toString(exceptionTypes[i]));
+	           if (i < exceptionTypes.length - 1)
+	                exceptions.append(", "); //$NON-NLS-1$
+			}
+			
+		} catch (JavaModelException e) {
+			org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e);
+		}
+
+		return exceptions.toString();
+		
+	}
+	
+	
 	/**
 	 * @see Object#equals(Object)
 	 */
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/Method.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/Method.java
index ddfcfcc..1aff6d2 100644
--- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/Method.java
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/Method.java
@@ -113,5 +113,13 @@
 	 *         types.
 	 */
 	public Collection<String> getParameterImports();
+	
+	
+	/**
+	 * Returns a list of exceptions thrown by the method
+	 * @return a <code>List</code> of String representation of the exception
+	 *         types.
+	 */
+	public String getExceptions();
 
 }
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/SourceMethod.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/SourceMethod.java
index af0e16d..d67899a 100644
--- a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/SourceMethod.java
+++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/operations/SourceMethod.java
@@ -140,6 +140,27 @@
 		return result;
 	}
 	
+	
+	/**
+	 * @see Method#getExceptions()
+	 */
+	
+	public String getExceptions(){
+		StringBuffer exceptions = new StringBuffer();
+		List exceptionTypes = method.thrownExceptions();
+		
+		for (int i=0; i<exceptionTypes.size(); i++){
+			exceptions.append(exceptionTypes.get(i));
+	        if (i < exceptionTypes.size() - 1)
+	        	exceptions.append(", "); //$NON-NLS-1$			
+		}
+			
+		return exceptions.toString();
+	}
+	
+	
+	
+	
 	/**
 	 * @see Object#equals(Object)
 	 */
diff --git a/plugins/org.eclipse.jst.servlet.ui/property_files/web_ui.properties b/plugins/org.eclipse.jst.servlet.ui/property_files/web_ui.properties
index 24e7c0e..4bc6d6a 100644
--- a/plugins/org.eclipse.jst.servlet.ui/property_files/web_ui.properties
+++ b/plugins/org.eclipse.jst.servlet.ui/property_files/web_ui.properties
@@ -85,6 +85,8 @@
 ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G=Chan&ges to attributes
 ADD_LISTENER_WIZARD_SESSION_MIGRATION=Session &migration
 ADD_LISTENER_WIZARD_OBJECT_BINDING=&Object binding
+ADD_LISTENER_WIZARD_OBJECT_SESSION_ID=Cha&nges to id
+ADD_LISTENER_WIZARD_ASYNC_EVENTS=Async &events
 
 ADD_BUTTON_LABEL=Add...
 ADD_BUTTON_LABEL_A=&Add...
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/plugin/WEBUIMessages.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/plugin/WEBUIMessages.java
index 2ac066c..f34c075 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/plugin/WEBUIMessages.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/plugin/WEBUIMessages.java
@@ -152,6 +152,8 @@
 	public static String ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G;
 	public static String ADD_LISTENER_WIZARD_SESSION_MIGRATION;
 	public static String ADD_LISTENER_WIZARD_OBJECT_BINDING;
+	public static String ADD_LISTENER_WIZARD_OBJECT_SESSION_ID;
+	public static String ADD_LISTENER_WIZARD_ASYNC_EVENTS;
 	
 	public static String DISPATCHER_REQUEST;
 	public static String DISPATCHER_FORWARD;
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
index 057b5e8..12d8119 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/AddListenerWizardPage.java
@@ -20,6 +20,8 @@
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_CONTEXT_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER;
 import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_LISTENER;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_HTTP_SESSION_ID_LISTENER;
+import static org.eclipse.jst.j2ee.web.IServletConstants.QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER;
 import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.*;
 
 import java.util.ArrayList;
@@ -28,6 +30,7 @@
 
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
 import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
@@ -127,6 +130,17 @@
 				ADD_LISTENER_WIZARD_OBJECT_BINDING, 
 				QUALIFIED_HTTP_SESSION_BINDING_LISTENER, 
 				INTERFACES);
+		
+		String javaEEVersion = model.getStringProperty(INewServletClassDataModelProperties.JAVA_EE_VERSION);
+		if("3.1".equals(javaEEVersion)){ //$NON-NLS-1$
+			createEventListenerRow(group, 
+					ADD_LISTENER_WIZARD_OBJECT_SESSION_ID, 
+					QUALIFIED_HTTP_SESSION_ID_LISTENER, 
+					INTERFACES);		
+		}
+		
+				
+
 	}
 	
 	private void createServletRequestEvents(Composite parent) {
@@ -141,8 +155,18 @@
 				ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G, 
 				QUALIFIED_SERVLET_REQUEST_ATTRIBUTE_LISTENER, 
 				INTERFACES);
+		
+		String javaEEVersion = model.getStringProperty(INewServletClassDataModelProperties.JAVA_EE_VERSION);
+		if("3.1".equals(javaEEVersion)){ //$NON-NLS-1$		
+			createEventListenerRow(group, 
+					ADD_LISTENER_WIZARD_ASYNC_EVENTS, 
+					QUALIFIED_SERVLET_REQUEST_ASYNC_EVENT_LISTENER, 
+					INTERFACES);		
+		}
+		
 	}
 	
+	
 	private Group createGroup(Composite parent, String text) {
 		Group group = new Group(parent, SWT.NONE);
 		
diff --git a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/IWebWizardConstants.java b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/IWebWizardConstants.java
index d388861..e534e0a 100644
--- a/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/IWebWizardConstants.java
+++ b/plugins/org.eclipse.jst.servlet.ui/servlet_ui/org/eclipse/jst/servlet/ui/internal/wizard/IWebWizardConstants.java
@@ -81,7 +81,8 @@
 	public final static String ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G = WEBUIMessages.ADD_LISTENER_WIZARD_CHANGES_TO_ATTRIBUTES_G;
 	public final static String ADD_LISTENER_WIZARD_SESSION_MIGRATION = WEBUIMessages.ADD_LISTENER_WIZARD_SESSION_MIGRATION;
 	public final static String ADD_LISTENER_WIZARD_OBJECT_BINDING = WEBUIMessages.ADD_LISTENER_WIZARD_OBJECT_BINDING;
-	
+	public final static String ADD_LISTENER_WIZARD_OBJECT_SESSION_ID = WEBUIMessages.ADD_LISTENER_WIZARD_OBJECT_SESSION_ID;
+	public final static String ADD_LISTENER_WIZARD_ASYNC_EVENTS = WEBUIMessages.ADD_LISTENER_WIZARD_ASYNC_EVENTS;
 	// common
 	public final static String ADD_BUTTON_LABEL = WEBUIMessages.ADD_BUTTON_LABEL;
 	public final static String ADD_BUTTON_LABEL_A = WEBUIMessages.ADD_BUTTON_LABEL_A;