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 2011/07/11 02:19:04 UTC

svn commit: r1144991 - in /incubator/lcf/branches/CONNECTORS-221/connectors/cmis: ./ connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java

Author: kwright
Date: Mon Jul 11 00:19:03 2011
New Revision: 1144991

URL: http://svn.apache.org/viewvc?rev=1144991&view=rev
Log:
Merge in new patch.

Modified:
    incubator/lcf/branches/CONNECTORS-221/connectors/cmis/   (props changed)
    incubator/lcf/branches/CONNECTORS-221/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java

Propchange: incubator/lcf/branches/CONNECTORS-221/connectors/cmis/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Jul 11 00:19:03 2011
@@ -0,0 +1,4 @@
+build
+dist
+lib
+

Modified: incubator/lcf/branches/CONNECTORS-221/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java
URL: http://svn.apache.org/viewvc/incubator/lcf/branches/CONNECTORS-221/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java?rev=1144991&r1=1144990&r2=1144991&view=diff
==============================================================================
--- incubator/lcf/branches/CONNECTORS-221/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java (original)
+++ incubator/lcf/branches/CONNECTORS-221/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java Mon Jul 11 00:19:03 2011
@@ -24,6 +24,7 @@ import java.math.BigInteger;
 import java.rmi.NotBoundException;
 import java.rmi.RemoteException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -34,6 +35,7 @@ import org.apache.chemistry.opencmis.cli
 import org.apache.chemistry.opencmis.client.api.Document;
 import org.apache.chemistry.opencmis.client.api.Folder;
 import org.apache.chemistry.opencmis.client.api.ItemIterable;
+import org.apache.chemistry.opencmis.client.api.OperationContext;
 import org.apache.chemistry.opencmis.client.api.Property;
 import org.apache.chemistry.opencmis.client.api.QueryResult;
 import org.apache.chemistry.opencmis.client.api.Repository;
@@ -42,7 +44,11 @@ import org.apache.chemistry.opencmis.cli
 import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
 import org.apache.chemistry.opencmis.commons.PropertyIds;
 import org.apache.chemistry.opencmis.commons.SessionParameter;
+import org.apache.chemistry.opencmis.commons.data.Ace;
+import org.apache.chemistry.opencmis.commons.data.Acl;
+import org.apache.chemistry.opencmis.commons.data.AclCapabilities;
 import org.apache.chemistry.opencmis.commons.enums.BindingType;
+import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl;
 import org.apache.chemistry.opencmis.commons.enums.PropertyType;
 import org.apache.chemistry.opencmis.commons.impl.Constants;
 import org.apache.commons.lang.StringUtils;
@@ -74,6 +80,7 @@ public class CmisRepositoryConnector ext
   public static final String CONFIG_PARAM_ENDPOINT = "endpoint";
   public static final String CONFIG_PARAM_REPOSITORY_ID = "repositoryId";
   public static final String CONFIG_PARAM_CMIS_QUERY = "cmisQuery";
+  public static final String CONFIG_PARAM_ACL_FETCH = "enableAclFetch";
 
   private static final String JOB_STARTPOINT_NODE_TYPE = "startpoint";
   private static final String TAB_LABEL_CMIS_QUERY = "CMIS Query";
@@ -84,11 +91,16 @@ public class CmisRepositoryConnector ext
   private static final String CMIS_FOLDER_BASE_TYPE = "Folder";
   private static final SimpleDateFormat ISO8601_DATE_FORMATTER = new SimpleDateFormat(
       "yyyy-MM-dd'T'HH:mm:ssZ");
+  
+  private static final String CMIS_PERMISSION_FIELD = "cmis:permission";
+  private static final String CMIS_PRINCIPAL_PERMISSION_SEP = ",";
 
   /**
    * CMIS Session handle
    */
   Session session = null;
+  
+  OperationContext operationContextAclFetchEnabled = null;
 
   protected String username = null;
   protected String password = null;
@@ -136,8 +148,7 @@ public class CmisRepositoryConnector ext
 
         // connection settings
         parameters.put(SessionParameter.ATOMPUB_URL, endpoint);
-        parameters.put(SessionParameter.BINDING_TYPE,
-            BindingType.ATOMPUB.value());
+        parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
 
         // create session
         if (StringUtils.isEmpty(repositoryId)) {
@@ -153,6 +164,11 @@ public class CmisRepositoryConnector ext
           parameters.put(SessionParameter.REPOSITORY_ID, repositoryId);
           session = factory.createSession(parameters);
         }
+        
+        //special CMIS operation contexts used only if there are some 
+        //specific settings configured in the job (ACL Fetch, etc...)
+        operationContextAclFetchEnabled = session.createOperationContext();
+        operationContextAclFetchEnabled.setIncludeAcls(true);
 
       } catch (Throwable e) {
         this.exception = e;
@@ -174,7 +190,7 @@ public class CmisRepositoryConnector ext
 
     public void run() {
       try {
-        session.getRootFolder();
+        session.getRepositoryInfo();
       } catch (Throwable e) {
         this.exception = e;
       }
@@ -486,6 +502,7 @@ public class CmisRepositoryConnector ext
         cmisQuery = sn.getAttributeValue(CONFIG_PARAM_CMIS_QUERY);
         break;
       }
+      i++;
     }
 
     if (StringUtils.isEmpty(cmisQuery)) {
@@ -622,17 +639,38 @@ public class CmisRepositoryConnector ext
   public void outputConfigurationBody(IThreadContext threadContext,
       IHTTPOutput out, ConfigParams parameters, String tabName)
       throws ManifoldCFException, IOException {
+    
+    String username = parameters.getParameter(CONFIG_PARAM_USERNAME);
+    String password = parameters.getParameter(CONFIG_PARAM_PASSWORD);
+    String endpoint = parameters.getParameter(CONFIG_PARAM_ENDPOINT);
+    String repositoryId = parameters.getParameter(CONFIG_PARAM_REPOSITORY_ID);
+    
+    if(StringUtils.isEmpty(username))
+      username = StringUtils.EMPTY;
+    if(StringUtils.isEmpty(password))
+      password = StringUtils.EMPTY;
+    if(StringUtils.isEmpty(endpoint))
+      endpoint = StringUtils.EMPTY;
+    if(StringUtils.isEmpty(repositoryId))
+      repositoryId = StringUtils.EMPTY;
+    
     out.print("<table class=\"displaytable\">\n"
         + "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n");
-    out.print("<tr><td>Username: <input type=\"text\" name=\""
-        + CONFIG_PARAM_USERNAME + "\"/></td></tr>\n");
-    out.print("<tr><td>Password: <input type=\"password\" name=\""
-        + CONFIG_PARAM_PASSWORD + "\"/></td></tr>\n");
-    out.print("<tr><td>Endpoint: <input type=\"text\" name=\""
-        + CONFIG_PARAM_ENDPOINT + "\"/></td></tr>\n");
-    out.print("<tr><td>Repository ID: <input type=\"text\" name=\""
-        + CONFIG_PARAM_REPOSITORY_ID + "\"/></td></tr>\n");
+    out.print(
+        "<tr><td class=\"description\">Username:</td>\n"
+       +"<td class=\"value\"><input type=\"text\" name=\""
+        + CONFIG_PARAM_USERNAME + "\" value=\""+username+"\"/></td></tr>\n");
+    out.print("<tr><td class=\"description\">Password:</td>" +
+    		"<td class=\"value\"><input type=\"password\" name=\""
+        + CONFIG_PARAM_PASSWORD + "\" value=\""+password+"\"/></td></tr>\n");
+    out.print("<tr><td class=\"description\">Endpoint:</td>" +
+    		"<td class=\"value\"><input type=\"text\" name=\""
+        + CONFIG_PARAM_ENDPOINT + "\" value=\""+endpoint+"\" size=\"60\"/></td></tr>\n");
+    out.print("<tr><td class=\"description\">Repository ID:</td>" +
+    		"<td class=\"value\"><input type=\"text\" name=\""
+        + CONFIG_PARAM_REPOSITORY_ID + "\" value=\""+repositoryId+"\"/></td></tr>\n");
     out.print("</table>\n");
+    
   }
 
   /**
@@ -708,6 +746,12 @@ public class CmisRepositoryConnector ext
             + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn
                 .getAttributeValue(CONFIG_PARAM_CMIS_QUERY)));
         out.print("    </td>\n" + "  </tr>\n");
+        out.print("  <tr>\n"
+            + "    <td class=\"description\">ACL Fetch:</td>\n"
+            + "    <td class=\"value\">\n"
+            + org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn
+                .getAttributeValue(CONFIG_PARAM_ACL_FETCH)));
+        out.print("    </td>\n" + "  </tr>\n");
 
       }
       i++;
@@ -738,20 +782,8 @@ public class CmisRepositoryConnector ext
   @Override
   public String processSpecificationPost(IPostParameters variableContext,
       DocumentSpecification ds) throws ManifoldCFException {
-    ds.clearChildren();
-
-    /**
-     * while (i < ds.getChildCount()) { SpecificationNode sn = ds.getChild(i);
-     * if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) { if (seenAny ==
-     * false) { seenAny = true; } out.print( "
-     * <tr>
-     * \n"+ "
-     * <td class=\"description\">CMIS Query:</td>\n"+ "
-     * <td class=\"value\">\n
-     * "+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(sn.getAttributeValue(CONFIG_PARAM_CMIS_QUERY)
-     * )
-     */
     String cmisQuery = variableContext.getParameter(CONFIG_PARAM_CMIS_QUERY);
+    String enableAclFetch = variableContext.getParameter(CONFIG_PARAM_ACL_FETCH);
     if (StringUtils.isNotEmpty(cmisQuery)) {
       int i = 0;
       while (i < ds.getChildCount()) {
@@ -760,10 +792,13 @@ public class CmisRepositoryConnector ext
           ds.removeChild(i);
           break;
         }
+        i++;
       }
       SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
       node.setAttribute(CONFIG_PARAM_CMIS_QUERY, cmisQuery);
+      node.setAttribute(CONFIG_PARAM_ACL_FETCH, enableAclFetch);
       variableContext.setParameter(CONFIG_PARAM_CMIS_QUERY, cmisQuery);
+      variableContext.setParameter(CONFIG_PARAM_ACL_FETCH, enableAclFetch);
       ds.addChild(ds.getChildCount(), node);
     } else {
       int i = 0;
@@ -772,7 +807,10 @@ public class CmisRepositoryConnector ext
         if (oldNode.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
           variableContext.setParameter(CONFIG_PARAM_CMIS_QUERY,
               oldNode.getAttributeValue(CONFIG_PARAM_CMIS_QUERY));
+          variableContext.setParameter(CONFIG_PARAM_ACL_FETCH,
+              oldNode.getAttributeValue(CONFIG_PARAM_ACL_FETCH));
         }
+        i++;
       }
     }
 
@@ -800,36 +838,43 @@ public class CmisRepositoryConnector ext
       IOException {
     if (tabName.equals(TAB_LABEL_CMIS_QUERY)) {
       String cmisQuery = StringUtils.EMPTY;
+      Boolean enableAclFetch = false;
       int i = 0;
       while (i < ds.getChildCount()) {
         SpecificationNode n = ds.getChild(i);
         if (n.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
           cmisQuery = n.getAttributeValue(CONFIG_PARAM_CMIS_QUERY);
+          enableAclFetch = new Boolean(n.getAttributeValue(CONFIG_PARAM_ACL_FETCH));
           break;
         }
+        i++;
       }
 
       out.print("<table class=\"displaytable\">\n"
           + "  <tr><td class=\"separator\" colspan=\"3\"><hr/></td></tr>\n");
-      out.print("        <tr class=\"formrow\"><td class=\"lightseparator\" colspan=\"3\"><hr/></td></tr>\n"
-          + "        <tr class=\"formrow\">\n"
+      out.print("        <tr class=\"formrow\">\n"
+          + "       <td class=\"formcolumncell\">CMIS Query: </td>"
           + "          <td class=\"formcolumncell\">\n"
           + "            <nobr>\n"
-          + "              <a name=\"cmisQuery\">\n"
-          + "                <input type=\"button\" value=\"Add\" onClick='Javascript:SpecOp(\"specop\",\"Add\",\"cmisQuery\")' alt=\"Set the new query\"/>\n"
-          + "                <input type=\"hidden\" name=\"specop\" value=\"\"/>\n"
-          + "              </a>\n"
-          + "            </nobr>\n"
-          + "          </td>\n"
-          + "          <td class=\"formcolumncell\">\n"
-          + "            <nobr>\n"
-          + "              <input type=\"text\" size=\"80\" name=\"cmisQuery\" value=\""
+          + "              <input type=\"text\" size=\"120\" name=\"cmisQuery\" value=\""
           + cmisQuery
           + "\"/>\n"
           + "            </nobr>\n"
           + "          </td>\n"
           + "  			</tr>\n"
-          + "       <tr class=\"formrow\"><td class=\"lightseparator\" colspan=\"3\"><hr/></td></tr>\n"
+          + "       <tr><td class=\"separator\" colspan=\"3\"><hr/></td></tr>\n"
+          + "       <tr class=\"formrow\">\n"
+          + "       <td class=\"formcolumncell\">ACL Fetch: </td>");
+          
+          if(enableAclFetch){
+            out.print("   <td class=\"formcolumncell\"><nobr>Enabled <input type=\"radio\" name=\"enableAclFetch\" value=\"true\" checked/>"
+                + "&nbsp;&nbsp; Disabled <input type=\"radio\" name=\"enableAclFetch\" value=\"false\"/></nobr></td>");
+          } else {
+            out.print("   <td class=\"formcolumncell\"><nobr>Enabled <input type=\"radio\" name=\"enableAclFetch\" value=\"true\"/>"
+                + "&nbsp;&nbsp; Disabled <input type=\"radio\" name=\"enableAclFetch\" value=\"false\" checked/></nobr></td>");
+          }
+          
+          out.print("</tr>"
           + "</table>\n");
     }
   }
@@ -899,7 +944,7 @@ public class CmisRepositoryConnector ext
 
       } else {
 
-        // ingestion of all the contents
+        // content ingestion
 
         Document document = (Document) cmisObject;
         long fileLength = document.getContentStreamLength();
@@ -908,8 +953,11 @@ public class CmisRepositoryConnector ext
 
         try {
           RepositoryDocument rd = new RepositoryDocument();
+          
+          //binary
           rd.setBinary(is, fileLength);
 
+          //properties
           List<Property<?>> properties = document.getProperties();
           String id = StringUtils.EMPTY;
           for (Property<?> property : properties) {
@@ -958,18 +1006,59 @@ public class CmisRepositoryConnector ext
             }
           }
 
-          // Acl aclCmis = document.getAcl();
-          // List<Ace> aces = aclCmis.getAces();
-          // List acl = new ArrayList<String>();
-          //
-          // for (Ace ace : aces) {
-          // acl.addAll(ace.getPermissions());
-          // }
-          //
-          // String[] aclForManifold = new String[acl.size()];
-          // acl.toArray(aclForManifold);
-          // rd.setACL(aclForManifold);
-
+          //get ACL settings from the job configuration
+          Boolean enabledAclFetch = false;
+          int j = 0;
+          while (j < spec.getChildCount()) {
+            SpecificationNode sn = spec.getChild(i);
+            if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
+              enabledAclFetch = new Boolean(sn.getAttributeValue(CONFIG_PARAM_ACL_FETCH));
+              break;
+            }
+            j++;
+          }
+          
+          if(enabledAclFetch){
+            // ACL Fetch enabled
+            
+            //check if the CMIS repository supports fetching for ACL
+            AclCapabilities aclCapabilities = session.getRepositoryInfo().getAclCapabilities();
+            if(!CapabilityAcl.NONE.equals(aclCapabilities)){
+            
+              //ACL metadata is indexed using a cmis:permission multivalue property as the following example:
+              //cmis:permission='johndoe,cmis:write'
+              //cmis:permission='guest,cmis:read'
+              //cmis:permission='admin,cmis:all'
+              // on Apache Solr you can configure the following field for permissions in the schema.xml:
+              //<field name="permissions" type="string" indexed="true" stored="true" multiValued="true"/>
+              //Then inside the job configuration form you can set the following field mapping:
+              //cmis:permission -> permissions
+              
+              document = (Document) session.getObject(document.getId(), operationContextAclFetchEnabled);
+              Acl aclCmis = document.getAcl();
+              List<Ace> aces = aclCmis.getAces();
+              String principalId = StringUtils.EMPTY;
+              String permissionData = StringUtils.EMPTY;
+              String[] fieldData = null;
+              List<String> fieldDataList = new ArrayList<String>();
+              fieldDataList.toArray();
+              for (Ace ace : aces) {
+                principalId = ace.getPrincipalId();
+                List<String> permissions = ace.getPermissions();
+                for (String permission : permissions) {
+                  permissionData = principalId + CMIS_PRINCIPAL_PERMISSION_SEP + permission;
+                  fieldDataList.add(permissionData);
+                }
+              }
+              
+              //converting List to String[]
+              fieldData = new String[fieldDataList.size()];
+              fieldDataList.toArray(fieldData);
+              rd.addField(CMIS_PERMISSION_FIELD, fieldData);
+            }
+          }
+          
+          //ingestion
           String version = document.getVersionLabel();
           activities.ingestDocument(id, version, id, rd);