/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package controllers.catalog;
import static com.emc.vipr.client.core.util.ResourceUtils.uri;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import models.datatable.CatalogImageDataTable;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import play.data.binding.As;
import play.data.validation.Required;
import play.data.validation.Validation;
import play.i18n.Messages;
import play.libs.MimeTypes;
import play.mvc.Controller;
import play.mvc.With;
import util.CatalogImageUtils;
import util.MessagesUtils;
import util.ValidationResponse;
import util.datatable.DataTablesSupport;
import com.emc.vipr.model.catalog.CatalogImageCommonParam;
import com.emc.vipr.model.catalog.CatalogImageCreateParam;
import com.emc.vipr.model.catalog.CatalogImageRestRep;
import com.emc.vipr.model.catalog.CatalogImageUpdateParam;
import com.google.common.collect.Lists;
import controllers.Common;
import controllers.deadbolt.Restrict;
import controllers.deadbolt.Restrictions;
import controllers.util.Models;
@With(Common.class)
@Restrictions({ @Restrict("TENANT_ADMIN") })
public class CatalogImages extends Controller {
protected static final String SAVED = "CatalogImage.saved";
protected static final String DELETED = "CatalogImage.deleted";
public static void view(String id) {
CatalogImageRestRep image = CatalogImageUtils.getCatalogImage(uri(id));
String name = image.getName();
String contentType = image.getContentType();
byte[] data = image.getData();
int length = data.length;
renderBinary(new ByteArrayInputStream(data), name, length, contentType, false);
}
public static void list() {
CatalogImageDataTable dataTable = new CatalogImageDataTable();
render(dataTable);
}
public static void listJson() {
List<CatalogImageDataTable.ImageInfo> imageInfos = Lists.newArrayList();
List<CatalogImageRestRep> catalogImages = CatalogImageUtils.getCatalogImages();
for (CatalogImageRestRep catalogImage : catalogImages) {
imageInfos.add(new CatalogImageDataTable.ImageInfo(catalogImage));
}
renderJSON(DataTablesSupport.createJSON(imageInfos, params));
}
public static void create() {
render("@edit");
}
public static void edit(String id) {
CatalogImageRestRep image = CatalogImageUtils.getCatalogImage(uri(id));
String name = image.getName();
render(id, name);
}
public static void delete(@As(",") String[] ids) {
if (ids != null && ids.length > 0) {
for (String id : ids) {
CatalogImageUtils.deleteCatalogImage(uri(id));
}
flash.success(MessagesUtils.get(DELETED));
}
list();
}
public static void save(String id, String name, File file, String referrerUrl) {
if (StringUtils.isBlank(id) || file == null) {
Validation.required("file", file);
}
if (file != null) {
String contentType = MimeTypes.getContentType(file.getName());
if (!StringUtils.startsWith(contentType, "image/")) {
Validation.addError("file", Messages.get("catalogImage.invalidContentType", contentType));
}
}
if (Validation.hasErrors()) {
Common.handleError();
}
CatalogImageRestRep image = save(id, name, file);
flash.success(MessagesUtils.get(SAVED, image.getId(), image.getName()));
if (!StringUtils.isEmpty(referrerUrl)) {
redirect(referrerUrl);
} else {
list();
}
}
public static void saveJson(String name, @Required File file) {
if (Validation.hasErrors()) {
List<ValidationResponse> response = ValidationResponse.collectErrors();
renderJSON(response);
}
CatalogImageRestRep image = save(null, name, file);
renderJSON(ValidationResponse.valid(image.getId().toString()));
}
private static CatalogImageRestRep save(String id, String name, File file) {
CatalogImageRestRep catalogImage = null;
if (StringUtils.isNotBlank(id)) {
CatalogImageUpdateParam updateParam = new CatalogImageUpdateParam();
writeCommon(name, file, updateParam);
catalogImage = CatalogImageUtils.updateCatalogImage(uri(id), updateParam);
}
else {
CatalogImageCreateParam createParam = new CatalogImageCreateParam();
createParam.setTenant(uri(Models.currentAdminTenant()));
writeCommon(name, file, createParam);
catalogImage = CatalogImageUtils.createCatalogImage(createParam);
}
return catalogImage;
}
private static void writeCommon(String name, File file, CatalogImageCommonParam commonParam) {
if (file != null) {
String label = StringUtils.defaultIfBlank(name, StringUtils.substringBeforeLast(file.getName(), "."));
String contentType = MimeTypes.getContentType(file.getName());
byte[] data = read(file);
commonParam.setName(label);
commonParam.setContentType(contentType);
commonParam.setData(data);
}
else {
commonParam.setName(name);
}
}
private static byte[] read(File file) {
byte[] data = null;
try {
data = FileUtils.readFileToByteArray(file);
} catch (IOException e) {
error(e);
}
return data;
}
}