/**
* 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.reporting.export;
import java.io.Serializable;
import java.util.List;
import org.openmrs.Concept;
import org.openmrs.api.APIException;
import org.openmrs.api.context.Context;
/**
* @deprecated see reportingcompatibility module
*/
@Deprecated
public class ConceptColumn implements ExportColumn, Serializable {
public static final long serialVersionUID = 987654323L;
private String columnType = "concept";
private String columnName = "";
private String modifier = "";
private Integer modifierNum = null;
private Integer conceptId = null;
private String conceptName = "";
private String[] extras = null;
public ConceptColumn() {
}
public ConceptColumn(String columnName, String modifier, Integer modifierNum, String conceptId, String[] extras) {
this.columnName = columnName;
this.modifier = modifier;
this.modifierNum = modifierNum;
try {
this.conceptId = Integer.valueOf(conceptId);
}
catch (NumberFormatException e) {
this.conceptName = conceptId; // for backwards compatibility to pre 1.0.43
}
this.extras = extras;
}
private String toSingleTemplateString(int conceptId) {
String s = "";
if (extras == null)
extras = new String[] {};
if (DataExportReportObject.MODIFIER_LAST_NUM.equals(modifier)
|| DataExportReportObject.MODIFIER_FIRST_NUM.equals(modifier)) {
Integer num = modifierNum == null ? 1 : modifierNum;
s += "#set($arr = [";
for (Integer x = 0; x < extras.length; x++) {
s += "'" + extras[x] + "'";
if (!x.equals(extras.length - 1))
s += ",";
}
s += "])";
if (DataExportReportObject.MODIFIER_LAST_NUM.equals(modifier))
s += "#set($obsValues = $fn.getLastNObsWithValues(" + num + ", '" + conceptId + "', $arr))";
else if (DataExportReportObject.MODIFIER_FIRST_NUM.equals(modifier))
s += "#set($obsValues = $fn.getFirstNObsWithValues(" + num + ", '" + conceptId + "', $arr))";
s += "#foreach($vals in $obsValues)";
s += "#if($velocityCount > 1)";
s += "$!{fn.getSeparator()}";
s += "#end";
s += "#foreach($val in $vals)";
s += "#if($velocityCount > 1)";
s += "$!{fn.getSeparator()}";
s += "#end";
s += "$!{fn.getValueAsString($val)}";
s += "#end";
s += "#end\n";
} else {
String function = " ";
if (DataExportReportObject.MODIFIER_ANY.equals(modifier))
function += "$fn.getLastObs";
else if (DataExportReportObject.MODIFIER_FIRST.equals(modifier))
function += "$fn.getFirstObs";
else if (DataExportReportObject.MODIFIER_LAST.equals(modifier))
function += "$fn.getLastObs";
else
throw new APIException("Unknown modifier: " + modifier);
if (extras.length < 1) {
function = "$!{fn.getValueAsString(" + function;
function += "('" + conceptId + "'))}";
s += function; // if we don't have extras, just call the normal function and print it
} else {
s += "#set($arr = [";
for (Integer x = 0; x < extras.length; x++) {
s += "'" + extras[x] + "'";
if (!x.equals(extras.length - 1))
s += ",";
}
s += "])";
function += "WithValues('" + conceptId + "', $arr)";
s += "#set($obsRow =" + function + ")";
s += "#foreach($val in $obsRow)";
s += "#if($velocityCount > 1)";
s += "$!{fn.getSeparator()}";
s += "#end";
s += "$!{fn.getValueAsString($val)}";
s += "#end\n";
}
}
return s;
}
public String toTemplateString() {
Concept concept = Context.getConceptService().getConcept(conceptId);
String toReturn;
if (!concept.isSet()) {
toReturn = toSingleTemplateString(concept.getConceptId());
} else {
List<Concept> setMembers = Context.getConceptService().getConceptsByConceptSet(concept);
toReturn = "";
boolean firstMember = true;
for (Concept setMember : setMembers) {
if (firstMember) {
toReturn += toSingleTemplateString(setMember.getConceptId());
firstMember = false;
} else {
toReturn += "$!{fn.getSeparator()}";
toReturn += toSingleTemplateString(setMember.getConceptId());
}
}
}
return toReturn;
}
public String getColumnType() {
return columnType;
}
public void setColumnType(String columnType) {
this.columnType = columnType;
}
public String getColumnName() {
return columnName;
}
/**
* Convenience method used by {@link #getTemplateColumnName()} to print out for just the given
* concept. This is used for all normal columns and then for the each set member of a column
*
* @param columnName the conceptName to act on
* @return string for this one concept
*/
private String getTemplateSingleConceptColumnName(String columnName) {
String s = "\"" + columnName + "\"";
s += getExtrasTemplateColumnNames(columnName, false);
if (DataExportReportObject.MODIFIER_LAST_NUM.equals(modifier)
|| DataExportReportObject.MODIFIER_FIRST_NUM.equals(modifier)) {
if (modifierNum == null || modifierNum < 2)
s += "#foreach($o in []) ";
else
s += "#foreach($o in [1.." + (modifierNum - 1) + "]) ";
s += "$!{fn.getSeparator()}";
s += "\"";
s += columnName + "_($velocityCount)";
s += "\"";
s += getExtrasTemplateColumnNames(columnName, true);
s += "#end\n";
}
return s;
}
/**
* @see org.openmrs.reporting.export.ExportColumn#getTemplateColumnName()
*/
public String getTemplateColumnName() {
Concept concept = Context.getConceptService().getConcept(conceptId);
String toReturn;
if (!concept.isSet()) {
toReturn = getTemplateSingleConceptColumnName(columnName);
} else {
List<Concept> setMembers = Context.getConceptService().getConceptsByConceptSet(concept);
toReturn = "";
boolean firstMember = true;
for (Concept setMember : setMembers) {
if (firstMember) {
toReturn += getTemplateSingleConceptColumnName(setMember.getName().getName());
firstMember = false;
} else {
toReturn += "$!{fn.getSeparator()}";
toReturn += getTemplateSingleConceptColumnName(setMember.getName().getName());
}
}
}
return toReturn;
}
/**
* Get the extras template for the given conceptName
*
* @param columnName optional column name to use instead of conceptName
* @param appendCount the extra label to append to the name
* @return template column string for this concept
*/
private String getExtrasTemplateColumnNames(String columnName, boolean appendCount) {
String s = "";
if (extras != null) {
for (String ext : extras) {
s += "$!{fn.getSeparator()}";
s += "\"";
s += columnName + "_" + ext;
if (appendCount)
s += "_($velocityCount)";
s += "\"";
}
}
return s;
}
//// left for backwards compatibility to pre 1.0.43
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getConceptName() {
return conceptName;
}
///////
public Integer getConceptId() {
return conceptId;
}
public void setConceptId(Integer conceptId) {
this.conceptId = conceptId;
}
public void setConceptName(String conceptName) {
this.conceptName = conceptName;
}
public String getModifier() {
return modifier;
}
public void setModifier(String modifier) {
this.modifier = modifier;
}
public String[] getExtras() {
return extras;
}
public void setExtras(String[] extras) {
this.extras = extras;
}
public Integer getModifierNum() {
return modifierNum;
}
public void setModifierNum(Integer modifierNum) {
this.modifierNum = modifierNum;
}
// returns conceptId if not null, conceptName otherwise
// convenience method for backwards compatibility to pre 1.0.43
public String getConceptIdOrName() {
if (conceptId != null)
return conceptId.toString();
else
return conceptName;
}
}