/api/src/main/java/org/openmrs/arden/Comparison.java

https://github.com/thothathri/openmrs · Java · 228 lines · 171 code · 38 blank · 19 comment · 54 complexity · 7489a5f4a3514ca641089062018a16aa MD5 · raw file

  1. /**
  2. * The contents of this file are subject to the OpenMRS Public License
  3. * Version 1.0 (the "License"); you may not use this file except in
  4. * compliance with the License. You may obtain a copy of the License at
  5. * http://license.openmrs.org
  6. *
  7. * Software distributed under the License is distributed on an "AS IS"
  8. * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  9. * License for the specific language governing rights and limitations
  10. * under the License.
  11. *
  12. * Copyright (C) OpenMRS, LLC. All Rights Reserved.
  13. */
  14. package org.openmrs.arden;
  15. import java.io.Writer;
  16. import java.util.ArrayList;
  17. import java.util.Iterator;
  18. /**
  19. * This class translates comparisons within MLM if statements into java
  20. */
  21. public class Comparison implements ArdenBaseTreeParserTokenTypes {
  22. private String key = null;
  23. private String keyList = null;
  24. private Integer operator = null;
  25. private Object answer = null;
  26. private ArrayList<Object> answerList = null;
  27. public Comparison(String key, Integer operator) {
  28. this.key = key;
  29. this.operator = operator;
  30. }
  31. public void setAnswer(Object answer) {
  32. this.answer = answer;
  33. }
  34. public Object getAnswer() {
  35. return answer;
  36. }
  37. public void setKey(String key, String keyList) {
  38. this.key = key;
  39. this.keyList = keyList;
  40. }
  41. public void setOperator(Integer operator) {
  42. this.operator = operator;
  43. }
  44. public void addAnswerToList(Object answer) {
  45. if (answerList == null) {
  46. answerList = new ArrayList<Object>();
  47. }
  48. this.answerList.add(answer);
  49. }
  50. public ArrayList<Object> getAnswerList() {
  51. return this.answerList;
  52. }
  53. public String getCompOpCode(MLMObjectElement objElement, boolean isAnswerVar) throws Exception {
  54. String retStr = "";
  55. if (objElement != null) {
  56. String readType = objElement.getReadType();
  57. if (readType != null && readType.equalsIgnoreCase("Exist")) {
  58. retStr += key + ".exists()";
  59. if (this.answer.toString().equalsIgnoreCase("false")) {
  60. return "!" + retStr;
  61. }
  62. return retStr;
  63. }
  64. }
  65. //there is no read value for this comparison so try
  66. //reading from the userVarMap
  67. if (this.answer instanceof Boolean && objElement == null) {
  68. retStr += "userVarMap.containsKey(\"" + key + "\")";
  69. if (this.answer.toString().equalsIgnoreCase("false")) {
  70. return "!" + retStr;
  71. }
  72. return retStr;
  73. }
  74. retStr += "(";
  75. if (operator != null) {
  76. if (this.answer != null || (answerList != null && !answerList.isEmpty())) {
  77. retStr += "!" + key + ".isNull()&&";
  78. if (isAnswerVar) {
  79. retStr += "!" + this.answer + ".isNull()&&";
  80. }
  81. switch (operator) {
  82. case IN:
  83. if (keyList != null) {
  84. retStr += "containsIgnoreCase(getResultList_" + keyList + "()," + key + ")";
  85. } else {
  86. retStr += "containsIgnoreCase(getResultList_" + key + "()," + key + ")";
  87. }
  88. break;
  89. case EQUALS:
  90. if (this.answer instanceof Integer || this.answer instanceof Double || this.answer instanceof Float) {
  91. retStr += "(" + key + ".toNumber()!= null&&" + key + ".toNumber() == " + this.answer + ")";
  92. } else {
  93. retStr += key + ".toString().equalsIgnoreCase(\"" + this.answer + "\")";
  94. }
  95. break;
  96. case GTE:
  97. case GT:
  98. case LTE:
  99. case LT:
  100. String comparator = null;
  101. switch (operator) {
  102. case GTE:
  103. comparator = ">=";
  104. break;
  105. case GT:
  106. comparator = ">";
  107. break;
  108. case LTE:
  109. comparator = "<=";
  110. break;
  111. case LT:
  112. comparator = "<";
  113. break;
  114. default:
  115. assert false; // execution should not reach this point
  116. break;
  117. }
  118. if (this.answer instanceof Integer || this.answer instanceof Double || this.answer instanceof Float) {
  119. retStr += "(" + key + ".toNumber()!= null&&" + key + ".toNumber() " + comparator + " "
  120. + this.answer + ")";
  121. } else if (isAnswerVar) {
  122. retStr += "(" + key + ".toNumber()!= null&&" + this.answer + ".toNumber()!=null&&" + key
  123. + ".toNumber() " + comparator + " " + this.answer + ".toNumber())";
  124. }
  125. break;
  126. default:
  127. break;
  128. }
  129. } else {
  130. switch (operator) {
  131. case EQUALS:
  132. retStr += key + ".isNull()";
  133. break;
  134. default:
  135. break;
  136. }
  137. }
  138. }
  139. retStr += ")";
  140. return retStr;
  141. }
  142. public void write(Writer w, MLMObjectElement objElement, boolean isAnswerVar) {
  143. try {
  144. String comparisonString = getCompOpCode(objElement, isAnswerVar);
  145. if (comparisonString != null && comparisonString.length() > 0) {
  146. w.append(comparisonString);
  147. }
  148. }
  149. catch (Exception e) {
  150. }
  151. }
  152. public void writeComparisonList(Writer w) {
  153. try {
  154. String retStr = "";
  155. if (this.operator != null && this.operator == org.openmrs.arden.ArdenBaseParserTokenTypes.IN) {
  156. if (answerList == null) {
  157. return;
  158. }
  159. Iterator<Object> itr = answerList.iterator();
  160. Object answer = null;
  161. // The first one in the list
  162. if (itr.hasNext()) {
  163. if (keyList != null) {
  164. retStr = "\n\tprivate Result getResultList_" + this.keyList + "(){";
  165. } else {
  166. retStr = "\n\tprivate Result getResultList_" + this.key + "(){";
  167. }
  168. while (itr.hasNext()) {
  169. answer = itr.next();
  170. if (answer instanceof Integer || answer instanceof Double || answer instanceof Float) {
  171. retStr += "\n\t\tResult aList = new Result();";
  172. retStr += "\n\t\taList.add(new Result(" + answer + "));";
  173. } else {
  174. retStr += "\n\t\tResult aList = new Result();";
  175. retStr += "\n\t\tConcept concept = new Concept();";
  176. retStr += "\n\t\tConceptName conceptName = new ConceptName(\"" + answer
  177. + "\", Context.getLocale());";
  178. retStr += "concept.addName(conceptName);";
  179. retStr += "\n\t\taList.add(new Result(concept));";
  180. }
  181. }
  182. retStr += "\n\t\treturn aList;\n\t}\n";
  183. }
  184. }
  185. w.append(retStr);
  186. }
  187. catch (Exception e) {
  188. }
  189. }
  190. }