Improve HTML for User profiles
Code review : https://codereview.appspot.com/12914044/
diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptor.java
index 92360d4..620410b 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptor.java
@@ -45,6 +45,7 @@
 import java.net.URLEncoder;
 import java.nio.charset.Charset;
 import java.rmi.RemoteException;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -90,7 +91,9 @@
 
   public static final String CONTACT_ELEMENT = "gsa:contact";
   public static final String CONTACTS_ROOT_ELEMENT = "gsa:Contacts";
-  public static final String GSA_NAMESPACE = "http://www.google.com/schemas/gsa";
+  public static final String GSA_NAMESPACE 
+      = "http://www.google.com/schemas/gsa";
+  public static final String PROFILE_PREFERRED_NAME_PROPERTY = "PreferredName";
 
   public static final String GSA_PROPNAME_COLLEAGUES =
       "google_social_user_colleagues";
@@ -102,7 +105,8 @@
     map.put("SPS-Skills", "google_social_user_skills");
     map.put("SPS-PastProjects", "google_social_user_pastprojects");
     map.put(PROFILE_ACCOUNTNAME_PROPERTY, "google_social_user_accountname");
-    map.put("PreferredName", "google_social_user_preferredname");
+    map.put(PROFILE_PREFERRED_NAME_PROPERTY,
+        "google_social_user_preferredname");
     SP_GSA_PROPERTY_MAPPINGS = Collections.unmodifiableMap(map);
   }
 
@@ -436,7 +440,6 @@
       }
 
       List<PropertyData> properties = userProfileProperties.getPropertyData();
-      StringBuilder sbDocContent = new StringBuilder();
       for (PropertyData prop : properties) {
         String propertyName = getGSAPropertyMapping(prop.getName());
         if (prop.getPrivacy() != Privacy.PUBLIC) {
@@ -447,7 +450,6 @@
         List<String> values = readUserProfilePropertyValues(prop);
         for (String v : values) {
           response.addMetadata(propertyName, v);
-          sbDocContent.append(propertyName + "=" + v + "\n");
         }
       }
       if (setAcl) {
@@ -466,12 +468,17 @@
         String colleaguesXml = serializeColleagues(colleagues);
         if (colleaguesXml != null) {
           response.addMetadata(GSA_PROPNAME_COLLEAGUES, colleaguesXml);
-          sbDocContent.append(
-              GSA_PROPNAME_COLLEAGUES + "=" + colleaguesXml + "\n");
         }
       }
+      String userProfileTitle = getUserProfilePropertySingleValue(
+          userProfileProperties, PROFILE_PREFERRED_NAME_PROPERTY);
+      if (userProfileTitle == null) {
+        userProfileTitle = userName;
+      }
       OutputStream os = response.getOutputStream();
-      os.write(sbDocContent.toString().getBytes(encoding));
+      os.write(MessageFormat.format("<html><head><title>{0}</title></head>"
+          + "<body><h1>{0}</h1></body></html>", 
+          escapeContent(userProfileTitle)).getBytes(encoding));
     }
 
     public String getModifiedDocIds(DocIdPusher pusher, String lastChangeToken)
@@ -551,6 +558,10 @@
           SP_GSA_PROPERTY_MAPPINGS.get(spPropertyName) :
             normalizeSPPropertyNameForGSA(spPropertyName);
     }
+    
+    private String escapeContent(String raw) {
+      return raw.replace("&", "&amp;").replace("<", "&lt;");
+    }
 
     /**
      * Normalize propertynames so that they become queryable in GSA.
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptorTest.java
index 3f04b9a..ce42836 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointUserProfileAdaptorTest.java
@@ -33,6 +33,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
 
@@ -51,6 +52,7 @@
 
   private Config config;
   private SharePointUserProfileAdaptor adaptor;
+  private final Charset charset = Charset.forName("UTF-8");
 
   @Before
   public void setup() {
@@ -143,6 +145,9 @@
     poulateProfileProperties(profile,
         SharePointUserProfileAdaptor.PROFILE_ACCOUNTNAME_PROPERTY,
         new String[] {"user1"});
+    poulateProfileProperties(profile,
+        SharePointUserProfileAdaptor.PROFILE_PREFERRED_NAME_PROPERTY,
+        new String[] {"First & Last"});
     String[] skills =
         new String[] {"Java", "SharePoint", "C++", "Design"};
     poulateProfileProperties(profile, "SPS-Skills", skills);
@@ -186,6 +191,11 @@
         new DocId(SharePointUserProfileAdaptor.SOCIAL_ID_PREFIX + "user1"));
     GetContentsResponse response = new GetContentsResponse(baos);
     adaptor.getDocContent(request, response);
+    
+    String responseString = new String(baos.toByteArray(), charset);
+    final String golden = "<html><head><title>First &amp; Last"
+        + "</title></head><body><h1>First &amp; Last</h1></body></html>";
+    assertEquals(golden, responseString);
 
     assertFalse(response.isNotFound());
     assertEquals("user1", response.getMetadata().getOneValue(