/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.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://license.openmrs.org
*
* 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.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.arden;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
/**
* This class translates comparisons within MLM if statements into java
*/
public class Comparison implements ArdenBaseTreeParserTokenTypes {
private String key = null;
private String keyList = null;
private Integer operator = null;
private Object answer = null;
private ArrayList<Object> answerList = null;
public Comparison(String key, Integer operator) {
this.key = key;
this.operator = operator;
}
public void setAnswer(Object answer) {
this.answer = answer;
}
public Object getAnswer() {
return answer;
}
public void setKey(String key, String keyList) {
this.key = key;
this.keyList = keyList;
}
public void setOperator(Integer operator) {
this.operator = operator;
}
public void addAnswerToList(Object answer) {
if (answerList == null) {
answerList = new ArrayList<Object>();
}
this.answerList.add(answer);
}
public ArrayList<Object> getAnswerList() {
return this.answerList;
}
public String getCompOpCode(MLMObjectElement objElement, boolean isAnswerVar) throws Exception {
String retStr = "";
if (objElement != null) {
String readType = objElement.getReadType();
if (readType != null && readType.equalsIgnoreCase("Exist")) {
retStr += key + ".exists()";
if (this.answer.toString().equalsIgnoreCase("false")) {
return "!" + retStr;
}
return retStr;
}
}
//there is no read value for this comparison so try
//reading from the userVarMap
if (this.answer instanceof Boolean && objElement == null) {
retStr += "userVarMap.containsKey(\"" + key + "\")";
if (this.answer.toString().equalsIgnoreCase("false")) {
return "!" + retStr;
}
return retStr;
}
retStr += "(";
if (operator != null) {
if (this.answer != null || (answerList != null && !answerList.isEmpty())) {
retStr += "!" + key + ".isNull()&&";
if (isAnswerVar) {
retStr += "!" + this.answer + ".isNull()&&";
}
switch (operator) {
case IN:
if (keyList != null) {
retStr += "containsIgnoreCase(getResultList_" + keyList + "()," + key + ")";
} else {
retStr += "containsIgnoreCase(getResultList_" + key + "()," + key + ")";
}
break;
case EQUALS:
if (this.answer instanceof Integer || this.answer instanceof Double || this.answer instanceof Float) {
retStr += "(" + key + ".toNumber()!= null&&" + key + ".toNumber() == " + this.answer + ")";
} else {
retStr += key + ".toString().equalsIgnoreCase(\"" + this.answer + "\")";
}
break;
case GTE:
case GT:
case LTE:
case LT:
String comparator = null;
switch (operator) {
case GTE:
comparator = ">=";
break;
case GT:
comparator = ">";
break;
case LTE:
comparator = "<=";
break;
case LT:
comparator = "<";
break;
default:
assert false; // execution should not reach this point
break;
}
if (this.answer instanceof Integer || this.answer instanceof Double || this.answer instanceof Float) {
retStr += "(" + key + ".toNumber()!= null&&" + key + ".toNumber() " + comparator + " "
+ this.answer + ")";
} else if (isAnswerVar) {
retStr += "(" + key + ".toNumber()!= null&&" + this.answer + ".toNumber()!=null&&" + key
+ ".toNumber() " + comparator + " " + this.answer + ".toNumber())";
}
break;
default:
break;
}
} else {
switch (operator) {
case EQUALS:
retStr += key + ".isNull()";
break;
default:
break;
}
}
}
retStr += ")";
return retStr;
}
public void write(Writer w, MLMObjectElement objElement, boolean isAnswerVar) {
try {
String comparisonString = getCompOpCode(objElement, isAnswerVar);
if (comparisonString != null && comparisonString.length() > 0) {
w.append(comparisonString);
}
}
catch (Exception e) {
}
}
public void writeComparisonList(Writer w) {
try {
String retStr = "";
if (this.operator != null && this.operator == org.openmrs.arden.ArdenBaseParserTokenTypes.IN) {
if (answerList == null) {
return;
}
Iterator<Object> itr = answerList.iterator();
Object answer = null;
// The first one in the list
if (itr.hasNext()) {
if (keyList != null) {
retStr = "\n\tprivate Result getResultList_" + this.keyList + "(){";
} else {
retStr = "\n\tprivate Result getResultList_" + this.key + "(){";
}
while (itr.hasNext()) {
answer = itr.next();
if (answer instanceof Integer || answer instanceof Double || answer instanceof Float) {
retStr += "\n\t\tResult aList = new Result();";
retStr += "\n\t\taList.add(new Result(" + answer + "));";
} else {
retStr += "\n\t\tConceptService conceptService = Context.getConceptService();";
retStr += "\n\t\tResult aList = new Result();";
retStr += "\n\t\taList.add(new Result(conceptService.getConcept(\"" + answer + "\")));";
}
}
retStr += "\n\t\treturn aList;\n\t}\n";
}
}
w.append(retStr);
}
catch (Exception e) {
}
}
}