ItEr37S13CUAsignacionMateriaisAPedidoItEr36S15: MaterialCategory should be unique within the same level
This commit is contained in:
parent
8c37e1b127
commit
abcd598f9e
5 changed files with 112 additions and 4 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue