/**
* Copyright 2011 Intuit Inc. All Rights Reserved
*/
package com.intuit.tank.report;
/*
* #%L
* JSF Support Beans
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.PropertyComparer;
import com.intuit.tank.PropertyComparer.SortOrder;
import com.intuit.tank.dao.JobInstanceDao;
import com.intuit.tank.dao.WorkloadDao;
import com.intuit.tank.project.JobInstance;
import com.intuit.tank.project.Project;
import com.intuit.tank.project.Workload;
import com.intuit.tank.util.Multiselectable;
import com.intuit.tank.util.TimeFormatUtil;
import com.intuit.tank.view.filter.ViewFilterType;
import com.intuit.tank.vm.settings.TimeUtil;
import com.intuit.tank.wrapper.SelectableBean;
import com.intuit.tank.wrapper.SelectableWrapper;
/**
* JobReport
*
* @author dangleton
*
*/
@Named
@RequestScoped
public class JobReport extends SelectableBean<JobReportData> implements Serializable, Multiselectable<JobReportData> {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LogManager.getLogger(JobReport.class);
private JobReportOptions jobReportOptions = new JobReportOptions();
private List<JobReportData> results = new ArrayList<JobReportData>();
private SelectableWrapper<JobReportData> selectedResult;
/**
* @return the selectedResult
*/
public SelectableWrapper<JobReportData> getSelectedResult() {
return selectedResult;
}
/**
* @param selectedResult
* the selectedResult to set
*/
public void setSelectedResult(SelectableWrapper<JobReportData> selectedResult) {
this.selectedResult = selectedResult;
}
/**
* @return the jobReportInstance
*/
public JobReportOptions getJobReportOptions() {
return jobReportOptions;
}
/**
* @return the results
*/
public List<JobReportData> getEntityList(ViewFilterType viewFilter) {
return results;
}
public void runReport() {
List<JobInstance> all = new JobInstanceDao().findAll();
filterDate(all);
List<JobReportData> data = getJobReportData(all);
filterDurationAndName(data);
this.results = data;
Collections.sort(this.results, new PropertyComparer<JobReportData>(JobInstance.PROPERTY_ID,
SortOrder.DESCENDING));
refresh();
}
/**
* @param data
*/
private void filterDurationAndName(List<JobReportData> data) {
if (!StringUtils.isEmpty(jobReportOptions.getDurationStart())) {
try {
int duration = findDuration(jobReportOptions.getDurationStart());
for (Iterator<JobReportData> iter = data.iterator(); iter.hasNext();) {
JobReportData job = iter.next();
if (duration > job.getDuration()) {
iter.remove();
}
}
} catch (Exception e) {
LOG.warn("Error with min duration value of " + jobReportOptions.getDurationStart());
}
}
if (!StringUtils.isEmpty(jobReportOptions.getDurationEnd())) {
try {
int duration = findDuration(jobReportOptions.getDurationEnd());
for (Iterator<JobReportData> iter = data.iterator(); iter.hasNext();) {
JobReportData job = iter.next();
if (duration < job.getDuration()) {
iter.remove();
}
}
} catch (Exception e) {
LOG.warn("Error with max duration value of " + jobReportOptions.getDurationEnd());
}
}
if (!StringUtils.isEmpty(jobReportOptions.getProjectNameMatch())) {
try {
String match = jobReportOptions.getProjectNameMatch().toLowerCase().replace(".", "\\.")
.replace("\\", "\\\\").replace("*", ".*");
for (Iterator<JobReportData> iter = data.iterator(); iter.hasNext();) {
JobReportData job = iter.next();
if (!job.getProjectName().toLowerCase().matches(match)) {
iter.remove();
}
}
} catch (Exception e) {
LOG.warn("Error with max duration value of " + jobReportOptions.getDurationEnd());
}
}
}
/**
* @param durationEnd
* @return
*/
private int findDuration(String duration) {
int ret = 0;
if (duration.indexOf(':') != -1) {
ret = TimeFormatUtil.parseFormattedDuration(duration);
} else {
ret = (int) TimeUtil.parseTimeString(duration);
ret = ret / 1000;
}
return ret;
}
/**
* @param all
* @return
*/
private List<JobReportData> getJobReportData(List<JobInstance> all) {
Set<Integer> workloadIds = new HashSet<Integer>();
for (JobInstance job : all) {
workloadIds.add(job.getWorkloadId());
}
List<Workload> workloads = workloadIds.isEmpty() ? new ArrayList<Workload>() : new WorkloadDao()
.findForIds(new ArrayList<Integer>(workloadIds));
Map<Integer, Project> projectMap = new HashMap<Integer, Project>();
for (Workload w : workloads) {
projectMap.put(w.getId(), w.getProject());
}
List<JobReportData> ret = new ArrayList<JobReportData>();
for (JobInstance job : all) {
Project p = projectMap.get(job.getWorkloadId());
String name = p != null ? p.getName() : "N/A (Project Deleted)";
ret.add(new JobReportData(name, job));
}
return ret;
}
/**
* @param all
*/
private void filterDate(List<JobInstance> all) {
Date date = jobReportOptions.getStartTime();
if (date != null) {
for (Iterator<JobInstance> iter = all.iterator(); iter.hasNext();) {
JobInstance job = iter.next();
Date st = job.getStartTime() != null ? job.getStartTime() : job.getCreated();
if (!date.before(st)) {
iter.remove();
}
}
}
date = jobReportOptions.getEndTime();
if (date != null) {
for (Iterator<JobInstance> iter = all.iterator(); iter.hasNext();) {
JobInstance job = iter.next();
Date st = job.getStartTime() != null ? job.getStartTime() : job.getCreated();
if (!date.after(st)) {
iter.remove();
}
}
}
if (NumberUtils.isDigits(jobReportOptions.getMinUsers())) {
try {
int users = Integer.parseInt(jobReportOptions.getMinUsers());
for (Iterator<JobInstance> iter = all.iterator(); iter.hasNext();) {
JobInstance job = iter.next();
if (job.getTotalVirtualUsers() < users) {
iter.remove();
}
}
} catch (NumberFormatException e) {
LOG.warn("Error with min users value of " + jobReportOptions.getMinUsers());
}
}
if (NumberUtils.isDigits(jobReportOptions.getMaxUsers())) {
try {
int users = Integer.parseInt(jobReportOptions.getMaxUsers());
for (Iterator<JobInstance> iter = all.iterator(); iter.hasNext();) {
JobInstance job = iter.next();
if (job.getTotalVirtualUsers() > users) {
iter.remove();
}
}
} catch (NumberFormatException e) {
LOG.warn("Error with max users value of " + jobReportOptions.getMaxUsers());
}
}
if (NumberUtils.isDigits(jobReportOptions.getJobIdStart())) {
try {
int jobIdStart = NumberUtils.toInt(jobReportOptions.getJobIdStart());
for (Iterator<JobInstance> iter = all.iterator(); iter.hasNext();) {
JobInstance job = iter.next();
if (job.getId() < jobIdStart) {
iter.remove();
}
}
} catch (NumberFormatException e) {
LOG.warn("Error with max users value of " + jobReportOptions.getMaxUsers());
}
}
if (NumberUtils.isDigits(jobReportOptions.getJobIdEnd())) {
try {
int jobIdStart = NumberUtils.toInt(jobReportOptions.getJobIdEnd());
for (Iterator<JobInstance> iter = all.iterator(); iter.hasNext();) {
JobInstance job = iter.next();
if (job.getId() > jobIdStart) {
iter.remove();
}
}
} catch (NumberFormatException e) {
LOG.warn("Error with max users value of " + jobReportOptions.getMaxUsers());
}
}
}
public static void main(String[] args) {
StringUtils.trim(null);
System.out.println(NumberUtils.isDigits(StringUtils.trim("123 ")));
System.out.println(NumberUtils.toInt(StringUtils.trim("123 ")));
}
/**
* @{inheritDoc
*/
@Override
public void delete(JobReportData entity) {
boolean removed = results.remove(entity);
if (removed) {
refresh();
}
}
/**
* @{inheritDoc
*/
@Override
public boolean isCurrent() {
return true;
}
}