You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by pi...@apache.org on 2018/04/12 09:03:16 UTC

svn commit: r1828958 - in /manifoldcf/trunk: ./ connectors/cmis/ connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/ connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/ connectors/cmis/connector/src/...

Author: piergiorgio
Date: Thu Apr 12 09:03:15 2018
New Revision: 1828958

URL: http://svn.apache.org/viewvc?rev=1828958&view=rev
Log:
Merged the branch CONNECTORS-1356-2.7.1 that includes CONNECTORS-1437, CONNECTORS-1356 and CONNECTORS-1462

Added:
    manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/
      - copied from r1828953, manifoldcf/branches/CONNECTORS-1356-2.7.1/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/agents/
    manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/
      - copied from r1828953, manifoldcf/branches/CONNECTORS-1356-2.7.1/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/agents/
    manifoldcf/trunk/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/
      - copied from r1828953, manifoldcf/branches/CONNECTORS-1356-2.7.1/connectors/cmis/connector/src/main/resources/org/apache/manifoldcf/agents/
    manifoldcf/trunk/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/agents/
      - copied from r1828953, manifoldcf/branches/CONNECTORS-1356-2.7.1/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/agents/
    manifoldcf/trunk/site/src/documentation/resources/images/en_US/cmis-output-connection-configuration.png
      - copied unchanged from r1828953, manifoldcf/branches/CONNECTORS-1356-2.7.1/site/src/documentation/resources/images/en_US/cmis-output-connection-configuration.png
Modified:
    manifoldcf/trunk/CHANGES.txt
    manifoldcf/trunk/build.xml
    manifoldcf/trunk/connectors/cmis/build.xml
    manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java
    manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java
    manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties
    manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties
    manifoldcf/trunk/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java
    manifoldcf/trunk/connectors/cmis/pom.xml
    manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java
    manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java
    manifoldcf/trunk/framework/jetty-runner/src/main/resources/connectors.xml
    manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml
    manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/included-connectors.xml

Modified: manifoldcf/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Thu Apr 12 09:03:15 2018
@@ -118,6 +118,18 @@ CONNECTORS-1438: Wrong content-type pars
 failure when content type contained a charset.
 (Kenta Kasahara, Karl Wright)
 
+CONNECTORS-1437: Documentation for the CMIS Output Connector
+(Piergiorgio Lucidi)
+
+CONNECTORS-1436: Porting of CMIS Output Connector from 2.6 to 2.8
+(Piergiorgio Lucidi)
+
+CONNECTORS-1356: Initial implementation of the CMIS Output Connector
+(Piergiorgio Lucidi)
+
+CONNECTORS-1462: Add support for rootPath attribute in File System Connector repository
+(Luis Cabaceira)
+
 CONNECTORS-1434: Escape filenames in Solr Http headers to match spec.
 This is a workaround for a fix that really should be in HttpClient.
 (Karl Wright, Tamizh Kumaran Thamizharasan)

Modified: manifoldcf/trunk/build.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/build.xml?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/build.xml (original)
+++ manifoldcf/trunk/build.xml Thu Apr 12 09:03:15 2018
@@ -2689,6 +2689,42 @@ Use Apache Forrest version forrest-0.9-d
             <param name="artifact-type" value="jar"/>
         </antcall>
         <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/ow2/asm"/>
+            <param name="artifact-name" value="asm-debug-all"/>
+            <param name="artifact-version" value="${asm.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/ow2/asm"/>
+            <param name="artifact-name" value="asm-analysis"/>
+            <param name="artifact-version" value="${asm.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/ow2/asm"/>
+            <param name="artifact-name" value="asm-commons"/>
+            <param name="artifact-version" value="${asm.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/ow2/asm"/>
+            <param name="artifact-name" value="asm"/>
+            <param name="artifact-version" value="${asm.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/ow2/asm"/>
+            <param name="artifact-name" value="asm-tree"/>
+            <param name="artifact-version" value="${asm.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/ow2/asm"/>
+            <param name="artifact-name" value="asm-util"/>
+            <param name="artifact-version" value="${asm.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
             <param name="project-path" value="com/adobe/xmp"/>
             <param name="artifact-name" value="xmpcore"/>
             <param name="artifact-version" value="${xmpcore.version}"/>
@@ -2737,6 +2773,30 @@ Use Apache Forrest version forrest-0.9-d
             <param name="artifact-type" value="jar"/>
         </antcall>
         <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/apache/cxf"/>
+            <param name="artifact-name" value="cxf-core"/>
+            <param name="artifact-version" value="${cxf.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/apache/cxf"/>
+            <param name="artifact-name" value="cxf-rt-frontend-jaxrs"/>
+            <param name="artifact-version" value="${cxf.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/apache/cxf"/>
+            <param name="artifact-name" value="cxf-rt-transports-http"/>
+            <param name="artifact-version" value="${cxf.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
+            <param name="project-path" value="org/apache/cxf"/>
+            <param name="artifact-name" value="cxf-rt-rs-client"/>
+            <param name="artifact-version" value="${cxf.version}"/>
+            <param name="artifact-type" value="jar"/>
+        </antcall>
+        <antcall target="download-via-maven"><param name="target" value="lib"/>
             <param name="project-path" value="org/apache/ws/xmlschema"/>
             <param name="artifact-name" value="xmlschema-core"/>
             <param name="artifact-version" value="${xmlschema.version}"/>

Modified: manifoldcf/trunk/connectors/cmis/build.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/build.xml?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/build.xml (original)
+++ manifoldcf/trunk/connectors/cmis/build.xml Thu Apr 12 09:03:15 2018
@@ -98,6 +98,11 @@
             <param name="connector-label" value="CMIS"/>
             <param name="connector-class" value="org.apache.manifoldcf.authorities.authorities.cmis.CmisAuthorityConnector"/>
         </antcall>
+    	  <antcall target="general-add-output-connector">
+            <param name="connector-label" value="CMIS"/>
+            <param name="connector-class" value="org.apache.manifoldcf.agents.output.cmisoutput.CmisOutputConnector"/>
+        </antcall>
+    	  
     </target>
 
     <target name="run-IT-HSQLDB" depends="compile-tests,pretest-check" if="canTest">

Modified: manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java (original)
+++ manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java Thu Apr 12 09:03:15 2018
@@ -21,13 +21,9 @@ package org.apache.manifoldcf.crawler.co
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InterruptedIOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.rmi.NotBoundException;
 import java.rmi.RemoteException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -37,7 +33,6 @@ 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.Property;
 import org.apache.chemistry.opencmis.client.api.QueryResult;
 import org.apache.chemistry.opencmis.client.api.Repository;
 import org.apache.chemistry.opencmis.client.api.Session;
@@ -45,29 +40,27 @@ 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.enums.BaseTypeId;
 import org.apache.chemistry.opencmis.commons.enums.BindingType;
-import org.apache.chemistry.opencmis.commons.enums.PropertyType;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisConnectionException;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
-import org.apache.chemistry.opencmis.commons.impl.Constants;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
-
+import org.apache.chemistry.opencmis.commons.exceptions.CmisPermissionDeniedException;
 import org.apache.commons.io.input.NullInputStream;
 import org.apache.commons.lang.StringUtils;
 import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
 import org.apache.manifoldcf.agents.interfaces.ServiceInterruption;
 import org.apache.manifoldcf.core.interfaces.ConfigParams;
-import org.apache.manifoldcf.core.interfaces.Specification;
 import org.apache.manifoldcf.core.interfaces.IHTTPOutput;
 import org.apache.manifoldcf.core.interfaces.IPasswordMapperActivity;
 import org.apache.manifoldcf.core.interfaces.IPostParameters;
 import org.apache.manifoldcf.core.interfaces.IThreadContext;
 import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
+import org.apache.manifoldcf.core.interfaces.Specification;
 import org.apache.manifoldcf.core.interfaces.SpecificationNode;
 import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
+import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
 import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
 import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
-import org.apache.manifoldcf.crawler.interfaces.IExistingVersions;
 import org.apache.manifoldcf.crawler.system.Logging;
 
 /**
@@ -82,11 +75,6 @@ public class CmisRepositoryConnector ext
   protected final static String ACTIVITY_READ = "read document";
   protected static final String RELATIONSHIP_CHILD = "child";
 
-  private static final String CMIS_FOLDER_BASE_TYPE = "cmis:folder";
-  private static final String CMIS_DOCUMENT_BASE_TYPE = "cmis:document";
-  private static final SimpleDateFormat ISO8601_DATE_FORMATTER = new SimpleDateFormat(
-      "yyyy-MM-dd'T'HH:mm:ssZ", Locale.ROOT);
-
   // Tab name properties
 
   private static final String CMIS_SERVER_TAB_PROPERTY = "CmisRepositoryConnector.Server";
@@ -112,7 +100,9 @@ public class CmisRepositoryConnector ext
 
   /** Forward to the template to view the specification parameters for the job */
   private static final String VIEW_SPEC_FORWARD = "viewSpecification.html";
-
+  
+  /** The content path param used for managing content migration deletion **/
+	private static final String CONTENT_PATH_PARAM = "contentPath";
 
   /**
    * CMIS Session handle
@@ -144,7 +134,7 @@ public class CmisRepositoryConnector ext
 
   protected static final long timeToRelease = 300000L;
   protected long lastSessionFetch = -1L;
-
+    
   /**
    * Constructor
    */
@@ -159,7 +149,7 @@ public class CmisRepositoryConnector ext
   @Override
   public int getConnectorModel()
   {
-    return MODEL_CHAINED_ADD_CHANGE;
+    return MODEL_ADD_CHANGE;
   }
 
   /**
@@ -226,7 +216,6 @@ public class CmisRepositoryConnector ext
         // create session
         if (StringUtils.isEmpty(repositoryId)) {
 
-
           // get a session from the first CMIS repository exposed by
           // the endpoint
           List<Repository> repos = null;
@@ -252,6 +241,10 @@ public class CmisRepositoryConnector ext
           }
 
         }
+        
+        if(session != null) {
+        	session.getDefaultContext().setCacheEnabled(false);
+        }
 
       } catch (Throwable e) {
         this.exception = e;
@@ -676,18 +669,18 @@ public class CmisRepositoryConnector ext
       ItemIterable<CmisObject> cmisObjects = session.getRootFolder()
           .getChildren();
       for (CmisObject cmisObject : cmisObjects) {
-        activities.addSeedDocument(cmisObject.getId());
-      }
+          activities.addSeedDocument(cmisObject.getId());
+      	}
     } else {
       cmisQuery = CmisRepositoryConnectorUtils.getCmisQueryWithObjectId(cmisQuery);
       ItemIterable<QueryResult> results = session.query(cmisQuery, false).getPage(1000000000);
       for (QueryResult result : results) {
-        String id = result.getPropertyValueById(PropertyIds.OBJECT_ID);
-        activities.addSeedDocument(id);
-      }
+      		String id = result.getPropertyValueById(PropertyIds.OBJECT_ID);
+          activities.addSeedDocument(id);
+      	}
     }
 
-    return "";
+    return StringUtils.EMPTY;
   }
 
 
@@ -919,7 +912,7 @@ public class CmisRepositoryConnector ext
   private static void fillInCMISQuerySpecificationMap(Map<String,String> newMap, Specification ds)
   {
     int i = 0;
-    String cmisQuery = "";
+    String cmisQuery = StringUtils.EMPTY;
     while (i < ds.getChildCount()) {
       SpecificationNode sn = ds.getChild(i);
       if (sn.getType().equals(JOB_STARTPOINT_NODE_TYPE)) {
@@ -983,9 +976,11 @@ public class CmisRepositoryConnector ext
         }
         i++;
       }
+  
       SpecificationNode node = new SpecificationNode(JOB_STARTPOINT_NODE_TYPE);
       node.setAttribute(CmisConfig.CMIS_QUERY_PARAM, cmisQuery);
       variableContext.setParameter(CmisConfig.CMIS_QUERY_PARAM, cmisQuery);
+      
       ds.addChild(ds.getChildCount(), node);
     }
     return null;
@@ -1093,14 +1088,13 @@ public class CmisRepositoryConnector ext
       }
 
       if (cmisObject == null) {
-        //System.out.println(" doesn't exist");
         activities.deleteDocument(documentIdentifier);
         continue;
       }
 
       String versionString;
 
-      if (cmisObject.getBaseType().getId().equals(CMIS_DOCUMENT_BASE_TYPE)) {
+      if (cmisObject.getBaseType().getId().equals(BaseTypeId.CMIS_DOCUMENT.value())) {
         Document document = (Document) cmisObject;
 
         // Since documents that are not current have different node id's, we can return a constant version,
@@ -1119,8 +1113,8 @@ public class CmisRepositoryConnector ext
             long lmdSeconds = document.getLastModificationDate().getTimeInMillis();
             versionString = documentIdentifier + lmdSeconds + ":" + cmisQuery;
         } else {
-          //System.out.println(" is NOT latest vrersion");
-          activities.deleteDocument(documentIdentifier);
+          //System.out.println(" is NOT latest version");
+        	activities.deleteDocument(documentIdentifier);
           continue;
         }
       } else {
@@ -1138,17 +1132,15 @@ public class CmisRepositoryConnector ext
         try {
           String baseTypeId = cmisObject.getBaseType().getId();
 
-          if (baseTypeId.equals(CMIS_FOLDER_BASE_TYPE)) {
-
+          if (baseTypeId.equals(BaseTypeId.CMIS_FOLDER.value())) {
             // adding all the children for a folder
-
             Folder folder = (Folder) cmisObject;
             ItemIterable<CmisObject> children = folder.getChildren();
             for (CmisObject child : children) {
               activities.addDocumentReference(child.getId(), documentIdentifier,
                   RELATIONSHIP_CHILD);
             }
-          } else if(baseTypeId.equals(CMIS_DOCUMENT_BASE_TYPE)) {
+          } else if(baseTypeId.equals(BaseTypeId.CMIS_DOCUMENT.value())) {
             // content ingestion
 
             Document document = (Document) cmisObject;
@@ -1158,14 +1150,15 @@ public class CmisRepositoryConnector ext
             long fileLength = document.getContentStreamLength();
             String fileName = document.getContentStreamFileName();
             String mimeType = document.getContentStreamMimeType();
+            
             //documentURI
-            String documentURI = CmisRepositoryConnectorUtils.getDocumentURL(document, session);
+            String documentURI = getDocumentURI(cmisObject);
 
             // Do any filtering (which will save us work)
             if (!activities.checkURLIndexable(documentURI))
             {
               activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_URL;
+              errorCode = IProcessActivity.EXCLUDED_URL;
               errorDesc = "Excluding due to URL ('"+documentURI+"')";
               continue;
             }
@@ -1173,7 +1166,7 @@ public class CmisRepositoryConnector ext
             if (!activities.checkMimeTypeIndexable(mimeType))
             {
               activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_MIMETYPE;
+              errorCode = IProcessActivity.EXCLUDED_MIMETYPE;
               errorDesc = "Excluding due to mime type ("+mimeType+")";
               continue;
             }
@@ -1181,7 +1174,7 @@ public class CmisRepositoryConnector ext
             if (!activities.checkLengthIndexable(fileLength))
             {
               activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_LENGTH;
+              errorCode = IProcessActivity.EXCLUDED_LENGTH;
               errorDesc = "Excluding due to length ("+fileLength+")";
               continue;
             }
@@ -1189,18 +1182,19 @@ public class CmisRepositoryConnector ext
             if (!activities.checkDateIndexable(modifiedDate))
             {
               activities.noDocument(documentIdentifier,versionString);
-              errorCode = activities.EXCLUDED_DATE;
+              errorCode = IProcessActivity.EXCLUDED_DATE;
               errorDesc = "Excluding due to date ("+modifiedDate+")";
               continue;
             }
-
+            
+            
             RepositoryDocument rd = new RepositoryDocument();
             rd.setFileName(fileName);
             rd.setMimeType(mimeType);
             rd.setCreatedDate(createdDate);
             rd.setModifiedDate(modifiedDate);
 
-            InputStream is;
+            InputStream is = null;
             try {
               if (fileLength > 0)
                 is = document.getContentStream().getStream();
@@ -1208,8 +1202,9 @@ public class CmisRepositoryConnector ext
                 is = null;
             } catch (CmisObjectNotFoundException e) {
               // Document gone
-              activities.deleteDocument(documentIdentifier);
+            	activities.deleteDocument(documentIdentifier);
               continue;
+
             }
 
             try {
@@ -1224,7 +1219,7 @@ public class CmisRepositoryConnector ext
               String modifiedQuery = CmisRepositoryConnectorUtils.getCmisQueryWithObjectId(cmisQuery);
 
               //filter the fields selected in the query
-              CmisRepositoryConnectorUtils.addValuesOfProperties(cmisObject.getProperties(), rd, modifiedQuery);
+              CmisRepositoryConnectorUtils.addValuesOfProperties(document, rd, modifiedQuery);
               //ingestion
 
               try {
@@ -1268,7 +1263,37 @@ public class CmisRepositoryConnector ext
     }
 
   }
-
+  
+  private String getDocumentURI(CmisObject cmisObject) throws ManifoldCFException {
+  	String documentURI = StringUtils.EMPTY;
+  	String currentBaseTypeId = cmisObject.getBaseTypeId().value();
+  	if(StringUtils.equals(currentBaseTypeId, BaseTypeId.CMIS_DOCUMENT.value())) {
+  		Document currentDocument = (Document) cmisObject;
+			if(currentDocument.getParents() != null 
+					&& !currentDocument.getParents().isEmpty()) {
+				String path = currentDocument.getParents().get(0).getPath();
+      	String name = currentDocument.getName();
+      	String fullContentPath = path + CmisRepositoryConnectorUtils.SLASH + name;
+      	documentURI = fullContentPath;
+      	
+				//Append the new parameters in the query string
+      	String documentDownloadURL = CmisRepositoryConnectorUtils.getDocumentURL(currentDocument, session);
+      	if(StringUtils.contains(documentDownloadURL, '?')){
+      		documentURI = documentDownloadURL + "&" +CONTENT_PATH_PARAM+"=" + fullContentPath;
+      	} else {
+      		documentURI = documentDownloadURL + "?" +CONTENT_PATH_PARAM+"=" + fullContentPath;
+      	}
+			}
+  	} else if(StringUtils.equals(currentBaseTypeId, BaseTypeId.CMIS_FOLDER.value())) {
+  		Folder currentFolder = (Folder) cmisObject;
+  		String path = currentFolder.getPath();
+  		String name = currentFolder.getName();
+  		String fullContentPath = path + CmisRepositoryConnectorUtils.SLASH + name;
+  		documentURI = fullContentPath;
+  	}
+  	return documentURI;
+  }
+  
   protected static void handleIOException(IOException e, String context) throws ManifoldCFException, ServiceInterruption {
     if (e instanceof InterruptedIOException) {
       throw new ManifoldCFException(e.getMessage(), e,

Modified: manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java (original)
+++ manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnectorUtils.java Thu Apr 12 09:03:15 2018
@@ -21,13 +21,19 @@ package org.apache.manifoldcf.crawler.co
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.util.*;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringTokenizer;
 
 import org.apache.chemistry.opencmis.client.api.Document;
 import org.apache.chemistry.opencmis.client.api.Property;
 import org.apache.chemistry.opencmis.client.api.Session;
 import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService;
 import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AtomPubParser;
+import org.apache.chemistry.opencmis.commons.PropertyIds;
 import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
 import org.apache.chemistry.opencmis.commons.enums.Cardinality;
 import org.apache.chemistry.opencmis.commons.enums.PropertyType;
@@ -50,15 +56,16 @@ public class CmisRepositoryConnectorUtil
     private static final String FROM_TOKEN = "from";
     private static final String SEP = " ";
     private static final String SELECT_STAR_CLAUSE = "select *";
-    private static final String OBJECT_ID_PROPERTY = "cmis:objectId";
-    private static final String OBJECT_ID_TERM = OBJECT_ID_PROPERTY + ",";
+    private static final String OBJECT_ID_TERM = PropertyIds.OBJECT_ID + ",";
     private static final String SELECT_CLAUSE_TERM_SEP = ",";
     private static final String SELECT_PREFIX = "select ";
     private final static String TOKENIZER_SEP = ",\n\t";
+    public static final String SLASH = "/";
 
     public static final String getDocumentURL(final Document document, final Session session)
             throws ManifoldCFException {
-        String link = null;
+            	
+    		String link = null;
         try {
             Method loadLink = AbstractAtomPubService.class.getDeclaredMethod(LOAD_LINK_METHOD_NAME,
                     new Class[]{String.class, String.class, String.class, String.class});
@@ -101,7 +108,7 @@ public class CmisRepositoryConnectorUtil
                     selectTerm = term;
                     firstTermSelectClause = false;
                 } else {
-                    if (term.contains(OBJECT_ID_PROPERTY)){
+                    if (term.contains(PropertyIds.OBJECT_ID)){
                         foundObjIdClause = true;
                         cmisQueryResult = cmisQuery;
                         break;
@@ -168,7 +175,13 @@ public class CmisRepositoryConnectorUtil
      * @param rd : object that contains the properties to pass to connector
      * @param cmisQuery : cmis query
      */
-    public static void addValuesOfProperties(final List<Property<?>> props, RepositoryDocument rd, String cmisQuery) {
+    public static void addValuesOfProperties(Document document, RepositoryDocument rd, String cmisQuery) {
+    		if(document.getPaths() != null) {
+    			List<String> sourcePath = document.getPaths();
+    			rd.setSourcePath(sourcePath);
+    		}
+    		
+    		List<Property<?>> props = document.getProperties();
         Map<String, String> cmisQueryColumns = CmisRepositoryConnectorUtils.getSelectMap(cmisQuery);
         boolean isWildcardQuery = CmisRepositoryConnectorUtils.isWildcardQuery(cmisQuery);
         addValuesOfProperty(props, isWildcardQuery, cmisQueryColumns, rd);

Modified: manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties (original)
+++ manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_en_US.properties Thu Apr 12 09:03:15 2018
@@ -15,7 +15,7 @@
 
 CmisAuthorityConnector.Endpoint=Endpoint:
 CmisAuthorityConnector.RepositoryID=Repository ID:
-CmisAuthorityConnector.UserMapping=User mapping:
+CmisAuthorityConnector.UserMapping=User Mapping
 CmisAuthorityConnector.TheEndpointMustBeNotNull=The endpoint must be not null
 CmisAuthorityConnector.Parameters=Parameters:
 
@@ -41,8 +41,11 @@ CmisRepositoryConnector.TheServerPortMus
 CmisRepositoryConnector.PathMustNotBeNull=Path must be not null
 
 CmisRepositoryConnector.CMISQuery=CMIS Query
+CmisRepositoryConnector.ContentMigration=Enable Content Migration
 
 CmisRepositoryConnector.CMISQueryColon=CMIS Query:
+CmisRepositoryConnector.ContentMigrationColon=Enable Content Migration:
+
 
 CmisRepositoryConnector.ParametersColon=Parameters:
 CmisRepositoryConnector.UsernameEquals=username=
@@ -55,5 +58,4 @@ CmisRepositoryConnector.PathEquals=path=
 CmisRepositoryConnector.RepositoryIdEquals=repositoryId=
 
 CmisAuthorityConnector.Repository=Repository
-CmisAuthorityConnector.UserMapping=User Mapping
 

Modified: manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties (original)
+++ manifoldcf/trunk/connectors/cmis/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/cmis/common_es_ES.properties Thu Apr 12 09:03:15 2018
@@ -16,7 +16,7 @@
 
 CmisAuthorityConnector.Endpoint=Punto final:
 CmisAuthorityConnector.RepositoryID=Identificaciòn de Depósito:
-CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario:
+CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario
 CmisAuthorityConnector.TheEndpointMustBeNotNull=El punto final no debe ser nulo
 CmisAuthorityConnector.Parameters=Parámetros:
 
@@ -42,8 +42,11 @@ CmisRepositoryConnector.TheServerPortMus
 CmisRepositoryConnector.PathMustNotBeNull=El camino debe ser no nulo
 
 CmisRepositoryConnector.CMISQuery=CMIS consulta
+CmisRepositoryConnector.ContentMigration=Habilitar la migración de contenido
 
 CmisRepositoryConnector.CMISQueryColon=CMIS consulta:
+CmisRepositoryConnector.ContentMigrationColon=Habilitar la migración de contenido:
+
 
 CmisRepositoryConnector.ParametersColon=Parámetros:
 CmisRepositoryConnector.UsernameEquals=nombre de usuario=
@@ -56,5 +59,4 @@ CmisRepositoryConnector.PathEquals=camin
 CmisRepositoryConnector.RepositoryIdEquals=Identificaciòn de Depósito=
 
 CmisAuthorityConnector.Repository=Depósito
-CmisAuthorityConnector.UserMapping=Trazar un mapa de usuario
 

Modified: manifoldcf/trunk/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java (original)
+++ manifoldcf/trunk/connectors/cmis/connector/src/test/java/org/apache/manifoldcf/crawler/connectors/cmis/tests/APISanityHSQLDBIT.java Thu Apr 12 09:03:15 2018
@@ -38,7 +38,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.data.ContentStream;
 import org.apache.chemistry.opencmis.commons.enums.BindingType;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
-import org.apache.chemistry.opencmis.commons.spi.ObjectService;
+import org.apache.chemistry.opencmis.commons.impl.jaxb.EnumBaseObjectTypeIds;
 import org.apache.commons.lang.StringUtils;
 import org.apache.manifoldcf.core.interfaces.Configuration;
 import org.apache.manifoldcf.core.interfaces.ConfigurationNode;
@@ -87,7 +87,7 @@ public class APISanityHSQLDBIT extends B
     Folder testFolder = null;
     ItemIterable<QueryResult> results = session.query(CMIS_TEST_QUERY, false);
     for (QueryResult result : results) {
-      String folderId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
+      String folderId = result.getPropertyById(PropertyIds.OBJECT_ID).getFirstValue().toString();
       testFolder = (Folder)session.getObject(folderId);
     }
     return testFolder;
@@ -97,7 +97,7 @@ public class APISanityHSQLDBIT extends B
     // properties 
     // (minimal set: name and object type id)
     Map<String, Object> contentProperties = new HashMap<String, Object>();
-    contentProperties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
+    contentProperties.put(PropertyIds.OBJECT_TYPE_ID, EnumBaseObjectTypeIds.CMIS_DOCUMENT.value());
     contentProperties.put(PropertyIds.NAME, name);
   
     // content
@@ -122,7 +122,7 @@ public class APISanityHSQLDBIT extends B
     ItemIterable<QueryResult> results = session.query(cmisQuery, false);
     String objectId = StringUtils.EMPTY;
     for (QueryResult result : results) {
-      objectId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
+      objectId = result.getPropertyById(PropertyIds.OBJECT_ID).getFirstValue().toString();
     }
 
     byte[] newContentByteArray = newContent.getBytes(StandardCharsets.UTF_8);
@@ -135,13 +135,11 @@ public class APISanityHSQLDBIT extends B
   public void removeDocument(Session session, String name){
     String cmisQuery = StringUtils.replace(CMIS_TEST_QUERY_CHANGE_DOC, REPLACER, name);
     ItemIterable<QueryResult> results = session.query(cmisQuery, false);
-    String objectId = StringUtils.EMPTY;
+    String objectIdValue = StringUtils.EMPTY;
     for (QueryResult result : results) {
-      objectId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
+    	objectIdValue = result.getPropertyById(PropertyIds.OBJECT_ID).getFirstValue().toString();
     }
-    String repositoryId = session.getRepositoryInfo().getId();
-    ObjectService objectService = session.getBinding().getObjectService();
-    objectService.deleteObject(repositoryId, objectId, true, null);
+    session.getObject(objectIdValue).delete();
   }
   
   @Before
@@ -158,12 +156,12 @@ public class APISanityHSQLDBIT extends B
       ItemIterable<QueryResult> results = cmisClientSession.query(CMIS_TEST_QUERY, false);
       for (QueryResult result : results) {
          String repositoryId = cmisClientSession.getRepositoryInfo().getId();
-        String folderId = result.getPropertyById("cmis:objectId").getFirstValue().toString();
+        String folderId = result.getPropertyById(PropertyIds.OBJECT_ID).getFirstValue().toString();
         cmisClientSession.getBinding().getObjectService().deleteTree(repositoryId, folderId, true, null, false, null);
       }
 
       Map<String, Object> folderProperties = new HashMap<String, Object>();
-      folderProperties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:folder");
+      folderProperties.put(PropertyIds.OBJECT_TYPE_ID, EnumBaseObjectTypeIds.CMIS_FOLDER.value());
       folderProperties.put(PropertyIds.NAME, "testdata");
   
       Folder newFolder = root.createFolder(folderProperties);
@@ -381,7 +379,7 @@ public class APISanityHSQLDBIT extends B
       
       // Now, start the job, and wait until it completes.
       startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
+      waitJobInactive(jobIDString, 920000L);
 
       // Check to be sure we actually processed the right number of documents.
       // The test data area has 3 documents and one directory, and we have to count the root directory too.
@@ -397,7 +395,7 @@ public class APISanityHSQLDBIT extends B
 
       // Now, start the job, and wait until it completes.
       startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
+      waitJobInactive(jobIDString, 920000L);
 
       // The test data area has 4 documents and one directory, and we have to count the root directory too.
       count = getJobDocumentsProcessed(jobIDString);
@@ -409,7 +407,7 @@ public class APISanityHSQLDBIT extends B
       
       // Now, start the job, and wait until it completes.
       startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
+      waitJobInactive(jobIDString, 920000L);
 
       // The test data area has 4 documents and one directory, and we have to count the root directory too.
       count = getJobDocumentsProcessed(jobIDString);
@@ -420,24 +418,22 @@ public class APISanityHSQLDBIT extends B
       // MHL
       //System.out.println("Starting delete...");
       // Delete a file, and recrawl
-      removeDocument(cmisClientSession, "testdata2.txt");
+      removeDocument(cmisClientSession, "testdata3.txt");
       
       // Now, start the job, and wait until it completes.
       startJob(jobIDString);
-      waitJobInactive(jobIDString, 120000L);
+      waitJobInactive(jobIDString, 920000L);
 
       // Check to be sure we actually processed the right number of documents.
       // The test data area has 3 documents and one directory, and we have to count the root directory too.
       count = getJobDocumentsProcessed(jobIDString);
-      /* NOTE WELL: this no longer works after upgrade to CMIS 1 !!
       if (count != 4)
         throw new ManifoldCFException("Wrong number of documents processed after delete - expected 4, saw "+new Long(count).toString());
-      */
-      
+
       // Now, delete the job.
       deleteJob(jobIDString);
 
-      waitJobDeleted(jobIDString, 120000L);
+      waitJobDeleted(jobIDString, 920000L);
       
       // Cleanup is automatic by the base class, so we can feel free to leave jobs and connections lying around.
     }

Modified: manifoldcf/trunk/connectors/cmis/pom.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/cmis/pom.xml?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/cmis/pom.xml (original)
+++ manifoldcf/trunk/connectors/cmis/pom.xml Thu Apr 12 09:03:15 2018
@@ -131,7 +131,7 @@
                 <artifactItem>
                   <groupId>org.apache.chemistry.opencmis</groupId>
                   <artifactId>chemistry-opencmis-server-inmemory</artifactId>
-                  <version>0.13.0</version>
+                  <version>1.1.0</version>
                   <type>war</type>
                   <overWrite>false</overWrite>
                   <destFileName>chemistry-opencmis-server-inmemory.war</destFileName>
@@ -307,7 +307,7 @@
     <dependency>
       <groupId>org.apache.chemistry.opencmis</groupId>
       <artifactId>chemistry-opencmis-server-inmemory</artifactId>
-      <version>0.13.0</version>
+      <version>1.1.0</version>
       <type>war</type>
       <scope>test</scope>
     </dependency>

Modified: manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java (original)
+++ manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java Thu Apr 12 09:03:15 2018
@@ -18,6 +18,7 @@
 */
 package org.apache.manifoldcf.crawler.connectors.filesystem;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.manifoldcf.core.interfaces.*;
 import org.apache.manifoldcf.agents.interfaces.*;
 import org.apache.manifoldcf.crawler.interfaces.*;
@@ -246,6 +247,28 @@ public class FileConnector extends org.a
     IProcessActivity activities, int jobMode, boolean usesDefaultAuthority)
     throws ManifoldCFException, ServiceInterruption
   {
+
+     List<String> documentRootPath = new ArrayList<String>();
+    /* CONNECTORS-1462
+       Extract rootPaths from the specification
+       This will allow to inject rootPath into repositoryDocument #428 -> (data.setRootPath(documentRootPath)); */
+    List<String> rootPaths = new ArrayList<String>();
+    for (int i = 0; i < spec.getChildCount(); i++)
+    {
+      SpecificationNode sn = spec.getChild(i);
+      if (sn.getType().equals("startpoint"))
+      {
+        String path = sn.getAttributeValue("path").replaceAll("\\\\","/");
+        if (path.length() > 0)
+        {
+          if (!path.endsWith("/")) path += "/";
+          rootPaths.add(path);
+        }
+      }
+    }
+
+
+
     for (String documentIdentifier : documentIdentifiers)
     {
       File file = new File(documentIdentifier);
@@ -351,6 +374,17 @@ public class FileConnector extends org.a
           uri = convertToURI(documentIdentifier);
         }
 
+
+        // Finding the node's rootPath by working with its uri and the existing rootPaths from the specification
+        for (int i = 0; i < rootPaths.size(); i++) {
+          String rootPathInstance = rootPaths.get(i);
+          if (uri.contains(rootPathInstance)) {
+            String [] sectionazedPath = rootPathInstance.split("/");
+            documentRootPath = Arrays.asList(sectionazedPath);
+            break;
+          }
+        }
+
         if (!activities.checkLengthIndexable(fileLength))
         {
           errorCode = activities.EXCLUDED_LENGTH;
@@ -391,6 +425,7 @@ public class FileConnector extends org.a
         data.setFileName(fileName);
         data.setMimeType(mimeType);
         data.setModifiedDate(modifiedDate);
+        data.setRootPath(documentRootPath);
         if (convertPath != null) {
           // WGET-compatible input; convert back to external URI
           data.addField("uri",uri);

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/RepositoryDocument.java Thu Apr 12 09:03:15 2018
@@ -52,6 +52,8 @@ public class RepositoryDocument
   protected final Map<String,Reader[]> readerFields = new HashMap<String,Reader[]>();
   protected final Map<String,Date[]> dateFields = new HashMap<String,Date[]>();
   protected final Map<String,Security> securityLevels = new HashMap<String,Security>();
+  protected final List<String> sourcePath = new ArrayList<String>();
+  protected final List<String> rootPath = new ArrayList<String>();
   protected String fileName = "docname";
   protected String contentMimeType = "application/octet-stream";
   protected Date createdDate = null;
@@ -106,6 +108,14 @@ public class RepositoryDocument
     {
       rval.securityLevels.put(key,securityLevels.get(key));
     }
+    for (String pathElement : sourcePath)
+    {
+      rval.sourcePath.add(pathElement);
+    }
+    for (String pathElement : rootPath)
+    {
+      rval.rootPath.add(pathElement);
+    }
     return rval;
   }
   
@@ -120,6 +130,41 @@ public class RepositoryDocument
     readerFields.clear();
   }
   
+  /** Set the source path for the document.
+  *@param sourcePath is the path.
+  */
+  public void setSourcePath(final List<String> sourcePath) {
+    this.sourcePath.clear();
+    for (final String pathElement : sourcePath) {
+      this.sourcePath.add(pathElement);
+    }
+  }
+
+  /** Get the source path for the document.
+  *@return the source path.
+  */
+  public List<String> getSourcePath() {
+    return sourcePath;
+  }
+
+  /** Set the root path for the document.
+  * Must be a subset of the source path.
+  *@param rootPath is the path.
+  */
+  public void setRootPath(final List<String> rootPath) {
+    this.rootPath.clear();
+    for (final String pathElement : rootPath) {
+      this.rootPath.add(pathElement);
+    }
+  }
+
+  /** Get the root path for the document.
+  *@return the root path.
+  */
+  public List<String> getRootPath() {
+    return rootPath;
+  }
+    
   /** Set the document's original (repository) size.  Use null to indicate that the size is
   * unknown.
   *@param size is the size.

Modified: manifoldcf/trunk/framework/jetty-runner/src/main/resources/connectors.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/jetty-runner/src/main/resources/connectors.xml?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/framework/jetty-runner/src/main/resources/connectors.xml (original)
+++ manifoldcf/trunk/framework/jetty-runner/src/main/resources/connectors.xml Thu Apr 12 09:03:15 2018
@@ -26,6 +26,7 @@
   <outputconnector name="Solr" class="org.apache.manifoldcf.agents.output.solr.SolrConnector"/>
   <outputconnector name="Null" class="org.apache.manifoldcf.agents.output.nullconnector.NullConnector"/>
   <outputconnector name="MetaCarta GTS" class="org.apache.manifoldcf.agents.output.gts.GTSConnector"/>
+  <outputconnector name="CMIS" class="org.apache.manifoldcf.agents.output.cmisoutput.CmisOutputConnector"/>
     <!-- Add your authority connectors here -->
   <authorityconnector name="Null" class="org.apache.manifoldcf.authorities.authorities.nullauthority.NullAuthority"/>
   <authorityconnector name="CMIS" class="org.apache.manifoldcf.authorities.authorities.cmis.CmisAuthorityConnector"/>

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/end-user-documentation.xml Thu Apr 12 09:03:15 2018
@@ -766,6 +766,49 @@
                       <a href="http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-index-fields.html">this document</a> for details of how to set up an Amazon Cloud Search
                       schema.</p>
             </section>
+            
+            <section id="cmisoutput">
+              <title>CMIS Output Connection</title>
+              <p>The CMIS Output Connection type allows you to migrate content to any CMIS-compliant repository.</p>
+              <p>By default each CMIS Connection manages a single CMIS repository, this means that if you have multiple CMIS repositories exposed by a single
+                  endpoint, you need to create a specific connection for each CMIS repository.</p>
+              <p>CMIS repository documents are typically secured by using the CMIS Authority Connection type.  This authority type, however, does not have access
+                    to user groups, since there is no such functionality in the CMIS specification at this time.  As a result, most people only use the CMIS connection type
+                    in an unsecured manner.</p>
+              <br/>
+              <p>A CMIS Output connection has the following configuration parameters on the output connection editing screen:</p>
+              <br/><br/>
+              <figure src="images/en_US/cmis-output-connection-configuration.png" alt="CMIS Output Connection, configuration parameters" width="80%"/>
+              <br/><br/>
+              <p>Select the correct CMIS binding protocol (AtomPub or Web Services) and enter the correct username, password and the endpoint to reference the CMIS document server services.</p>
+              <p>The endpoint consists of the HTTP protocol, hostname, port and the context path of the CMIS service exposed by the CMIS server:</p>
+              <br/>
+              <p><code>http://HOSTNAME:PORT/CMIS_CONTEXT_PATH</code></p>
+              <br/><br/>
+              <p>The CMIS Query must be provided to select your own drop zone in the target folder that should be an existent CMIS folder.</p>
+              <p>By default the crawler will replicate the same source path structure for each content in that target folder.</p>
+              <p>Considering to have your contents in your source repository inside the following path:</p>
+              <br/>
+              <p><code>/MySourceRepo/Invoices</code></p>
+              <br/>
+              <p>And supposing to have configured your CMIS Output Connection with the default value of the CMIS Query for your target folder:</p>
+              <br/>
+              <p><code>SELECT * FROM cmis:folder WHERE cmis:name='Apache ManifoldCF'</code></p>
+              <br /><br/>
+              <p>All the migrated contents will be dropped in the following target CMIS folder:</p>
+              <br/>
+              <p><code>/path/to/your/Apache ManifoldCF/MySourceRepo/Invoices</code></p>
+              <br/>
+              <p>Optionally you can provide the repository ID to select one of the exposed CMIS repository, if this parameter is null the CMIS Connector will consider the first CMIS repository exposed by the CMIS server.</p>
+              <br/>
+              <p>Note that, in a CMIS system, a specific binding protocol has its own context path, this means that the endpoints are different:</p>
+              <p>for example the endpoint of the AtomPub binding exposed by the actual version of the InMemory Server provided by the OpenCMIS framework is the following:</p>
+              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/atom</code></p>
+              <br/><br/>
+              <p>The Web Services binding is exposed using a different endpoint:</p>
+              <p><code>http://localhost:8080/chemistry-opencmis-server-inmemory-war-0.5.0-SNAPSHOT/services/RepositoryService</code></p>
+              <br /><br/>
+            </section>
 
             <section id="elasticsearchoutputconnector">
                 <title>ElasticSearch Output Connection</title>

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/included-connectors.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/included-connectors.xml?rev=1828958&r1=1828957&r2=1828958&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/included-connectors.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/included-connectors.xml Thu Apr 12 09:03:15 2018
@@ -64,6 +64,7 @@
       	<caption>Output Connector interoperability table</caption>
       	<tr><th>System</th><th>Connector Platform</th><th>Server Platform</th><th>Client Version</th><th>Server Version</th></tr>
       	<tr><td>Amazon CloudSearch</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> N/A </td></tr>
+      	<tr><td>CMIS</td><td> Pure Java </td><td>CMIS 1.1</td><td>CMIS 1.1</td><td>Tested with OpenCMIS In-Memory Server 1.1.0 and Alfresco 5.2</td></tr>
       	<tr><td>ElasticSearch</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> Tested with ElasticSearch 1.0, 1.1, 1.2, 1.3 </td></tr>
       	<tr><td>OpenSearchServer</td><td> Pure Java </td><td> N/A </td><td> N/A</td><td> Tested with OpenSearchServer 1.2.1, 1.2.2, 1.2.3, 1.3, 1.4, 1.5.x </td></tr>
       	<tr><td>SearchBlox</td><td>Pure Java</td><td>Various</td><td>Various</td><td>Various</td></tr>