/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package models.datatable; import java.net.URI; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; import com.emc.sa.util.ResourceType; import com.emc.storageos.model.TaskResourceRep; import play.mvc.Router; import util.TagUtils; import util.TaskUtils; import util.datatable.DataTable; import com.google.common.collect.Lists; import com.google.common.collect.Maps; public class TasksDataTable extends DataTable { // Currently the backend only shows progresses of 0 or 100, so for show this as the miminum progress private static final int MINIMUM_TASK_PROGRESS = 10; public TasksDataTable() { setupTable(false); } public TasksDataTable(boolean addResourceColumn) { setupTable(addResourceColumn); } private void setupTable(boolean addResourceColumn) { addColumn("creationTime").hidden().setSearchable(false); addColumn("systemName").hidden(); addColumn("id").hidden().setSearchable(false); addColumn("orderNumber").hidden(); addColumn("name"); if (addResourceColumn) { addColumn("resourceId").setSearchable(false).setRenderFunction("render.taskResource"); addColumn("resourceName").hidden(); } addColumn("taskProgress").setSearchable(false).setRenderFunction("render.taskProgress"); addColumn("state").setRenderFunction("render.taskState"); addColumn("displayState").hidden(); addColumn("start").setRenderFunction("render.taskStart"); addColumn("elapsed").setRenderFunction("render.taskElapsed"); setDefaultSort("start", "desc"); setRowCallback("createRowLink"); } public static List<Task> fetch(URI resourceId) { if (resourceId == null) { return Collections.EMPTY_LIST; } List<TaskResourceRep> clientTasks = TaskUtils.getTasks(resourceId); List<Task> dataTableTasks = Lists.newArrayList(); if (clientTasks != null) { for (TaskResourceRep clientTask : clientTasks) { dataTableTasks.add(new Task(clientTask)); } } return dataTableTasks; } public static class Task { public String name; public String rowLink; public String resourceId; public String resourceType; public String resourceName; public String id; public String state; public String displayState; public String description; public String message; public Long start; public Long end; public Long creationTime; public Integer progress = 0; public Integer errorCode; public String errorCodeDescription; public String errorDetails; public String orderId; public String orderNumber; public Task(TaskResourceRep taskResourceRep) { load(taskResourceRep); } public Task(com.emc.vipr.client.Task<?> clientTask) { load(clientTask.getTaskResource()); } private void load(TaskResourceRep taskResourceRep) { if (taskResourceRep.getServiceError() != null) { this.errorCode = taskResourceRep.getServiceError().getCode(); this.errorCodeDescription = taskResourceRep.getServiceError().getCodeDescription(); this.errorDetails = taskResourceRep.getServiceError().getDetailedMessage(); } this.name = taskResourceRep.getName(); if (taskResourceRep.getCreationTime() != null) { this.creationTime = taskResourceRep.getCreationTime().getTimeInMillis(); } this.id = taskResourceRep.getId().toString(); if (taskResourceRep.getResource() != null && taskResourceRep.getResource().getId() != null) { this.resourceId = taskResourceRep.getResource().getId().toString(); this.resourceType = ResourceType.fromResourceId(this.resourceId).toString(); this.resourceName = taskResourceRep.getResource().getName(); } this.state = taskResourceRep.getState(); this.displayState = Objects.equals(this.state, "ready") ? "complete" : this.state; this.description = taskResourceRep.getDescription(); this.message = taskResourceRep.getMessage(); if (taskResourceRep.getStartTime() != null) { this.start = taskResourceRep.getStartTime().getTimeInMillis(); } if (taskResourceRep.getEndTime() != null) { // Add 1 millisecond as some tasks start/end at the exact same time which doesn't show on UI this.end = taskResourceRep.getEndTime().getTimeInMillis() + 1; } if (taskResourceRep.getProgress() != null) { this.progress = Math.max(taskResourceRep.getProgress(), MINIMUM_TASK_PROGRESS); } this.orderId = TagUtils.getOrderIdTagValue(taskResourceRep); this.orderNumber = TagUtils.getOrderNumberTagValue(taskResourceRep); // Create Row Link Map<String, Object> args = Maps.newHashMap(); args.put("taskId", id); this.rowLink = Router.reverse("Tasks.details", args).url; // Temporary Fix since ERROR tasks don't show as complete if (Objects.equals(taskResourceRep.getState(), "error")) { progress = 100; } } } }