package org.akaza.openclinica.web.pform; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.sql.DataSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.akaza.openclinica.bean.admin.CRFBean; import org.akaza.openclinica.bean.submit.CRFVersionBean; import org.akaza.openclinica.bean.submit.ItemBean; import org.akaza.openclinica.bean.submit.ItemFormMetadataBean; import org.akaza.openclinica.bean.submit.ItemGroupBean; import org.akaza.openclinica.bean.submit.ItemGroupMetadataBean; import org.akaza.openclinica.bean.submit.SectionBean; import org.akaza.openclinica.control.managestudy.CRFVersionMetadataUtil; import org.akaza.openclinica.dao.admin.CRFDAO; import org.akaza.openclinica.dao.core.CoreResources; import org.akaza.openclinica.dao.hibernate.RuleActionPropertyDao; import org.akaza.openclinica.dao.submit.CRFVersionDAO; import org.akaza.openclinica.dao.submit.ItemDAO; import org.akaza.openclinica.dao.submit.ItemFormMetadataDAO; import org.akaza.openclinica.dao.submit.ItemGroupDAO; import org.akaza.openclinica.dao.submit.ItemGroupMetadataDAO; import org.akaza.openclinica.dao.submit.SectionDAO; import org.akaza.openclinica.domain.rule.action.PropertyBean; import org.akaza.openclinica.domain.rule.action.RuleActionBean; import org.akaza.openclinica.domain.rule.expression.ExpressionBean; import org.akaza.openclinica.exception.OpenClinicaException; import org.akaza.openclinica.web.pform.dto.Bind; import org.akaza.openclinica.web.pform.dto.Body; import org.akaza.openclinica.web.pform.dto.Group; import org.akaza.openclinica.web.pform.dto.Html; import org.akaza.openclinica.web.pform.dto.Label; import org.akaza.openclinica.web.pform.dto.Model; import org.akaza.openclinica.web.pform.dto.Repeat; import org.akaza.openclinica.web.pform.dto.UserControl; import org.akaza.openclinica.web.pform.widget.Widget; import org.akaza.openclinica.web.pform.widget.WidgetFactory; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.exolab.castor.mapping.Mapping; import org.exolab.castor.xml.Marshaller; import org.exolab.castor.xml.Unmarshaller; import org.exolab.castor.xml.XMLContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * @author joekeremian * */ public class OpenRosaXmlGenerator { private XMLContext xmlContext = null; private DataSource dataSource = null; protected final Logger log = LoggerFactory.getLogger(OpenRosaXmlGenerator.class); CoreResources coreResources; private RuleActionPropertyDao ruleActionPropertyDao; private ItemDAO idao; private ItemGroupDAO igdao; private ItemGroupMetadataDAO igmdao; private ItemFormMetadataDAO itemFormMetadataDAO; private SectionDAO sdao; protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); public OpenRosaXmlGenerator(CoreResources core, DataSource dataSource, RuleActionPropertyDao ruleActionPropertyDao) throws Exception { this.dataSource = dataSource; this.coreResources = core; this.ruleActionPropertyDao = ruleActionPropertyDao; try { xmlContext = new XMLContext(); Mapping mapping = xmlContext.createMapping(); mapping.loadMapping(core.getURL("openRosaXFormMapping.xml")); xmlContext.addMapping(mapping); } catch (Exception e) { log.error(e.getMessage()); log.error(ExceptionUtils.getStackTrace(e)); throw new Exception(e); } } /** * @param formId * @return * @throws Exception */ public String buildForm(String formId) throws Exception { try { CRFVersionDAO versionDAO = new CRFVersionDAO(dataSource); CRFVersionBean crfVersion = versionDAO.findByOid(formId); CRFDAO crfDAO = new CRFDAO(dataSource); CRFBean crf = (CRFBean) crfDAO.findByPK(crfVersion.getCrfId()); CRFVersionMetadataUtil metadataUtil = new CRFVersionMetadataUtil(dataSource); ArrayList<SectionBean> crfSections = metadataUtil.retrieveFormMetadata(crfVersion); StringWriter writer = new StringWriter(); IOUtils.copy(getClass().getResourceAsStream("/properties/xform_template.xml"), writer, "UTF-8"); String xform = writer.toString(); Html html = buildJavaXForm(xform); int sectionCount = mapBeansToDTO(html, crf, crfVersion, crfSections); if (sectionCount > 1) setFormPaging(html); String xformMinusInstance = buildStringXForm(html); String preInstance = xformMinusInstance.substring(0, xformMinusInstance.indexOf("<instance>")); String instance = buildInstance(html.getHead().getModel(), crfVersion, crfSections); String nodeset = xformMinusInstance.substring(xformMinusInstance.indexOf("</instance>") + "</instance>".length()); // add nodeset for instanceId String postInstance = "<bind calculate=\"concat('uuid:', uuid())\" nodeset=\"/" + crfVersion.getOid() + "/meta/instanceID\" readonly=\"true()\" type=\"string\"/>" + nodeset; logger.debug(preInstance + "<instance>\n" + instance + "\n</instance>" + postInstance); System.out.println(preInstance + "<instance>\n" + instance + "\n</instance>" + postInstance); return preInstance + "<instance>\n" + instance + "\n</instance>" + postInstance; } catch (Exception e) { log.error(e.getMessage()); log.error(ExceptionUtils.getStackTrace(e)); throw new Exception(e); } } @SuppressWarnings({ "rawtypes", "unchecked" }) private ArrayList<ItemGroupBean> getItemGroupBeans(SectionBean section) throws Exception { ArrayList<ItemGroupBean> itemGroupBeans = null; igdao = new ItemGroupDAO(dataSource); itemGroupBeans = (ArrayList<ItemGroupBean>) igdao.findGroupBySectionId(section.getId()); return itemGroupBeans; } @SuppressWarnings({ "rawtypes", "unchecked" }) private ArrayList<ItemGroupBean> getItemGroupBeansByCrfVersion(CRFVersionBean crfVersion) throws Exception { ArrayList<ItemGroupBean> itemGroupBeans = null; igdao = new ItemGroupDAO(dataSource); itemGroupBeans = (ArrayList<ItemGroupBean>) igdao.findGroupByCRFVersionID(crfVersion.getId()); return itemGroupBeans; } @SuppressWarnings({ "rawtypes", "unchecked" }) private ItemGroupBean getItemGroupBeanByItemId(Integer itemId) { ArrayList<ItemGroupBean> itemGroupBean = null; igdao = new ItemGroupDAO(dataSource); itemGroupBean = (ArrayList<ItemGroupBean>) igdao.findGroupsByItemID(itemId); return itemGroupBean.get(0); } private SectionBean getSectionBean(Integer ID) { sdao = new SectionDAO(dataSource); SectionBean sBean = (SectionBean) sdao.findByPK(ID); return sBean; } @SuppressWarnings({ "rawtypes", "unchecked" }) private ItemBean getItemBean(String itemOid) { ArrayList<ItemBean> itemBean = null; idao = new ItemDAO(dataSource); itemBean = (ArrayList<ItemBean>) idao.findByOid(itemOid); return itemBean.get(0); } private ItemBean getItemBean(int itemId) { ItemBean itemBean = null; idao = new ItemDAO(dataSource); itemBean = (ItemBean) idao.findByPK(itemId); return itemBean; } @SuppressWarnings({ "unused", "rawtypes" }) private ItemFormMetadataBean getItemFormMetadataBeanById(Integer id) throws OpenClinicaException { itemFormMetadataDAO = new ItemFormMetadataDAO(dataSource); ItemFormMetadataBean itemFormMetadataBean = (ItemFormMetadataBean) itemFormMetadataDAO.findByPK(id); return itemFormMetadataBean; } @SuppressWarnings("rawtypes") private ItemFormMetadataBean getItemFormMetadata(ItemBean item, CRFVersionBean crfVersion) throws Exception { ItemFormMetadataBean itemFormMetadataBean = null; ItemFormMetadataDAO ifmdao = new ItemFormMetadataDAO(dataSource); itemFormMetadataBean = ifmdao.findByItemIdAndCRFVersionId(item.getId(), crfVersion.getId()); return itemFormMetadataBean; } @SuppressWarnings({ "unchecked", "rawtypes" }) private ItemGroupMetadataBean getItemGroupMetadata(ItemGroupBean itemGroupBean, CRFVersionBean crfVersion, SectionBean section) throws Exception { ArrayList<ItemGroupMetadataBean> itemGroupMetadataBean = null; ItemGroupMetadataDAO itemGroupMetadataDAO = new ItemGroupMetadataDAO(dataSource); itemGroupMetadataBean = (ArrayList<ItemGroupMetadataBean>) itemGroupMetadataDAO.findMetaByGroupAndSection(itemGroupBean.getId(), crfVersion.getId(), section.getId()); return itemGroupMetadataBean.get(0); } @SuppressWarnings({ "unchecked", "rawtypes" }) private ItemGroupMetadataBean getItemGroupMetadataByGroup(ItemGroupBean itemGroupBean, CRFVersionBean crfVersion) throws Exception { ArrayList<ItemGroupMetadataBean> itemGroupMetadataBean = null; ItemGroupMetadataDAO itemGroupMetadataDAO = new ItemGroupMetadataDAO(dataSource); itemGroupMetadataBean = (ArrayList<ItemGroupMetadataBean>) itemGroupMetadataDAO.findMetaByGroupAndCrfVersion(itemGroupBean.getId(), crfVersion.getId()); return itemGroupMetadataBean.get(0); } /** * For Skip Pattern; * * @param itemOid * @param groupOid * @return */ private ArrayList<PropertyBean> getItemGroupPropertyBean(String itemOid, String groupOid) { ArrayList<PropertyBean> propertyBeans = null; propertyBeans = getRuleActionPropertyDao().findByOid(itemOid, groupOid); return propertyBeans; } private ArrayList<PropertyBean> getGroupPropertyBean(String groupOid) { ArrayList<PropertyBean> propertyBeans = null; propertyBeans = getRuleActionPropertyDao().findByOid(groupOid); return propertyBeans; } /** * For Skip Pattern * * @param itemBean * @param itemGroupBean * @return */ private ExpressionExpressionEvaluate getSkipPattern(ItemBean itemBean, ItemGroupBean itemGroupBean) { ExpressionExpressionEvaluate eev = new ExpressionExpressionEvaluate(); boolean expressionEvaluate = true; String expression = null; ExpressionBean expressionBean = null; ArrayList<PropertyBean> propertyBeans = null; if (itemBean == null) { propertyBeans = getGroupPropertyBean(itemGroupBean.getOid()); } else { propertyBeans = getItemGroupPropertyBean(itemBean.getOid(), itemGroupBean.getOid()); } if (propertyBeans.size() != 0) { for (PropertyBean propertyBean : propertyBeans) { logger.info("property bean oid: " + propertyBean.getOid()); RuleActionBean ruleActionBean = propertyBean.getRuleActionBean(); if (ruleActionBean.getActionType().getCode() == 3 && ruleActionBean.getRuleSetRule().getStatus().getCode() == 1) { expressionBean = ruleActionBean.getRuleSetRule().getRuleBean().getExpression(); expressionEvaluate = ruleActionBean.getExpressionEvaluatesTo(); logger.info(" ExpressionBean: " + expressionBean.getValue()); if (expression != null) { expression = expression + " and " + expressionBean.getValue(); } else { expression = expressionBean.getValue(); } } } } eev.setExpressionEvaluate(expressionEvaluate); eev.setExpression(expression); return eev; } /** * @param itemGroupBean * @param crfVersion * @param section * @param factory * @param bindList * @return * @throws Exception */ private HashMap<String, Object> getGroupInfo(ItemGroupBean itemGroupBean, CRFVersionBean crfVersion, SectionBean section, WidgetFactory factory, ArrayList<Bind> bindList) throws Exception { boolean expressionEvaluate = true; igmdao = new ItemGroupMetadataDAO(dataSource); List<ItemGroupMetadataBean> itemGroupMetadata = igmdao.findMetaByGroupAndSection(itemGroupBean.getId(), crfVersion.getId(), section.getId()); HashMap<String, Object> map = new HashMap<String, Object>(); Group group = new Group(); Repeat repeat = new Repeat(); group.setUsercontrol(new ArrayList<UserControl>()); repeat.setUsercontrol(new ArrayList<UserControl>()); Label groupHeader = new Label(); groupHeader.setLabel(itemGroupMetadata.get(0).getHeader()); boolean isGroupRepeating = getItemGroupMetadata(itemGroupBean, crfVersion, section).isRepeatingGroup(); String nodeset = "/" + crfVersion.getOid() + "/" + itemGroupBean.getOid(); // repeat.setJrNoAddRemove("true()"); repeat.setJrCount(nodeset); group.setRef(nodeset); repeat.setNodeset(nodeset); String groupExpression = null; ExpressionExpressionEvaluate eev = getSkipPattern(null, itemGroupBean); groupExpression = eev.getExpression(); expressionEvaluate = eev.isExpressionEvaluate(); if (groupExpression != null) groupExpression = getFullExpressionToParse(groupExpression, crfVersion, expressionEvaluate); setGroupWidget(section, crfVersion, groupExpression, bindList, factory, itemGroupBean, group, repeat, isGroupRepeating, groupHeader); map.put("group", group); map.put("repeat", repeat); map.put("isGroupRepeating", isGroupRepeating); return map; } private void setFormPaging(Html html) { html.getBody().setCssClass("pages"); List<Group> groups = html.getBody().getGroup(); for (Group group : groups) { group.setAppearance("field-list"); } } /** * @param html * @param crf * @param crfVersion * @param crfSections * @return * @throws Exception */ private Integer mapBeansToDTO(Html html, CRFBean crf, CRFVersionBean crfVersion, ArrayList<SectionBean> crfSections) throws Exception { boolean expressionEvaluate = true; int sectionCount = 0; ItemFormMetadataBean itemFormMetadataBean = null; Body body = html.getBody(); ArrayList<Group> allSections = new ArrayList<Group>(); ArrayList<Bind> bindList = new ArrayList<Bind>(); WidgetFactory factory = new WidgetFactory(crfVersion); html.getHead().setTitle(crf.getName()); for (SectionBean section : crfSections) { ArrayList<Group> groups = new ArrayList<Group>(); Group singleSection = new Group(); singleSection.setUsercontrol(new ArrayList<UserControl>()); String ref = "/" + crfVersion.getOid() + "/" + "SECTION_" + section.getLabel().replaceAll("\\W", "_"); singleSection.setRef(ref); String sectionExpression = null; igdao = new ItemGroupDAO(dataSource); ArrayList<ItemGroupBean> groupBeans = (ArrayList<ItemGroupBean>) igdao.findGroupBySectionId(section.getId()); int count = 0; if (groupBeans.size() > 0) { for (ItemGroupBean groupBean : groupBeans) { ExpressionExpressionEvaluate eev = getSkipPattern(null, groupBean); String expr = eev.getExpression(); expressionEvaluate = eev.isExpressionEvaluate(); if (expr != null) { if (sectionExpression != null) { sectionExpression = sectionExpression + " and " + expr; count++; } else { sectionExpression = expr; count++; } } } if (sectionExpression != null && groupBeans.size() == count) { sectionExpression = getFullExpressionToParse(sectionExpression, crfVersion, expressionEvaluate); } else { sectionExpression = null; } setSectionWidget(section, crfVersion, sectionExpression, bindList, factory, singleSection); HashMap<String, Object> groupMap = null; boolean isGroupRepeating = false; Group group = null; Repeat repeat = null; idao = new ItemDAO(dataSource); ArrayList<ItemBean> items = (ArrayList<ItemBean>) idao.findAllBySectionIdOrderedByItemFormMetadataOrdinal(section.getId()); Integer itemGroupId = 0; for (ItemBean item : items) { ItemGroupBean itemGroupBean = getItemGroupBeanByItemId(item.getId()); if (itemGroupId != itemGroupBean.getId()) { groupMap = getGroupInfo(itemGroupBean, crfVersion, section, factory, bindList); isGroupRepeating = (Boolean) groupMap.get("isGroupRepeating"); group = (Group) groupMap.get("group"); repeat = (Repeat) groupMap.get("repeat"); } itemFormMetadataBean = getItemFormMetadata(item, crfVersion); int responseTypeId = itemFormMetadataBean.getResponseSet().getResponseTypeId(); boolean isItemRequired = itemFormMetadataBean.isRequired(); String responseLayout = itemFormMetadataBean.getResponseLayout(); String itemExpression = null; ExpressionExpressionEvaluate eev = getSkipPattern(item, itemGroupBean); itemExpression = eev.getExpression(); expressionEvaluate = eev.isExpressionEvaluate(); if (itemExpression != null) itemExpression = getFullExpressionToParse(itemExpression, crfVersion, expressionEvaluate); // Add the Item Header setHeaderWidget(item, itemFormMetadataBean, itemGroupBean, bindList, factory, isGroupRepeating, repeat, group, itemExpression); // Add the Item SubHeader setSubHeaderWidget(item, itemFormMetadataBean, itemGroupBean, bindList, factory, isGroupRepeating, repeat, group, itemExpression); // Add the Item itself setItemWidget(item, responseTypeId, itemFormMetadataBean, itemGroupBean, bindList, factory, isGroupRepeating, repeat, group, isItemRequired, responseLayout, itemExpression); if (itemGroupId != itemGroupBean.getId()) { groups.add(group); itemGroupId = itemGroupBean.getId(); } } // end of item loop singleSection.setGroup(groups); allSections.add(singleSection); } // end of groups per section if exist sectionCount = allSections.size(); } // end of section loop body.setGroup(allSections); html.getHead().getModel().setBind(bindList); return sectionCount; } // method /** * @param model * @param crfVersion * @param crfSections * @return * @throws Exception */ private String buildInstance(Model model, CRFVersionBean crfVersion, ArrayList<SectionBean> crfSections) throws Exception { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder build = docFactory.newDocumentBuilder(); Document doc = build.newDocument(); Element crfElement = doc.createElement(crfVersion.getOid()); crfElement.setAttribute("id", crfVersion.getOid()); doc.appendChild(crfElement); crfElement.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:jr", "http://openrosa.org/javarosa"); for (SectionBean section : crfSections) { Element sectionSubTitle = doc.createElement("SECTION_" + section.getId() + ".SUBTITLE"); Element sectionInstructions = doc.createElement("SECTION_" + section.getId() + ".INSTRUCTIONS"); Element sectionElm = doc.createElement("SECTION_" + section.getLabel().replaceAll("\\W", "_")); crfElement.appendChild(sectionSubTitle); crfElement.appendChild(sectionInstructions); crfElement.appendChild(sectionElm); } ArrayList<ItemGroupBean> itemGroupBeans = getItemGroupBeansByCrfVersion(crfVersion); for (ItemGroupBean itemGroupBean : itemGroupBeans) { ItemGroupMetadataBean itemGroupMetadataBean = getItemGroupMetadataByGroup(itemGroupBean, crfVersion); String repeatGroupMin = itemGroupMetadataBean.getRepeatNum().toString(); Boolean isrepeating = itemGroupMetadataBean.isRepeatingGroup(); Element groupElement = doc.createElement(itemGroupBean.getOid()); if (isrepeating) { groupElement.setTextContent(repeatGroupMin); groupElement.setAttribute("jr:template", ""); Element hiddenOrdinalItem = doc.createElement("OC.REPEAT_ORDINAL"); groupElement.appendChild(hiddenOrdinalItem); } crfElement.appendChild(groupElement); idao = new ItemDAO(dataSource); ArrayList<ItemBean> items = (ArrayList<ItemBean>) idao.findAllItemsByGroupIdOrdered(itemGroupBean.getId(), crfVersion.getId()); for (ItemBean item : items) { ItemFormMetadataBean itemMetaData = getItemFormMetadata(item, crfVersion); if (itemMetaData.getHeader() != null && !itemMetaData.getHeader().equals("")) { Element header = doc.createElement(item.getOid() + ".HEADER"); groupElement.appendChild(header); } if (itemMetaData.getHeader() != null && !itemMetaData.getSubHeader().equals("")) { Element subHeader = doc.createElement(item.getOid() + ".SUBHEADER"); groupElement.appendChild(subHeader); } Element question = doc.createElement(item.getOid()); groupElement.appendChild(question); } // end of item } // end of group // add meta Element meta = doc.createElement("meta"); // add instanceId Element instanceId = doc.createElement("instanceID"); meta.appendChild(instanceId); crfElement.appendChild(meta); TransformerFactory transformFactory = TransformerFactory.newInstance(); Transformer transformer = transformFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); DOMSource source = new DOMSource(doc); transformer.transform(source, result); return writer.toString(); } /** * To Set Default Values for Item Fields * * @param item * @param crfVersion * @param question * @throws Exception */ private void setDefaultElement(ItemBean item, CRFVersionBean crfVersion, Element question) throws Exception { Integer responseTypeId = getItemFormMetadata(item, crfVersion).getResponseSet().getResponseTypeId(); if (responseTypeId == 3 || responseTypeId == 7) { String defaultValue = getItemFormMetadata(item, crfVersion).getDefaultValue(); defaultValue = defaultValue.replace(" ", ""); defaultValue = defaultValue.replace(",", " "); question.setTextContent(defaultValue); } else { question.setTextContent(getItemFormMetadata(item, crfVersion).getDefaultValue()); } } private Html buildJavaXForm(String content) throws Exception { // XML to Object Reader reader = new StringReader(content); Unmarshaller unmarshaller = xmlContext.createUnmarshaller(); unmarshaller.setClass(Html.class); unmarshaller.setWhitespacePreserve(false); Html html = (Html) unmarshaller.unmarshal(reader); reader.close(); return html; } private String buildStringXForm(Html html) throws Exception { StringWriter writer = new StringWriter(); Marshaller marshaller = xmlContext.createMarshaller(); marshaller.setNamespaceMapping("h", "http://www.w3.org/1999/xhtml"); marshaller.setNamespaceMapping("jr", "http://openrosa.org/javarosa"); marshaller.setNamespaceMapping("xsd", "http://www.w3.org/2001/XMLSchema"); marshaller.setNamespaceMapping("ev", "http://www.w3.org/2001/xml-events"); marshaller.setNamespaceMapping("", "http://www.w3.org/2002/xforms"); marshaller.setProperty("org.exolab.castor.indent", "false"); marshaller.setWriter(writer); marshaller.marshal(html); String xform = writer.toString(); return xform; } /** * This method is for Skip pattern to build multiple expressions (not complete yet) * * @param expression * @param version * @return */ private String getFullExpressionToParse(String expression, CRFVersionBean version, boolean expressionEvaluates) throws Exception { String result = ""; expression = " " + expression; expression = expression.replaceAll("\\(", "\\( "); expression = expression.replaceAll("_CURRENT_DATE", "today()"); /* * today() function returns date and time and will not work with 'eq' operator. But it will work with 'gt' or * 'lt' operators */ expression = expression.replaceAll(" I_", " ../I_"); expression = expression.replaceAll("\\S*/I_", " ../I_"); expression = expression.replaceAll(" eq ", " = "); expression = expression.replaceAll(" ct ", " = "); // convert contains expression = expression.replaceAll(" ne ", " != "); expression = expression.replaceAll(" gt ", " > "); expression = expression.replaceAll(" gte ", " >= "); expression = expression.replaceAll(" lt ", " < "); expression = expression.replaceAll(" lte ", " <= "); if (expressionEvaluates == false) { expression = "not(" + expression + ")"; } /* * This statement will remove all (SE_ , F_, IG_) entities and will leave only Item_Oid entities. And will * neglect the whole path */ String[] exprs = expression.split(" "); boolean byPass = false; String tempExpr = ""; for (String expr : exprs) { if (expr.contains("../I_")) { String itemOid = expr.substring(3); logger.info("itemOid: " + itemOid); ItemBean itemBean = getItemBean(itemOid); ItemGroupBean itemGroupBean = getItemGroupBeanByItemId(itemBean.getId()); itemFormMetadataDAO = new ItemFormMetadataDAO(dataSource); ItemFormMetadataBean ifmBean = (ItemFormMetadataBean) itemFormMetadataDAO.findByItemIdAndCRFVersionId(itemBean.getId(), version.getId()); if (ifmBean.getResponseSet().getResponseTypeId() == 3 || ifmBean.getResponseSet().getResponseTypeId() == 7) { byPass = true; tempExpr = expr; } expr = "/" + version.getOid() + "/" + itemGroupBean.getOid() + "/" + itemOid; } if (byPass && tempExpr.contains("../I_")) { tempExpr = expr; } else if (byPass && expr.equals("=")) { tempExpr = "selected (" + tempExpr + " , "; } else if (byPass && expr.equals("!=")) { tempExpr = " not selected (" + tempExpr + " , "; } else if (byPass && (expr.equals(">") || expr.equals(">=") || expr.equals("<") || expr.equals("<="))) { tempExpr = tempExpr + " " + expr; result = result + " " + tempExpr; byPass = false; } else if (byPass && !expr.contains("../I_") && !expr.equals("!=") && !expr.equals("=") && !expr.equals(">") && !expr.equals(">=") && !expr.equals("<") && !expr.equals("<=")) { tempExpr = tempExpr + " " + expr + " ) "; result = result + " " + tempExpr; byPass = false; } else { result = result + " " + expr; } } logger.info("Full Expression is: " + result); return result; } /** * @param item * @param itemFormMetadataBean * @param itemGroupBean * @param bindList * @param factory * @param isGroupRepeating * @param repeat * @param group */ private void setHeaderWidget(ItemBean item, ItemFormMetadataBean itemFormMetadataBean, ItemGroupBean itemGroupBean, ArrayList<Bind> bindList, WidgetFactory factory, boolean isGroupRepeating, Repeat repeat, Group group, String itemExpression) { Widget headerWidget = factory.getHeaderWidget(item, itemFormMetadataBean, itemGroupBean, itemExpression); if (headerWidget != null) { bindList.add(headerWidget.getBinding()); if (isGroupRepeating) repeat.getUsercontrol().add(headerWidget.getUserControl()); else group.getUsercontrol().add(headerWidget.getUserControl()); } else { log.debug("Invalid/Missing instructive header text encountered while loading PForm (" + item.getDataType().getName() + "). Skipping."); } } /** * @param item * @param itemFormMetadataBean * @param itemGroupBean * @param bindList * @param factory * @param isGroupRepeating * @param repeat * @param group */ private void setSubHeaderWidget(ItemBean item, ItemFormMetadataBean itemFormMetadataBean, ItemGroupBean itemGroupBean, ArrayList<Bind> bindList, WidgetFactory factory, boolean isGroupRepeating, Repeat repeat, Group group, String itemExpression) { Widget subHeaderWidget = factory.getSubHeaderWidget(item, itemFormMetadataBean, itemGroupBean, itemExpression); if (subHeaderWidget != null) { bindList.add(subHeaderWidget.getBinding()); if (isGroupRepeating) repeat.getUsercontrol().add(subHeaderWidget.getUserControl()); else group.getUsercontrol().add(subHeaderWidget.getUserControl()); } else { log.debug("Invalid/Missing instructive subheader text encountered while loading PForm (" + item.getDataType().getName() + "). Skipping."); } } /** * @param item * @param responseTypeId * @param itemFormMetadataBean * @param itemGroupBean * @param bindList * @param factory * @param isGroupRepeating * @param repeat * @param group * @param isItemRequired * @param responseLayout * @param itemExpression */ private void setItemWidget(ItemBean item, int responseTypeId, ItemFormMetadataBean itemFormMetadataBean, ItemGroupBean itemGroupBean, ArrayList<Bind> bindList, WidgetFactory factory, boolean isGroupRepeating, Repeat repeat, Group group, boolean isItemRequired, String responseLayout, String itemExpression) { Widget widget = factory.getItemWidget(item, responseTypeId, itemGroupBean, itemFormMetadataBean, isItemRequired, responseLayout, itemExpression); if (widget != null) { bindList.add(widget.getBinding()); if (isGroupRepeating) { repeat.getUsercontrol().add(widget.getUserControl()); group.setRepeat(repeat); } else { group.getUsercontrol().add(widget.getUserControl()); } } else { log.debug("Unsupported datatype encountered while loading PForm (" + item.getDataType().getName() + "). Skipping."); } } /** * @param section * @param crfVersion * @param sectionExpression * @param bindList * @param factory * @param singleSection */ private void setSectionWidget(SectionBean section, CRFVersionBean crfVersion, String sectionExpression, ArrayList<Bind> bindList, WidgetFactory factory, Group singleSection) { Widget sectionWidget = factory.getSectionWidget(section, crfVersion, sectionExpression); bindList.add(sectionWidget.getBinding()); if (section.getTitle() != null && !section.getTitle().equals("")) { Label sectionLabel = new Label(); sectionLabel.setLabel(section.getTitle()); singleSection.setLabel(sectionLabel); } singleSection.setGroup(new ArrayList<Group>()); Widget subtitle = factory.getSectionTextWidget(crfVersion.getOid(), WidgetFactory.SECTION_TEXT_TYPE_SUBTITLE, section); Widget instructions = factory.getSectionTextWidget(crfVersion.getOid(), WidgetFactory.SECTION_TEXT_TYPE_INSTRUCTIONS, section); if (subtitle != null) { singleSection.getUsercontrol().add(subtitle.getUserControl()); bindList.add(subtitle.getBinding()); } if (instructions != null) { singleSection.getUsercontrol().add(instructions.getUserControl()); bindList.add(instructions.getBinding()); } } /** * @param section * @param crfVersion * @param groupExpression * @param bindList * @param factory * @param itemGroupBean * @param group * @param repeat * @param isGroupRepeating * @param groupHeader */ private void setGroupWidget(SectionBean section, CRFVersionBean crfVersion, String groupExpression, ArrayList<Bind> bindList, WidgetFactory factory, ItemGroupBean itemGroupBean, Group group, Repeat repeat, boolean isGroupRepeating, Label groupHeader) { Widget groupWidget = factory.getGroupWidget(itemGroupBean, crfVersion, groupExpression); bindList.add(groupWidget.getBinding()); if (groupWidget != null) { if (isGroupRepeating) { repeat.setLabel(groupHeader); } else { group.setLabel(groupHeader); } } } public RuleActionPropertyDao getRuleActionPropertyDao() { return ruleActionPropertyDao; } public void setRuleActionPropertyDao(RuleActionPropertyDao ruleActionPropertyDao) { this.ruleActionPropertyDao = ruleActionPropertyDao; } }