[315423] fixed regression in WebAppMerger
This bug was caused by adapting web merged model to work for Web 3.0 and changes
the behavior of the MergedModel in Web 2.5
Current behavior will ignore certain servlet mappings declarations if they are
defined in Web 1.4 style. where it is possible to have many declarations of
servlet mapping with one and the same servlet name and different url pattern.
Junit tests are added.
diff --git a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java
index 1d14228..ea76c2b 100644
--- a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java
+++ b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java
@@ -1,5 +1,5 @@
 /***********************************************************************
- * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf. 
  * 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
@@ -161,8 +161,8 @@
 		try {
 			if (mergedModel != ddModel) {
 				clearModel(mergedModel);
-				mergeWithModel(ddModel);
-				mergeWithModel(annotationsModel);
+				mergeWithModel(ddModel, ModelElementMerger.COPY);
+				mergeWithModel(annotationsModel, ModelElementMerger.ADD);
 			}
 		} catch (ModelException e) {
 			Activator.logError(e);
@@ -170,28 +170,28 @@
 		return mergedModel;
 	}
 
-	private void mergeWithModel(WebApp model) throws ModelException {
+	private void mergeWithModel(WebApp model, int type) throws ModelException {
 		if (model == null)
 			return;
 		WebAppMerger merger;
 		try {
-			merger = createWebMerger(model);
+			merger = createWebMerger(model, type);
 		} catch (CoreException e) {
 			throw new ModelException(e);
 		}
 		merger.process();
 	}
 	
-	private WebAppMerger createWebMerger(WebApp model) throws CoreException{
+	private WebAppMerger createWebMerger(WebApp model, int type) throws CoreException{
 		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
 		if (facetedProject.getProjectFacetVersion(WebFacetUtils.WEB_FACET) != null){
 			if(Float.parseFloat(facetedProject.getProjectFacetVersion(WebFacetUtils.WEB_FACET).getVersionString()) > 2.5){
-				return new WebApp3Merger(mergedModel, model, ModelElementMerger.ADD);
+				return new WebApp3Merger(mergedModel, model, type);
 			}
 		}
 		 
 		
-		return new WebAppMerger(mergedModel, model, ModelElementMerger.ADD);
+		return new WebAppMerger(mergedModel, model, type);
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebApp3Merger.java b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebApp3Merger.java
index 6057d1b..414f578 100644
--- a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebApp3Merger.java
+++ b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebApp3Merger.java
@@ -27,21 +27,27 @@
 				}
 			}
 		}
+		if (getToMergeWebApp().getServlets() != null){
+			copyMissingContentInBase(getToMergeWebApp().getServlets(), getBaseWebApp().getServlets());
+		}
+		if (getToMergeWebApp().getFilterMappings() != null){
+			copyMissingContentInBase(getToMergeWebApp().getServletMappings(), getBaseWebApp().getServletMappings());
+		}
 		mergeServletMappings(getBaseWebApp().getServletMappings(), getToMergeWebApp().getServletMappings());
-		super.mergeServlets(warnings);
 	}
 	
 	private void mergeServlet(Servlet servlet, Servlet toMergeArtifact) {
 		mergeInitParams(servlet.getInitParams(), toMergeArtifact.getInitParams());
 	}
 	
-	private void mergeServletMappings(List<ServletMapping> servletMappings,
-			List<ServletMapping> servletMappings2) {
-		if (servletMappings != null && servletMappings2 != null && servletMappings.size() > 0 && servletMappings2.size() >0){
-			for(ServletMapping mapping : servletMappings){
-				ServletMapping artifactFromList = (ServletMapping) getArtifactFromList(mapping, servletMappings2);
-				if (artifactFromList != null && artifactFromList.getServletName().equals(mapping.getServletName())){
-					copyMissingContentInBase(artifactFromList.getUrlPatterns(), mapping.getUrlPatterns());
+	private void mergeServletMappings(List<ServletMapping> servletMappingsBase,
+			List<ServletMapping> servletMappingsToMerge) {
+		
+		if (servletMappingsBase != null && servletMappingsToMerge != null && servletMappingsToMerge.size() >0){
+			for(ServletMapping toMergeMapping : servletMappingsToMerge){
+				ServletMapping baseMapping = (ServletMapping) getArtifactFromList(toMergeMapping, servletMappingsBase);
+				if (baseMapping != null && baseMapping.getServletName().equals(toMergeMapping.getServletName())){
+					copyMissingContentInBase(toMergeMapping.getUrlPatterns(), baseMapping.getUrlPatterns());
 				}
 			}
 		}
@@ -59,21 +65,25 @@
 				}
 			}
 		}
+		if (getToMergeWebApp().getFilters() != null){
+		   copyMissingContentInBase(getToMergeWebApp().getFilters(), getBaseWebApp().getFilters());
+		}
+		if (getToMergeWebApp().getFilterMappings() != null){
+	    	copyMissingContentInBase(getToMergeWebApp().getFilterMappings(), getBaseWebApp().getFilterMappings());
+	    }
 		mergeFilterMappings(getBaseWebApp().getFilterMappings(), getToMergeWebApp().getFilterMappings());
-		super.mergeFilters(warnings);
 	}
-
-	private void mergeFilterMappings(List<FilterMapping> filterMappings,
-			List<FilterMapping> filterMappings2) {
-		if (filterMappings != null && filterMappings2 != null && filterMappings.size() > 0 && filterMappings2.size() >0){
-			for(FilterMapping mapping : filterMappings){
-				FilterMapping artifactFromList = (FilterMapping) getArtifactFromList(mapping, filterMappings2);
-				if (artifactFromList != null && artifactFromList.getFilterName().equals(mapping.getFilterName())){
-					copyMissingContentInBase(artifactFromList.getUrlPatterns(), mapping.getUrlPatterns());
+	
+	private void mergeFilterMappings(List<FilterMapping> filterMappingsBase,
+			List<FilterMapping> filterMappingsToMerge) {
+		if (filterMappingsBase != null && filterMappingsToMerge != null && filterMappingsToMerge.size() >0){
+			for(FilterMapping toMergeMapping : filterMappingsToMerge){
+				FilterMapping baseMapping = (FilterMapping) getArtifactFromList(toMergeMapping, filterMappingsBase);
+				if (baseMapping != null && baseMapping.getFilterName().equals(toMergeMapping.getFilterName())){
+					copyMissingContentInBase(toMergeMapping.getUrlPatterns(), baseMapping.getUrlPatterns());
 				}
 			}
 		}
-		
 	}
 
 	private void mergeFilter(Filter filter, Filter toMergeArtifact) {
diff --git a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebAppMerger.java b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebAppMerger.java
index a9a8608..15ab6f1 100644
--- a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebAppMerger.java
+++ b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/mergers/WebAppMerger.java
@@ -1,5 +1,5 @@
 /***********************************************************************
- * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf. 
  * 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
@@ -97,7 +97,11 @@
       copyMissingContentInBase(getToMergeWebApp().getFilters(), getBaseWebApp().getFilters());
     }
     if (getToMergeWebApp().getFilterMappings() != null){
-    	copyMissingContentInBase(getToMergeWebApp().getFilterMappings(), getBaseWebApp().getFilterMappings());
+    	if (getKind() == COPY){
+    		copyAllContentInBase(getToMergeWebApp().getFilterMappings(), getBaseWebApp().getFilterMappings());
+    	} else {
+    		copyMissingContentInBase(getToMergeWebApp().getFilterMappings(), getBaseWebApp().getFilterMappings());
+    	}
     }
   }
 
@@ -114,7 +118,11 @@
     }
 
     if (getToMergeWebApp().getServletMappings() != null){
-    	copyMissingContentInBase(getToMergeWebApp().getServletMappings(), getBaseWebApp().getServletMappings());
+    	if (getKind() == COPY){
+    		copyAllContentInBase(getToMergeWebApp().getServletMappings(), getBaseWebApp().getServletMappings());
+    	} else {
+    		copyMissingContentInBase(getToMergeWebApp().getServletMappings(), getBaseWebApp().getServletMappings());
+    	}
     }
 
   }
diff --git a/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/mergers/ModelElementMerger.java b/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/mergers/ModelElementMerger.java
index 4bf37dd..1a77f58 100644
--- a/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/mergers/ModelElementMerger.java
+++ b/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/mergers/ModelElementMerger.java
@@ -1,5 +1,5 @@
 /***********************************************************************
- * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * Copyright (c) 2008, 2010 by SAP AG, Walldorf. 
  * 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
@@ -31,6 +31,8 @@
 	
 	public static int REMOVE = 0x4;
 	
+	public static int COPY = 0x8;
+
 	JavaEEObject base;
 	JavaEEObject toMerger;