ItEr48S04ValidacionEProbasFuncionaisItEr47S04 : [Bug #332] Introduce in the entity OrderTemplate a restriction that assures that its name is unique.
This commit is contained in:
parent
6f9f599d43
commit
d6a80351f9
8 changed files with 176 additions and 7 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,4 +55,6 @@ public interface IOrderTemplatesModel {
|
|||
Set<QualityForm> getAllQualityForms();
|
||||
|
||||
OrderElementsOnConversation getOrderElementsOnConversation();
|
||||
|
||||
void validateTemplateName(String name) throws IllegalArgumentException;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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."));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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')}" />
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue