/* * GNU Lesser General Public License (GNU LGPL). * For details see: http://www.openclinica.org/license * * OpenClinica is distributed under the * Copyright 2003-2008 Akaza Research */ package org.akaza.openclinica.service.rule.expression; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.core.EntityBean; import org.akaza.openclinica.bean.core.ItemDataType; import org.akaza.openclinica.bean.core.Status; import org.akaza.openclinica.bean.core.SubjectEventStatus; import org.akaza.openclinica.bean.core.Utils; import org.akaza.openclinica.bean.managestudy.EventDefinitionCRFBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudyEventBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.bean.submit.EventCRFBean; import org.akaza.openclinica.bean.submit.ItemBean; import org.akaza.openclinica.bean.submit.ItemDataBean; import org.akaza.openclinica.bean.submit.ItemGroupBean; import org.akaza.openclinica.bean.submit.ItemGroupMetadataBean; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.hibernate.DynamicsItemFormMetadataDao; import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.submit.CRFVersionDAO; import org.akaza.openclinica.dao.submit.EventCRFDAO; import org.akaza.openclinica.dao.submit.ItemDAO; import org.akaza.openclinica.dao.submit.ItemDataDAO; import org.akaza.openclinica.dao.submit.ItemGroupDAO; import org.akaza.openclinica.dao.submit.ItemGroupMetadataDAO; import org.akaza.openclinica.domain.datamap.StudyEvent; import org.akaza.openclinica.domain.rule.RuleSetBean; import org.akaza.openclinica.domain.rule.expression.ExpressionObjectWrapper; import org.akaza.openclinica.exception.OpenClinicaSystemException; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.akaza.openclinica.logic.expressionTree.ExpressionTreeHelper; import org.joda.time.DateMidnight; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.ISODateTimeFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.sql.DataSource; public class ExpressionService { protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); private final String SEPERATOR = "."; private final String ESCAPED_SEPERATOR = "\\."; private final String STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN = "[A-Z_0-9]+|[A-Z_0-9]+\\[(ALL|[1-9]\\d*)\\]$"; private final String STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_NO_ALL = "[A-Z_0-9]+|[A-Z_0-9]+\\[[1-9]\\d*\\]$"; private final String STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_WITH_ORDINAL = "[A-Z_0-9]+\\[(END|ALL|[1-9]\\d*)\\]$"; private final String STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_WITH_END = "[A-Z_0-9]+|[A-Z_0-9]+\\[(END|ALL|[1-9]\\d*)\\]$"; private final String PRE = "[A-Z_0-9]+\\["; private final String POST = "\\]"; private final String CRF_OID_OR_ITEM_DATA_PATTERN = "[A-Z_0-9]+"; private final String BRACKETS_AND_CONTENTS = "\\[(END|ALL|[1-9]\\d*)\\]"; private final String ALL_IN_BRACKETS = "ALL"; private final String OPENNIG_BRACKET = "["; private final String CLOSING_BRACKET = "]"; DataSource ds; Pattern[] pattern; Pattern[] rulePattern; Pattern[] ruleActionPattern; ExpressionObjectWrapper expressionWrapper; private ItemDAO itemDao; private StudyEventDefinitionDAO studyEventDefinitionDao; private EventDefinitionCRFDAO eventDefinitionCRFDao; private DynamicsItemFormMetadataDao dynamicsItemFormMetadataDao; private ItemGroupMetadataDAO itemGroupMetadataDao; private EventCRFDAO eventCRFDao; private ItemGroupDAO itemGroupDao; private CRFDAO crfDao; private CRFVersionDAO crfVersionDao; private ItemDataDAO itemDataDao; private StudyEventDAO studyEventDao; private StudySubjectDAO studySubjectDao; public final static String STARTDATE =".STARTDATE"; public final static String STATUS =".STATUS"; public static final String STUDY_EVENT_OID_START_KEY="SE_"; /* * The variables below are used as a small Cache so that we don't go to the * database every time we want to get an Object by it's OID. This is a very * stripped down cache which will help performance in a single * request/response cycle. */ private HashMap<String, StudyEventDefinitionBean> studyEventDefinitions; private HashMap<String, ItemGroupBean> itemGroups; private HashMap<String, ItemBean> items; public ExpressionService(DataSource ds) { init(ds, null); } public ExpressionService(ExpressionObjectWrapper expressionWrapper) { init(expressionWrapper.getDs(), expressionWrapper); } private void init(DataSource ds, ExpressionObjectWrapper expressionWrapper) { pattern = new Pattern[4]; pattern[3] = Pattern.compile(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN); // STUDY_EVENT_DEFINITION_OID // + // ordinal pattern[2] = Pattern.compile(CRF_OID_OR_ITEM_DATA_PATTERN); // CRF_OID // or // CRF_VERSION_OID pattern[1] = Pattern.compile(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN); // ITEM_GROUP_DATA_OID // + // ordinal pattern[0] = Pattern.compile(CRF_OID_OR_ITEM_DATA_PATTERN); // ITEM_DATA_OID // [ALL] ordinals are not accepted in Rule Expressions rulePattern = new Pattern[4]; rulePattern[3] = Pattern.compile(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_NO_ALL); // STUDY_EVENT_DEFINITION_OID // + // ordinal rulePattern[2] = Pattern.compile(CRF_OID_OR_ITEM_DATA_PATTERN); // CRF_OID // or // CRF_VERSION_OID rulePattern[1] = Pattern.compile(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_NO_ALL); // ITEM_GROUP_DATA_OID // + // ordinal rulePattern[0] = Pattern.compile(CRF_OID_OR_ITEM_DATA_PATTERN); // ITEM_DATA_OID // [END] support added ruleActionPattern = new Pattern[4]; ruleActionPattern[3] = Pattern.compile(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN); // STUDY_EVENT_DEFINITION_OID // + // ordinal ruleActionPattern[2] = Pattern.compile(CRF_OID_OR_ITEM_DATA_PATTERN); // CRF_OID // or // CRF_VERSION_OID ruleActionPattern[1] = Pattern.compile(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_WITH_END); // ITEM_GROUP_DATA_OID // + // ordinal ruleActionPattern[0] = Pattern.compile(CRF_OID_OR_ITEM_DATA_PATTERN); // ITEM_DATA_OID this.studyEventDefinitions = new HashMap<String, StudyEventDefinitionBean>(); this.itemGroups = new HashMap<String, ItemGroupBean>(); this.items = new HashMap<String, ItemBean>(); this.ds = ds; this.expressionWrapper = expressionWrapper; } public boolean ruleSetExpressionChecker(String expression) { if (checkSyntax(expression)) { isExpressionValid(expression); } else { throw new OpenClinicaSystemException("OCRERR_0032"); } return true; } public String ifValueIsDate(ItemBean itemBean, String value) { String theFinalValue = value; if (value != null && itemBean.getDataType() == ItemDataType.DATE) { value = Utils.convertedItemDateValue(value, ResourceBundleProvider.getFormatBundle().getString("date_format_string"), "MM/dd/yyyy"); theFinalValue = ExpressionTreeHelper.isValidDateMMddyyyy(value); } return theFinalValue; } public String getValueFromDb(String expression, List<ItemDataBean> itemData) throws OpenClinicaSystemException { if (isExpressionPartial(expression)) { throw new OpenClinicaSystemException("getValueFromDb:We cannot get the Value of a PARTIAL expression : " + expression); } try { Integer index = getItemGroupOidOrdinalFromExpression(expression).equals("") ? 0 : Integer.valueOf(getItemGroupOidOrdinalFromExpression(expression)) - 1; ItemDataBean itemDataBean = itemData.get(index); ItemBean itemBean = (ItemBean) getItemDao().findByPK(itemDataBean.getItemId()); String value = itemData.get(index).getValue(); value = ifValueIsDate(itemBean, value); return value; } catch (NullPointerException npe) { logger.error("NullPointerException was thrown "); return null; } catch (IndexOutOfBoundsException ioobe) { logger.error("IndexOutOfBoundsException was thrown "); return null; } } private String getValueFromDb(String expression, List<ItemDataBean> itemData, Map<Integer, ItemBean> itemBeans) throws OpenClinicaSystemException { if (isExpressionPartial(expression)) { throw new OpenClinicaSystemException("getValueFromDb:We cannot get the Value of a PARTIAL expression : " + expression); } try { Integer index = getItemGroupOidOrdinalFromExpression(expression).equals("") ? 0 : Integer.valueOf(getItemGroupOidOrdinalFromExpression(expression)) - 1; ItemDataBean itemDataBean = itemData.get(index); String value = itemData.get(index).getValue(); if (itemBeans.containsKey(itemDataBean.getItemId())) { value = ifValueIsDate(itemBeans.get(itemDataBean.getItemId()), value); } return value; } catch (NullPointerException npe) { logger.error("NullPointerException was thrown "); return null; } catch (IndexOutOfBoundsException ioobe) { logger.error("IndexOutOfBoundsException was thrown "); return null; } } public String getSSZoneId(){ Integer subjectId = expressionWrapper.getStudySubjectId(); System.out.println(" subjectId " + subjectId + " : "); if(subjectId ==null) return null; StudySubjectBean ssBean = (StudySubjectBean) getStudySubjectDao().findByPK(subjectId); return ssBean.getTime_zone().trim(); } public HashMap<String,String> getSSDate(String ssZoneId , String serverZoneId){ HashMap<String,String> map = new HashMap<String, String>(); if (ssZoneId == null || ssZoneId.equals("")) ssZoneId = TimeZone.getDefault().getID(); DateTimeZone ssZone = DateTimeZone.forID(ssZoneId); DateMidnight dm = new DateMidnight(ssZone); DateTimeFormatter fmt = ISODateTimeFormat.date(); map.put("ssDate", fmt.print(dm)); map.put("serverZoneId", serverZoneId); DateTimeZone serverZone = DateTimeZone.forID(serverZoneId); DateMidnight serverDate = new DateMidnight(serverZone); map.put("serverDate", fmt.print(serverDate)); return map; } public HashMap <String,String> getValueFromDbb(String expression) throws OpenClinicaSystemException { HashMap<String , String > map = new HashMap<>(); if (isExpressionPartial(expression)) { throw new OpenClinicaSystemException("getValueFromDb:We cannot get the Value of a PARTIAL expression : " + expression); } try { // Get the studyEventId from RuleSet Target so we can know which // StudySubject we are dealing with. String ruleSetExpression = expressionWrapper.getRuleSet().getTarget().getValue(); String ruleSetExpressionStudyEventId = getStudyEventDefinitionOidOrdinalFromExpression(ruleSetExpression); StudyEventBean studyEvent = (StudyEventBean) getStudyEventDao().findByPK(Integer.valueOf(ruleSetExpressionStudyEventId)); // Prepare Method arguments String studyEventDefinitionOid = getStudyEventDefinitionOidFromExpression(expression); String crfOrCrfVersionOid = getCrfOidFromExpression(expression); String studyEventDefinitionOrdinal = getStudyEventDefinitionOidOrdinalFromExpression(expression); studyEventDefinitionOrdinal = studyEventDefinitionOrdinal.equals("") ? "1" : studyEventDefinitionOrdinal; String studySubjectId = String.valueOf(studyEvent.getStudySubjectId()); System.out.println("studySubjectId: "+ studySubjectId); logger.debug("ruleSet studyEventId {} , studyEventDefinitionOid {} , crfOrCrfVersionOid {} , studyEventDefinitionOrdinal {} ,studySubjectId {}", new Object[] { studyEvent.getId(), studyEventDefinitionOid, crfOrCrfVersionOid, studyEventDefinitionOrdinal, studySubjectId }); StudyEventBean studyEventofThisExpression = getStudyEventDao().findAllByStudyEventDefinitionAndCrfOidsAndOrdinal(studyEventDefinitionOid, crfOrCrfVersionOid, studyEventDefinitionOrdinal, studySubjectId); if(studyEvent.getId()==studyEventofThisExpression.getId()) map.put("match", "true"); logger.debug("studyEvent : {} , itemOid {} , itemGroupOid {}", new Object[] { studyEventofThisExpression.getId(), getItemOidFromExpression(expression), getItemGroupOidFromExpression(expression) }); List<ItemDataBean> itemData = getItemDataDao().findByStudyEventAndOids(Integer.valueOf(studyEventofThisExpression.getId()), getItemOidFromExpression(expression), getItemGroupOidFromExpression(expression)); expression = fixGroupOrdinal(expression, ruleSetExpression, itemData, expressionWrapper.getEventCrf()); Integer index = getItemGroupOidOrdinalFromExpression(expression).equals("") ? 0 : Integer.valueOf(getItemGroupOidOrdinalFromExpression(expression)) - 1; ItemDataBean itemDataBean = itemData.get(index); ItemBean itemBean = (ItemBean) getItemDao().findByPK(itemDataBean.getItemId()); String value = itemData.get(index).getValue(); value = ifValueIsDate(itemBean, value); map.put("value", value); return map; } catch (Exception e) { return map; } } public ItemDataBean getItemDataBeanFromDb(String expression) throws OpenClinicaSystemException { if (isExpressionPartial(expression)) { throw new OpenClinicaSystemException("getItemDataBeanFromDb:We cannot get the ItemData of a PARTIAL expression : " + expression); } String studyEventId = getStudyEventDefinitionOidOrdinalFromExpression(expression); Integer index = getItemGroupOidOrdinalFromExpression(expression).equals("") ? 0 : Integer.valueOf(getItemGroupOidOrdinalFromExpression(expression)) - 1; List<ItemDataBean> itemData = getItemDataDao().findByStudyEventAndOids(Integer.valueOf(studyEventId), getItemOidFromExpression(expression), getItemGroupOidFromExpression(expression)); ItemDataBean itemDataBean = itemData.size() > index ? itemData.get(index) : null; return itemDataBean; // << tbh 04/28/2010 } public String getValueFromForm(String expression) { String result = null; HashMap<String, String> formValues = expressionWrapper.getItemsAndTheirValues(); if (formValues != null && !formValues.isEmpty()) { String withGroup = getItemGroupPLusItem(expression); String withoutGroup = getItemOidFromExpression(expression); result = formValues.containsKey(withGroup) ? formValues.get(withGroup) : formValues.containsKey(withoutGroup) ? formValues.get(withoutGroup) : null; } else { logger.warn("The HashMap that stores form values was null, Better this be a Bulk operation"); } return result; } public String getValueFromForm(String expression, Map<String, ItemBean> itemBeans) { if (itemBeans == null) logger.debug("The Map that stores ItemBeans is null. Item Date value cannot be processed."); String result = null; HashMap<String, String> formValues = expressionWrapper.getItemsAndTheirValues(); if (formValues != null && !formValues.isEmpty()) { String withGroup = getItemGroupPLusItem(expression); String withoutGroup = getItemOidFromExpression(expression); result = formValues.containsKey(withGroup) ? formValues.get(withGroup) : formValues.containsKey(withoutGroup) ? formValues.get(withoutGroup) : null; if (itemBeans != null) { ItemBean itemBean = itemBeans.containsKey(withGroup) ? itemBeans.get(withGroup) : itemBeans.containsKey(withoutGroup) ? itemBeans.get(withoutGroup) : null; result = ifValueIsDate(itemBean, result); } } else { logger.warn("The HashMap that stores form values was null, Better this be a Bulk operation"); } return result; } public String evaluateExpression(String expression) throws OpenClinicaSystemException { String value = null; Map<Integer, ItemBean> itemBeansI = new HashMap<Integer, ItemBean>(); if(items != null) { Iterator<ItemBean> iter = items.values().iterator(); while(iter.hasNext()) { ItemBean item = iter.next(); itemBeansI.put(item.getId(), item); } } if (expressionWrapper.getRuleSet() != null) { if(checkIfExpressionIsForScheduling(expression)){ StudyEvent studyEvent; if (expression.endsWith(this.STARTDATE)) { String oid = expression.substring(0,expression.indexOf(this.STARTDATE)); studyEvent = getStudyEventFromOID(oid); if (studyEvent != null) { logger.debug("Study Event Start Date: " + studyEvent.getDateStart().toString().substring(0, 10).trim()); return studyEvent.getDateStart().toString().substring(0, 10).trim(); } else return ""; } else { String oid = expression.substring(0,expression.indexOf(this.STATUS)); studyEvent = getStudyEventFromOID(oid); if (studyEvent != null) { logger.debug("Status: " + SubjectEventStatus.getSubjectEventStatusName(studyEvent.getSubjectEventStatusId())); return SubjectEventStatus.getSubjectEventStatusName(studyEvent.getSubjectEventStatusId()); } else return ""; } } if (isExpressionPartial(expression)) { String fullExpression = constructFullExpressionIfPartialProvided(expression, expressionWrapper.getRuleSet().getTarget().getValue()); List<ItemDataBean> itemDatas = getItemDatas(fullExpression); fullExpression = fixGroupOrdinal(fullExpression, expressionWrapper.getRuleSet().getTarget().getValue(), itemDatas, expressionWrapper.getEventCrf()); if (checkSyntax(fullExpression)) { String valueFromForm = null; if (items == null) { valueFromForm = getValueFromForm(fullExpression); } else { valueFromForm = getValueFromForm(fullExpression, items); } String valueFromDb = null; if (itemBeansI == null) { valueFromDb = getValueFromDb(fullExpression, itemDatas); } else { valueFromDb = getValueFromDb(fullExpression, itemDatas, itemBeansI); } logger.debug("valueFromForm : {} , valueFromDb : {}", valueFromForm, valueFromDb); if (valueFromForm == null && valueFromDb == null) { throw new OpenClinicaSystemException("OCRERR_0017", new Object[] { fullExpression, expressionWrapper.getRuleSet().getTarget().getValue() }); } /* * if (valueFromForm != null) { // TODO: Do this if type a * date String dateFormat = * ResourceBundleProvider.getFormatBundle * ().getString("date_format_string"); String dateRegexp = * ResourceBundleProvider * .getFormatBundle().getString("date_regexp"); * valueFromForm = * ExpressionTreeHelper.isValidDate(valueFromForm, * dateFormat, dateRegexp); } */ value = valueFromForm == null ? valueFromDb : valueFromForm; } } else { // So Expression is not Partial HashMap<String, String> map = getValueFromDbb(expression); String valueFromDb=null; String matchEvents=null; String valueFromForm=null; if (checkSyntax(expression)) { valueFromDb = map.get("value"); matchEvents = map.get("match"); // if se_id are a match go in , otherwise nothing if (matchEvents!=null && matchEvents.equals("true")){ if (items == null) { valueFromForm = getValueFromForm(expression); } else { valueFromForm = getValueFromForm(expression, items); } } logger.debug("valueFromDb : {}", valueFromDb); value = valueFromForm == null ? valueFromDb : valueFromForm; if (value == null) { logger.info("The value is " + value + " for expression" + expression); throw new OpenClinicaSystemException("OCRERR_0018", new Object[] { expression }); } } } } return value; } private String getValueFromDbOrForm(String fullExpression, Map<Integer, ItemBean> itemBeansI){ List<ItemDataBean> itemDatas = getItemDatas(fullExpression); fullExpression = fixGroupOrdinal(fullExpression, expressionWrapper.getRuleSet().getTarget().getValue(), itemDatas, expressionWrapper.getEventCrf()); checkSyntax(fullExpression); String valueFromForm = null; if (items == null) { valueFromForm = getValueFromForm(fullExpression); } else { valueFromForm = getValueFromForm(fullExpression, items); } String valueFromDb = null; if (itemBeansI == null) { valueFromDb = getValueFromDb(fullExpression, itemDatas); } else { valueFromDb = getValueFromDb(fullExpression, itemDatas, itemBeansI); } logger.debug("valueFromForm : {} , valueFromDb : {}", valueFromForm, valueFromDb); if (valueFromForm == null && valueFromDb == null) { throw new OpenClinicaSystemException("OCRERR_0017", new Object[] { fullExpression, expressionWrapper.getRuleSet().getTarget().getValue() }); } return valueFromForm == null ? valueFromDb : valueFromForm; } public boolean checkIfExpressionIsForScheduling(String expression){ if(expression.toUpperCase().startsWith("SE_")&&(expression.toUpperCase().endsWith(this.STARTDATE)|| expression.toUpperCase().endsWith(this.STATUS))){ return true; } return false; } public StudyEvent getStudyEventFromOID(String oid) { Integer subjectId = expressionWrapper.getStudySubjectId(); StudyEvent studyEvent = null; if (oid.contains("[")) { int leftBracketIndex = oid.indexOf("["); int rightBracketIndex = oid.indexOf("]"); int ordinal = Integer.valueOf(oid.substring(leftBracketIndex + 1,rightBracketIndex)); studyEvent= expressionWrapper.getStudyEventDaoHib().fetchByStudyEventDefOIDAndOrdinal(oid.substring(0,leftBracketIndex), ordinal, subjectId); } else studyEvent= expressionWrapper.getStudyEventDaoHib().fetchByStudyEventDefOIDAndOrdinal(oid, 1, subjectId); return studyEvent; } private List<ItemDataBean> getItemDatas(String expression) { String studyEventId = getStudyEventDefinitionOidOrdinalFromExpression(expression); List<ItemDataBean> itemData = getItemDataDao().findByStudyEventAndOids(Integer.valueOf(studyEventId), getItemOidFromExpression(expression), getItemGroupOidFromExpression(expression)); return itemData; } private String fixGroupOrdinal(String ruleExpression, String targetExpression, List<ItemDataBean> itemData, EventCRFBean eventCrf) { String returnedRuleExpression = ruleExpression; if (getItemGroupOid(ruleExpression).equals(getItemGroupOid(targetExpression))) { if (getGroupOrdninalCurated(ruleExpression).equals("") && !getGroupOrdninalCurated(targetExpression).equals("")) { returnedRuleExpression = replaceGroupOidOrdinalInExpression(ruleExpression, Integer.valueOf(getGroupOrdninalCurated(targetExpression))); } } else { EventCRFBean theEventCrfBean = null; if (eventCrf != null) { theEventCrfBean = eventCrf; } else if (!itemData.isEmpty()) { theEventCrfBean = (EventCRFBean) getEventCRFDao().findByPK(itemData.get(0).getEventCRFId()); } else { return returnedRuleExpression; } Integer itemId = itemData.isEmpty() ? ((EntityBean) getItemDao().findByOid(getItemOid(ruleExpression)).get(0)).getId() : itemData.get(0).getItemId(); ItemGroupMetadataBean itemGroupMetadataBean = (ItemGroupMetadataBean) getItemGroupMetadataDao().findByItemAndCrfVersion(itemId, theEventCrfBean.getCRFVersionId()); if (isGroupRepeating(itemGroupMetadataBean) && getGroupOrdninalCurated(ruleExpression).equals("")) { returnedRuleExpression = replaceGroupOidOrdinalInExpression(ruleExpression, Integer.valueOf(getGroupOrdninalCurated(targetExpression))); } } return returnedRuleExpression; } private Boolean isGroupRepeating(ItemGroupMetadataBean itemGroupMetadataBean) { return itemGroupMetadataBean.getRepeatNum() > 1 || itemGroupMetadataBean.getRepeatMax() > 1; } public boolean isInsertActionExpressionValid(String expression, RuleSetBean ruleSet, Integer allowedLength) { boolean result = false; boolean isRuleExpressionValid = false; Integer k = getExpressionSize(expression); if (k.intValue() > allowedLength.intValue()) { return false; } if (ruleSet != null) { String fullExpression = constructFullExpressionIfPartialProvided(expression, ruleSet.getTarget().getValue()); isRuleExpressionValid = checkInsertActionExpressionSyntax(fullExpression); if (isRuleExpressionValid) { isExpressionValid(fullExpression); result = true; } } return result; } public boolean isRandomizeActionExpressionValid(String expression, RuleSetBean ruleSet, Integer allowedLength) { boolean result = false; boolean isRuleExpressionValid = false; Integer k = getExpressionSize(expression); if (k.intValue() > allowedLength.intValue()) { return false; } if (ruleSet != null) { String fullExpression = constructFullExpressionIfPartialProvided(expression, ruleSet.getTarget().getValue()); isRuleExpressionValid = checkInsertActionExpressionSyntax(fullExpression); if (isRuleExpressionValid) { isExpressionValid(fullExpression); result = true; } } return result; } public boolean isExpressionValid(String expression, RuleSetBean ruleSet, Integer allowedLength) { boolean result = false; boolean isRuleExpressionValid = false; Integer k = getExpressionSize(expression); if (k.intValue() > allowedLength.intValue()) { return false; } if (ruleSet != null) { String fullExpression = constructFullExpressionIfPartialProvided(expression, ruleSet.getTarget().getValue()); isRuleExpressionValid = checkSyntax(fullExpression); if (isRuleExpressionValid) { isExpressionValid(fullExpression); result = true; } } return result; } public boolean ruleExpressionChecker(String expression) { boolean result = false; boolean isRuleExpressionValid = false; isExpressionValid(expression); if (checkIfExpressionIsForScheduling(expression)) { if (checkSyntax(expression)) return true; else return false; } if (expressionWrapper.getRuleSet() != null) { if (isExpressionPartial(expressionWrapper.getRuleSet().getTarget().getValue())) { return true; } String fullExpression = constructFullExpressionIfPartialProvided(expression, expressionWrapper.getRuleSet().getTarget().getValue()); if (isExpressionPartial(expression)) { isRuleExpressionValid = checkSyntax(fullExpression); } else { isRuleExpressionValid = checkRuleExpressionSyntax(fullExpression); } if (isRuleExpressionValid) { isExpressionValid(fullExpression); result = true; } String targetGroupOid = getItemGroupOid(expressionWrapper.getRuleSet().getTarget().getValue()); String ruleGroupOid = getItemGroupOid(fullExpression); CRFVersionBean targetCrfVersion = getCRFVersionFromExpression(expressionWrapper.getRuleSet().getTarget().getValue()); CRFVersionBean ruleCrfVersion = getCRFVersionFromExpression(fullExpression); Boolean isTargetGroupRepeating = targetCrfVersion == null ? getItemGroupDao().isItemGroupRepeatingBasedOnAllCrfVersions(targetGroupOid) : getItemGroupDao() .isItemGroupRepeatingBasedOnCrfVersion(targetGroupOid, targetCrfVersion.getId()); Boolean isRuleGroupRepeating = ruleCrfVersion == null ? getItemGroupDao().isItemGroupRepeatingBasedOnAllCrfVersions(ruleGroupOid) : getItemGroupDao() .isItemGroupRepeatingBasedOnCrfVersion(ruleGroupOid, ruleCrfVersion.getId()); if (!isTargetGroupRepeating && isRuleGroupRepeating) { String ordinal = getItemGroupOidOrdinalFromExpression(fullExpression); if (ordinal.equals("") || ordinal.equals("ALL")) { result = false; } } } else { if (checkSyntax(expression) && getItemBeanFromExpression(expression) != null) { result = true; } } return result; } public Integer getExpressionSize(String expression) { String[] splitExpression = expression.split(ESCAPED_SEPERATOR); return splitExpression.length; } public Boolean isExpressionPartial(String expression) { String[] splitExpression = expression.split(ESCAPED_SEPERATOR); /* if(expression.endsWith(STARTDATE)||expression.endsWith(STATUS)){ return false; } else */if (splitExpression.length == 4) return false; else return true; } public String constructFullExpressionIfPartialProvided(String expression, CRFVersionBean crfVersion, StudyEventDefinitionBean studyEventDefinition) { String[] splitExpression = expression.split(ESCAPED_SEPERATOR); String resultingExpression = null; if (splitExpression.length == 1) { ItemGroupMetadataBean itemGroupMetadata = (ItemGroupMetadataBean) getItemGroupMetadataDao().findByItemAndCrfVersion(getItemBeanFromExpression(expression).getId(), crfVersion.getId()); ItemGroupBean itemGroup = (ItemGroupBean) getItemGroupDao().findByPK(itemGroupMetadata.getItemGroupId()); resultingExpression = studyEventDefinition.getOid() + SEPERATOR + crfVersion.getOid() + SEPERATOR + itemGroup.getOid() + SEPERATOR + expression; } if (splitExpression.length == 2) { resultingExpression = studyEventDefinition.getOid() + SEPERATOR + crfVersion.getOid() + SEPERATOR + expression; } if (splitExpression.length == 3) { resultingExpression = studyEventDefinition.getOid() + SEPERATOR + expression; } return resultingExpression; } public String constructFullExpressionIfPartialProvided(String expression, String ruleSetTargetExpression) { if(expression == null || expression.isEmpty()) { logger.debug("expression is null."); return expression; } else { String[] splitExpression = expression.split(ESCAPED_SEPERATOR); switch (splitExpression.length) { case 1: return deContextualizeExpression(3, expression, ruleSetTargetExpression); case 2: return deContextualizeExpression(2, expression, ruleSetTargetExpression); case 3: return deContextualizeExpression(1, expression, ruleSetTargetExpression); case 4: return expression; default: throw new OpenClinicaSystemException("Full Expression cannot be constructed from provided expression : " + expression); } } } private String deContextualizeExpression(int j, String ruleExpression, String ruleSetTargetExpression) { String ruleSetExpression = ruleSetTargetExpression; String[] splitRuleSetExpression = ruleSetExpression.split(ESCAPED_SEPERATOR); String buildExpression = ""; for (int i = 0; i < j; i++) { buildExpression = buildExpression + splitRuleSetExpression[i] + SEPERATOR; } return buildExpression + ruleExpression; } private String getItemOidFromExpression(String expression) throws OpenClinicaSystemException { return getOidFromExpression(expression, 0, 0); } private String getItemGroupOidFromExpression(String expression) throws OpenClinicaSystemException { return getOidFromExpression(expression, 1, 1).replaceAll(BRACKETS_AND_CONTENTS, ""); } private String getItemGroupOidWithOrdinalFromExpression(String expression) throws OpenClinicaSystemException { return getOidFromExpression(expression, 1, 1); } private String getItemGroupOidOrdinalFromExpression(String expression) throws OpenClinicaSystemException { String itemGroupOid = getOidFromExpression(expression, 1, 1); String itemGroupOidOrdinal = ""; if (itemGroupOid.matches(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_WITH_ORDINAL)) { itemGroupOidOrdinal = itemGroupOid.trim().replaceAll(PRE, "").trim().replaceAll(POST, ""); } return itemGroupOidOrdinal; } private String getItemGroupPLusItem(String expression) throws OpenClinicaSystemException { return getItemGroupOidWithOrdinalFromExpression(expression) + SEPERATOR + getItemOidFromExpression(expression); } private String getCrfOidFromExpression(String expression) throws OpenClinicaSystemException { return getOidFromExpression(expression, 2, 2); } private String getStudyEventDefinitionOidFromExpression(String expression) throws OpenClinicaSystemException { return getOidFromExpression(expression, 3, 3).replaceAll(BRACKETS_AND_CONTENTS, ""); } private String getStudyEventDefinitionOidWithOrdinalFromExpression(String expression) throws OpenClinicaSystemException { return getOidFromExpression(expression, 3, 3); } public String getItemGroupNameAndOrdinal(String expression) { return getItemGroupExpression(expression).getName() + " " + OPENNIG_BRACKET + getItemGroupOidOrdinalFromExpression(expression) + CLOSING_BRACKET; } public String getStudyEventDefinitionOidOrdinalFromExpression(String expression) throws OpenClinicaSystemException { String studyEventDefinitionOid = getOidFromExpression(expression, 3, 3); String studyEventDefinitionOidOrdinal = ""; if (studyEventDefinitionOid.matches(STUDY_EVENT_DEFINITION_OR_ITEM_GROUP_PATTERN_WITH_ORDINAL)) { studyEventDefinitionOidOrdinal = studyEventDefinitionOid.trim().replaceAll(PRE, "").trim().replaceAll(POST, ""); } return studyEventDefinitionOidOrdinal; } /** * Use this method to create 1ItemOID or ItemOID Used in Data Entry Rule * Execution * * @param expression * @return GroupOrdinal + ItemOID */ public String getGroupOrdninalConcatWithItemOid(String expression) { String ordinal = getGroupOrdninalCurated(expression); logger.debug(" orginigal expression {} , post getGroupOrdninalConcatWithItemOid : {} ", expression, ordinal + getItemOidFromExpression(expression)); return ordinal + getItemOidFromExpression(expression); } public String getGroupOidWithItemOid(String expression) { return getItemGroupOidWithOrdinalFromExpression(expression) + SEPERATOR + getItemOidFromExpression(expression); } public String getItemOid(String expression) { return getItemOidFromExpression(expression); } public String getItemGroupOid(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 2) { return null; } return getItemGroupOidFromExpression(expression); } public String getCrfOid(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 3) { return null; } return getCrfOidFromExpression(expression); } public String getStudyEventDefenitionOid(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 4) { return null; } return getStudyEventDefinitionOidFromExpression(expression); } public String getGroupOrdninalCurated(String expression) { String originalOrdinal = getItemGroupOidOrdinalFromExpression(expression); String ordinal = originalOrdinal.equals(ALL_IN_BRACKETS) ? "" : originalOrdinal; return ordinal; } public String getStudyEventDefinitionOrdninalCurated(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 4) { return ""; } String originalOrdinal = getStudyEventDefinitionOidOrdinalFromExpression(expression); String ordinal = originalOrdinal.equals(ALL_IN_BRACKETS) ? "" : originalOrdinal; return ordinal; } public String getStudyEventDefenitionOrdninalCurated(String expression) { String originalOrdinal = getStudyEventDefinitionOidOrdinalFromExpression(expression); String ordinal = null; if (originalOrdinal.equals(ALL_IN_BRACKETS)) { throw new OpenClinicaSystemException("ALL not supported in the following instance"); } else if (originalOrdinal.equals("")) { ordinal = "1"; } else { ordinal = originalOrdinal; } return ordinal; } public String getGroupOidConcatWithItemOid(String expression) { String result = getItemGroupOidFromExpression(expression) + SEPERATOR + getItemOidFromExpression(expression); logger.debug("getGroupOidConcatWithItemOid returns : {} ", result); return result; } public String getGroupOidOrdinal(String expression) { String result = this.getItemGroupOidWithOrdinalFromExpression(expression); logger.debug("getGroupOidOrdinal returns : {} ", result); return result; } public String replaceGroupOidOrdinalInExpression(String expression, Integer ordinal) { String replacement = getStudyEventDefinitionOidWithOrdinalFromExpression(expression) + SEPERATOR + getCrfOidFromExpression(expression) + SEPERATOR; if (ordinal == null) { replacement += getItemGroupOidWithOrdinalFromExpression(expression) + SEPERATOR + getItemOidFromExpression(expression); } else { replacement += getItemGroupOidFromExpression(expression) + OPENNIG_BRACKET + ordinal + CLOSING_BRACKET + SEPERATOR + getItemOidFromExpression(expression); } logger.debug("Original Expression : {} , Rewritten as {} .", expression, replacement); return replacement; } public String replaceCRFOidInExpression(String expression, String replacementCrfOid) { if (expression.split(ESCAPED_SEPERATOR).length < 4) { if (expression.split(ESCAPED_SEPERATOR).length == 3) { return replacementCrfOid + SEPERATOR + getItemGroupOidWithOrdinalFromExpression(expression) + SEPERATOR + getItemOidFromExpression(expression); } return expression; } return getStudyEventDefinitionOidWithOrdinalFromExpression(expression) + SEPERATOR + replacementCrfOid + SEPERATOR + getItemGroupOidWithOrdinalFromExpression(expression) + SEPERATOR + getItemOidFromExpression(expression); } public String getCustomExpressionUsedToCreateView(String expression, int sampleOrdinal) { return getStudyEventDefenitionOid(expression) + OPENNIG_BRACKET + sampleOrdinal + CLOSING_BRACKET + SEPERATOR + "XXX" + SEPERATOR + getGroupOidWithItemOid(expression); } public String replaceStudyEventDefinitionOIDWith(String expression, String replacement) { replacement = getStudyEventDefinitionOidFromExpression(expression) + OPENNIG_BRACKET + replacement + CLOSING_BRACKET; String studyEventDefinitionOID = getStudyEventDefinitionOidWithOrdinalFromExpression(expression); return expression.replace(studyEventDefinitionOID, replacement); } /* * public String replaceFirstIntegerBy(String expression, String * replacement) { return expression.trim().replaceFirst("\\[\\d+\\]", "[" + * replacement + "]"); } */ private String getOidFromExpression(String expression, int patternIndex, int expressionIndex) throws OpenClinicaSystemException { String[] splitExpression = expression.split(ESCAPED_SEPERATOR); // int patternIndex = ?; if (!match(splitExpression[splitExpression.length - 1 - expressionIndex], pattern[patternIndex])) { if (!match(splitExpression[splitExpression.length - 1 - expressionIndex], ruleActionPattern[patternIndex])) { throw new OpenClinicaSystemException("OCRERR_0019", new String[] { expression }); } } return splitExpression[splitExpression.length - 1 - expressionIndex]; } public ItemBean getItemBeanFromExpression(String expression) { List<ItemBean> items = getItemDao().findByOid(getItemOidFromExpression(expression)); return items.size() > 0 ? items.get(0) : null; } public StudyEventDefinitionBean getStudyEventDefinitionFromExpression(String expression) { if (expression.split(ESCAPED_SEPERATOR).length == 4){ return getStudyEventDefinitionFromExpression(expression, expressionWrapper.getStudyBean()) ; } else if (expression.split(ESCAPED_SEPERATOR).length == 2 && (expression.endsWith(STARTDATE)|| expression.endsWith(STATUS))){ return getStudyEventDefinitionFromExpressionForEvents(expression, expressionWrapper.getStudyBean()); } else return null; } public StudyEventDefinitionBean getStudyEventDefinitionFromExpressionForEvents( String expression, StudyBean study) { // TODO Auto-generated method stub String studyEventDefinitionKey = getStudyEventDefinitionOidFromExpressionForEvents(expression); logger.debug("Expression : {} , Study Event Definition OID {} , Study Bean {} ", new Object[] { expression, studyEventDefinitionKey, study.getId() }); if (studyEventDefinitions.get(studyEventDefinitionKey) != null) { return studyEventDefinitions.get(studyEventDefinitionKey); } else { // temp fix int studyId = study.getParentStudyId() != 0 ? study.getParentStudyId() : study.getId(); StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionDao().findByOidAndStudy(studyEventDefinitionKey, studyId, studyId); // another way to get at the problem which I fix in the // findByOidAndStudy method, tbh if (studyEventDefinition != null) { studyEventDefinitions.put(studyEventDefinitionKey, studyEventDefinition); return studyEventDefinition; } else { return null; } } } public String getStudyEventDefinitionOidFromExpressionForEvents( String expression) { return getOidFromExpression(expression, 1, 1).replaceAll(BRACKETS_AND_CONTENTS, ""); } public StudyEventDefinitionBean getStudyEventDefinitionFromExpression(String expression, StudyBean study) { String studyEventDefinitionKey = getStudyEventDefinitionOidFromExpression(expression); logger.debug("Expression : {} , Study Event Definition OID {} , Study Bean {} ", new Object[] { expression, studyEventDefinitionKey, study.getId() }); if (studyEventDefinitions.get(studyEventDefinitionKey) != null) { return studyEventDefinitions.get(studyEventDefinitionKey); } else { // temp fix int studyId = study.getParentStudyId() != 0 ? study.getParentStudyId() : study.getId(); StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionDao().findByOidAndStudy(studyEventDefinitionKey, studyId, studyId); // another way to get at the problem which I fix in the // findByOidAndStudy method, tbh if (studyEventDefinition != null) { studyEventDefinitions.put(studyEventDefinitionKey, studyEventDefinition); return studyEventDefinition; } else { return null; } } } public StudyEventDefinitionBean getStudyEventDefinitionFromExpressionForEventScheduling(String expression) { return expression.split(ESCAPED_SEPERATOR).length == 2 ? getStudyEventDefinitionFromExpressionForEventScheduling(expression, false) : null; } public StudyEventDefinitionBean getStudyEventDefinitionFromExpressionForEventScheduling(String expression, boolean onlyOID) { StudyBean study = expressionWrapper.getStudyBean(); String studyEventDefinitionKey; if (onlyOID) studyEventDefinitionKey = expression.replaceAll(BRACKETS_AND_CONTENTS, ""); else studyEventDefinitionKey = getOidFromExpression(expression, 1, 1).replaceAll(BRACKETS_AND_CONTENTS, ""); logger.debug("Expression : {} , Study Event Definition OID {} , Study Bean {} ", new Object[] { expression, studyEventDefinitionKey,study!=null? study.getId():null }); if (studyEventDefinitions.get(studyEventDefinitionKey) != null) { return studyEventDefinitions.get(studyEventDefinitionKey); } else { StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionDao().findByOid(studyEventDefinitionKey); // another way to get at the problem which I fix in the // findByOidAndStudy method, tbh if (studyEventDefinition != null) { studyEventDefinitions.put(studyEventDefinitionKey, studyEventDefinition); return studyEventDefinition; } else { return null; } } } public ItemGroupBean getItemGroupExpression(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 2) { return null; } String itemGroupKey = getItemGroupOidFromExpression(expression); logger.debug("Expression : {} , ItemGroup OID : {} " + expression, itemGroupKey); if (itemGroups.get(itemGroupKey) != null) { return itemGroups.get(itemGroupKey); } else { ItemGroupBean itemGroup = getItemGroupDao().findByOid(itemGroupKey); if (itemGroup != null) { itemGroups.put(itemGroupKey, itemGroup); return itemGroup; } else { return null; } } } public ItemGroupBean getItemGroupExpression(String expression, CRFBean crf) { logger.debug("Expression : " + expression); logger.debug("Expression : " + getItemGroupOidFromExpression(expression)); ItemGroupBean itemGroup = getItemGroupDao().findByOidAndCrf(getItemGroupOidFromExpression(expression), crf.getId()); return itemGroup; } /* * public ItemGroupBean getItemGroupFromExpression(String expression) { * logger.debug("Expression : " + expression); logger.debug("Expression : " * + getItemGroupOidFromExpression(expression)); return * getItemGroupDao().findByOid(getItemGroupOidFromExpression(expression)); } */ public ItemBean getItemExpression(String expression, ItemGroupBean itemGroup) { String itemKey = getItemOidFromExpression(expression); logger.debug("Expression : {} , Item OID : {}", expression, itemKey); if (items.containsKey(itemKey)) { return items.get(itemKey); } else { ItemBean item = getItemDao().findItemByGroupIdandItemOid(itemGroup.getId(), itemKey); if (item != null) { items.put(itemKey, item); return item; } else { return null; } } } public ItemBean getItemFromExpression(String expression) { String itemKey = getItemOidFromExpression(expression); logger.debug("Expression : {} , Item OID : {}", expression, itemKey); if (items.containsKey(itemKey)) { return items.get(itemKey); } else { List<ItemBean> persistentItems = getItemDao().findByOid(itemKey); ItemBean item = persistentItems.size() > 0 ? persistentItems.get(0) : null; if (item != null) { items.put(itemKey, item); return item; } else { return null; } } } public CRFBean getCRFFromExpression(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 3) { return null; } CRFBean crf; logger.debug("Expression : " + expression); logger.debug("Expression : " + getCrfOidFromExpression(expression)); CRFVersionBean crfVersion = getCrfVersionDao().findByOid(getCrfOidFromExpression(expression)); if (crfVersion != null) { int crfId = getCrfVersionDao().getCRFIdFromCRFVersionId(crfVersion.getId()); crf = (CRFBean) getCrfDao().findByPK(crfId); } else { crf = getCrfDao().findByOid(getCrfOidFromExpression(expression)); } return crf; // return crfVersions.size() > 0 ? crfVersions.get(0) : null; } public CRFVersionBean getCRFVersionFromExpression(String expression) { logger.debug("Expression : " + expression); return expression.split(ESCAPED_SEPERATOR).length < 3 ? null : getCrfVersionDao().findByOid(getCrfOidFromExpression(expression)); } /** * Given a Complete Expression check business logic validity of each * component. Will throw OpenClinicaSystemException with correct * explanation. This might allow immediate communication of message to user * . * * @param expression */ @Deprecated public void isExpressionValidOLD(String expression) { StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionFromExpression(expression); CRFBean crf = getCRFFromExpression(expression); if (studyEventDefinition == null || crf == null) throw new OpenClinicaSystemException("OCRERR_0020"); EventDefinitionCRFBean eventDefinitionCrf = getEventDefinitionCRFDao().findByStudyEventDefinitionIdAndCRFId(this.expressionWrapper.getStudyBean(), studyEventDefinition.getId(), crf.getId()); if (eventDefinitionCrf == null || eventDefinitionCrf.getId() == 0 || eventDefinitionCrf.getStatus() != Status.AVAILABLE) throw new OpenClinicaSystemException("OCRERR_0021"); ItemGroupBean itemGroup = getItemGroupExpression(expression, crf); if (itemGroup == null) throw new OpenClinicaSystemException("OCRERR_0022"); ItemBean item = getItemExpression(expression, itemGroup); if (item == null) throw new OpenClinicaSystemException("OCRERR_0023"); logger.debug("Study Event Definition ID : " + studyEventDefinition.getId()); logger.debug("Crf ID : " + crf.getId()); logger.debug("Event Definition CRF ID : " + eventDefinitionCrf.getId()); logger.debug("Item ID : " + item.getId()); } /** * Given a Complete Expression check business logic validity of each * component. Will throw OpenClinicaSystemException with correct * explanation. This might allow immediate communication of message to user * . * * @param expression */ public void isExpressionValid(String expression) { int length = expression.split(ESCAPED_SEPERATOR).length; ItemBean item = null; ItemGroupBean itemGroup = null; CRFBean crf = null; boolean isEventStartDateAndStatusParamExist = (expression.endsWith(STARTDATE) ||expression.endsWith(STATUS)); if (length > 0 && !isEventStartDateAndStatusParamExist) { item = getItemFromExpression(expression); if (item == null) throw new OpenClinicaSystemException("OCRERR_0023"); // throw new OpenClinicaSystemException("item is Invalid"); } if (length > 1 && !isEventStartDateAndStatusParamExist) { String itemGroupOid = getItemGroupOidFromExpression(expression); itemGroup = getItemGroupDao().findByOid(itemGroupOid); ArrayList <ItemGroupBean> igBean = (ArrayList<ItemGroupBean>) getItemGroupDao().findGroupsByItemID(item.getId()); if(itemGroup == null || itemGroup.getId() != igBean.get(0).getId()) throw new OpenClinicaSystemException("OCRERR_0022"); // throw new OpenClinicaSystemException("itemGroup is Invalid"); } if (length > 2 && !isEventStartDateAndStatusParamExist) { crf = getCRFFromExpression(expression); if (crf == null || crf.getId() != itemGroup.getCrfId()) throw new OpenClinicaSystemException("OCRERR_0033"); // throw new OpenClinicaSystemException("CRF is Invalid"); } if (length > 3 && !isEventStartDateAndStatusParamExist) { StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionFromExpression(expression); crf = getCRFFromExpression(expression); if (studyEventDefinition == null || crf == null) throw new OpenClinicaSystemException("OCRERR_0034", new String[] { expression }); // throw new // OpenClinicaSystemException("StudyEventDefinition is Invalid"); EventDefinitionCRFBean eventDefinitionCrf = getEventDefinitionCRFDao().findByStudyEventDefinitionIdAndCRFId(this.expressionWrapper.getStudyBean(), studyEventDefinition.getId(), crf.getId()); if (eventDefinitionCrf == null || eventDefinitionCrf.getId() == 0) throw new OpenClinicaSystemException("OCRERR_0034", new String[] { expression }); // throw new // OpenClinicaSystemException("StudyEventDefinition is Invalid"); } if (length == 2 && isEventStartDateAndStatusParamExist) { StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionFromExpressionForEventScheduling(expression); // System.out.println("StudyEventDefinition: " + studyEventDefinition.getOid()); if (studyEventDefinition == null) throw new OpenClinicaSystemException("OCRERR_0034", new String[] { expression }); } if (length != 2 && isEventStartDateAndStatusParamExist) { throw new OpenClinicaSystemException("OCRERR_0034", new String[] { expression }); } } public EventDefinitionCRFBean getEventDefinitionCRF(String expression) { if (expression.split(ESCAPED_SEPERATOR).length < 4) { return null; } StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionFromExpression(expression); CRFBean crf = getCRFFromExpression(expression); if (studyEventDefinition == null || crf == null) throw new OpenClinicaSystemException("OCRERR_0020"); return getEventDefinitionCRFDao() .findByStudyEventDefinitionIdAndCRFId(this.expressionWrapper.getStudyBean(), studyEventDefinition.getId(), crf.getId()); } public String checkValidityOfItemOrItemGroupOidInCrf(String oid, RuleSetBean ruleSet) { oid = oid.trim(); String[] theOid = oid.split(ESCAPED_SEPERATOR); if (theOid.length == 2) { ItemGroupBean itemGroup = getItemGroupDao().findByOid(theOid[0]); Boolean isItemGroupBePartOfCrfOrNull = ruleSet.getCrfId() != null ? itemGroup.getCrfId().equals(ruleSet.getCrfId()) : true; if (itemGroup != null && isItemGroupBePartOfCrfOrNull) { if (ruleSet.getCrfId() != null && itemGroup.getCrfId().equals(ruleSet.getCrfId())) { return "OK"; } if (ruleSet.getCrfId() != null && !itemGroup.getCrfId().equals(ruleSet.getCrfId())) { return oid; } ItemBean item = getItemDao().findItemByGroupIdandItemOid(itemGroup.getId(), theOid[1]); if (item != null) { return "OK"; } } } if (theOid.length == 1) { ItemGroupBean itemGroup = getItemGroupDao().findByOid(oid); if (itemGroup != null) { if (ruleSet.getCrfId() != null && itemGroup.getCrfId().equals(ruleSet.getCrfId())) { return "OK"; } if (ruleSet.getCrfId() != null && !itemGroup.getCrfId().equals(ruleSet.getCrfId())) { return oid; } return "OK"; } // ItemBean item = // getItemDao().findItemByGroupIdandItemOid(getItemGroupExpression(ruleSet.getTarget().getValue()).getId(), // oid); ArrayList <ItemBean> items = (ArrayList<ItemBean>) getItemDao().findByOid(oid); if (items==null || items.size() !=0){ return "OK"; } } return oid; } public String isExpressionValid(String oid, RuleSetBean ruleSet) { StudyEventDefinitionBean studyEventDefinition = getStudyEventDefinitionFromExpression(ruleSet.getTarget().getValue()); String[] theOid = oid.split(ESCAPED_SEPERATOR); if (theOid.length == 3) { ItemGroupBean itemGroup = getItemGroupDao().findByOid(theOid[0]); if (itemGroup != null && itemGroup.getCrfId().equals(ruleSet.getCrfId())) { ItemBean item = getItemDao().findItemByGroupIdandItemOid(itemGroup.getId(), theOid[1]); if (item != null) { return "OK"; } } } if (theOid.length == 2) { ItemGroupBean itemGroup = getItemGroupDao().findByOid(theOid[0]); if (itemGroup != null && itemGroup.getCrfId().equals(ruleSet.getCrfId())) { ItemBean item = getItemDao().findItemByGroupIdandItemOid(itemGroup.getId(), theOid[1]); if (item != null) { return "OK"; } } } if (theOid.length == 1) { ItemGroupBean itemGroup = getItemGroupDao().findByOid(oid); if (itemGroup != null && itemGroup.getCrfId().equals(ruleSet.getCrfId())) { return "OK"; } ItemBean item = getItemDao().findItemByGroupIdandItemOid(getItemGroupExpression(ruleSet.getTarget().getValue()).getId(), oid); if (item != null) { return "OK"; } } return oid; } public boolean checkSyntax(String expression) { if (expression.startsWith(SEPERATOR) || expression.endsWith(SEPERATOR)) { return false; } String[] splitExpression = expression.split(ESCAPED_SEPERATOR); int patternIndex = 0; for (int i = splitExpression.length - 1; i >= 0; i--) { if (!match(splitExpression[i], pattern[patternIndex++])) { return false; } } return true; } public boolean checkInsertActionExpressionSyntax(String expression) { if (expression.startsWith(SEPERATOR) || expression.endsWith(SEPERATOR)) { return false; } String[] splitExpression = expression.split(ESCAPED_SEPERATOR); int patternIndex = 0; for (int i = splitExpression.length - 1; i >= 0; i--) { if (!match(splitExpression[i], ruleActionPattern[patternIndex++])) { return false; } } return true; } public boolean checkRuleExpressionSyntax(String expression) { if (expression.startsWith(SEPERATOR) || expression.endsWith(SEPERATOR)) { return false; } String[] splitExpression = expression.split(ESCAPED_SEPERATOR); int patternIndex = 0; for (int i = splitExpression.length - 1; i >= 0; i--) { if (!match(splitExpression[i], rulePattern[patternIndex++])) { return false; } } return true; } private boolean match(String input, Pattern pattern) { Matcher matcher = pattern.matcher(input); return matcher.matches(); } private ItemDAO getItemDao() { // itemDao = this.itemDao != null ? itemDao : new ItemDAO(ds); return new ItemDAO(ds); } private ItemDataDAO getItemDataDao() { // itemDataDao = this.itemDataDao != null ? itemDataDao : new ItemDataDAO(ds); return new ItemDataDAO(ds); } private CRFVersionDAO getCrfVersionDao() { // crfVersionDao = this.crfVersionDao != null ? crfVersionDao : new CRFVersionDAO(ds); return new CRFVersionDAO(ds); } private CRFDAO getCrfDao() { // crfDao = this.crfDao != null ? crfDao : new CRFDAO(ds); return new CRFDAO(ds); } private ItemGroupDAO getItemGroupDao() { //itemGroupDao = this.itemGroupDao != null ? itemGroupDao : new ItemGroupDAO(ds); return new ItemGroupDAO(ds); } private ItemGroupMetadataDAO getItemGroupMetadataDao() { //itemGroupMetadataDao = this.itemGroupMetadataDao != null ? itemGroupMetadataDao : new ItemGroupMetadataDAO(ds); //return itemGroupMetadataDao; return new ItemGroupMetadataDAO(ds); } private EventDefinitionCRFDAO getEventDefinitionCRFDao() { // eventDefinitionCRFDao = this.eventDefinitionCRFDao != null ? eventDefinitionCRFDao : new EventDefinitionCRFDAO(ds); // return eventDefinitionCRFDao; return new EventDefinitionCRFDAO(ds); } private StudyEventDefinitionDAO getStudyEventDefinitionDao() { // studyEventDefinitionDao = this.studyEventDefinitionDao != null ? studyEventDefinitionDao : new StudyEventDefinitionDAO(ds); // return studyEventDefinitionDao; return new StudyEventDefinitionDAO(ds); } private StudyEventDAO getStudyEventDao() { // studyEventDao = this.studyEventDao != null ? studyEventDao : new StudyEventDAO(ds); // return studyEventDao; return new StudyEventDAO(ds); } private StudySubjectDAO getStudySubjectDao() { return new StudySubjectDAO(ds); } private EventCRFDAO getEventCRFDao() { // eventCRFDao = this.eventCRFDao != null ? eventCRFDao : new EventCRFDAO(ds); // return eventCRFDao; return new EventCRFDAO(ds); } public void setExpressionWrapper(ExpressionObjectWrapper expressionWrapper) { this.expressionWrapper = expressionWrapper; } }