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

svn commit: r1601529 [2/6] - in /manifoldcf/trunk: ./ connectors/ connectors/nulltransformation/ framework/agents/src/main/java/org/apache/manifoldcf/agents/ framework/agents/src/main/java/org/apache/manifoldcf/agents/incrementalingest/ framework/agent...

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IIncrementalIngester.java Mon Jun  9 23:19:08 2014
@@ -68,6 +68,30 @@ public interface IIncrementalIngester
   public String getOutputDescription(String outputConnectionName, OutputSpecification spec)
     throws ManifoldCFException, ServiceInterruption;
 
+  /** Get transformation version strings for a document.
+  *@param transformationConnectionNames are the names of the transformation connections associated with this action.
+  *@param specs are the transformation specifications.
+  *@return the description strings.
+  */
+  public String[] getTransformationDescriptions(String[] transformationConnectionNames, OutputSpecification[] specs)
+    throws ManifoldCFException, ServiceInterruption;
+
+  /** Check if a mime type is indexable.
+  *@param transformationConnectionNames is the ordered list of transformation connection names.
+  *@param transformationDescriptions is the ordered list of transformation description strings.
+  *@param outputConnectionName is the name of the output connection associated with this action.
+  *@param outputDescription is the output description string.
+  *@param mimeType is the mime type to check.
+  *@param activity are the activities available to this method.
+  *@return true if the mimeType is indexable.
+  */
+  public boolean checkMimeTypeIndexable(
+    String[] transformationConnectionNames, String[] transformationDescriptions,
+    String outputConnectionName, String outputDescription,
+    String mimeType,
+    IOutputCheckActivity activity)
+    throws ManifoldCFException, ServiceInterruption;
+
   /** Check if a mime type is indexable.
   *@param outputConnectionName is the name of the output connection associated with this action.
   *@param outputDescription is the output description string.
@@ -78,6 +102,22 @@ public interface IIncrementalIngester
     throws ManifoldCFException, ServiceInterruption;
 
   /** Check if a file is indexable.
+  *@param transformationConnectionNames is the ordered list of transformation connection names.
+  *@param transformationDescriptions is the ordered list of transformation description strings.
+  *@param outputConnectionName is the name of the output connection associated with this action.
+  *@param outputDescription is the output description string.
+  *@param localFile is the local file to check.
+  *@param activity are the activities available to this method.
+  *@return true if the local file is indexable.
+  */
+  public boolean checkDocumentIndexable(
+    String[] transformationConnectionNames, String[] transformationDescriptions,
+    String outputConnectionName, String outputDescription,
+    File localFile,
+    IOutputCheckActivity activity)
+    throws ManifoldCFException, ServiceInterruption;
+
+  /** Check if a file is indexable.
   *@param outputConnectionName is the name of the output connection associated with this action.
   *@param outputDescription is the output description string.
   *@param localFile is the local file to check.
@@ -88,6 +128,23 @@ public interface IIncrementalIngester
 
   /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
   * to help filter out documents that are too long to be indexable.
+  *@param transformationConnectionNames is the ordered list of transformation connection names.
+  *@param transformationDescriptions is the ordered list of transformation description strings.
+  *@param outputConnectionName is the name of the output connection associated with this action.
+  *@param outputDescription is the output description string.
+  *@param length is the length of the document.
+  *@param activity are the activities available to this method.
+  *@return true if the file is indexable.
+  */
+  public boolean checkLengthIndexable(
+    String[] transformationConnectionNames, String[] transformationDescriptions,
+    String outputConnectionName, String outputDescription,
+    long length,
+    IOutputCheckActivity activity)
+    throws ManifoldCFException, ServiceInterruption;
+
+  /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
+  * to help filter out documents that are too long to be indexable.
   *@param outputConnectionName is the name of the output connection associated with this action.
   *@param outputDescription is the output description string.
   *@param length is the length of the document.
@@ -98,6 +155,23 @@ public interface IIncrementalIngester
 
   /** 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 not indexable.
+  *@param transformationConnectionNames is the ordered list of transformation connection names.
+  *@param transformationDescriptions is the ordered list of transformation description strings.
+  *@param outputConnectionName is the name of the output connection associated with this action.
+  *@param outputDescription is the output description string.
+  *@param url is the url of the document.
+  *@param activity are the activities available to this method.
+  *@return true if the file is indexable.
+  */
+  public boolean checkURLIndexable(
+    String[] transformationConnectionNames, String[] transformationDescriptions,
+    String outputConnectionName, String outputDescription,
+    String url,
+    IOutputCheckActivity activity)
+    throws ManifoldCFException, ServiceInterruption;
+
+  /** 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 not indexable.
   *@param outputConnectionName is the name of the output connection associated with this action.
   *@param outputDescription is the output description string.
   *@param url is the url of the document.
@@ -178,6 +252,44 @@ public interface IIncrementalIngester
     IOutputActivity activities)
     throws ManifoldCFException, ServiceInterruption;
 
+  /** Ingest a document.
+  * This ingests the document, and notes it.  If this is a repeat ingestion of the document, this
+  * method also REMOVES ALL OLD METADATA.  When complete, the index will contain only the metadata
+  * described by the RepositoryDocument object passed to this method.
+  * ServiceInterruption is thrown if the document ingestion must be rescheduled.
+  *@param transformationConnectionNames are the names of the transformation connections associated with this action.
+  *@param transformationDescriptionStrings are the description strings corresponding to the transformation connection names.
+  *@param outputConnectionName is the name of the output connection associated with this action.
+  *@param otuputDescriptionString is the description string corresponding to the output connection.
+  *@param identifierClass is the name of the space in which the identifier hash should be interpreted.
+  *@param identifierHash is the hashed document identifier.
+  *@param documentVersion is the document version.
+  *@param transformationVersion is the version string for the transformations to be performed on the document.
+  *@param outputVersion is the output version string for the output connection.
+  *@param parameterVersion is the version string for the forced parameters.
+  *@param authorityName is the name of the authority associated with the document, if any.
+  *@param data is the document data.  The data is closed after ingestion is complete.
+  *@param ingestTime is the time at which the ingestion took place, in milliseconds since epoch.
+  *@param documentURI is the URI of the document, which will be used as the key of the document in the index.
+  *@param activities is an object providing a set of methods that the implementer can use to perform the operation.
+  *@return true if the ingest was ok, false if the ingest is illegal (and should not be repeated).
+  */
+  public boolean documentIngest(
+    String[] transformationConnectionNames,
+    String[] transformationDescriptionStrings,
+    String outputConnectionName,
+    String outputDescriptionString,
+    String identifierClass, String identifierHash,
+    String documentVersion,
+    String transformationVersion,
+    String outputVersion,
+    String parameterVersion,
+    String authorityName,
+    RepositoryDocument data,
+    long ingestTime, String documentURI,
+    IOutputActivity activities)
+    throws ManifoldCFException, ServiceInterruption;
+
   /** Note the fact that we checked a document (and found that it did not need to be ingested, because the
   * versions agreed).
   *@param outputConnectionName is the name of the output connection associated with this action.

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputAddActivity.java Mon Jun  9 23:19:08 2014
@@ -24,17 +24,17 @@ import org.apache.manifoldcf.agents.inte
 /** This interface abstracts from the activities that an output connector can do
 when adding or replacing documents.
 */
-public interface IOutputAddActivity extends IOutputHistoryActivity
+public interface IOutputAddActivity extends IOutputQualifyActivity,IOutputHistoryActivity,IOutputCheckActivity
 {
   public static final String _rcsid = "@(#)$Id: IOutputAddActivity.java 988245 2010-08-23 18:39:35Z kwright $";
 
-  /** Qualify an access token appropriately, to match access tokens as returned by mod_aa.  This method
-  * includes the authority name with the access token, if any, so that each authority may establish its own token space.
-  *@param authorityNameString is the name of the authority to use to qualify the access token.
-  *@param accessToken is the raw, repository access token.
-  *@return the properly qualified access token.
+  /** Send a document via the pipeline to the next output connection.
+  *@param documentURI is the document's URI.
+  *@param document is the document data to be processed (handed to the output data store).
+  *@param authorityNameString is the authority name string that should be used to qualify the document's access tokens.
+  *@return the document status (accepted or permanently rejected); return codes are listed in IPipelineConnector.
   */
-  public String qualifyAccessToken(String authorityNameString, String accessToken)
-    throws ManifoldCFException;
+  public int sendDocument(String documentURI, RepositoryDocument document, String authorityNameString)
+    throws ManifoldCFException, ServiceInterruption;
 
 }

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/IOutputConnector.java Mon Jun  9 23:19:08 2014
@@ -46,17 +46,10 @@ import java.util.*;
 * Connector Framework is concerned).
 *
 */
-public interface IOutputConnector extends IConnector
+public interface IOutputConnector extends IPipelineConnector
 {
   public static final String _rcsid = "@(#)$Id: IOutputConnector.java 998081 2010-09-17 11:33:15Z kwright $";
 
-  // Document statuses
-
-  /** Document accepted */
-  public final static int DOCUMENTSTATUS_ACCEPTED = 0;
-  /** Document permanently rejected */
-  public final static int DOCUMENTSTATUS_REJECTED = 1;
-
   /** Return a list of activities that this connector generates.
   * The connector does NOT need to be connected before this method is called.
   *@return the set of activities.
@@ -73,75 +66,6 @@ public interface IOutputConnector extend
   public boolean requestInfo(Configuration output, String command)
     throws ManifoldCFException;
     
-    
-  /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
-  * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
-  * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
-  * is used to describe the version of the actual document.
-  *
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  *@param spec is the current output specification for the job that is doing the crawling.
-  *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
-  * the document will not need to be sent again to the output data store.
-  */
-  public String getOutputDescription(OutputSpecification spec)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
-  * unusable documents that will be passed to this output connector.
-  *@param outputDescription is the document's output version.
-  *@param mimeType is the mime type of the document.
-  *@return true if the mime type is indexable by this connector.
-  */
-  public boolean checkMimeTypeIndexable(String outputDescription, String mimeType)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document (passed here as a File object) is indexable by this connector.  This method is used by participating
-  * repository connectors to help reduce the number of unmanageable documents that are passed to this output connector in advance of an
-  * actual transfer.  This hook is provided mainly to support search engines that only handle a small set of accepted file types.
-  *@param outputDescription is the document's output version.
-  *@param localFile is the local file to check.
-  *@return true if the file is indexable.
-  */
-  public boolean checkDocumentIndexable(String outputDescription, File localFile)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
-  * to help filter out documents that are too long to be indexable.
-  *@param outputDescription is the document's output version.
-  *@param length is the length of the document.
-  *@return true if the file is indexable.
-  */
-  public boolean checkLengthIndexable(String outputDescription, long length)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** 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.
-  *@param url is the URL of the document.
-  *@return true if the file is indexable.
-  */
-  public boolean checkURLIndexable(String outputDescription, String url)
-    throws ManifoldCFException, ServiceInterruption;
-
-  /** Add (or replace) a document in the output data store using the connector.
-  * This method presumes that the connector object has been configured, and it is thus able to communicate with the output data store should that be
-  * necessary.
-  * The OutputSpecification is *not* provided to this method, because the goal is consistency, and if output is done it must be consistent with the
-  * output description, since that was what was partly used to determine if output should be taking place.  So it may be necessary for this method to decode
-  * an output description string in order to determine what should be done.
-  *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
-  * and serve the document.  This URI is constructed by the repository connector which fetches the document, and is thus universal across all output connectors.
-  *@param outputDescription is the description string that was constructed for this document by the getOutputDescription() method.
-  *@param document is the document data to be processed (handed to the output data store).
-  *@param authorityNameString is the name of the authority responsible for authorizing any access tokens passed in with the repository document.  May be null.
-  *@param activities is the handle to an object that the implementer of an output connector may use to perform operations, such as logging processing activity.
-  *@return the document status (accepted or permanently rejected).
-  */
-  public int addOrReplaceDocument(String documentURI, String outputDescription, RepositoryDocument document, String authorityNameString, IOutputAddActivity activities)
-    throws ManifoldCFException, ServiceInterruption;
-
   /** Remove a document using the connector.
   * Note that the last outputDescription is included, since it may be necessary for the connector to use such information to know how to properly remove the document.
   *@param documentURI is the URI of the document.  The URI is presumed to be the unique identifier which the output data store will use to process
@@ -167,60 +91,8 @@ public interface IOutputConnector extend
   public void noteAllRecordsRemoved()
     throws ManifoldCFException;
 
-  // UI support methods.
-  //
-  // These support methods come in two varieties.  The first bunch (inherited from IConnector) is involved in setting up connection configuration information.
-  // The second bunch
-  // is involved in presenting and editing output specification information for a job.  The two kinds of methods are accordingly treated differently,
-  // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
-  // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
-  // method, above).
-    
-  /** Output the specification header section.
-  * This method is called in the head section of a job page which has selected an output connection of the current type.  Its purpose is to add the required tabs
-  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
-  */
-  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, OutputSpecification os, List<String> tabsArray)
-    throws ManifoldCFException, IOException;
-  
-  /** Output the specification body section.
-  * This method is called in the body section of a job page which has selected an output connection of the current type.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editjob".
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@param tabName is the current tab name.
-  */
-  public void outputSpecificationBody(IHTTPOutput out, Locale locale, OutputSpecification os, String tabName)
-    throws ManifoldCFException, IOException;
-  
-  /** Process a specification post.
-  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
-  * posted.  Its purpose is to gather form information and modify the output specification accordingly.
-  * The name of the posted form is "editjob".
-  *@param variableContext contains the post data, including binary file-upload information.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
-  */
-  public String processSpecificationPost(IPostParameters variableContext, Locale locale, OutputSpecification os)
-    throws ManifoldCFException;
-  
-  /** View specification.
-  * This method is called in the body section of a job's view page.  Its purpose is to present the output specification information to the user.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
-  *@param out is the output to which any HTML should be sent.
-  *@param locale is the preferred local of the output.
-  *@param os is the current output specification for this job.
-  */
-  public void viewSpecification(IHTTPOutput out, Locale locale, OutputSpecification os)
-    throws ManifoldCFException, IOException;
-  
+  // UI support methods are inherited from IConnector and IPipelineConnector.
+ 
 }
 
 

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/interfaces/OutputConnectionManagerFactory.java Mon Jun  9 23:19:08 2014
@@ -66,26 +66,23 @@ public class OutputConnectionManagerFact
   {
     IOutputConnectionManager manager = make(tc);
     IOutputConnection[] connections = manager.getAllConnections();
-    HashMap map = new HashMap();
-    int i = 0;
-    while (i < connections.length)
+    Set<String> map = new HashSet();
+    for (IOutputConnection connection : connections)
     {
-      IOutputConnection connection = connections[i++];
       String connectionName = connection.getName();
       String[] activities = OutputConnectorFactory.getActivitiesList(tc,connection.getClassName());
-      int j = 0;
-      while (j < activities.length)
+      for (String activityName : activities)
       {
-        String activity = activities[j++] + " ("+connectionName+")";
-        map.put(activity,activity);
+        String activity = ManifoldCF.qualifyOutputActivityName(activityName,connectionName);
+        map.add(activity);
       }
     }
     String[] rval = new String[map.size()];
-    i = 0;
-    Iterator iter = map.keySet().iterator();
+    int i = 0;
+    Iterator<String> iter = map.iterator();
     while (iter.hasNext())
     {
-      rval[i++] = (String)iter.next();
+      rval[i++] = iter.next();
     }
     java.util.Arrays.sort(rval);
     return rval;

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/output/BaseOutputConnector.java Mon Jun  9 23:19:08 2014
@@ -81,13 +81,26 @@ public abstract class BaseOutputConnecto
     // The base implementation does nothing here.
   }
 
+  /** Detect if a mime type is acceptable or not.  This method is used to determine whether it makes sense to fetch a document
+  * in the first place.
+  *@param pipelineDescription is the document's pipeline version string, for this connection.
+  *@param mimeType is the mime type of the document.
+  *@param checkActivity is an object including the activities that can be performed by this method.
+  *@return true if the mime type can be accepted by this connector.
+  */
+  @Override
+  public boolean checkMimeTypeIndexable(String pipelineDescription, String mimeType, IOutputCheckActivity checkActivity)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    return checkMimeTypeIndexable(pipelineDescription, mimeType);
+  }
+
   /** Detect if a mime type is indexable or not.  This method is used by participating repository connectors to pre-filter the number of
   * unusable documents that will be passed to this output connector.
   *@param outputDescription is the document's output version.
   *@param mimeType is the mime type of the document.
   *@return true if the mime type is indexable by this connector.
   */
-  @Override
   public boolean checkMimeTypeIndexable(String outputDescription, String mimeType)
     throws ManifoldCFException, ServiceInterruption
   {
@@ -105,6 +118,21 @@ public abstract class BaseOutputConnecto
     return true;
   }
 
+  /** Pre-determine whether a document (passed here as a File object) is acceptable or not.  This method is
+  * used to determine whether a document needs to be actually transferred.  This hook is provided mainly to support
+  * search engines that only handle a small set of accepted file types.
+  *@param pipelineDescription is the document's pipeline version string, for this connection.
+  *@param localFile is the local file to check.
+  *@param checkActivity is an object including the activities that can be done by this method.
+  *@return true if the file is acceptable, false if not.
+  */
+  @Override
+  public boolean checkDocumentIndexable(String pipelineDescription, File localFile, IOutputCheckActivity checkActivity)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    return checkDocumentIndexable(pipelineDescription, localFile);
+  }
+
   /** Pre-determine whether a document (passed here as a File object) is indexable by this connector.  This method is used by participating
   * repository connectors to help reduce the number of unmanageable documents that are passed to this output connector in advance of an
   * actual transfer.  This hook is provided mainly to support search engines that only handle a small set of accepted file types.
@@ -112,7 +140,6 @@ public abstract class BaseOutputConnecto
   *@param localFile is the local file to check.
   *@return true if the file is indexable.
   */
-  @Override
   public boolean checkDocumentIndexable(String outputDescription, File localFile)
     throws ManifoldCFException, ServiceInterruption
   {
@@ -131,32 +158,76 @@ public abstract class BaseOutputConnecto
     return true;
   }
 
+  /** Pre-determine whether a document's length is acceptable.  This method is used
+  * to determine whether to fetch a document in the first place.
+  *@param pipelineDescription is the document's pipeline version string, for this connection.
+  *@param length is the length of the document.
+  *@param checkActivity is an object including the activities that can be done by this method.
+  *@return true if the file is acceptable, false if not.
+  */
+  @Override
+  public boolean checkLengthIndexable(String pipelineDescription, long length, IOutputCheckActivity checkActivity)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    return checkLengthIndexable(pipelineDescription, length);
+  }
+
   /** Pre-determine whether a document's length is indexable by this connector.  This method is used by participating repository connectors
   * to help filter out documents that are too long to be indexable.
   *@param outputDescription is the document's output version.
   *@param length is the length of the document.
   *@return true if the file is indexable.
   */
-  @Override
   public boolean checkLengthIndexable(String outputDescription, long length)
     throws ManifoldCFException, ServiceInterruption
   {
     return true;
   }
 
+  /** Pre-determine whether a document's URL is acceptable.  This method is used
+  * to help filter out documents that cannot be indexed in advance.
+  *@param pipelineDescription is the document's pipeline version string, for this connection.
+  *@param url is the URL of the document.
+  *@param checkActivity is an object including the activities that can be done by this method.
+  *@return true if the file is acceptable, false if not.
+  */
+  @Override
+  public boolean checkURLIndexable(String pipelineDescription, String url, IOutputCheckActivity checkActivity)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    return checkURLIndexable(pipelineDescription, url);
+  }
+
   /** 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.
   *@param url is the URL of the document.
   *@return true if the file is indexable.
   */
-  @Override
   public boolean checkURLIndexable(String outputDescription, String url)
     throws ManifoldCFException, ServiceInterruption
   {
     return true;
   }
 
+  /** Get a pipeline version string, given a pipeline specification object.  The version string is used to
+  * uniquely describe the pertinent details of the specification and the configuration, to allow the Connector 
+  * Framework to determine whether a document will need to be processed again.
+  * Note that the contents of any document cannot be considered by this method; only configuration and specification information
+  * can be considered.
+  *
+  * This method presumes that the underlying connector object has been configured.
+  *@param spec is the current pipeline specification object for this connection for the job that is doing the crawling.
+  *@return a string, of unlimited length, which uniquely describes configuration and specification in such a way that
+  * if two such strings are equal, nothing that affects how or whether the document is indexed will be different.
+  */
+  @Override
+  public String getPipelineDescription(OutputSpecification spec)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    return getOutputDescription(spec);
+  }
+
   /** Get an output version string, given an output specification.  The output version string is used to uniquely describe the pertinent details of
   * the output specification and the configuration, to allow the Connector Framework to determine whether a document will need to be output again.
   * Note that the contents of the document cannot be considered by this method, and that a different version string (defined in IRepositoryConnector)
@@ -168,7 +239,6 @@ public abstract class BaseOutputConnecto
   *@return a string, of unlimited length, which uniquely describes output configuration and specification in such a way that if two such strings are equal,
   * the document will not need to be sent again to the output data store.
   */
-  @Override
   public String getOutputDescription(OutputSpecification spec)
     throws ManifoldCFException, ServiceInterruption
   {
@@ -228,16 +298,52 @@ public abstract class BaseOutputConnecto
   // in that the first bunch cannot assume that the current connector object is connected, while the second bunch can.  That is why the first bunch
   // receives a thread context argument for all UI methods, while the second bunch does not need one (since it has already been applied via the connect()
   // method, above).
-    
-   /** Output the specification header section.
+
+  /** Obtain the name of the form check javascript method to call.
+  *@param connectionSequenceNumber is the unique number of this connection within the job.
+  *@return the name of the form check javascript method.
+  */
+  @Override
+  public String getFormCheckJavascriptMethodName(int connectionSequenceNumber)
+  {
+    return "checkOutputSpecification";
+  }
+
+  /** Obtain the name of the form presave check javascript method to call.
+  *@param connectionSequenceNumber is the unique number of this connection within the job.
+  *@return the name of the form presave check javascript method.
+  */
+  @Override
+  public String getFormPresaveCheckJavascriptMethodName(int connectionSequenceNumber)
+  {
+    return "checkOutputSpecificationForSave";
+  }
+
+  /** Output the specification header section.
   * This method is called in the head section of a job page which has selected an output connection of the current type.  Its purpose is to add the required tabs
   * to the list, and to output any javascript methods that might be needed by the job editing HTML.
   *@param out is the output to which any HTML should be sent.
   *@param locale is the preferred local of the output.
   *@param os is the current output specification for this job.
+  *@param connectionSequenceNumber is the unique number of this connection within the job.
   *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
   */
   @Override
+  public void outputSpecificationHeader(IHTTPOutput out, Locale locale, OutputSpecification os,
+    int connectionSequenceNumber, List<String> tabsArray)
+    throws ManifoldCFException, IOException
+  {
+    outputSpecificationHeader(out,locale,os,tabsArray);
+  }
+
+  /** Output the specification header section.
+  * This method is called in the head section of a job page which has selected an output connection of the current type.  Its purpose is to add the required tabs
+  * to the list, and to output any javascript methods that might be needed by the job editing HTML.
+  *@param out is the output to which any HTML should be sent.
+  *@param locale is the preferred local of the output.
+  *@param os is the current output specification for this job.
+  *@param tabsArray is an array of tab names.  Add to this array any tab names that are specific to the connector.
+  */
   public void outputSpecificationHeader(IHTTPOutput out, Locale locale, OutputSpecification os, List<String> tabsArray)
     throws ManifoldCFException, IOException
   {
@@ -275,9 +381,27 @@ public abstract class BaseOutputConnecto
   *@param out is the output to which any HTML should be sent.
   *@param locale is the preferred local of the output.
   *@param os is the current output specification for this job.
+  *@param connectionSequenceNumber is the unique number of this connection within the job.
+  *@param actualSequenceNumber is the connection within the job that has currently been selected.
   *@param tabName is the current tab name.
   */
   @Override
+  public void outputSpecificationBody(IHTTPOutput out, Locale locale, OutputSpecification os,
+    int connectionSequenceNumber, int actualSequenceNumber, String tabName)
+    throws ManifoldCFException, IOException
+  {
+    outputSpecificationBody(out,locale,os,tabName);
+  }
+
+  /** Output the specification body section.
+  * This method is called in the body section of a job page which has selected an output connection of the current type.  Its purpose is to present the required form elements for editing.
+  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
+  * form is "editjob".
+  *@param out is the output to which any HTML should be sent.
+  *@param locale is the preferred local of the output.
+  *@param os is the current output specification for this job.
+  *@param tabName is the current tab name.
+  */
   public void outputSpecificationBody(IHTTPOutput out, Locale locale, OutputSpecification os, String tabName)
     throws ManifoldCFException, IOException
   {
@@ -304,9 +428,26 @@ public abstract class BaseOutputConnecto
   *@param variableContext contains the post data, including binary file-upload information.
   *@param locale is the preferred local of the output.
   *@param os is the current output specification for this job.
+  *@param connectionSequenceNumber is the unique number of this connection within the job.
   *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
   */
   @Override
+  public String processSpecificationPost(IPostParameters variableContext, Locale locale, OutputSpecification os,
+    int connectionSequenceNumber)
+    throws ManifoldCFException
+  {
+    return processSpecificationPost(variableContext,locale,os);
+  }
+
+  /** Process a specification post.
+  * This method is called at the start of job's edit or view page, whenever there is a possibility that form data for a connection has been
+  * posted.  Its purpose is to gather form information and modify the output specification accordingly.
+  * The name of the posted form is "editjob".
+  *@param variableContext contains the post data, including binary file-upload information.
+  *@param locale is the preferred local of the output.
+  *@param os is the current output specification for this job.
+  *@return null if all is well, or a string error message if there is an error that should prevent saving of the job (and cause a redirection to an error page).
+  */
   public String processSpecificationPost(IPostParameters variableContext, Locale locale, OutputSpecification os)
     throws ManifoldCFException
   {
@@ -332,9 +473,24 @@ public abstract class BaseOutputConnecto
   * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
   *@param out is the output to which any HTML should be sent.
   *@param locale is the preferred local of the output.
+  *@param connectionSequenceNumber is the unique number of this connection within the job.
   *@param os is the current output specification for this job.
   */
   @Override
+  public void viewSpecification(IHTTPOutput out, Locale locale, OutputSpecification os,
+    int connectionSequenceNumber)
+    throws ManifoldCFException, IOException
+  {
+    viewSpecification(out,locale,os);
+  }
+
+  /** View specification.
+  * This method is called in the body section of a job's view page.  Its purpose is to present the output specification information to the user.
+  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html> and <body> tags.
+  *@param out is the output to which any HTML should be sent.
+  *@param locale is the preferred local of the output.
+  *@param os is the current output specification for this job.
+  */
   public void viewSpecification(IHTTPOutput out, Locale locale, OutputSpecification os)
     throws ManifoldCFException, IOException
   {

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/outputconnection/OutputConnectionManager.java Mon Jun  9 23:19:08 2014
@@ -58,12 +58,10 @@ public class OutputConnectionManager ext
   protected final static String maxCountField = "maxcount";
   protected final static String configField = "configxml";
 
-  protected static Random random = new Random();
-
   // Cache manager
-  ICacheManager cacheManager;
+  protected final ICacheManager cacheManager;
   // Thread context
-  IThreadContext threadContext;
+  protected final IThreadContext threadContext;
 
   /** Constructor.
   *@param threadContext is the thread context.
@@ -165,7 +163,7 @@ public class OutputConnectionManager ext
   {
     int version = ManifoldCF.readDword(is);
     if (version != 1)
-      throw new java.io.IOException("Unknown repository connection configuration version: "+Integer.toString(version));
+      throw new java.io.IOException("Unknown output connection configuration version: "+Integer.toString(version));
     int count = ManifoldCF.readDword(is);
     int i = 0;
     while (i < count)

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/AgentsDaemon.java Mon Jun  9 23:19:08 2014
@@ -173,6 +173,7 @@ public class AgentsDaemon
     }
     // Done.
     OutputConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
+    TransformationConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
   }
 
   protected static String getAgentsClassServiceType(String agentClassName)

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/IdleCleanupThread.java Mon Jun  9 23:19:08 2014
@@ -55,6 +55,8 @@ public class IdleCleanupThread extends T
       ICacheManager cacheManager = CacheManagerFactory.make(threadContext);
       // Get the output connector pool handle
       IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
+      // Get the transformation connector pool handle
+      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
       // Throttler subsystem
       IThrottleGroups throttleGroups = ThrottleGroupsFactory.make(threadContext);
       
@@ -90,6 +92,7 @@ public class IdleCleanupThread extends T
           
           // Do the cleanup
           outputConnectorPool.pollAllConnectors();
+          transformationConnectorPool.pollAllConnectors();
           // Poll connection bins
           throttleGroups.poll();
           // Expire objects

Modified: manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java (original)
+++ manifoldcf/trunk/framework/agents/src/main/java/org/apache/manifoldcf/agents/system/ManifoldCF.java Mon Jun  9 23:19:08 2014
@@ -107,9 +107,13 @@ public class ManifoldCF extends org.apac
     IIncrementalIngester igstmgr = IncrementalIngesterFactory.make(threadcontext);
     IOutputConnectorManager outputConnMgr = OutputConnectorManagerFactory.make(threadcontext);
     IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadcontext);
+    ITransformationConnectorManager transConnMgr = TransformationConnectorManagerFactory.make(threadcontext);
+    ITransformationConnectionManager transConnectionManager = TransformationConnectionManagerFactory.make(threadcontext);
     mgr.install();
     outputConnMgr.install();
     outputConnectionManager.install();
+    transConnMgr.install();
+    transConnectionManager.install();
     igstmgr.install();
   }
 
@@ -123,7 +127,11 @@ public class ManifoldCF extends org.apac
     IIncrementalIngester igstmgr = IncrementalIngesterFactory.make(threadcontext);
     IOutputConnectorManager outputConnMgr = OutputConnectorManagerFactory.make(threadcontext);
     IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadcontext);
+    ITransformationConnectorManager transConnMgr = TransformationConnectorManagerFactory.make(threadcontext);
+    ITransformationConnectionManager transConnectionManager = TransformationConnectionManagerFactory.make(threadcontext);
     igstmgr.deinstall();
+    transConnectionManager.deinstall();
+    transConnMgr.deinstall();
     outputConnectionManager.deinstall();
     outputConnMgr.deinstall();
     mgr.deinstall();
@@ -163,6 +171,26 @@ public class ManifoldCF extends org.apac
     AgentManagerFactory.noteOutputConnectionChange(threadContext,connectionName);
   }
   
+  /** Qualify output activity name.
+  *@param outputActivityName is the name of the output activity.
+  *@param outputConnectionName is the corresponding name of the output connection.
+  *@return the qualified (global) activity name.
+  */
+  public static String qualifyOutputActivityName(String outputActivityName, String outputConnectionName)
+  {
+    return outputActivityName+" ("+outputConnectionName+")";
+  }
+
+  /** Qualify transformation activity name.
+  *@param transformationActivityName is the name of the output activity.
+  *@param transformationConnectionName is the corresponding name of the transformation connection.
+  *@return the qualified (global) activity name.
+  */
+  public static String qualifyTransformationActivityName(String transformationActivityName, String transformationConnectionName)
+  {
+    return transformationActivityName+" ["+transformationConnectionName+"]";
+  }
+
   // Helper methods for API support.  These are made public so connectors can use them to implement the executeCommand method.
   
   // These are the universal node types.

Modified: manifoldcf/trunk/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java (original)
+++ manifoldcf/trunk/framework/api-service/src/main/java/org/apache/manifoldcf/apiservice/IdleCleanupThread.java Mon Jun  9 23:19:08 2014
@@ -56,6 +56,7 @@ public class IdleCleanupThread extends T
       
       IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
       IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
+      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
       IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
       IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
       
@@ -70,6 +71,7 @@ public class IdleCleanupThread extends T
           // Do the cleanup
           repositoryConnectorPool.pollAllConnectors();
           outputConnectorPool.pollAllConnectors();
+          transformationConnectorPool.pollAllConnectors();
           authorityConnectorPool.pollAllConnectors();
           mappingConnectorPool.pollAllConnectors();
           

Modified: manifoldcf/trunk/framework/buildfiles/connector-build.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/buildfiles/connector-build.xml?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/buildfiles/connector-build.xml (original)
+++ manifoldcf/trunk/framework/buildfiles/connector-build.xml Mon Jun  9 23:19:08 2014
@@ -809,6 +809,25 @@
     <target name="general-add-output-connector" depends="general-add-output-connector-commented,general-add-output-connector-non-commented,general-add-output-connector-proprietary-commented,general-add-output-connector-proprietary-non-commented">
     </target>
 
+    <target name="general-add-transformation-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
+        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;!--transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
+    </target>
+
+    <target name="general-add-transformation-connector-non-commented" depends="general-connector-runnable-check" if="is-runnable">
+        <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
+    </target>
+
+    <target name="general-add-transformation-connector-proprietary-commented" depends="general-connector-proprietary-runnable-check" unless="is-proprietary-runnable">
+        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;!--transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
+    </target>
+
+    <target name="general-add-transformation-connector-proprietary-non-commented" depends="general-connector-proprietary-runnable-check" if="is-proprietary-runnable">
+        <replace file="${mcf-dist}/connectors-proprietary.xml" token="&lt;!-- Add your transformation connectors here --&gt;" value="&lt;!-- Add your transformation connectors here --&gt;&#0010;  &lt;transformationconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/&gt;"/>
+    </target>
+
+    <target name="general-add-transformation-connector" depends="general-add-transformation-connector-commented,general-add-transformation-connector-non-commented,general-add-transformation-connector-proprietary-commented,general-add-transformation-connector-proprietary-non-commented">
+    </target>
+
     <target name="general-add-repository-connector-commented" depends="general-connector-runnable-check" unless="is-runnable">
         <replace file="${mcf-dist}/connectors.xml" token="&lt;!-- Add your repository connectors here --&gt;" value="&lt;!-- Add your repository connectors here --&gt;&#0010;  &lt;!--repositoryconnector name=&quot;${connector-label}&quot; class=&quot;${connector-class}&quot;/--&gt;"/>
     </target>

Modified: manifoldcf/trunk/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java (original)
+++ manifoldcf/trunk/framework/combined-service/src/main/java/org/apache/manifoldcf/combinedservice/IdleCleanupThread.java Mon Jun  9 23:19:08 2014
@@ -56,6 +56,7 @@ public class IdleCleanupThread extends T
       
       IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
       IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
+      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
       IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
       IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
       
@@ -70,6 +71,7 @@ public class IdleCleanupThread extends T
           // Do the cleanup
           repositoryConnectorPool.pollAllConnectors();
           outputConnectorPool.pollAllConnectors();
+          transformationConnectorPool.pollAllConnectors();
           authorityConnectorPool.pollAllConnectors();
           mappingConnectorPool.pollAllConnectors();
           

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/java/org/apache/manifoldcf/crawlerui/IdleCleanupThread.java Mon Jun  9 23:19:08 2014
@@ -56,6 +56,7 @@ public class IdleCleanupThread extends T
       
       IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
       IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
+      ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
       IAuthorityConnectorPool authorityConnectorPool = AuthorityConnectorPoolFactory.make(threadContext);
       IMappingConnectorPool mappingConnectorPool = MappingConnectorPoolFactory.make(threadContext);
       
@@ -70,6 +71,7 @@ public class IdleCleanupThread extends T
           // Do the cleanup
           repositoryConnectorPool.pollAllConnectors();
           outputConnectorPool.pollAllConnectors();
+          transformationConnectorPool.pollAllConnectors();
           authorityConnectorPool.pollAllConnectors();
           mappingConnectorPool.pollAllConnectors();
           

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminDefaults.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminDefaults.jsp?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminDefaults.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminDefaults.jsp Mon Jun  9 23:19:08 2014
@@ -46,6 +46,3 @@
 		threadContext.save("__WRAPPER__",variableContext);
 	}
 %>
-
-<!DOCTYPE html>
-<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminHeaders.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminHeaders.jsp?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminHeaders.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/adminHeaders.jsp Mon Jun  9 23:19:08 2014
@@ -61,5 +61,3 @@ response.setContentType("text/html;chars
 	}
 %>
 
-<!DOCTYPE html>
-<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/documentstatus.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/documentstatus.jsp?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/documentstatus.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/documentstatus.jsp Mon Jun  9 23:19:08 2014
@@ -24,9 +24,9 @@ boolean maintenanceUnderway = org.apache
 
 %>
 
-
-
 <?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editauthority.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editauthority.jsp?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editauthority.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editauthority.jsp Mon Jun  9 23:19:08 2014
@@ -106,6 +106,8 @@
 %>
 
 <?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
@@ -273,11 +275,33 @@
 	{
 %>
 	<form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-	  <input type="hidden" name="op" value="Continue"/>
-	  <input type="hidden" name="type" value="authority"/>
-	  <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-	  <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
+	    <input type="hidden" name="op" value="Continue"/>
+	    <input type="hidden" name="type" value="authority"/>
+	    <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
+	    <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
 	    <table class="tabtable">
+	      <tr class="tabspacerrow">
+		<td class="spacertab" colspan="<%=tabsArray.size()%>"></td>
+		<td class="remaindertab" rowspan="3">
+<%
+	  if (description.length() > 0)
+	  {
+%>
+			  <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.EditAuthority")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
+<%
+	  }
+	  else
+	  {
+%>
+		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.EditAnAuthority")%></nobr>
+<%
+	  }
+%>
+		</td>
+	      </tr>
+	      <tr class="tabsequencerow">
+		<td class="blanksequencetab" colspan="<%=tabsArray.size()%>"></td>
+	      </tr>
 	      <tr class="tabrow">
 <%
 	  int tabNum = 0;
@@ -298,22 +322,6 @@
 		}
 	  }
 %>
-		      <td class="remaindertab">
-<%
-	  if (description.length() > 0)
-	  {
-%>
-			  <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.EditAuthority")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
-<%
-	  }
-	  else
-	  {
-%>
-		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editauthority.EditAnAuthority")%></nobr>
-<%
-	  }
-%>
-		      </td>
 	      </tr>
 	      <tr class="tabbodyrow">
 		<td class="tabbody" colspan='<%=Integer.toString(tabsArray.size()+1)%>'>

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editconnection.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editconnection.jsp?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editconnection.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editconnection.jsp Mon Jun  9 23:19:08 2014
@@ -104,6 +104,8 @@
 %>
 
 <?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
@@ -280,11 +282,33 @@
 %>
 
 	<form class="standardform" name="editconnection" action="execute.jsp" method="POST" enctype="multipart/form-data">
-	  <input type="hidden" name="op" value="Continue"/>
-	  <input type="hidden" name="type" value="connection"/>
-	  <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-	  <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
+	    <input type="hidden" name="op" value="Continue"/>
+	    <input type="hidden" name="type" value="connection"/>
+	    <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
+	    <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
 	    <table class="tabtable">
+	      <tr class="tabspacerrow">
+		<td class="spacertab" colspan="<%=tabsArray.size()%>"></td>
+		<td class="remaindertab" rowspan="3">
+<%
+	  if (description.length() > 0)
+	  {
+%>
+			<nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.EditConnection")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
+<%
+	  }
+	  else
+	  {
+%>
+		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.EditAConnection")%></nobr>
+<%
+	  }
+%>
+		</td>
+	      </tr>
+	      <tr class="tabsequencerow">
+		<td class="blanksequencetab" colspan="<%=tabsArray.size()%>"></td>
+	      </tr>
 	      <tr class="tabrow">
 <%
 	  int tabNum = 0;
@@ -305,22 +329,6 @@
 		}
 	  }
 %>
-		      <td class="remaindertab">
-<%
-	  if (description.length() > 0)
-	  {
-%>
-			  <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.EditConnection")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
-<%
-	  }
-	  else
-	  {
-%>
-		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editconnection.EditAConnection")%></nobr>
-<%
-	  }
-%>
-		      </td>
 	      </tr>
 	      <tr class="tabbodyrow">
 		<td class="tabbody" colspan='<%=Integer.toString(tabsArray.size()+1)%>'>

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editgroup.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editgroup.jsp?rev=1601529&r1=1601528&r2=1601529&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editgroup.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editgroup.jsp Mon Jun  9 23:19:08 2014
@@ -72,6 +72,8 @@
 %>
 
 <?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html>
+<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
@@ -175,6 +177,28 @@
 	  <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
 	  <input type="hidden" name="isnewconnection" value='<%=(isNew?"true":"false")%>'/>
 	    <table class="tabtable">
+	      <tr class="tabspacerrow">
+		<td class="spacertab" colspan="<%=tabsArray.size()%>"></td>
+		<td class="remaindertab" rowspan="3">
+<%
+	if (description.length() > 0)
+	{
+%>
+			<nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.EditGroup")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
+<%
+	}
+	else
+	{
+%>
+		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.EditAGroup")%></nobr>
+<%
+	}
+%>
+		</td>
+	      </tr>
+	      <tr class="tabsequencerow">
+		<td class="blanksequencetab" colspan="<%=tabsArray.size()%>"></td>
+	      </tr>
 	      <tr class="tabrow">
 <%
 	int tabNum = 0;
@@ -195,22 +219,6 @@
 		}
 	}
 %>
-		      <td class="remaindertab">
-<%
-	if (description.length() > 0)
-	{
-%>
-			  <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.EditGroup")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
-<%
-	}
-	else
-	{
-%>
-		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editgroup.EditAGroup")%></nobr>
-<%
-	}
-%>
-		      </td>
 	      </tr>
 	      <tr class="tabbodyrow">
 		<td class="tabbody" colspan='<%=Integer.toString(tabsArray.size()+1)%>'>