From abcd598f9ecf040c9aa8525764591c131b84f40f Mon Sep 17 00:00:00 2001 From: Diego Pino Garcia Date: Tue, 8 Dec 2009 13:34:12 +0100 Subject: [PATCH] ItEr37S13CUAsignacionMateriaisAPedidoItEr36S15: MaterialCategory should be unique within the same level --- .../business/common/Registry.java | 8 +++++ .../materials/daos/IMaterialCategoryDAO.java | 19 ++++++++++ .../materials/daos/MaterialCategoryDAO.java | 36 +++++++++++++++++++ .../materials/entities/MaterialCategory.java | 32 ++++++++++++++++- .../web/materials/MaterialsController.java | 21 +++++++++-- 5 files changed, 112 insertions(+), 4 deletions(-) diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index eab2c5d33..dfdcc7559 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -22,6 +22,7 @@ package org.navalplanner.business.common; import org.navalplanner.business.advance.daos.IAdvanceTypeDAO; import org.navalplanner.business.costcategories.daos.ITypeOfWorkHoursDAO; +import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; import org.navalplanner.business.materials.daos.IMaterialDAO; import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.daos.IMachineDAO; @@ -66,6 +67,9 @@ public class Registry { @Autowired private IMaterialDAO materialDAO; + @Autowired + private IMaterialCategoryDAO materialCategoryDAO; + private Registry() { } @@ -100,4 +104,8 @@ public class Registry { public static IMaterialDAO getMaterialDAO() { return getInstance().materialDAO; } + + public static IMaterialCategoryDAO getMaterialCategoryDAO() { + return getInstance().materialCategoryDAO; + } } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java index ea84d7e82..00eabf9b0 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/IMaterialCategoryDAO.java @@ -23,15 +23,34 @@ package org.navalplanner.business.materials.daos; import java.util.List; import org.navalplanner.business.common.daos.IGenericDAO; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; /** * Interface MaterialDAO * * @author Jacobo Aragunde Perez + * @author Diego Pino Garcia */ public interface IMaterialCategoryDAO extends IGenericDAO { + /** + * Returns true if {@link MaterialCategory} exists + * + * @param name + * @return + */ + boolean existsMaterialCategoryWithNameInAnotherTransaction(String name); + + /** + * Returns {@link Material} by name + * + * @param name + * @return + */ + MaterialCategory findUniqueByNameInAnotherTransaction(String name) throws InstanceNotFoundException; + List getAll(); List getAllRootMaterialCategories(); diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java index 9136baaf9..3f6383965 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/daos/MaterialCategoryDAO.java @@ -22,12 +22,17 @@ package org.navalplanner.business.materials.daos; import java.util.List; +import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import org.navalplanner.business.common.daos.GenericDAOHibernate; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.entities.Material; import org.navalplanner.business.materials.entities.MaterialCategory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; /** * DAO for {@link MaterialCategory} @@ -50,4 +55,35 @@ public class MaterialCategoryDAO extends GenericDAOHibernate list = criteria.list(); + if (list.size() != 1) { + throw new InstanceNotFoundException(name, MaterialCategory.class.getName()); + } + return list.get(0); + } + + @Override + @Transactional(readOnly= true, propagation = Propagation.REQUIRES_NEW) + public MaterialCategory findUniqueByNameInAnotherTransaction(String name) + throws InstanceNotFoundException { + return findUniqueByName(name); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java index 7c7c75c47..0f0619b3a 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/materials/entities/MaterialCategory.java @@ -26,10 +26,13 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; - +import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.Valid; import org.navalplanner.business.common.BaseEntity; +import org.navalplanner.business.common.Registry; +import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.materials.daos.IMaterialCategoryDAO; /** * MaterialCategory entity @@ -114,4 +117,31 @@ public class MaterialCategory extends BaseEntity { materials.remove(material); } + @AssertTrue(message="material category name has to be unique. It is already used") + public boolean checkConstraintUniqueName() { + boolean result; + if (isNewObject()) { + result = !existsMaterialCategoryWithTheName(); + } else { + result = isIfExistsTheExistentMaterialCategoryThisOne(); + } + return result; + } + + private boolean existsMaterialCategoryWithTheName() { + IMaterialCategoryDAO materialCategoryDAO = Registry.getMaterialCategoryDAO(); + return materialCategoryDAO.existsMaterialCategoryWithNameInAnotherTransaction(name); + } + + private boolean isIfExistsTheExistentMaterialCategoryThisOne() { + IMaterialCategoryDAO materialCategoryDAO = Registry.getMaterialCategoryDAO(); + try { + MaterialCategory materialCategory = + materialCategoryDAO.findUniqueByNameInAnotherTransaction(name); + return materialCategory.getId().equals(getId()); + } catch (InstanceNotFoundException e) { + return true; + } + } + } diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java index a1071d3b1..48c664d95 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/materials/MaterialsController.java @@ -43,6 +43,7 @@ import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; +import org.zkoss.zk.ui.event.InputEvent; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Button; import org.zkoss.zul.Grid; @@ -148,7 +149,14 @@ public class MaterialsController extends public void render(Treeitem ti, Object node) throws Exception { final MaterialCategory materialCategory = (MaterialCategory) node; - Textbox tb = new Textbox(materialCategory.getName()); + final Textbox tb = new Textbox(materialCategory.getName()); + tb.addEventListener("onChange", new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + final InputEvent ie = (InputEvent) event; + materialCategory.setName(ie.getValue()); + } + }); Treecell tc = new Treecell(); Treerow tr = null; @@ -320,14 +328,21 @@ public class MaterialsController extends // Unique material in materialCategory if (bean instanceof MaterialCategory) { final MaterialCategory materialCategory = (MaterialCategory) bean; - if (locateAndSelectMaterialCategory(materialCategory)) { - messagesForUser.showMessage(Level.ERROR, each.getPropertyName() + ": " + each.getMessage()); + final Treeitem treeitem = findTreeItemByMaterialCategory(categoriesTree, materialCategory); + if (treeitem != null) { + throw new WrongValueException(getCategoryTextbox(treeitem), each.getMessage()); } } } messagesForUser.showInvalidValues(validationException); } + private Textbox getCategoryTextbox(Treeitem treeitem) { + final Treerow treerow = (Treerow) treeitem.getChildren().get(0); + final Treecell treecell = (Treecell) treerow.getChildren().get(0); + return (Textbox) treecell.getChildren().get(0); + } + private boolean locateAndSelectMaterialCategory(MaterialCategory materialCategory) { Treeitem treeitem = findTreeItemByMaterialCategory(categoriesTree, materialCategory); if (treeitem != null) {