Add tons of logging and remove System.outs
diff --git a/logging.properties b/logging.properties
index 499b7cd..4dc3633 100644
--- a/logging.properties
+++ b/logging.properties
@@ -1,5 +1,6 @@
 handlers = java.util.logging.ConsoleHandler
-.level = FINE
+.level = INFO
+com.google.enterprise.adaptor.sharepoint.SharePointAdaptor.level = FINER
 java.util.logging.ConsoleHandler.level = FINEST
 java.util.logging.ConsoleHandler.formatter = com.google.enterprise.adaptor.CustomFormatter
 # Uncomment if your terminal can't handle colors and the auto-detection
diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index d49ebdb..b89a36a 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -46,6 +46,7 @@
 import java.nio.charset.Charset;
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.logging.*;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLInputFactory;
@@ -67,6 +68,9 @@
   private static final QName OWS_CONTENTTYPE_ATTRIBUTE
       = new QName("ows_ContentType");
 
+  private static final Logger log
+      = Logger.getLogger(SharePointAdaptor.class.getName());
+
   private final ConcurrentMap<String, SiteDataClient> clients
       = new ConcurrentSkipListMap<String, SiteDataClient>();
   private final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
@@ -92,6 +96,11 @@
     String password = config.getValue("sharepoint.password");
     String domain = config.getValue("sharepoint.domain");
 
+    log.log(Level.CONFIG, "VirtualServer: {0}", virtualServer);
+    log.log(Level.CONFIG, "Username: {0}", username);
+    log.log(Level.CONFIG, "Password: {0}", password);
+    log.log(Level.CONFIG, "Domain: {0}", domain);
+
     Credentials creds = new NTCredentials(username, password,
         config.getServerHostname(), domain);
     httpClient.getState().setCredentials(AuthScope.ANY, creds);
@@ -100,6 +109,8 @@
   @Override
   public void getDocContent(Request request, Response response)
       throws IOException {
+    log.entering("SharePointAdaptor", "getDocContent",
+        new Object[] {request, response});
     try {
       DocId id = request.getDocId();
       SiteDataClient virtualServerClient = getSiteDataClient(virtualServer);
@@ -109,23 +120,32 @@
         SiteDataClient client
             = virtualServerClient.getClientForUrl(id.getUniqueId());
         if (client == null) {
+          log.log(Level.FINE, "responding not found");
           response.respondNotFound();
+          log.exiting("SharePointAdaptor", "getDocContent");
           return;
         }
         client.getDocContent(request, response);
       }
     } catch (RuntimeException ex) {
+      log.throwing("SharePointAdaptor", "getDocContent", ex);
       throw ex;
     } catch (IOException ex) {
+      log.throwing("SharePointAdaptor", "getDocContent", ex);
       throw ex;
     } catch (Exception ex) {
-      throw new IOException(ex);
+      IOException ioe = new IOException(ex);
+      log.throwing("SharePointAdaptor", "getDocContent", ex);
+      throw ioe;
     }
+    log.exiting("SharePointAdaptor", "getDocContent");
   }
 
   @Override
   public void getDocIds(DocIdPusher pusher) throws InterruptedException {
+    log.entering("SharePointAdaptor", "getDocIds", pusher);
     pusher.pushDocIds(Arrays.asList(virtualServerDocId));
+    log.exiting("SharePointAdaptor", "getDocIds");
   }
 
   private SiteDataClient getSiteDataClient(String site) throws AxisFault {
@@ -139,18 +159,10 @@
   }
 
   public static void main(String[] args) throws Exception {
-    if (false) {
-      final String logPackage = "org.apache.commons.logging.";
-      System.setProperty(logPackage + "Log", logPackage + "impl.SimpleLog");
-      System.setProperty(logPackage + "simplelog.log.httpclient.wire", "debug");
-      System.setProperty(
-          logPackage + "simplelog.log.org.apache.commons.httpclient", "debug");
-    }
     AbstractAdaptor.main(new SharePointAdaptor(), args);
   }
 
   private class SiteDataClient {
-    private static final boolean DEBUG = false;
     private static final String XMLNS
         = "http://schemas.microsoft.com/sharepoint/soap/";
 
@@ -158,6 +170,8 @@
     private final String siteUrl;
 
     public SiteDataClient(String site) throws AxisFault {
+      log.entering("SiteDataClient", "SiteDataClient",
+          new Object[] {site});
       if (!site.endsWith("/")) {
         // Always end with a '/' for a cannonical form.
         site = site + "/";
@@ -166,26 +180,27 @@
       this.stub = new SiteDataStub(site + "_vti_bin/SiteData.asmx");
       Options options = stub._getServiceClient().getOptions();
       options.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
+      log.exiting("SiteDataClient", "SiteDataClient");
     }
 
     private void getDocContent(Request request, Response response)
         throws Exception {
+      log.entering("SiteDataClient", "getDocContent",
+          new Object[] {request, response});
       SiteDataStub.GetURLSegments urlRequest
           = new SiteDataStub.GetURLSegments();
       urlRequest.setStrURL(request.getDocId().getUniqueId());
       SiteDataStub.GetURLSegmentsResponse urlResponse
           = stub.getURLSegments(urlRequest);
-      if (DEBUG) {
-        System.out.println("getURLSegmentsResponse");
-        System.out.println("Result: "
-            + urlResponse.getGetURLSegmentsResult());
-        System.out.println("webid: " + urlResponse.getStrWebID());
-        System.out.println("itemid: " + urlResponse.getStrItemID());
-        System.out.println("listid: " + urlResponse.getStrListID());
-        System.out.println("bucketid: " + urlResponse.getStrBucketID());
-      }
+      log.log(Level.FINE, "GetURLSegments: Result={0}, StrWebID={1}, "
+          + "StrItemID={2}, StrListID={3}, StrBucketID={4}",
+          new Object[] {urlResponse.getGetURLSegmentsResult(),
+            urlResponse.getStrWebID(), urlResponse.getStrListID(),
+            urlResponse.getStrItemID(), urlResponse.getStrBucketID()});
       if (!urlResponse.getGetURLSegmentsResult()) {
+        log.log(Level.FINE, "responding not found");
         response.respondNotFound();
+        log.exiting("SiteDataClient", "getDocContent");
         return;
       }
       if (urlResponse.getStrWebID() != null) {
@@ -196,15 +211,17 @@
       } else if (urlResponse.getStrListID() != null) {
         getListDocContent(request, response, urlResponse.getStrListID());
       } else if (urlResponse.getStrBucketID() != null) {
+        log.log(Level.FINE, "responding not found");
         response.respondNotFound();
       } else {
         // Assume it is a top-level site.
         getSiteDocContent(request, response, urlResponse.getStrWebID());
       }
+      log.exiting("SiteDataClient", "getDocContent");
     }
 
     public void callChangesContentDatabase() throws Exception {
-      System.out.println("                            ContentDatabase Changes");
+      log.entering("SiteDataClient", "callChangesContentDatabase");
       SiteDataStub.GetChanges request = new SiteDataStub.GetChanges();
       request.setObjectType(SiteDataStub.ObjectType.ContentDatabase);
       request.setContentDatabaseId("{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}");
@@ -213,13 +230,15 @@
       //request.setCurrentChangeId("");
       request.setTimeout(2);
       SiteDataStub.GetChangesResponse response = stub.getChanges(request);
-      System.out.println(response.getMoreChanges());
-      System.out.println(response.getCurrentChangeId());
-      System.out.println(response.getLastChangeId());
-      System.out.println(response.getGetChangesResult());
+      log.log(Level.FINE, "GetChanges: Result={0}, MoreChanges={1}, "
+          + "CurrentChangeId={2}, LastChangeId={3}", new Object[] {
+            response.getGetChangesResult(), response.getMoreChanges(),
+            response.getCurrentChangeId(), response.getLastChangeId()});
+      log.exiting("SiteDataClient", "callChangesContentDatabase");
     }
 
     private DocId encodeDocId(String url) {
+      log.entering("SiteDataClient", "encodeDocId", url);
       if (url.toLowerCase().startsWith("https://")
           || url.toLowerCase().startsWith("http://")) {
         // Leave as-is.
@@ -231,12 +250,17 @@
         String[] parts = siteUrl.split("/", 4);
         url = parts[0] + "//" + parts[2] + url;
       }
-      return new DocId(url);
+      DocId docId = new DocId(url);
+      log.exiting("SiteDataClient", "encodeDocId", docId);
+      return docId;
     }
 
     private String encodeUrl(String url) {
+      log.entering("SiteDataClient", "encodeUrl", url);
       URI uri = context.getDocIdEncoder().encodeDocId(encodeDocId(url));
-      return uri.toASCIIString();
+      String encoded = uri.toASCIIString();
+      log.exiting("SiteDataClient", "encodeUrl", encoded);
+      return encoded;
     }
 
     private String liUrl(String url) {
@@ -246,6 +270,8 @@
 
     private void getVirtualServerDocContent(Request request, Response response)
         throws Exception {
+      log.entering("SiteDataClient", "getVirtualServerDocContent",
+          new Object[] {request, response});
       SiteDataStub.VirtualServer vs = getContentVirtualServer();
       response.setContentType("text/html");
       Writer writer
@@ -273,10 +299,13 @@
       }
       writer.write("</ul></body></html>");
       writer.flush();
+      log.exiting("SiteDataClient", "getVirtualServerDocContent");
     }
 
     private void getSiteDocContent(Request request, Response response,
         String id) throws Exception {
+      log.entering("SiteDataClient", "getSiteDocContent",
+          new Object[] {request, response, id});
       SiteDataStub.Web w = getContentWeb(id);
       response.setContentType("text/html");
       Writer writer
@@ -331,16 +360,22 @@
       }
       writer.write("</body></html>");
       writer.flush();
+      log.exiting("SiteDataClient", "getSiteDocContent");
     }
 
     private void getListDocContent(Request request, Response response,
         String id) throws Exception {
+      log.entering("SiteDataClient", "getListDocContent",
+          new Object[] {request, response, id});
       SiteDataStub.List l = getContentList(id);
       processFolder(id, "", response);
+      log.exiting("SiteDataClient", "getListDocContent");
     }
 
     private void processFolder(String listGuid, String folderPath,
         Response response) throws Exception {
+      log.entering("SiteDataClient", "processFolder",
+          new Object[] {listGuid, folderPath, response});
       response.setContentType("text/html");
       Writer writer
           = new OutputStreamWriter(response.getOutputStream(), CHARSET);
@@ -366,6 +401,7 @@
 
       writer.write("</body></html>");
       writer.flush();
+      log.exiting("SiteDataClient", "processFolder");
     }
 
     private OMElement getFirstChildWithName(SiteDataStub.Xml xml, QName name) {
@@ -385,6 +421,8 @@
 
     private void getListItemDocContent(Request request, Response response,
         String listId, String itemId) throws Exception {
+      log.entering("SiteDataClient", "getListItemDocContent",
+          new Object[] {request, response, listId, itemId});
       SiteDataStub.ItemData i = getContentItem(listId, itemId);
       SiteDataStub.Xml xml = i.getXml();
 
@@ -404,13 +442,12 @@
         SiteDataStub.List l = getContentList(listId);
         String root
             = encodeDocId(l.getMetadata().getRootFolder()).getUniqueId();
-        System.out.println("serverUrl: " + serverUrl);
         String folder = encodeDocId(serverUrl).getUniqueId();
         if (!folder.startsWith(root)) {
           throw new AssertionError();
         }
-        System.out.println("folder: " + folder);
         processFolder(listId, folder.substring(root.length()), response);
+        log.exiting("SiteDataClient", "getListItemDocContent");
         return;
       }
       String contentType = row.getAttributeValue(OWS_CONTENTTYPE_ATTRIBUTE);
@@ -424,7 +461,7 @@
         GetMethod method = new GetMethod(url);
         int statusCode = httpClient.executeMethod(method);
         if (statusCode != HttpStatus.SC_OK) {
-          throw new RuntimeException("Got status code: " + statusCode);
+          throw new IOException("Got status code: " + statusCode);
         }
         InputStream is = method.getResponseBodyAsStream();
         IOHelper.copyStream(is, response.getOutputStream());
@@ -435,107 +472,116 @@
         // TODO(ejona): Handle this case.
         writer.write("TODO: ListItem");
       }
+      log.exiting("SiteDataClient", "getListItemDocContent");
     }
 
     private SiteDataStub.VirtualServer getContentVirtualServer()
         throws Exception {
+      log.entering("SiteDataClient", "getContentVirtualServer");
       SiteDataStub.GetContent request = new SiteDataStub.GetContent();
       request.setObjectType(SiteDataStub.ObjectType.VirtualServer);
       request.setRetrieveChildItems(true);
       request.setSecurityOnly(false);
       SiteDataStub.GetContentResponse response = stub.getContent(request);
-      if (DEBUG) {
-        System.out.println("                            VirtualServer");
-        System.out.println(response.getLastItemIdOnPage());
-        System.out.println(response.getGetContentResult());
-      }
+      log.log(Level.FINE, "GetContent(VirtualServer): Result={0}, "
+          + "LastItemIdOnPage={1}", new Object[] {
+          response.getLastItemIdOnPage(), response.getGetContentResult()});
       String xml = response.getGetContentResult();
       xml = xml.replace("<VirtualServer>",
           "<VirtualServer xmlns='" + XMLNS + "'>");
       XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
           new StringReader(xml));
-      return SiteDataStub.VirtualServer.Factory.parse(reader);
+      SiteDataStub.VirtualServer vs
+          = SiteDataStub.VirtualServer.Factory.parse(reader);
+      log.exiting("SiteDataClient", "getContentVirtualServer", vs);
+      return vs;
     }
 
     private SiteDataClient getClientForUrl(String url) throws Exception {
+      log.entering("SiteDataClient", "getClientForUrl", url);
       SiteDataStub.GetSiteAndWeb request = new SiteDataStub.GetSiteAndWeb();
       request.setStrUrl(url);
       SiteDataStub.GetSiteAndWebResponse response = stub.getSiteAndWeb(request);
-      if (DEBUG) {
-        System.out.println("GetSiteAndWeb");
-        System.out.println("Result: " + response.getGetSiteAndWebResult());
-        System.out.println("Site: " + response.getStrSite());
-        System.out.println("Web: " + response.getStrWeb());
-      }
+      log.log(Level.FINE, "GetSiteAndWeb: Result={0}, StrSite={1}, StrWeb={2}",
+          new Object[] {response.getGetSiteAndWebResult(),
+          response.getStrSite(), response.getStrWeb()});
       if (response.getGetSiteAndWebResult().longValue() != 0) {
+        log.exiting("SiteDataClient", "getClientForUrl", null);
         return null;
       }
-      return getSiteDataClient(response.getStrWeb());
+      SiteDataClient client = getSiteDataClient(response.getStrWeb());
+      log.exiting("SiteDataClient", "getClientForUrl", client);
+      return client;
     }
 
     private SiteDataStub.ContentDatabase getContentContentDatabase(String id)
         throws Exception {
+      log.entering("SiteDataClient", "getContentContentDatabase", id);
       SiteDataStub.GetContent request = new SiteDataStub.GetContent();
       request.setObjectType(SiteDataStub.ObjectType.ContentDatabase);
       request.setRetrieveChildItems(true);
       request.setSecurityOnly(false);
       request.setObjectId(id);
       SiteDataStub.GetContentResponse response = stub.getContent(request);
-      if (DEBUG) {
-        System.out.println("                            ContentDatabase");
-        System.out.println(response.getLastItemIdOnPage());
-        System.out.println(response.getGetContentResult());
-      }
+      log.log(Level.FINE, "GetContent(ContentDatabase): Result={0}, "
+          + "LastItemIdOnPage={1}", new Object[] {
+          response.getGetContentResult(), response.getLastItemIdOnPage()});
       String xml = response.getGetContentResult();
       xml = xml.replace("<ContentDatabase>",
           "<ContentDatabase xmlns='" + XMLNS + "'>");
       XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
           new StringReader(xml));
-      return SiteDataStub.ContentDatabase.Factory.parse(reader);
+      SiteDataStub.ContentDatabase cd
+          = SiteDataStub.ContentDatabase.Factory.parse(reader);
+      log.exiting("SiteDataClient", "getContentContentDatabase", cd);
+      return cd;
     }
 
     private SiteDataStub.Web getContentWeb(String id) throws Exception {
+      log.entering("SiteDataClient", "getContentWeb", id);
       SiteDataStub.GetContent request = new SiteDataStub.GetContent();
       request.setObjectType(SiteDataStub.ObjectType.Site);
       request.setRetrieveChildItems(true);
       request.setSecurityOnly(false);
       request.setObjectId(id);
       SiteDataStub.GetContentResponse response = stub.getContent(request);
-      if (DEBUG) {
-        System.out.println("                            Web");
-        System.out.println(id);
-        System.out.println(response.getLastItemIdOnPage());
-        System.out.println(response.getGetContentResult());
-      }
+      log.log(Level.FINE, "GetContent(Site): Result={0}, LastItemIdOnPage={1}",
+          new Object[] {response.getGetContentResult(),
+          response.getLastItemIdOnPage()});
       stub.getContent(request);
       String xml = response.getGetContentResult();
       xml = xml.replace("<Web>", "<Web xmlns='" + XMLNS + "'>");
       XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
           new StringReader(xml));
-      return SiteDataStub.Web.Factory.parse(reader);
+      SiteDataStub.Web web = SiteDataStub.Web.Factory.parse(reader);
+      log.exiting("SiteDataClient", "getContentWeb", web);
+      return web;
     }
 
     private SiteDataStub.List getContentList(String id) throws Exception {
+      log.entering("SiteDataClient", "getContentList", id);
       SiteDataStub.GetContent request = new SiteDataStub.GetContent();
       request.setObjectType(SiteDataStub.ObjectType.List);
       request.setRetrieveChildItems(false);
       request.setSecurityOnly(false);
       request.setObjectId(id);
       SiteDataStub.GetContentResponse response = stub.getContent(request);
-      if (DEBUG) {
-        System.out.println("                            List");
-        System.out.println(response.getLastItemIdOnPage());
-        System.out.println(response.getGetContentResult());
-      }
+      log.log(Level.FINE, "GetContent(List): Result={0}, LastItemIdOnPage={1}",
+          new Object[] {response.getGetContentResult(),
+          response.getLastItemIdOnPage()});
       String xml = response.getGetContentResult();
       xml = xml.replace("<List>", "<List xmlns='" + XMLNS + "'>");
       XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
           new StringReader(xml));
-      return SiteDataStub.List.Factory.parse(reader);
+      SiteDataStub.List list = SiteDataStub.List.Factory.parse(reader);
+      log.exiting("SiteDataClient", "getContentList", list);
+      return list;
     }
 
     private SiteDataStub.ItemData getContentItem(String listId, String itemId)
         throws Exception {
+      log.entering("SiteDataClient", "getContentItem",
+          new Object[] {listId, itemId});
       SiteDataStub.GetContent request = new SiteDataStub.GetContent();
       request.setObjectType(SiteDataStub.ObjectType.ListItem);
       request.setRetrieveChildItems(true);
@@ -544,21 +590,23 @@
       request.setFolderUrl("");
       request.setItemId(itemId);
       SiteDataStub.GetContentResponse response = stub.getContent(request);
-      if (DEBUG) {
-        System.out.println("                            ListItem");
-        System.out.println(response.getLastItemIdOnPage());
-        System.out.println(response.getGetContentResult());
-      }
+      log.log(Level.FINE, "GetContent(ListItem): Result={0}, "
+          + "LastItemIdOnPage={1}", new Object[] {
+          response.getGetContentResult(), response.getLastItemIdOnPage()});
       String xml = response.getGetContentResult();
       xml = xml.replace("<Item>", "<ItemData xmlns='" + XMLNS + "'>");
       xml = xml.replace("</Item>", "</ItemData>");
       XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
           new StringReader(xml));
-      return SiteDataStub.ItemData.Factory.parse(reader);
+      SiteDataStub.ItemData data = SiteDataStub.ItemData.Factory.parse(reader);
+      log.exiting("SiteDataClient", "getContentItem", data);
+      return data;
     }
 
     private SiteDataStub.Folder getContentFolder(String guid, String url)
         throws Exception {
+      log.entering("SiteDataClient", "getContentFolder",
+          new Object[] {guid, url});
       SiteDataStub.GetContent request = new SiteDataStub.GetContent();
       request.setObjectType(SiteDataStub.ObjectType.Folder);
       request.setRetrieveChildItems(true);
@@ -567,16 +615,16 @@
       request.setObjectId(guid);
       request.setLastItemIdOnPage("");
       SiteDataStub.GetContentResponse response = stub.getContent(request);
-      if (DEBUG) {
-        System.out.println("                            Folder (Specific)");
-        System.out.println(response.getLastItemIdOnPage());
-        System.out.println(response.getGetContentResult());
-      }
+      log.log(Level.FINE, "GetContent(Folder): Result={0}, "
+          + "LastItemIdOnPage={1}", new Object[] {
+          response.getGetContentResult(), response.getLastItemIdOnPage()});
       String xml = response.getGetContentResult();
       xml = xml.replace("<Folder>", "<Folder xmlns='" + XMLNS + "'>");
       XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(
           new StringReader(xml));
-      return SiteDataStub.Folder.Factory.parse(reader);
+      SiteDataStub.Folder folder = SiteDataStub.Folder.Factory.parse(reader);
+      log.exiting("SiteDataClient", "getContentFolder", folder);
+      return folder;
     }
   }
 }