ItEr48S04ValidacionEProbasFuncionaisItEr47S04 : [Bug #332] Introduce in the entity OrderTemplate a restriction that assures that its name is unique.

This commit is contained in:
Susana Montes Pedreira 2010-02-18 12:13:40 +01:00 committed by Javier Moran Rua
parent 6f9f599d43
commit d6a80351f9
8 changed files with 176 additions and 7 deletions

View file

@ -41,6 +41,7 @@ import org.navalplanner.business.resources.daos.ICriterionTypeDAO;
import org.navalplanner.business.resources.daos.IMachineDAO;
import org.navalplanner.business.resources.daos.IResourceDAO;
import org.navalplanner.business.resources.daos.IWorkerDAO;
import org.navalplanner.business.templates.daos.IOrderElementTemplateDAO;
import org.navalplanner.business.users.daos.IProfileDAO;
import org.navalplanner.business.users.daos.IUserDAO;
import org.navalplanner.business.workreports.daos.IWorkReportDAO;
@ -145,6 +146,9 @@ public class Registry {
private IResourcesCostCategoryAssignmentDAO
resourcesCostCategoryAssignmentDAO;
@Autowired
private IOrderElementTemplateDAO orderElementTemplateDAO;
private Registry() {
}
@ -258,4 +262,7 @@ public class Registry {
}
public static IOrderElementTemplateDAO getOrderElementTemplateDAO() {
return getInstance().orderElementTemplateDAO;
}
}

View file

@ -21,7 +21,9 @@ package org.navalplanner.business.templates.daos;
import java.util.List;
import org.hibernate.NonUniqueResultException;
import org.navalplanner.business.common.daos.IGenericDAO;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
/**
@ -33,4 +35,16 @@ public interface IOrderElementTemplateDAO extends
List<OrderElementTemplate> getRootTemplates();
OrderElementTemplate findUniqueByName(
OrderElementTemplate orderElementTemplate)
throws InstanceNotFoundException;
OrderElementTemplate findUniqueByName(String name)
throws InstanceNotFoundException, NonUniqueResultException;
boolean existsOtherOrderElementTemplateByName(
OrderElementTemplate orderElementTemplate);
boolean existsByNameAnotherTransaction(
OrderElementTemplate orderElementTemplate);
}

View file

@ -21,12 +21,16 @@ package org.navalplanner.business.templates.daos;
import java.util.List;
import org.apache.commons.lang.Validate;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.navalplanner.business.common.daos.GenericDAOHibernate;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.templates.entities.OrderElementTemplate;
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;
@ -49,4 +53,53 @@ public class OrderElementTemplateDAO extends
return query.list();
}
@Override
public OrderElementTemplate findUniqueByName(
OrderElementTemplate orderElementTemplate)
throws InstanceNotFoundException {
Validate.notNull(orderElementTemplate);
return findUniqueByName(orderElementTemplate.getName());
}
@Override
public OrderElementTemplate findUniqueByName(String name)
throws InstanceNotFoundException, NonUniqueResultException {
// Prepare query
String strQuery = "Select t " + "from OrderElementTemplate t "
+ "where t.parent = NULL "
+ "and LOWER(t.infoComponent.name) like LOWER(:name)";
// Execute query
Query query = getSession().createQuery(strQuery);
if (name != null && !name.isEmpty()) {
query.setParameter("name", name);
}
OrderElementTemplate orderElementTemplate = (OrderElementTemplate) query
.uniqueResult();
if (orderElementTemplate == null) {
throw new InstanceNotFoundException(null, "OrderElemenetTemplate");
}
return orderElementTemplate;
}
@Override
public boolean existsOtherOrderElementTemplateByName(
OrderElementTemplate orderElementTemplate) {
try {
OrderElementTemplate t = findUniqueByName(orderElementTemplate);
return (t != null && t != orderElementTemplate);
} catch (InstanceNotFoundException e) {
return false;
}
}
@Override
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
public boolean existsByNameAnotherTransaction(
OrderElementTemplate orderElementTemplate) {
return existsOtherOrderElementTemplateByName(orderElementTemplate);
}
}

View file

@ -31,6 +31,8 @@ import java.util.Set;
import org.apache.commons.lang.Validate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.NonUniqueResultException;
import org.hibernate.validator.AssertTrue;
import org.hibernate.validator.Min;
import org.hibernate.validator.Valid;
import org.joda.time.DateTime;
@ -39,6 +41,8 @@ import org.joda.time.LocalDate;
import org.navalplanner.business.advance.entities.AdvanceAssignmentTemplate;
import org.navalplanner.business.advance.entities.DirectAdvanceAssignment;
import org.navalplanner.business.common.BaseEntity;
import org.navalplanner.business.common.Registry;
import org.navalplanner.business.common.exceptions.InstanceNotFoundException;
import org.navalplanner.business.labels.entities.Label;
import org.navalplanner.business.materials.entities.MaterialAssignment;
import org.navalplanner.business.materials.entities.MaterialAssignmentTemplate;
@ -50,6 +54,7 @@ import org.navalplanner.business.orders.entities.SchedulingState;
import org.navalplanner.business.orders.entities.SchedulingState.ITypeChangedListener;
import org.navalplanner.business.orders.entities.SchedulingState.Type;
import org.navalplanner.business.qualityforms.entities.QualityForm;
import org.navalplanner.business.templates.daos.IOrderElementTemplateDAO;
import org.navalplanner.business.trees.ITreeNode;
/**
@ -404,4 +409,26 @@ public abstract class OrderElementTemplate extends BaseEntity implements
public boolean isRoot() {
return getParent() == null;
}
@SuppressWarnings("unused")
@AssertTrue(message = "template name is already being used")
public boolean checkConstraintUniqueTemplateName() {
IOrderElementTemplateDAO orderElementTemplateDAO = Registry
.getOrderElementTemplateDAO();
if (isNewObject()) {
return !orderElementTemplateDAO
.existsByNameAnotherTransaction(this);
} else {
try {
OrderElementTemplate template = orderElementTemplateDAO
.findUniqueByName(getName());
return template.getId().equals(getId());
} catch (InstanceNotFoundException e) {
return true;
} catch (NonUniqueResultException e) {
return false;
}
}
}
}

View file

@ -55,4 +55,6 @@ public interface IOrderTemplatesModel {
Set<QualityForm> getAllQualityForms();
OrderElementsOnConversation getOrderElementsOnConversation();
void validateTemplateName(String name) throws IllegalArgumentException;
}

View file

@ -46,7 +46,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;
/**
@ -67,6 +71,8 @@ public class OrderTemplatesController extends GenericForwardComposer implements
private Window editWindow;
private Textbox name;
private IMessagesForUser messagesForUser;
private Component messagesContainer;
@ -180,9 +186,11 @@ public class OrderTemplatesController extends GenericForwardComposer implements
}
public void saveAndExit() {
model.confirmSave();
messagesForUser.showMessage(Level.INFO, _("Template saved"));
show(listWindow);
if (isAllValid()) {
model.confirmSave();
messagesForUser.showMessage(Level.INFO, _("Template saved"));
show(listWindow);
}
}
public void cancel() {
@ -190,9 +198,37 @@ public class OrderTemplatesController extends GenericForwardComposer implements
}
public void saveAndContinue() {
model.confirmSave();
model.initEdit(getTemplate());
messagesForUser.showMessage(Level.INFO, _("Template saved"));
if (isAllValid()) {
model.confirmSave();
model.initEdit(getTemplate());
messagesForUser.showMessage(Level.INFO, _("Template saved"));
}
}
private boolean isAllValid() {
// validate template name
name = (Textbox) editWindow.getFellowIfAny("name");
if ((name != null) && (!name.isValid())) {
selectTab("tabGeneralData");
showInvalidWorkReportTypeName();
return false;
}
return true;
}
private void selectTab(String str) {
Tab tab = (Tab) editWindow.getFellowIfAny(str);
if (tab != null) {
tab.setSelected(true);
}
}
private void showInvalidWorkReportTypeName() {
try {
model.validateTemplateName(name.getValue());
} catch (IllegalArgumentException e) {
throw new WrongValueException(name, _(e.getMessage()));
}
}
@Override
@ -210,4 +246,17 @@ public class OrderTemplatesController extends GenericForwardComposer implements
handler.registerListener(this, page);
}
public Constraint validateTemplateName() {
return new Constraint() {
@Override
public void validate(Component comp, Object value)
throws WrongValueException {
try {
model.validateTemplateName((String) value);
} catch (IllegalArgumentException e) {
throw new WrongValueException(comp, _(e.getMessage()));
}
}
};
}
}

View file

@ -19,6 +19,8 @@
*/
package org.navalplanner.web.templates;
import static org.navalplanner.business.i18n.I18nHelper._;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@ -212,4 +214,18 @@ public class OrderTemplatesModel implements IOrderTemplatesModel {
.getQualityForms());
}
@Transactional(readOnly = true)
public void validateTemplateName(String name)
throws IllegalArgumentException {
if ((name == null) || (name.isEmpty())) {
throw new IllegalArgumentException(_("the name must be not empty"));
}
getTemplate().setName(name);
if (!getTemplate().checkConstraintUniqueTemplateName()) {
throw new IllegalArgumentException(
_("There exists other template with the same name."));
}
}
}

View file

@ -69,7 +69,8 @@
<rows>
<row>
<label value="${i18n:_('Name')}" />
<textbox value="@{templateController.template.name}" width="500px"/>
<textbox id="name" value="@{templateController.template.name}" width="500px"
constraint = "@{templateController.validateTemplateName}"/>
</row>
<row>
<label value="${i18n:_('Code')}" />