Author: kwright
Date: Sun Aug 31 18:17:42 2014
New Revision: 1621613

URL: http://svn.apache.org/r1621613
Log:
More work on CONNECTORS-977.

Modified:
    
manifoldcf/trunk/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java
    
manifoldcf/trunk/connectors/cmis/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/cmis/CmisRepositoryConnector.java
    
manifoldcf/trunk/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java
    
manifoldcf/trunk/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java
    
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
    
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchSpecs.java
    
manifoldcf/trunk/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java
    
manifoldcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
    
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
    
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputSpecs.java
    
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filesystem/FileConnector.java
    
manifoldcf/trunk/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java
    
manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
    
manifoldcf/trunk/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java
    
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java
    
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java
    
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java
    
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java
    
manifoldcf/trunk/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java
    
manifoldcf/trunk/connectors/jira/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jira/JiraRepositoryConnector.java
    
manifoldcf/trunk/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java
    
manifoldcf/trunk/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java
    
manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
    
manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerSpecs.java
    
manifoldcf/trunk/connectors/rss/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/rss/RSSConnector.java
    
manifoldcf/trunk/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/SharePointRepository.java
    
manifoldcf/trunk/connectors/solr/connector/src/main/java/org/apache/manifoldcf/agents/output/solr/SolrConnector.java
    
manifoldcf/trunk/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java
    
manifoldcf/trunk/connectors/wiki/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/wiki/WikiConnector.java
    
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/connectors/BaseRepositoryConnector.java
    
manifoldcf/trunk/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/InterruptionRepositoryConnector.java
    
manifoldcf/trunk/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/SchedulingRepositoryConnector.java
    
manifoldcf/trunk/framework/pull-agent/src/test/java/org/apache/manifoldcf/crawler/tests/TestingRepositoryConnector.java

Modified: 
manifoldcf/trunk/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/alfresco/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/alfresco/AlfrescoRepositoryConnector.java
 Sun Aug 31 18:17:42 2014
@@ -45,6 +45,7 @@ import org.apache.commons.lang.StringUti
 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;
@@ -52,9 +53,9 @@ import org.apache.manifoldcf.core.interf
 import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
 import org.apache.manifoldcf.core.interfaces.SpecificationNode;
 import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
-import org.apache.manifoldcf.crawler.interfaces.DocumentSpecification;
 import org.apache.manifoldcf.crawler.interfaces.IProcessActivity;
 import org.apache.manifoldcf.crawler.interfaces.ISeedingActivity;
+import org.apache.manifoldcf.crawler.interfaces.DocumentSpecification;
 import org.apache.manifoldcf.crawler.system.Logging;
 
 public class AlfrescoRepositoryConnector extends BaseRepositoryConnector {
@@ -388,35 +389,36 @@ public class AlfrescoRepositoryConnector
   }
 
   /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
-   * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
-   *
-   * This method can choose to find repository changes that happen only during 
the specified time interval.
-   * The seeds recorded by this method will be viewed by the framework based 
on what the
-   * getConnectorModel() method returns.
-   *
-   * It is not a big problem if the connector chooses to create more seeds 
than are
-   * strictly necessary; it is merely a question of overall work required.
-   *
-   * The times passed to this method may be interpreted for greatest 
efficiency.  The time ranges
-   * any given job uses with this connector will not overlap, but will proceed 
starting at 0 and going
-   * to the "current time", each time the job is run.  For continuous crawling 
jobs, this method will
-   * be called once, when the job starts, and at various periodic intervals as 
the job executes.
-   *
-   * When a job's specification is changed, the framework automatically resets 
the seeding start time to 0.  The
-   * seeding start time may also be set to 0 on each job run, depending on the 
connector model returned by
-   * getConnectorModel().
-   *
-   * Note that it is always ok to send MORE documents rather than less to this 
method.
-   *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
-   *@param spec is a document specification (that comes from the job).
-   *@param startTime is the beginning of the time range to consider, inclusive.
-   *@param endTime is the end of the time range to consider, exclusive.
-   *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
-   */
+  * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+  *@param spec is a document specification (that comes from the job).
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
+  */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities,
-      DocumentSpecification spec, long startTime, long endTime)
-      throws ManifoldCFException, ServiceInterruption {
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
+    throws ManifoldCFException, ServiceInterruption {
 
     String luceneQuery = StringUtils.EMPTY;
     int i = 0;
@@ -452,6 +454,7 @@ public class AlfrescoRepositoryConnector
       Logging.connectors.warn("Alfresco: IOException: " + e.getMessage(), e);
       handleIOException(e);
     }
+    return "";
   }
 
   /** Get the maximum number of documents to amalgamate together into one 
batch, for this connector.
@@ -684,7 +687,7 @@ public class AlfrescoRepositoryConnector
 
   /** Fill in Velocity parameters for the LuceneQuery tab.
   */
-  private static void fillInLuceneQueryParameters(Map<String,String> paramMap, 
DocumentSpecification ds)
+  private static void fillInLuceneQueryParameters(Map<String,String> paramMap, 
Specification ds)
   {
     int i = 0;
     String luceneQuery = "";

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=1621613&r1=1621612&r2=1621613&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
 Sun Aug 31 18:17:42 2014
@@ -57,6 +57,7 @@ import org.apache.commons.lang.StringUti
 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;
@@ -627,35 +628,36 @@ public class CmisRepositoryConnector ext
   }
 
   /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
-   * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
-   *
-   * This method can choose to find repository changes that happen only during 
the specified time interval.
-   * The seeds recorded by this method will be viewed by the framework based 
on what the
-   * getConnectorModel() method returns.
-   *
-   * It is not a big problem if the connector chooses to create more seeds 
than are
-   * strictly necessary; it is merely a question of overall work required.
-   *
-   * The times passed to this method may be interpreted for greatest 
efficiency.  The time ranges
-   * any given job uses with this connector will not overlap, but will proceed 
starting at 0 and going
-   * to the "current time", each time the job is run.  For continuous crawling 
jobs, this method will
-   * be called once, when the job starts, and at various periodic intervals as 
the job executes.
-   *
-   * When a job's specification is changed, the framework automatically resets 
the seeding start time to 0.  The
-   * seeding start time may also be set to 0 on each job run, depending on the 
connector model returned by
-   * getConnectorModel().
-   *
-   * Note that it is always ok to send MORE documents rather than less to this 
method.
-   *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
-   *@param spec is a document specification (that comes from the job).
-   *@param startTime is the beginning of the time range to consider, inclusive.
-   *@param endTime is the end of the time range to consider, exclusive.
-   *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
-   */
+  * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+  *@param spec is a document specification (that comes from the job).
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
+  */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities,
-      DocumentSpecification spec, long startTime, long endTime, int jobMode)
-      throws ManifoldCFException, ServiceInterruption {
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
+    throws ManifoldCFException, ServiceInterruption {
 
     getSession();
 
@@ -685,6 +687,7 @@ public class CmisRepositoryConnector ext
       }
     }
 
+    return "";
   }
   
   

Modified: 
manifoldcf/trunk/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java
 (original)
+++ 
manifoldcf/trunk/connectors/documentum/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/DCTM/DCTM.java
 Sun Aug 31 18:17:42 2014
@@ -992,16 +992,46 @@ public class DCTM extends org.apache.man
   
   /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
   * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
   *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
   *@param spec is a document specification (that comes from the job).
-  *@param startTime is the beginning of the time range to consider, inclusive.
-  *@param endTime is the end of the time range to consider, exclusive.
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
   */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities, 
DocumentSpecification spec,
-    long startTime, long endTime)
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
     throws ManifoldCFException, ServiceInterruption
   {
+    // Extract startTime
+    long startTime;
+    if (lastSeedVersion == null)
+      startTime = 0L;
+    else
+    {
+      // Unpack seed time from seed version string
+      startTime = new Long(lastSeedVersion).longValue();
+    }
+
     // First, build the query
 
     int i = 0;
@@ -1069,7 +1099,7 @@ public class DCTM extends org.apache.man
       else
         startTime = 0L;
       StringBuilder strDQLend = new StringBuilder(" where r_modify_date >= " + 
buildDateString(startTime) +
-        " and r_modify_date<=" + buildDateString(endTime) +
+        " and r_modify_date<=" + buildDateString(seedTime) +
         " AND (i_is_deleted=TRUE Or (i_is_deleted=FALSE AND a_full_text=TRUE 
AND r_content_size>0");
 
       // append maxsize if set
@@ -1218,7 +1248,7 @@ public class DCTM extends org.apache.man
       }
       throw new ManifoldCFException(e.getMessage(),e);
     }
-
+    return new Long(seedTime).toString();
   }
 
   /** Do a query and read back the name column */

Modified: 
manifoldcf/trunk/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/dropbox/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/dropbox/DropboxRepositoryConnector.java
 Sun Aug 31 18:17:42 2014
@@ -42,6 +42,7 @@ import org.apache.manifoldcf.core.interf
 import org.apache.manifoldcf.core.common.XThreadInputStream;
 import org.apache.commons.lang.StringUtils;
 import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
+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;
@@ -696,50 +697,38 @@ public class DropboxRepositoryConnector 
     
Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER_FORWARD,paramMap);
   }
 
-  /**
-   * Queue "seed" documents. Seed documents are the starting places for
-   * crawling activity. Documents are seeded when this method calls
-   * appropriate methods in the passed in ISeedingActivity object.
-   *
-   * This method can choose to find repository changes that happen only during
-   * the specified time interval. The seeds recorded by this method will be
-   * viewed by the framework based on what the getConnectorModel() method
-   * returns.
-   *
-   * It is not a big problem if the connector chooses to create more seeds
-   * than are strictly necessary; it is merely a question of overall work
-   * required.
-   *
-   * The times passed to this method may be interpreted for greatest
-   * efficiency. The time ranges any given job uses with this connector will
-   * not overlap, but will proceed starting at 0 and going to the "current
-   * time", each time the job is run. For continuous crawling jobs, this
-   * method will be called once, when the job starts, and at various periodic
-   * intervals as the job executes.
-   *
-   * When a job's specification is changed, the framework automatically resets
-   * the seeding start time to 0. The seeding start time may also be set to 0
-   * on each job run, depending on the connector model returned by
-   * getConnectorModel().
-   *
-   * Note that it is always ok to send MORE documents rather than less to this
-   * method.
-   *
-   * @param activities is the interface this method should use to perform
-   * whatever framework actions are desired.
-   * @param spec is a document specification (that comes from the job).
-   * @param startTime is the beginning of the time range to consider,
-   * inclusive.
-   * @param endTime is the end of the time range to consider, exclusive.
-   * @param jobMode is an integer describing how the job is being run, whether
-   * continuous or once-only.
-   */
+  /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
+  * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+  *@param spec is a document specification (that comes from the job).
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
+  */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities,
-    DocumentSpecification spec, long startTime, long endTime, int jobMode)
-    throws ManifoldCFException, ServiceInterruption {
-    
-      
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
+    throws ManifoldCFException, ServiceInterruption {    
+
     String dropboxPath = StringUtils.EMPTY;
     int i = 0;
     while (i < spec.getChildCount()) {
@@ -787,6 +776,7 @@ public class DropboxRepositoryConnector 
       Logging.connectors.warn("DROPBOX: Error adding seed documents: " + 
e.getMessage(), e);
       handleDropboxException(e);
     }
+    return "";
   }
 
   protected class GetSeedsThread extends Thread {

Modified: 
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
 Sun Aug 31 18:17:42 2014
@@ -381,18 +381,6 @@ public class ElasticSearchConnector exte
     return new ElasticSearchSpecs(getSpecNode(os));
   }
 
-  final private ElasticSearchSpecs getSpecsCache(String outputDescription)
-      throws ManifoldCFException
-  {
-    try
-    {
-      return new ElasticSearchSpecs(new JSONObject(outputDescription));
-    } catch (JSONException e)
-    {
-      throw new ManifoldCFException(e);
-    }
-  }
-
   @Override
   public VersionContext getPipelineDescription(Specification os)
       throws ManifoldCFException
@@ -405,22 +393,13 @@ public class ElasticSearchConnector exte
   public boolean checkLengthIndexable(VersionContext outputDescription, long 
length, IOutputCheckActivity activities)
       throws ManifoldCFException, ServiceInterruption
   {
-    ElasticSearchSpecs specs = 
getSpecsCache(outputDescription.getVersionString());
+    ElasticSearchSpecs specs = new 
ElasticSearchSpecs(getSpecNode(outputDescription.getSpecification()));
     long maxFileSize = specs.getMaxFileSize();
     if (length > maxFileSize)
       return false;
     return super.checkLengthIndexable(outputDescription, length, activities);
   }
 
-  @Override
-  public boolean checkDocumentIndexable(VersionContext outputDescription, File 
localFile, IOutputCheckActivity activities)
-      throws ManifoldCFException, ServiceInterruption
-  {
-    // No filtering here; we don't look inside the file and don't know its 
extension.  That's done via the url
-    // filter
-    return true;
-  }
-  
   /** Pre-determine whether a document's URL is indexable by this connector.  
This method is used by participating repository connectors
   * to help filter out documents that are not worth indexing.
   *@param outputDescription is the document's output version.
@@ -431,7 +410,7 @@ public class ElasticSearchConnector exte
   public boolean checkURLIndexable(VersionContext outputDescription, String 
url, IOutputCheckActivity activities)
     throws ManifoldCFException, ServiceInterruption
   {
-    ElasticSearchSpecs specs = 
getSpecsCache(outputDescription.getVersionString());
+    ElasticSearchSpecs specs = new 
ElasticSearchSpecs(getSpecNode(outputDescription.getSpecification()));
     return specs.checkExtension(FilenameUtils.getExtension(url));
   }
 
@@ -439,7 +418,7 @@ public class ElasticSearchConnector exte
   public boolean checkMimeTypeIndexable(VersionContext outputDescription, 
String mimeType, IOutputCheckActivity activities)
     throws ManifoldCFException, ServiceInterruption
   {
-    ElasticSearchSpecs specs = 
getSpecsCache(outputDescription.getVersionString());
+    ElasticSearchSpecs specs = new 
ElasticSearchSpecs(getSpecNode(outputDescription.getSpecification()));
     return specs.checkMimeType(mimeType);
   }
 

Modified: 
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchSpecs.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchSpecs.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchSpecs.java
 (original)
+++ 
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchSpecs.java
 Sun Aug 31 18:17:42 2014
@@ -50,29 +50,6 @@ public class ElasticSearchSpecs extends 
 
   private Set<String> mimeTypeSet;
 
-  /** Build a set of ElasticSearch parameters by reading an JSON object
-   * 
-   * @param json
-   * @throws JSONException
-   * @throws ManifoldCFException */
-  public ElasticSearchSpecs(JSONObject json) throws JSONException,
-      ManifoldCFException
-  {
-    super(SPECIFICATIONLIST);
-    extensionSet = null;
-    mimeTypeSet = null;
-    for (ParameterEnum param : SPECIFICATIONLIST)
-    {
-      String value = null;
-      value = json.getString(param.name());
-      if (value == null)
-        value = param.defaultValue;
-      put(param, value);
-    }
-    extensionSet = createStringSet(getExtensions());
-    mimeTypeSet = createStringSet(getMimeTypes());
-  }
-
   /** Build a set of ElasticSearch parameters by reading an instance of
    * SpecificationNode.
    * 

Modified: 
manifoldcf/trunk/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/email/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/email/EmailConnector.java
 Sun Aug 31 18:17:42 2014
@@ -236,39 +236,47 @@ public class EmailConnector extends org.
     return 10;
   }
 
-  /**
-  * Queue "seed" documents. Seed documents are the starting places for 
crawling activity. Documents
+  /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
   * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
-  * <p/>
+  *
   * This method can choose to find repository changes that happen only during 
the specified time interval.
   * The seeds recorded by this method will be viewed by the framework based on 
what the
   * getConnectorModel() method returns.
-  * <p/>
+  *
   * It is not a big problem if the connector chooses to create more seeds than 
are
   * strictly necessary; it is merely a question of overall work required.
-  * <p/>
-  * The times passed to this method may be interpreted for greatest 
efficiency. The time ranges
-  * any given job uses with this connector will not overlap, but will proceed 
starting at 0 and going
-  * to the "current time", each time the job is run. For continuous crawling 
jobs, this method will
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
   * be called once, when the job starts, and at various periodic intervals as 
the job executes.
-  * <p/>
-  * When a job's specification is changed, the framework automatically resets 
the seeding start time to 0. The
-  * seeding start time may also be set to 0 on each job run, depending on the 
connector model returned by
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
   * getConnectorModel().
-  * <p/>
-  * Note that it is always ok to send MORE documents rather than less to this 
method.
   *
-  * @param activities is the interface this method should use to perform 
whatever framework actions are desired.
-  * @param spec is a document specification (that comes from the job).
-  * @param startTime is the beginning of the time range to consider, inclusive.
-  * @param endTime is the end of the time range to consider, exclusive.
-  * @param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+  *@param spec is a document specification (that comes from the job).
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
   */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities,
-    DocumentSpecification spec, long startTime, long endTime, int jobMode)
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
     throws ManifoldCFException, ServiceInterruption {
 
+    long startTime;
+    if (lastSeedVersion == null)
+      startTime = 0L;
+    else
+    {
+      // Unpack seed time from seed version string
+      startTime = new Long(lastSeedVersion).longValue();
+    }
+
     getSession();
 
     int i = 0;
@@ -296,7 +304,7 @@ public class EmailConnector extends org.
         Folder folder = oft.finishUp();
         try
         {
-          Message[] messages = findMessages(folder, startTime, endTime, 
findMap);
+          Message[] messages = findMessages(folder, startTime, seedTime, 
findMap);
           for (Message message : messages) {
             String emailID = ((MimeMessage) message).getMessageID();
             
activities.addSeedDocument(createDocumentIdentifier(folderName,emailID));
@@ -315,6 +323,7 @@ public class EmailConnector extends org.
       }
     }
 
+    return new Long(seedTime).toString();
   }
 
   /*

Modified: 
manifoldcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/filenet/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/filenet/FilenetConnector.java
 Sun Aug 31 18:17:42 2014
@@ -683,18 +683,47 @@ public class FilenetConnector extends or
   
   /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
   * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
   *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
   *@param spec is a document specification (that comes from the job).
-  *@param startTime is the beginning of the time range to consider, inclusive.
-  *@param endTime is the end of the time range to consider, exclusive.
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
   */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities, 
DocumentSpecification spec,
-    long startTime, long endTime)
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
     throws ManifoldCFException, ServiceInterruption
   {
     Logging.connectors.debug("FileNet: Inside addSeedDocuments");
 
+    long startTime;
+    if (lastSeedVersion == null)
+      startTime = 0L;
+    else
+    {
+      // Unpack seed time from seed version string
+      startTime = new Long(lastSeedVersion).longValue();
+    }
+
     // Go through all the document classes and do a query for each one
     //get all mimetypes and build a SQL "where condition"
 
@@ -746,7 +775,7 @@ public class FilenetConnector extends or
       sqlBuffer.append(" AND [DateLastModified] >= 
").append(buildTime(c,startTime));
     }
 
-    sqlBuffer.append(" AND  [DateLastModified] <= 
").append(buildTime(c,endTime));
+    sqlBuffer.append(" AND  [DateLastModified] <= 
").append(buildTime(c,seedTime));
 
     // Folders are also based just on objectstore, so we add those here.
     boolean seenAny = false;
@@ -826,6 +855,7 @@ public class FilenetConnector extends or
 
       i++;
     }
+    return new Long(seedTime).toString();
   }
 
   protected static String quoteSQLString(String value)

Modified: 
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputConnector.java
 Sun Aug 31 18:17:42 2014
@@ -171,27 +171,26 @@ public class FileOutputConnector extends
 
     FileOutputConfig config = getConfigParameters(null);
 
-    FileOutputSpecs specs = null;
+    FileOutputSpecs specs = new 
FileOutputSpecs(getSpecNode(outputDescription.getSpecification()));;
     StringBuffer path = new StringBuffer();
-    try {
-      specs = new FileOutputSpecs(outputDescription.getVersionString());
 
+    try {
       /*
-       * make file path
-       */
+        * make file path
+        */
       if (specs.getRootPath() != null) {
         path.append(specs.getRootPath());
       }
-      
+        
       // If the path does not yet exist at the root level, it is dangerous to 
create it.
       File currentPath = new File(path.toString());
       if (!currentPath.exists())
         throw new ManifoldCFException("Root path does not yet exist: 
'"+currentPath+"'");
       if (!currentPath.isDirectory())
         throw new ManifoldCFException("Root path is not a directory: 
'"+currentPath+"'");
-      
+        
       String filePath = documentURItoFilePath(documentURI);
-      
+        
       // Build path one level at a time.  This is needed because there may be 
a collision at
       // every level.
       int index = 0;
@@ -226,7 +225,7 @@ public class FileOutputConnector extends
         currentPath = newPath;
         // Go on to the next one.
       }
-      
+        
       // Path successfully created.  Now create file.
       FileOutputStream output = null;
       String fileName = filePath.substring(index);
@@ -256,8 +255,8 @@ public class FileOutputConnector extends
 
       try {
         /*
-         * lock file
-         */
+          * lock file
+          */
         FileChannel channel = output.getChannel();
         FileLock lock = channel.tryLock();
         if (lock == null)
@@ -266,8 +265,8 @@ public class FileOutputConnector extends
         try {
 
           /*
-           * write file
-           */
+            * write file
+            */
           InputStream input = document.getBinaryStream();
           byte buf[] = new byte[65536];
           int len;
@@ -290,9 +289,6 @@ public class FileOutputConnector extends
         } catch (IOException e) {
         }
       }
-    } catch (JSONException e) {
-      handleJSONException(e);
-      return DOCUMENTSTATUS_REJECTED;
     } catch (URISyntaxException e) {
       handleURISyntaxException(e);
       return DOCUMENTSTATUS_REJECTED;
@@ -361,10 +357,8 @@ public class FileOutputConnector extends
 
     FileOutputConfig config = getConfigParameters(null);
 
-    FileOutputSpecs specs = null;
     StringBuffer path = new StringBuffer();
     try {
-      specs = new FileOutputSpecs(outputDescription);
 
       // We cannot remove documents, because it is unsafe to do so.
       // Paths that were created when the document existed will not
@@ -437,8 +431,6 @@ public class FileOutputConnector extends
       }
       // Just close it, to make a zero-length grave marker.
       output.close();
-    } catch (JSONException e) {
-      handleJSONException(e);
     } catch (URISyntaxException e) {
       handleURISyntaxException(e);
     } catch (FileNotFoundException e) {

Modified: 
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputSpecs.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputSpecs.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputSpecs.java
 (original)
+++ 
manifoldcf/trunk/connectors/filesystem/connector/src/main/java/org/apache/manifoldcf/agents/output/filesystem/FileOutputSpecs.java
 Sun Aug 31 18:17:42 2014
@@ -44,36 +44,6 @@ public class FileOutputSpecs extends Fil
 
   private String rootPath;
 
-  /** Build a set of ElasticSearch parameters by reading an JSON object
-   * 
-   * @param json
-   * @throws JSONException
-   * @throws ManifoldCFException
-   */
-  public FileOutputSpecs(String json) throws JSONException, 
ManifoldCFException {
-    this(new JSONObject(json));
-  }
-
-  /** Build a set of ElasticSearch parameters by reading an JSON object
-   * 
-   * @param json
-   * @throws JSONException
-   * @throws ManifoldCFException
-   */
-  public FileOutputSpecs(JSONObject json) throws JSONException, 
ManifoldCFException {
-    super(SPECIFICATIONLIST);
-    rootPath = null;
-    for (ParameterEnum param : SPECIFICATIONLIST) {
-      String value = null;
-      value = json.getString(param.name());
-      if (value == null) {
-        value = param.defaultValue;
-      }
-      put(param, value);
-    }
-    rootPath = getRootPath();
-  }
-
   /** Build a set of ElasticSearch parameters by reading an instance of
    * SpecificationNode.
    * 

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=1621613&r1=1621612&r2=1621613&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
 Sun Aug 31 18:17:42 2014
@@ -166,26 +166,64 @@ public class FileConnector extends org.a
   }
 
 
-  /** Given a document specification, get either a list of starting document 
identifiers (seeds),
-  * or a list of changes (deltas), depending on whether this is a "crawled" 
connector or not.
-  * These document identifiers will be loaded into the job's queue at the 
beginning of the
-  * job's execution.
-  * This method can return changes only (because it is provided a time range). 
 For full
-  * recrawls, the start time is always zero.
-  * Note that it is always ok to return MORE documents rather than less with 
this method.
+  /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
+  * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
   *@param spec is a document specification (that comes from the job).
-  *@param startTime is the beginning of the time range to consider, inclusive.
-  *@param endTime is the end of the time range to consider, exclusive.
-  *@return the stream of local document identifiers that should be added to 
the queue.
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
   */
   @Override
-  public IDocumentIdentifierStream 
getDocumentIdentifiers(DocumentSpecification spec, long startTime, long endTime)
-    throws ManifoldCFException
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
+    throws ManifoldCFException, ServiceInterruption
   {
-    return new IdentifierStream(spec);
+    try
+    {
+      // Walk the specification for the "startpoint" types.  Amalgamate these 
into a list of strings.
+      // Presume that all roots are startpoint nodes
+      for (int i = 0; i < spec.getChildCount(); i++)
+      {
+        SpecificationNode n = spec.getChild(i);
+        if (n.getType().equals("startpoint"))
+        {
+          // The id returned MUST be in canonical form!!!
+          String seed = new 
File(n.getAttributeValue("path")).getCanonicalPath();
+          if (Logging.connectors.isDebugEnabled())
+          {
+            Logging.connectors.debug("Seed = '"+seed+"'");
+          }
+          activities.addSeedDocument(seed);
+        }
+      }
+    }
+    catch (IOException e)
+    {
+      throw new ManifoldCFException("Could not get a canonical path: 
"+e.getMessage(),e);
+    }
+    return "";
   }
-
-
+  
   /** Get document versions given an array of document identifiers.
   * This method is called for EVERY document that is considered. It is 
therefore important to perform
   * as little work as possible here.
@@ -1309,73 +1347,4 @@ public class FileConnector extends org.a
     }
   }
 
-  /** Document identifier stream.
-  */
-  protected static class IdentifierStream implements IDocumentIdentifierStream
-  {
-    protected String[] ids = null;
-    protected int currentIndex = 0;
-
-    public IdentifierStream(DocumentSpecification spec)
-      throws ManifoldCFException
-    {
-      try
-      {
-        // Walk the specification for the "startpoint" types.  Amalgamate 
these into a list of strings.
-        // Presume that all roots are startpoint nodes
-        int i = 0;
-        int j = 0;
-        while (i < spec.getChildCount())
-        {
-          SpecificationNode n = spec.getChild(i);
-          if (n.getType().equals("startpoint"))
-            j++;
-          i++;
-        }
-        ids = new String[j];
-        i = 0;
-        j = 0;
-        while (i < ids.length)
-        {
-          SpecificationNode n = spec.getChild(i);
-          if (n.getType().equals("startpoint"))
-          {
-            // The id returned MUST be in canonical form!!!
-            ids[j] = new File(n.getAttributeValue("path")).getCanonicalPath();
-            if (Logging.connectors.isDebugEnabled())
-            {
-              Logging.connectors.debug("Seed = '"+ids[j]+"'");
-            }
-            j++;
-          }
-          i++;
-        }
-      }
-      catch (IOException e)
-      {
-        throw new ManifoldCFException("Could not get a canonical path",e);
-      }
-    }
-
-    /** Get the next identifier.
-    *@return the next document identifier, or null if there are no more.
-    */
-    public String getNextIdentifier()
-      throws ManifoldCFException, ServiceInterruption
-    {
-      if (currentIndex == ids.length)
-        return null;
-      return ids[currentIndex++];
-    }
-
-    /** Close the stream.
-    */
-    public void close()
-      throws ManifoldCFException
-    {
-      ids = null;
-    }
-
-  }
-
 }

Modified: 
manifoldcf/trunk/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/generic/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/generic/GenericConnector.java
 Sun Aug 31 18:17:42 2014
@@ -189,10 +189,19 @@ public class GenericConnector extends Ba
   }
 
   @Override
-  public void addSeedDocuments(ISeedingActivity activities, 
DocumentSpecification spec,
-    long startTime, long endTime)
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
     throws ManifoldCFException, ServiceInterruption {
 
+    long startTime;
+    if (lastSeedVersion == null)
+      startTime = 0L;
+    else
+    {
+      // Unpack seed time from seed version string
+      startTime = new Long(lastSeedVersion).longValue();
+    }
+
     HttpClient client = getClient();
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
 
@@ -201,7 +210,7 @@ public class GenericConnector extends Ba
     if (startTime > 0) {
       url.append("&startTime=").append(sdf.format(new Date(startTime)));
     }
-    url.append("&endTime=").append(sdf.format(new Date(endTime)));
+    url.append("&endTime=").append(sdf.format(new Date(seedTime)));
     for (int i = 0; i < spec.getChildCount(); i++) {
       SpecificationNode sn = spec.getChild(i);
       if (sn.getType().equals("param")) {
@@ -245,6 +254,7 @@ public class GenericConnector extends Ba
       throw new ManifoldCFException("Interrupted: " + e.getMessage(), e,
         ManifoldCFException.INTERRUPTED);
     }
+    return new Long(seedTime).toString();
   }
 
   @Override

Modified: 
manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/googledrive/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/googledrive/GoogleDriveRepositoryConnector.java
 Sun Aug 31 18:17:42 2014
@@ -38,6 +38,7 @@ import org.apache.manifoldcf.crawler.sys
 import org.apache.manifoldcf.crawler.connectors.BaseRepositoryConnector;
 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.ManifoldCFException;
 import org.apache.commons.lang.StringUtils;
 import org.apache.manifoldcf.agents.interfaces.RepositoryDocument;
@@ -747,48 +748,37 @@ public class GoogleDriveRepositoryConnec
     
Messages.outputResourceWithVelocity(out,locale,EDIT_SPEC_HEADER_FORWARD,paramMap);
   }
 
-  /**
-   * Queue "seed" documents. Seed documents are the starting places for
-   * crawling activity. Documents are seeded when this method calls
-   * appropriate methods in the passed in ISeedingActivity object.
-   *
-   * This method can choose to find repository changes that happen only during
-   * the specified time interval. The seeds recorded by this method will be
-   * viewed by the framework based on what the getConnectorModel() method
-   * returns.
-   *
-   * It is not a big problem if the connector chooses to create more seeds
-   * than are strictly necessary; it is merely a question of overall work
-   * required.
-   *
-   * The times passed to this method may be interpreted for greatest
-   * efficiency. The time ranges any given job uses with this connector will
-   * not overlap, but will proceed starting at 0 and going to the "current
-   * time", each time the job is run. For continuous crawling jobs, this
-   * method will be called once, when the job starts, and at various periodic
-   * intervals as the job executes.
-   *
-   * When a job's specification is changed, the framework automatically resets
-   * the seeding start time to 0. The seeding start time may also be set to 0
-   * on each job run, depending on the connector model returned by
-   * getConnectorModel().
-   *
-   * Note that it is always ok to send MORE documents rather than less to this
-   * method.
-   *
-   * @param activities is the interface this method should use to perform
-   * whatever framework actions are desired.
-   * @param spec is a document specification (that comes from the job).
-   * @param startTime is the beginning of the time range to consider,
-   * inclusive.
-   * @param endTime is the end of the time range to consider, exclusive.
-   * @param jobMode is an integer describing how the job is being run, whether
-   * continuous or once-only.
-   */
+  /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
+  * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+  *@param spec is a document specification (that comes from the job).
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
+  */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities,
-      DocumentSpecification spec, long startTime, long endTime, int jobMode)
-      throws ManifoldCFException, ServiceInterruption {
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
+    throws ManifoldCFException, ServiceInterruption {
 
     String googleDriveQuery = GoogleDriveConfig.GOOGLEDRIVE_QUERY_DEFAULT;
     int i = 0;
@@ -843,6 +833,7 @@ public class GoogleDriveRepositoryConnec
       Logging.connectors.warn("GOOGLEDRIVE: Error adding seed documents: " + 
e.getMessage(), e);
       handleIOException(e);
     }
+    return "";
   }
   
   protected class GetSeedsThread extends Thread {

Modified: 
manifoldcf/trunk/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/gridfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/gridfs/GridFSRepositoryConnector.java
 Sun Aug 31 18:17:42 2014
@@ -39,6 +39,7 @@ import org.apache.commons.lang.StringUti
 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;
@@ -323,47 +324,37 @@ public class GridFSRepositoryConnector e
         return super.getRelationshipTypes();
     }
 
-    /**
-     * Queue "seed" documents. Seed documents are the starting places for
-     * crawling activity. Documents are seeded when this method calls
-     * appropriate methods in the passed in ISeedingActivity object.
-     *
-     * This method can choose to find repository changes that happen only 
during
-     * the specified time interval. The seeds recorded by this method will be
-     * viewed by the framework based on what the getConnectorModel() method
-     * returns.
-     *
-     * It is not a big problem if the connector chooses to create more seeds
-     * than are strictly necessary; it is merely a question of overall work
-     * required.
-     *
-     * The times passed to this method may be interpreted for greatest
-     * efficiency. The time ranges any given job uses with this connector will
-     * not overlap, but will proceed starting at 0 and going to the "current
-     * time", each time the job is run. For continuous crawling jobs, this
-     * method will be called once, when the job starts, and at various periodic
-     * intervals as the job executes.
-     *
-     * When a job's specification is changed, the framework automatically 
resets
-     * the seeding start time to 0. The seeding start time may also be set to 0
-     * on each job run, depending on the connector model returned by
-     * getConnectorModel().
-     *
-     * Note that it is always ok to send MORE documents rather than less to 
this
-     * method. The connector will be connected before this method can be 
called.
-     *
-     * @param activities is the interface this method should use to perform
-     * whatever framework actions are desired.
-     * @param spec is a document specification (that comes from the job).
-     * @param startTime is the beginning of the time range to consider,
-     * inclusive.
-     * @param endTime is the end of the time range to consider, exclusive.
-     * @throws org.apache.manifoldcf.core.interfaces.ManifoldCFException
-     * @throws org.apache.manifoldcf.agents.interfaces.ServiceInterruption
-     */
-    @Override
-    public void addSeedDocuments(ISeedingActivity activities, 
DocumentSpecification spec,
-            long startTime, long endTime) throws ManifoldCFException, 
ServiceInterruption {
+    /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
+    * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+    *
+    * This method can choose to find repository changes that happen only 
during the specified time interval.
+    * The seeds recorded by this method will be viewed by the framework based 
on what the
+    * getConnectorModel() method returns.
+    *
+    * It is not a big problem if the connector chooses to create more seeds 
than are
+    * strictly necessary; it is merely a question of overall work required.
+    *
+    * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+    * For continuous crawling jobs, this method will
+    * be called once, when the job starts, and at various periodic intervals 
as the job executes.
+    *
+    * When a job's specification is changed, the framework automatically 
resets the seeding version string to null.  The
+    * seeding version string may also be set to null on each job run, 
depending on the connector model returned by
+    * getConnectorModel().
+    *
+    * Note that it is always ok to send MORE documents rather than less to 
this method.
+    * The connector will be connected before this method can be called.
+    *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+    *@param spec is a document specification (that comes from the job).
+    *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+    *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+    *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+    *@return an updated seeding version string, to be stored with the job.
+    */
+    @Override
+    public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+        String lastSeedVersion, long seedTime, int jobMode)
+        throws ManifoldCFException, ServiceInterruption {
         getSession();
         DBCollection fsFiles = session.getCollection(
                 bucket + GridFSConstants.COLLECTION_SEPERATOR + 
GridFSConstants.FILES_COLLECTION_NAME
@@ -377,6 +368,7 @@ public class GridFSRepositoryConnector e
                 Logging.connectors.debug("GridFS: Document _id = " + _id + " 
added to queue");
             }
         }
+        return "";
     }
 
     /**

Modified: 
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/GTSConnector.java
 Sun Aug 31 18:17:42 2014
@@ -239,17 +239,11 @@ public class GTSConnector extends org.ap
   public VersionContext getPipelineDescription(Specification spec)
     throws ManifoldCFException, ServiceInterruption
   {
-    // The information we want in this string is:
-    // (1) the collection name(s), in sorted order.
-    // (2) the document template
-    // (3) the ingest URI
-
-    ArrayList collectionList = new ArrayList();
+    List<String> collectionList = new ArrayList<String>();
     String documentTemplate = "";
-    int i = 0;
-    while (i < spec.getChildCount())
+    for (int i = 0; i < spec.getChildCount(); i++)
     {
-      SpecificationNode sn = spec.getChild(i++);
+      SpecificationNode sn = spec.getChild(i);
       if (sn.getType().equals(GTSConfig.NODE_COLLECTION))
       {
         collectionList.add(sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE));
@@ -260,20 +254,24 @@ public class GTSConnector extends org.ap
       }
     }
 
-    String[] sortArray = new String[collectionList.size()];
-    i = 0;
-    while (i < sortArray.length)
-    {
-      sortArray[i] = (String)collectionList.get(i);
-      i++;
-    }
-    java.util.Arrays.sort(sortArray);
-
     // Get the config info too.  This will be constant for any given connector 
instance, so we don't have to worry about it changing
     // out from under us.
     String ingestURI = params.getParameter(GTSConfig.PARAM_INGESTURI);
 
     // Now, construct the appropriate string
+    // The information we want in this string is:
+    // (1) the collection name(s), in sorted order.
+    // (2) the document template
+    // (3) the ingest URI
+
+    String[] sortArray = new String[collectionList.size()];
+    int j = 0;
+    for (String collection : collectionList)
+    {
+      sortArray[j++] = collection;
+    }
+    java.util.Arrays.sort(sortArray);
+
     StringBuilder sb = new StringBuilder();
     packList(sb,sortArray,'+');
     pack(sb,documentTemplate,'+');
@@ -300,27 +298,28 @@ public class GTSConnector extends org.ap
   public int addOrReplaceDocumentWithException(String documentURI, 
VersionContext pipelineDescription, RepositoryDocument document, String 
authorityNameString, IOutputAddActivity activities)
     throws ManifoldCFException, ServiceInterruption, IOException
   {
-    String outputDescription = pipelineDescription.getVersionString();
-         
-    // Establish a session
-    getSession();
-
-    // Unpack what we need from the output description.  This consists of the 
collection names, plus the document template.
-    ArrayList collections = new ArrayList();
-    StringBuilder documentTemplateBuffer = new StringBuilder();
-    int startPosition = unpackList(collections,outputDescription,0,'+');
-    startPosition = 
unpack(documentTemplateBuffer,outputDescription,startPosition,'+');
-
-    String[] collectionArray = new String[collections.size()];
-    int i = 0;
-    while (i < collectionArray.length)
+    // Grab the information we need to index
+    Specification spec = pipelineDescription.getSpecification();
+    List<String> collectionList = new ArrayList<String>();
+    String documentTemplate = "";
+    for (int i = 0; i < spec.getChildCount(); i++)
     {
-      collectionArray[i] = (String)collections.get(i);
-      i++;
+      SpecificationNode sn = spec.getChild(i);
+      if (sn.getType().equals(GTSConfig.NODE_COLLECTION))
+      {
+        collectionList.add(sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE));
+      }
+      else if (sn.getType().equals(GTSConfig.NODE_DOCUMENTTEMPLATE))
+      {
+        documentTemplate = sn.getAttributeValue(GTSConfig.ATTRIBUTE_VALUE);
+      }
     }
 
+    // Establish a session
+    getSession();
+
     // Now, go off and call the ingest API.
-    if 
(poster.indexPost(documentURI,collectionArray,documentTemplateBuffer.toString(),authorityNameString,document,activities))
+    if 
(poster.indexPost(documentURI,collectionList,documentTemplate,authorityNameString,document,activities))
       return DOCUMENTSTATUS_ACCEPTED;
     return DOCUMENTSTATUS_REJECTED;
   }

Modified: 
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java
 (original)
+++ 
manifoldcf/trunk/connectors/gts/connector/src/main/java/org/apache/manifoldcf/agents/output/gts/HttpPoster.java
 Sun Aug 31 18:17:42 2014
@@ -146,7 +146,7 @@ public class HttpPoster
   * @throws ManifoldCFException, ServiceInterruption
   */
   public boolean indexPost(String documentURI,
-    String[] collections, String documentTemplate, String authorityNameString,
+    List<String> collections, String documentTemplate, String 
authorityNameString,
     RepositoryDocument document, IOutputAddActivity activities)
     throws ManifoldCFException, ServiceInterruption
   {
@@ -671,7 +671,7 @@ public class HttpPoster
   {
     protected String documentURI;
     protected String aclXmlString;
-    protected String[] collections;
+    protected List<String> collections;
     protected String documentTemplate;
     protected RepositoryDocument document;
 
@@ -683,7 +683,7 @@ public class HttpPoster
     protected boolean readFromDocumentStreamYet = false;
     protected boolean rval = false;
 
-    public IngestThread(String documentURI, String aclXmlString, String[] 
collections, String documentTemplate, RepositoryDocument document)
+    public IngestThread(String documentURI, String aclXmlString, List<String> 
collections, String documentTemplate, RepositoryDocument document)
     {
       super();
       setDaemon(true);
@@ -761,10 +761,8 @@ public class HttpPoster
                   // Do the collections
                   if (collections != null)
                   {
-                    int index = 0;
-                    while (index < collections.length)
+                    for (String collectionName : collections)
                     {
-                      String collectionName = collections[index++];
                       String encodedValue = metadataEncode(collectionName);
                       //System.out.println("collection metadata: 
collection_name = '"+encodedValue+"'");
                       tmp = ("Document-Metadata: 
collection_name="+encodedValue+"\r\n").getBytes(StandardCharsets.UTF_8);

Modified: 
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/agents/output/hdfs/HDFSOutputConnector.java
 Sun Aug 31 18:17:42 2014
@@ -271,9 +271,8 @@ public class HDFSOutputConnector extends
   @Override
   public int addOrReplaceDocumentWithException(String documentURI, 
VersionContext pipelineDescription, RepositoryDocument document, String 
authorityNameString, IOutputAddActivity activities)
     throws ManifoldCFException, ServiceInterruption, IOException {
-    String outputDescription = pipelineDescription.getVersionString();
+    HDFSOutputSpecs specs = new 
HDFSOutputSpecs(getSpecNode(pipelineDescription.getSpecification()));
     try {
-      HDFSOutputSpecs specs = new HDFSOutputSpecs(outputDescription);
 
       /*
        * make file path
@@ -290,9 +289,6 @@ public class HDFSOutputConnector extends
       createFile(path, document.getBinaryStream());
       activities.recordActivity(startTime, INGEST_ACTIVITY, new 
Long(document.getBinaryLength()), documentURI, "OK", null);
       return DOCUMENTSTATUS_ACCEPTED;
-    } catch (JSONException e) {
-      handleJSONException(e);
-      return DOCUMENTSTATUS_REJECTED;
     } catch (URISyntaxException e) {
       handleURISyntaxException(e);
       return DOCUMENTSTATUS_REJECTED;

Modified: 
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java?rev=1621613&r1=1621612&r2=1621613&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/hdfs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/hdfs/HDFSRepositoryConnector.java
 Sun Aug 31 18:17:42 2014
@@ -262,48 +262,37 @@ public class HDFSRepositoryConnector ext
     }
   }
 
-  /**
-   * Queue "seed" documents. Seed documents are the starting places for
-   * crawling activity. Documents are seeded when this method calls
-   * appropriate methods in the passed in ISeedingActivity object.
-   *
-   * This method can choose to find repository changes that happen only during
-   * the specified time interval. The seeds recorded by this method will be
-   * viewed by the framework based on what the getConnectorModel() method
-   * returns.
-   *
-   * It is not a big problem if the connector chooses to create more seeds
-   * than are strictly necessary; it is merely a question of overall work
-   * required.
-   *
-   * The times passed to this method may be interpreted for greatest
-   * efficiency. The time ranges any given job uses with this connector will
-   * not overlap, but will proceed starting at 0 and going to the "current
-   * time", each time the job is run. For continuous crawling jobs, this
-   * method will be called once, when the job starts, and at various periodic
-   * intervals as the job executes.
-   *
-   * When a job's specification is changed, the framework automatically resets
-   * the seeding start time to 0. The seeding start time may also be set to 0
-   * on each job run, depending on the connector model returned by
-   * getConnectorModel().
-   *
-   * Note that it is always ok to send MORE documents rather than less to this
-   * method.
-   *
-   * @param activities is the interface this method should use to perform
-   * whatever framework actions are desired.
-   * @param spec is a document specification (that comes from the job).
-   * @param startTime is the beginning of the time range to consider,
-   * inclusive.
-   * @param endTime is the end of the time range to consider, exclusive.
-   * @param jobMode is an integer describing how the job is being run, whether
-   * continuous or once-only.
-   */
+  /** Queue "seed" documents.  Seed documents are the starting places for 
crawling activity.  Documents
+  * are seeded when this method calls appropriate methods in the passed in 
ISeedingActivity object.
+  *
+  * This method can choose to find repository changes that happen only during 
the specified time interval.
+  * The seeds recorded by this method will be viewed by the framework based on 
what the
+  * getConnectorModel() method returns.
+  *
+  * It is not a big problem if the connector chooses to create more seeds than 
are
+  * strictly necessary; it is merely a question of overall work required.
+  *
+  * The end time and seeding version string passed to this method may be 
interpreted for greatest efficiency.
+  * For continuous crawling jobs, this method will
+  * be called once, when the job starts, and at various periodic intervals as 
the job executes.
+  *
+  * When a job's specification is changed, the framework automatically resets 
the seeding version string to null.  The
+  * seeding version string may also be set to null on each job run, depending 
on the connector model returned by
+  * getConnectorModel().
+  *
+  * Note that it is always ok to send MORE documents rather than less to this 
method.
+  * The connector will be connected before this method can be called.
+  *@param activities is the interface this method should use to perform 
whatever framework actions are desired.
+  *@param spec is a document specification (that comes from the job).
+  *@param seedTime is the end of the time range of documents to consider, 
exclusive.
+  *@param lastSeedVersionString is the last seeding version string for this 
job, or null if the job has no previous seeding version string.
+  *@param jobMode is an integer describing how the job is being run, whether 
continuous or once-only.
+  *@return an updated seeding version string, to be stored with the job.
+  */
   @Override
-  public void addSeedDocuments(ISeedingActivity activities,
-      DocumentSpecification spec, long startTime, long endTime, int jobMode)
-      throws ManifoldCFException, ServiceInterruption {
+  public String addSeedDocuments(ISeedingActivity activities, Specification 
spec,
+    String lastSeedVersion, long seedTime, int jobMode)
+    throws ManifoldCFException, ServiceInterruption {
 
     String path = StringUtils.EMPTY;
     int i = 0;
@@ -319,6 +308,7 @@ public class HDFSRepositoryConnector ext
       }
       i++;
     }
+    return "";
   }
 
   /** Get document versions given an array of document identifiers.


Reply via email to