package org.akaza.openclinica.validator.rule.action; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.core.NullValue; import org.akaza.openclinica.bean.core.ResponseType; import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.submit.ItemBean; import org.akaza.openclinica.bean.submit.ItemFormMetadataBean; import org.akaza.openclinica.bean.submit.ResponseOptionBean; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.submit.ItemDAO; import org.akaza.openclinica.dao.submit.ItemFormMetadataDAO; import org.akaza.openclinica.domain.rule.AuditableBeanWrapper; import org.akaza.openclinica.domain.rule.RuleSetBean; import org.akaza.openclinica.domain.rule.action.PropertyBean; import org.akaza.openclinica.domain.rule.action.RandomizeActionBean; import org.akaza.openclinica.domain.rule.action.StratificationFactorBean; import org.akaza.openclinica.domain.rule.expression.Context; import org.akaza.openclinica.domain.rule.expression.ExpressionBean; import org.akaza.openclinica.domain.rule.expression.ExpressionObjectWrapper; import org.akaza.openclinica.domain.rule.expression.ExpressionProcessor; import org.akaza.openclinica.domain.rule.expression.ExpressionProcessorFactory; import org.akaza.openclinica.exception.OpenClinicaSystemException; import org.akaza.openclinica.logic.expressionTree.ExpressionTreeHelper; import org.akaza.openclinica.service.rule.expression.ExpressionService; import org.apache.commons.collections.CollectionUtils; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.ResourceBundle; import javax.sql.DataSource; public class RandomizeActionValidator implements Validator { ItemDAO itemDAO; ItemFormMetadataDAO itemFormMetadataDAO; EventDefinitionCRFDAO eventDefinitionCRFDAO; StudyEventDefinitionDAO studyEventDefinitionDAO; CRFDAO crfDAO; DataSource dataSource; EventDefinitionCRFBean eventDefinitionCRFBean; ExpressionService expressionService; RuleSetBean ruleSetBean; ResourceBundle respage; public RandomizeActionValidator(DataSource dataSource) { this.dataSource = dataSource; } /** * This Validator validates just Person instances */ public boolean supports(Class clazz) { return RandomizeActionBean.class.equals(clazz); } public void validateOidInPropertyBean(PropertyBean propertyBean, Errors e, String p) { if (getExpressionService().isExpressionPartial(getRuleSetBean().getTarget().getValue())) { if (getExpressionService().getExpressionSize(propertyBean.getOid()).intValue() > 3) { e.rejectValue(p + "oid", "oid.invalid", "OID: " + propertyBean.getOid() + " is Invalid."); } try { getExpressionService().isExpressionValid(propertyBean.getOid()); } catch (OpenClinicaSystemException ose) { e.rejectValue(p + "oid", "oid.invalid", "OID: " + propertyBean.getOid() + " is Invalid."); } // Use OID in destinationProperty to get CRF CRFBean destinationPropertyOidCrf = getExpressionService().getCRFFromExpression(propertyBean.getOid()); if (destinationPropertyOidCrf == null) { ItemBean item = getExpressionService().getItemBeanFromExpression(propertyBean.getOid()); destinationPropertyOidCrf = getCrfDAO().findByItemOid(item.getOid()); } // Use Target get CRF CRFBean targetCrf = getExpressionService().getCRFFromExpression(getRuleSetBean().getTarget().getValue()); if (targetCrf == null) { ItemBean item = getExpressionService().getItemBeanFromExpression(getRuleSetBean().getTarget().getValue()); targetCrf = getCrfDAO().findByItemOid(item.getOid()); } // Get All event definitions the selected CRF belongs to List<StudyEventDefinitionBean> destinationPropertyStudyEventDefinitions = getStudyEventDefinitionDAO().findAllByCrf(destinationPropertyOidCrf); List<StudyEventDefinitionBean> targetStudyEventDefinitions = getStudyEventDefinitionDAO().findAllByCrf(targetCrf); Collection intersection = CollectionUtils.intersection(destinationPropertyStudyEventDefinitions, targetStudyEventDefinitions); if (intersection.size() == 0) { e.rejectValue(p + "oid", "oid.invalid", "OID: " + propertyBean.getOid() + " is Invalid."); } } else { String expression = getExpressionService().constructFullExpressionIfPartialProvided(propertyBean.getOid(), getRuleSetBean().getTarget().getValue()); ItemBean item = getExpressionService().getItemBeanFromExpression(expression); if (!getExpressionService().isRandomizeActionExpressionValid(propertyBean.getOid(), getRuleSetBean(), 3) || item == null) { e.rejectValue(p + "oid", "oid.invalid", "OID: " + propertyBean.getOid() + " is Invalid."); } } } public void validate(Object obj, Errors e) { RandomizeActionBean randomizeActionBean = (RandomizeActionBean) obj; String p=""; for (int i = 0; i < randomizeActionBean.getProperties().size(); i++) { p = "properties[" + i + "]."; PropertyBean propertyBean = randomizeActionBean.getProperties().get(i); ValidationUtils.rejectIfEmpty(e, p + "oid", "oid.empty"); validateOidInPropertyBean(propertyBean, e, p); } } public ItemDAO getItemDAO() { return this.itemDAO != null ? itemDAO : new ItemDAO(dataSource); } public StudyEventDefinitionDAO getStudyEventDefinitionDAO() { return this.studyEventDefinitionDAO != null ? studyEventDefinitionDAO : new StudyEventDefinitionDAO(dataSource); } public CRFDAO getCrfDAO() { return this.crfDAO != null ? crfDAO : new CRFDAO(dataSource); } public EventDefinitionCRFDAO getEventDefinitionCRFDAO() { return this.eventDefinitionCRFDAO != null ? eventDefinitionCRFDAO : new EventDefinitionCRFDAO(dataSource); } public ItemFormMetadataDAO getItemFormMetadataDAO() { return this.itemFormMetadataDAO != null ? itemFormMetadataDAO : new ItemFormMetadataDAO(dataSource); } public EventDefinitionCRFBean getEventDefinitionCRFBean() { return eventDefinitionCRFBean; } public void setEventDefinitionCRFBean(EventDefinitionCRFBean eventDefinitionCRFBean) { this.eventDefinitionCRFBean = eventDefinitionCRFBean; } public ExpressionService getExpressionService() { return expressionService; } public void setExpressionService(ExpressionService expressionService) { this.expressionService = expressionService; } public RuleSetBean getRuleSetBean() { return ruleSetBean; } public void setRuleSetBean(RuleSetBean ruleSetBean) { this.ruleSetBean = ruleSetBean; } }