package org.mifos.framework.fileupload.service; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.mifos.accounts.loan.persistance.LoanDao; import org.mifos.accounts.savings.persistence.GenericDao; import org.mifos.application.admin.servicefacade.ViewOrganizationSettingsServiceFacade; import org.mifos.dto.screen.UploadedFileDto; import org.mifos.framework.fileupload.domain.FileInfoEntity; import org.mifos.framework.fileupload.domain.LoanFileEntity; import org.mifos.framework.hibernate.helper.HibernateTransactionHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; public class LoanFileServiceFileSystem implements LoanFileService { private static final Logger logger = LoggerFactory.getLogger(LoanFileServiceFileSystem.class); @Autowired private HibernateTransactionHelper hibernateTransactionHelper; @Autowired private GenericDao genericDao; @Autowired private LoanDao loanDao; @Autowired private ViewOrganizationSettingsServiceFacade viewOrganizationSettingsServiceFacade; public boolean create(Integer accountId, InputStream in, UploadedFileDto uploadedFileDto) { try { String storageDir = viewOrganizationSettingsServiceFacade.getLoanStorageDirectory(); String fileDir = storageDir + File.separator + accountId.toString(); File file = new File(fileDir + File.separator + uploadedFileDto.getName()); if (file.exists() || loanDao.getLoanUploadedFileByName(accountId, uploadedFileDto.getName()) != null) { return update(accountId, in, uploadedFileDto); } FileInfoEntity fileInfo = FileStorageManager.createFile(in, fileDir, uploadedFileDto); hibernateTransactionHelper.startTransaction(); LoanFileEntity loanFile = new LoanFileEntity(); loanFile.setLoanId(accountId); loanFile.setFileInfo(fileInfo); genericDao.getSession().save(loanFile); hibernateTransactionHelper.commitTransaction(); } catch (IOException e) { logger.error("Unable to persist", e); return false; } catch (Exception e) { hibernateTransactionHelper.rollbackTransaction(); } return true; } public UploadedFileDto read(Long fileId) { LoanFileEntity loanFileEntity = loanDao.getUploadedFile(fileId); return new UploadedFileDto(loanFileEntity.getFileId(), loanFileEntity.getFileInfo().getName(), loanFileEntity.getFileInfo().getContentType(), loanFileEntity.getFileInfo().getSize(), loanFileEntity.getFileInfo().getDescription(), loanFileEntity.getFileInfo().getUploadDate()); } public List<UploadedFileDto> readAll(Integer accountId) { List<LoanFileEntity> loanFileEntities = loanDao.getLoanAllUploadedFiles(accountId); List<UploadedFileDto> uploadedFiles = new ArrayList<UploadedFileDto>(); for (LoanFileEntity entity : loanFileEntities) { FileInfoEntity fileInfo = entity.getFileInfo(); Long uploadFileId = entity.getFileId(); String fileName = fileInfo.getName(); String contentType = fileInfo.getContentType(); Integer fileSize = fileInfo.getSize(); String description = fileInfo.getDescription(); java.util.Date uploadDate = fileInfo.getUploadDate(); uploadedFiles.add(new UploadedFileDto(uploadFileId, fileName, contentType, fileSize, description, uploadDate)); } return uploadedFiles; } public boolean update(Integer accountId, InputStream in, UploadedFileDto uploadedFileDto) { LoanFileEntity loanFile = loanDao.getLoanUploadedFileByName(accountId, uploadedFileDto.getName()); if (loanFile == null) { return create(accountId, in, uploadedFileDto); } try { String storageDir = viewOrganizationSettingsServiceFacade.getLoanStorageDirectory(); String fileDir = storageDir + File.separator + accountId.toString(); FileInfoEntity updateFileInfo = FileStorageManager.updateFile(in, fileDir, loanFile.getFileInfo(), uploadedFileDto); if (updateFileInfo == null) { return false; } hibernateTransactionHelper.startTransaction(); genericDao.getSession().save(updateFileInfo); hibernateTransactionHelper.commitTransaction(); } catch (IOException e) { logger.error("Unable to persist", e); return false; } catch (Exception e) { hibernateTransactionHelper.rollbackTransaction(); } return true; } public boolean delete(Integer accountId, Long fileId) { LoanFileEntity loanFile = loanDao.getUploadedFile(fileId); if (loanFile != null) { FileInfoEntity fileInfo = loanFile.getFileInfo(); hibernateTransactionHelper.startTransaction(); genericDao.getSession().delete(loanFile); hibernateTransactionHelper.commitTransaction(); return FileStorageManager.delete(viewOrganizationSettingsServiceFacade.getLoanStorageDirectory() + File.separator + accountId.toString() + File.separator + fileInfo.getName()); } else { return false; } } public byte[] getData(UploadedFileDto uploadedFileDto) { LoanFileEntity loanFile = loanDao.getUploadedFile(uploadedFileDto.getUploadedFileId()); if (loanFile == null || loanFile.getFileInfo() == null) { return new byte[0]; } else { final String path = viewOrganizationSettingsServiceFacade.getLoanStorageDirectory() + File.separator + loanFile.getLoanId().toString() + File.separator + loanFile.getFileInfo().getName(); return FileStorageManager.getData(path); } } public boolean checkIfFileExists(Integer accountId, String fileName) { String storageDir = viewOrganizationSettingsServiceFacade.getLoanStorageDirectory(); String fileDir = storageDir + File.separator + accountId.toString(); File file = new File(fileDir + File.separator + fileName); if (file.exists()) { return true; } else { return false; } } }