/*
* Copyright (c) 2016 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.api.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URI;
import java.util.*;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
import com.emc.storageos.coordinator.client.model.CoordinatorClassInfo;
import com.emc.storageos.coordinator.client.model.CoordinatorSerializable;
import com.emc.storageos.coordinator.exceptions.CoordinatorException;
import com.emc.storageos.coordinator.exceptions.FatalCoordinatorException;
import com.emc.storageos.db.client.model.uimodels.OrderStatus;
import com.emc.vipr.model.catalog.OrderJobInfo;
public class OrderJobStatus implements CoordinatorSerializable {
private static final Logger log = LoggerFactory.getLogger(OrderJobStatus.class);
private static final ObjectMapper mapper = new ObjectMapper().enableDefaultTyping();
private OrderServiceJob.JobType type;
private OrderStatus status = null;
private long startTime = -1;
private long endTime = -1;
private List<URI> tids;
private List<URI> orderIDs = new ArrayList(); //orders to be downloaded given by REST API
//for audit log
private URI tenantId;
private URI userId;
// Total number orders to be deleted in this job
private long total = -1;
// key=timestamp when this round of deleting happens
// value = number of orders deleted in this round
private TreeMap<Long, Long> completedMap = new TreeMap<>();
private long nCompleted = 0; // number of Order objects physically deleted from the DB
private long nFailed = 0; // Number of Orders failed to be deleted or downloaded so far
private long timeUsedPerOrder = -1; //The time used to delete or download an order
// used to deserialize from ZK
public OrderJobStatus() {
}
public OrderJobStatus(OrderServiceJob.JobType type, long startTime, long endTime, List<URI> tids,
URI tid, URI uid, OrderStatus status) {
this.type = type;
this.status = status;
this.startTime = startTime;
this.endTime = endTime;
this.tids = tids;
this.tenantId = tid;
this.userId = uid;
}
public List<URI> getOrderIDs() {
return orderIDs;
}
public void setOrderIDs(List<URI> orderIDs) {
this.orderIDs = orderIDs;
total = orderIDs.size();
}
public OrderServiceJob.JobType getType() {
return type;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public TreeMap<Long, Long> getCompleted() {
return completedMap;
}
public void addCompleted(long n) {
long now = System.currentTimeMillis();
completedMap.put(now, n);
}
public URI getTenantId() {
return tenantId;
}
public URI getUserId() {
return userId;
}
public OrderStatus getStatus() {
return status;
}
public long getNCompleted() {
return nCompleted;
}
public void setNCompleted(long n) {
nCompleted = n;
}
@JsonIgnore
private long getCompletedNumber() {
long completed = 0;
for (long n : completedMap.values()) {
completed += n;
}
completed += nCompleted;
return completed;
}
@JsonIgnore
public void addToDeletedNumber(long n) {
nCompleted += n;
}
@JsonIgnore
public boolean isFinished() {
return (getCompletedNumber() + nFailed) == total;
}
public long getFailed() {
return nFailed;
}
public void setFailed(long n) {
nFailed = n;
}
@JsonIgnore
public void addFailed(long n) {
nFailed +=n;
}
public long getTimeUsedPerOrder() {
return timeUsedPerOrder;
}
public void setTimeUsedPerOrder(long timeUsedPerOrder) {
this.timeUsedPerOrder = timeUsedPerOrder;
}
public List<URI> getTids() {
return tids;
}
@Override
public String encodeAsString() {
return toString();
}
@Override
public OrderJobStatus decodeFromString(String infoStr) throws FatalCoordinatorException {
try {
mapper.readerForUpdating(this).readValue(infoStr);
return this;
} catch (IOException e) {
log.error("Failed to decode data string", e);
throw CoordinatorException.fatals.decodingError(e.getMessage());
}
}
@Override
public String toString() {
try {
String str = mapper.writeValueAsString(this);
return str;
} catch (IOException e) {
log.error("Failed to serialize this object", e);
}
return null;
}
@Override
@JsonIgnore
public CoordinatorClassInfo getCoordinatorClassInfo() {
return null;
}
@JsonIgnore
public OrderJobInfo toOrderJobInfo() {
OrderJobInfo info = new OrderJobInfo();
info.setTotal(total);
info.setStartTime(startTime);
info.setEndTime(endTime);
info.setCompleted(getCompletedNumber());
info.setFailed(getFailed());
info.setTimeUsedPerOrder(timeUsedPerOrder);
info.setTids(Collections.unmodifiableList(tids));
return info;
}
}