/**
* 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.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.ConceptSet;
import org.openmrs.api.ConceptService;
import org.openmrs.api.context.Context;
import org.springframework.util.StringUtils;
/**
* Turns a list of concept ids "123 1234 1235" into a List of ConceptSets
*/
public class ConceptSetsEditor extends PropertyEditorSupport {
private Log log = LogFactory.getLog(this.getClass());
private Collection<ConceptSet> originalConceptSets = null;
/**
* Default constructor taking in the current sets on a concept
*
* @param conceptSets the current object on the concept
*/
public ConceptSetsEditor(Collection<ConceptSet> conceptSets) {
if (conceptSets == null)
originalConceptSets = new Vector<ConceptSet>();
this.originalConceptSets = conceptSets;
}
/**
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
*/
public void setAsText(String text) throws IllegalArgumentException {
log.debug("setting conceptSets with text: " + text);
if (StringUtils.hasText(text)) {
ConceptService cs = Context.getConceptService();
String[] conceptIds = text.split(" ");
List<Integer> requestConceptIds = new Vector<Integer>();
//set up parameter Set for easier add/delete functions
// and removal of duplicates
for (String id : conceptIds) {
id = id.trim();
if (!id.equals("") && !requestConceptIds.contains(Integer.valueOf(id))) //remove whitespace, blank lines, and duplicate entries
requestConceptIds.add(Integer.valueOf(id));
}
// used when adding in concept sets
List<Integer> originalConceptSetIds = new ArrayList<Integer>(originalConceptSets.size());
// remove all sets that aren't in the request (aka, that have been deleted by the user)
Collection<ConceptSet> copyOfOriginalConceptSets = new ArrayList<ConceptSet>(originalConceptSets);
for (ConceptSet origConceptSet : copyOfOriginalConceptSets) {
if (!requestConceptIds.contains(origConceptSet.getConcept().getConceptId()))
originalConceptSets.remove(origConceptSet);
// add to quick list used when adding later
originalConceptSetIds.add(origConceptSet.getConcept().getConceptId());
}
// insert all sets that are new (aka, that have been added by the user).
// Also normalize all weight attributes
for (int x = 0; x < requestConceptIds.size(); x++) {
Integer requestConceptId = requestConceptIds.get(x);
// if this isn't in the originalList, add it
if (!originalConceptSetIds.contains(requestConceptId)) {
// the null weight will be reset in the next step of normalization
originalConceptSets.add(new ConceptSet(cs.getConcept(requestConceptId), new Double(x)));
} else {
// find this conceptId in the original set and set its weight
for (ConceptSet conceptSet : originalConceptSets) {
if (conceptSet.getConcept().getConceptId().equals(requestConceptId)) {
conceptSet.setSortWeight(new Double(x));
}
}
}
}
} else {
originalConceptSets.clear();
}
setValue(originalConceptSets);
}
}