Allow disabling XML validation via configuration

The XML schema and SharePoint consistently are in disagreement in
unimportant ways. Thus, allow disabling the schema to provide a
temporary fix before the schema can be updated.
diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index 19705fc..add21ef 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -187,6 +187,7 @@
       = new ConcurrentSkipListMap<String, String>();
   private final SiteDataFactory siteDataFactory;
   private final HttpClient httpClient;
+  private boolean xmlValidation;
   private NtlmAuthenticator ntlmAuthenticator;
 
   public SharePointAdaptor() {
@@ -215,6 +216,7 @@
     config.addKey("sharepoint.server", null);
     config.addKey("sharepoint.username", null);
     config.addKey("sharepoint.password", null);
+    config.addKey("sharepoint.xmlValidation", "true");
   }
 
   @Override
@@ -225,6 +227,8 @@
     String username = config.getValue("sharepoint.username");
     String password = context.getSensitiveValueDecoder().decodeValue(
         config.getValue("sharepoint.password"));
+    xmlValidation = Boolean.parseBoolean(
+        config.getValue("sharepoint.xmlValidation"));
 
     log.log(Level.CONFIG, "VirtualServer: {0}", virtualServer);
     log.log(Level.CONFIG, "Username: {0}", username);
@@ -1323,7 +1327,9 @@
       Source source = new StreamSource(new StringReader(xml));
       try {
         Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-        unmarshaller.setSchema(schema);
+        if (xmlValidation) {
+          unmarshaller.setSchema(schema);
+        }
         return unmarshaller.unmarshal(source, klass).getValue();
       } catch (JAXBException ex) {
         throw new XmlProcessingException(ex, xml);
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
index ac44ec7..fdb76a8 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
@@ -3334,6 +3334,22 @@
   }
 
   @Test
+  public void testDisabledValidation() throws Exception {
+    adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
+        new UnsupportedHttpClient());
+    config.overrideKey("sharepoint.xmlValidation", "false");
+    adaptor.init(new MockAdaptorContext(config, null));
+    SharePointAdaptor.SiteDataClient client = adaptor.new SiteDataClient(
+        "http://localhost:1", "http://localhost:1",
+        new UnsupportedSiteData(), new UnsupportedCallable<MemberIdMapping>());
+    // Lacks required child element.
+    String xml = "<SPContentDatabase"
+        + " xmlns='http://schemas.microsoft.com/sharepoint/soap/'/>";
+    assertNotNull(client.jaxbParse(xml, SPContentDatabase.class));
+  }
+
+
+  @Test
   public void testParseUnknownXml() throws Exception {
     adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
         new UnsupportedHttpClient());