package cz.nkp.differ.io;
import cz.nkp.differ.dao.ImageDAO;
import cz.nkp.differ.exceptions.FatalDifferException;
import cz.nkp.differ.exceptions.ImageDifferException;
import cz.nkp.differ.model.Image;
import cz.nkp.differ.model.User;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
public class ImageManager {
private ImageDAO imageDAO;
private File uploadDirectory;
private List<String> supportedExtensions;
private int maxSize = -1;
public ImageManager() {
}
public ImageManager(ImageDAO imageDAO, File directory) {
if (!directory.exists()) {
throw new FatalDifferException(directory.getAbsolutePath() + " does not exists!");
}
this.imageDAO = imageDAO;
this.uploadDirectory = directory;
}
public ImageDAO getImageDAO() {
return imageDAO;
}
public void setImageDAO(ImageDAO imageDAO) {
this.imageDAO = imageDAO;
}
public File getUploadDirectory() {
return uploadDirectory;
}
public void setUploadDirectory(File uploadDirectory) {
this.uploadDirectory = uploadDirectory;
}
public List<String> getSupportedExtensions() {
return supportedExtensions;
}
public void setSupportedExtensions(List<String> supportedExtensions) {
this.supportedExtensions = supportedExtensions;
}
public int getMaxSize() {
return maxSize;
}
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
public boolean isSupportedByExtension(String fileName) {
int dotAt = fileName.lastIndexOf('.');
if (dotAt != -1) {
String extension = fileName.substring(dotAt + 1);
if (supportedExtensions == null || supportedExtensions.isEmpty()) {
return true;
} else {
return supportedExtensions.contains(extension);
}
} else {
return false;
}
}
public boolean checkIfFileSizeIsOK(long size) {
if (maxSize > 0) {
return (size < maxSize);
} else {
return true;
}
}
public Image uploadImage(User user, File source) throws ImageDifferException {
return this.uploadImage(user, source, null);
}
public Image uploadImage(User user, File source, String fileName) throws ImageDifferException {
if (fileName != null) {
if (!isSupportedByExtension(fileName)) {
StringBuilder extensions = new StringBuilder();
String sep = "";
for (String ext : supportedExtensions) {
extensions.append(sep).append(ext);
sep = ", ";
}
throw new ImageDifferException(ImageDifferException.ErrorCode.UNSUPPORTED_EXTENSION,
String.format("Image extension is not supported, supported extensions are: %s.", extensions.toString()));
}
}
if (!checkIfFileSizeIsOK(source.length())) {
throw new ImageDifferException(ImageDifferException.ErrorCode.FILE_SIZE_EXCEEDED,
String.format("File size limit exceeded, limit is %s bytes.", this.getMaxSize()));
}
File destination = null;
try {
File userDirectory = this.getUserDirectory(user.getId());
if (fileName == null) {
destination = new File(userDirectory, source.getName());
} else {
destination = new File(userDirectory, fileName);
}
FileUtils.copyFile(source, destination, true);
} catch (IOException ioe) {
throw new ImageDifferException(ImageDifferException.ErrorCode.IMAGE_UPLOAD_ERROR, "Error when uploading file!", ioe);
}
Image image = new Image();
image.setFileName(destination.getName());
image.setUniqueName(destination.getName());
image.setOwnerId(user.getId());
image.setSize((int) destination.length());
image.setFile(destination);
imageDAO.addImage(image);
return image;
}
public List<Image> getImages(User user) {
List<Image> images = imageDAO.getImagesForUser(user);
List<Image> sharedImages = imageDAO.getSharedImages();
for (Image img : sharedImages) {
if (img.getOwnerId() != user.getId()) {
images.add(img);
}
}
for (Image image : images) {
File userDirectory = this.getUserDirectory(image.getOwnerId());
image.setFile(new File(userDirectory, image.getUniqueName()));
}
return images;
}
public boolean deleteImage(User user, Image image) {
if (image.getOwnerId() == user.getId()) {
if (image.getFile().delete() || !image.getFile().exists()) {
imageDAO.deleteImage(image);
}
return true;
} else {
return false;
}
}
public void updateImage(Image image) {
imageDAO.updateImage(image);
}
protected File getUserDirectory(int userId) {
return new File(uploadDirectory, Integer.toString(userId));
}
}