/* $Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $ */
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.manifoldcf.agents.system;
import org.apache.manifoldcf.core.interfaces.*;
import org.apache.manifoldcf.agents.interfaces.*;
import java.io.*;
import java.util.*;
public class ManifoldCF extends org.apache.manifoldcf.core.system.ManifoldCF
{
public static final String _rcsid = "@(#)$Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $";
public static final String agentShutdownSignal = "_AGENTRUN_";
// Agents initialized flag
protected static boolean agentsInitialized = false;
/** Initialize environment.
*/
public static void initializeEnvironment(IThreadContext threadContext)
throws ManifoldCFException
{
synchronized (initializeFlagLock)
{
// Do core initialization
org.apache.manifoldcf.core.system.ManifoldCF.initializeEnvironment(threadContext);
// Local initialization
org.apache.manifoldcf.agents.system.ManifoldCF.localInitialize(threadContext);
}
}
/** Clean up environment.
*/
public static void cleanUpEnvironment(IThreadContext threadContext)
{
synchronized (initializeFlagLock)
{
org.apache.manifoldcf.agents.system.ManifoldCF.localCleanup(threadContext);
org.apache.manifoldcf.core.system.ManifoldCF.cleanUpEnvironment(threadContext);
}
}
public static void localInitialize(IThreadContext threadContext)
throws ManifoldCFException
{
synchronized (initializeFlagLock)
{
if (agentsInitialized)
return;
// Initialize the local loggers
Logging.initializeLoggers();
Logging.setLogLevels(threadContext);
agentsInitialized = true;
}
}
public static void localCleanup(IThreadContext threadContext)
{
// Close all pools
try
{
OutputConnectorPoolFactory.make(threadContext).closeAllConnectors();
}
catch (ManifoldCFException e)
{
if (Logging.agents != null)
Logging.agents.warn("Exception shutting down output connector pool: "+e.getMessage(),e);
}
}
/** Reset the environment.
*/
public static void resetEnvironment(IThreadContext threadContext)
{
synchronized (initializeFlagLock)
{
org.apache.manifoldcf.core.system.ManifoldCF.resetEnvironment(threadContext);
}
}
/** Install the agent tables. This is also responsible for upgrading the existing
* tables!!!
*@param threadcontext is the thread context.
*/
public static void installTables(IThreadContext threadcontext)
throws ManifoldCFException
{
IAgentManager mgr = AgentManagerFactory.make(threadcontext);
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();
}
/** Uninstall all the crawler system tables.
*@param threadcontext is the thread context.
*/
public static void deinstallTables(IThreadContext threadcontext)
throws ManifoldCFException
{
IAgentManager mgr = AgentManagerFactory.make(threadcontext);
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();
}
/** Signal output connection needs redoing.
* This is called when something external changed on an output connection, and
* therefore all associated documents must be reindexed.
*@param threadContext is the thread context.
*@param connectionName is the connection name.
*/
public static void signalOutputConnectionRedo(IThreadContext threadContext, String connectionName)
throws ManifoldCFException
{
// Blow away the incremental ingestion table first
IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
ingester.resetOutputConnection(outputConnectionManager.load(connectionName));
// Now, signal to all agents that the output connection configuration has changed. Do this second, so that there cannot be documents
// resulting from this signal that find themselves "unchanged".
AgentManagerFactory.noteOutputConnectionChange(threadContext,connectionName);
}
/** Signal output connection has been deleted.
* This is called when the target of an output connection has been removed,
* therefore all associated documents were also already removed.
*@param threadContext is the thread context.
*@param connectionName is the connection name.
*/
public static void signalOutputConnectionRemoved(IThreadContext threadContext, String connectionName)
throws ManifoldCFException
{
// Blow away the incremental ingestion table first
IIncrementalIngester ingester = IncrementalIngesterFactory.make(threadContext);
IOutputConnectionManager outputConnectionManager = OutputConnectionManagerFactory.make(threadContext);
ingester.removeOutputConnection(outputConnectionManager.load(connectionName));
// Now, signal to all agents that the output connection configuration has changed. Do this second, so that there cannot be documents
// resulting from this signal that find themselves "unchanged".
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.
protected static final String API_ERRORNODE = "error";
protected static final String API_SERVICEINTERRUPTIONNODE = "service_interruption";
/** Find a configuration node given a name */
public static ConfigurationNode findConfigurationNode(Configuration input, String argumentName)
{
// Look for argument among the children
int i = 0;
while (i < input.getChildCount())
{
ConfigurationNode cn = input.findChild(i++);
if (cn.getType().equals(argumentName))
return cn;
}
return null;
}
/** Find a configuration value given a name */
public static String getRootArgument(Configuration input, String argumentName)
{
ConfigurationNode node = findConfigurationNode(input,argumentName);
if (node == null)
return null;
return node.getValue();
}
/** Create an error node with a general error message. */
public static void createErrorNode(Configuration output, String errorMessage)
throws ManifoldCFException
{
ConfigurationNode error = new ConfigurationNode(API_ERRORNODE);
error.setValue(errorMessage);
output.addChild(output.getChildCount(),error);
}
/** Handle an exception, by converting it to an error node. */
public static void createErrorNode(Configuration output, ManifoldCFException e)
throws ManifoldCFException
{
if (e.getErrorCode() == ManifoldCFException.INTERRUPTED)
throw e;
Logging.api.error(e.getMessage(),e);
createErrorNode(output,e.getMessage());
}
/** Handle a service interruption, by converting it to a serviceinterruption node. */
public static void createServiceInterruptionNode(Configuration output, ServiceInterruption e)
{
Logging.api.warn(e.getMessage(),e);
ConfigurationNode error = new ConfigurationNode(API_SERVICEINTERRUPTIONNODE);
error.setValue(e.getMessage());
output.addChild(output.getChildCount(),error);
}
}