package net.techreadiness.service; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.jws.WebService; import net.techreadiness.persistence.dao.FileDAO; import net.techreadiness.persistence.dao.FileErrorDAO; import net.techreadiness.persistence.dao.FileTypeDAO; import net.techreadiness.persistence.dao.OrgDAO; import net.techreadiness.persistence.dao.UserDAO; import net.techreadiness.persistence.domain.FileDO; import net.techreadiness.persistence.domain.FileErrorDO; import net.techreadiness.persistence.domain.FileTypeDO; import net.techreadiness.persistence.domain.OrgDO; import net.techreadiness.persistence.domain.UserDO; import net.techreadiness.service.common.ValidationError; import net.techreadiness.service.exception.FaultInfo; import net.techreadiness.service.exception.ServiceException; import net.techreadiness.service.exception.ValidationServiceException; import net.techreadiness.service.object.File; import net.techreadiness.service.object.FileType; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @WebService @Service @Transactional public class FileServiceImpl extends BaseServiceImpl implements FileService { @Inject private FileDAO fileDAO; @Inject private FileErrorDAO fileErrorDAO; @Inject private FileTypeDAO fileTypeDAO; @Inject private UserDAO userDAO; @Inject private OrgDAO orgDAO; @Value("${file.upload.dir}") private String fileUploadDir; @Value("${file.temp.export.dir}") private String fileTempExportDir; @Override public File getById(ServiceContext context, Long fileId) { return getMappingService().map(fileDAO.getById(fileId)); } @Override public File addOrUpdate(ServiceContext context, File file) { FileDO fileDO; if (file.getFileId() == null) { fileDO = getMappingService().map(file); } else { fileDO = fileDAO.getById(file.getFileId()); // don't allow these to get mapped file.setFileErrors(null); getMappingService().getMapper().map(file, fileDO); } UserDO userDO = userDAO.getById(context.getUserId()); OrgDO orgDO = orgDAO.getById(context.getOrgId()); FileTypeDO fileTypeDO = fileTypeDAO.getByCode(file.getFileTypeCode()); if (userDO != null) { fileDO.setUser(userDO); } if (orgDO != null) { fileDO.setOrg(orgDO); } if (StringUtils.isEmpty(file.getFileTypeCode())) { FaultInfo faultInfo = new FaultInfo(); ValidationError error = new ValidationError("fileTypeCode", "No fileTypeCode was provided.", "The file type code was not specified."); faultInfo.getAttributeErrors().add(error); throw new ValidationServiceException(faultInfo); } if (fileTypeDO == null) { FaultInfo faultInfo = new FaultInfo(); ValidationError error = new ValidationError("fileTypeCode", "An invalid fileTypeCode was provided.", "The file type code can not be found."); faultInfo.getAttributeErrors().add(error); throw new ValidationServiceException(faultInfo); } fileDO.setFileType(fileTypeDO); if (file.getFileId() == null) { return getMappingService().map(fileDAO.create(fileDO)); } return getMappingService().map(fileDAO.update(fileDO)); } @Override public File setFileStatus(ServiceContext context, Long fileId, FileStatus fileStatus) { FileDO fileDO = fileDAO.getById(fileId); if (fileDO == null) { throw new ServiceException("Invalid fileId."); } fileDO.setStatus(fileStatus.toString().toLowerCase()); return getMappingService().map(fileDAO.update(fileDO)); } @Override public File addErrors(ServiceContext context, Long fileId, Integer lineNumber, Map<String, List<String>> errors) { FileDO fileDO = fileDAO.getById(fileId); if (fileDO == null) { throw new ServiceException("Invalid fileId."); } if (errors == null || errors.size() == 0) { // nothing to do, maybe should be an error? return getMappingService().map(fileDO); } for (Map.Entry<String, List<String>> entry : errors.entrySet()) { for (String s : entry.getValue()) { FileErrorDO fileErrorDO = new FileErrorDO(); fileErrorDO.setFile(fileDO); String errorCode = "unknown"; if (StringUtils.isNotBlank(entry.getKey())) { errorCode = entry.getKey(); } fileErrorDO.setErrorCode(errorCode); fileErrorDO.setRecordNumber(lineNumber); fileErrorDO.setMessage(s); fileErrorDAO.create(fileErrorDO); } } return getMappingService().map(fileDAO.update(fileDO)); } @Override public File setFileStatusMessage(ServiceContext context, Long fileId, String statusMessage) { FileDO fileDO = fileDAO.getById(fileId); if (fileDO == null) { throw new ServiceException("Invalid fileId."); } fileDO.setStatusMessage(statusMessage); return getMappingService().map(fileDAO.update(fileDO)); } @Override public String getUploadDir(ServiceContext context) { if (StringUtils.isBlank(fileUploadDir)) { String tempDir = System.getProperty("java.io.tmpdir") + java.io.File.separator + "uploads"; java.io.File f = new java.io.File(tempDir); f.mkdirs(); fileUploadDir = tempDir; } return fileUploadDir; } @Override public String getTempExportDir(ServiceContext context) { if (StringUtils.isBlank(fileTempExportDir)) { String tempDir = System.getProperty("java.io.tmpdir") + java.io.File.separator + "uploads"; java.io.File f = new java.io.File(tempDir); f.mkdirs(); fileTempExportDir = tempDir; } return fileTempExportDir; } public String getFileUploadDir() { return fileUploadDir; } public void setFileUploadDir(String fileUploadDir) { this.fileUploadDir = fileUploadDir; } public String getFileTempExportDir() { return fileTempExportDir; } public void setFileTempExportDir(String fileTempExportDir) { this.fileTempExportDir = fileTempExportDir; } @Override public List<FileType> findFileTypes(ServiceContext context) { return getMappingService().mapFromDOList(fileTypeDAO.findAll()); } }