/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package models.datatable; import static com.emc.vipr.client.core.util.ResourceUtils.uri; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import com.emc.vipr.model.catalog.OrderCount; import play.Logger; import models.security.UserInfo; import util.OrderUtils; import util.TimeUtils; import util.datatable.DataTable; import com.emc.vipr.model.catalog.OrderRestRep; import com.google.common.collect.Lists; import controllers.catalog.Orders; public class OrderDataTable extends DataTable { public static final int ORDER_MAX_COUNT = 6000; public static final int ORDER_MAX_DELETE_PER_GC = 20000; protected static final String ORDER_MAX_COUNT_STR = String.valueOf(ORDER_MAX_COUNT); protected SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy-MM-dd"); protected UserInfo userInfo; protected String tenantId; protected Date startDate; // "yyyy-MM-dd 00:00:00" in local time zone protected Date endDate; // "yyyy-MM-dd 23:59:59" in local time zone private void setStartDate(Date startDate) {// set to "yyyy-MM-dd 00:00:00" this.startDate = getStartTimeOfADay(startDate); } private void setEndDate(Date endDate) {// set to "yyyy-MM-dd 23:59:59" this.endDate = getEndTimeOfADay(endDate); } public OrderDataTable(String tenantId) { this.tenantId = tenantId; addColumn("number"); addColumn("status").setRenderFunction("render.orderStatus"); addColumn("summary"); addColumn("submittedBy").hidden(); addColumn("createdDate").setRenderFunction("render.localDate"); addColumn("scheduledTime").setRenderFunction("render.localDate"); setDefaultSort("createdDate", "desc"); setRowCallback("createRowLink"); sortAll(); } public OrderDataTable(String tenantId, int offsetInMinutes) { this(tenantId); localDateFormat.setTimeZone(TimeUtils.getTimeZoneForOffset(offsetInMinutes)); } public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } public void setStartDate(String startDate) { try { setStartDate(localDateFormat.parse(startDate)); } catch (ParseException e) { Logger.error("Date parse error for: %s, e=%s", startDate, e); } } public void setEndDate(String endDate) { try { setEndDate(localDateFormat.parse(endDate)); } catch (ParseException e) { Logger.error("Date parse error for: %s, e=%s", endDate, e); } } public void setStartAndEndDatesByMaxDays(Integer maxDays) { maxDays = maxDays != null ? Math.max(maxDays, 1) : 1; setStartDate(getDateDaysAgo(maxDays)); setEndDate(now()); } public void setByStartEndDateOrMaxDays(String startDate, String endDate, Integer maxDays) { if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(endDate)) { setStartDate(startDate); setEndDate(endDate); } else { setStartAndEndDatesByMaxDays(maxDays); } } public List<OrderInfo> fetchAll() { List<OrderRestRep> orderRestReps = null; if (userInfo != null) { orderRestReps = OrderUtils.getUserOrders(startDate, endDate, ORDER_MAX_COUNT_STR, true); } else { orderRestReps = OrderUtils.getOrders(uri(this.tenantId)); } return convert(orderRestReps); } public OrderCount fetchCount() { return OrderUtils.getUserOrdersCount(startDate, endDate); } public static class OrderInfo { public String rowLink; public String id; public String number; public String status; public String summary; public Long createdDate; public String submittedBy; public String scheduledEventId; public Long scheduledTime; public OrderInfo(OrderRestRep o) { this.id = o.getId().toString(); this.number = o.getOrderNumber(); this.rowLink = createLink(Orders.class, "receipt", "orderId", id); this.status = o.getOrderStatus(); this.summary = o.getSummary(); if (o.getCreationTime() != null) { this.createdDate = o.getCreationTime().getTime().getTime(); } if (o.getSubmittedBy() != null) { this.submittedBy = o.getSubmittedBy().toString(); } if (o.getScheduledEventId() != null) { this.scheduledEventId = o.getScheduledEventId().toString(); } if (o.getScheduledTime() != null) { this.scheduledTime = o.getScheduledTime().getTime().getTime(); } } } protected List<OrderInfo> convert(List<OrderRestRep> orderRestReps) { List<OrderInfo> orderInfos = Lists.newArrayList(); if (orderRestReps != null) { for (OrderRestRep orderRestRep : orderRestReps) { orderInfos.add(new OrderInfo(orderRestRep)); } } return orderInfos; } public static Date getDateDaysAgo(int daysAgo) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, -daysAgo + 1); return cal.getTime(); } protected Date now() { return new Date(); } protected Date getStartTimeOfADay(Date origin) { Calendar cal = Calendar.getInstance(localDateFormat.getTimeZone()); cal.setTime(origin); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); return cal.getTime(); } protected Date getEndTimeOfADay(Date origin) { Calendar cal = Calendar.getInstance(localDateFormat.getTimeZone()); cal.setTime(origin); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); return cal.getTime(); } }