package se.cambio.cds.util; import org.apache.log4j.Logger; import org.openehr.rm.datatypes.basic.DataValue; import org.openehr.rm.datatypes.quantity.DvOrdinal; import org.openehr.rm.datatypes.text.DvCodedText; import se.cambio.cds.gdl.model.*; import se.cambio.cds.gdl.model.expression.*; import se.cambio.cds.gdl.model.readable.ReadableGuide; import se.cambio.cds.gdl.model.readable.rule.ReadableRule; import se.cambio.cds.gdl.model.readable.rule.RuleLineCollection; import se.cambio.cds.gdl.model.readable.rule.lines.*; import se.cambio.cds.gdl.model.readable.rule.lines.elements.ArchetypeDataValueRuleLineElement; import se.cambio.cds.gdl.model.readable.rule.lines.elements.ArchetypeElementRuleLineElement; import se.cambio.cds.gdl.model.readable.rule.lines.elements.GTCodeRuleLineElement; import se.cambio.cds.gdl.model.readable.rule.lines.interfaces.ArchetypeElementRuleLine; import se.cambio.cds.gdl.model.readable.rule.lines.interfaces.GTCodeDefiner; import se.cambio.cds.gdl.model.readable.util.RulePriorityComparator; import se.cambio.cds.model.instance.ArchetypeReference; import se.cambio.openehr.controller.session.data.ArchetypeManager; import se.cambio.cm.model.archetype.vo.ArchetypeElementVO; import se.cambio.openehr.util.OpenEHRConst; import se.cambio.openehr.util.OpenEHRDataValues; import se.cambio.openehr.util.OpenEHRRMUtil; import se.cambio.openehr.util.UserConfigurationManager; import se.cambio.openehr.util.exceptions.InternalErrorException; import java.util.*; public class GuideImporter { private GuideImporter(){ } public static ReadableGuide importGuide(Guide guide, String language, ArchetypeManager archetypeManager) throws InternalErrorException { Logger.getLogger(GuideImporter.class).debug("Importing guide: "+guide.getId()+", lang="+language); GuideDefinition guideDefinition = guide.getDefinition(); TermDefinition termDefinition = getTermDefinition(guide, language); ReadableGuide readableGuide = new ReadableGuide(termDefinition, archetypeManager); Map<String, GTCodeDefiner> gtCodeElementMap = generateGTCodeElementMap(guide, archetypeManager); if (guideDefinition!=null){ Map<String, ArchetypeBinding> archetypeBindings = guideDefinition.getArchetypeBindings(); if (archetypeBindings!=null){ for (ArchetypeBinding archetypeBinding: archetypeBindings.values()) { ArchetypeInstantiationRuleLine airl = (ArchetypeInstantiationRuleLine) gtCodeElementMap.get(archetypeBinding.getId()); readableGuide.getDefinitionRuleLines().add(airl); if (archetypeBinding.getPredicateStatements()!=null){ proccessPredicateExpressions(archetypeBinding, termDefinition, airl); } } } if (guideDefinition.getPreConditionExpressions()!=null){ for (ExpressionItem expressionItem : guideDefinition.getPreConditionExpressions()) { processExpressionItem( readableGuide.getPreconditionRuleLines(), null, expressionItem, gtCodeElementMap); } } Map<String, Rule> rulesMap = guideDefinition.getRules(); if (rulesMap!=null){ List<Rule> rules = new ArrayList<Rule>(rulesMap.values()); Collections.sort(rules, new RulePriorityComparator()); for (Rule rule : rules) { ReadableRule rr = new ReadableRule(readableGuide.getTermDefinition(), rule.getId(), readableGuide); readableGuide.getReadableRules().put(rule.getId(), rr); if (rule.getWhenStatements()!=null){ for (ExpressionItem expressionItem : rule.getWhenStatements()) { processExpressionItem( rr.getConditionRuleLines(), null, expressionItem, gtCodeElementMap); } } if (rule.getThenStatements()!=null){ for (ExpressionItem expressionItem : rule.getThenStatements()) { processExpressionItem( rr.getActionRuleLines(), null, expressionItem, gtCodeElementMap); } } } } } return readableGuide; } private static void proccessPredicateExpressions( ArchetypeBinding archetypeBinding, TermDefinition termDefinition, ArchetypeInstantiationRuleLine airl) throws InternalErrorException { for (ExpressionItem expressionItem : archetypeBinding.getPredicateStatements()) { if (expressionItem instanceof BinaryExpression){ BinaryExpression binaryExpression = (BinaryExpression)expressionItem; if (binaryExpression.getLeft() instanceof Variable && binaryExpression.getRight() instanceof ConstantExpression){ Variable variable = (Variable)binaryExpression.getLeft(); ConstantExpression constantExpression2 = (ConstantExpression)binaryExpression.getRight(); String path = variable.getPath(); if ("/event/time".equals(path)){ //Old event time detected //TODO Remove later on path = OpenEHRRMUtil.EVENT_TIME_PATH; } String dvStr = constantExpression2.getValue(); ArchetypeElementVO archetypeElementVO = airl.getArchetypeManager().getArchetypeElements().getArchetypeElement( archetypeBinding.getTemplateId(), archetypeBinding.getArchetypeId()+path); if (archetypeElementVO==null){ throw new InternalErrorException(new Exception("Element '"+archetypeBinding.getArchetypeId()+path+(archetypeBinding.getTemplateId()!=null?" ("+archetypeBinding.getTemplateId()+")":"")+"' not found!")); } if (!dvStr.equals("null")){ WithElementPredicateAttributeDefinitionRuleLine wepdrl = new WithElementPredicateAttributeDefinitionRuleLine(); airl.addChildRuleLine(wepdrl); wepdrl.getArchetypeElementRuleLineDefinitionElement().setValue(archetypeElementVO); String rmType = archetypeElementVO.getRMType(); if (OpenEHRDataValues.DV_TEXT.equals(rmType) && (OperatorKind.IS_A.equals(binaryExpression.getOperator()) || OperatorKind.IS_NOT_A.equals(binaryExpression.getOperator()))){ rmType = OpenEHRDataValues.DV_CODED_TEXT; } DataValue dv = parseGTDataValue(rmType, dvStr, termDefinition); wepdrl.getDataValueRuleLineElement().setValue(dv); wepdrl.getComparisonOperatorRuleLineElement().setValue(binaryExpression.getOperator()); }else{ WithElementPredicateExistsDefinitionRuleLine wepedrl = new WithElementPredicateExistsDefinitionRuleLine(); airl.addChildRuleLine(wepedrl); wepedrl.getArchetypeElementRuleLineDefinitionElement().setValue(archetypeElementVO); wepedrl.getExistenceOperatorRuleLineElement().setValue(binaryExpression.getOperator().getSymbol()+"null"); } }else if (binaryExpression.getLeft() instanceof Variable && binaryExpression.getRight() instanceof ExpressionItem){ Variable variable = (Variable)binaryExpression.getLeft(); ExpressionItem expressionItemAux = binaryExpression.getRight(); WithElementPredicateExpressionDefinitionRuleLine wepdrl = new WithElementPredicateExpressionDefinitionRuleLine(airl); String path = variable.getPath(); String attribute = path.substring(path.lastIndexOf("/value/") + 7, path.length()); path = path.substring(0, path.length()-attribute.length()-7); if ("/event/time".equals(path)){ //Old event time detected //TODO Remove later on path = OpenEHRRMUtil.EVENT_TIME_PATH; } ArchetypeElementVO archetypeElementVO = airl.getArchetypeManager().getArchetypeElements().getArchetypeElement( archetypeBinding.getTemplateId(), archetypeBinding.getArchetypeId()+path); if (archetypeElementVO==null){ throw new InternalErrorException(new Exception("Element '"+archetypeBinding.getArchetypeId()+path+(archetypeBinding.getTemplateId()!=null?" ("+archetypeBinding.getTemplateId()+")":"")+"' not found!")); } wepdrl.getArchetypeElementAttributeRuleLineDefinitionElement().setValue(archetypeElementVO); wepdrl.getArchetypeElementAttributeRuleLineDefinitionElement().setAttribute(attribute); wepdrl.getExpressionRuleLineElement().setValue(expressionItemAux); wepdrl.getComparisonOperatorRuleLineElement().setValue(binaryExpression.getOperator()); } }else if (expressionItem instanceof UnaryExpression){ UnaryExpression unaryExpression = (UnaryExpression)expressionItem; WithElementPredicateFunctionDefinitionRuleLine wefd = new WithElementPredicateFunctionDefinitionRuleLine(); Variable variable = (Variable)unaryExpression.getOperand(); airl.addChildRuleLine(wefd); String path = variable.getPath(); if ("/event/time".equals(path)){ //Old event time detected //TODO Remove later on path = OpenEHRRMUtil.EVENT_TIME_PATH; } ArchetypeElementVO archetypeElementVO = airl.getArchetypeManager().getArchetypeElements().getArchetypeElement( archetypeBinding.getTemplateId(), archetypeBinding.getArchetypeId()+path); if (archetypeElementVO==null){ throw new InternalErrorException(new Exception("Element '"+archetypeBinding.getArchetypeId()+path+(archetypeBinding.getTemplateId()!=null?" ("+archetypeBinding.getTemplateId()+")":"")+"' not found!")); } wefd.getArchetypeElementRuleLineDefinitionElement().setValue(archetypeElementVO); wefd.getFunctionRuleLineElement().setValue(unaryExpression.getOperator()); } } } public static TermDefinition getTermDefinition(Guide guide, String lang){ TermDefinition termDefinition = null; if (guide.getOntology()!=null){ if (guide.getOntology().getTermDefinitions()!=null){ termDefinition = guide.getOntology().getTermDefinitions().get(lang); if (termDefinition==null){ termDefinition = guide.getOntology().getTermDefinitions().get(guide.getLanguage().getOriginalLanguage().getCodeString()); } } } if (termDefinition==null){ termDefinition = new TermDefinition(); } return termDefinition; } private static void addRuleLine(RuleLine ruleLine, RuleLineCollection ruleLines, RuleLine parentRuleLine){ if(parentRuleLine!=null){ parentRuleLine.addChildRuleLine(ruleLine); }else{ ruleLines.add(ruleLine); } } protected static DataValue parseDataValue(String rmType, String dvStr, ArchetypeElementVO archetypeElementVO, ArchetypeManager archetypeManager){ DataValue dv = DataValue.parseValue(rmType+","+dvStr); if (dv instanceof DvCodedText){ if (archetypeElementVO!=null){ DvCodedText dvCT = (DvCodedText)dv; String name = archetypeManager.getCodedTexts().getText(archetypeElementVO.getIdTemplate(), archetypeElementVO.getId(), dvCT.getCode(), UserConfigurationManager.getLanguage()); if (name!=null){ dvCT.setValue(name); } } }else if (dv instanceof DvOrdinal){ if (archetypeElementVO!=null){ DvOrdinal dvOrdinal= (DvOrdinal)dv; String name = archetypeManager.getOrdinals().getText(archetypeElementVO.getIdTemplate(), archetypeElementVO.getId(), dvOrdinal.getValue(), UserConfigurationManager.getLanguage()); if (name!=null){ dvOrdinal.getSymbol().setValue(name); } } } return dv; } protected static DataValue parseGTDataValue(String rmType, String dvStr, TermDefinition termDefinition){ DataValue dv = DataValue.parseValue(rmType+","+dvStr); if (dv instanceof DvCodedText){ if (termDefinition!=null){ DvCodedText dvCT = (DvCodedText)dv; Term term = termDefinition.getTerms().get(dvCT.getCode()); if (term!=null && term.getText()!=null){ dvCT.setValue(term.getText()); } } }else if (dv instanceof DvOrdinal){ if (termDefinition!=null){ DvOrdinal dvOrdinal= (DvOrdinal)dv; String name = termDefinition.getTerms().get(dvOrdinal.getCode()).getText(); if (name!=null){ dvOrdinal.getSymbol().setValue(name); } } } return dv; } protected static void processAssigmentExpression( RuleLineCollection ruleLines, AssignmentExpression assignmentExpression, Map<String, GTCodeDefiner> gtCodeELementMap) throws InternalErrorException { String gtCode = assignmentExpression.getVariable().getCode(); ExpressionItem expressionItemAux = assignmentExpression.getAssignment(); String attribute = assignmentExpression.getVariable().getAttribute(); GTCodeRuleLineElement gtCodeRuleLineElement = gtCodeELementMap.get(gtCode).getGTCodeRuleLineElement(); if (attribute==null){ if (expressionItemAux instanceof Variable){ String gtCodeAux = ((Variable)expressionItemAux).getCode(); SetElementWithElementActionRuleLine sewearl = new SetElementWithElementActionRuleLine(); ruleLines.add(sewearl); sewearl.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); GTCodeRuleLineElement gtCodeRuleLineElementAux = gtCodeELementMap.get(gtCodeAux).getGTCodeRuleLineElement(); sewearl.getSecondArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElementAux); }else if (expressionItemAux instanceof ConstantExpression){ SetElementWithDataValueActionRuleLine sedvar = new SetElementWithDataValueActionRuleLine(); ruleLines.add(sedvar); sedvar.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); ArchetypeDataValueRuleLineElement archetypeDataValueRuleLineElement = sedvar.getArchetypeDataValueRuleLineElement(); String dvStr = ((ConstantExpression)expressionItemAux).getValue(); ArchetypeElementVO archetypeElementVO = null; if (gtCodeELementMap.get(gtCode) instanceof ArchetypeElementRuleLine){ archetypeElementVO = ((ArchetypeElementRuleLine)gtCodeELementMap.get(gtCode)).getArchetypeElement(); } if (archetypeElementVO==null){ throw new InternalErrorException(new Exception("Archetype element not found for gtCode '"+gtCode+"'")); } log.debug("processAssigmentExpression for variable: " + gtCode); String rmType = archetypeElementVO.getRMType(); DataValue dv = parseDataValue(rmType, dvStr, archetypeElementVO, sedvar.getArchetypeManager()); archetypeDataValueRuleLineElement.setArchetypeElementVO(archetypeElementVO); archetypeDataValueRuleLineElement.setValue(dv); }else{ throw new InternalErrorException(new Exception("Unknown expression '"+expressionItemAux.getClass().getName()+"'")); } }else{ if (CreateInstanceExpression.FUNCTION_CREATE_NAME.equals(attribute)){ CreateInstanceActionRuleLine cirl = new CreateInstanceActionRuleLine(); ruleLines.add(cirl); RuleLineCollection ruleLinesAssignmentInstance = new RuleLineCollection(cirl.getReadableGuide()); if (!(expressionItemAux instanceof MultipleAssignmentExpression)){ throw new InternalErrorException(new Exception("Unknown expression in creation statement '"+expressionItemAux.toString()+"'")); } Collection<AssignmentExpression> assignmentExpressions = ((MultipleAssignmentExpression)expressionItemAux).getAssignmentExpressions(); for(AssignmentExpression assignmentExpressionAux: assignmentExpressions){ processAssigmentExpression(ruleLinesAssignmentInstance, assignmentExpressionAux, gtCodeELementMap); } for(RuleLine ruleLine: ruleLinesAssignmentInstance.getRuleLines()){ cirl.addChildRuleLine(ruleLine); } cirl.setCDSEntryGTCodeRuleLineElementValue(gtCodeRuleLineElement); }else if (OpenEHRConst.NULL_FLAVOR_ATTRIBUTE.equals(attribute)){ SetElementWithNullValueActionRuleLine sewnvrl = new SetElementWithNullValueActionRuleLine(); ruleLines.add(sewnvrl); sewnvrl.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); String dvStr = ((ConstantExpression)expressionItemAux).getValue(); DataValue dv = parseDataValue(OpenEHRDataValues.DV_CODED_TEXT, dvStr, null, sewnvrl.getArchetypeManager()); sewnvrl.getNullValueRuleLineElement().setValue((DvCodedText)dv); }else{ SetElementAttributeActionRuleLine seaarl = new SetElementAttributeActionRuleLine(); ruleLines.add(seaarl); seaarl.getArchetypeElementAttributeRuleLineElement().setAttribute(attribute); ArchetypeElementRuleLineElement aerle = new ArchetypeElementRuleLineElement(seaarl); aerle.setValue(gtCodeRuleLineElement); seaarl.getArchetypeElementAttributeRuleLineElement().setValue(aerle); seaarl.getExpressionRuleLineElement().setValue(expressionItemAux); } } } protected static void processBinaryExpression( RuleLineCollection ruleLines, RuleLine parentRuleLine, BinaryExpression binaryExpression, Map<String, GTCodeDefiner> gtCodeELementMap) throws InternalErrorException { if (OperatorKind.OR.equals(binaryExpression.getOperator())){ OrOperatorRuleLine orOperatorRuleLine = new OrOperatorRuleLine(); processExpressionItem(ruleLines, orOperatorRuleLine.getLeftRuleLineBranch(), binaryExpression.getLeft(), gtCodeELementMap); processExpressionItem(ruleLines, orOperatorRuleLine.getRightRuleLineBranch(), binaryExpression.getRight(), gtCodeELementMap); addRuleLine(orOperatorRuleLine, ruleLines, parentRuleLine); }else if (OperatorKind.AND.equals(binaryExpression.getOperator())){ processExpressionItem(ruleLines, parentRuleLine, binaryExpression.getLeft(), gtCodeELementMap); processExpressionItem(ruleLines, parentRuleLine, binaryExpression.getRight(), gtCodeELementMap); }else if (OperatorKind.EQUALITY.equals(binaryExpression.getOperator())|| OperatorKind.INEQUAL.equals(binaryExpression.getOperator())|| OperatorKind.IS_A.equals(binaryExpression.getOperator())|| OperatorKind.IS_NOT_A.equals(binaryExpression.getOperator())|| OperatorKind.GREATER_THAN.equals(binaryExpression.getOperator())|| OperatorKind.GREATER_THAN_OR_EQUAL.equals(binaryExpression.getOperator())|| OperatorKind.LESS_THAN.equals(binaryExpression.getOperator())|| OperatorKind.LESS_THAN_OR_EQUAL.equals(binaryExpression.getOperator())){ processComparisonExpression(ruleLines, parentRuleLine, binaryExpression, gtCodeELementMap); }else{ throw new InternalErrorException(new Exception("Unknown operator '"+binaryExpression.getOperator()+"'")); } } protected static void processComparisonExpression( RuleLineCollection ruleLines, RuleLine parentRuleLine, BinaryExpression binaryExpression, Map<String, GTCodeDefiner> gtCodeELementMap) throws InternalErrorException { GTCodeRuleLineElement gtCodeRuleLineElement = null; String attribute = null; String gtCode = null; if (binaryExpression.getLeft() instanceof Variable){ Variable var = (Variable)binaryExpression.getLeft(); gtCode = var.getCode(); GTCodeDefiner gtCodeDefiner = gtCodeELementMap.get(gtCode); if (gtCodeDefiner!=null){ gtCodeRuleLineElement = gtCodeDefiner.getGTCodeRuleLineElement(); }else{ log.warn("gtCode not found! ("+gtCode+")"); } attribute = var.getAttribute(); } if (gtCodeRuleLineElement!=null){ if (attribute==null){ if (binaryExpression.getRight() instanceof ConstantExpression){ ConstantExpression constantExpression = (ConstantExpression)binaryExpression.getRight(); String dvStr = constantExpression.getValue(); DataValue dv = null; ArchetypeElementVO archetypeElementVO = null; if (!dvStr.equals("null")){ log.debug("codeRuleLineElement: " + gtCodeRuleLineElement.getValue()); String rmType = null; if (!OpenEHRConst.CURRENT_DATE_TIME_ID.equals(gtCode)){ if (gtCodeELementMap.get(gtCode) instanceof ArchetypeElementRuleLine){ archetypeElementVO = ((ArchetypeElementRuleLine)gtCodeELementMap.get(gtCode)).getArchetypeElement(); } if (archetypeElementVO==null){ throw new InternalErrorException(new Exception("Archetype element not found for gtCode '"+gtCodeRuleLineElement.getValue()+"'")); } rmType = archetypeElementVO.getRMType(); if (OpenEHRDataValues.DV_TEXT.equals(rmType) && (OperatorKind.IS_A.equals(binaryExpression.getOperator()) || OperatorKind.IS_NOT_A.equals(binaryExpression.getOperator()))){ rmType = OpenEHRDataValues.DV_CODED_TEXT; } }else{ rmType = OpenEHRDataValues.DV_DATE_TIME; } dv = parseDataValue(rmType, dvStr, archetypeElementVO, ruleLines.getArchetypeManager()); } if (dv!=null){ ElementComparisonWithDVConditionRuleLine eccrl = new ElementComparisonWithDVConditionRuleLine(); addRuleLine(eccrl, ruleLines, parentRuleLine); eccrl.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); eccrl.getArchetypeDataValueRuleLineElement().setValue(dv); eccrl.getArchetypeDataValueRuleLineElement().setArchetypeElementVO(archetypeElementVO); eccrl.getComparisonOperatorRuleLineElement().setValue(binaryExpression.getOperator()); }else{ ElementInitializedConditionRuleLine eicrl = new ElementInitializedConditionRuleLine(); addRuleLine(eicrl, ruleLines, parentRuleLine); eicrl.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); eicrl.getExistenceOperatorRuleLineElement().setOperator(binaryExpression.getOperator()); } }else if (binaryExpression.getRight() instanceof Variable){ Variable varRight = (Variable)binaryExpression.getRight(); String gtCodeAux = varRight.getCode(); ElementComparisonWithElementConditionRuleLine eccrl = new ElementComparisonWithElementConditionRuleLine(); addRuleLine(eccrl, ruleLines, parentRuleLine); eccrl.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); eccrl.getSecondArchetypeElementRuleLineElement().setValue(gtCodeELementMap.get(gtCodeAux).getGTCodeRuleLineElement()); eccrl.getComparisonOperatorRuleLineElement().setValue(binaryExpression.getOperator()); }else{ throw new InternalErrorException(new Exception("Unknown expression '"+binaryExpression.getRight().getClass().getName()+"'")); } }else{ if (attribute.equals(OpenEHRConst.NULL_FLAVOR_ATTRIBUTE)){ ElementComparisonWithNullValueConditionRuleLine ecwnvc = new ElementComparisonWithNullValueConditionRuleLine(); addRuleLine(ecwnvc, ruleLines, parentRuleLine); ecwnvc.getArchetypeElementRuleLineElement().setValue(gtCodeRuleLineElement); ConstantExpression constantExpression = (ConstantExpression)binaryExpression.getRight(); String dvStr = constantExpression.getValue(); DataValue dv = parseDataValue(OpenEHRDataValues.DV_CODED_TEXT, dvStr, null, ruleLines.getArchetypeManager()); if (dv instanceof DvCodedText){ ecwnvc.getNullValueRuleLineElement().setValue((DvCodedText)dv); } ecwnvc.getEqualityComparisonOperatorRuleLineElement().setValue(binaryExpression.getOperator()); }else{//Expression ElementAttributeComparisonConditionRuleLine eaccrl = new ElementAttributeComparisonConditionRuleLine(); addRuleLine(eaccrl, ruleLines, parentRuleLine); eaccrl.getArchetypeElementAttributeRuleLineElement().setAttribute(attribute); ArchetypeElementRuleLineElement aerle = new ArchetypeElementRuleLineElement(eaccrl); aerle.setValue(gtCodeRuleLineElement); eaccrl.getArchetypeElementAttributeRuleLineElement().setValue(aerle); eaccrl.getExpressionRuleLineElement().setValue(binaryExpression.getRight()); eaccrl.getComparisonOperatorRuleLineElement().setValue(binaryExpression.getOperator()); } } }else{ throw new InternalErrorException(new Exception("Unknown expression '"+binaryExpression.getLeft().getClass().getName()+"'")); } } public static void processExpressionItem( RuleLineCollection ruleLines, RuleLine parentRuleLine, ExpressionItem expressionItem, Map<String, GTCodeDefiner> gtCodeELementMap) throws InternalErrorException { if (expressionItem instanceof AssignmentExpression){ processAssigmentExpression(ruleLines, (AssignmentExpression)expressionItem, gtCodeELementMap); }else if (expressionItem instanceof BinaryExpression){ processBinaryExpression(ruleLines, parentRuleLine, (BinaryExpression)expressionItem, gtCodeELementMap); }else if (expressionItem instanceof UnaryExpression){ processUnaryExpression(ruleLines, parentRuleLine, (UnaryExpression)expressionItem, gtCodeELementMap); }else{ throw new InternalErrorException(new Exception("Unknown expression '"+expressionItem.getClass().getName()+"'")); } } protected static void processUnaryExpression( RuleLineCollection ruleLines, RuleLine parentRuleLine, UnaryExpression unaryExpression, Map<String, GTCodeDefiner> gtCodeELementMap) throws InternalErrorException { if (OperatorKind.FOR_ALL.equals(unaryExpression.getOperator())){ ForAllOperatorRuleLine forAllOperatorRuleLine = new ForAllOperatorRuleLine(); addRuleLine(forAllOperatorRuleLine, ruleLines, parentRuleLine); processExpressionItem(ruleLines, forAllOperatorRuleLine, unaryExpression.getOperand(), gtCodeELementMap); }else{ throw new InternalErrorException(new Exception("Unknown operator '"+unaryExpression.getOperator()+"'")); } } public static Map<String, GTCodeDefiner> generateGTCodeElementMap(Guide guide, ArchetypeManager archetypeManager) throws InternalErrorException { Map<String, GTCodeDefiner> gtCodeElementMap = new HashMap<String, GTCodeDefiner>(); ArchetypeElementInstantiationRuleLine dummyAEIRL = new ArchetypeElementInstantiationRuleLine(new ArchetypeInstantiationRuleLine()); dummyAEIRL.setGTCode("currentDateTime"); gtCodeElementMap.put("currentDateTime", dummyAEIRL); GuideDefinition guideDefinition = guide.getDefinition(); if (guideDefinition!=null){ Map<String, ArchetypeBinding> ab = guideDefinition.getArchetypeBindings(); if (ab!=null){ for (ArchetypeBinding archetypeBinding: ab.values()) { ArchetypeInstantiationRuleLine airl = new ArchetypeInstantiationRuleLine(); airl.setGTCode(archetypeBinding.getId()); ArchetypeReference ar = new ArchetypeReference( archetypeBinding.getDomain(), archetypeBinding.getArchetypeId(), archetypeBinding.getTemplateId()); airl.setArchetypeReference(ar); gtCodeElementMap.put(archetypeBinding.getId(), airl); if (archetypeBinding.getElements()!=null){ for (ElementBinding elementBinding : archetypeBinding.getElements().values()) { ArchetypeElementInstantiationRuleLine aeirl = new ArchetypeElementInstantiationRuleLine(airl); aeirl.setGTCode(elementBinding.getId()); if ("/event/time".equals(elementBinding.getPath())){ //Old event time detected //TODO Remove later on elementBinding.setPath(OpenEHRRMUtil.EVENT_TIME_PATH); } String elementId = archetypeBinding.getArchetypeId()+elementBinding.getPath(); ArchetypeElementVO archetypeElementVO = archetypeManager.getArchetypeElements().getArchetypeElement( archetypeBinding.getTemplateId(), elementId); if (archetypeElementVO==null){ throw new InternalErrorException(new Exception("Element '"+elementId+(archetypeBinding.getTemplateId()!=null?" ("+archetypeBinding.getTemplateId()+")":"")+"' not found!")); } aeirl.setArchetypeElementVO(archetypeElementVO); gtCodeElementMap.put(elementBinding.getId(), aeirl); } } } } } return gtCodeElementMap; } private static Logger log = Logger.getLogger(GuideImporter.class); } /* * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 2.0/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 2.0 (the 'License'); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an 'AS IS' basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * * The Initial Developers of the Original Code are Iago Corbal and Rong Chen. * Portions created by the Initial Developer are Copyright (C) 2012-2013 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Software distributed under the License is distributed on an 'AS IS' basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * ***** END LICENSE BLOCK ***** */