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.savings.persistence.GenericDao; import org.mifos.application.admin.servicefacade.ViewOrganizationSettingsServiceFacade; import org.mifos.customers.persistence.CustomerDao; import org.mifos.dto.screen.UploadedFileDto; import org.mifos.framework.fileupload.domain.ClientFileEntity; import org.mifos.framework.fileupload.domain.FileInfoEntity; import org.mifos.framework.hibernate.helper.HibernateTransactionHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; public class ClientFileServiceFileSystem implements ClientFileService { private static final Logger logger = LoggerFactory.getLogger(ClientFileServiceFileSystem.class); @Autowired private HibernateTransactionHelper hibernateTransactionHelper; @Autowired private GenericDao genericDao; @Autowired private CustomerDao customerDao; @Autowired private ViewOrganizationSettingsServiceFacade viewOrganizationSettingsServiceFacade; public boolean create(Integer clientId, InputStream in, UploadedFileDto uploadedFileDto) { try { String storageDir = viewOrganizationSettingsServiceFacade.getClientStorageDirectory(); String fileDir = storageDir + File.separator + clientId.toString(); File file = new File(fileDir + File.separator + uploadedFileDto.getName()); if (file.exists() || customerDao.getClientUploadedFileByName(clientId, uploadedFileDto.getName()) != null) { return update(clientId, in, uploadedFileDto); } FileInfoEntity fileInfo = FileStorageManager.createFile(in, fileDir, uploadedFileDto); hibernateTransactionHelper.startTransaction(); ClientFileEntity clientFile = new ClientFileEntity(); clientFile.setClientId(clientId); clientFile.setFileInfo(fileInfo); genericDao.getSession().save(clientFile); 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) { ClientFileEntity clientFileEntity = customerDao.getUploadedFile(fileId); return new UploadedFileDto(clientFileEntity.getFileId(), clientFileEntity.getFileInfo().getName(), clientFileEntity.getFileInfo().getContentType(), clientFileEntity.getFileInfo().getSize(), clientFileEntity.getFileInfo().getDescription(), clientFileEntity.getFileInfo().getUploadDate()); } public List<UploadedFileDto> readAll(Integer clientId) { List<ClientFileEntity> clientFileEntities = customerDao.getClientAllUploadedFiles(clientId); List<UploadedFileDto> uploadedFiles = new ArrayList<UploadedFileDto>(); for (ClientFileEntity entity : clientFileEntities) { 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 clientId, InputStream in, UploadedFileDto uploadedFileDto) { ClientFileEntity clientFile = customerDao.getClientUploadedFileByName(clientId, uploadedFileDto.getName()); if (clientFile == null) { return create(clientId, in, uploadedFileDto); } try { String storageDir = viewOrganizationSettingsServiceFacade.getClientStorageDirectory(); String fileDir = storageDir + File.separator + clientId.toString(); FileInfoEntity updateFileInfo = FileStorageManager.updateFile(in, fileDir, clientFile.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 clientId, Long fileId) { ClientFileEntity clientFile = customerDao.getUploadedFile(fileId); if (clientFile != null) { FileInfoEntity fileInfo = clientFile.getFileInfo(); hibernateTransactionHelper.startTransaction(); genericDao.getSession().delete(clientFile); hibernateTransactionHelper.commitTransaction(); return FileStorageManager.delete(viewOrganizationSettingsServiceFacade.getClientStorageDirectory() + File.separator + clientId.toString() + File.separator + fileInfo.getName()); } else { return false; } } public byte[] getData(UploadedFileDto uploadedFileDto) { ClientFileEntity clientFile = customerDao.getUploadedFile(uploadedFileDto.getUploadedFileId()); if (clientFile == null || clientFile.getFileInfo() == null) { return new byte[0]; } else { final String path = viewOrganizationSettingsServiceFacade.getClientStorageDirectory() + File.separator + clientFile.getClientId().toString() + File.separator + clientFile.getFileInfo().getName(); return FileStorageManager.getData(path); } } public boolean checkIfFileExists(Integer clientId, String fileName) { String storageDir = viewOrganizationSettingsServiceFacade.getClientStorageDirectory(); String fileDir = storageDir + File.separator + clientId.toString(); File file = new File(fileDir + File.separator + fileName); if (file.exists()) { return true; } else { return false; } } }