MLMObjectElement.java

/**
 * 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;

/*
 * @@ This class represents a statement in Data slot - read
 */

public class MLMObjectElement {
	
	public static final String PARAMETERS_DATASOURCE = "Parameters";
	
	private String conceptName;
	
	private String readType; // Exist, Last, First etc
	
	private int howMany; // how many to read
	
	private boolean hasWhere;
	
	private String whereType;
	
	private String durationType;
	
	private String durationVal;
	
	private String durationOp; // TODO
	
	private String datasource = "obs";
	
	public MLMObjectElement() {
	}
	
	public void setWhere(String type) {
		hasWhere = true;
		whereType = type.trim();
	}
	
	public void setDuration(String type, String val, String op) {
		durationType = type.trim();
		durationVal = val.trim();
		op = op.trim();
		if (op.toUpperCase().startsWith("MONTH")) {
			durationOp = "months";
		} else if (op.toUpperCase().startsWith("YEAR")) {
			durationOp = "years";
		} else if (op.toUpperCase().startsWith("DAY")) {
			durationOp = "days";
		}
	}
	
	public void setWhere(boolean val) {
		hasWhere = val;
	}
	
	private String getConcept(String conceptName) {
		String cn;
		int len;
		int index;
		if (conceptName == null) {
			return conceptName;
		}
		index = conceptName.indexOf("from"); // First substring
		if (index != -1) {
			cn = conceptName.substring(1, index);
			datasource = conceptName.substring(index + 4, conceptName.length() - 1).trim();
		} else {
			len = conceptName.length();
			if (conceptName.contains("{")) {
				cn = conceptName.substring(1, len - 1);
			} else {
				cn = conceptName.substring(0, len);
			}
		}
		return cn;
	}
	
	private String getReadTypeAsString() {
		String retVal = "";
		if (readType != null && !readType.equals("") && !readType.equalsIgnoreCase("exist")) {
			retVal = "." + readType;
		} else {
			retVal = ".last"; // TODO: for now default
		}
		
		if (howMany > 1) {
			retVal += "(" + howMany + ")";
		} else {
			retVal += "()";
		}
		
		return retVal;
	}
	
	public String getReadType() {
		return this.readType;
	}
	
	public boolean writeEvaluate(String key, Writer w) throws Exception {
		boolean retVal = true;
		
		String cn = conceptName;
		
		if (cn != null) {
			/***************************************************************************************
			 * 
			 **************************************************************************************/
			if (this.datasource.equalsIgnoreCase(PARAMETERS_DATASOURCE)) {
				w.append("\n\t\t\tResult " + key + "=new Result((String) parameters.get(\"" + cn + "\")");
			} else {
				w.append("\n\t\t\tResult " + key
				        + "=context.read(\n\t\t\t\tpatient.getPatientId(),context.getLogicDataSource(\"" + this.datasource
				        + "\"),\n\t\t\t\tnew LogicCriteriaImpl(\"" + cn.trim() + "\")");
			}
			if (hasWhere) {
				if (whereType.equals("withinPreceding")) {
					w.append(".within(Duration." + durationOp + "(-" + durationVal + "))");
				}
			}
			
			//right the read type
			if (readType != null && readType.length() > 0) {
				w.append(this.getReadTypeAsString());
			}
			w.append(");");
			w.append("\n\t\t\tresultLookup.put(\"" + key + "\"," + key + ");");
			
		}
		return retVal;
	}
	
	private String getConceptName() {
		
		return conceptName;
	}
	
	public void setReadType(String readType) {
		this.readType = readType.trim();
	}
	
	public void setHowMany(int howMany) {
		this.howMany = howMany;
	}
	
	public void setConceptName(String conceptName) {
		this.conceptName = this.getConcept(conceptName).trim();
	}
	
}