BUILTIN group handling for AD Adaptor
Code Review : https://codereview.appspot.com/13701045/
diff --git a/src/com/google/enterprise/adaptor/ad/AdAdaptor.java b/src/com/google/enterprise/adaptor/ad/AdAdaptor.java
index 3fe21e7..7977a14 100644
--- a/src/com/google/enterprise/adaptor/ad/AdAdaptor.java
+++ b/src/com/google/enterprise/adaptor/ad/AdAdaptor.java
@@ -43,6 +43,7 @@
   private String defaultPassword;  
   private List<AdServer> servers = new ArrayList<AdServer>();
   private Map<String, String> localizedStrings;
+  private boolean feedBuiltinGroups;
 
   @Override
   public void initConfig(Config config) {
@@ -54,6 +55,8 @@
     config.addKey("ad.localized.NTAuthority", "NT Authority");
     config.addKey("ad.localized.Interactive", "Interactive");
     config.addKey("ad.localized.AuthenticatedUsers", "Authenticated Users");
+    config.addKey("ad.localized.Builtin", "BUILTIN");
+    config.addKey("ad.feedBuiltinGroups", "false");
   }
 
   @Override
@@ -62,6 +65,8 @@
     log.config("common namespace: " + namespace);
     defaultUser = context.getConfig().getValue("ad.defaultUser");
     defaultPassword = context.getConfig().getValue("ad.defaultPassword");
+    feedBuiltinGroups = Boolean.parseBoolean(
+        context.getConfig().getValue("ad.feedBuiltinGroups"));
 
     List<Map<String, String>> serverConfigs
         = context.getConfig().getListOfConfigs("ad.servers");
@@ -208,7 +213,8 @@
         bySid.put(e.getSid(), e);
         byDn.put(e.getDn(), e);
         // TODO(pjo): Have AdServer put domain into AdEntity during search
-        domain.put(e, server.getnETBIOSName());
+        domain.put(e, e.getSid().startsWith("S-1-5-32-") ? 
+            localizedStrings.get("Builtin") : server.getnETBIOSName());
       }
       initializeMembers();
       resolvePrimaryGroups();
@@ -288,12 +294,22 @@
         if (!entity.isGroup()) {
           continue;
         }
-        String groupName = getPrincipalName(entity);
-        GroupPrincipal group = new GroupPrincipal(groupName, namespace);
-        List<Principal> def = new ArrayList<Principal>();
+
         if (!allMembers.containsKey(entity)) {
           continue;
         }
+
+        String groupName = getPrincipalName(entity);
+        GroupPrincipal group = new GroupPrincipal(groupName, namespace);
+        List<Principal> def = new ArrayList<Principal>();
+
+        if(!feedBuiltinGroups 
+            && entity.getSid().startsWith("S-1-5-32-")) {
+          log.log(Level.FINER, "Sending empty BUILTIN Group {0}", entity);
+          groups.put(group, def);
+          continue;        
+        }
+        
         for (String memberDn : allMembers.get(entity)) {
           AdEntity member = byDn.get(memberDn);
           if (member == null) {
@@ -314,10 +330,7 @@
           log.log(Level.FINE, "Well known group {0} with # members {1}",
               new Object[]{group, def.size()});
         }
-        // TODO(pjo): send empty groups?
-        if (0 != def.size()) {
-          groups.put(group, def);
-        }
+        groups.put(group, def);
       }
       log.log(Level.FINE, "number of groups defined: {0}",
            groups.keySet().size());