[132230] Provide support for alternative XML Schema validator implementations
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
index 0f363e8..bef6d16 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/core/AbstractNestedValidator.java
@@ -100,7 +100,7 @@
 	// Should I know that I'm validating a project as opposed to files?
 	else 
     {
-      Object []parms = {this.getClass().getName()};
+      Object []parms = {getValidatorID()};
       Collection files = (Collection) context.loadModel(GET_PROJECT_FILES, parms);
       Iterator iter = files.iterator();
       while (iter.hasNext() && !reporter.isCancelled()) 
@@ -120,6 +120,18 @@
   }
   
   /**
+   * Provides the id of this validator. The ID is used by the validation
+   * framework. It usually is the fully qualified class name of the class
+   * implementing the IValidator interface.
+   * 
+   * @return a String with the ID of this validator.
+   */
+  protected String getValidatorID()
+  {
+    return this.getClass().getName();
+  }
+  
+  /**
    * Get the name of this validator. The name will be reported to the
    * validation framework.
    * Subclasses must implement this method.
diff --git a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java
index e9db1ae..6dc6364 100644
--- a/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java
+++ b/bundles/org.eclipse.wst.xml.ui/src/org/eclipse/wst/xml/ui/internal/validation/DelegatingSourceValidator.java
@@ -17,6 +17,7 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.Path;
@@ -28,6 +29,7 @@
 import org.eclipse.wst.validation.internal.core.IMessageAccess;
 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.IProjectValidationContext;
 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.IValidator;
@@ -75,7 +77,7 @@
 	}
 
 	// My Implementation of IHelper
-	class MyHelper implements IValidationContext {
+	class MyHelper implements IProjectValidationContext {
 		InputStream inputStream;
 
 		IFile file;
@@ -108,6 +110,13 @@
 				return new String[]{file.getFullPath().toString()};
 			return new String[0];
 		}
+
+		public IProject getProject() {
+      if (file != null) {        
+        return file.getProject();
+      }
+      return null;
+		}
 	}
 
 	// My Implementation of IReporter
diff --git a/bundles/org.eclipse.wst.xsd.core/plugin.properties b/bundles/org.eclipse.wst.xsd.core/plugin.properties
index 4aea974..31c32c9 100644
--- a/bundles/org.eclipse.wst.xsd.core/plugin.properties
+++ b/bundles/org.eclipse.wst.xsd.core/plugin.properties
@@ -17,5 +17,6 @@
 XSD_Content_Type=XSD
 
 _UI_XML_SCHEMA_VALIDATOR                  = XML Schema Validator
+_UI_XERCES_VALIDATOR_DELEGATE       	  = Xerces-based XML Schema Validator
 
 Bundle-Vendor.0 = Eclipse.org
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.core/plugin.xml b/bundles/org.eclipse.wst.xsd.core/plugin.xml
index dbe1792..e4a0932 100644
--- a/bundles/org.eclipse.wst.xsd.core/plugin.xml
+++ b/bundles/org.eclipse.wst.xsd.core/plugin.xml
@@ -40,7 +40,7 @@
 			
 			<run
          async="true"
-         class="org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator"
+         class="org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator"
          enabled="true"
          fullBuild="true"
          incremental="true">
@@ -48,4 +48,12 @@
 		</validator>
 	</extension>
 
+	<extension
+       point="org.eclipse.wst.validation.validatorDelegates">
+    	<delegate
+        	class="org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator"
+			name="%_UI_XERCES_VALIDATOR_DELEGATE"
+        	target="org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator"/>
+	 </extension>	
+
 </plugin>
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java
index 13acc4d..1b7f773 100644
--- a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/Validator.java
@@ -73,4 +73,16 @@
 	  message.setAttribute(SQUIGGLE_NAME_OR_VALUE_ATTRIBUTE, messageInfo[1]);
 	}
   }
+
+  /*
+   * (non-Javadoc)
+   * @see org.eclipse.wst.xml.core.internal.validation.core.AbstractNestedValidator#getValidatorID()
+   */
+  protected String getValidatorID()
+  {
+    // Because this class is used as a delegate, return the id of the validator
+    // which delegates to this class.
+
+    return XSDDelegatingValidator.class.getName();
+  }
 }
diff --git a/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDDelegatingValidator.java b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDDelegatingValidator.java
new file mode 100644
index 0000000..3f615ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.core/src-validation/org/eclipse/wst/xsd/core/internal/validation/eclipse/XSDDelegatingValidator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xsd.core.internal.validation.eclipse;
+
+import org.eclipse.wst.validation.internal.delegates.DelegatingValidator;
+
+/**
+ * This class provides a unique name (class name) which the validation framework
+ * will use to identify the XSD validator. The actual delegating validator
+ * functionality is provided by the base class. The actual validation
+ * functionality is provided by the delegates registered with this class as
+ * their target.
+ */
+public class XSDDelegatingValidator extends DelegatingValidator
+{
+  /**
+   * Default constructor.
+   */
+  public XSDDelegatingValidator()
+  {
+  }
+}