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 2012/09/09 15:18:29 UTC
svn commit: r1382491 - in /manifoldcf/trunk: CHANGES.txt
framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java
Author: kwright
Date: Sun Sep 9 13:18:29 2012
New Revision: 1382491
URL: http://svn.apache.org/viewvc?rev=1382491&view=rev
Log:
Fix for CONNECTORS-524.
Modified:
manifoldcf/trunk/CHANGES.txt
manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java
Modified: manifoldcf/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1382491&r1=1382490&r2=1382491&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Sun Sep 9 13:18:29 2012
@@ -3,6 +3,10 @@ $Id$
======================= 0.7-dev =====================
+CONNECTORS-524: Do not deregister connectors in single-process
+code unless they are being removed or changed.
+(Karl Wright)
+
CONNECTORS-520 : Add pom.xml to SharePoint connector module
(Ahmet Arslan, Karl Wright)
Modified: manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java?rev=1382491&r1=1382490&r2=1382491&view=diff
==============================================================================
--- manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java (original)
+++ manifoldcf/trunk/framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java Sun Sep 9 13:18:29 2012
@@ -163,11 +163,11 @@ public class ManifoldCF extends org.apac
// Read connectors configuration file (to figure out what we need to register)
File connectorConfigFile = getFileProperty(connectorsConfigurationFileProperty);
Connectors c = readConnectorDeclarations(connectorConfigFile);
-
- // Unregister all connectors.
- unregisterAllConnectors(tc);
+
+ // Unregister all the connectors we don't want.
+ unregisterAllConnectors(tc,c);
- // Register connections specified by connectors.xml
+ // Register (or update) all connectors specified by connectors.xml
registerConnectors(tc,c);
}
@@ -209,6 +209,53 @@ public class ManifoldCF extends org.apac
public static void unregisterAllConnectors(IThreadContext tc)
throws ManifoldCFException
{
+ unregisterAllConnectors(tc,null);
+ }
+
+ // Connectors configuration file
+ protected static final String NODE_OUTPUTCONNECTOR = "outputconnector";
+ protected static final String NODE_AUTHORITYCONNECTOR = "authorityconnector";
+ protected static final String NODE_REPOSITORYCONNECTOR = "repositoryconnector";
+ protected static final String ATTRIBUTE_NAME = "name";
+ protected static final String ATTRIBUTE_CLASS = "class";
+
+ /** Unregister all connectors which don't match a specified connector list.
+ */
+ public static void unregisterAllConnectors(IThreadContext tc, Connectors c)
+ throws ManifoldCFException
+ {
+ // Create a map of class name and description, so we can compare what we can find
+ // against what we want.
+ Map<String,String> desiredOutputConnectors = new HashMap<String,String>();
+ Map<String,String> desiredAuthorityConnectors = new HashMap<String,String>();
+ Map<String,String> desiredRepositoryConnectors = new HashMap<String,String>();
+
+ if (c != null)
+ {
+ for (int i = 0; i < c.getChildCount(); i++)
+ {
+ ConfigurationNode cn = c.findChild(i);
+ if (cn.getType().equals(NODE_OUTPUTCONNECTOR))
+ {
+ String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+ String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
+ desiredOutputConnectors.put(className,name);
+ }
+ else if (cn.getType().equals(NODE_AUTHORITYCONNECTOR))
+ {
+ String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+ String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
+ desiredAuthorityConnectors.put(className,name);
+ }
+ else if (cn.getType().equals(NODE_REPOSITORYCONNECTOR))
+ {
+ String name = cn.getAttributeValue(ATTRIBUTE_NAME);
+ String className = cn.getAttributeValue(ATTRIBUTE_CLASS);
+ desiredRepositoryConnectors.put(className,name);
+ }
+ }
+ }
+
// Grab a database handle, so we can use transactions later.
IDBInterface database = DBInterfaceFactory.make(tc,
ManifoldCF.getMasterDatabaseName(),
@@ -225,30 +272,34 @@ public class ManifoldCF extends org.apac
{
IResultRow row = classNames.getRow(i++);
String className = (String)row.getValue("classname");
- // Deregistration should be done in a transaction
- database.beginTransaction();
- try
- {
- // Find the connection names that come with this class
- String[] connectionNames = connManager.findConnectionsForConnector(className);
- // For all connection names, notify all agents of the deregistration
- AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
- // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
- mgr.unregisterConnector(className);
- }
- catch (ManifoldCFException e)
+ String description = (String)row.getValue("description");
+ if (desiredOutputConnectors.get(className) == null || !desiredOutputConnectors.get(className).equals(description))
{
- database.signalRollback();
- throw e;
- }
- catch (Error e)
- {
- database.signalRollback();
- throw e;
- }
- finally
- {
- database.endTransaction();
+ // Deregistration should be done in a transaction
+ database.beginTransaction();
+ try
+ {
+ // Find the connection names that come with this class
+ String[] connectionNames = connManager.findConnectionsForConnector(className);
+ // For all connection names, notify all agents of the deregistration
+ AgentManagerFactory.noteOutputConnectorDeregistration(tc,connectionNames);
+ // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
+ mgr.unregisterConnector(className);
+ }
+ catch (ManifoldCFException e)
+ {
+ database.signalRollback();
+ throw e;
+ }
+ catch (Error e)
+ {
+ database.signalRollback();
+ throw e;
+ }
+ finally
+ {
+ database.endTransaction();
+ }
}
}
System.err.println("Successfully unregistered all output connectors");
@@ -262,7 +313,12 @@ public class ManifoldCF extends org.apac
while (i < classNames.getRowCount())
{
IResultRow row = classNames.getRow(i++);
- mgr.unregisterConnector((String)row.getValue("classname"));
+ String className = (String)row.getValue("classname");
+ String description = (String)row.getValue("description");
+ if (desiredAuthorityConnectors.get(className) == null || !desiredAuthorityConnectors.get(className).equals(description))
+ {
+ mgr.unregisterConnector(className);
+ }
}
System.err.println("Successfully unregistered all authority connectors");
}
@@ -278,42 +334,40 @@ public class ManifoldCF extends org.apac
{
IResultRow row = classNames.getRow(i++);
String className = (String)row.getValue("classname");
- // Deregistration should be done in a transaction
- database.beginTransaction();
- try
- {
- // Find the connection names that come with this class
- String[] connectionNames = connManager.findConnectionsForConnector(className);
- // For each connection name, modify the jobs to note that the connector is no longer installed
- jobManager.noteConnectorDeregistration(connectionNames);
- // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
- mgr.unregisterConnector(className);
- }
- catch (ManifoldCFException e)
- {
- database.signalRollback();
- throw e;
- }
- catch (Error e)
- {
- database.signalRollback();
- throw e;
- }
- finally
+ String description = (String)row.getValue("description");
+ if (desiredRepositoryConnectors.get(className) == null || !desiredRepositoryConnectors.get(className).equals(description))
{
- database.endTransaction();
+ // Deregistration should be done in a transaction
+ database.beginTransaction();
+ try
+ {
+ // Find the connection names that come with this class
+ String[] connectionNames = connManager.findConnectionsForConnector(className);
+ // For each connection name, modify the jobs to note that the connector is no longer installed
+ jobManager.noteConnectorDeregistration(connectionNames);
+ // Now that all jobs have been placed into an appropriate state, actually do the deregistration itself.
+ mgr.unregisterConnector(className);
+ }
+ catch (ManifoldCFException e)
+ {
+ database.signalRollback();
+ throw e;
+ }
+ catch (Error e)
+ {
+ database.signalRollback();
+ throw e;
+ }
+ finally
+ {
+ database.endTransaction();
+ }
}
}
System.err.println("Successfully unregistered all repository connectors");
}
}
- // Connectors configuration file
- protected static final String NODE_OUTPUTCONNECTOR = "outputconnector";
- protected static final String NODE_AUTHORITYCONNECTOR = "authorityconnector";
- protected static final String NODE_REPOSITORYCONNECTOR = "repositoryconnector";
- protected static final String ATTRIBUTE_NAME = "name";
- protected static final String ATTRIBUTE_CLASS = "class";
/** Register all connectors as specified by a Connectors structure, usually read from the connectors.xml file.
*/