package org.libreplan.web.orders.files; import org.libreplan.business.orders.daos.IOrderFileDAO; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderFile; import org.libreplan.business.users.entities.User; import org.libreplan.web.common.IConfigurationModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.zkoss.zkplus.spring.SpringUtil; import java.io.File; import java.util.Date; import java.util.List; /** * @author Vova Perebykivskyi <vova@libreplan-enterprise.com> */ @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class OrderFileModel implements IOrderFileModel { public static final String UNKNOWN_FILE_EXTENSION = "Unknown type"; @Autowired private IOrderFileDAO fileDAO; private OrderFile orderFile; private IConfigurationModel configurationModel; @Override @Transactional public void confirmSave() { fileDAO.save(orderFile); } @Override public void setFileName(String name) { orderFile.setName(name); } @Override public void setFileType(String type) { orderFile.setType(type); } @Override public void setUploadDate(Date date) { orderFile.setDate(date); } @Override public void setUploader(User user) { orderFile.setUploader(user); } @Override public void setParent(OrderElement project) { orderFile.setParent(project); } @Override public void createNewFileObject() { orderFile = new OrderFile(); } @Override @Transactional public List<OrderFile> getAll() { return fileDAO.getAll(); } /** * This method is used to delete OrderFile and physical file asociated with it. * Also different cases can occur: * - First case: there is no troubles and OrderFile is deleted from database * and physical file is deleted from disc. * - Second case: there is some troubles with deleting physical file from disc, but * OrderFile is deleted from database. * * @param file {@link OrderFile} that needs to be deleted. * @return true if file was deleted successfully. * @return false if file was not successfully deleted . */ @Override @Transactional public boolean delete(OrderFile file) { fileDAO.delete(file); return deletePhysicalFile(file); } @Override @Transactional public List<OrderFile> findByParent(OrderElement parent) { return fileDAO.findByParent(parent); } @Override public OrderFile getOrderFile() { return orderFile; } private boolean deletePhysicalFile (OrderFile file) { try { configurationModel = (IConfigurationModel) SpringUtil.getBean("configurationModel"); configurationModel.init(); String projectCode = file.getParent().getCode(); String directory = configurationModel.getRepositoryLocation() + "orders" + "/" + projectCode; File fileToDelete; if (UNKNOWN_FILE_EXTENSION.equals(file.getType())) { fileToDelete = new File(directory + "/" + file.getName()); } else { fileToDelete = new File(directory + "/" + file.getName() + "." + file.getType()); } return fileToDelete.delete(); } catch (Exception ignored) { /* * org.zkoss.zk.ui.Execution("SpringUtil can be called only under ZK environment!") can occur if * ZK environment is not raised, this can occur in JUnit tests */ return false; } } }