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/>"
+ + " 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\"/>"
+ + " 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);