/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package models.datatable;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.emc.storageos.db.client.model.uimodels.OrderStatus;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import play.Logger;
import render.RenderSupportOrderPackage;
import util.BourneUtil;
import util.MessagesUtils;
import util.OrderUtils;
import util.datatable.DataTableParams;
import com.emc.vipr.model.catalog.OrderCount;
import com.emc.vipr.model.catalog.OrderJobInfo;
import com.emc.vipr.model.catalog.OrderRestRep;
import util.support.SupportOrderPackageCreator;
public class RecentOrdersDataTable extends OrderDataTable {
private int maxOrders = 0;
/** Only displays orders newer than the given number of days (defaults to 7 days). */
private int maxAgeInDays = 7;
public static final String JOB_TYPE_DELETE = "DELETE_ORDER";
public static final String JOB_TYPE_DOWNLOAD = "DOWNLOAD_ORDER";
public RecentOrdersDataTable(String tenantId) {
super(tenantId);
}
public RecentOrdersDataTable(String tenantId, int offsetInMinutes) {
super(tenantId, offsetInMinutes);
}
public int getMaxOrders() {
return maxOrders;
}
public void setMaxOrders(int maxOrders) {
this.maxOrders = maxOrders;
}
public int getMaxAgeInDays() {
return maxAgeInDays;
}
public void setMaxAgeInDays(int daysAgo) {
this.maxAgeInDays = daysAgo;
}
@Override
public List<OrderInfo> fetchAll() {
if (startDate == null && endDate == null) {
super.setStartAndEndDatesByMaxDays(maxAgeInDays);
}
List<OrderRestRep> orders = OrderUtils.findByTimeRange(startDate, endDate, tenantId, ORDER_MAX_COUNT_STR);
if (userInfo != null) {// used for DashboardOrdersDataTable
filterByUserId(orders);
} else {
// no need to filter by tenant, because already find by tenantId
// filterByTenant(orders);
}
return convert(orders);
}
public List<OrderInfo> fetchData(DataTableParams params) {
List<OrderInfo> orders = fetchAll();
if (maxOrders > 0) {
Collections.sort(orders, RECENT_ORDER_INFO_COMPARATOR);
while (orders.size() > maxOrders) {
orders.remove(orders.size() - 1);
}
}
return orders;
}
@Override
public OrderCount fetchCount() {
return OrderUtils.getOrdersCount(startDate, endDate, uri(tenantId));
}
public void deleteOrders() {
OrderUtils.deleteOrders(startDate, endDate, uri(tenantId));
}
public String getDeleteJobStatus() {
OrderJobInfo info = OrderUtils.queryOrderJob(JOB_TYPE_DELETE);
String status = null; // if the job is done or no job, return null
if (info != null && !info.isNoJobOrJobDone()) {
status = MessagesUtils.get("orders.delete.status", new Date(info.getStartTime()), new Date(info.getEndTime()),
info.getCompleted(), info.getTotal(), info.getFailed());
if (info.getTotal() >= OrderDataTable.ORDER_MAX_DELETE_PER_GC) {
status = String.format("%s %s", status, MessagesUtils.get("orders.delete.all.threshold",
OrderDataTable.ORDER_MAX_DELETE_PER_GC));
}
}
Logger.info("getDeleteJobStatus: {}", status);
return status;
}
public void downloadOrders(String startDate, String endDate, Integer maxDays, String orderIDs) {
SupportOrderPackageCreator creator = new SupportOrderPackageCreator(BourneUtil.getCatalogClient());
if (StringUtils.isNotEmpty(orderIDs)) {
creator.setOrderIDs(orderIDs);
} else {
this.setByStartEndDateOrMaxDays(startDate, endDate, maxDays);
creator.setStartDate(this.startDate);
creator.setEndDate(this.endDate);
creator.setTenantIDs(this.tenantId);
}
RenderSupportOrderPackage.renderSupportAuditPackage(creator);
}
public String getDownloadJobStatus() {
OrderJobInfo info = OrderUtils.queryOrderJob(JOB_TYPE_DOWNLOAD);
String status = null; // if the job is done or no job, return null
if (info != null && !info.isNoJobOrJobDone()) {
if (info.getStartTime() == 0) {
status = MessagesUtils.get("orders.download.status.notime",
info.getCompleted(), info.getTotal(), info.getFailed());
} else {
status = MessagesUtils.get("orders.download.status", new Date(info.getStartTime()), new Date(info.getEndTime()),
info.getCompleted(), info.getTotal(), info.getFailed());
}
}
Logger.info("getDownloadJobStatus: {}", status);
return status;
}
public static String getCanBeDeletedOrderStatuses() {
List<OrderStatus> canBeDeletedStatus = new ArrayList<OrderStatus>(Arrays.asList(OrderStatus.values()));
CollectionUtils.filter(canBeDeletedStatus, new Predicate() {
@Override
public boolean evaluate(Object o) {
return ((OrderStatus) o).canBeDeleted();
}
});
StringBuilder builder = new StringBuilder();
for (int i = 0; i < canBeDeletedStatus.size(); i++) {
if (i != 0) {
builder.append(", ");
}
if (i == canBeDeletedStatus.size() - 1) {
builder.append("or ");
}
builder.append(canBeDeletedStatus.get(i).name());
}
return builder.toString();
}
/**
* Filters out orders that are not associated with the selected tenant.
*
* @param orders
* the orders.
*/
protected void filterByTenant(List<OrderRestRep> orders) {
Iterator<OrderRestRep> iter = orders.iterator();
while (iter.hasNext()) {
if (!StringUtils.equals(tenantId, iter.next().getTenant().getId().toString())) {
iter.remove();
}
}
}
/**
* Filters out orders that are not submitted by the selected user (if applicable).
*
* @param orders
* the orders.
*/
protected void filterByUserId(List<OrderRestRep> orders) {
if (userInfo != null) {
String userId = userInfo.getIdentifier();
Iterator<OrderRestRep> iter = orders.iterator();
while (iter.hasNext()) {
if (!StringUtils.equals(userId, iter.next().getSubmittedBy())) {
iter.remove();
}
}
}
}
protected static Comparator<OrderRestRep> RECENT_ORDER_COMPARATOR = new Comparator<OrderRestRep>() {
@Override
public int compare(OrderRestRep a, OrderRestRep b) {
return ObjectUtils.compare(b.getCreationTime(), a.getCreationTime());
}
};
protected static Comparator<OrderInfo> RECENT_ORDER_INFO_COMPARATOR = new Comparator<OrderInfo>() {
@Override
public int compare(OrderInfo a, OrderInfo b) {
return ObjectUtils.compare(b.createdDate, a.createdDate);
}
};
}