/*
* Copyright (c) 2017 EMC Corporation
* All Rights Reserved
*/
package util.support;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import com.emc.vipr.client.ViPRCatalogClient2;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.CloseShieldOutputStream;
import play.Logger;
import play.jobs.Job;
import static util.OrderUtils.dateToLongStr;
public class SupportOrderPackageCreator {
private static final String TIMESTAMP = "ddMMyy-HHmm";
private Date startDate;
private Date endDate;
private String tenantIDs;
private String orderIDs;
private ViPRCatalogClient2 client;
public SupportOrderPackageCreator(ViPRCatalogClient2 client) {
this.client = Objects.requireNonNull(client);
}
private ViPRCatalogClient2 api() {
return client;
}
public static String formatTimestamp(Calendar cal) {
final SimpleDateFormat TIME1 = new SimpleDateFormat(TIMESTAMP);
return cal != null ? TIME1.format(cal.getTime()) : "UNKNOWN";
}
public CreateSupportPackageJob createJob(OutputStream out) {
return new CreateSupportPackageJob(out, this);
}
public void writeTo(OutputStream out) throws IOException {
ZipOutputStream zip = new ZipOutputStream(out);
try {
writeOrders(zip);
zip.flush();
} finally {
zip.close();
}
}
private OutputStream nextEntry(ZipOutputStream zip, String path) throws IOException {
Logger.debug("Adding entry: %s", path);
ZipEntry entry = new ZipEntry(path);
zip.putNextEntry(entry);
return new CloseShieldOutputStream(zip);
}
private void writeOrders(ZipOutputStream zip) throws IOException {
String path = "order";
OutputStream stream = nextEntry(zip, path);
InputStream in;
if (orderIDs != null) {
in = api().orders().downloadOrdersAsText(null, null, null, orderIDs, null);
} else {
in = api().orders().downloadOrdersAsText(dateToLongStr(startDate), dateToLongStr(endDate), tenantIDs, null, null);
}
try {
IOUtils.copy(in, stream);
} finally {
in.close();
stream.close();
}
}
/**
* Job that runs to generate a support package.
*/
public static class CreateSupportPackageJob extends Job {
private OutputStream out;
private SupportOrderPackageCreator supportPackage;
public CreateSupportPackageJob(OutputStream out, SupportOrderPackageCreator supportPackage) {
this.out = out;
this.supportPackage = supportPackage;
}
@Override
public void doJob() throws Exception {
supportPackage.writeTo(out);
}
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String getTenantIDs() {
return tenantIDs;
}
public void setTenantIDs(String tenantIDs) {
this.tenantIDs = tenantIDs;
}
public String getOrderIDs() {
return orderIDs;
}
public void setOrderIDs(String orderIDs) {
this.orderIDs = orderIDs;
}
}