/* $Id: EventManager.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.crawler.jobs;
import org.apache.manifoldcf.core.interfaces.*;
import org.apache.manifoldcf.crawler.interfaces.*;
import org.apache.manifoldcf.crawler.interfaces.CacheKeyFactory;
import org.apache.manifoldcf.crawler.system.ManifoldCF;
import java.util.*;
/** This class manages the events table.
* A row in this table indicates that a specific event sequence is in progress. For example, a login sequence for a specific web domain
* may be underway. During the time that the event is taking place, no documents that depend on that event will be queued for processing.
*
* <br><br>
* <b>events</b>
* <table border="1" cellpadding="3" cellspacing="0">
* <tr class="TableHeadingColor">
* <th>Field</th><th>Type</th><th>Description </th>
* <tr><td>name</td><td>VARCHAR(255)</td><td>Primary Key</td></tr>
* <tr><td>processid</td><td>VARCHAR(16)</td><td></td></tr>
* </table>
* <br><br>
*
*/
public class EventManager extends org.apache.manifoldcf.core.database.BaseTable
{
public static final String _rcsid = "@(#)$Id: EventManager.java 988245 2010-08-23 18:39:35Z kwright $";
// Field names
public final static String eventNameField = "name";
public final static String processIDField = "processid";
/** Constructor.
*@param database is the database handle.
*/
public EventManager(IDBInterface database)
throws ManifoldCFException
{
super(database,"events");
}
/** Install or upgrade this table.
*/
public void install()
throws ManifoldCFException
{
// Standard practice: outer loop for installs
while (true)
{
Map existing = getTableSchema(null,null);
if (existing == null)
{
HashMap map = new HashMap();
map.put(eventNameField,new ColumnDescription("VARCHAR(255)",true,false,null,null,false));
map.put(processIDField,new ColumnDescription("VARCHAR(16)",false,true,null,null,false));
performCreate(map,null);
}
else
{
// Upgrade goes here if needed
}
// Index management goes here
IndexDescription processIDIndex = new IndexDescription(false,new String[]{processIDField});
// Get rid of unused indexes
Map indexes = getTableIndexes(null,null);
Iterator iter = indexes.keySet().iterator();
while (iter.hasNext())
{
String indexName = (String)iter.next();
IndexDescription id = (IndexDescription)indexes.get(indexName);
if (processIDIndex != null && id.equals(processIDIndex))
processIDIndex = null;
else if (indexName.indexOf("_pkey") == -1)
// This index shouldn't be here; drop it
performRemoveIndex(indexName);
}
// Build missing indexes
if (processIDIndex != null)
performAddIndex(null,processIDIndex);
break;
}
}
/** Uninstall.
*/
public void deinstall()
throws ManifoldCFException
{
performDrop(null);
}
/** Prepare for restart.
*@param processID is the processID to restart.
*/
public void restart(String processID)
throws ManifoldCFException
{
// Delete all rows in this table matching the processID
ArrayList list = new ArrayList();
String query = buildConjunctionClause(list,new ClauseDescription[]{
new UnitaryClause(processIDField,processID)});
performDelete("WHERE "+query,list,null);
}
/** Clean up after all processIDs.
*/
public void restart()
throws ManifoldCFException
{
performDelete("",null,null);
}
/** Restart cluster.
*/
public void restartCluster()
throws ManifoldCFException
{
// Does nothing
}
/** Atomically create an event - and return false if the event already exists */
public void createEvent(String eventName, String processID)
throws ManifoldCFException
{
HashMap map = new HashMap();
map.put(eventNameField,eventName);
map.put(processIDField,processID);
performInsert(map,null);
}
/** Destroy an event */
public void destroyEvent(String eventName)
throws ManifoldCFException
{
ArrayList list = new ArrayList();
list.add(eventName);
performDelete("WHERE "+eventNameField+"=?",list,null);
}
}