From 3073f68e1cc9140c24ffe038c88003a609e0cac5 Mon Sep 17 00:00:00 2001 From: Paul Luchyn Date: Fri, 11 Nov 2016 11:59:47 +0200 Subject: [PATCH 1/5] Fixed bug with foreign key constraint violation while order deleting Code refactor, API changes, changed logic of file and order deleting, minor fixes Code refactoring Test refactor, file deleting logic changes --- .../org/libreplan/web/orders/OrderModel.java | 9 +++ .../web/orders/files/IOrderFileModel.java | 9 ++- .../web/orders/files/OrderFileModel.java | 51 ++++++++++++++- .../orders/files/OrderFilesController.java | 14 ++-- .../libreplan/web/orders/OrderFilesTest.java | 65 +++++++++++++------ 5 files changed, 118 insertions(+), 30 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java index 0dab683e7..0a715b20b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java @@ -59,6 +59,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.business.orders.entities.OrderStatusEnum; +import org.libreplan.business.orders.entities.OrderFile; import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.qualityforms.daos.IQualityFormDAO; import org.libreplan.business.qualityforms.entities.QualityForm; @@ -84,6 +85,7 @@ import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.calendars.BaseCalendarModel; import org.libreplan.web.common.IntegrationEntityModel; import org.libreplan.web.common.concurrentdetection.OnConcurrentModification; +import org.libreplan.web.orders.files.IOrderFileModel; import org.libreplan.web.orders.labels.LabelsOnConversation; import org.libreplan.web.planner.order.ISaveCommand.IBeforeSaveActions; import org.libreplan.web.planner.order.PlanningStateCreator; @@ -169,6 +171,9 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { @Autowired private IOrderVersionDAO orderVersionDAO; + @Autowired + private IOrderFileModel orderFileModel; + private List orderList = new ArrayList<>(); @Override @@ -508,6 +513,10 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { @Transactional public void remove(Order detachedOrder) { Order order = orderDAO.findExistingEntity(detachedOrder.getId()); + + List orderFiles = orderFileModel.findByParent(order); + orderFiles.forEach((orderFile -> orderFileModel.delete(orderFile))); + removeVersions(order); if ( order.hasNoVersions() ) { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/IOrderFileModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/IOrderFileModel.java index 135157c9d..bfee19feb 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/IOrderFileModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/IOrderFileModel.java @@ -30,7 +30,14 @@ public interface IOrderFileModel { List getAll(); - void delete(OrderFile file); + /** + * This method is used to delete OrderFile and physical file asociated with it + * + * @param file {@link OrderFile} that need to be deleted + * @return true if file was deleted successfully. + * @return false if file was not deleted successfully. + */ + boolean delete(OrderFile file); List findByParent(OrderElement parent); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFileModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFileModel.java index 7e074bcfa..4746ef67f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFileModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFileModel.java @@ -4,12 +4,15 @@ 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; @@ -21,11 +24,15 @@ import java.util.List; @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() { @@ -68,10 +75,23 @@ public class OrderFileModel implements IOrderFileModel { 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 void delete(OrderFile file){ + public boolean delete(OrderFile file) { fileDAO.delete(file); + return deletePhysicalFile(file); } @Override @@ -83,4 +103,33 @@ public class OrderFileModel implements IOrderFileModel { 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; + } + } + + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFilesController.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFilesController.java index 794b2f5ab..4e0e9f632 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFilesController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/files/OrderFilesController.java @@ -174,19 +174,13 @@ public class OrderFilesController extends GenericForwardComposer { return; } - if ( isRepositoryExists() ) { - String projectCode = orderElementModel.getOrderElement().getCode(); configurationModel.init(); - String directory = configurationModel.getRepositoryLocation() + "orders" + "/" + projectCode; - File fileToDelete = new File(directory + "/" + file.getName() + "." + file.getType()); - - boolean deleted = fileToDelete.delete(); + boolean deleted = orderFileModel.delete(file); if ( deleted ){ - orderFileModel.delete(file); messages.clearMessages(); messages.showMessage(Level.INFO, "File successfully deleted"); @@ -252,7 +246,11 @@ public class OrderFilesController extends GenericForwardComposer { orderFileModel.createNewFileObject(); orderFileModel.setFileName(FilenameUtils.getBaseName(media.getName())); - orderFileModel.setFileType(FilenameUtils.getExtension(media.getName())); + + orderFileModel.setFileType(FilenameUtils.getExtension(media.getName()).isEmpty() + ? OrderFileModel.UNKNOWN_FILE_EXTENSION + : FilenameUtils.getExtension(media.getName())); + orderFileModel.setUploadDate(new Date()); orderFileModel.setUploader(userDAO.findByLoginName(SecurityUtils.getSessionUserLoginName())); orderFileModel.setParent(orderElementModel.getOrderElement()); diff --git a/libreplan-webapp/src/test/java/org/libreplan/web/orders/OrderFilesTest.java b/libreplan-webapp/src/test/java/org/libreplan/web/orders/OrderFilesTest.java index e876799b7..3c1610837 100644 --- a/libreplan-webapp/src/test/java/org/libreplan/web/orders/OrderFilesTest.java +++ b/libreplan-webapp/src/test/java/org/libreplan/web/orders/OrderFilesTest.java @@ -65,6 +65,17 @@ import java.util.Date; WEBAPP_SPRING_SECURITY_CONFIG_FILE, WEBAPP_SPRING_SECURITY_CONFIG_TEST_FILE }) + +/** + * CRUD test + * 1. Add row to files table + * 2. Read it + * 3. Update it + * 4. Delete it + * + * Negative test + * 1. Create row with null field value and try to save it + */ public class OrderFilesTest { @Autowired @@ -82,30 +93,27 @@ public class OrderFilesTest { @Autowired private IHoursGroupDAO hoursGroupDAO; - /** - * CRUD test - * 1. Add row to files table - * 2. Read it - * 3. Update it - * 4. Delete it - * - * Negative test - * 1. Create row with null field value and try to save it - */ - @Test @Transactional - public void testCRUD() { + public void testCreate() { - // Create int sizeBefore = orderFileModel.getAll().size(); + createEntities(); + int sizeWithNewRow = orderFileModel.getAll().size(); assertEquals(sizeBefore + 1, sizeWithNewRow); - OrderFile orderFile = null; - // Read + removeEntities(); + } + + @Test + @Transactional + public void testRead() { + createEntities(); + + OrderFile orderFile = null; try { orderFile = orderFileModel.findByParent(orderElementDAO.findUniqueByCode("1a1k1k1k")).get(0); assertEquals(orderFile.getName(), "Index"); @@ -113,21 +121,38 @@ public class OrderFilesTest { e.printStackTrace(); } - // Update - orderFile.setName("yii2"); - orderFileModel.confirmSave(); + removeEntities(); + } + @Test + @Transactional + public void testUpdate() { + createEntities(); + + OrderFile orderFile = null; try { orderFile = orderFileModel.findByParent(orderElementDAO.findUniqueByCode("1a1k1k1k")).get(0); + orderFile.setName("yii2"); + orderFileModel.confirmSave(); assertTrue(orderFile.getName().equals("yii2")); } catch (InstanceNotFoundException e) { e.printStackTrace(); } - // Delete removeEntities(); + } + + @Test + @Transactional + public void testDelete() { + createEntities(); + + int sizeBefore = orderFileModel.getAll().size(); + + removeEntities(); + int sizeAfter = orderFileModel.getAll().size(); - assertEquals(sizeBefore, sizeAfter); + assertEquals(sizeBefore - 1, sizeAfter); } @Transactional From 94f10b3866a1882be42856360eed3183843c2275 Mon Sep 17 00:00:00 2001 From: Paul Luchyn Date: Fri, 18 Nov 2016 18:47:18 +0200 Subject: [PATCH 2/5] Fixed null pointer exception when sending email manually Fixed bad timeplotz dependency --- .../importers/notifications/ComposeMessage.java | 9 +++++++++ pom.xml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/importers/notifications/ComposeMessage.java b/libreplan-webapp/src/main/java/org/libreplan/importers/notifications/ComposeMessage.java index 164df3490..55045847a 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/importers/notifications/ComposeMessage.java +++ b/libreplan-webapp/src/main/java/org/libreplan/importers/notifications/ComposeMessage.java @@ -19,6 +19,8 @@ package org.libreplan.importers.notifications; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.libreplan.business.common.entities.ConnectorProperty; import org.libreplan.business.email.entities.EmailNotification; import org.libreplan.business.email.entities.EmailTemplate; @@ -83,6 +85,8 @@ public class ComposeMessage { private Properties properties; + private static final Log LOG = LogFactory.getLog(ComposeMessage.class); + public boolean composeMessageForUser(EmailNotification notification) { // Gather data about EmailTemplate needs to be used @@ -102,6 +106,11 @@ public class ComposeMessage { EmailTemplate currentEmailTemplate = findCurrentEmailTemplate(type, locale); + if (currentEmailTemplate == null) { + LOG.error("Email template is null"); + return false; + } + // Modify text that will be composed String text = currentEmailTemplate.getContent(); text = replaceKeywords(text, currentWorker, notification); diff --git a/pom.xml b/pom.xml index fdfc4ffb2..53140cd2c 100644 --- a/pom.xml +++ b/pom.xml @@ -605,7 +605,7 @@ org.zkoss.zkforge timeplotz - 1.1_50 + 1.1_50_1 From f812889057dc7cd9851b707c8b3cb8768fcde07e Mon Sep 17 00:00:00 2001 From: Paul Luchyn Date: Mon, 21 Nov 2016 12:42:43 +0200 Subject: [PATCH 3/5] Resolved bug with constraint violation when deleting project with risk and issue logs Code refactor --- .../business/logs/daos/IIssueLogDAO.java | 8 +++++++ .../business/logs/daos/IRiskLogDAO.java | 8 +++++++ .../business/logs/daos/IssueLogDAO.java | 9 ++++++++ .../business/logs/daos/RiskLogDAO.java | 10 ++++++++ .../libreplan/web/logs/IIssueLogModel.java | 7 ++++++ .../org/libreplan/web/logs/IRiskLogModel.java | 7 ++++++ .../org/libreplan/web/logs/IssueLogModel.java | 5 ++++ .../org/libreplan/web/logs/RiskLogModel.java | 5 ++++ .../org/libreplan/web/orders/OrderModel.java | 23 ++++++++++++++++--- 9 files changed, 79 insertions(+), 3 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IIssueLogDAO.java b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IIssueLogDAO.java index 95966063d..ee6aa698d 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IIssueLogDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IIssueLogDAO.java @@ -23,6 +23,7 @@ import java.util.List; import org.libreplan.business.common.daos.IIntegrationEntityDAO; import org.libreplan.business.logs.entities.IssueLog; +import org.libreplan.business.orders.entities.Order; /** * Contract for {@link IssueLogDAO} @@ -37,4 +38,11 @@ public interface IIssueLogDAO extends IIntegrationEntityDAO { * @return a list of {@link IssueLog} objects */ List getIssueLogs(); + + /** + * Returns a list of {@link IssueLog} for a specified {@link Order} + * + * @param order parent element for IssueLogs + */ + List getByParent(Order order); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IRiskLogDAO.java b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IRiskLogDAO.java index bcc20a7f6..07cf42af8 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IRiskLogDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IRiskLogDAO.java @@ -23,6 +23,7 @@ import java.util.List; import org.libreplan.business.common.daos.IIntegrationEntityDAO; import org.libreplan.business.logs.entities.RiskLog; +import org.libreplan.business.orders.entities.Order; public interface IRiskLogDAO extends IIntegrationEntityDAO { @@ -33,4 +34,11 @@ public interface IRiskLogDAO extends IIntegrationEntityDAO { */ List getRiskLogs(); + /** + * Returns a list of {@link RiskLog} for a specified {@link Order} + * + * @param order parent element for RiskLogs + */ + List getByParent(Order order); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IssueLogDAO.java b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IssueLogDAO.java index 0bdcd9e37..6c0cce4d3 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IssueLogDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/IssueLogDAO.java @@ -21,8 +21,10 @@ package org.libreplan.business.logs.daos; import java.util.List; +import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.logs.entities.IssueLog; +import org.libreplan.business.orders.entities.Order; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -42,5 +44,12 @@ public class IssueLogDAO extends IntegrationEntityDAO implements return list(IssueLog.class); } + @Override + public List getByParent(Order order) { + return getSession() + .createCriteria(IssueLog.class) + .add(Restrictions.eq("project", order)) + .list(); + } } diff --git a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/RiskLogDAO.java b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/RiskLogDAO.java index 2bce9a40b..265f3b428 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/logs/daos/RiskLogDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/logs/daos/RiskLogDAO.java @@ -21,8 +21,10 @@ package org.libreplan.business.logs.daos; import java.util.List; +import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.logs.entities.RiskLog; +import org.libreplan.business.orders.entities.Order; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @@ -43,4 +45,12 @@ public class RiskLogDAO extends IntegrationEntityDAO implements return list(RiskLog.class); } + @Override + public List getByParent(Order order) { + return getSession() + .createCriteria(RiskLog.class) + .add(Restrictions.eq("project", order)) + .list(); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/logs/IIssueLogModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/logs/IIssueLogModel.java index 813365aa4..ff3f8bd0b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/logs/IIssueLogModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/logs/IIssueLogModel.java @@ -115,5 +115,12 @@ public interface IIssueLogModel { */ void remove(IssueLog issueLog); + /** + * Returns a list of {@link IssueLog} for a specified {@link Order} + * + * @param order parent element for IssueLogs + */ + List getByParent(Order order); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/logs/IRiskLogModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/logs/IRiskLogModel.java index 63893aec7..3d8c0d9b0 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/logs/IRiskLogModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/logs/IRiskLogModel.java @@ -115,5 +115,12 @@ public interface IRiskLogModel { */ void remove(RiskLog riskLog); + /** + * Returns a list of {@link RiskLog} for a specified {@link Order} + * + * @param order parent element for RiskLogs + */ + List getByParent(Order order); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/logs/IssueLogModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/logs/IssueLogModel.java index 652e3c37e..8eec515ab 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/logs/IssueLogModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/logs/IssueLogModel.java @@ -139,6 +139,11 @@ public class IssueLogModel extends IntegrationEntityModel implements IIssueLogMo } } + @Override + public List getByParent(Order order) { + return issueLogDAO.getByParent(order); + } + @Override public EntityNameEnum getEntityName() { return EntityNameEnum.ISSUE_LOG; diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/logs/RiskLogModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/logs/RiskLogModel.java index a90049104..3b89bb061 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/logs/RiskLogModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/logs/RiskLogModel.java @@ -140,6 +140,11 @@ public class RiskLogModel extends IntegrationEntityModel implements IRiskLogMode } } + @Override + public List getByParent(Order order) { + return riskLogDAO.getByParent(order); + } + @Override public EntityNameEnum getEntityName() { return EntityNameEnum.RISK_LOG; diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java index 0a715b20b..43eee6b6c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java @@ -59,7 +59,6 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.business.orders.entities.OrderStatusEnum; -import org.libreplan.business.orders.entities.OrderFile; import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.qualityforms.daos.IQualityFormDAO; import org.libreplan.business.qualityforms.entities.QualityForm; @@ -85,6 +84,8 @@ import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.calendars.BaseCalendarModel; import org.libreplan.web.common.IntegrationEntityModel; import org.libreplan.web.common.concurrentdetection.OnConcurrentModification; +import org.libreplan.web.logs.IIssueLogModel; +import org.libreplan.web.logs.IRiskLogModel; import org.libreplan.web.orders.files.IOrderFileModel; import org.libreplan.web.orders.labels.LabelsOnConversation; import org.libreplan.web.planner.order.ISaveCommand.IBeforeSaveActions; @@ -174,6 +175,12 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { @Autowired private IOrderFileModel orderFileModel; + @Autowired + private IRiskLogModel riskLogModel; + + @Autowired + private IIssueLogModel issueLogModel; + private List orderList = new ArrayList<>(); @Override @@ -514,8 +521,9 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { public void remove(Order detachedOrder) { Order order = orderDAO.findExistingEntity(detachedOrder.getId()); - List orderFiles = orderFileModel.findByParent(order); - orderFiles.forEach((orderFile -> orderFileModel.delete(orderFile))); + removeFiles(order); + + removeLogs(order); removeVersions(order); @@ -524,6 +532,15 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { } } + private void removeLogs(Order order) { + riskLogModel.getByParent(order).forEach(riskLog -> riskLogModel.remove(riskLog)); + issueLogModel.getByParent(order).forEach(issueLog -> issueLogModel.remove(issueLog)); + } + + private void removeFiles(Order order) { + orderFileModel.findByParent(order).forEach(orderFile -> orderFileModel.delete(orderFile)); + } + private void removeVersions(Order order) { Map versionsRemovedById = new HashMap<>(); List currentAndDerived = currentAndDerivedScenarios(); From 9dce4e47cedb329e3cfb555d57712b1b9bafb10e Mon Sep 17 00:00:00 2001 From: Paul Luchyn Date: Mon, 21 Nov 2016 16:55:32 +0200 Subject: [PATCH 4/5] Added nonlimiting limits --- .../business/common/daos/ILimitsDAO.java | 3 +- .../business/common/daos/LimitsDAO.java | 26 ++++------- .../org/libreplan/web/common/LimitsModel.java | 10 ++++- .../machine/MachineCRUDController.java | 43 +++++++++++++------ .../worker/WorkerCRUDController.java | 37 ++++++++++++---- .../web/users/UserCRUDController.java | 30 ++++++++++--- 6 files changed, 101 insertions(+), 48 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java b/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java index e3e27eb62..e9499f172 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java @@ -33,7 +33,6 @@ public interface ILimitsDAO extends IGenericDAO { List getAll(); - Limits getUsersType(); + Limits getLimitsByType(String type); - Limits getResourcesType(); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java b/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java index 80fd3bb45..8f5ace6a9 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java @@ -19,6 +19,7 @@ package org.libreplan.business.common.daos; +import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.entities.Limits; import org.springframework.stereotype.Repository; @@ -38,25 +39,14 @@ public class LimitsDAO extends GenericDAOHibernate implements ILim return list(Limits.class); } - @Override - public Limits getUsersType() { - List list = list(Limits.class); - for (Limits item : list) { - if ("users".equals(item.getType())) { - return item; - } - } - return null; - } @Override - public Limits getResourcesType() { - List list = list(Limits.class); - for (Limits item : list) { - if ("workers+machines".equals(item.getType())) { - return item; - } - } - return null; + public Limits getLimitsByType(String type) { + + return (Limits) getSession() + .createCriteria(Limits.class) + .add(Restrictions.eq("type", type)) + .uniqueResult(); } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java index b82ff0ec6..72edd8c63 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java @@ -20,6 +20,7 @@ package org.libreplan.web.common; import org.libreplan.business.common.daos.ILimitsDAO; +import org.libreplan.business.common.daos.LimitsDAO; import org.libreplan.business.common.entities.Limits; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -39,6 +40,10 @@ import java.util.List; @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class LimitsModel implements ILimitsModel { + public static final String USER_LIMITS_TYPE = "users"; + + public static final String RESOURCES_LIMITS_TYPE = "workers+machines"; + @Autowired private ILimitsDAO limitsDAO; @@ -51,12 +56,13 @@ public class LimitsModel implements ILimitsModel { @Override @Transactional(readOnly = true) public Limits getUsersType() { - return limitsDAO.getUsersType(); + return limitsDAO.getLimitsByType(USER_LIMITS_TYPE); } @Override @Transactional(readOnly = true) public Limits getResourcesType() { - return limitsDAO.getResourcesType(); + return limitsDAO.getLimitsByType(RESOURCES_LIMITS_TYPE); } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java index a4286abcf..416461780 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java @@ -584,26 +584,43 @@ public class MachineCRUDController extends BaseCRUDController { return machineModel.getMachine(); } - public boolean isCreateButtonDisabled(){ + /** + * Should be public! + * Used in _listMachines.zul + */ + public boolean isCreateButtonDisabled() { Limits resourcesTypeLimit = limitsModel.getResourcesType(); - Integer resourcesCount = resourceDAO.getRowCount().intValue(); - - if ( resourcesTypeLimit != null ) - if ( resourcesCount >= resourcesTypeLimit.getValue() ) - return true; - - return false; + if (isNullOrZeroValue(resourcesTypeLimit)) { + return false; + } else { + Integer resources = resourceDAO.getRowCount().intValue(); + return resources >= resourcesTypeLimit.getValue(); + } } + /** + * Should be public! + * Used in _listMachines.zul + */ public String getShowCreateFormLabel(){ Limits resourcesTypeLimit = limitsModel.getResourcesType(); - Integer resourcesCount = resourceDAO.getRowCount().intValue(); - int resourcesLeft = resourcesTypeLimit.getValue() - resourcesCount; - if ( resourcesCount >= resourcesTypeLimit.getValue() ) - return _("Machines limit reached"); + if (isNullOrZeroValue(resourcesTypeLimit)) { + return _("Create"); + } - return _("Create") + " ( " + resourcesLeft + " " + _("left") + " )"; + Integer resources = resourceDAO.getRowCount().intValue(); + int resourcesLeft = resourcesTypeLimit.getValue() - resources; + + return resources >= resourcesTypeLimit.getValue() + ? _("Machines limit reached") + : _("Create") + " ( " + resourcesLeft + " " + _("left") + " )"; + } + + private boolean isNullOrZeroValue (Limits resourcesTypeLimit) { + return resourcesTypeLimit == null || + resourcesTypeLimit.getValue() == null || + resourcesTypeLimit.getValue().equals(0); } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java index 0dcf86166..6c192c2ef 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java @@ -1114,22 +1114,43 @@ public class WorkerCRUDController extends GenericForwardComposer implements IWor : ""; } + /** + * Should be public! + * Used in resources/worker/_list.zul + */ public boolean isCreateButtonDisabled() { Limits resourcesTypeLimit = limitsModel.getResourcesType(); - Integer resourcesCount = resourceDAO.getRowCount().intValue(); - - return resourcesTypeLimit != null && resourcesCount >= resourcesTypeLimit.getValue(); + if (isNullOrZeroValue(resourcesTypeLimit)) { + return false; + } else { + Integer resources = resourceDAO.getRowCount().intValue(); + return resources >= resourcesTypeLimit.getValue(); + } } + /** + * Should be public! + * Used in resources/worker/_list.zul + */ public String getShowCreateFormLabel() { Limits resourcesTypeLimit = limitsModel.getResourcesType(); - Integer resourcesCount = resourceDAO.getRowCount().intValue(); - int resourcesLeft = resourcesTypeLimit.getValue() - resourcesCount; - if (resourcesCount >= resourcesTypeLimit.getValue()) - return _("Workers limit reached"); + if (isNullOrZeroValue(resourcesTypeLimit)) { + return _("Create"); + } - return _("Create") + " ( " + resourcesLeft + " " + _("left") + " )"; + Integer resources = resourceDAO.getRowCount().intValue(); + int resourcesLeft = resourcesTypeLimit.getValue() - resources; + + return resources >= resourcesTypeLimit.getValue() + ? _("Workers limit reached") + : _("Create") + " ( " + resourcesLeft + " " + _("left") + " )"; + } + + private boolean isNullOrZeroValue (Limits resourcesTypeLimit) { + return resourcesTypeLimit == null || + resourcesTypeLimit.getValue() == null || + resourcesTypeLimit.getValue().equals(0); } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java index 7cb41cd52..388be3d24 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java @@ -440,10 +440,18 @@ public class UserCRUDController extends BaseCRUDController implements IUse } } + /** + * Should be public! + * Used in _listUsers.zul + */ public boolean isCreateButtonDisabled() { Limits usersTypeLimit = limitsModel.getUsersType(); - Integer usersCount = userModel.getRowCount().intValue(); - return usersTypeLimit != null && usersCount >= usersTypeLimit.getValue(); + if (isNullOrZeroValue(usersTypeLimit)) { + return false; + } else { + Integer users = userModel.getRowCount().intValue(); + return users >= usersTypeLimit.getValue(); + } } /** @@ -452,11 +460,23 @@ public class UserCRUDController extends BaseCRUDController implements IUse */ public String getShowCreateFormLabel() { Limits usersTypeLimit = limitsModel.getUsersType(); - Integer usersCount = userModel.getRowCount().intValue(); - int usersLeft = usersTypeLimit.getValue() - usersCount; - return usersCount >= usersTypeLimit.getValue() + if (isNullOrZeroValue(usersTypeLimit)) { + return _("Create"); + } + + Integer users = userModel.getRowCount().intValue(); + int usersLeft = usersTypeLimit.getValue() - users; + + return users >= usersTypeLimit.getValue() ? _("User limit reached") : _("Create") + " ( " + usersLeft + " " + _("left") + " )"; } + + private boolean isNullOrZeroValue (Limits usersTypeLimit) { + return usersTypeLimit == null || + usersTypeLimit.getValue() == null || + usersTypeLimit.getValue().equals(0); + } + } From a8ee928a9cb4552767b8d539b5fbbf7d5fc40af2 Mon Sep 17 00:00:00 2001 From: Paul Luchyn Date: Wed, 23 Nov 2016 17:10:38 +0200 Subject: [PATCH 5/5] Added javadoc --- .../libreplan/business/orders/entities/Order.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/Order.java b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/Order.java index dc6d6c3c9..2928af686 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/orders/entities/Order.java +++ b/libreplan-business/src/main/java/org/libreplan/business/orders/entities/Order.java @@ -224,6 +224,10 @@ public class Order extends OrderLineGroup implements Comparable { return getCurrentVersionInfo().isUsingTheOwnerScenario(); } + /** + * Should be public! + * Used in orders/_edition.zul + */ public BigDecimal getWorkBudget() { if (workBudget == null) { return BigDecimal.ZERO; @@ -238,6 +242,10 @@ public class Order extends OrderLineGroup implements Comparable { this.workBudget = workBudget; } + /** + * Should be public! + * Used in orders/_edition.zul + */ public BigDecimal getMaterialsBudget() { if (materialsBudget == null) { return BigDecimal.ZERO; @@ -252,6 +260,10 @@ public class Order extends OrderLineGroup implements Comparable { this.materialsBudget = materialsBudget; } + /** + * Should be public! + * Used in orders/_edition.zul + */ public BigDecimal getTotalManualBudget() { return getWorkBudget().add(getMaterialsBudget()); }