You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2013/10/26 14:46:19 UTC

svn commit: r1535983 [2/2] - in /manifoldcf/trunk: ./ connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/ framework/authority-servlet/src/main/java/org/apache/manifoldcf/authorityservlet/ framework/crawler-ui/src/main...

Modified: manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java (original)
+++ manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java Sat Oct 26 12:46:18 2013
@@ -230,12 +230,14 @@ public class ManifoldCF extends org.apac
   }
 
   // Connectors configuration file
+  protected static final String NODE_AUTHORIZATIONDOMAIN = "authorizationdomain";
   protected static final String NODE_OUTPUTCONNECTOR = "outputconnector";
   protected static final String NODE_MAPPINGCONNECTOR = "mappingconnector";
   protected static final String NODE_AUTHORITYCONNECTOR = "authorityconnector";
   protected static final String NODE_REPOSITORYCONNECTOR = "repositoryconnector";
   protected static final String ATTRIBUTE_NAME = "name";
   protected static final String ATTRIBUTE_CLASS = "class";
+  protected static final String ATTRIBUTE_DOMAIN = "domain";
   
   /** Unregister all connectors which don't match a specified connector list.
   */
@@ -249,12 +251,20 @@ public class ManifoldCF extends org.apac
     Map<String,String> desiredAuthorityConnectors = new HashMap<String,String>();
     Map<String,String> desiredRepositoryConnectors = new HashMap<String,String>();
 
+    Map<String,String> desiredDomains = new HashMap<String,String>();
+
     if (c != null)
     {
       for (int i = 0; i < c.getChildCount(); i++)
       {
         ConfigurationNode cn = c.findChild(i);
-        if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
+        if (cn.getType().equals(NODE_AUTHORIZATIONDOMAIN))
+        {
+          String domainName = cn.getAttributeValue(ATTRIBUTE_DOMAIN);
+          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+          desiredDomains.put(domainName,name);
+        }
+        else if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
         {
           String name = cn.getAttributeValue(ATTRIBUTE_NAME);
           String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
@@ -287,6 +297,23 @@ public class ManifoldCF extends org.apac
       ManifoldCF.getMasterDatabaseUsername(),
       ManifoldCF.getMasterDatabasePassword());
 
+    // Domains...
+    {
+      IAuthorizationDomainManager mgr = AuthorizationDomainManagerFactory.make(tc);
+      IResultSet domains = mgr.getDomains();
+      for (int i = 0; i < domains.getRowCount(); i++)
+      {
+        IResultRow row = domains.getRow(i);
+        String domainName = (String)row.getValue("domainname");
+        String description = (String)row.getValue("description");
+        if (desiredDomains.get(domainName) == null || !desiredDomains.get(domainName).equals(description))
+        {
+          mgr.unregisterDomain(domainName);
+        }
+      }
+      System.err.println("Successfully unregistered all domains");
+    }
+    
     // Output connectors...
     {
       IOutputConnectorManager mgr = OutputConnectorManagerFactory.make(tc);
@@ -430,7 +457,14 @@ public class ManifoldCF extends org.apac
       while (i < c.getChildCount())
       {
         ConfigurationNode cn = c.findChild(i++);
-        if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
+        if (cn.getType().equals(NODE_AUTHORIZATIONDOMAIN))
+        {
+          String domainName = cn.getAttributeValue(ATTRIBUTE_DOMAIN);
+          String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+          IAuthorizationDomainManager mgr = AuthorizationDomainManagerFactory.make(tc);
+          mgr.registerDomain(name,domainName);
+        }
+        else if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
         {
           String name = cn.getAttributeValue(ATTRIBUTE_NAME);
           String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
@@ -1084,6 +1118,7 @@ public class ManifoldCF extends org.apac
       ManifoldCF.getMasterDatabasePassword());
     // Also create the following managers, which will handle the actual details of writing configuration data
     IOutputConnectionManager outputManager = OutputConnectionManagerFactory.make(threadContext);
+    IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(threadContext);
     IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
     IMappingConnectionManager mappingManager = MappingConnectionManagerFactory.make(threadContext);
     IAuthorityConnectionManager authManager = AuthorityConnectionManagerFactory.make(threadContext);
@@ -1147,6 +1182,11 @@ public class ManifoldCF extends org.apac
             outputManager.exportConfiguration(zos);
             zos.closeEntry();
 
+            java.util.zip.ZipEntry groupEntry = new java.util.zip.ZipEntry("groups");
+            zos.putNextEntry(groupEntry);
+            groupManager.exportConfiguration(zos);
+            zos.closeEntry();
+
             java.util.zip.ZipEntry mappingEntry = new java.util.zip.ZipEntry("mappings");
             zos.putNextEntry(mappingEntry);
             mappingManager.exportConfiguration(zos);
@@ -1218,6 +1258,7 @@ public class ManifoldCF extends org.apac
       ManifoldCF.getMasterDatabasePassword());
     // Also create the following managers, which will handle the actual details of reading configuration data
     IOutputConnectionManager outputManager = OutputConnectionManagerFactory.make(threadContext);
+    IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(threadContext);
     IRepositoryConnectionManager connManager = RepositoryConnectionManagerFactory.make(threadContext);
     IMappingConnectionManager mappingManager = MappingConnectionManagerFactory.make(threadContext);
     IAuthorityConnectionManager authManager = AuthorityConnectionManagerFactory.make(threadContext);
@@ -1275,6 +1316,8 @@ public class ManifoldCF extends org.apac
               String name = z.getName();
               if (name.equals("outputs"))
                 outputManager.importConfiguration(zis);
+              else if (name.equals("groups"))
+                groupManager.importConfiguration(zis);
               else if (name.equals("mappings"))
                 mappingManager.importConfiguration(zis);
               else if (name.equals("authorities"))
@@ -1663,6 +1706,8 @@ public class ManifoldCF extends org.apac
   
   protected static final String API_JOBNODE = "job";
   protected static final String API_JOBSTATUSNODE = "jobstatus";
+  protected static final String API_AUTHORIZATIONDOMAINNODE = "authorizationdomain";
+  protected static final String API_AUTHORITYGROUPNODE = "authoritygroup";
   protected static final String API_REPOSITORYCONNECTORNODE = "repositoryconnector";
   protected static final String API_OUTPUTCONNECTORNODE = "outputconnector";
   protected static final String API_AUTHORITYCONNECTORNODE = "authorityconnector";
@@ -1684,6 +1729,10 @@ public class ManifoldCF extends org.apac
   protected static final String CONNECTORNODE_DESCRIPTION = "description";
   protected static final String CONNECTORNODE_CLASSNAME = "class_name";
   
+  // Authorization domain nodes
+  protected static final String AUTHORIZATIONDOMAINNODE_DESCRIPTION = "description";
+  protected static final String AUTHORIZATIONDOMAINNODE_DOMAINNAME = "domain_name";
+  
   /** Decode path element.
   * Path elements in the API world cannot have "/" characters, or they become impossible to parse.  This method undoes
   * escaping that prevents "/" from appearing.
@@ -1936,6 +1985,7 @@ public class ManifoldCF extends org.apac
     return READRESULT_FOUND;
   }
   
+  
   /** Read an output connection's info */
   protected static int apiReadOutputConnectionInfo(IThreadContext tc, Configuration output, String connectionName, String command)
     throws ManifoldCFException
@@ -2112,6 +2162,57 @@ public class ManifoldCF extends org.apac
     return READRESULT_FOUND;
   }
   
+  /** Get authority groups */
+  protected static int apiReadAuthorityGroups(IThreadContext tc, Configuration output)
+    throws ManifoldCFException
+  {
+    try
+    {
+      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
+      IAuthorityGroup[] groups = groupManager.getAllGroups();
+      int i = 0;
+      while (i < groups.length)
+      {
+        ConfigurationNode groupNode = new ConfigurationNode(API_AUTHORITYGROUPNODE);
+        formatAuthorityGroup(groupNode,groups[i++]);
+        output.addChild(output.getChildCount(),groupNode);
+      }
+    }
+    catch (ManifoldCFException e)
+    {
+      createErrorNode(output,e);
+    }
+    return READRESULT_FOUND;
+  }
+  
+  /** Read authority group */
+  protected static int apiReadAuthorityGroup(IThreadContext tc, Configuration output, String groupName)
+    throws ManifoldCFException
+  {
+    try
+    {
+      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
+      IAuthorityGroup group = groupManager.load(groupName);
+      if (group != null)
+      {
+        // Fill the return object with job information
+        ConfigurationNode groupNode = new ConfigurationNode(API_AUTHORITYGROUPNODE);
+        formatAuthorityGroup(groupNode,group);
+        output.addChild(output.getChildCount(),groupNode);
+      }
+      else
+      {
+        createErrorNode(output,"Authority group '"+groupName+"' does not exist.");
+        return READRESULT_NOTFOUND;
+      }
+    }
+    catch (ManifoldCFException e)
+    {
+      createErrorNode(output,e);
+    }
+    return READRESULT_FOUND;
+  }
+
   /** Get output connections */
   protected static int apiReadOutputConnections(IThreadContext tc, Configuration output)
     throws ManifoldCFException
@@ -2427,6 +2528,44 @@ public class ManifoldCF extends org.apac
     return READRESULT_FOUND;
   }
 
+  /** List authorization domains */
+  protected static int apiReadAuthorizationDomains(IThreadContext tc, Configuration output)
+    throws ManifoldCFException
+  {
+    // List registered authorization domains
+    try
+    {
+      IAuthorizationDomainManager manager = AuthorizationDomainManagerFactory.make(tc);
+      IResultSet resultSet = manager.getDomains();
+      int j = 0;
+      while (j < resultSet.getRowCount())
+      {
+        IResultRow row = resultSet.getRow(j++);
+        ConfigurationNode child = new ConfigurationNode(API_AUTHORIZATIONDOMAINNODE);
+        String description = (String)row.getValue("description");
+        String domainName = (String)row.getValue("domainname");
+        ConfigurationNode node;
+        if (description != null)
+        {
+          node = new ConfigurationNode(AUTHORIZATIONDOMAINNODE_DESCRIPTION);
+          node.setValue(description);
+          child.addChild(child.getChildCount(),node);
+        }
+        node = new ConfigurationNode(AUTHORIZATIONDOMAINNODE_DOMAINNAME);
+        node.setValue(domainName);
+        child.addChild(child.getChildCount(),node);
+
+        output.addChild(output.getChildCount(),child);
+      }
+    }
+    catch (ManifoldCFException e)
+    {
+      createErrorNode(output,e);
+    }
+    return READRESULT_FOUND;
+
+  }
+  
   /** List repository connectors */
   protected static int apiReadRepositoryConnectors(IThreadContext tc, Configuration output)
     throws ManifoldCFException
@@ -3208,6 +3347,15 @@ public class ManifoldCF extends org.apac
       Long jobID = new Long(path.substring("jobstatusesnocounts/".length()));
       return apiReadJobStatusNoCounts(tc,output,jobID);
     }
+    else if (path.equals("authoritygroups"))
+    {
+      return apiReadAuthorityGroups(tc,output);
+    }
+    else if (path.startsWith("authoritygroups/"))
+    {
+      String groupName = decodeAPIPathElement(path.substring("authoritygroups/".length()));
+      return apiReadAuthorityGroup(tc,output,groupName);
+    }
     else if (path.equals("outputconnections"))
     {
       return apiReadOutputConnections(tc,output);
@@ -3259,7 +3407,11 @@ public class ManifoldCF extends org.apac
     else if (path.equals("repositoryconnectors"))
     {
       return apiReadRepositoryConnectors(tc,output);
-    }   
+    }
+    else if (path.equals("authorizationdomains"))
+    {
+      return apiReadAuthorizationDomains(tc,output);
+    }
     else
     {
       createErrorNode(output,"Unrecognized resource.");
@@ -3465,6 +3617,41 @@ public class ManifoldCF extends org.apac
     return WRITERESULT_FOUND;
   }
 
+  /** Write authority group.
+  */
+  protected static int apiWriteAuthorityGroup(IThreadContext tc, Configuration output, Configuration input, String groupName)
+    throws ManifoldCFException
+  {
+    ConfigurationNode groupNode = findConfigurationNode(input,API_AUTHORITYGROUPNODE);
+    if (groupNode == null)
+      throw new ManifoldCFException("Input argument must have '"+API_AUTHORITYGROUPNODE+"' field");
+      
+    // Turn the configuration node into an AuthorityGroup
+    org.apache.manifoldcf.authorities.authgroups.AuthorityGroup authorityGroup = new org.apache.manifoldcf.authorities.authgroups.AuthorityGroup();
+    processAuthorityGroup(authorityGroup,groupNode);
+      
+    if (authorityGroup.getName() == null)
+      authorityGroup.setName(groupName);
+    else
+    {
+      if (!authorityGroup.getName().equals(groupName))
+        throw new ManifoldCFException("Authority group name in path and in object must agree");
+    }
+      
+    try
+    {
+      // Save the connection.
+      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
+      if (groupManager.save(authorityGroup))
+        return WRITERESULT_CREATED;
+    }
+    catch (ManifoldCFException e)
+    {
+      createErrorNode(output,e);
+    }
+    return WRITERESULT_FOUND;
+  }
+
   /** Write output connection.
   */
   protected static int apiWriteOutputConnection(IThreadContext tc, Configuration output, Configuration input, String connectionName)
@@ -3672,6 +3859,11 @@ public class ManifoldCF extends org.apac
       Long jobID = new Long(path.substring("jobs/".length()));
       return apiWriteJob(tc,output,input,jobID);
     }
+    else if (path.startsWith("authoritygroups/"))
+    {
+      String groupName = decodeAPIPathElement(path.substring("authoritygroups/".length()));
+      return apiWriteAuthorityGroup(tc,output,input,groupName);
+    }
     else if (path.startsWith("outputconnections/"))
     {
       String connectionName = decodeAPIPathElement(path.substring("outputconnections/".length()));
@@ -3743,6 +3935,23 @@ public class ManifoldCF extends org.apac
     return DELETERESULT_FOUND;
   }
   
+  /** Delete authority group.
+  */
+  protected static int apiDeleteAuthorityGroup(IThreadContext tc, Configuration output, String groupName)
+    throws ManifoldCFException
+  {
+    try
+    {
+      IAuthorityGroupManager groupManager = AuthorityGroupManagerFactory.make(tc);
+      groupManager.delete(groupName);
+    }
+    catch (ManifoldCFException e)
+    {
+      createErrorNode(output,e);
+    }
+    return DELETERESULT_FOUND;
+  }
+
   /** Delete output connection.
   */
   protected static int apiDeleteOutputConnection(IThreadContext tc, Configuration output, String connectionName)
@@ -3808,6 +4017,11 @@ public class ManifoldCF extends org.apac
       Long jobID = new Long(path.substring("jobs/".length()));
       return apiDeleteJob(tc,output,jobID);
     }
+    else if (path.startsWith("authoritygroups/"))
+    {
+      String groupName = decodeAPIPathElement(path.substring("authoritygroups/".length()));
+      return apiDeleteAuthorityGroup(tc,output,groupName);
+    }
     else if (path.startsWith("outputconnections/"))
     {
       String connectionName = decodeAPIPathElement(path.substring("outputconnections/".length()));
@@ -4514,6 +4728,73 @@ public class ManifoldCF extends org.apac
 
   // End of jobstatus API support.
   
+  // Authority group API
+  
+  protected static final String AUTHGROUPNODE_ISNEW = "isnew";
+  protected static final String AUTHGROUPNODE_NAME = "name";
+  protected static final String AUTHGROUPNODE_DESCRIPTION = "description";
+  
+  // Output connection API support.
+  
+  /** Convert input hierarchy into an AuthorityGroup object.
+  */
+  protected static void processAuthorityGroup(org.apache.manifoldcf.authorities.authgroups.AuthorityGroup group, ConfigurationNode groupNode)
+    throws ManifoldCFException
+  {
+    // Walk through the node's children
+    int i = 0;
+    while (i < groupNode.getChildCount())
+    {
+      ConfigurationNode child = groupNode.findChild(i++);
+      String childType = child.getType();
+      if (childType.equals(AUTHGROUPNODE_ISNEW))
+      {
+        if (child.getValue() == null)
+          throw new ManifoldCFException("Authority group isnew node requires a value");
+        group.setIsNew(child.getValue().equals("true"));
+      }
+      else if (childType.equals(AUTHGROUPNODE_NAME))
+      {
+        if (child.getValue() == null)
+          throw new ManifoldCFException("Authority group name node requires a value");
+        group.setName(child.getValue());
+      }
+      else if (childType.equals(AUTHGROUPNODE_DESCRIPTION))
+      {
+        if (child.getValue() == null)
+          throw new ManifoldCFException("Authority group description node requires a value");
+        group.setDescription(child.getValue());
+      }
+      else
+        throw new ManifoldCFException("Unrecognized authority group field: '"+childType+"'");
+    }
+
+  }
+  
+  /** Format an authority group.
+  */
+  protected static void formatAuthorityGroup(ConfigurationNode groupNode, IAuthorityGroup group)
+  {
+    ConfigurationNode child;
+    int j;
+
+    child = new ConfigurationNode(AUTHGROUPNODE_ISNEW);
+    child.setValue(group.getIsNew()?"true":"false");
+    groupNode.addChild(groupNode.getChildCount(),child);
+
+    child = new ConfigurationNode(AUTHGROUPNODE_NAME);
+    child.setValue(group.getName());
+    groupNode.addChild(groupNode.getChildCount(),child);
+
+    if (group.getDescription() != null)
+    {
+      child = new ConfigurationNode(AUTHGROUPNODE_DESCRIPTION);
+      child.setValue(group.getDescription());
+      groupNode.addChild(groupNode.getChildCount(),child);
+    }
+    
+  }
+
   // Connection API
   
   protected static final String CONNECTIONNODE_ISNEW = "isnew";
@@ -4528,6 +4809,8 @@ public class ManifoldCF extends org.apac
   protected static final String CONNECTIONNODE_MATCH = "match";
   protected static final String CONNECTIONNODE_MATCHDESCRIPTION = "match_description";
   protected static final String CONNECTIONNODE_RATE = "rate";
+  protected static final String CONNECTIONNODE_AUTHDOMAIN = "authdomain";
+  protected static final String CONNECTIONNODE_AUTHGROUP = "authgroup";
   
   // Output connection API support.
   
@@ -4691,6 +4974,18 @@ public class ManifoldCF extends org.apac
           throw new ManifoldCFException("Connection prerequisite node requires a value");
         connection.setPrerequisiteMapping(child.getValue());
       }
+      else if (childType.equals(CONNECTIONNODE_AUTHDOMAIN))
+      {
+        if (child.getValue() == null)
+          throw new ManifoldCFException("Connection authdomain node requires a value");
+        connection.setAuthDomain(child.getValue());
+      }
+      else if (childType.equals(CONNECTIONNODE_AUTHGROUP))
+      {
+        if (child.getValue() == null)
+          throw new ManifoldCFException("Connection authgroup node requires a value");
+        connection.setAuthGroup(child.getValue());
+      }
       else if (childType.equals(CONNECTIONNODE_DESCRIPTION))
       {
         if (child.getValue() == null)
@@ -4755,6 +5050,17 @@ public class ManifoldCF extends org.apac
       connectionNode.addChild(connectionNode.getChildCount(),child);
     }
     
+    if (connection.getAuthDomain() != null)
+    {
+      child = new ConfigurationNode(CONNECTIONNODE_AUTHDOMAIN);
+      child.setValue(connection.getAuthDomain());
+      connectionNode.addChild(connectionNode.getChildCount(),child);
+    }
+    
+    child = new ConfigurationNode(CONNECTIONNODE_AUTHGROUP);
+    child.setValue(connection.getAuthGroup());
+    connectionNode.addChild(connectionNode.getChildCount(),child);
+
     ConfigParams cp = connection.getConfigParams();
     child = new ConfigurationNode(CONNECTIONNODE_CONFIGURATION);
     j = 0;

Modified: manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties (original)
+++ manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties Sat Oct 26 12:46:18 2013
@@ -45,10 +45,10 @@ banner.DocumentIngestion=Document Ingest
 navigation.LogOut=Log Out
 navigation.Outputs=Outputs
 navigation.ListOutputConnections=List Output Connections
-navigation.UserMappings=User Mappings
-navigation.ListUserMappings=List User Mapping Connections
 navigation.Authorities=Authorities
+navigation.ListUserMappings=List User Mapping Connections
 navigation.ListAuthorityConnections=List Authority Connections
+navigation.ListAuthorityGroups=List Authority Groups
 navigation.Repositories=Repositories
 navigation.ListRepositoryConnections=List Repository Connections
 navigation.Jobs=Jobs
@@ -69,6 +69,7 @@ navigation.Listoutputconnections=List ou
 navigation.Listrepositoryconnections=List repository connections
 navigation.Listusermappings=List user mapping connections
 navigation.Listauthorities=List authorities
+navigation.Listauthoritygroups=List authority groups
 navigation.Listjobs=List jobs
 navigation.Managejobs=Manage jobs
 navigation.Documentstatus=Document status
@@ -135,6 +136,17 @@ viewoutput.uninstalled=(uninstalled)
 viewoutput.Connectorisnotinstalled=Connector is not installed.
 viewoutput.Threwexception=Threw exception:
 
+listgroups.ApacheManifoldCFListAuthorityGroups=Apache ManifoldCF: List Authority Groups
+listgroups.DeleteAuthorityGroup=Delete authority group
+listgroups.ListOfAuthorityGroups=List of Authority Groups
+listgroups.Name=Name
+listgroups.Description=Description
+listgroups.View=View
+listgroups.Edit=Edit
+listgroups.Delete=Delete
+listgroups.AddNewGroup=Add new authority group
+listgroups.AddaNewGroup=Add a new authority group
+
 listauthorities.ApacheManifoldCFListAuthorities=Apache ManifoldCF: List Authorities
 listauthorities.ListOfAuthorityConnections=List of Authority Connections
 listauthorities.DeleteAuthority=Delete authority
@@ -163,6 +175,19 @@ listmappers.Edit=Edit
 listmappers.Delete=Delete
 listmappers.uninstalled=(uninstalled)
 
+editgroup.Name=Name
+editgroup.ApacheManifoldCFEditAuthorityGroup=Apache ManifoldCF: Edit Authority Group
+editgroup.AuthorityGroupMustHaveAName=Authority group must have a name
+editgroup.tab=tab
+editgroup.EditGroup=Edit group
+editgroup.EditAGroup=Edit a group
+editgroup.NameColon=Name:
+editgroup.DescriptionColon=Description:
+editgroup.Save=Save
+editgroup.SaveThisAuthorityGroup=Save this authority group
+editgroup.Cancel=Cancel
+editgroup.CancelAuthorityGroupEditing=Cancel authority group editing
+
 editauthority.ApacheManifoldCFEditAuthority=Apache ManifoldCF: Edit Authority
 editauthority.EditAnAuthority=Edit an Authority
 editauthority.NameColon=Name:
@@ -189,6 +214,12 @@ editauthority.EditAuthorityConnection=Ed
 editauthority.Prerequisites=Prerequisites
 editauthority.PrerequisiteUserMappingColon=Prerequisite user mapping:
 editauthority.NoPrerequisites=(No Prerequisites)
+editauthority.AuthorizationDomainColon=Authorization domain:
+editauthority.AuthorityGroupColon=Authority group:
+editauthority.SelectAGroup=--Select a group--
+editauthority.ConnectionMustHaveAGroup=Authority connection must have a group
+editauthority.NoAuthorityGroupsDefinedCreateOneFirst=No authority groups have been defined; create one first
+editauthority.DefaultDomainNone=Default domain (None)
 
 editmapper.ApacheManifoldCFEditMapping=Apache ManifoldCF: Edit Mapping
 editmapper.EditAMapping=Edit A Mapping
@@ -222,7 +253,7 @@ listconnections.ListOfRepositoryConnecti
 listconnections.Name=Name
 listconnections.Description=Description
 listconnections.ConnectionType=Connection Type
-listconnections.Authority=Authority
+listconnections.AuthorityGroup=Authority Group
 listconnections.Max=Max
 listconnections.AddNewConnection=Add new connection
 listconnections.View=View
@@ -235,7 +266,7 @@ listconnections.uninstalled=(uninstalled
 editconnection.ApacheManifoldCFEditConnection=Apache ManifoldCF: Edit Connection
 editconnection.EditAConnection=Edit a Connection
 editconnection.ConnectionTypeColon=Connection type:
-editconnection.AuthorityColon=Authority:
+editconnection.AuthorityGroupColon=Authority group:
 editconnection.Cancel=Cancel
 editconnection.CancelConnectionEditing=Cancel connection editing
 editconnection.NameColon=Name:
@@ -272,7 +303,7 @@ viewconnection.NameColon=Name:
 viewconnection.DescriptionColon=Description:
 viewconnection.ConnectionTypeColon=Connection type:
 viewconnection.MaxConnectionsColon=Max connections:
-viewconnection.AuthorityColon=Authority:
+viewconnection.AuthorityGroupColon=Authority group:
 viewconnection.ThrottlingColon=Throttling:
 viewconnection.NoThrottles=No throttles
 viewconnection.ConnectionStatusColon=Connection status:
@@ -811,6 +842,15 @@ viewjob.JobInvocationColon=Job invocatio
 viewjob.Minimal=Minimal
 viewjob.Complete=Complete
 
+viewgroup.ApacheManifoldCFViewGroup=Apache ManifoldCF: View Authority Group
+viewgroup.ViewAuthorityGroup=View Authority Group
+viewgroup.NameColon=Name:
+viewgroup.DescriptionColon=Description:
+viewgroup.EditThisAuthorityGroup=Edit this authority group
+viewgroup.Edit=Edit
+viewgroup.DeleteThisAuthorityGroup=Delete this authority group
+viewgroup.Delete=Delete
+
 viewauthority.ViewAuthorityConnectionStatus=View Authority Connection Status
 viewauthority.NameColon=Name:
 viewauthority.DescriptionColon=Description:
@@ -830,6 +870,8 @@ viewauthority.Threwexception=Threw excep
 viewauthority.qmark=?
 viewauthority.PrerequisiteUserMappingColon=Prerequisite user mapping:
 viewauthority.NoPrerequisites=No prerequisites
+viewauthority.AuthorizationDomainColon=Authorization domain:
+viewauthority.AuthorityGroupColon=Authority group:
 
 viewmapper.ApacheManifoldCFViewMappingConnectionStatus=Apache ManifoldCF: View Mapping Connection Status
 viewmapper.DeleteConnection=Delete connection

Modified: manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties (original)
+++ manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties Sat Oct 26 12:46:18 2013
@@ -45,10 +45,10 @@ banner.DocumentIngestion=コンã�
 navigation.LogOut=ログアウト
 navigation.Outputs=出力
 navigation.ListOutputConnections=出力コネクション一覧
-navigation.UserMappings=ユーザーマッピング
-navigation.ListUserMappings=ユーザーマッピングコネクション一覧
 navigation.Authorities=権限
+navigation.ListUserMappings=ユーザーマッピングコネクション一覧
 navigation.ListAuthorityConnections=権限コネクション一覧
+navigation.ListAuthorityGroups=List Authority Groups
 navigation.Repositories=リポジトリ
 navigation.ListRepositoryConnections=リポジトリコネクション一覧
 navigation.Jobs=ジョブ
@@ -69,6 +69,7 @@ navigation.Listrepositoryconnections=ã�
 navigation.Listoutputconnections=出力コネクション一覧
 navigation.Listusermappings=ユーザーマッピングコネクション一覧
 navigation.Listauthorities=権限一覧
+navigation.Listauthoritygroups=List authority groups
 navigation.Listjobs=ジョブ一覧
 navigation.Managejobs=ジョブ管理
 navigation.Documentstatus=コンテンツの状態
@@ -135,6 +136,17 @@ viewoutput.uninstalled=(アãƒ�
 viewoutput.Connectorisnotinstalled=コネクターがインストールされていません
 viewoutput.Threwexception=例外がスローされました:
 
+listgroups.ApacheManifoldCFListAuthorityGroups=Apache ManifoldCF: List Authority Groups
+listgroups.DeleteAuthorityGroup=Delete authority group
+listgroups.ListOfAuthorityGroups=List of Authority Groups
+listgroups.Name=Name
+listgroups.Description=Description
+listgroups.View=View
+listgroups.Edit=Edit
+listgroups.Delete=Delete
+listgroups.AddNewGroup=Add a new group
+listgroups.AddaNewGroup=Add a new group
+
 listauthorities.ApacheManifoldCFListAuthorities=Apache ManifoldCF:権限一覧
 listauthorities.ListOfAuthorityConnections=権限コネクション一覧
 listauthorities.DeleteAuthority=権限を削除
@@ -163,6 +175,19 @@ listmappers.Edit=編集
 listmappers.Delete=削除
 listmappers.uninstalled=(アンインストール)
 
+editgroup.Name=Name
+editgroup.ApacheManifoldCFEditAuthorityGroup=Apache ManifoldCF: Edit Authority Group
+editgroup.AuthorityGroupMustHaveAName=Authority group must have a name
+editgroup.tab=tab
+editgroup.EditGroup=Edit group
+editgroup.EditAGroup=Edit a group
+editgroup.NameColon=Name:
+editgroup.DescriptionColon=Description:
+editgroup.Save=Save
+editgroup.SaveThisAuthorityGroup=Save this authority group
+editgroup.Cancel=Cancel
+editgroup.CancelAuthorityGroupEditing=Cancel authority group editing
+
 editauthority.ApacheManifoldCFEditAuthority=Apache ManifoldCF:権限の編集
 editauthority.EditAnAuthority=権限を編集
 editauthority.NameColon=名前:
@@ -189,6 +214,12 @@ editauthority.EditAuthorityConnection=æ
 editauthority.Prerequisites=条件
 editauthority.PrerequisiteUserMappingColon=前提ユーザーマッピング:
 editauthority.NoPrerequisites=(条件無し)
+editauthority.AuthorizationDomainColon=Authorization domain:
+editauthority.AuthorityGroupColon=Authority group:
+editauthority.SelectAGroup=--Select a group--
+editauthority.ConnectionMustHaveAGroup=Authority connection must have a group
+editauthority.NoAuthorityGroupsDefinedCreateOneFirst=No authority groups have been defined; create one first
+editauthority.DefaultDomainNone=Default domain (None)
 
 editmapper.ApacheManifoldCFEditMapping=Apache ManifoldCF: マッピングの編集
 editmapper.EditAMapping=マッピングを編集
@@ -222,7 +253,7 @@ listconnections.ListOfRepositoryConnecti
 listconnections.Name=名前
 listconnections.Description=説明
 listconnections.ConnectionType=コネクションタイプ
-listconnections.Authority=権限
+listconnections.AuthorityGroup=Authority Group
 listconnections.Max=最大値
 listconnections.AddNewConnection=新しいコネクションを追加
 listconnections.View=表示
@@ -235,7 +266,7 @@ listconnections.uninstalled=(ア
 editconnection.ApacheManifoldCFEditConnection=Apache ManifoldCF:コネクションを編集
 editconnection.EditAConnection=コネクションを編集
 editconnection.ConnectionTypeColon=コネクションタイプ:
-editconnection.AuthorityColon=権限:
+editconnection.AuthorityGroupColon=Authority group:
 editconnection.Cancel=キャンセル
 editconnection.CancelConnectionEditing=コネクションの編集をキャンセル
 editconnection.NameColon=名前:
@@ -272,7 +303,7 @@ viewconnection.NameColon=名前ï�
 viewconnection.DescriptionColon=説明:
 viewconnection.ConnectionTypeColon=コネクションタイプ:
 viewconnection.MaxConnectionsColon=最大コネクション数:
-viewconnection.AuthorityColon=権限:
+viewconnection.AuthorityGroupColon=Authority group:
 viewconnection.ThrottlingColon=スロットリング:
 viewconnection.NoThrottles=スロットリングなし
 viewconnection.ConnectionStatusColon=コネクションの状態:
@@ -812,6 +843,15 @@ viewjob.JobInvocationColon=ジョ�
 viewjob.Minimal=最小
 viewjob.Complete=完了
 
+viewgroup.ApacheManifoldCFViewGroup=Apache ManifoldCF: View Authority Group
+viewgroup.ViewAuthorityGroup=View Authority Group
+viewgroup.NameColon=Name:
+viewgroup.DescriptionColon=Description:
+viewgroup.EditThisAuthorityGroup=Edit this authority group
+viewgroup.Edit=Edit
+viewgroup.DeleteThisAuthorityGroup=Delete this authority group
+viewgroup.Delete=Delete
+
 viewauthority.ViewAuthorityConnectionStatus=権限コネクション状態の表示
 viewauthority.NameColon=名前:
 viewauthority.DescriptionColon=説明:
@@ -831,6 +871,8 @@ viewauthority.Threwexception=例å¤�
 viewauthority.qmark=?
 viewauthority.PrerequisiteUserMappingColon=前提ユーザーマッピング:
 viewauthority.NoPrerequisites=条件無し
+viewauthority.AuthorizationDomainColon=Authorization domain:
+viewauthority.AuthorityGroupColon=Authority group:
 
 viewmapper.ApacheManifoldCFViewMappingConnectionStatus=Apache ManifoldCF: マッピングコネクション状態の表示
 viewmapper.DeleteConnection=コネクションを削除

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/concepts.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/concepts.xml?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/concepts.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/concepts.xml Sat Oct 26 12:46:18 2013
@@ -62,18 +62,36 @@
           would be an Active Directory SID (e.g. "S-1-23-4-1-45").  But, for example, for documents protected by Livelink a wholly different string would be used.</p>
         <p></p>
         <p>In the ManifoldCF security model, it is the job of an <em>authority</em> to provide a list of access tokens for a given searching user.  Multiple authorities cooperate
-          in that each one can add to the list of access tokens describing a given user's security.  The resulting access tokens are handed to the search engine as part of every
+          in that each one can add to the list of access tokens describing a given user's security.  A user is described in terms of a set of <em>authorization domains</em>
+          and user name tuples.  Any given authority will provide access tokens for a user name corresponding to one authorization domain.  For example,
+          an authority that understands FaceBook users would only respond to a FaceBook user name.  Access tokens from all applicable authorities are added into the final list that is handed to the search engine as part of every
           search request, so that the search engine may properly exclude documents that the user is not allowed to see.</p>
         <p></p>
         <p>When document indexing is done, therefore, it is the job of the crawler to hand access tokens to the search engine, so that it may categorize the documents properly
-          according to their accessibility.  Note that the access tokens so provided are meaningful only within the space of the governing authority.  Access tokens can be provided
-          as "grant" tokens, or as "deny" tokens.  Finally, there are multiple levels of tokens, which correspond to Active Directory's concepts of "share" security, "directory" security,
-          or "file" security.  (The latter concepts are rarely used except for documents that come from Windows or Samba systems.)</p>
+          according to their accessibility.  The access tokens the crawler attaches to a document are meaningful only within the space of the governing <em>authority group</em>.  An
+          authority group describes a set of authorities which all can cooperate to provide access tokens for a single given document.  Each authority belongs
+          to exactly one authority group.  Authority groups serve to separate access tokens into different spaces so that they cannot interfere with one another.</p>
+        <p></p>
+        <p>For example, say that you would want to crawl documents from a LiveLink repository, as well as from a Windows shared drive.
+          You will therefore have two kinds of documents that are each secured in an entirely different way.  There is a LiveLink authority connection, which provides LiveLink
+          access tokens, and there is an Active Directory authority connection, which provides Windows access tokens.  Now, you don't want there to be any chance
+          that a LiveLink access token could be confused with an Active Directory SID, so the way you do that in ManifoldCF is to create two distinct
+          authority groups, each of which provides access tokens meant for specific kinds of repository documents.  Thus, documents secured by Active
+          Directory SIDs should be indexed against an Active Directory authority group, and documents secured by LiveLink access tokens should have a LiveLink
+          authority group.  Finally, the Active Directory authority connection should then belong to the Active Directory authority group, and the LiveLink authority connection should
+          belong to the LiveLink authority group.</p>
+        <p></p>
+        <p>In addition to specifying the correct authority group, access tokens can be attached to documents as "grant" tokens, or as "deny" tokens.
+          "Grant" tokens provide access, "deny" tokens restrict it.  "Deny" tokens, if matched, always win over "grant" tokens.
+          And finally, there are multiple levels of tokens, which correspond to Active Directory's concepts
+          of "share" security, specific "directory" security, or "file" security.  (The latter concepts are rarely used except for documents that come from
+          Windows or Samba systems.)  Each level provided must agree that the document is to be visible for the document to appear in search
+          results.</p>
         <p></p>
         <p>Once all these documents and their access tokens are handed to the search engine, it is the search engine's job to enforce security by excluding inappropriate documents
           from the search results.  For Solr and for ElasticSearch, this infrastructure has been included in ManifoldCF releases as a Solr plugin (both 3.x and 4.x varieties) and an
-          ElasticSearch plugin.  Bear in mind that this plug-in is still not a complete solution, as it requires an authenticated user
-          name to be passed to it from some upstream source, possibly a JAAS authenticator within an application server framework.</p>
+          ElasticSearch plugin.  Bear in mind that this plug-in is still not a complete solution, as it requires one or more authenticated user
+          names to be passed to it from some upstream source, possibly a JAAS authenticator within an application server framework.</p>
         <p></p>
       </section>
       <section>
@@ -144,6 +162,24 @@
           <p>Jobs are allowed to share the same repository connection, and thus they can overlap in the set of documents they describe.  ManifoldCF permits this situation, although 
             when it occurs it is probably an accident.</p>
         </section>
+        <section>
+          <title>Authorization domains</title>
+          <p></p>
+          <p>ManifoldCF supports a federated concept of a user.  The same user, for instance, may have one login name for FaceBook, another for Windows,
+            and yet another for Google.  We can describe this user as having three different authorization domains: "FaceBook", "Windows", and "Google".</p>
+          <p>In ManifoldCF, each authority understands user names or ids from one specific authorization domain.  This allows ManifoldCF to be configured
+            so that access tokens generated from multiple independent sources are amalgamated, even if the incoming user names differ from source to
+            source.</p>
+        </section>
+        <section>
+          <title>Authority groups</title>
+          <p></p>
+          <p>ManifoldCF groups authority connections together in groups, so that multiple authorities can furnish security for a single document.  An authority
+            group is nothing more than a name and a description that is referenced by authority connections that are part of that group, and is referenced also
+            by repository connections that wish to be secured by that group.  For most simple repositories, there is one authority group per authority.  But
+            repositories capable of federated security (e.g. SharePoint with Claim Space support) can use multiple authorities to describe security for a single
+            document.  Authority groups allow configuration of the appropriate many-to-many relationship for this situation.</p>
+        </section>
       </section>
     </section>
   </body>

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/programmatic-operation.xml Sat Oct 26 12:46:18 2013
@@ -79,10 +79,15 @@
           <p></p>
           <table>
             <tr><th>Resource</th><th>Verb</th><th>What it does</th><th>Input format/query args</th><th>Output format</th></tr>
+            <tr><td>authorizationdomains</td><td>GET</td><td>List all registered authorization domains</td><td>N/A</td><td>{"authorizationdomain":[<em>&lt;list_of_authorization_domain_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnectors</td><td>GET</td><td>List all registered output connectors</td><td>N/A</td><td>{"outputconnector":[<em>&lt;list_of_output_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>mappingconnectors</td><td>GET</td><td>List all registered mapping connectors</td><td>N/A</td><td>{"mappingconnector":[<em>&lt;list_of_mapping_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>authorityconnectors</td><td>GET</td><td>List all registered authority connectors</td><td>N/A</td><td>{"authorityconnector":[<em>&lt;list_of_authority_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>repositoryconnectors</td><td>GET</td><td>List all registered repository connectors</td><td>N/A</td><td>{"repositoryconnector":[<em>&lt;list_of_repository_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups</td><td>GET</td><td>List all authority groups</td><td>N/A</td><td>{"authoritygroup":[<em>&lt;list_of_authority_group_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>GET</td><td>Get a specific authority group</td><td>N/A</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>PUT</td><td>Save or create an authority group</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>DELETE</td><td>Delete an authority group</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnections</td><td>GET</td><td>List all output connections</td><td>N/A</td><td>{"outputconnection":[<em>&lt;list_of_output_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific output connection</td><td>N/A</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an output connection</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
@@ -195,6 +200,18 @@
           </table>
         </section>
         <section>
+          <title>Authorization domain objects</title>
+          <p></p>
+          <p>The JSON fields an authorization domain object has are as follows:</p>
+          <p></p>
+          <table>
+            <tr><th>Field</th><th>Meaning</th></tr>
+            <tr><td>"description"</td><td>The optional description of the authorization domain</td></tr>
+            <tr><td>"domain_name"</td><td>The internal name of the authorization domain, i.e. what is sent to the Authority Service</td></tr>
+          </table>
+          <p></p>
+        </section>
+        <section>
           <title>Output connector objects</title>
           <p></p>
           <p>The JSON fields an output connector object has are as follows:</p>
@@ -243,6 +260,26 @@
           <p></p>
         </section>
         <section>
+          <title>Authority group objects</title>
+          <p></p>
+          <p>Authority group names, when they are part of a URL, should be encoded as follows:</p>
+          <p></p>
+          <ol>
+            <li>All instances of '.' should be replaced by '..'.</li>
+            <li>All instances of '/' should be replaced by '.+'.</li>
+            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
+          </ol>
+          <p></p>
+          <p>The JSON fields an authority group object has are as follows:</p>
+          <p></p>
+          <table>
+            <tr><th>Field</th><th>Meaning</th></tr>
+            <tr><td>"name"</td><td>The unique name of the group</td></tr>
+            <tr><td>"description"</td><td>The description of the group</td></tr>
+          </table>
+          <p></p>
+        </section>
+        <section>
           <title>Output connection objects</title>
           <p></p>
           <p>Output connection names, when they are part of a URL, should be encoded as follows:</p>
@@ -310,6 +347,8 @@
             <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
             <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
             <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>
+            <tr><td>"authdomain"</td><td>The authorization domain for the authority connection, if any</td></tr>
+            <tr><td>"authgroup"</td><td>The required authority group for the authority connection</td></tr>
           </table>
           <p></p>
         </section>
@@ -333,7 +372,7 @@
             <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
             <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
             <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"acl_authority"</td><td>The (optional) name of the authority that will enforce security for this connection</td></tr>
+            <tr><td>"acl_authority"</td><td>The (optional) name of the authority group that will enforce security for this connection</td></tr>
             <tr><td>"throttle"</td><td>An array of throttle objects, which control how quickly documents can be requested from this connection</td></tr>
           </table>
           <p></p>

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/programmatic-operation.xml Sat Oct 26 12:46:18 2013
@@ -79,10 +79,15 @@
           <p></p>
           <table>
             <tr><th>Resource</th><th>Verb</th><th>What it does</th><th>Input format/query args</th><th>Output format</th></tr>
+            <tr><td>authorizationdomains</td><td>GET</td><td>List all registered authorization domains</td><td>N/A</td><td>{"authorizationdomain":[<em>&lt;list_of_authorization_domain_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnectors</td><td>GET</td><td>List all registered output connectors</td><td>N/A</td><td>{"outputconnector":[<em>&lt;list_of_output_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>mappingconnectors</td><td>GET</td><td>List all registered mapping connectors</td><td>N/A</td><td>{"mappingconnector":[<em>&lt;list_of_mapping_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>authorityconnectors</td><td>GET</td><td>List all registered authority connectors</td><td>N/A</td><td>{"authorityconnector":[<em>&lt;list_of_authority_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>repositoryconnectors</td><td>GET</td><td>List all registered repository connectors</td><td>N/A</td><td>{"repositoryconnector":[<em>&lt;list_of_repository_connector_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups</td><td>GET</td><td>List all authority groups</td><td>N/A</td><td>{"authoritygroup":[<em>&lt;list_of_authority_group_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>GET</td><td>Get a specific authority group</td><td>N/A</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>PUT</td><td>Save or create an authority group</td><td>{"authoritygroup":<em>&lt;authority_group_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>authoritygroups/<em>&lt;encoded_group_name&gt;</em></td><td>DELETE</td><td>Delete an authority group</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnections</td><td>GET</td><td>List all output connections</td><td>N/A</td><td>{"outputconnection":[<em>&lt;list_of_output_connection_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>GET</td><td>Get a specific output connection</td><td>N/A</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>outputconnections/<em>&lt;encoded_connection_name&gt;</em></td><td>PUT</td><td>Save or create an output connection</td><td>{"outputconnection":<em>&lt;output_connection_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
@@ -111,8 +116,9 @@
             <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job definition</td><td>N/A</td><td>{"job":<em>&lt;job_object_&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Save a job definition</td><td>{"job":<em>&lt;job_object&gt;</em>}</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>jobs/<em>&lt;job_id&gt;</em></td><td>DELETE</td><td>Delete a job definition</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobstatuses</td><td>GET</td><td>List all jobs and their status</td><td>N/A</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
-            <tr><td>jobstatuses/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status</td><td>N/A</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
+            <tr><td>jobstatuses</td><td>GET</td><td>List all jobs and their status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
+            <tr><td>jobstatuses/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status</td><td>maxcount=&lt;maximum_documents_to_count&gt;</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
+            <tr><td>jobstatusesnocounts<em>&lt;job_id&gt;</em></td><td>GET</td><td>List all jobs and their status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":[<em>&lt;list_of_job_status_objects&gt;</em>]} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
             <tr><td>jobstatusesnocounts/<em>&lt;job_id&gt;</em></td><td>GET</td><td>Get a specific job's status, returning '0' for all counts</td><td>N/A</td><td>{"jobstatus":<em>&lt;job_status_object&gt;</em>} <strong>OR</strong> { } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>} </td></tr>
             <tr><td>start/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
             <tr><td>startminimal/<em>&lt;job_id&gt;</em></td><td>PUT</td><td>Start a specified job manually, minimal run requested</td><td>N/A</td><td>{ } <strong>OR</strong> {"error":<em>&lt;error_text&gt;</em>}</td></tr>
@@ -194,6 +200,18 @@
           </table>
         </section>
         <section>
+          <title>Authorization domain objects</title>
+          <p></p>
+          <p>The JSON fields an authorization domain object has are as follows:</p>
+          <p></p>
+          <table>
+            <tr><th>Field</th><th>Meaning</th></tr>
+            <tr><td>"description"</td><td>The optional description of the authorization domain</td></tr>
+            <tr><td>"domain_name"</td><td>The internal name of the authorization domain, i.e. what is sent to the Authority Service</td></tr>
+          </table>
+          <p></p>
+        </section>
+        <section>
           <title>Output connector objects</title>
           <p></p>
           <p>The JSON fields an output connector object has are as follows:</p>
@@ -242,6 +260,26 @@
           <p></p>
         </section>
         <section>
+          <title>Authority group objects</title>
+          <p></p>
+          <p>Authority group names, when they are part of a URL, should be encoded as follows:</p>
+          <p></p>
+          <ol>
+            <li>All instances of '.' should be replaced by '..'.</li>
+            <li>All instances of '/' should be replaced by '.+'.</li>
+            <li>The URL should be encoded using standard URL utf-8-based %-encoding.</li>
+          </ol>
+          <p></p>
+          <p>The JSON fields an authority group object has are as follows:</p>
+          <p></p>
+          <table>
+            <tr><th>Field</th><th>Meaning</th></tr>
+            <tr><td>"name"</td><td>The unique name of the group</td></tr>
+            <tr><td>"description"</td><td>The description of the group</td></tr>
+          </table>
+          <p></p>
+        </section>
+        <section>
           <title>Output connection objects</title>
           <p></p>
           <p>Output connection names, when they are part of a URL, should be encoded as follows:</p>
@@ -309,6 +347,8 @@
             <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
             <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
             <tr><td>"prerequisite"</td><td>The mapping connection prerequisite, if any</td></tr>
+            <tr><td>"authdomain"</td><td>The authorization domain for the authority connection, if any</td></tr>
+            <tr><td>"authgroup"</td><td>The required authority group for the authority connection</td></tr>
           </table>
           <p></p>
         </section>
@@ -332,7 +372,7 @@
             <tr><td>"class_name"</td><td>The java class name of the class implementing the connection</td></tr>
             <tr><td>"max_connections"</td><td>The total number of outstanding connections allowed to exist at a time</td></tr>
             <tr><td>"configuration"</td><td>The configuration object for the connection, which is specific to the connection class</td></tr>
-            <tr><td>"acl_authority"</td><td>The (optional) name of the authority that will enforce security for this connection</td></tr>
+            <tr><td>"acl_authority"</td><td>The (optional) name of the authority group that will enforce security for this connection</td></tr>
             <tr><td>"throttle"</td><td>An array of throttle objects, which control how quickly documents can be requested from this connection</td></tr>
           </table>
           <p></p>

Modified: manifoldcf/trunk/tests/activedirectory/src/test/java/org/apache/manifoldcf/activedirectory_tests/NavigationDerbyUI.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/tests/activedirectory/src/test/java/org/apache/manifoldcf/activedirectory_tests/NavigationDerbyUI.java?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/tests/activedirectory/src/test/java/org/apache/manifoldcf/activedirectory_tests/NavigationDerbyUI.java (original)
+++ manifoldcf/trunk/tests/activedirectory/src/test/java/org/apache/manifoldcf/activedirectory_tests/NavigationDerbyUI.java Sat Oct 26 12:46:18 2013
@@ -61,6 +61,19 @@ public class NavigationDerbyUI extends B
 
     // Define an authority connection via the UI
     window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("List authority groups"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("Add new authority group"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    form = window.findForm(testerInstance.createStringDescription("editgroup"));
+    textarea = form.findTextarea(testerInstance.createStringDescription("groupname"));
+    textarea.setValue(testerInstance.createStringDescription("MyAuthorityConnection"));
+    button = window.findButton(testerInstance.createStringDescription("Save this authority group"));
+    button.click();
+
+    window = testerInstance.findWindow(null);
     link = window.findLink(testerInstance.createStringDescription("List authorities"));
     link.click();
     window = testerInstance.findWindow(null);
@@ -78,6 +91,8 @@ public class NavigationDerbyUI extends B
     form = window.findForm(testerInstance.createStringDescription("editconnection"));
     selectbox = form.findSelectbox(testerInstance.createStringDescription("classname"));
     selectbox.selectValue(testerInstance.createStringDescription("org.apache.manifoldcf.authorities.authorities.activedirectory.ActiveDirectoryAuthority"));
+    selectbox = form.findSelectbox(testerInstance.createStringDescription("authoritygroup"));
+    selectbox.selectValue(testerInstance.createStringDescription("MyAuthorityConnection"));
     button = window.findButton(testerInstance.createStringDescription("Continue to next page"));
     button.click();
     // Server tab

Modified: manifoldcf/trunk/tests/cmis/src/test/java/org/apache/manifoldcf/cmis_tests/NavigationDerbyUI.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/tests/cmis/src/test/java/org/apache/manifoldcf/cmis_tests/NavigationDerbyUI.java?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/tests/cmis/src/test/java/org/apache/manifoldcf/cmis_tests/NavigationDerbyUI.java (original)
+++ manifoldcf/trunk/tests/cmis/src/test/java/org/apache/manifoldcf/cmis_tests/NavigationDerbyUI.java Sat Oct 26 12:46:18 2013
@@ -132,6 +132,19 @@ public class NavigationDerbyUI extends B
     
     // Define an authority connection via the UI
     window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("List authority groups"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("Add new authority group"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    form = window.findForm(testerInstance.createStringDescription("editgroup"));
+    textarea = form.findTextarea(testerInstance.createStringDescription("groupname"));
+    textarea.setValue(testerInstance.createStringDescription("MyAuthorityConnection"));
+    button = window.findButton(testerInstance.createStringDescription("Save this authority group"));
+    button.click();
+
+    window = testerInstance.findWindow(null);
     link = window.findLink(testerInstance.createStringDescription("List authorities"));
     link.click();
     window = testerInstance.findWindow(null);
@@ -149,6 +162,8 @@ public class NavigationDerbyUI extends B
     form = window.findForm(testerInstance.createStringDescription("editconnection"));
     selectbox = form.findSelectbox(testerInstance.createStringDescription("classname"));
     selectbox.selectValue(testerInstance.createStringDescription("org.apache.manifoldcf.crawler.connectors.cmis.CmisAuthorityConnector"));
+    selectbox = form.findSelectbox(testerInstance.createStringDescription("authoritygroup"));
+    selectbox.selectValue(testerInstance.createStringDescription("MyAuthorityConnection"));
     button = window.findButton(testerInstance.createStringDescription("Continue to next page"));
     button.click();
     window = testerInstance.findWindow(null);

Modified: manifoldcf/trunk/tests/jdbc/src/test/java/org/apache/manifoldcf/jdbc_tests/NavigationDerbyUI.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/tests/jdbc/src/test/java/org/apache/manifoldcf/jdbc_tests/NavigationDerbyUI.java?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/tests/jdbc/src/test/java/org/apache/manifoldcf/jdbc_tests/NavigationDerbyUI.java (original)
+++ manifoldcf/trunk/tests/jdbc/src/test/java/org/apache/manifoldcf/jdbc_tests/NavigationDerbyUI.java Sat Oct 26 12:46:18 2013
@@ -222,6 +222,18 @@ public class NavigationDerbyUI extends B
     
     // Define an authority connection via the UI
     window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("List authority groups"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("Add new authority group"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    form = window.findForm(testerInstance.createStringDescription("editgroup"));
+    textarea = form.findTextarea(testerInstance.createStringDescription("groupname"));
+    textarea.setValue(testerInstance.createStringDescription("MyAuthorityConnection"));
+    button = window.findButton(testerInstance.createStringDescription("Save this authority group"));
+    button.click();
+    window = testerInstance.findWindow(null);
     link = window.findLink(testerInstance.createStringDescription("List authorities"));
     link.click();
     window = testerInstance.findWindow(null);
@@ -239,6 +251,8 @@ public class NavigationDerbyUI extends B
     form = window.findForm(testerInstance.createStringDescription("editconnection"));
     selectbox = form.findSelectbox(testerInstance.createStringDescription("classname"));
     selectbox.selectValue(testerInstance.createStringDescription("org.apache.manifoldcf.authorities.authorities.jdbc.JDBCAuthority"));
+    selectbox = form.findSelectbox(testerInstance.createStringDescription("authoritygroup"));
+    selectbox.selectValue(testerInstance.createStringDescription("MyAuthorityConnection"));
     button = window.findButton(testerInstance.createStringDescription("Continue to next page"));
     button.click();
     // Credentials tab

Modified: manifoldcf/trunk/tests/ldap/src/test/java/org/apache/manifoldcf/ldap_tests/NavigationDerbyUI.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/tests/ldap/src/test/java/org/apache/manifoldcf/ldap_tests/NavigationDerbyUI.java?rev=1535983&r1=1535982&r2=1535983&view=diff
==============================================================================
--- manifoldcf/trunk/tests/ldap/src/test/java/org/apache/manifoldcf/ldap_tests/NavigationDerbyUI.java (original)
+++ manifoldcf/trunk/tests/ldap/src/test/java/org/apache/manifoldcf/ldap_tests/NavigationDerbyUI.java Sat Oct 26 12:46:18 2013
@@ -62,6 +62,19 @@ public class NavigationDerbyUI extends B
 
     // Define an authority connection via the UI
     window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("List authority groups"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    link = window.findLink(testerInstance.createStringDescription("Add new authority group"));
+    link.click();
+    window = testerInstance.findWindow(null);
+    form = window.findForm(testerInstance.createStringDescription("editgroup"));
+    textarea = form.findTextarea(testerInstance.createStringDescription("groupname"));
+    textarea.setValue(testerInstance.createStringDescription("MyAuthorityConnection"));
+    button = window.findButton(testerInstance.createStringDescription("Save this authority group"));
+    button.click();
+
+    window = testerInstance.findWindow(null);
     link = window.findLink(testerInstance.createStringDescription("List authorities"));
     link.click();
     window = testerInstance.findWindow(null);
@@ -79,6 +92,8 @@ public class NavigationDerbyUI extends B
     form = window.findForm(testerInstance.createStringDescription("editconnection"));
     selectbox = form.findSelectbox(testerInstance.createStringDescription("classname"));
     selectbox.selectValue(testerInstance.createStringDescription("org.apache.manifoldcf.authorities.authorities.ldap.LDAPAuthority"));
+    selectbox = form.findSelectbox(testerInstance.createStringDescription("authoritygroup"));
+    selectbox.selectValue(testerInstance.createStringDescription("MyAuthorityConnection"));
     button = window.findButton(testerInstance.createStringDescription("Continue to next page"));
     button.click();
     // Server tab