ItEr37S13CUAsignacionMateriaisAPedidoItEr36S15: MaterialCategory should be unique within the same level

This commit is contained in:
Diego Pino Garcia 2009-12-08 13:34:12 +01:00 committed by Javier Moran Rua
parent 8c37e1b127
commit abcd598f9e
5 changed files with 112 additions and 4 deletions

View file

@ -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;
}
}

View file

@ -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 <jaragunde@igalia.com>
* @author Diego Pino Garcia <dpino@igalia.com>
*/
public interface IMaterialCategoryDAO extends IGenericDAO<MaterialCategory, Long> {
/**
* 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<MaterialCategory> getAll();
List<MaterialCategory> getAllRootMaterialCategories();

View file

@ -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<MaterialCategory, L
return getSession().createCriteria(MaterialCategory.class).add(Restrictions.isNull("parent")).list();
}
@Override
@Transactional(readOnly= true, propagation = Propagation.REQUIRES_NEW)
public boolean existsMaterialCategoryWithNameInAnotherTransaction(
String name) {
try {
findUniqueByName(name);
return true;
} catch (InstanceNotFoundException e) {
return false;
}
}
private MaterialCategory findUniqueByName(String name)
throws InstanceNotFoundException {
Criteria criteria = getSession().createCriteria(MaterialCategory.class);
criteria.add(Restrictions.eq("name", name).ignoreCase());
List<MaterialCategory> 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);
}
}

View file

@ -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;
}
}
}

View file

@ -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) {