[431725] Update AddWebArtifactOperationTest to test annotated classes
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
index 287f332..808ff5f 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/j2ee/operations/JavaEEFacetConstants.java
@@ -13,6 +13,7 @@
 	public static final IProjectFacetVersion APP_CLIENT_14 = APP_CLIENT_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion APP_CLIENT_5 = APP_CLIENT_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion APP_CLIENT_6 = APP_CLIENT_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion APP_CLIENT_7 = APP_CLIENT_FACET.getVersion("7.0"); //$NON-NLS-1$
 	
 	public static final IProjectFacet EJB_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EJB_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion EJB_11 = EJB_FACET.getVersion("1.1"); //$NON-NLS-1$
@@ -20,6 +21,7 @@
 	public static final IProjectFacetVersion EJB_21 = EJB_FACET.getVersion("2.1"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EJB_3 = EJB_FACET.getVersion("3.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EJB_31 = EJB_FACET.getVersion("3.1"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EJB_32 = EJB_FACET.getVersion("3.2"); //$NON-NLS-1$
 	
 	public static final IProjectFacet WEB_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEB_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion WEB_22 = WEB_FACET.getVersion("2.2"); //$NON-NLS-1$
@@ -27,11 +29,13 @@
 	public static final IProjectFacetVersion WEB_24 = WEB_FACET.getVersion("2.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion WEB_25 = WEB_FACET.getVersion("2.5"); //$NON-NLS-1$
 	public static final IProjectFacetVersion WEB_30 = WEB_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEB_31 = WEB_FACET.getVersion("3.1"); //$NON-NLS-1$
 	
 	public static final IProjectFacet CONNECTOR_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_CONNECTOR_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion CONNECTOR_1 = CONNECTOR_FACET.getVersion("1.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion CONNECTOR_15 = CONNECTOR_FACET.getVersion("1.5"); //$NON-NLS-1$
 	public static final IProjectFacetVersion CONNECTOR_16 = CONNECTOR_FACET.getVersion("1.6"); //$NON-NLS-1$
+	public static final IProjectFacetVersion CONNECTOR_17 = CONNECTOR_FACET.getVersion("1.7"); //$NON-NLS-1$
 	
 	public static final IProjectFacet EAR_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EAR_MODULE); //$NON-NLS-1$
 	public static final IProjectFacetVersion EAR_12 = EAR_FACET.getVersion("1.2"); //$NON-NLS-1$
@@ -39,13 +43,16 @@
 	public static final IProjectFacetVersion EAR_14 = EAR_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EAR_5 = EAR_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion EAR_6 = EAR_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion EAR_7 = EAR_FACET.getVersion("7.0"); //$NON-NLS-1$
 	
 	public static final IProjectFacet JAVA_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_JAVA); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_13 = JAVA_FACET.getVersion("1.3"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_14 = JAVA_FACET.getVersion("1.4"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_5 = JAVA_FACET.getVersion("5.0"); //$NON-NLS-1$
 	public static final IProjectFacetVersion JAVA_6 = JAVA_FACET.getVersion("6.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion JAVA_7 = JAVA_FACET.getVersion("1.7"); //$NON-NLS-1$
 
 	public static final IProjectFacet WEBFRAGMENT_FACET = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_WEBFRAGMENT_MODULE);
 	public static final IProjectFacetVersion WEBFRAGMENT_30 = WEBFRAGMENT_FACET.getVersion("3.0"); //$NON-NLS-1$
+	public static final IProjectFacetVersion WEBFRAGMENT_31 = WEBFRAGMENT_FACET.getVersion("3.1"); //$NON-NLS-1$
 }
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
index d43870e..cfe3cc9 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/AddWebArtifactOperationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 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
@@ -20,6 +20,7 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -32,6 +33,8 @@
 import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
 import org.eclipse.jst.j2ee.internal.plugin.J2EEPreferences;
+import org.eclipse.jst.j2ee.internal.web.operations.INewFilterClassDataModelProperties;
+import org.eclipse.jst.j2ee.internal.web.operations.INewServletClassDataModelProperties;
 import org.eclipse.jst.j2ee.internal.web.operations.NewFilterClassDataModelProvider;
 import org.eclipse.jst.j2ee.internal.web.operations.NewListenerClassDataModelProvider;
 import org.eclipse.jst.j2ee.internal.web.operations.NewServletClassDataModelProvider;
@@ -46,8 +49,10 @@
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 import org.eclipse.jst.javaee.core.DisplayName;
 import org.eclipse.jst.javaee.core.UrlPatternType;
+import org.eclipse.jst.jee.model.tests.SynchronousModelChangedListener;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.tests.OperationTestCase;
 import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
@@ -72,7 +77,8 @@
     
     public static final String LISTENER_NAME = "TestListener"; //$NON-NLS-1$
     public static final String LISTENER_CLASS_NAME = PACKAGE + "." + LISTENER_NAME; //$NON-NLS-1$
-
+	private IModelProvider mergedModelProvider;
+	
     /**
 	 * @param name
 	 */
@@ -189,6 +195,132 @@
     			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());
     }
     
+    
+    public void testAddServlet_Web30_Defaults() throws Exception{
+       	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Defaults_Annotations();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	   	
+    }
+    
+    
+    public void testAddServlet_Web30_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Async();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	
+    	
+    	
+    	assertTrue(servlet.isAsyncSupported());
+    }
+    
+    public void testAddServlet_Web31_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addServlet_Async();
+    	
+    	assertJavaFileExists(SERVLET_CLASS_NAME);  	
+    	
+       	List servlets = webApp.getServlets();
+    	assertEquals("Exactly one servlet is expected in the model, but " + servlets.size() + " are found", 
+    			1, servlets.size());
+    	org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.get(0);
+    	assertEquals("Servlet name is expected to be " + SERVLET_NAME + ", but it is " + servlet.getServletName(), 
+    			SERVLET_NAME, servlet.getServletName());
+    	assertEquals("Servlet class name is expected to be " + SERVLET_CLASS_NAME + ", but it is " + servlet.getServletClass(), 
+    			SERVLET_CLASS_NAME, servlet.getServletClass());
+		
+		List params = servlet.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getServletMappings();
+    	assertEquals("Exactly one servlet mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.ServletMapping mapping = (org.eclipse.jst.javaee.web.ServletMapping) mappings.get(0);
+    	assertEquals("Servlet name of the mapping is expected to be " + SERVLET_NAME + ", but it is " + mapping.getServletName(), 
+    			SERVLET_NAME, mapping.getServletName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Servlet mapping URL pattern value is expected to be " + SERVLET_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			SERVLET_DEFAULT_MAPPING, urlPattern.getValue());    	
+    	
+    	
+    	assertTrue(servlet.isAsyncSupported());
+    }    
+    
+    
     public void testAddFilter_Web24_Defaults_NoJETEmitter() throws Exception {
 		disableJETEmitter();
 		testAddFilter_Web24_Defaults();
@@ -297,6 +429,136 @@
     			0, mapping.getDispatchers().size());
     }
     
+    public void testAddFilter_Web30_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Defaults_Annotations();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    public void testAddFilter_Web30_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Async();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
+    
+    public void testAddFilter_Web31_Async() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addFilter_Async();
+    	
+		assertJavaFileExists(FILTER_CLASS_NAME);
+    	
+    	List filters = webApp.getFilters();
+    	assertEquals("Exactly one filter is expected in the model, but " + filters.size() + " are found", 
+    			1, filters.size());
+    	org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) filters.get(0);
+    	assertEquals("Filter name is expected to be " + FILTER_NAME + ", but it is " + filter.getFilterName(), 
+    			FILTER_NAME, filter.getFilterName());
+    	assertEquals("Filter class name is expected to be " + FILTER_CLASS_NAME + ", but it is " + filter.getFilterClass(), 
+    			FILTER_CLASS_NAME, filter.getFilterClass());
+    	
+    	List params = filter.getInitParams();
+		assertNotNull("List of initialization parameters cannot be retrieved", params);
+		assertEquals("None initialization parameter is expected, but " + params.size() + " are found", 
+				0, params.size());
+    	
+    	List mappings = webApp.getFilterMappings();
+    	assertEquals("Exactly one filter mapping is expected, but " + mappings.size() + " are found", 
+    			1, mappings.size());
+    	org.eclipse.jst.javaee.web.FilterMapping mapping = (org.eclipse.jst.javaee.web.FilterMapping) mappings.get(0);
+    	assertEquals("Filter name of the mapping is expected to be " + FILTER_NAME + ", but it is " + mapping.getFilterName(), 
+    			FILTER_NAME, mapping.getFilterName());
+    	List urlPatterns = mapping.getUrlPatterns();
+    	assertEquals("Exactly one URL pattern is expected in the mapping, but " + urlPatterns.size() + " are found", 
+    			1, urlPatterns.size());
+    	UrlPatternType urlPattern = (UrlPatternType) urlPatterns.get(0);
+    	assertEquals("Filter mapping URL pattern value is expected to be " + FILTER_DEFAULT_MAPPING + ", but it is " + urlPattern.getValue(), 
+    			FILTER_DEFAULT_MAPPING, urlPattern.getValue());
+    	assertEquals("None servlet name is expected in the filter mapping, but " + mapping.getServletNames().size() + " are found", 
+    			0, mapping.getServletNames().size());
+    	assertEquals("None dispatcher is expected in the filter mapping, but " + mapping.getDispatchers().size() + " are found", 
+    			0, mapping.getDispatchers().size());    	
+    }
+    
     public void testAddListener_Web24_Defaults_NoJETEmitter() throws Exception {
 		disableJETEmitter();
 		testAddListener_Web24_Defaults();
@@ -352,6 +614,89 @@
     			LISTENER_CLASS_NAME, listener.getListenerClass());
     }
 
+    
+    public void testAddListener_Web30_Defaults() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_30);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+    	addListener_Defaults_Annotations();
+
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    }    
+    
+    
+    
+    public void testAddListener_Web31_AsyncListener() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_AsyncListener();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }   
+    
+    
+    public void testAddListener_Web31_HttpSessionIdListener() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_HttpSessionIdListener();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }        
+    
+    public void testAddListener_Web31_MultiListeners() throws Exception {
+    	createWebProject(WEB_PROJECT_NAME, JavaEEFacetConstants.WEB_31);
+    	IProject proj = ProjectUtilities.getProject(WEB_PROJECT_NAME);
+
+    	mergedModelProvider = ModelProviderManager.getModelProvider(proj);
+		org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) mergedModelProvider.getModelObject();
+		
+		addListener_MultiInterfaces();
+		assertJavaFileExists(LISTENER_CLASS_NAME);
+    	
+    	List listeners = webApp.getListeners();
+    	assertEquals("Exactly one listener is expected in the model, but " + listeners.size() + " are found", 
+    			1, listeners.size());
+    	org.eclipse.jst.javaee.core.Listener listener = (org.eclipse.jst.javaee.core.Listener) listeners.get(0);
+    	assertEquals("Listener " + LISTENER_CLASS_NAME + " is expected in the model, but " + listener.getListenerClass() + " is found", 
+    			LISTENER_CLASS_NAME, listener.getListenerClass());
+    	
+    	
+    }        
+    
 	@Override
 	protected void tearDown() throws Exception {
 		// uncomment the below line if you want to dump a check whether the
@@ -376,7 +721,7 @@
     public void createWebProject(String projectName, IProjectFacetVersion version) throws Exception {
     	IDataModel dm = WebProjectCreationOperationTest.getWebDataModel(
 				projectName, null, null, null, null, version, false);
-    	runAndVerify(dm);
+     	runAndVerify(dm);
     }
 
     private void addServlet_Defaults() throws Exception {
@@ -387,6 +732,32 @@
         runAndVerify(dm);
     }
     
+    private void addServlet_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    
+    private void addServlet_Async() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewServletClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, SERVLET_NAME);
+    	dm.setBooleanProperty(INewServletClassDataModelProperties.ASYNC_SUPPORT, true);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+	private void executeAndWait(IDataModelOperation dataModelOperation) throws InterruptedException, ExecutionException {
+		SynchronousModelChangedListener listener = new SynchronousModelChangedListener(1);
+		mergedModelProvider.addListener(listener);
+		dataModelOperation.execute(null, null);
+		listener.waitForEvents();
+		mergedModelProvider.removeListener(listener);
+	}
+    
     private void addFilter_Defaults() throws Exception {
     	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
     	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
@@ -395,6 +766,23 @@
         runAndVerify(dm);
     }
     
+    private void addFilter_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+      	executeAndWait(dm.getDefaultOperation());
+    }   
+    
+    private void addFilter_Async() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewFilterClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, FILTER_NAME);
+    	dm.setBooleanProperty(INewFilterClassDataModelProperties.ASYNC_SUPPORT, true);
+       	executeAndWait(dm.getDefaultOperation());
+    }    
+    
     private void addListener_Defaults() throws Exception {
     	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
     	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
@@ -406,6 +794,54 @@
         runAndVerify(dm);
     }
     
+    
+    private void addListener_Defaults_Annotations() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[0]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    
+    private void addListener_AsyncListener() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[9]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    private void addListener_HttpSessionIdListener() throws Exception {
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[6]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());
+    }
+    
+    private void addListener_MultiInterfaces() throws Exception{
+    	//add sessionid and async listeners
+    	IDataModel dm = DataModelFactory.createDataModel(NewListenerClassDataModelProvider.class);
+    	dm.setProperty(PROJECT_NAME, WEB_PROJECT_NAME);
+    	dm.setProperty(JAVA_PACKAGE, PACKAGE);
+    	dm.setProperty(CLASS_NAME, LISTENER_NAME);
+    	List interfaces = new ArrayList();
+      	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[9]);
+    	interfaces.add(NewListenerClassDataModelProvider.LISTENER_INTERFACES[6]);
+    	dm.setProperty(INTERFACES, interfaces);
+    	executeAndWait(dm.getDefaultOperation());   	
+    }
+    
     private void assertJavaFileExists(String fullyQualifiedName) throws JavaModelException {
 		IJavaProject javaProject = JavaCore.create(
 				ResourcesPlugin.getWorkspace().getRoot())
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
index 9b88cee..3517bfe 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-tests/org/eclipse/wtp/j2ee/headless/tests/web/operations/WebProjectCreationOperationTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2014 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
@@ -75,7 +75,7 @@
 		OperationTestCase.runAndVerify(dm);
 	}
 	
-	
+
 	public void testWeb22_ChangedContentDir() throws Exception {
 		IDataModel dm = getWebDataModel("goodWeb", null, null, "myAwesomeContentDir", null, JavaEEFacetConstants.WEB_22, true);
 		OperationTestCase.runAndVerify(dm);
@@ -559,7 +559,11 @@
     	
     	facetModel.setBooleanProperty(IJ2EEFacetInstallDataModelProperties.GENERATE_DD, createDD);
     	
-    	if(version.equals(JavaEEFacetConstants.WEB_30))    	{
+    	if (version.equals(JavaEEFacetConstants.WEB_31)){
+    		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
+	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_7);   		
+    	}
+    	else if(version.equals(JavaEEFacetConstants.WEB_30))    	{
     		IDataModel javaFacetModel = facetMap.getFacetDataModel(IJ2EEFacetConstants.JAVA);
 	    	javaFacetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, JavaEEFacetConstants.JAVA_6);
     	}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
index 154f1cc..310bfcb 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebProjectCreationDataModelVerifier.java
@@ -65,7 +65,7 @@
     @Override
     protected void verifyDD(Object modelObj) {
 		String version = J2EEProjectUtilities.getJ2EEProjectVersion(project);
-		if(version.equals(J2EEVersionConstants.VERSION_2_5_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_0_TEXT)){
+		if(version.equals(J2EEVersionConstants.VERSION_2_5_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_0_TEXT) || version.equals(J2EEVersionConstants.VERSION_3_1_TEXT)){
 			WebApp web = (WebApp)modelObj;
 			Assert.assertEquals("Invalid project version", version, web.getVersion().getLiteral());
 		} else {