[91563] commited for NA
diff --git a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/AbstractEJBValidator.java b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/AbstractEJBValidator.java
index 3b6f105..b64dd2d 100644
--- a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/AbstractEJBValidator.java
+++ b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/AbstractEJBValidator.java
@@ -34,7 +34,7 @@
  * To change the template for this generated type comment go to
  * Window>Preferences>Java>Code Generation>Code and Comments
  */
-public abstract class AbstractEJBValidator extends J2EEValidator {
+public abstract class AbstractEJBValidator extends J2EEValidatorNew {
 	protected Map _validated = null;
 	/**
 	 *  
@@ -109,7 +109,7 @@
 	 */
 	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
 		//Default
-		super.validate(helper, reporter);
+		//super.validate(helper, reporter);
 	}
 	
     public void run(IValidationRule rule, Object targetParent, Object target) throws ValidationException {
diff --git a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EJBValidator.java b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EJBValidator.java
index c767dc3..f395724 100644
--- a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EJBValidator.java
+++ b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EJBValidator.java
@@ -19,6 +19,8 @@
 import java.util.Set;
 import java.util.logging.Level;
 
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.jem.java.JavaClass;
 import org.eclipse.jem.util.logger.LogEntry;
 import org.eclipse.jem.util.logger.proxy.Logger;
@@ -59,10 +61,11 @@
 		return "ejbvalidator"; //$NON-NLS-1$
 	}
 
+	
 	/*
 	 * @see IValidator#validate(IValidationContext, IReporter, IFileDelta[])
 	 */
-	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException {
+	public IStatus validateInJob(IValidationContext helper, IReporter reporter) throws ValidationException {
 		long start = System.currentTimeMillis();
 		Logger logger = Logger.getLogger(IEJBValidatorConstants.J2EE_CORE_PLUGIN);
 		if (logger != null && logger.isLoggingLevel(Level.FINER)) {
@@ -72,14 +75,16 @@
 			entry.setText("validate took " + (end - start) + " milliseconds."); //$NON-NLS-1$  //$NON-NLS-2$
 			logger.write(Level.FINER, entry);
 		}
+		EJBValidationContext vc = new EJBValidationContext(this, helper, reporter);
 		try {
-			EJBValidationContext vc = new EJBValidationContext(this, helper, reporter);
+			
 			setValidationContext(vc);
 			if (isFullValidate(vc)) {
 				fullValidate(vc);
 			} else {
 				incrementalValidate(vc);
 			}
+
 			if (logger != null && logger.isLoggingLevel(Level.FINER)) {
 				long end = System.currentTimeMillis();
 				LogEntry entry = getLogEntry();
@@ -93,9 +98,11 @@
 				ValidationRuleUtility.helperMap = null;
 				
 				ValidationRuleUtility.projectHelperMap.clear();
+
 				
 			}
 		}
+		return status;
 	}
 	
 	public boolean isFullValidate(IEJBValidationContext vc) {
@@ -502,5 +509,10 @@
         EJBValidationRuleFactory.getFactory().release(rule);
         
     }
+
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 	
 }
diff --git a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EarValidator.java b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EarValidator.java
index 6044bc0..59a0704 100644
--- a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EarValidator.java
+++ b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EarValidator.java
@@ -21,6 +21,8 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
@@ -54,6 +56,7 @@
 import org.eclipse.jst.j2ee.internal.common.XMLResource;
 import org.eclipse.jst.j2ee.webapplication.WebApp;
 import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 import org.eclipse.wst.validation.internal.core.Message;
 import org.eclipse.wst.validation.internal.core.ValidationException;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
@@ -66,7 +69,7 @@
  * Creation date: (12/6/2000 11:08:55 AM)
  * @author: Administrator
  */
-public class EarValidator extends org.eclipse.jst.j2ee.model.internal.validation.J2EEValidator implements EARMessageConstants {
+public class EarValidator extends org.eclipse.jst.j2ee.model.internal.validation.J2EEValidatorNew implements EARMessageConstants {
 	public static final String RES_REF_GROUP_NAME = "RES_REF_GROUP_NAME"; //$NON-NLS-1$
 	public static final String RES_ENV_REF_GROUP_NAME = "RES_ENV_REF_GROUP_NAME"; //$NON-NLS-1$
 	public static final String SERVICE_REF_GROUP_NAME = "SERVICE_REF_GROUP_NAME"; //$NON-NLS-1$
@@ -123,9 +126,10 @@
 	/**
 	 * Does the validation
 	 */
-	public void validate(IValidationContext inHelper, IReporter inReporter) throws ValidationException {
+	public IStatus  validateInJob( IValidationContext inHelper, IReporter inReporter ) throws ValidationException {
+				
 		inReporter.removeAllMessages(this);
-		super.validate(inHelper, inReporter);
+		super.validateInJob(inHelper, inReporter );
 		try {
 			earFile = (EARFile) _helper.loadModel(EAR_MODEL_NAME);
 			if (earFile != null) {
@@ -134,6 +138,7 @@
 					validate();
 				else {
 					IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, EAR_DD_CANNOT_OPEN_DD, new String[] { getResourceName()});
+					status = WTPCommonPlugin.createErrorStatus(errorMsg.getText());
 					throw new ValidationException(errorMsg);
 				}
 			} else {
@@ -150,6 +155,7 @@
 			IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, EAR_VALIDATION_INTERNAL_ERROR_UI_, param);
 			throw new ValidationException(errorMsg, e);
 		} // try 
+		return status;
 	} // validate
 
 	
@@ -905,5 +911,11 @@
 				Logger.getLogger().logError(ex);
 		}
 		return destinations;
-	}	
+	}
+
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		_helper = helper;
+		return null;
+	}
+
 }// EarValidator
diff --git a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/J2EEValidatorNew.java b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/J2EEValidatorNew.java
new file mode 100644
index 0000000..aa806f9
--- /dev/null
+++ b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/J2EEValidatorNew.java
@@ -0,0 +1,568 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2005 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.jst.j2ee.model.internal.validation;
+
+
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.jst.j2ee.common.EjbRef;
+import org.eclipse.jst.j2ee.common.internal.impl.ResourceRefImpl;
+import org.eclipse.jst.j2ee.common.internal.impl.SecurityRoleImpl;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.validation.internal.ResourceConstants;
+import org.eclipse.wst.validation.internal.ResourceHandler;
+import org.eclipse.wst.validation.internal.core.Message;
+import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
+
+
+/**
+ * Insert the type's description here. Creation date: (3/9/2001 3:34:39 PM)
+ * 
+ * @author: Administrator
+ */
+public abstract class J2EEValidatorNew implements IValidatorJob, J2EEMessageConstants {
+	protected IReporter _reporter;
+	protected IValidationContext _helper;
+	protected IStatus status = OK_STATUS;
+
+	//public static IStatus OK_STATUS = new Status(IStatus.OK, "org.eclipse.jst.j2ee.core", 0, "OK", null); //$NON-NLS-1$ //$NON-NLS-2$
+	public J2EEValidatorNew() {
+		initialize();
+	}
+
+	/**
+	 * <p>
+	 * Create am <em>error</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addError(String msgId) {
+		addError(getBaseName(), msgId, null);
+	}
+
+	/**
+	 * <p>
+	 * Create am <em>error</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addError(String msgId, String[] msgArgs) {
+		addError(getBaseName(), msgId, msgArgs);
+	}
+
+	/**
+	 * <p>
+	 * Create am <em>error</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addError(String msgCategory, String msgId) {
+		addError(msgCategory, msgId, null);
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>error</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require one or more arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addError(String bundleName, String msgId, String[] msgArgs) {
+		this.addError(bundleName, msgId, msgArgs, null);
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>error</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require one or more arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addError(String bundleName, String msgId, String[] msgArgs, Object target) {
+		_reporter.addMessage(this, new Message(bundleName, IMessage.HIGH_SEVERITY, msgId, msgArgs, target));
+	}
+
+	public void addError(String bundleName, String msgId, String[] msgArgs, Object target, String groupName) {
+		IMessage message = new Message(bundleName, IMessage.HIGH_SEVERITY, msgId, msgArgs, target);
+		message.setGroupName(groupName);
+		_reporter.addMessage(this, message);
+	}
+
+	public void addError(String bundleName, String msgId, String[] msgArgs, Object target, String groupName, int lineNumber) {
+		IMessage message = new Message(bundleName, IMessage.HIGH_SEVERITY, msgId, msgArgs, target);
+		message.setLineNo(lineNumber);
+		message.setGroupName(groupName);
+
+		_reporter.addMessage(this, message);
+
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>informational</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addInfo(String msgId) {
+		addInfo(getBaseName(), msgId, null);
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>informational</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addInfo(String msgId, String[] msgArgs) {
+		addInfo(getBaseName(), msgId, msgArgs);
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>informational</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addInfo(String msgCategory, String msgId) {
+		addInfo(msgCategory, msgId, null);
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>informational</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require one or more arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addInfo(String bundleName, String msgId, String[] msgArgs) {
+		addInfo(bundleName, msgId, msgArgs, null);
+	}
+
+	/**
+	 * <p>
+	 * Create an <em>informational</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require one or more arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addInfo(String bundleName, String msgId, String[] msgArgs, Object target) {
+		_reporter.addMessage(this, new Message(bundleName, IMessage.LOW_SEVERITY, msgId, msgArgs, target));
+	}
+
+	/**
+	 * <p>
+	 * Create a <em>warning</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addWarning(String msgId) {
+		addWarning(getBaseName(), msgId, null);
+	}
+
+	/**
+	 * <p>
+	 * Create a <em>warning</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addWarning(String msgId, String[] msgArgs) {
+		addWarning(getBaseName(), msgId, msgArgs);
+	}
+
+	/**
+	 * <p>
+	 * Create a <em>warning</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require no arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 */
+
+	public void addWarning(String msgCategory, String msgId) {
+		addWarning(msgCategory, msgId, null);
+	}
+
+	/**
+	 * <p>
+	 * Create a <em>warning</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require one or more arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addWarning(String bundleName, String msgId, String[] msgArgs) {
+		addWarning(bundleName, msgId, msgArgs, null);
+	}
+
+	/**
+	 * <p>
+	 * Create a <em>warning</em> message and route it to the cached reporter. This form of
+	 * <code>addError</code> is for messages which require one or more arguments.
+	 * </p>
+	 * 
+	 * @param msgCategory
+	 *            The base name of the message bundle to use.
+	 * @param msgId
+	 *            The ID of the message to be created.
+	 * @param msgArgs
+	 *            The parameters for the message.
+	 */
+
+	public void addWarning(String bundleName, String msgId, String[] msgArgs, Object target) {
+		_reporter.addMessage(this, new Message(bundleName, IMessage.NORMAL_SEVERITY, msgId, msgArgs, target));
+	}
+
+	public void addWarning(String bundleName, String msgId, String[] msgArgs, Object target, String groupName) {
+		IMessage message = new Message(bundleName, IMessage.NORMAL_SEVERITY, msgId, msgArgs, target);
+		message.setGroupName(groupName);
+		_reporter.addMessage(this, message);
+	}
+
+	/**
+	 * Perform any resource cleanup once validation is complete.
+	 */
+	public void cleanup() {
+		_reporter = null;
+	}
+
+	/**
+	 * Perform any resource cleanup once validation is complete. If cleanup will take some time, the
+	 * IValidator should report subtask information to the user through the IReporter parameter. The
+	 * AReporter parameter will not be null.
+	 * 
+	 * @deprecated Use cleanup()
+	 */
+	public void cleanup(IReporter reporter) {
+		_reporter = null;
+	}
+
+	/**
+	 * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder
+	 * uses this string as input to the IProgressMonitor. i.e., At some point during the validation
+	 * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0}
+	 * is the string that this method returns, and {1} is the name of the current resource.
+	 */
+	public String[] get1Param(String string1) {
+		String[] parms = new String[1];
+		parms[0] = string1;
+		return parms;
+	}
+
+	/**
+	 * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder
+	 * uses this string as input to the IProgressMonitor. i.e., At some point during the validation
+	 * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0}
+	 * is the string that this method returns, and {1} is the name of the current resource.
+	 */
+	public String[] get2Param(String string1, String string2) {
+		String[] parms = new String[2];
+		parms[0] = string1;
+		parms[1] = string2;
+		return parms;
+	}
+
+	/**
+	 * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder
+	 * uses this string as input to the IProgressMonitor. i.e., At some point during the validation
+	 * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0}
+	 * is the string that this method returns, and {1} is the name of the current resource.
+	 */
+	public String[] get3Param(String string1, String string2, String string3) {
+		String[] parms = new String[2];
+		parms[0] = string1;
+		parms[1] = string2;
+		parms[2] = string3;
+		return parms;
+	}
+
+	/**
+	 * <p>
+	 * Answer the id of the resource bundle which is used by the receiver.
+	 * </p>
+	 */
+
+	public abstract String getBaseName();
+
+	/**
+	 * Returns a localized message from a resource bundle.
+	 * 
+	 * @param msgCategory
+	 *            The baseName of the resource bundle (filename minus any locale suffix)
+	 * @param msgId
+	 *            The key of the message to lookup from the bundle.
+	 * @param msgArgs
+	 *            An array of arguments that will be substituted into any message arguments in the
+	 *            message's value.
+	 * @param locale
+	 *            The locale to retrieve the message text from.
+	 */
+	public String getMessage(String msgCategory, String msgId, String[] msgArgs, Locale locale) {
+		return J2EEValidationResourceHandler.getExternalizedMessage(msgCategory, msgId, getClass(), msgArgs, locale);
+	}
+
+	/**
+	 * Returns a localized message from a resource bundle.
+	 * 
+	 * @param msgCategory
+	 *            The baseName of the resource bundle (filename minus any locale suffix)
+	 * @param msgId
+	 *            The key of the message to lookup from the bundle.
+	 * @param locale
+	 *            The locale to retrieve the message text from.
+	 */
+	public String getMessage(String msgCategory, String msgId, Locale locale) {
+		return J2EEValidationResourceHandler.getExternalizedMessage(msgCategory, msgId, getClass(), locale);
+	}
+
+	/**
+	 * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder
+	 * uses this string as input to the IProgressMonitor. i.e., At some point during the validation
+	 * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0}
+	 * is the string that this method returns, and {1} is the name of the current resource.
+	 */
+	public String getName() {
+		return getName(Locale.getDefault());
+	}
+
+	/**
+	 * <p>
+	 * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder
+	 * uses this string as input to the IProgressMonitor. i.e., At some point during the validation
+	 * process, the Validation Builder will output this string:
+	 * </p>
+	 * 
+	 * <pre>
+	 *      &quot;{0} is validating {1}.&quot;,
+	 * </pre>
+	 * 
+	 * <p>
+	 * where
+	 * </p>
+	 * 
+	 * <pre>
+	 *      {0} is the string that this method returns,
+	 * </pre>
+	 * 
+	 * <p>
+	 * and
+	 * </p>
+	 * 
+	 * <pre>
+	 *      {1} is the name of the current resource.
+	 * </pre>
+	 * 
+	 * @param locale
+	 *            The locale from which to retrieve the name text.
+	 */
+
+	public String getName(Locale locale) {
+		return getMessage(getBaseName(), VALIDATOR_NAME, locale);
+	}
+
+	/**
+	 * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder
+	 * uses this string as input to the IProgressMonitor. i.e., At some point during the validation
+	 * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0}
+	 * is the string that this method returns, and {1} is the name of the current resource.
+	 */
+	public String[] getParam1(String string1) {
+		String[] parms = new String[1];
+		parms[0] = string1;
+		return parms;
+	}
+
+	protected void initialize() {
+		// Default
+	}
+
+	/**
+	 * This is the method which performs the validation on the MOF model. <br>
+	 * <br>
+	 * <code>helper</code> and <code>reporter</code> may not be null. <code>changedFiles</code>
+	 * may be null, if a full build is desired. <br>
+	 * <br>
+	 * <code>helper</code> loads a EObject. The EObject is the root of the MOF model about to be
+	 * validated. When this object is traversed, you can reach every element in the MOF model which
+	 * needs to be validated. <br>
+	 * <br>
+	 * <code>reporter</code> is an instance of an IReporter interface, which is used for
+	 * interaction with the user. <br>
+	 * <br>
+	 * <code>changedFiles</code> is an array of file names which have changed since the last
+	 * validation. If <code>changedFiles</code> is null, or if it is an empty array, then a full
+	 * build is performed. Otherwise, validation on just the files listed in the Vector is
+	 * performed.
+	 */
+	
+	public void validate(IValidationContext inHelper, IReporter inReporter) throws ValidationException {
+
+	}
+	
+	public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter) throws ValidationException {
+
+		_helper = inHelper;
+		_reporter = inReporter;
+		status = OK_STATUS;
+		return status;
+	}
+
+	/**
+	 * Validate EJB references.
+	 */
+	protected void validateEJBRefManadatoryElements(EjbRef eref, String ownerName) {
+		String[] parms = new String[2];
+		parms[0] = eref.getName();
+		parms[1] = ownerName;
+
+		if ((eref.getName() == null) || (eref.getName().trim().length() == 0))
+			addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFNAME, parms, eref);
+		if (eref.isSetType()) {
+			if (eref.getType() == null)
+				addWarning(EREF_CATEGORY, ERROR_EAR_INVALID_EREFTYPE, parms);
+		} else
+			addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFTYPE, parms);
+
+		String refHome = eref.getHome();
+		if ((refHome == null) || (refHome.trim().length() == 0))
+			addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFHOME, parms, eref);
+
+		if ((eref.getRemote() == null) || (eref.getRemote().trim().length() == 0))
+			addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFREMOTE, parms, eref);
+	}
+
+	/**
+	 * Validate for duplicates in EAR Roles.
+	 */
+	protected void validateResourceRefs(List resourceRefs) {
+
+		int numRefs = resourceRefs.size();
+		Set refSet = new HashSet(numRefs);
+
+		for (int refNo = 0; refNo < numRefs; refNo++) {
+			String refName = ((ResourceRefImpl) (resourceRefs.get(refNo))).getName();
+			String[] parms = new String[1];
+			parms[0] = refName;
+			if (!(refSet.add(refName)))
+				addError(EREF_CATEGORY, ERROR_EAR_DUPLICATE_RESREF, parms, resourceRefs.get(refNo));
+		}
+	}
+
+	/**
+	 * Validate the existance of Web Roles within the EAR Roles and duplicates in Web Roles.
+	 */
+	protected void validateWEBRolesWithEARRoles(EList earRoleList, EList warRoles) {
+		int numRoles = warRoles.size();
+
+		// TFB This implementation requires a 'small' list of warRoles.
+		// If 'warRoles' gets too big then another implementation
+		// will be necessary.
+
+		for (int roleNo = 0; roleNo < numRoles; roleNo++) {
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createErrorStatus(msg);
+			}
+			
+			SecurityRoleImpl nextRole = (SecurityRoleImpl) (warRoles.get(roleNo));
+			String[] parms = new String[1];
+			parms[0] = nextRole.getRoleName();
+			if (!(earRoleList.contains(nextRole)))
+				addWarning(WAR_CATEGORY, ERROR_EAR_MISSING_EJB_ROLE, parms, nextRole);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/WarValidator.java b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/WarValidator.java
index 86f31e2..04cb3d1 100644
--- a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/WarValidator.java
+++ b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/WarValidator.java
@@ -17,6 +17,8 @@
 import java.util.Locale;
 import java.util.Set;
 
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.ResourceSet;
@@ -56,135 +58,145 @@
 import org.eclipse.jst.j2ee.webapplication.WebResourceCollection;
 import org.eclipse.jst.j2ee.webapplication.WelcomeFile;
 import org.eclipse.jst.j2ee.webapplication.WelcomeFileList;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
+import org.eclipse.wst.validation.internal.ResourceConstants;
+import org.eclipse.wst.validation.internal.ResourceHandler;
 import org.eclipse.wst.validation.internal.core.Message;
 import org.eclipse.wst.validation.internal.core.ValidationException;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
 
-//import org.eclipse.jst.j2ee.internal.plugin.nls.ResourceHandler;
+// import org.eclipse.jst.j2ee.internal.plugin.nls.ResourceHandler;
 
-public class WarValidator extends org.eclipse.jst.j2ee.model.internal.validation.J2EEValidator implements WARMessageConstants {
-  protected WARFile warFile;
-  protected WebApp webDD;
-  private   Hashtable httpMethods = null ;
+public class WarValidator extends J2EEValidatorNew implements WARMessageConstants {
+	protected WARFile warFile;
+	protected WebApp webDD;
+	private Hashtable httpMethods = null;
 
-  // Optional child validators
-  //protected WebExtValidator webExtValidator;
-  //protected WebBndValidator webBndValidator;
+	// Optional child validators
+	// protected WebExtValidator webExtValidator;
+	// protected WebBndValidator webBndValidator;
 
 
 	/**
 	 * RelationshipMapValidator constructor comment.
 	 */
-	public WarValidator()
-	{
+	public WarValidator() {
 		super();
 	}
-/**
- * Will construct a HashTable of roles, and check for duplicates 
- * and null entries
- * @return java.util.Hashtable
- * @param roles org.eclipse.emf.common.util.EList
- */
-public Hashtable getAndValidateSecurityRoles(EList roles) {
 
-	Hashtable secRoles = new Hashtable() ;
-	if (roles.isEmpty()) return (secRoles) ;
+	/**
+	 * Will construct a HashTable of roles, and check for duplicates and null entries
+	 * 
+	 * @return java.util.Hashtable
+	 * @param roles
+	 *            org.eclipse.emf.common.util.EList
+	 */
+	public Hashtable getAndValidateSecurityRoles(EList roles) {
 
-	Iterator sRoles  = roles.iterator() ;
-	
-	while (sRoles.hasNext()) {
-	  SecurityRole role = (SecurityRole) sRoles.next() ;
-		
+		Hashtable secRoles = new Hashtable();
+		if (roles.isEmpty())
+			return (secRoles);
 
-	  String name = role.getRoleName() ;
-	  if (name != null)
-			 name = name.trim() ;
-	  if (name == null || name.equals("")) { //$NON-NLS-1$
-		  String[] parms = new String[1];
-		  parms[0] = WARValidationResourceHandler.of_Type_Security_Role_Name_6 ; 
-		  addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,role);
-		  continue ;          
-	  }
-	  if (secRoles.get(name)!=null) {   // Check for dups
+		Iterator sRoles = roles.iterator();
 
-		  String[] parms = new String[1];
-		  parms[0] = name ;
-		  addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms,role);
-		  continue ;
-	  }
-	  secRoles.put(name,"Yea") ;      //$NON-NLS-1$
-	} 
-	
-	
-	return secRoles;
-}
-/**
- * <p>Answer the id of the resource bundle which is
- * used by the receiver.</p>
- */
-public String getBaseName(){
-	return WAR_CATEGORY;
-}
+		while (sRoles.hasNext()) {
+			
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			SecurityRole role = (SecurityRole) sRoles.next();
+
+
+			String name = role.getRoleName();
+			if (name != null)
+				name = name.trim();
+			if (name == null || name.equals("")) { //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Security_Role_Name_6;
+				addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, role);
+				continue;
+			}
+			if (secRoles.get(name) != null) { // Check for dups
+
+				String[] parms = new String[1];
+				parms[0] = name;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, role);
+				continue;
+			}
+			secRoles.put(name, "Yea"); //$NON-NLS-1$
+		}
+
+
+		return secRoles;
+	}
+
+	/**
+	 * <p>
+	 * Answer the id of the resource bundle which is used by the receiver.
+	 * </p>
+	 */
+	public String getBaseName() {
+		return WAR_CATEGORY;
+	}
+
 	// Messaging helpers ...
 
 	/**
-	 * Returns the name of the Validator, as it should be displayed in
-	 * the UI.
-	 *
+	 * Returns the name of the Validator, as it should be displayed in the UI.
+	 * 
 	 * @see J2EEValidator#getName
 	 */
 
-	public String getName()
-	{
-		return WARValidationResourceHandler.Web_Archive_Validator_8; 
+	public String getName() {
+		return WARValidationResourceHandler.Web_Archive_Validator_8;
 	}
+
 	// Messaging helpers ...
 
 	/**
-	 * Returns the name of the Validator, as it should be displayed in
-	 * the UI.
-	 *
+	 * Returns the name of the Validator, as it should be displayed in the UI.
+	 * 
 	 * @see J2EEValidator#getName
 	 */
 
-	public String getName(Locale locale)
-	{
-		return getMessage(null,"webArchiveValidator.name", locale); //$NON-NLS-1$
+	public String getName(Locale locale) {
+		return getMessage(null, "webArchiveValidator.name", locale); //$NON-NLS-1$
 	}
-/**
- * This is a utility function used by the validateSecurityConstraints.
- * 
- * @return boolean
- */
-protected boolean isHttpMethod(String method) {
+
+	/**
+	 * This is a utility function used by the validateSecurityConstraints.
+	 * 
+	 * @return boolean
+	 */
+	protected boolean isHttpMethod(String method) {
 
 
-	if (httpMethods == null) {  // Need to construct the Hashtable, once
-		String [] mList = {"GET", "PUT", "HEAD", "TRACE", "POST", "DELETE", "OPTIONS"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-		
-		httpMethods = new Hashtable() ;
-		for (int i = 0; i<mList.length; i++)
-		   httpMethods.put (mList[i],"bla") ; //$NON-NLS-1$
+		if (httpMethods == null) { // Need to construct the Hashtable, once
+			String[] mList = {"GET", "PUT", "HEAD", "TRACE", "POST", "DELETE", "OPTIONS"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
+
+			httpMethods = new Hashtable();
+			for (int i = 0; i < mList.length; i++)
+				httpMethods.put(mList[i], "bla"); //$NON-NLS-1$
+		}
+		String compare = method.trim();
+		return (httpMethods.get(compare) != null);
 	}
-	String compare = method.trim() ;
-	return (httpMethods.get(compare) != null) ;         
-}
-/**
- *  WAR validation is driven by 3 prong approach:
- *  o XML/DTD validation (this is now handled by the XML Validator)
- *  o Consistent web.xml data entry validation beyond DTD
- *      e.g., duplicate entries, null entries etc. This is also
- *      driven by this validator.
- *  o web.xml reference to resources in the "file system".  This
- *      will not be provided by this validator.  In the workbench
- *      this function is already provided by the link builder.
- *     
- */
-public void validate() throws ValidationException{
-		validateMimeMapping() ;
-		validateContextParameters() ;
+
+	/**
+	 * WAR validation is driven by 3 prong approach: o XML/DTD validation (this is now handled by
+	 * the XML Validator) o Consistent web.xml data entry validation beyond DTD e.g., duplicate
+	 * entries, null entries etc. This is also driven by this validator. o web.xml reference to
+	 * resources in the "file system". This will not be provided by this validator. In the workbench
+	 * this function is already provided by the link builder.
+	 * 
+	 */
+	public void validate() throws ValidationException {
+		validateMimeMapping();
+		validateContextParameters();
 		validateTagLibs();
 		validateServletMappings(webDD.getServletMappings());
 		validateWelcomeFileList(webDD.getFileList());
@@ -193,312 +205,342 @@
 		validateFilters(webDD.getFilters());
 		validateFilterMappings(webDD.getFilterMappings());
 		validateRefs();
-		validateLoginConfig( webDD.getLoginConfig() );
-		validateEnvironmentEntries( webDD.getEnvironmentProperties() );
-		validateOther() ;
+		validateLoginConfig(webDD.getLoginConfig());
+		validateEnvironmentEntries(webDD.getEnvironmentProperties());
+		validateOther();
 		validate14();
 	}
-/**
- * 
- */
-private void validate14() {
-	int versionId = webDD.getVersionID();
-	if(versionId == J2EEVersionConstants.WEB_2_4_ID) {
-		validateUrlPattern();
-	}
-}
-/**
- * 
- */
-private void validateUrlPattern() {
-	List servletMappings = webDD.getServletMappings();
-	for(int i = 0; i < servletMappings.size(); i++) {
-		ServletMapping mapping = (ServletMapping)servletMappings.get(i);
-		String urlPattern = mapping.getUrlPattern();
-		int newLineChar = urlPattern.indexOf(Character.LINE_SEPARATOR);
-		if(newLineChar != -1) {
-			String[] parms = new String[2];
-			parms[0] = urlPattern ;
-			parms[1] = mapping.getServlet().getDisplayName();
-			addError(WAR_CATEGORY, MESSAGE_URL_PATTERN_END_WITH_CARRAIGE_RETURN,parms,mapping);
+
+	/**
+	 * 
+	 */
+	private void validate14() {
+		int versionId = webDD.getVersionID();
+		if (versionId == J2EEVersionConstants.WEB_2_4_ID) {
+			validateUrlPattern();
 		}
 	}
+
+	/**
+	 * 
+	 */
+	private void validateUrlPattern() {
+		List servletMappings = webDD.getServletMappings();
+		for (int i = 0; i < servletMappings.size(); i++) {
+			ServletMapping mapping = (ServletMapping) servletMappings.get(i);
+			String urlPattern = mapping.getUrlPattern();
+			int newLineChar = urlPattern.indexOf(Character.LINE_SEPARATOR);
+			if (newLineChar != -1) {
+				String[] parms = new String[2];
+				parms[0] = urlPattern;
+				parms[1] = mapping.getServlet().getDisplayName();
+				addError(WAR_CATEGORY, MESSAGE_URL_PATTERN_END_WITH_CARRAIGE_RETURN, parms, mapping);
+			}
+		}
+
+	}
+
+	/**
+	 * This is the method which performs the validation on the MOF model. <br>
+	 * <br>
+	 * <code>helper</code> and <code>reporter</code> may not be null. <code>changedFiles</code>
+	 * may be null, if a full build is desired. <br>
+	 * <br>
+	 * <code>helper</code> loads a EObject. The EObject is the root of the MOF model about to be
+	 * validated. When this object is traversed, you can reach every element in the MOF model which
+	 * needs to be validated. <br>
+	 * <br>
+	 * <code>reporter</code> is an instance of an IReporter interface, which is used for
+	 * interaction with the user. <br>
+	 * <br>
+	 * <code>changedFiles</code> is an array of file names which have changed since the last
+	 * validation. If <code>changedFiles</code> is null, or if it is an empty array, then a full
+	 * build is performed. Otherwise, validation on just the files listed in the Vector is
+	 * performed.
+	 */
+
 	
-}
+	public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter) throws ValidationException {
+		status = super.validateInJob(inHelper, inReporter);
+		
 
-/**
- * This is the method which performs the validation on the MOF model.
- * <br><br>
- * <code>helper</code> and <code>reporter</code> may not be null. <code>changedFiles</code> may be null, if a full
- * build is desired.
- * <br><br>
- * <code>helper</code> loads a EObject. The EObject is the root of the 
- * MOF model about to be validated. When this object is traversed,
- * you can reach every element in the MOF model which needs to be validated.
- * <br><br>
- * <code>reporter</code> is an instance of an IReporter interface, which is used for interaction with the user.
- * <br><br>
- * <code>changedFiles</code> is an array of file names which have changed since the last validation. 
- * If <code>changedFiles</code> is null, or if it is an empty array, then a full build
- * is performed. Otherwise, validation on just the files listed in the Vector is performed.
- */
+		// First remove all previous msg. for this project
+		_reporter.removeAllMessages(this, null); // Note the WarHelper will return web.xml with a
+													// null object as well
 
-public void validate(IValidationContext inHelper, IReporter inReporter) throws ValidationException {
-	super.validate(inHelper, inReporter);
+		if( !_reporter.isCancelled()){
+			
+			warFile = (WARFile) _helper.loadModel(WAR_MODEL_NAME);
+			
+			try {
+				if (warFile != null) {
+					webDD = warFile.getDeploymentDescriptor();
+					validate();
+				} else {
+					IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_INVALID_WAR_FILE);
+					status = WTPCommonPlugin.createErrorStatus(errorMsg.getText());
+					throw new ValidationException(errorMsg);
+				}
 	
-	// First remove all previous msg. for this project
-	_reporter.removeAllMessages(this, null); // Note the WarHelper will return web.xml with a null object as well
+			} catch (ValidationException ex) {
+				throw ex;
+			} catch (Exception e) {
+				String[] parms = new String[1];
+				parms[0] = e.toString();
+				IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_WAR_VALIDATION_FAILED, parms);
+				status = WTPCommonPlugin.createErrorStatus(errorMsg.getText());
+				throw new ValidationException(errorMsg, e);
+			}
+		}else{
+			String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+			status = WTPCommonPlugin.createCancelStatus(msg);
+		}
+		return status;
+	}
 
-	warFile = (WARFile) _helper.loadModel(WAR_MODEL_NAME);
-	try {
-		if (warFile != null) {
+	/**
+	 * This validator can be used for validation when the reporter and helper have been supplied via
+	 * the constructor.
+	 */
+	public void validate(Object aWarFile) throws ValidationException {
+
+		try {
+			warFile = (WARFile) aWarFile;
 			webDD = warFile.getDeploymentDescriptor();
+
 			validate();
-		} else {
-			IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_INVALID_WAR_FILE);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			String[] parms = new String[1];
+			parms[0] = e.toString();
+			IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_WAR_VALIDATION_FAILED, parms);
 			throw new ValidationException(errorMsg);
 		}
-
-	} catch (ValidationException ex) {
-		throw ex;
-	} catch (Exception e) {
-		String[] parms = new String[1];
-		parms[0] = e.toString();
-		IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_WAR_VALIDATION_FAILED, parms );
-		throw new ValidationException(errorMsg, e);
 	}
-}
 
-/**
- * This validator can be used for validation when the reporter and helper have
- * been supplied via the constructor.
- */
-public void validate(Object aWarFile) throws ValidationException {
+	/**
+	 * The auth-constraint element indicates the user roles that should be permitted access to this
+	 * resource collection. The role used here must appear in a security-role-ref element. <!ELEMENT
+	 * auth-constraint (description?, role-name*)> The role-name element contains the name of a
+	 * security role. <!ELEMENT role-name (#PCDATA)> Creation date: (7/6/2001 3:39:34 PM)
+	 * 
+	 * @param authConstraint
+	 *            org.eclipse.jst.j2ee.internal.webapplication.AuthConstraint
+	 */
+	public void validateAuthConstraint(AuthConstraint authConstraint, Hashtable secRoles) {
 
-  try {
-	warFile = (WARFile) aWarFile;
-	webDD = warFile.getDeploymentDescriptor();
+		EList roleList = authConstraint.getRoles();
 
-	validate();
-
-  } catch (Exception e) {
-  	e.printStackTrace();
-	String[] parms = new String[1];
-	parms[0] = e.toString();  	
-	IMessage errorMsg = new Message(getBaseName(), IMessage.HIGH_SEVERITY, ERROR_WAR_VALIDATION_FAILED, parms);
-	throw new ValidationException(errorMsg);
-  } 
-}
-/**
- * The auth-constraint element indicates the user roles that should
- * be permitted access to this resource collection. The role used here
- * must appear in a security-role-ref element.
- * <!ELEMENT auth-constraint (description?, role-name*)>
- * The role-name element contains the name of a security role.
- * <!ELEMENT role-name (#PCDATA)>
- * Creation date: (7/6/2001 3:39:34 PM)
- * @param authConstraint org.eclipse.jst.j2ee.internal.webapplication.AuthConstraint
- */
-public void validateAuthConstraint(AuthConstraint authConstraint, Hashtable secRoles) {
-	
-	EList roleList = authConstraint.getRoles() ;
-
-	if (roleList != null && !roleList.isEmpty()) {
-		Iterator authRoles = roleList.iterator() ;
-		Hashtable remember = new Hashtable () ;
-		while (authRoles.hasNext()) {  
-			String role = (String)authRoles.next() ;
-			if (role == null || role.trim().equals("")) { //$NON-NLS-1$
-				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Role_Name_19 ; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,authConstraint);
-				continue ;              
+		if (roleList != null && !roleList.isEmpty()) {
+			Iterator authRoles = roleList.iterator();
+			Hashtable remember = new Hashtable();
+			while (authRoles.hasNext()) {
+				String role = (String) authRoles.next();
+				if (role == null || role.trim().equals("")) { //$NON-NLS-1$
+					String[] parms = new String[1];
+					parms[0] = WARValidationResourceHandler.of_Type_Role_Name_19;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, authConstraint);
+					continue;
+				}
+				if (remember.get(role.trim()) != null) {
+					String[] parms = new String[1];
+					parms[0] = role;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, authConstraint);
+					continue;
+				}
+				remember.put(role.trim(), "Yea"); //$NON-NLS-1$
+				validateAuthSecRole("", role, secRoles, authConstraint); //$NON-NLS-1$
 			}
-			if (remember.get (role.trim()) != null) {
-				String[] parms = new String[1];
-				parms[0] = role ;
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms,authConstraint);
-				continue ;              
+		}
+	}
+
+	/**
+	 * Insert the method's description here. Creation date: (7/5/2001 2:20:02 PM)
+	 */
+	public void validateContextParameters() {
+
+		// we must verify that every param-name is unique;
+		// param-name appears in context parameters, filter
+		// and servlets. We must check each.
+		Hashtable remember = new Hashtable();
+
+		// check context parameters - each param-name should be unique within the web application
+		Iterator cparams = webDD.getContexts().iterator();
+		while (cparams.hasNext()) {
+			
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
 			}
-			remember.put(role.trim(),"Yea") ;      //$NON-NLS-1$
-			validateAuthSecRole("",role,secRoles,authConstraint) ; //$NON-NLS-1$
-		}
-	}   
-} 
-/**
- * Insert the method's description here.
- * Creation date: (7/5/2001 2:20:02 PM)
- */
-public void validateContextParameters() {
+			
+			ContextParam context = (ContextParam) cparams.next();
 
-	// we must verify that every param-name is unique;
-	// param-name appears in context parameters, filter
-	// and servlets.  We must check each.
-	Hashtable remember = new Hashtable();
-
-	// check context parameters - each param-name should be unique within the web application
-	Iterator cparams = webDD.getContexts().iterator();
-	while (cparams.hasNext()) {
-		ContextParam context = (ContextParam) cparams.next();
-
-		String name = context.getParamName();
-		if (name != null)
-			name = name.trim();
-
-		if (name == null || name.equals("") ) { //$NON-NLS-1$
-			String[] parms = new String[1];
-			parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25; 
-
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, context);
-			continue;
-		}
-		//if (remember.get(name + value) != null) { // Check for dups
-		if (remember.get(name) != null) { // Check for dups
-			String[] parms = new String[1];
-			parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25 + ": " + name; 
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, context);
-			continue;
-		}
-		//remember.put(name + value, "Yea");
-		remember.put(name, "Yea"); //$NON-NLS-1$
-	} 
-
-
-	// check servlet init-param - each param-name should be unique within a servlet
-	Iterator servlets = webDD.getServlets().iterator();
-	while (servlets.hasNext()) {
-		Servlet nextServlet = (Servlet) servlets.next();
-		Iterator params = nextServlet.getParams().iterator();
-		remember.clear();
-		while (params.hasNext()) {
-			InitParam initParam = (InitParam) params.next();
-			String name = initParam.getParamName();
-
+			String name = context.getParamName();
 			if (name != null)
 				name = name.trim();
 
-			if (name == null || name.equals("") ) { //$NON-NLS-1$ 
+			if (name == null || name.equals("")) { //$NON-NLS-1$
 				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_32; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, initParam);
+				parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25;
+
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, context);
 				continue;
 			}
-			if (remember.get(name) != null) { // Check for dups
-
-				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25 + ": " +  name; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, initParam);
-				continue;
-			}
-			remember.put(name, "Yea"); //$NON-NLS-1$
-		}
-	}
-
-	// check filter init-param - each param-name should be unique within a filter
-	Iterator filters = webDD.getFilters().iterator();
-	while (filters.hasNext()) {
-		Filter nextFilter = (Filter) filters.next();
-		Iterator params = nextFilter.getInitParams().iterator();
-		remember.clear();
-		while (params.hasNext()) {
-			InitParam initParam = (InitParam) params.next();
-			String name = initParam.getParamName();
-
-			if (name != null)
-				name = name.trim();
-
-			if (name == null || name.equals("") ) { //$NON-NLS-1$ 
-				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_39; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, initParam);
-				continue;
-			}
+			// if (remember.get(name + value) != null) { // Check for dups
 			if (remember.get(name) != null) { // Check for dups
 				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25 + ": " +  name; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, initParam);
+				parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25 + ": " + name; //$NON-NLS-1$
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, context);
 				continue;
 			}
+			// remember.put(name + value, "Yea");
 			remember.put(name, "Yea"); //$NON-NLS-1$
 		}
-	}
-	
-}
-/**
-   * Validate EJB references.
-   */
 
-public void validateEJBRefs(EjbRefImpl eref) {
-//  try {
-  	
-  	EARFile earFile = warFile.getEARFile();
-  	EnterpriseBean eb = null;
-  	
-  	if (earFile != null) 
-		eb = earFile.getEnterpiseBeanFromRef(eref, warFile.getURI());
 
-	if (!(eb == null)) {
-	  List ejbRefs = eb.getEjbRefs();
+		// check servlet init-param - each param-name should be unique within a servlet
+		Iterator servlets = webDD.getServlets().iterator();
+		while (servlets.hasNext()) {
+			Servlet nextServlet = (Servlet) servlets.next();
+			Iterator params = nextServlet.getParams().iterator();
+			remember.clear();
+			while (params.hasNext()) {
+				InitParam initParam = (InitParam) params.next();
+				String name = initParam.getParamName();
 
-	  int numRefs = ejbRefs.size();
+				if (name != null)
+					name = name.trim();
 
-	  Set refSet = new HashSet(numRefs);
+				if (name == null || name.equals("")) { //$NON-NLS-1$ 
+					String[] parms = new String[1];
+					parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_32;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, initParam);
+					continue;
+				}
+				if (remember.get(name) != null) { // Check for dups
 
-	  for (int refNo = 0; refNo < numRefs; refNo++) {
-		String nextName = ((EjbRefImpl) (ejbRefs.get(refNo))).getName();
-
-		String[] parms = new String[1];
-		parms[0] = eb.getName();
-		if (!(refSet.add(nextName))) {
-		  addWarning(WAR_CATEGORY, ERROR_EAR_DUPLICATE_ROLES, parms,ejbRefs.get(refNo));
+					String[] parms = new String[1];
+					parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25 + ": " + name; //$NON-NLS-1$
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, initParam);
+					continue;
+				}
+				remember.put(name, "Yea"); //$NON-NLS-1$
+			}
 		}
-	  }
+
+		// check filter init-param - each param-name should be unique within a filter
+		Iterator filters = webDD.getFilters().iterator();
+		while (filters.hasNext()) {
+			Filter nextFilter = (Filter) filters.next();
+			Iterator params = nextFilter.getInitParams().iterator();
+			remember.clear();
+			while (params.hasNext()) {
+				InitParam initParam = (InitParam) params.next();
+				String name = initParam.getParamName();
+
+				if (name != null)
+					name = name.trim();
+
+				if (name == null || name.equals("")) { //$NON-NLS-1$ 
+					String[] parms = new String[1];
+					parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_39;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, initParam);
+					continue;
+				}
+				if (remember.get(name) != null) { // Check for dups
+					String[] parms = new String[1];
+					parms[0] = WARValidationResourceHandler.of_Type_Parameter_Name_25 + ": " + name;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, initParam);
+					continue;
+				}
+				remember.put(name, "Yea"); //$NON-NLS-1$
+			}
+		}
+
 	}
 
-//  } catch (UncontainedModuleFileException ue) {
-//	String[] parms = new String[1];
-//	parms[0] = warFile.getName();
-//  addError(EREF_CATEGORY, ERROR_EAR_UNCONTAINED_MODULE_FILE_EXCEPTION, parms);
-//  }
-}
+	/**
+	 * Validate EJB references.
+	 */
+
+	public void validateEJBRefs(EjbRefImpl eref) {
+		// try {
+
+		EARFile earFile = warFile.getEARFile();
+		EnterpriseBean eb = null;
+
+		if (earFile != null)
+			eb = earFile.getEnterpiseBeanFromRef(eref, warFile.getURI());
+
+		if (!(eb == null)) {
+			List ejbRefs = eb.getEjbRefs();
+
+			int numRefs = ejbRefs.size();
+
+			Set refSet = new HashSet(numRefs);
+
+			for (int refNo = 0; refNo < numRefs; refNo++) {
+				String nextName = ((EjbRefImpl) (ejbRefs.get(refNo))).getName();
+
+				String[] parms = new String[1];
+				parms[0] = eb.getName();
+				if (!(refSet.add(nextName))) {
+					addWarning(WAR_CATEGORY, ERROR_EAR_DUPLICATE_ROLES, parms, ejbRefs.get(refNo));
+				}
+			}
+		}
+
+		// } catch (UncontainedModuleFileException ue) {
+		// String[] parms = new String[1];
+		// parms[0] = warFile.getName();
+		// addError(EREF_CATEGORY, ERROR_EAR_UNCONTAINED_MODULE_FILE_EXCEPTION, parms);
+		// }
+	}
+
 	/**
 	 * validate for duplicates in EAR Roles
 	 */
 
-	public void validateEJBRefs(List ejbRefs)
-	{
+	public void validateEJBRefs(List ejbRefs) {
 		int numRefs = ejbRefs.size();
-		Hashtable remember = new Hashtable() ;
+		Hashtable remember = new Hashtable();
 		for (int refNo = 0; refNo < numRefs; refNo++) {
 			EjbRefImpl eref = (EjbRefImpl) ejbRefs.get(refNo);
 			if (eref.isSetType()) {
 				String type = eref.getType().getName();
-				if ( type == null ) {
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EJB_REF_TYPE, null,eref);	// Type must be of ENTITY or FOO									
+				if (type == null) {
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EJB_REF_TYPE, null, eref); // Type
+																										// must
+																										// be
+																										// of
+																										// ENTITY
+																										// or
+																										// FOO
 				}
 			}
 			if (eref.getName() != null) {
-				String  name = eref.getName();
+				String name = eref.getName();
 				name = name.trim();
 
 				if (name.equals("")) { //$NON-NLS-1$
 					String[] parms = new String[1];
-					parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44; 
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,eref);
-					continue ;
-				}           
-				if (remember.get(name) != null) {  // check for duplicates
-					String[] parms = new String[1];
-					parms[0] = name ;
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_EJB_REF, parms,eref);
-					continue ;
+					parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, eref);
+					continue;
 				}
-				remember.put(name,"Yea") ; //$NON-NLS-1$
+				if (remember.get(name) != null) { // check for duplicates
+					String[] parms = new String[1];
+					parms[0] = name;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_EJB_REF, parms, eref);
+					continue;
+				}
+				remember.put(name, "Yea"); //$NON-NLS-1$
 			} else {
 				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,eref);
-				continue ;
+				parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, eref);
+				continue;
 			}
 
 
@@ -506,825 +548,870 @@
 			validateEJBRefManadatoryElements(eref, webDD.getDisplayName());
 		}
 	}
-	
-	
+
+
 	/**
 	 * validate for duplicates in EAR Roles
 	 */
 
-	public void validateEJBLocalRefs(List ejbRefs)
-	{
+	public void validateEJBLocalRefs(List ejbRefs) {
 		int numRefs = ejbRefs.size();
-		Hashtable remember = new Hashtable() ;
+		Hashtable remember = new Hashtable();
 		for (int refNo = 0; refNo < numRefs; refNo++) {
 			EJBLocalRefImpl eref = (EJBLocalRefImpl) ejbRefs.get(refNo);
 			if (eref.isSetType()) {
 				String type = eref.getType().getName();
-				if ( type == null ) {
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EJB_REF_TYPE, null,eref);	// Type must be of ENTITY or FOO									
+				if (type == null) {
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EJB_REF_TYPE, null, eref); // Type
+																										// must
+																										// be
+																										// of
+																										// ENTITY
+																										// or
+																										// FOO
 				}
 			}
 			if (eref.getName() != null) {
-				String  name = eref.getName();
-				name = name.trim() ;
-	
+				String name = eref.getName();
+				name = name.trim();
+
 				if (name.equals("")) { //$NON-NLS-1$
 					String[] parms = new String[1];
-					parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44; 
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,eref);
-					continue ;
+					parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, eref);
+					continue;
 				}
-				if (remember.get(name) != null) {  // check for duplicates
+				if (remember.get(name) != null) { // check for duplicates
 					String[] parms = new String[1];
-					parms[0] = name ;
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_EJB_REF, parms,eref);
-					continue ;
+					parms[0] = name;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_EJB_REF, parms, eref);
+					continue;
 				}
-				remember.put(name,"Yea") ; //$NON-NLS-1$
+				remember.put(name, "Yea"); //$NON-NLS-1$
 			} else {
 				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,eref);
-				continue ;
+				parms[0] = WARValidationResourceHandler.of_Type_ejb_ref_name_44;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, eref);
+				continue;
 			}
 
 
-//			validateEJBRefs(eref);
-//			validateEJBRefManadatoryElements(eref, webDD.getDisplayName());
-		}
-	}	
-	
-/**
-   * Link build should verify location of exception class
-   */
-
-public void validateErrorPages(EList errorPageList) {
-  Iterator errorPages = errorPageList.iterator();
-
-  if (errorPageList == null || errorPageList.isEmpty()) return ;
-
-  while (errorPages.hasNext()) {
-	ErrorPage nextPage = (ErrorPage) errorPages.next();
-	String location = nextPage.getLocation() ;
-	if (location == null || location.equals("")) { //$NON-NLS-1$
-		String[] parms = new String[1];
-		parms[0] = WARValidationResourceHandler.of_Type_Error_Location_47 ; 
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,nextPage);
-	}
-	if (!location.startsWith("/")){ //$NON-NLS-1$
-		String[] parms = new String[1];
-		parms[0] = WARValidationResourceHandler.of_Type_Error_Location_49 ; 
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_ERROR_PAGE, parms,nextPage);
-	}
-
-
-	// check for valid HTTP error code - must be an Integer, 3 digits, and the starting
-	// digit must be a 1,2,3,4, or 5.
-	if (nextPage.isErrorCode()) {
-		ErrorCodeErrorPage ecep = (ErrorCodeErrorPage) nextPage;
-		String errorCode = ecep.getErrorCode();
-		
-		boolean valid = false;
-		if ( errorCode.length() == 3 ) {
-			try {
-				Integer tempInt = new Integer(errorCode);
-				// ok, it's a valid 3-digit integer
-				int code = tempInt.intValue();
-				if ( code >= 100 && code < 600 ) {
-					// valid HTTP status code - starting digit must be between 1-5			
-					valid = true;
-				}
-			}
-			catch(NumberFormatException exc) {
-				//Ignore
-			}
-		}
-		if ( !valid ) {
-			String[] parms = new String[1];
-			parms[0] = errorCode;
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_ERROR_CODE, parms, ecep);									
-		}
-		
-	}
-	
-	// If exception-type...  the specified class must be or inherit from java.lang.Throwable
-	else if (nextPage.isExceptionType()) {
-		ExceptionTypeErrorPage etep = (ExceptionTypeErrorPage)nextPage;
-		JavaClass javaType = etep.getExceptionType();
-		String exceptionType = "java.lang.Throwable";//$NON-NLS-1$
-		String specifiedClassName = etep.getExceptionTypeName();
-		if ( javaType != null ) {
-			ResourceSet lookupSet = javaType.eResource().getResourceSet();		
-			if (lookupSet != null) 
-			{
-				if (!javaType.inheritsFrom(JavaRefFactory.eINSTANCE.reflectType(exceptionType, lookupSet).getWrapper())) {								
-					String[] parms = new String[1];
-					parms[0] = specifiedClassName;
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EXCEPTION_TYPE, parms, etep);
-				}									
-			}
-		}
-		else {
-			String[] parms = new String[1];
-			parms[0] = "";//$NON-NLS-1$
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EXCEPTION_TYPE, parms, etep);
-		}		 
-		// TBD
-	}
-	else {  // Error Code
-		// TBD
-	}
-
-	// TBD remember location/code/exception dups    
-  }
-
-}
-
-/**
- * Validate the loginConfig section is correct
- */
-public void validateLoginConfig( LoginConfig loginConfig ) {
-	//com.ibm.etools.validate.ValidatorManager.setResourceUtilClass(com.ibm.etools.validate.ui.UIResourceUtil.class);
-
-	if ( loginConfig != null ) {
-		String auth = loginConfig.getAuthMethod().getName();
-	
-		if ( auth == null ) {
-			String[] parms = new String[0];
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_AUTH_METHOD, parms,loginConfig);
-		}
-		// Give a warning if form elements are supplied but FORM auth method is not used
-		else if ( !auth.equals( "FORM" ) ) { //$NON-NLS-1$
-			FormLoginConfig cfg = loginConfig.getFormLoginConfig();			
-			if ( cfg != null ) {			
-				String[] parms = new String[1];
-				parms[0] = auth ;
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_IGNORE_FORM_LOGIN, parms,loginConfig);		
-			}			
-		}
-	}
-}
-
-/**
- * Validate the loginConfig section is correct
- */
-public void validateEnvironmentEntries( EList envEntries ) {
-  if (envEntries.isEmpty()) return ;
- 
-  //boolean isVersion22 = warFile.getDeploymentDescriptor().isVersion2_2Descriptor(); 
-  Iterator entries = envEntries.iterator();
-  Hashtable remember = new Hashtable() ;
- 
-  while (entries.hasNext()) {
-  	EnvEntry entry = (EnvEntry)entries.next();
-  	if ( entry.getType().getName() == null ) {
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_ENV_ENTRY, null,entry);					  			
-  	}
-  	
-  	// check for duplicate env-entry-name's
-  	String name = entry.getName();
-  	if ( name != null ) {
-  		if (remember.get(name) != null) {   // Check for dups
-		  String[] parms = new String[1];
-		  parms[0] = WARValidationResourceHandler.of_Type_Env_Entry_Name___88 +  ": " + name; 
-		  addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms,entry);
-	    }
-	    else {
-	  	  remember.put(name,"Yea") ;         //$NON-NLS-1$
-	    }
-  	}		 	
-  }
-
-}
-
-
-/**
- * Insert the method's description here.
- * Creation date: (7/5/2001 12:11:23 PM)
- */
-public void validateMimeMapping() {
-
-	if (webDD.getMimeMappings().isEmpty()) return ;
-	
-	Iterator mimes = webDD.getMimeMappings().iterator() ;
-	Hashtable remember = new Hashtable() ;
-	
-	while (mimes.hasNext()) {   
-	  MimeMapping mimeMap = (MimeMapping) mimes.next();
-	  
-	  String ext = mimeMap.getExtension() ;
-	  String mtype = mimeMap.getMimeType() ;
-	  if (ext != null)
-		  ext = ext.trim() ;
-	  if (mtype != null)
-		  mtype = mtype.trim() ;
-	  
-	  if (ext == null || ext.equals("") || mtype == null || mtype.equals("")) { //$NON-NLS-1$ //$NON-NLS-2$
-		  String[] parms = new String[1];
-		  if (ext == null || ext.trim().equals("")) //$NON-NLS-1$
-			 parms[0] = WARValidationResourceHandler.of_Type_Mime_Extension_54 ;    
-		  else
-			 parms[0] = WARValidationResourceHandler.of_Type_Mime_Type_55 ; 
-		  addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,mimeMap);
-		  continue ;          
-	  }
-	  if (remember.get(ext) != null) {   // Check for dups
-
-		  String[] parms = new String[1];
-		  parms[0] = WARValidationResourceHandler.of_Type_Mime_Extension___56 + ": " + ext ; 
-		  addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms,mimeMap);
-		  continue ;
-	  }
-	  remember.put(ext,"Yea") ;         //$NON-NLS-1$
-	}
-}
-/**
- * Insert the method's description here.
- * Creation date: (7/5/2001 11:46:58 AM)
- */
-public void validateOther() {
-
-	 SessionConfig sessionCfg = webDD.getSessionConfig() ;
-	 if (sessionCfg != null) {
-		int timeout = sessionCfg.getSessionTimeout() ;
-		if (timeout == 0) {
-		   addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_SESSION_TIMEOUT, null,sessionCfg);
-		}
-	 }
-	
-	
-	
-}
-/**
- * validateRefs(WebApp)
- *     - validate EJB and resource references
- *     - details tbd
- */
-
-public void validateRefs() {
-	EList ejbRefs = webDD.getEjbRefs();
-
-	if (!ejbRefs.isEmpty())
-		validateEJBRefs(ejbRefs);
-
-
-	EList ejblocalRefs = webDD.getEjbLocalRefs();
-
-	if (!ejblocalRefs.isEmpty())
-		validateEJBLocalRefs(ejblocalRefs);
-
-
-	EList resourceRefs = webDD.getResourceRefs();
-
-	if (!resourceRefs.isEmpty()) {
-		//validateResourceRefs(resourceRefs);  // we want to do additional checks here
-
-		int numRefs = resourceRefs.size();
-		Set refSet = new HashSet(numRefs);
-		boolean isVersion22 = warFile.getDeploymentDescriptor().getVersionID() <= J2EEVersionConstants.WEB_2_2_ID;
-		
-		for (int refNo = 0; refNo < numRefs; refNo++) {
-			ResourceRefImpl ref = (ResourceRefImpl) (resourceRefs.get(refNo));
-			String auth = ref.getAuth().getName();
-
-			// Check: a res-auth element containing Container or Application must be supplied
-			if (auth == null || !ref.isSetAuth()) {
-				String[] parms = new String[1];
-				parms[0] = ref.getName();
-				String msgId = isVersion22 ? MESSAGE_WAR_VALIDATION_RES_AUTH_REQUIRED_22 : MESSAGE_WAR_VALIDATION_RES_AUTH_REQUIRED_23;	
-				addError(WAR_CATEGORY, msgId, parms,ref);		
-			} else
-			if (isVersion22 && auth.equals("Application")) { //$NON-NLS-1$
-				String[] parms = new String[1];
-				parms[0] = ref.getName();
-				addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_RES_AUTH_INVALID_22, parms,ref);
-			} else
-			if (!isVersion22 && auth.equals("SERVLET")) { //$NON-NLS-1$
-				String[] parms = new String[1];
-				parms[0] = ref.getName();
-				addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_RES_AUTH_INVALID_23, parms,ref);
-			}
-
-			// validate res-sharing-scope is allowable value
-			String sharingScope = ref.getResSharingScope().getName();
-			if ( !isVersion22 ) {
-				if ( sharingScope == null || !ref.isSetResSharingScope()) {
-					String[] parms = new String[0];
-					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_RES_SHARING_SCOPE, parms, ref);					
-				}
-			}
-
-			String refName = ref.getName();
-			String[] parms = new String[1];
-			parms[0] = refName;
-			if (!(refSet.add(refName)))
-				addError(
-					EREF_CATEGORY,
-					ERROR_EAR_DUPLICATE_RESREF,
-					parms,
-					ref);
+			// validateEJBRefs(eref);
+			// validateEJBRefManadatoryElements(eref, webDD.getDisplayName());
 		}
 	}
 
-}
-	
-	
-/**
- * Insert the method's description here.
- * Creation date: (7/6/2001 4:11:09 PM)
- * @return boolean
- * @param role java.lang.String
- * @param defineRoles java.util.Hashtable
- * 
- * The auth-constraint only needs to have role-name specified.
- * 		<auth-constraint>
- *			<description></description> 
- *			<role-name>guest</role-name> 
- *		</auth-constraint>
- * 
- */
-protected  void validateAuthSecRole(String link, String role, Hashtable definedRoles, EObject targetObject) {
-	String rName = role ;
-	String lName = link;
-//	boolean validRole = true;
-//	boolean validLink = true;
-	
-	if (rName!= null) rName= rName.trim() ;
-	if (lName!= null) lName= lName.trim() ;	
-	
-	if ( rName != null ) {
-		if (!rName.equals("*") && !rName.equals("")) { //$NON-NLS-1$ //$NON-NLS-2$	
-			if (definedRoles.get(rName) == null && definedRoles.get(lName) == null) {
-				String[] parms = new String[1];
-				parms[0] = rName;
-				addError(
-					WAR_CATEGORY,
-					MESSAGE_WAR_VALIDATION_INVALID_SEC_ROLE_NAME,
-					parms,
-					targetObject);
-			}
-		}
-	}
-}	
-	
-	
-	
-	
-/**
- * Insert the method's description here.
- * Creation date: (7/6/2001 4:11:09 PM)
- * @return boolean
- * @param role java.lang.String
- * @param defineRoles java.util.Hashtable
- * 
- * 
- * the security-role-ref must have a non-null role-name and the role-link
- * must contain the name of a role specified in the security-role section
- * 		<security-role-ref> 
- *			<role-name>MyName</role-name>
- *			<role-link>ExistingRole</role-link> 
- *		</security-role-ref>
- * 
- * 
- */
-protected  void validateSecRole(String link, String role, Hashtable definedRoles, EObject targetObject) {
-	String rName = role ;
-	String lName = link;
-//	boolean validRole = true;
-//	boolean validLink = true;
-	
-	if (rName!= null) rName= rName.trim() ;
-	if (lName!= null) lName= lName.trim() ;	
-
-
-	// the security role-name cannot be null
-	if ( (rName == null || rName.equals("")) ) {	 //$NON-NLS-1$
-		String[] parms = new String[1];
-		parms[0] = rName;
-		addError(
-			WAR_CATEGORY,
-			MESSAGE_WAR_VALIDATION_INVALID_SEC_ROLE_NAME,
-			parms,
-			targetObject);
-	}						
-
-	if (rName == null || !rName.equals("*") ) { //$NON-NLS-1$		
-		// check that security role-link matches a defines security role
-		if (lName != null && definedRoles.get(lName) == null) {
-
-			String[] parms = new String[1];
-			parms[0] = lName;
-			addError(
-				WAR_CATEGORY,
-				MESSAGE_WAR_VALIDATION_INVALID_SEC_ROLE,
-				parms,
-				targetObject);
-		}
-	}
-}
-
-/**
-   * validateSecurity(WebApp)
-   *     - validate security constraints, roles, and security role refs
-   *     - details tbd
-   */
-
-public void validateSecurityAndServlets() {
-
-	  
-	EList webRoles = webDD.getSecurityRoles();
-
-	// Validate security roles
-	Hashtable secRoles = getAndValidateSecurityRoles(webRoles) ;
-
-	// Validate Servlets/JSPs and their role ref.
-	validateServlets(webDD.getServlets(),secRoles);
-
-	validateSecurityConstraints(webDD.getConstraints(), secRoles) ;
-
-//	try {
-	 if (!(webRoles.isEmpty())) {
-	  EARFile module = warFile.getEARFile();
-	  if (module != null) {
-		  EList earRoleList = module.getDeploymentDescriptor().getSecurityRoles();
-		  validateWEBRolesWithEARRoles(earRoleList, webRoles);
-	  }
-	 }
-//	} catch (UncontainedModuleFileException ue) {
-//	  String[] parms = new String[1];
-//	  parms[0] = warFile.getName();
-//    addError(EREF_CATEGORY, ERROR_EAR_UNCONTAINED_MODULE_FILE_EXCEPTION, parms);
-//	}
-}
-/**
- * The security-constraint element is used to associate security
- * constraints with one or more web resource collections
- * <!ELEMENT security-constraint (web-resource-collection+,
- *           auth-constraint?, user-data-constraint?)>
- * 
- * @param constraints org.eclipse.emf.common.util.EList
- */
-public void validateSecurityConstraints(EList constraints, Hashtable secRoles) {
-	
-  if (constraints.isEmpty()) return ;
- 
-  Iterator constList = constraints.iterator();
-  while (constList.hasNext()) {
-	  SecurityConstraint constraint = (SecurityConstraint) constList.next() ;
-
-	  EList webResourceList = constraint.getWebResourceCollections() ;
-	  if (webResourceList == null || webResourceList.isEmpty()) {
-		  String[] parms = new String[1];
-		  parms[0] = WARValidationResourceHandler.of_Type_Web_Resource_Collection_64 ; 
-		  addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,constraint);
-		  continue ;          
-	  }   
-	  validateWebResourceCollections (webResourceList) ;
-
-	  AuthConstraint authConstraint = constraint.getAuthConstraint() ;
-	  if (authConstraint != null)  validateAuthConstraint(authConstraint,secRoles) ;
-
-	  UserDataConstraint dataConstraint = constraint.getUserDataConstraint() ;
-	  if (dataConstraint != null && dataConstraint.getTransportGuarantee() != null) {
-		 //   <!ELEMENT user-data-constraint (description?, transport-guarantee)>
-		 // The transport-guarantee element specifies that the communication
-		 // between client and server should be NONE, INTEGRAL, or
-		 // CONFIDENTIAL. 
-
-//		  EEnumLiteral transport = dataConstraint.getTransportGuarantee();
-		  TransportGuaranteeType transport = dataConstraint.getTransportGuarantee();
-		  if (transport == null || !dataConstraint.isSetTransportGuarantee() ) {
-			   addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_TRANSPORT, new String[0], dataConstraint);
-		 }
-	  }
-  }        
-}
-
-public void validateFilters(EList filterList){
-		if (filterList.isEmpty()) return ;
-		
-		Iterator filters = filterList.iterator();
-
-		Hashtable remember = new Hashtable() ;
-
-		while (filters.hasNext()) {
-			Filter nextFilter = (Filter) filters.next();
-			String  name = nextFilter.getName() ;
-			if (name != null)  name = name.trim() ;
-
-			if (name == null || name.equals("")) { //$NON-NLS-1$
-				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Filter_Name_66 ; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,nextFilter);
-				continue ;
-			}           
-			if (remember.get(name) != null) {  // check for duplicates
-				String[] parms = new String[1];
-				parms[0] = name ;
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_FILTER, parms,nextFilter);
-				continue ;
-			}
-			remember.put(name,"Yea") ; //$NON-NLS-1$
-		}
-}
-
-/**
-   * validateFilterMappings(Elist(Filters's))
-   *     - for each filter mapping, make sure the named filter exists
-   */
-public void validateFilterMappings(EList filterMappingsList) {
-
-  if (filterMappingsList.isEmpty()) return ;
- 
-  Iterator filterMappings = filterMappingsList.iterator();
-  while (filterMappings.hasNext()) {
-	FilterMapping nextMapping = (FilterMapping) filterMappings.next();
-
-	// Mapping can be either servlet or url	
-	if ( nextMapping.getUrlPattern() != null ) {
-		String[] parms = new String[1];
-		String url = nextMapping.getUrlPattern();
-		parms[0] = url ;
-		if ( url == null ) {
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms,nextMapping);
-			continue;
-		}
-		if ( nextMapping.getFilter() == null || nextMapping.getFilter().equals("" ) ) { //$NON-NLS-1$
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_FILTER_MAPPING, parms,nextMapping);		
-			continue;
-		}
-		
-		// Is is a valid URI notation ?
-		try {
-		   if (url.equals("")) throw new Exception(WARValidationResourceHandler.Invalid_URL_70) ; 
-		// You can't use com.ibm.webtools.URI here...
-		//       com.ibm.iwt.webtools.URI uri = new com.ibm.iwt.webtools.URI(url) ;
-		}
-		catch (Exception e) {
-		  parms = new String[1];
-		  parms[0] = nextMapping.getUrlPattern();
-		  addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms,nextMapping);
-		  continue ;
-		}			
-	}
-	else if ( nextMapping.getServletName() != null ) {
-		String[] parms = new String[1];
-		String servletName = nextMapping.getServletName();
-		parms[0] = servletName ;
-		if ( nextMapping.getServlet() == null ) {
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_SERVLET_MAPPING, parms,nextMapping);
-			continue;
-		}
-		if ( nextMapping.getFilter() == null || nextMapping.getFilter().equals("" ) ) { //$NON-NLS-1$
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_FILTER_MAPPING, parms,nextMapping);		
-			continue;
-		}	
-	}
-//	else {
-//		// otherwise neither servlet-name or url-mapping is defined - this gets flagged by the xml validator
-//		// as this does not conform to the DTD
-//		
-//	}	
-
-
-  }
-
-}
-
-
-
-
-
-
-/**
-   * validateServlets(Elist(Servlet's))
-   *     - for each servlet mapping, make sure the named servlet exists
-   */
-
-public void validateServletMappings(EList servletMappingsList) {
-
-  if (servletMappingsList.isEmpty()) return ;
- 
-  Iterator servletMappings = servletMappingsList.iterator();
-
-  Hashtable remember = new Hashtable() ;
-  while (servletMappings.hasNext()) {
-	ServletMapping nextMapping = (ServletMapping) servletMappings.next();
-	String url = nextMapping.getUrlPattern() ;
-
-	// Check for null servlet, if the name is right the reflection
-	// has already resolved it.
-
-	if (url != null) {      // check for duplicate first, no need to repeat earlier error,
-	  url = url.trim () ;
-	  if (remember.get(url)!=null) {
-		String[] parms = new String[1];
-		parms[0] = nextMapping.getUrlPattern();
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_MAPPING, parms,nextMapping);
-		continue ;
-	  }
-	  remember.put(nextMapping.getUrlPattern(),"Yea") ; //$NON-NLS-1$
-	}
-	  
-
-	if (url == null || nextMapping.getServlet() == null || nextMapping.getServlet().equals("")){ //$NON-NLS-1$
-	  String[] parms = new String[1];
-	  parms[0] = url ;
-	  if (url == null)
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms,nextMapping);
-	  else
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_SERVLET_MAPPING, parms,nextMapping);
-	  continue ;
-	}
-
-	// Is is a valid URI notation ?
-	try {
-	   if (url.equals("")) throw new Exception(WARValidationResourceHandler.Invalid_URL_75) ; 
-
-//
-// The spec does not prohibit whitespace in the url-patterns
-//	   
-//	   // check to see if the string is a valid URL- has no white space
-//	   char[] chars = url.toCharArray();
-//	   int len = chars.length;
-//	   for (int cnt = 0; cnt < chars.length; cnt++)
-//	   {
-//	   	  if (Character.isWhitespace(chars[cnt]))
-//	   	  	throw new Exception("Invalid URL") ;
-//	   }
-// You can't use com.ibm.webtools.URI here...
-//       com.ibm.iwt.webtools.URI uri = new com.ibm.iwt.webtools.URI(url) ;
-	}
-	catch (Exception e) {
-	  String[] parms = new String[1];
-	  parms[0] = nextMapping.getUrlPattern();
-	  addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms,nextMapping);
-	  continue ;
-	}
-  }
-
-}
 	/**
-	 * validateServlets(Elist(Servlet's))
-	 *     - if it's a JSP, verify the file exists
-	 *     - validate optional security role refs for existence of
-	 *       the security role
+	 * Link build should verify location of exception class
 	 */
 
-	public void validateServlets(EList servletList, Hashtable secRoles)
-	{
-		if (servletList.isEmpty()) return ;
-		
-		Iterator servlets = servletList.iterator();
+	public void validateErrorPages(EList errorPageList) {
+		Iterator errorPages = errorPageList.iterator();
 
-		Hashtable remember = new Hashtable() ;
+		if (errorPageList == null || errorPageList.isEmpty())
+			return;
 
-		while (servlets.hasNext()) {
-			Servlet nextServlet = (Servlet) servlets.next();
-			String  name = nextServlet.getServletName() ;
-			if (name != null)  name = name.trim() ;
+		while (errorPages.hasNext()) {
+			
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			ErrorPage nextPage = (ErrorPage) errorPages.next();
+			String location = nextPage.getLocation();
+			if (location == null || location.equals("")) { //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Error_Location_47;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, nextPage);
+			}
+			if (!location.startsWith("/")) { //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Error_Location_49;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_ERROR_PAGE, parms, nextPage);
+			}
+
+
+			// check for valid HTTP error code - must be an Integer, 3 digits, and the starting
+			// digit must be a 1,2,3,4, or 5.
+			if (nextPage.isErrorCode()) {
+				ErrorCodeErrorPage ecep = (ErrorCodeErrorPage) nextPage;
+				String errorCode = ecep.getErrorCode();
+
+				boolean valid = false;
+				if (errorCode.length() == 3) {
+					try {
+						Integer tempInt = new Integer(errorCode);
+						// ok, it's a valid 3-digit integer
+						int code = tempInt.intValue();
+						if (code >= 100 && code < 600) {
+							// valid HTTP status code - starting digit must be between 1-5
+							valid = true;
+						}
+					} catch (NumberFormatException exc) {
+						// Ignore
+					}
+				}
+				if (!valid) {
+					String[] parms = new String[1];
+					parms[0] = errorCode;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_ERROR_CODE, parms, ecep);
+				}
+
+			}
+
+			// If exception-type... the specified class must be or inherit from java.lang.Throwable
+			else if (nextPage.isExceptionType()) {
+				ExceptionTypeErrorPage etep = (ExceptionTypeErrorPage) nextPage;
+				JavaClass javaType = etep.getExceptionType();
+				String exceptionType = "java.lang.Throwable";//$NON-NLS-1$
+				String specifiedClassName = etep.getExceptionTypeName();
+				if (javaType != null) {
+					ResourceSet lookupSet = javaType.eResource().getResourceSet();
+					if (lookupSet != null) {
+						if (!javaType.inheritsFrom(JavaRefFactory.eINSTANCE.reflectType(exceptionType, lookupSet).getWrapper())) {
+							String[] parms = new String[1];
+							parms[0] = specifiedClassName;
+							addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EXCEPTION_TYPE, parms, etep);
+						}
+					}
+				} else {
+					String[] parms = new String[1];
+					parms[0] = "";//$NON-NLS-1$
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_EXCEPTION_TYPE, parms, etep);
+				}
+				// TBD
+			} else { // Error Code
+				// TBD
+			}
+
+			// TBD remember location/code/exception dups
+		}
+
+	}
+
+	/**
+	 * Validate the loginConfig section is correct
+	 */
+	public void validateLoginConfig(LoginConfig loginConfig) {
+		// com.ibm.etools.validate.ValidatorManager.setResourceUtilClass(com.ibm.etools.validate.ui.UIResourceUtil.class);
+
+		if (loginConfig != null) {
+			String auth = loginConfig.getAuthMethod().getName();
+
+			if (auth == null) {
+				String[] parms = new String[0];
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_AUTH_METHOD, parms, loginConfig);
+			}
+			// Give a warning if form elements are supplied but FORM auth method is not used
+			else if (!auth.equals("FORM")) { //$NON-NLS-1$
+				FormLoginConfig cfg = loginConfig.getFormLoginConfig();
+				if (cfg != null) {
+					String[] parms = new String[1];
+					parms[0] = auth;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_IGNORE_FORM_LOGIN, parms, loginConfig);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Validate the loginConfig section is correct
+	 */
+	public void validateEnvironmentEntries(EList envEntries) {
+		if (envEntries.isEmpty())
+			return;
+
+		// boolean isVersion22 = warFile.getDeploymentDescriptor().isVersion2_2Descriptor();
+		Iterator entries = envEntries.iterator();
+		Hashtable remember = new Hashtable();
+
+		while (entries.hasNext()) {
+			EnvEntry entry = (EnvEntry) entries.next();
+			if (entry.getType().getName() == null) {
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_ENV_ENTRY, null, entry);
+			}
+
+			// check for duplicate env-entry-name's
+			String name = entry.getName();
+			if (name != null) {
+				if (remember.get(name) != null) { // Check for dups
+					String[] parms = new String[1];
+					parms[0] = WARValidationResourceHandler.of_Type_Env_Entry_Name___88 + ": " + name;
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, entry);
+				} else {
+					remember.put(name, "Yea"); //$NON-NLS-1$
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Insert the method's description here. Creation date: (7/5/2001 12:11:23 PM)
+	 */
+	public void validateMimeMapping() {
+
+		if (webDD.getMimeMappings().isEmpty())
+			return;
+
+		Iterator mimes = webDD.getMimeMappings().iterator();
+		Hashtable remember = new Hashtable();
+
+		while (mimes.hasNext()) {
+			
+			if( _reporter.isCancelled()){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);				
+			}
+			MimeMapping mimeMap = (MimeMapping) mimes.next();
+
+			String ext = mimeMap.getExtension();
+			String mtype = mimeMap.getMimeType();
+			if (ext != null)
+				ext = ext.trim();
+			if (mtype != null)
+				mtype = mtype.trim();
+
+			if (ext == null || ext.equals("") || mtype == null || mtype.equals("")) { //$NON-NLS-1$ //$NON-NLS-2$
+				String[] parms = new String[1];
+				if (ext == null || ext.trim().equals("")) //$NON-NLS-1$
+					parms[0] = WARValidationResourceHandler.of_Type_Mime_Extension_54;
+				else
+					parms[0] = WARValidationResourceHandler.of_Type_Mime_Type_55;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, mimeMap);
+				continue;
+			}
+			if (remember.get(ext) != null) { // Check for dups
+
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Mime_Extension___56 + ": " + ext;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, mimeMap);
+				continue;
+			}
+			remember.put(ext, "Yea"); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * Insert the method's description here. Creation date: (7/5/2001 11:46:58 AM)
+	 */
+	public void validateOther() {
+
+		SessionConfig sessionCfg = webDD.getSessionConfig();
+		if (sessionCfg != null) {
+			int timeout = sessionCfg.getSessionTimeout();
+			if (timeout == 0) {
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_SESSION_TIMEOUT, null, sessionCfg);
+			}
+		}
+
+
+
+	}
+
+	/**
+	 * validateRefs(WebApp) - validate EJB and resource references - details tbd
+	 */
+
+	public void validateRefs() {
+		EList ejbRefs = webDD.getEjbRefs();
+
+		if (!ejbRefs.isEmpty())
+			validateEJBRefs(ejbRefs);
+
+
+		EList ejblocalRefs = webDD.getEjbLocalRefs();
+
+		if (!ejblocalRefs.isEmpty())
+			validateEJBLocalRefs(ejblocalRefs);
+
+
+		EList resourceRefs = webDD.getResourceRefs();
+
+		if (!resourceRefs.isEmpty()) {
+			// validateResourceRefs(resourceRefs); // we want to do additional checks here
+
+			int numRefs = resourceRefs.size();
+			Set refSet = new HashSet(numRefs);
+			boolean isVersion22 = warFile.getDeploymentDescriptor().getVersionID() <= J2EEVersionConstants.WEB_2_2_ID;
+
+			for (int refNo = 0; refNo < numRefs; refNo++) {
+				
+				if( _reporter.isCancelled() ){
+					String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+					status = WTPCommonPlugin.createCancelStatus(msg);
+				}
+				
+				ResourceRefImpl ref = (ResourceRefImpl) (resourceRefs.get(refNo));
+				String auth = ref.getAuth().getName();
+
+				// Check: a res-auth element containing Container or Application must be supplied
+				if (auth == null || !ref.isSetAuth()) {
+					String[] parms = new String[1];
+					parms[0] = ref.getName();
+					String msgId = isVersion22 ? MESSAGE_WAR_VALIDATION_RES_AUTH_REQUIRED_22 : MESSAGE_WAR_VALIDATION_RES_AUTH_REQUIRED_23;
+					addError(WAR_CATEGORY, msgId, parms, ref);
+					
+				} else if (isVersion22 && auth.equals("Application")) { //$NON-NLS-1$
+					String[] parms = new String[1];
+					parms[0] = ref.getName();
+					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_RES_AUTH_INVALID_22, parms, ref);
+				} else if (!isVersion22 && auth.equals("SERVLET")) { //$NON-NLS-1$
+					String[] parms = new String[1];
+					parms[0] = ref.getName();
+					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_RES_AUTH_INVALID_23, parms, ref);
+				}
+
+				// validate res-sharing-scope is allowable value
+				String sharingScope = ref.getResSharingScope().getName();
+				if (!isVersion22) {
+					if (sharingScope == null || !ref.isSetResSharingScope()) {
+						String[] parms = new String[0];
+						addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_RES_SHARING_SCOPE, parms, ref);
+					}
+				}
+
+				String refName = ref.getName();
+				String[] parms = new String[1];
+				parms[0] = refName;
+				if (!(refSet.add(refName))){
+					addError(EREF_CATEGORY, ERROR_EAR_DUPLICATE_RESREF, parms, ref);
+				}
+			}
+		}
+
+	}
+
+
+	/**
+	 * Insert the method's description here. Creation date: (7/6/2001 4:11:09 PM)
+	 * 
+	 * @return boolean
+	 * @param role
+	 *            java.lang.String
+	 * @param defineRoles
+	 *            java.util.Hashtable
+	 * 
+	 * The auth-constraint only needs to have role-name specified. <auth-constraint> <description></description>
+	 * <role-name>guest</role-name> </auth-constraint>
+	 * 
+	 */
+	protected void validateAuthSecRole(String link, String role, Hashtable definedRoles, EObject targetObject) {
+		String rName = role;
+		String lName = link;
+		// boolean validRole = true;
+		// boolean validLink = true;
+
+		if (rName != null)
+			rName = rName.trim();
+		if (lName != null)
+			lName = lName.trim();
+
+		if (rName != null) {
+			if (!rName.equals("*") && !rName.equals("")) { //$NON-NLS-1$ //$NON-NLS-2$	
+				if (definedRoles.get(rName) == null && definedRoles.get(lName) == null) {
+					String[] parms = new String[1];
+					parms[0] = rName;
+					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_SEC_ROLE_NAME, parms, targetObject);
+				}
+			}
+		}
+	}
+
+
+
+	/**
+	 * Insert the method's description here. Creation date: (7/6/2001 4:11:09 PM)
+	 * 
+	 * @return boolean
+	 * @param role
+	 *            java.lang.String
+	 * @param defineRoles
+	 *            java.util.Hashtable
+	 * 
+	 * 
+	 * the security-role-ref must have a non-null role-name and the role-link must contain the name
+	 * of a role specified in the security-role section <security-role-ref> <role-name>MyName</role-name>
+	 * <role-link>ExistingRole</role-link> </security-role-ref>
+	 * 
+	 * 
+	 */
+	protected void validateSecRole(String link, String role, Hashtable definedRoles, EObject targetObject) {
+		String rName = role;
+		String lName = link;
+		// boolean validRole = true;
+		// boolean validLink = true;
+
+		if (rName != null)
+			rName = rName.trim();
+		if (lName != null)
+			lName = lName.trim();
+
+
+		// the security role-name cannot be null
+		if ((rName == null || rName.equals(""))) { //$NON-NLS-1$
+			String[] parms = new String[1];
+			parms[0] = rName;
+			addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_SEC_ROLE_NAME, parms, targetObject);
+		}
+
+		if (rName == null || !rName.equals("*")) { //$NON-NLS-1$		
+			// check that security role-link matches a defines security role
+			if (lName != null && definedRoles.get(lName) == null) {
+
+				String[] parms = new String[1];
+				parms[0] = lName;
+				addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_SEC_ROLE, parms, targetObject);
+			}
+		}
+	}
+
+	/**
+	 * validateSecurity(WebApp) - validate security constraints, roles, and security role refs -
+	 * details tbd
+	 */
+
+	public void validateSecurityAndServlets() {
+
+
+		EList webRoles = webDD.getSecurityRoles();
+
+		// Validate security roles
+		Hashtable secRoles = getAndValidateSecurityRoles(webRoles);
+
+		// Validate Servlets/JSPs and their role ref.
+		validateServlets(webDD.getServlets(), secRoles);
+
+		validateSecurityConstraints(webDD.getConstraints(), secRoles);
+
+		// try {
+		if (!(webRoles.isEmpty())) {
+			EARFile module = warFile.getEARFile();
+			if (module != null) {
+				EList earRoleList = module.getDeploymentDescriptor().getSecurityRoles();
+				validateWEBRolesWithEARRoles(earRoleList, webRoles);
+			}
+		}
+		// } catch (UncontainedModuleFileException ue) {
+		// String[] parms = new String[1];
+		// parms[0] = warFile.getName();
+		// addError(EREF_CATEGORY, ERROR_EAR_UNCONTAINED_MODULE_FILE_EXCEPTION, parms);
+		// }
+	}
+
+	/**
+	 * The security-constraint element is used to associate security constraints with one or more
+	 * web resource collections <!ELEMENT security-constraint (web-resource-collection+,
+	 * auth-constraint?, user-data-constraint?)>
+	 * 
+	 * @param constraints
+	 *            org.eclipse.emf.common.util.EList
+	 */
+	public void validateSecurityConstraints(EList constraints, Hashtable secRoles) {
+
+		if (constraints.isEmpty())
+			return;
+
+		Iterator constList = constraints.iterator();
+		while (constList.hasNext()) {
+			
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			SecurityConstraint constraint = (SecurityConstraint) constList.next();
+
+			EList webResourceList = constraint.getWebResourceCollections();
+			if (webResourceList == null || webResourceList.isEmpty()) {
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Web_Resource_Collection_64;
+				addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, constraint);
+				continue;
+			}
+			validateWebResourceCollections(webResourceList);
+
+			AuthConstraint authConstraint = constraint.getAuthConstraint();
+			if (authConstraint != null)
+				validateAuthConstraint(authConstraint, secRoles);
+
+			UserDataConstraint dataConstraint = constraint.getUserDataConstraint();
+			if (dataConstraint != null && dataConstraint.getTransportGuarantee() != null) {
+				// <!ELEMENT user-data-constraint (description?, transport-guarantee)>
+				// The transport-guarantee element specifies that the communication
+				// between client and server should be NONE, INTEGRAL, or
+				// CONFIDENTIAL.
+
+				// EEnumLiteral transport = dataConstraint.getTransportGuarantee();
+				TransportGuaranteeType transport = dataConstraint.getTransportGuarantee();
+				if (transport == null || !dataConstraint.isSetTransportGuarantee()) {
+					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_TRANSPORT, new String[0], dataConstraint);
+				}
+			}
+		}
+	}
+
+	public void validateFilters(EList filterList) {
+		if (filterList.isEmpty())
+			return;
+
+		Iterator filters = filterList.iterator();
+
+		Hashtable remember = new Hashtable();
+
+		while (filters.hasNext()) {
+			
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			Filter nextFilter = (Filter) filters.next();
+			String name = nextFilter.getName();
+			if (name != null)
+				name = name.trim();
 
 			if (name == null || name.equals("")) { //$NON-NLS-1$
 				String[] parms = new String[1];
-				parms[0] = WARValidationResourceHandler.of_Type_Servlet_Name_77; 
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms,nextServlet);
-				continue ;
-			}           
-			if (remember.get(name) != null) {  // check for duplicates
-				String[] parms = new String[1];
-				parms[0] = name ;
-				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_SERVLET, parms,nextServlet);
-				continue ;
+				parms[0] = WARValidationResourceHandler.of_Type_Filter_Name_66;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, nextFilter);
+				continue;
 			}
-			remember.put(name,"Yea") ; //$NON-NLS-1$
+			if (remember.get(name) != null) { // check for duplicates
+				String[] parms = new String[1];
+				parms[0] = name;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_FILTER, parms, nextFilter);
+				continue;
+			}
+			remember.put(name, "Yea"); //$NON-NLS-1$
+		}
+	}
+
+	/**
+	 * validateFilterMappings(Elist(Filters's)) - for each filter mapping, make sure the named
+	 * filter exists
+	 */
+	public void validateFilterMappings(EList filterMappingsList) {
+
+		if (filterMappingsList.isEmpty())
+			return;
+
+		Iterator filterMappings = filterMappingsList.iterator();
+		while (filterMappings.hasNext()) {
+			FilterMapping nextMapping = (FilterMapping) filterMappings.next();
+
+			// Mapping can be either servlet or url
+			if (nextMapping.getUrlPattern() != null) {
+				String[] parms = new String[1];
+				String url = nextMapping.getUrlPattern();
+				parms[0] = url;
+				if (url == null) {
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms, nextMapping);
+					continue;
+				}
+				if (nextMapping.getFilter() == null || nextMapping.getFilter().equals("")) { //$NON-NLS-1$
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_FILTER_MAPPING, parms, nextMapping);
+					continue;
+				}
+
+				// Is is a valid URI notation ?
+				try {
+					if (url.equals(""))
+						throw new Exception(WARValidationResourceHandler.Invalid_URL_70);
+					// You can't use com.ibm.webtools.URI here...
+					// com.ibm.iwt.webtools.URI uri = new com.ibm.iwt.webtools.URI(url) ;
+				} catch (Exception e) {
+					parms = new String[1];
+					parms[0] = nextMapping.getUrlPattern();
+					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms, nextMapping);
+					continue;
+				}
+			} else if (nextMapping.getServletName() != null) {
+				String[] parms = new String[1];
+				String servletName = nextMapping.getServletName();
+				parms[0] = servletName;
+				if (nextMapping.getServlet() == null) {
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_SERVLET_MAPPING, parms, nextMapping);
+					continue;
+				}
+				if (nextMapping.getFilter() == null || nextMapping.getFilter().equals("")) { //$NON-NLS-1$
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_FILTER_MAPPING, parms, nextMapping);
+					continue;
+				}
+			}
+			// else {
+			// // otherwise neither servlet-name or url-mapping is defined - this gets flagged by
+			// the xml validator
+			// // as this does not conform to the DTD
+			//		
+			// }
+
+
+		}
+
+	}
+
+
+
+	/**
+	 * validateServlets(Elist(Servlet's)) - for each servlet mapping, make sure the named servlet
+	 * exists
+	 */
+
+	public void validateServletMappings(EList servletMappingsList) {
+
+		if (servletMappingsList.isEmpty())
+			return;
+
+		Iterator servletMappings = servletMappingsList.iterator();
+
+		Hashtable remember = new Hashtable();
+		while (servletMappings.hasNext()) {
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			ServletMapping nextMapping = (ServletMapping) servletMappings.next();
+			String url = nextMapping.getUrlPattern();
+
+			// Check for null servlet, if the name is right the reflection
+			// has already resolved it.
+
+			if (url != null) { // check for duplicate first, no need to repeat earlier error,
+				url = url.trim();
+				if (remember.get(url) != null) {
+					String[] parms = new String[1];
+					parms[0] = nextMapping.getUrlPattern();
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_MAPPING, parms, nextMapping);
+					continue;
+				}
+				remember.put(nextMapping.getUrlPattern(), "Yea"); //$NON-NLS-1$
+			}
+
+
+			if (url == null || nextMapping.getServlet() == null || nextMapping.getServlet().equals("")) { //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = url;
+				if (url == null)
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms, nextMapping);
+				else
+					addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_BROKEN_SERVLET_MAPPING, parms, nextMapping);
+				continue;
+			}
+
+			// Is is a valid URI notation ?
+			try {
+				if (url.equals(""))
+					throw new Exception(WARValidationResourceHandler.Invalid_URL_75);
+
+				//
+				// The spec does not prohibit whitespace in the url-patterns
+				//	   
+				// // check to see if the string is a valid URL- has no white space
+				// char[] chars = url.toCharArray();
+				// int len = chars.length;
+				// for (int cnt = 0; cnt < chars.length; cnt++)
+				// {
+				// if (Character.isWhitespace(chars[cnt]))
+				// throw new Exception("Invalid URL") ;
+				// }
+				// You can't use com.ibm.webtools.URI here...
+				// com.ibm.iwt.webtools.URI uri = new com.ibm.iwt.webtools.URI(url) ;
+			} catch (Exception e) {
+				String[] parms = new String[1];
+				parms[0] = nextMapping.getUrlPattern();
+				addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_URL, parms, nextMapping);
+				continue;
+			}
+		}
+
+	}
+
+	/**
+	 * validateServlets(Elist(Servlet's)) - if it's a JSP, verify the file exists - validate
+	 * optional security role refs for existence of the security role
+	 */
+
+	public void validateServlets(EList servletList, Hashtable secRoles) {
+		if (servletList.isEmpty())
+			return;
+
+		Iterator servlets = servletList.iterator();
+
+		Hashtable remember = new Hashtable();
+
+		while (servlets.hasNext()) {
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			Servlet nextServlet = (Servlet) servlets.next();
+			String name = nextServlet.getServletName();
+			if (name != null)
+				name = name.trim();
+
+			if (name == null || name.equals("")) { //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Servlet_Name_77;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, nextServlet);
+				continue;
+			}
+			if (remember.get(name) != null) { // check for duplicates
+				String[] parms = new String[1];
+				parms[0] = name;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_SERVLET, parms, nextServlet);
+				continue;
+			}
+			remember.put(name, "Yea"); //$NON-NLS-1$
 
 			// Validate servlet roles
-			EList rolesList = nextServlet.getSecurityRoleRefs() ;
+			EList rolesList = nextServlet.getSecurityRoleRefs();
 			if (!rolesList.isEmpty()) {
-			   Iterator roles = rolesList.iterator() ;
-			   while (roles.hasNext()) {
-				   SecurityRoleRef role = (SecurityRoleRef) roles.next() ;
-				   validateSecRole(role.getLink(), role.getName(),secRoles,role) ;
-			   }
+				Iterator roles = rolesList.iterator();
+				while (roles.hasNext()) {
+					SecurityRoleRef role = (SecurityRoleRef) roles.next();
+					validateSecRole(role.getLink(), role.getName(), secRoles, role);
+				}
 			}
 
-			// if it's a JSP, the jsp-file attribute MUST be a full-path, according to the servlet 2.2 spec
-			if ( nextServlet.getWebType().isJspType() ) {
-				JSPType jspType = (JSPType)(nextServlet.getWebType());
-				
+			// if it's a JSP, the jsp-file attribute MUST be a full-path, according to the servlet
+			// 2.2 spec
+			if (nextServlet.getWebType().isJspType()) {
+				JSPType jspType = (JSPType) (nextServlet.getWebType());
+
 				String jspFileName = jspType.getJspFile();
-				if ( jspFileName == null || !(jspFileName.length() > 0)) {
+				if (jspFileName == null || !(jspFileName.length() > 0)) {
 					String[] parms = new String[2];
 					parms[0] = jspFileName;
 					parms[1] = name;
-					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_JSPFILE_REF, parms,nextServlet);
-				}  
+					addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_JSPFILE_REF, parms, nextServlet);
+				}
 			}
 
-		   /*  No need to check for the existence of JSPs or Servlets.  the LinkBuilder will do this */            
+			/* No need to check for the existence of JSPs or Servlets. the LinkBuilder will do this */
+
+		}
+	}
+
+	public void validateTagLibs() {
+
+		if (webDD.getTagLibs().isEmpty())
+			return;
+
+		Iterator tags = webDD.getTagLibs().iterator();
+		Hashtable remember = new Hashtable();
+
+		while (tags.hasNext()) {
+
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
 			
+			TagLibRef taglib = (TagLibRef) tags.next(); // ClassCastException at runtime
+			String uri = taglib.getTaglibURI();
+
+			if (uri != null)
+				uri = uri.trim();
+
+			if (uri == null || uri.equals("")) { //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Taglib_80;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, taglib);
+				continue;
+			}
+			if (remember.get(uri) != null) { // Check for dups
+
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_TagLib___81 + ": " + uri;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, taglib);
+				continue;
+			}
+			remember.put(uri, "Yea"); //$NON-NLS-1$
 		}
 	}
-	
-public void validateTagLibs(){
-	
-	if (webDD.getTagLibs().isEmpty())
-		return;
 
-	Iterator tags = webDD.getTagLibs().iterator();
-	Hashtable remember = new Hashtable();
+	public void validateWebResourceCollections(EList webResourceList) {
 
-	while (tags.hasNext()) {
-		
-		TagLibRef taglib = (TagLibRef) tags.next(); // ClassCastException at runtime
-		String uri = taglib.getTaglibURI();
-		
-		if (uri != null)
-			uri = uri.trim();
 
-		if (uri == null || uri.equals("")) { //$NON-NLS-1$
-			String[] parms = new String[1];
-			parms[0] = WARValidationResourceHandler.of_Type_Taglib_80; 
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, taglib);
-			continue;
+		Iterator resourceList = webResourceList.iterator();
+		while (resourceList.hasNext()) { // Check the web resource collections
+			WebResourceCollection resource = (WebResourceCollection) resourceList.next();
+
+			String name = resource.getWebResourceName();
+			if (name != null)
+				name = name.trim();
+			if (name == null || name.equals("")) { // should have a name //$NON-NLS-1$
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Web_Resource_Name_84;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY, parms, resource);
+			}
+
+			// Check that the http methods, if any is correct
+			EList httpList = resource.getHTTPs();
+			if (!httpList.isEmpty()) {
+				Iterator https = httpList.iterator();
+				while (https.hasNext()) {
+					HTTPMethodType httpMethod = (HTTPMethodType) https.next();
+					String method = httpMethod.getHttpMethod();
+
+					if (method == null || !isHttpMethod(method)) {
+						String[] parms = new String[1];
+						parms[0] = method;
+						addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_HTTP_CMD, parms, httpMethod);
+					}
+
+
+				}
+			}
 		}
-		if (remember.get(uri) != null) { // Check for dups
+	}
 
-			String[] parms = new String[1];
-			parms[0] = WARValidationResourceHandler.of_Type_TagLib___81 + ": " + uri; 
-			addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, taglib);
-			continue;
+	/**
+	 * validateWelcomeFileList(WelcomeFileList) - walk through the files and verify they exist
+	 */
+
+	public void validateWelcomeFileList(WelcomeFileList fileList) {
+		if (fileList == null)
+			return;
+
+		Iterator files = fileList.getFile().iterator();
+
+		Hashtable remember = new Hashtable();
+		while (files.hasNext()) {
+			
+			if( _reporter.isCancelled() ){
+				String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED);			
+				status = WTPCommonPlugin.createCancelStatus(msg);
+			}
+			
+			WelcomeFile nextFile = (WelcomeFile) files.next();
+			String fileName = nextFile.getWelcomeFile();
+
+			if ((fileName == null) || (fileName.length() == 0)) {
+				String[] parms = new String[0];
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_NO_WELCOME_FILE, parms, nextFile);
+			} else if ((fileName.startsWith("/")) || (fileName.endsWith("/"))) { //$NON-NLS-1$ //$NON-NLS-2$
+				String[] parms = new String[0];
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_WELCOME_FILE, parms, nextFile);
+			}
+			fileName = fileName.trim();
+			if (remember.get(fileName) != null) {
+				String[] parms = new String[1];
+				parms[0] = WARValidationResourceHandler.of_Type_Welcome_File_Name__87 + ": " + fileName;
+				addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms, nextFile);
+				continue;
+			}
+			remember.put(fileName, "Yea"); //$NON-NLS-1$
 		}
-		remember.put(uri, "Yea"); //$NON-NLS-1$
 	}
-}
 
-public void validateWebResourceCollections(EList webResourceList) {
-
-
-	  Iterator resourceList = webResourceList.iterator () ;
-	  while (resourceList.hasNext()) {  // Check the web resource collections
-		  WebResourceCollection resource = (WebResourceCollection) resourceList.next() ;
-
-		  String name = resource.getWebResourceName() ;
-		  if (name != null) name = name.trim() ;
-		  if (name == null || name.equals("")) {  // should have a name //$NON-NLS-1$
-			  String[] parms = new String[1];
-			  parms[0] = WARValidationResourceHandler.of_Type_Web_Resource_Name_84 ; 
-			  addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_EMPTY_ENTRY , parms,resource);             
-		  }
-
-		  // Check that the http methods, if any is correct
-		  EList httpList = resource.getHTTPs() ;
-		  if (!httpList.isEmpty()) {
-			  Iterator https = httpList.iterator () ;
-			  while (https.hasNext()) {
-				  HTTPMethodType httpMethod = (HTTPMethodType) https.next() ;
-				  String method = httpMethod.getHttpMethod() ;
-
-				  if (method == null ||!isHttpMethod(method)) {
-					  String[] parms = new String[1];
-					  parms[0] = method ;
-					  addError(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_HTTP_CMD , parms,httpMethod);            
-				  }
-
-				  
-			  }
-		  }
-	  }
-}
-/**
-   * validateWelcomeFileList(WelcomeFileList)
-   *     - walk through the files and verify they exist
-   */
-
-public void validateWelcomeFileList(WelcomeFileList fileList) {
-  if (fileList == null)
-	return;
-
-  Iterator files = fileList.getFile().iterator();
-
-  Hashtable remember = new Hashtable() ;
-  while (files.hasNext()) {
-	WelcomeFile nextFile = (WelcomeFile) files.next();
-	String fileName = nextFile.getWelcomeFile();
-
-	if ((fileName == null) || (fileName.length() == 0) ) {
-		String[] parms = new String[0];
-		addWarning( WAR_CATEGORY, MESSAGE_WAR_VALIDATION_NO_WELCOME_FILE,parms,nextFile );		
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		_helper = helper;
+		return null;
 	}
-	else if ( (fileName.startsWith("/") ) || (fileName.endsWith("/") )) { //$NON-NLS-1$ //$NON-NLS-2$
-		String[] parms = new String[0];
-		addWarning( WAR_CATEGORY, MESSAGE_WAR_VALIDATION_INVALID_WELCOME_FILE,parms,nextFile );
-	}
-	fileName = fileName.trim() ;
-	if (remember.get(fileName) != null) {
-		String[] parms = new String[1];
-		parms[0] = WARValidationResourceHandler.of_Type_Welcome_File_Name__87 + ": " + fileName ; 
-		addWarning(WAR_CATEGORY, MESSAGE_WAR_VALIDATION_DUPLICATE_ENTRY, parms,nextFile);
-		continue ;      
-	}
-	remember.put(fileName,"Yea") ; //$NON-NLS-1$
-  }
-}
 }
diff --git a/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/UIWarValidator.java b/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/UIWarValidator.java
index 3999a42..461094e 100644
--- a/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/UIWarValidator.java
+++ b/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/UIWarValidator.java
@@ -13,6 +13,8 @@
 
 
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
 import org.eclipse.jst.j2ee.model.internal.validation.WarValidator;
@@ -76,18 +78,26 @@
 	/**
 	 * Insert the method's description here. Creation date: (10/2/2001 6:49:26 PM)
 	 */
-	public void validate(IValidationContext inHelper, IReporter inReporter) throws org.eclipse.wst.validation.internal.core.ValidationException {
+	public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter)
+			throws org.eclipse.wst.validation.internal.core.ValidationException {
+		
 		setWarHelper((UIWarHelper) inHelper);
-		IProject proj = ((IWorkbenchContext) inHelper).getProject();
+		IProject proj = ((IWorkbenchContext) warHelper).getProject();
 		IVirtualComponent wbModule = ComponentCore.createComponent(proj);
         if( wbModule != null && J2EEProjectUtilities.isDynamicWebProject(proj)) {           	
 			IVirtualFile webFile = wbModule.getRootFolder().getFile(J2EEConstants.WEBAPP_DD_URI);
 			if( webFile.exists()) {
-				super.validate(inHelper, inReporter);				
+				status = super.validateInJob(inHelper, inReporter);				
 			}
         }
+        return status;
 	}	
 		
+	
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		return null;
+	}
+	
 	public void cleanup(IReporter reporter) {
 		super.cleanup(reporter);
 		if(warHelper != null) 
@@ -168,4 +178,5 @@
 			}
 		}
 	}*/	
+
 }
diff --git a/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/WarHelper.java b/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/WarHelper.java
index 8886eec..37886e1 100644
--- a/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/WarHelper.java
+++ b/plugins/org.eclipse.jst.j2ee.web/war-validation/org/eclipse/jst/j2ee/internal/web/validation/WarHelper.java
@@ -12,7 +12,6 @@
 
 
 
-//import org.eclipse.wst.validation.internal.core.core.IMessage;
 import java.util.Hashtable;
 
 import org.eclipse.core.resources.IFile;
@@ -21,7 +20,9 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
 import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
+import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.jst.j2ee.internal.validation.J2EEValidationHelper;
 import org.eclipse.jst.j2ee.model.internal.validation.WARMessageConstants;
 import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
@@ -29,11 +30,13 @@
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
 
 
 
 public class WarHelper extends J2EEValidationHelper {
 	Hashtable warFileMap = new Hashtable();
+	ArtifactEdit edit = null;
 	final static String HelperID = "org.eclipse.wst.validation.internal.core.war.workbenchimpl.WarHelper"; //$NON-NLS-1$
 
 
@@ -87,35 +90,48 @@
 	 *            Object
 	 */
 	public String getTargetObjectName(Object object) {
-		String ret = null;
-		if (object != null) {
-			IFile warFile = (IFile) warFileMap.get(getProject().toString());// validator framework
-																			// will call getFile()
-																			// first.
-			if (warFile != null) {
-				ret = (warFile.toString() + HelperID);
-			}
+		
+		if( object != null && object instanceof WARFile ){
+			return J2EEConstants.WEBAPP_ID;
 		}
-		return ret;
+		return null;
+//		String ret = null;
+//		if (object != null) {
+//			IFile warFile = (IFile) warFileMap.get(getProject().toString());// validator framework
+//																			// will call getFile()
+//																			// first.
+//			if (warFile != null) {
+//				ret = (warFile.toString() + HelperID);
+//			}
+//		}
+//		return ret;
 	}
 
 	
 	//public EObject loadWarFile(ComponentHandle handle) {
 	public EObject loadWarFile() {
 			IVirtualComponent comp = ComponentCore.createComponent(getProject());
-			ArtifactEdit edit = ComponentUtilities.getArtifactEditForRead(comp);
+			edit = ComponentUtilities.getArtifactEditForRead(comp);
 			
 			try {
 				Archive archive = ((WebArtifactEdit) edit).asArchive(false);
 				return archive;
 			} catch (OpenFailureException e1) {
 				Logger.getLogger().log(e1);
-			}finally {
-				if (edit != null) {
-					edit.dispose();
-				}
 			}
+//			finally {
+//				if (edit != null) {
+//					edit.dispose();
+//				}
+//			}
 		return null;
 	}	
 	
+	public void cleanup(WorkbenchReporter reporter) {
+		if (edit != null) {
+			edit.dispose();
+			edit = null;
+		}	
+		super.cleanup(reporter);
+	}
 }
diff --git a/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/EarHelper.java b/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/EarHelper.java
index ab4ec2e..9ed3bad 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/EarHelper.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/EarHelper.java
@@ -27,11 +27,13 @@
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
 
 
 public class EarHelper extends J2EEValidationHelper {
 
 	protected EARFile earFile;
+	protected ArtifactEdit edit = null;
 
 	/**
 	 * WarHelper constructor comment.
@@ -78,17 +80,13 @@
 	public EObject loadEarFile() {
 
 		IVirtualComponent comp = ComponentCore.createComponent(getProject());
-		ArtifactEdit edit = ComponentUtilities.getArtifactEditForRead(comp);
+		edit = ComponentUtilities.getArtifactEditForRead(comp);
 		
 		try {
 			Archive archive = ((EARArtifactEdit) edit).asArchive(false);
 			return archive;
 		} catch (OpenFailureException e1) {
 			Logger.getLogger().log(e1);
-		}finally {
-			if (edit != null) {
-				edit.dispose();
-			}
 		}
 		return null;
 	}
@@ -99,4 +97,10 @@
 			earFile = null;
 		}
 	}
+	
+	public void cleanup(WorkbenchReporter reporter) {
+		if (edit != null) {
+			edit.dispose();
+		}
+	}	
 }
diff --git a/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/UIEarValidator.java b/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/UIEarValidator.java
index 2ff07ee..fb4e4d0 100644
--- a/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/UIEarValidator.java
+++ b/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/validation/UIEarValidator.java
@@ -23,6 +23,8 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
@@ -65,6 +67,7 @@
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
+import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
 
 
 /**
@@ -192,14 +195,15 @@
 		earHelper = newEarHelper;
 	}
 
-	public void validate(IValidationContext inHelper, IReporter inReporter) throws org.eclipse.wst.validation.internal.core.ValidationException {
-		earHelper = ((UIEarHelper) inHelper);
+	public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter) throws org.eclipse.wst.validation.internal.core.ValidationException {
+
 		IProject proj = ((IWorkbenchContext) inHelper).getProject();
 		IVirtualComponent earModule = ComponentCore.createComponent(proj);
             if(J2EEProjectUtilities.isEARProject(proj)){
 				IVirtualFile ddFile = earModule.getRootFolder().getFile(J2EEConstants.APPLICATION_DD_URI);
-				if( ddFile.exists()) {				
-					super.validate(inHelper, inReporter);
+				if( ddFile.exists()) {	
+					IStatus status = IValidatorJob.OK_STATUS;
+					status = super.validateInJob(inHelper, inReporter);
 					validateModuleMaps(earModule);
 					validateManifests();
 	//				validateUtilJarMaps(earEdit,earModule);
@@ -207,10 +211,12 @@
 	//				validateDocType(earEdit,earModule);					
 				}
             }
-		
+		return IValidatorJob.OK_STATUS;
 	}	
 
-
+	public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+		return null;
+	}
 
 	public void validateManifests() throws ValidationException {
 		if (earFile == null)