org.apache.manifoldcf.agents.agentmanager.AgentManager Maven / Gradle / Ivy
/* $Id: AgentManager.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.agentmanager;
import org.apache.manifoldcf.core.interfaces.*;
import org.apache.manifoldcf.agents.interfaces.*;
import java.util.*;
/** This is the implementation of IAgentManager.
*
*
* agents
*
*
* Field Type Description
* classname VARCHAR(255) Primary Key
*
*
*
*/
public class AgentManager extends org.apache.manifoldcf.core.database.BaseTable implements IAgentManager
{
public static final String _rcsid = "@(#)$Id: AgentManager.java 988245 2010-08-23 18:39:35Z kwright $";
// Fields
protected final static String classNameField = "classname";
// Thread context
protected IThreadContext threadContext;
/** Constructor.
*@param threadContext is the thread context.
*@param database is the database instance.
*/
public AgentManager(IThreadContext threadContext, IDBInterface database)
throws ManifoldCFException
{
super(database,"agents");
this.threadContext = threadContext;
}
/** Install or upgrade.
*/
public void install()
throws ManifoldCFException
{
// We always use an outer loop, in case the upgrade will need it.
while (true)
{
// Check if table is already present
Map existing = getTableSchema(null,null);
if (existing == null)
{
HashMap map = new HashMap();
map.put(classNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
performCreate(map,null);
}
else
{
// Any required upgrade code goes here.
}
// Any index creation goes here.
break;
}
}
/** Uninstall. Also uninstalls all remaining agents.
*/
public void deinstall()
throws ManifoldCFException
{
// Since we are uninstalling agents, better do this inside a transaction
beginTransaction();
try
{
// Uninstall everything remaining
IResultSet set = performQuery("SELECT * FROM "+getTableName(),null,null,null);
int i = 0;
while (i < set.getRowCount())
{
IResultRow row = set.getRow(i++);
String className = row.getValue(classNameField).toString();
IAgent agent = AgentFactory.make(className);
agent.deinstall(threadContext);
}
performDrop(null);
}
catch (ManifoldCFException e)
{
signalRollback();
throw e;
}
catch (Error e)
{
signalRollback();
throw e;
}
finally
{
endTransaction();
}
}
/** Register an agent.
*@param className is the class.
*/
public void registerAgent(String className)
throws ManifoldCFException
{
// Do in a transaction, so the installation is atomic
beginTransaction();
try
{
// See if already registered, if so just upgrade
ArrayList params = new ArrayList();
params.add(className);
IResultSet set = performQuery("SELECT * FROM "+getTableName()+" WHERE "+classNameField+"=?",params,null,null);
if (set.getRowCount() == 0)
{
// Try to add to the table first
HashMap map = new HashMap();
map.put(classNameField,className);
performInsert(map,null);
}
// In any case, call the install/upgrade method
IAgent agent = AgentFactory.make(className);
agent.install(threadContext);
}
catch (ManifoldCFException e)
{
signalRollback();
throw e;
}
catch (Error e)
{
signalRollback();
throw e;
}
finally
{
endTransaction();
}
}
/** Unregister an agent.
*@param className is the class to unregister.
*/
public void unregisterAgent(String className)
throws ManifoldCFException
{
// Do in a transaction, so the installation is atomic
beginTransaction();
try
{
// First, deregister agent
IAgent agent = AgentFactory.make(className);
agent.deinstall(threadContext);
// Remove from table
removeAgent(className);
}
catch (ManifoldCFException e)
{
signalRollback();
throw e;
}
catch (Error e)
{
signalRollback();
throw e;
}
finally
{
endTransaction();
}
}
/** Remove an agent.
* Use this when the agent cannot be invoked. The agent becomes unavailable,
* but its schema is not cleaned up.
*@param className is the class to remove.
*/
public void removeAgent(String className)
throws ManifoldCFException
{
// Remove from table
ArrayList list = new ArrayList();
list.add(className);
performDelete("WHERE "+classNameField+"=?",list,null);
}
/** Get a list of all registered agent class names.
*@return the classnames in an array.
*/
public String[] getAllAgents()
throws ManifoldCFException
{
IResultSet set = performQuery("SELECT * FROM "+getTableName(),null,null,null);
String[] rval = new String[set.getRowCount()];
int i = 0;
while (i < set.getRowCount())
{
IResultRow row = set.getRow(i);
rval[i] = row.getValue(classNameField).toString();
i++;
}
return rval;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy