/** * 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.propertyeditor; import java.beans.PropertyEditorSupport; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Concept; import org.openmrs.ConceptAnswer; import org.openmrs.Drug; import org.openmrs.api.ConceptService; import org.openmrs.api.context.Context; import org.springframework.util.StringUtils; /** * Handles lists of conceptids that correspond to answers. */ public class ConceptAnswersEditor extends PropertyEditorSupport { private Log log = LogFactory.getLog(this.getClass()); private Collection<ConceptAnswer> originalConceptAnswers = null; /** * Default constructor taking in the original answers. This should be the actual list on the * pojo object to prevent hibernate errors later on. * * @param originalAnswers the list on the pojo */ public ConceptAnswersEditor(Collection<ConceptAnswer> originalAnswers) { if (originalAnswers == null) originalConceptAnswers = new HashSet<ConceptAnswer>(); else originalConceptAnswers = originalAnswers; } /** * loops over the textbox assigned to this property. The textbox is assumed to be a string of * conceptIds^drugIds separated by spaces */ public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.hasText(text)) { ConceptService cs = Context.getConceptService(); String[] conceptIds = text.split(" "); List<String> requestConceptIds = new Vector<String>(); //set up parameter answer Set for easier add/delete functions and removal of duplicates for (String id : conceptIds) { id = id.trim(); if (!id.equals("") && !requestConceptIds.contains(id)) //remove whitespace, blank lines, and duplicates requestConceptIds.add(id); } Collection<ConceptAnswer> deletedConceptAnswers = new HashSet<ConceptAnswer>(); // loop over original concept answers to find any deleted answers for (ConceptAnswer origConceptAnswer : originalConceptAnswers) { boolean answerDeleted = true; for (String conceptId : requestConceptIds) { Integer id = getConceptId(conceptId); Integer drugId = getDrugId(conceptId); Drug answerDrug = origConceptAnswer.getAnswerDrug(); if (id.equals(origConceptAnswer.getAnswerConcept().getConceptId())) { if (drugId == null && answerDrug == null) answerDeleted = false; else if ((drugId != null && answerDrug != null) && drugId.equals(origConceptAnswer.getAnswerDrug().getDrugId())) answerDeleted = false; } } if (answerDeleted) deletedConceptAnswers.add(origConceptAnswer); } // loop over those deleted answers to delete them for (ConceptAnswer conceptAnswer : deletedConceptAnswers) { originalConceptAnswers.remove(conceptAnswer); } // loop over concept ids in the request to add any that are new for (String conceptId : requestConceptIds) { Integer id = getConceptId(conceptId); Integer drugId = getDrugId(conceptId); boolean newAnswerConcept = true; for (ConceptAnswer origConceptAnswer : originalConceptAnswers) { Drug answerDrug = origConceptAnswer.getAnswerDrug(); if (id.equals(origConceptAnswer.getAnswerConcept().getConceptId())) { if (drugId == null && answerDrug == null) newAnswerConcept = false; else if ((drugId != null && answerDrug != null) && drugId.equals(answerDrug.getDrugId())) newAnswerConcept = false; } } // if the current request answer is new, add it to the originals if (newAnswerConcept) { Concept answer = cs.getConcept(id); Drug drug = null; if (drugId != null) drug = cs.getDrug(drugId); ConceptAnswer ac = new ConceptAnswer(answer, drug); originalConceptAnswers.add(ac); } } log.debug("originalConceptAnswers.getConceptId(): "); for (ConceptAnswer a : originalConceptAnswers) log.debug("id: " + a.getAnswerConcept().getConceptId()); log.debug("requestConceptIds: "); for (String i : requestConceptIds) log.debug("id: " + i); } else { originalConceptAnswers.clear(); } setValue(originalConceptAnswers); } /** * Parses the string and returns the Integer concept id Expected string: "123" or "123^34" * ("conceptId^drugId") * * @param conceptId * @return */ private Integer getConceptId(String conceptId) { if (conceptId.contains("^")) return Integer.valueOf(conceptId.substring(0, conceptId.indexOf("^"))); else return Integer.valueOf(conceptId); } /** * Parses the string and returns the Integer drug id or null if none Expected string: "123" or * "123^34" ("conceptId^drugId") * * @param conceptId * @return */ private Integer getDrugId(String conceptId) { if (conceptId.contains("^")) return Integer.valueOf(conceptId.substring(conceptId.indexOf("^") + 1, conceptId.length())); return null; } }