package org.mifos.framework.image.service;
import java.io.IOException;
import java.io.InputStream;
import org.mifos.accounts.savings.persistence.GenericDao;
import org.mifos.customers.client.util.helpers.ClientConstants;
import org.mifos.framework.hibernate.helper.HibernateTransactionHelper;
import org.mifos.framework.image.domain.ClientPhoto;
import org.mifos.framework.image.domain.ImageInfo;
import org.mifos.service.BusinessRuleException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class ClientPhotoServiceFileSystem implements ClientPhotoService {
private static final Logger LOG = LoggerFactory.getLogger(ClientPhotoServiceFileSystem.class);
@Autowired
private HibernateTransactionHelper hibernateTransactionHelper;
@Autowired
private GenericDao genericDao;
@Override
public boolean create(Long clientId, InputStream in) {
try {
ImageInfo imInfo = ImageStorageManager.createImage(in, clientId.toString());
if(imInfo == null) {
return false;
}
hibernateTransactionHelper.startTransaction();
ClientPhoto clientPhoto = new ClientPhoto();
clientPhoto.setClientId(clientId);
clientPhoto.setImageInfo(imInfo);
genericDao.getSession().save(clientPhoto);
hibernateTransactionHelper.commitTransaction();
} catch (IOException e) {
LOG.error("Unable to persist", e);
return false;
} catch (Exception e) {
hibernateTransactionHelper.rollbackTransaction();
throw new BusinessRuleException(ClientConstants.INVALID_PHOTO, new Object[] { e.getMessage() }, e);
}
return true;
}
@Override
public ClientPhoto read(Long clientId) {
return (ClientPhoto) genericDao.getSession().createQuery("from ClientPhoto cp where cp.clientId=" + clientId)
.uniqueResult();
}
@Override
public boolean update(Long clientId, InputStream in) {
if (in == null) {
return false;
}
ClientPhoto clientPhoto = read(clientId);
if (clientPhoto == null) {
return create(clientId, in);
}
try {
ImageInfo updateImageInfo = ImageStorageManager.updateImage(in, clientPhoto.getImageInfo());
if(updateImageInfo == null) {
return false;
}
hibernateTransactionHelper.startTransaction();
genericDao.getSession().save(updateImageInfo);
hibernateTransactionHelper.commitTransaction();
} catch (IOException e) {
LOG.error("Unable to persist", e);
return false;
} catch (Exception e) {
throw new BusinessRuleException(ClientConstants.INVALID_PHOTO, new Object[] { e.getMessage() }, e);
}
return true;
}
@Override
public boolean delete(Long clientId) {
ClientPhoto clientPhoto = read(clientId);
if (clientPhoto == null) {
return false;
}
ImageInfo imageInfo = clientPhoto.getImageInfo();
hibernateTransactionHelper.startTransaction();
genericDao.getSession().delete(clientPhoto);
hibernateTransactionHelper.commitTransaction();
return ImageStorageManager.delete(imageInfo.getPath());
}
@Override
public byte[] getData(ClientPhoto clientPhoto) {
if (clientPhoto == null || clientPhoto.getImageInfo() == null) {
return new byte[0];
} else {
final String path = clientPhoto.getImageInfo().getPath();
return ImageStorageManager.getData(path);
}
}
}