/**
* 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.web.taglib;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.Concept;
import org.openmrs.Encounter;
import org.openmrs.EncounterType;
import org.openmrs.Location;
import org.openmrs.LocationTag;
import org.openmrs.Obs;
import org.openmrs.OpenmrsMetadata;
import org.openmrs.Person;
import org.openmrs.Program;
import org.openmrs.User;
import org.openmrs.api.context.Context;
import org.springframework.util.StringUtils;
import org.springframework.web.util.JavaScriptUtils;
/**
* <pre>
* Prints out a pretty-formatted versions of an OpenMRS object
* TODO: add the other openmrs domain objects
* TODO: add a size=compact|NORMAL|full|? option
* </pre>
*/
public class FormatTag extends TagSupport {
private static final long serialVersionUID = 1L;
private final Log log = LogFactory.getLog(getClass());
private String var;
private Integer conceptId;
private Concept concept;
private Obs obsValue;
private Integer userId;
private User user;
private Integer personId;
private Person person;
private Integer encounterId;
private Encounter encounter;
private Integer encounterTypeId;
private EncounterType encounterType;
private Integer locationId;
private Location location;
private Integer locationTagId;
private LocationTag locationTag;
private Integer programId;
private Program program;
private Boolean javaScriptEscape = Boolean.FALSE;
@Override
public int doStartTag() {
StringBuilder sb = new StringBuilder();
if (conceptId != null)
concept = Context.getConceptService().getConcept(conceptId);
if (concept != null) {
printConcept(sb, concept);
}
if (obsValue != null)
sb.append(obsValue.getValueAsString(Context.getLocale()));
if (userId != null)
user = Context.getUserService().getUser(userId);
if (user != null)
printUser(sb, user);
if (personId != null)
person = Context.getPersonService().getPerson(personId);
if (person != null)
printPerson(sb, person);
if (encounterId != null)
encounter = Context.getEncounterService().getEncounter(encounterId);
if (encounter != null) {
printMetadata(sb, encounter.getEncounterType());
sb.append(" @");
printMetadata(sb, encounter.getLocation());
sb.append(" | ");
printDate(sb, encounter.getEncounterDatetime());
sb.append(" | ");
printPerson(sb, encounter.getProvider());
}
if (encounterTypeId != null)
encounterType = Context.getEncounterService().getEncounterType(encounterTypeId);
if (encounterType != null) {
printMetadata(sb, encounterType);
}
if (locationId != null)
location = Context.getLocationService().getLocation(locationId);
if (location != null) {
printMetadata(sb, location);
}
if (locationTagId != null)
locationTag = Context.getLocationService().getLocationTag(locationTagId);
if (locationTag != null) {
printMetadata(sb, locationTag);
}
if (programId != null)
program = Context.getProgramWorkflowService().getProgram(programId);
if (program != null) {
if (StringUtils.hasText(program.getName())) {
printMetadata(sb, program);
} else if (program.getConcept() != null) {
printConcept(sb, program.getConcept());
}
}
if (StringUtils.hasText(var)) {
if (javaScriptEscape)
pageContext.setAttribute(var, JavaScriptUtils.javaScriptEscape(sb.toString()));
else
pageContext.setAttribute(var, sb.toString());
} else {
try {
if (javaScriptEscape)
pageContext.getOut().write(JavaScriptUtils.javaScriptEscape(sb.toString()));
else
pageContext.getOut().write(sb.toString());
}
catch (IOException e) {
log.error("Failed to write to pageContext.getOut()", e);
}
}
return SKIP_BODY;
}
/**
* Formats a Concept and prints it to sb
*
* @param sb
* @param concept
*/
protected void printConcept(StringBuilder sb, Concept concept) {
sb.append(concept.getDisplayString());
}
/**
* formats a date and prints it to sb
*
* @param sb
* @param date
*/
private void printDate(StringBuilder sb, Date date) {
sb.append(Context.getDateFormat().format(date));
}
/**
* formats any OpenmrsMetadata and prints it to sb
*
* @param sb
* @param metadata
*/
private void printMetadata(StringBuilder sb, OpenmrsMetadata metadata) {
if (metadata != null)
sb.append(metadata.getName());
}
/**
* formats a user and prints it to sb
*
* @param sb
* @param u
*/
private void printUser(StringBuilder sb, User u) {
sb.append("<span class=\"user\">");
sb.append("<span class=\"username\">");
sb.append(u.getUsername());
sb.append("</span>");
if (u.getPerson() != null) {
sb.append("<span class=\"personName\">");
sb.append(" (").append(u.getPersonName()).append(")");
sb.append("</span>");
}
sb.append("</span>");
}
/**
* formats a person and prints it to sb
*
* @param sb
* @param p
*/
private void printPerson(StringBuilder sb, Person p) {
sb.append(p.getPersonName());
}
@Override
public int doEndTag() {
reset();
return EVAL_PAGE;
}
private void reset() {
var = null;
conceptId = null;
concept = null;
obsValue = null;
userId = null;
user = null;
personId = null;
person = null;
encounterId = null;
encounter = null;
encounterTypeId = null;
encounterType = null;
locationId = null;
location = null;
locationTagId = null;
locationTag = null;
}
public Integer getConceptId() {
return conceptId;
}
public void setConceptId(Integer conceptId) {
this.conceptId = conceptId;
}
public Concept getConcept() {
return concept;
}
public void setConcept(Concept concept) {
this.concept = concept;
}
public Obs getObsValue() {
return obsValue;
}
public void setObsValue(Obs obsValue) {
this.obsValue = obsValue;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Integer getEncounterId() {
return encounterId;
}
public void setEncounterId(Integer encounterId) {
this.encounterId = encounterId;
}
public Encounter getEncounter() {
return encounter;
}
public void setEncounter(Encounter encounter) {
this.encounter = encounter;
}
public Integer getEncounterTypeId() {
return encounterTypeId;
}
public void setEncounterTypeId(Integer encounterTypeId) {
this.encounterTypeId = encounterTypeId;
}
public EncounterType getEncounterType() {
return encounterType;
}
public void setEncounterType(EncounterType encounterType) {
this.encounterType = encounterType;
}
public Integer getLocationId() {
return locationId;
}
public void setLocationId(Integer locationId) {
this.locationId = locationId;
}
public Location getLocation() {
return location;
}
public void setLocation(Location location) {
this.location = location;
}
public Integer getLocationTagId() {
return locationTagId;
}
public void setLocationTagId(Integer locationTagId) {
this.locationTagId = locationTagId;
}
public LocationTag getLocationTag() {
return locationTag;
}
public void setLocationTag(LocationTag locationTag) {
this.locationTag = locationTag;
}
public Integer getProgramId() {
return programId;
}
public void setProgramId(Integer programId) {
this.programId = programId;
}
public Program getProgram() {
return program;
}
public void setProgram(Program program) {
this.program = program;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
/**
* @return the javaScriptEscape
*/
public Boolean getJavaScriptEscape() {
return javaScriptEscape;
}
/**
* @param javaScriptEscape the javaScriptEscape to set
*/
public void setJavaScriptEscape(Boolean javaScriptEscape) {
this.javaScriptEscape = javaScriptEscape;
}
}