/*
* Copyright (c) 2017 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.util;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.lang3.StringUtils;
import com.emc.storageos.db.client.model.uimodels.ExecutionLog;
import com.emc.storageos.db.client.model.uimodels.ExecutionPhase;
import com.emc.storageos.db.client.model.uimodels.ExecutionState;
import com.emc.storageos.db.client.model.uimodels.ExecutionTaskLog;
import com.emc.vipr.model.catalog.CatalogServiceRestRep;
import com.emc.vipr.model.catalog.ExecutionLogRestRep;
import com.emc.vipr.model.catalog.ExecutionStateRestRep;
import com.emc.vipr.model.catalog.OrderLogRestRep;
import com.emc.vipr.model.catalog.OrderRestRep;
import com.emc.vipr.model.catalog.Parameter;
import com.google.common.collect.Lists;
public class OrderTextCreator {
private static final SimpleDateFormat DATE = new SimpleDateFormat("dd-MM-yy hh:mm");
private static final String DETAIL_INDENT = " \t \t";
private static final SimpleDateFormat TIME = new SimpleDateFormat("ddMMyy-HHmm");
private StringBuilder builder = new StringBuilder();
private OrderRestRep order;
private CatalogServiceRestRep service;
private ExecutionStateRestRep state;
private List<OrderLogRestRep> logs;
private List<ExecutionLogRestRep> exeLogs;
public void setOrder(OrderRestRep order) {
this.order = order;
}
public void setService(CatalogServiceRestRep service) {
this.service = service;
}
public void setState(ExecutionStateRestRep state) {
this.state = state;
}
public void setState(ExecutionState state) {
this.state = map(state);
}
public void setLogs(List<OrderLogRestRep> logs) {
this.logs = logs;
}
public void setRawLogs(List<ExecutionLog> logs) {
this.logs = new ArrayList<OrderLogRestRep>();
for (ExecutionLog log : logs) {
this.logs.add(map(log));
}
}
public void setExeLogs(List<ExecutionLogRestRep> exeLogs) {
this.exeLogs = exeLogs;
}
public void setRawExeLogs(List<ExecutionTaskLog> exeLogs) {
this.exeLogs = new ArrayList<ExecutionLogRestRep>();
for (ExecutionTaskLog log : exeLogs) {
this.exeLogs.add(map(log));
}
}
public static OrderLogRestRep map(ExecutionLog from) {
if (from == null) {
return null;
}
OrderLogRestRep to = new OrderLogRestRep();
to.setDate(from.getDate());
to.setLevel(from.getLevel());
to.setMessage(from.getMessage());
to.setPhase(from.getPhase());
to.setStackTrace(from.getStackTrace());
return to;
}
public static ExecutionLogRestRep map(ExecutionTaskLog from) {
if (from == null) {
return null;
}
ExecutionLogRestRep to = new ExecutionLogRestRep();
to.setDate(from.getDate());
to.setLevel(from.getLevel());
to.setMessage(from.getMessage());
to.setPhase(from.getPhase());
to.setStackTrace(from.getStackTrace());
to.setDetail(from.getDetail());
to.setElapsed(from.getElapsed());
to.setLastUpdated(from.getLastUpdated());
return to;
}
public static ExecutionStateRestRep map(ExecutionState from) {
if (from == null) {
return null;
}
ExecutionStateRestRep to = new ExecutionStateRestRep();
to.setAffectedResources(Lists.newArrayList(from.getAffectedResources()));
to.setCurrentTask(from.getCurrentTask());
to.setEndDate(from.getEndDate());
to.setExecutionStatus(from.getExecutionStatus());
to.setStartDate(from.getStartDate());
to.setLastUpdated(from.getLastUpdated());
return to;
}
public static String genereateOrderFileName(OrderRestRep order) {
String timestamp = TIME.format(order.getCreationTime().getTime());
return String.format("Order-%s-%s-%s.txt", order.getOrderNumber(), order.getOrderStatus(), timestamp);
}
public String getText() {
try {
writeDetails();
writeRequestParameters();
writeExecutionState();
} catch (Exception e) {
writeHeader("ERROR CREATING ORDER");
builder.append(ExceptionUtils.getFullStackTrace(e));
}
return builder.toString();
}
private void writeDetails() {
writeHeader("ORDER DETAILS");
writeField("Order ID", order.getId());
writeField("Order Number", order.getOrderNumber());
writeField("Submitted By", order.getSubmittedBy());
writeField("Date Submitted", order.getCreationTime().getTime());
writeField("Date Completed", order.getDateCompleted());
writeField("Message", order.getMessage());
writeField("Status", order.getOrderStatus());
writeField("Catalog Service", service.getTitle());
writeField("Catalog ID", service.getId());
writeField("Base Service", service.getBaseService());
writeField("Requires Approval?", service.isApprovalRequired());
writeField("Requires Execution Window?", service.isExecutionWindowRequired());
if (Boolean.TRUE.equals(service.isExecutionWindowRequired())) {
writeField("Execution Window?", service.getDefaultExecutionWindow().getId());
}
}
private void writeRequestParameters() {
writeHeader("Parameters");
List<Parameter> parameters = order.getParameters();
for (Parameter parameter : parameters) {
writeField(parameter.getFriendlyLabel(), parameter.getFriendlyValue());
}
}
private void writeExecutionState() {
if (state == null) {
return;
}
writeHeader("Execution State");
writeField("Execution Status", state.getExecutionStatus());
writeField("Start Date", state.getStartDate());
writeField("End Date", state.getEndDate());
writeField("Affected Resources", state.getAffectedResources());
writeLogs(state);
writeTaskLogs(state);
}
private void writeLogs(ExecutionStateRestRep state) {
writeHeader("Logs");
for (OrderLogRestRep log : logs) {
writeLog(log);
}
}
private void writeTaskLogs(ExecutionStateRestRep state) {
List<ExecutionLogRestRep> precheckLogs = getTaskLogs(exeLogs, ExecutionPhase.PRECHECK);
List<ExecutionLogRestRep> executeLogs = getTaskLogs(exeLogs, ExecutionPhase.EXECUTE);
List<ExecutionLogRestRep> rollbackLogs = getTaskLogs(exeLogs, ExecutionPhase.ROLLBACK);
if (!precheckLogs.isEmpty()) {
writeHeader("Precheck Steps");
for (ExecutionLogRestRep log : precheckLogs) {
writeLog(log);
}
}
if (!executeLogs.isEmpty()) {
writeHeader("Execute Steps");
for (ExecutionLogRestRep log : executeLogs) {
writeLog(log);
}
}
if (!rollbackLogs.isEmpty()) {
writeHeader("Rollback Steps");
for (ExecutionLogRestRep log : rollbackLogs) {
writeLog(log);
}
}
}
private List<ExecutionLogRestRep> getTaskLogs(List<ExecutionLogRestRep> logs, ExecutionPhase phase) {
List<ExecutionLogRestRep> phaseLogs = Lists.newArrayList();
for (ExecutionLogRestRep log : logs) {
if (phase.name().equals(log.getPhase())) {
phaseLogs.add(log);
}
}
return phaseLogs;
}
private void writeLog(OrderLogRestRep log) {
builder.append("[").append(log.getLevel()).append("]");
builder.append("\t").append(log.getDate());
if (StringUtils.isNotBlank(log.getMessage())) {
builder.append("\t").append(log.getMessage());
}
if (StringUtils.isNotBlank(log.getStackTrace())) {
builder.append("\n").append(log.getStackTrace());
}
builder.append("\n");
}
private void writeLog(ExecutionLogRestRep log) {
builder.append("[").append(log.getLevel()).append("]");
builder.append("\t").append(log.getDate());
if (StringUtils.isNotBlank(log.getMessage())) {
builder.append("\t").append(log.getMessage());
}
if (log.getElapsed() != null) {
builder.append("\t(").append(log.getElapsed()).append(" ms)");
}
if (StringUtils.isNotBlank(log.getDetail())) {
builder.append("\n").append(DETAIL_INDENT).append(log.getDetail());
}
if (StringUtils.isNotBlank(log.getStackTrace())) {
builder.append("\n").append(log.getStackTrace());
}
builder.append("\n");
}
private void writeHeader(String header) {
builder.append("\n");
builder.append(header);
builder.append("\n");
builder.append(StringUtils.repeat("-", header.length()));
builder.append("\n");
}
private void writeField(String label, Date date) {
if (date == null) {
writeField(label, "");
} else {
writeField(label, DATE.format((date)));
}
}
private void writeField(String label, Object value) {
builder.append(label);
if (!label.endsWith("?") && !label.endsWith(":")) {
builder.append(":");
}
builder.append(" ");
if (value != null) {
builder.append(value.toString());
}
builder.append("\n");
}
}