in framework/pull-agent/src/main/java/org/apache/manifoldcf/crawler/system/ManifoldCF.java [2913:3220]
protected static int apiReadRepositoryConnectionHistory(IThreadContext tc, Configuration output,
String connectionName, Map<String,List<String>> queryParameters, IAuthorizer authorizer) throws ManifoldCFException
{
if (!authorizer.checkAllowed(tc, IAuthorizer.CAPABILITY_VIEW_REPORTS))
return READRESULT_NOTALLOWED;
if (queryParameters == null)
queryParameters = new HashMap<String,List<String>>();
// Look for filter criteria parameters...
// Start time
List<String> startTimeList = queryParameters.get("starttime");
Long startTime;
if (startTimeList == null || startTimeList.size() == 0)
startTime = null;
else if (startTimeList.size() > 1)
throw new ManifoldCFException("Multiple start times specified.");
else
startTime = new Long(startTimeList.get(0));
// End time
List<String> endTimeList = queryParameters.get("endtime");
Long endTime;
if (endTimeList == null || endTimeList.size() == 0)
endTime = null;
else if (endTimeList.size() > 1)
throw new ManifoldCFException("Multiple end times specified.");
else
endTime = new Long(endTimeList.get(0));
// Activities
List<String> activityList = queryParameters.get("activity");
String[] activities;
if (activityList == null)
activities = new String[0];
else
activities = activityList.toArray(new String[0]);
// Entity match
RegExpCriteria entityMatch;
List<String> entityMatchList = queryParameters.get("entitymatch");
List<String> entityMatchInsensitiveList = queryParameters.get("entitymatch_insensitive");
if (entityMatchList != null && entityMatchInsensitiveList != null)
throw new ManifoldCFException("Either use entitymatch or entitymatch_insensitive, not both.");
boolean isInsensitiveEntityMatch;
if (entityMatchInsensitiveList != null)
{
entityMatchList = entityMatchInsensitiveList;
isInsensitiveEntityMatch = true;
}
else
isInsensitiveEntityMatch = false;
if (entityMatchList == null || entityMatchList.size() == 0)
entityMatch = null;
else if (entityMatchList.size() > 1)
throw new ManifoldCFException("Multiple entity match regexps specified.");
else
entityMatch = new RegExpCriteria(entityMatchList.get(0),isInsensitiveEntityMatch);
// Result code match
RegExpCriteria resultCodeMatch;
List<String> resultCodeMatchList = queryParameters.get("resultcodematch");
List<String> resultCodeMatchInsensitiveList = queryParameters.get("resultcodematch_insensitive");
if (resultCodeMatchList != null && resultCodeMatchInsensitiveList != null)
throw new ManifoldCFException("Either use resultcodematch or resultcodematch_insensitive, not both.");
boolean isInsensitiveResultCodeMatch;
if (entityMatchInsensitiveList != null)
{
resultCodeMatchList = resultCodeMatchInsensitiveList;
isInsensitiveResultCodeMatch = true;
}
else
isInsensitiveResultCodeMatch = false;
if (resultCodeMatchList == null || resultCodeMatchList.size() == 0)
resultCodeMatch = null;
else if (resultCodeMatchList.size() > 1)
throw new ManifoldCFException("Multiple resultcode match regexps specified.");
else
resultCodeMatch = new RegExpCriteria(resultCodeMatchList.get(0),isInsensitiveResultCodeMatch);
// Filter criteria
FilterCriteria filterCriteria = new FilterCriteria(activities,startTime,endTime,entityMatch,resultCodeMatch);
// Look for sort order parameters...
SortOrder sortOrder = new SortOrder();
List<String> sortColumnsList = queryParameters.get("sortcolumn");
List<String> sortColumnsDirList = queryParameters.get("sortcolumn_direction");
if (sortColumnsList != null || sortColumnsDirList != null)
{
if (sortColumnsList == null || sortColumnsDirList == null || sortColumnsList.size() != sortColumnsDirList.size())
throw new ManifoldCFException("sortcolumn and sortcolumn_direction must have the same cardinality.");
for (int i = 0; i < sortColumnsList.size(); i++)
{
String column = sortColumnsList.get(i);
String dir = sortColumnsDirList.get(i);
int dirInt;
if (dir.equals("ascending"))
dirInt = SortOrder.SORT_ASCENDING;
else if (dir.equals("descending"))
dirInt = SortOrder.SORT_DESCENDING;
else
throw new ManifoldCFException("sortcolumn_direction must be 'ascending' or 'descending'.");
sortOrder.addCriteria(column,dirInt);
}
}
// Start row and row count
int startRow;
List<String> startRowList = queryParameters.get("startrow");
if (startRowList == null || startRowList.size() == 0)
startRow = 0;
else if (startRowList.size() > 1)
throw new ManifoldCFException("Multiple start rows specified.");
else
startRow = new Integer(startRowList.get(0)).intValue();
int rowCount;
List<String> rowCountList = queryParameters.get("rowcount");
if (rowCountList == null || rowCountList.size() == 0)
rowCount = 20;
else if (rowCountList.size() > 1)
throw new ManifoldCFException("Multiple row counts specified.");
else
rowCount = new Integer(rowCountList.get(0)).intValue();
List<String> reportTypeList = queryParameters.get("report");
String reportType;
if (reportTypeList == null || reportTypeList.size() == 0)
reportType = "simple";
else if (reportTypeList.size() > 1)
throw new ManifoldCFException("Multiple report types specified.");
else
reportType = reportTypeList.get(0);
IRepositoryConnectionManager connectionManager = RepositoryConnectionManagerFactory.make(tc);
IResultSet result;
String[] resultColumns;
if (reportType.equals("simple"))
{
try
{
result = connectionManager.genHistorySimple(connectionName,filterCriteria,sortOrder,startRow,rowCount);
}
catch (ManifoldCFException e)
{
createErrorNode(output,e);
return READRESULT_FOUND;
}
resultColumns = new String[]{"starttime","resultcode","resultdesc","identifier","activity","bytes","elapsedtime"};
}
else if (reportType.equals("maxactivity"))
{
long maxInterval = connectionManager.getMaxRows();
long actualRows = connectionManager.countHistoryRows(connectionName,filterCriteria);
if (actualRows > maxInterval)
throw new ManifoldCFException("Too many history rows specified for maxactivity report - actual is "+actualRows+", max is "+maxInterval+".");
BucketDescription idBucket;
List<String> idBucketList = queryParameters.get("idbucket");
List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
if (idBucketList != null && idBucketInsensitiveList != null)
throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
boolean isInsensitiveIdBucket;
if (idBucketInsensitiveList != null)
{
idBucketList = idBucketInsensitiveList;
isInsensitiveIdBucket = true;
}
else
isInsensitiveIdBucket = false;
if (idBucketList == null || idBucketList.size() == 0)
idBucket = new BucketDescription("()",false);
else if (idBucketList.size() > 1)
throw new ManifoldCFException("Multiple idbucket regexps specified.");
else
idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
long interval;
List<String> intervalList = queryParameters.get("interval");
if (intervalList == null || intervalList.size() == 0)
interval = 300000L;
else if (intervalList.size() > 1)
throw new ManifoldCFException("Multiple intervals specified.");
else
interval = new Long(intervalList.get(0)).longValue();
try
{
result = connectionManager.genHistoryActivityCount(connectionName,filterCriteria,sortOrder,idBucket,interval,startRow,rowCount);
}
catch (ManifoldCFException e)
{
createErrorNode(output,e);
return READRESULT_FOUND;
}
resultColumns = new String[]{"starttime","endtime","activitycount","idbucket"};
}
else if (reportType.equals("maxbandwidth"))
{
long maxInterval = connectionManager.getMaxRows();
long actualRows = connectionManager.countHistoryRows(connectionName,filterCriteria);
if (actualRows > maxInterval)
throw new ManifoldCFException("Too many history rows specified for maxbandwidth report - actual is "+actualRows+", max is "+maxInterval+".");
BucketDescription idBucket;
List<String> idBucketList = queryParameters.get("idbucket");
List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
if (idBucketList != null && idBucketInsensitiveList != null)
throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
boolean isInsensitiveIdBucket;
if (idBucketInsensitiveList != null)
{
idBucketList = idBucketInsensitiveList;
isInsensitiveIdBucket = true;
}
else
isInsensitiveIdBucket = false;
if (idBucketList == null || idBucketList.size() == 0)
idBucket = new BucketDescription("()",false);
else if (idBucketList.size() > 1)
throw new ManifoldCFException("Multiple idbucket regexps specified.");
else
idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
long interval;
List<String> intervalList = queryParameters.get("interval");
if (intervalList == null || intervalList.size() == 0)
interval = 300000L;
else if (intervalList.size() > 1)
throw new ManifoldCFException("Multiple intervals specified.");
else
interval = new Long(intervalList.get(0)).longValue();
try
{
result = connectionManager.genHistoryByteCount(connectionName,filterCriteria,sortOrder,idBucket,interval,startRow,rowCount);
}
catch (ManifoldCFException e)
{
createErrorNode(output,e);
return READRESULT_FOUND;
}
resultColumns = new String[]{"starttime","endtime","bytecount","idbucket"};
}
else if (reportType.equals("result"))
{
BucketDescription idBucket;
List<String> idBucketList = queryParameters.get("idbucket");
List<String> idBucketInsensitiveList = queryParameters.get("idbucket_insensitive");
if (idBucketList != null && idBucketInsensitiveList != null)
throw new ManifoldCFException("Either use idbucket or idbucket_insensitive, not both.");
boolean isInsensitiveIdBucket;
if (idBucketInsensitiveList != null)
{
idBucketList = idBucketInsensitiveList;
isInsensitiveIdBucket = true;
}
else
isInsensitiveIdBucket = false;
if (idBucketList == null || idBucketList.size() == 0)
idBucket = new BucketDescription("()",false);
else if (idBucketList.size() > 1)
throw new ManifoldCFException("Multiple idbucket regexps specified.");
else
idBucket = new BucketDescription(idBucketList.get(0),isInsensitiveIdBucket);
BucketDescription resultCodeBucket;
List<String> resultCodeBucketList = queryParameters.get("resultcodebucket");
List<String> resultCodeBucketInsensitiveList = queryParameters.get("resultcodebucket_insensitive");
if (resultCodeBucketList != null && resultCodeBucketInsensitiveList != null)
throw new ManifoldCFException("Either use resultcodebucket or resultcodebucket_insensitive, not both.");
boolean isInsensitiveResultCodeBucket;
if (resultCodeBucketInsensitiveList != null)
{
resultCodeBucketList = resultCodeBucketInsensitiveList;
isInsensitiveResultCodeBucket = true;
}
else
isInsensitiveResultCodeBucket = false;
if (resultCodeBucketList == null || resultCodeBucketList.size() == 0)
resultCodeBucket = new BucketDescription("(.*)",false);
else if (resultCodeBucketList.size() > 1)
throw new ManifoldCFException("Multiple resultcodebucket regexps specified.");
else
resultCodeBucket = new BucketDescription(resultCodeBucketList.get(0),isInsensitiveResultCodeBucket);
try
{
result = connectionManager.genHistoryResultCodes(connectionName,filterCriteria,sortOrder,resultCodeBucket,idBucket,startRow,rowCount);
}
catch (ManifoldCFException e)
{
createErrorNode(output,e);
return READRESULT_FOUND;
}
resultColumns = new String[]{"idbucket","resultcodebucket","eventcount"};
}
else
throw new ManifoldCFException("Unknown report type '"+reportType+"'.");
createResultsetNode(output,result,resultColumns);
return READRESULT_FOUND;
}