/** * 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.controller.concept; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.Vector; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.ConceptProposal; import org.openmrs.api.ConceptService; import org.openmrs.api.context.Context; import org.openmrs.util.OpenmrsConstants; import org.springframework.validation.Errors; import org.springframework.web.servlet.mvc.SimpleFormController; public class ConceptProposalListController extends SimpleFormController { /** Logger for this class and subclasses */ protected final Log log = LogFactory.getLog(getClass()); /** * This is called prior to displaying a form for the first time. It tells Spring the * form/command object to load into the request * * @see org.springframework.web.servlet.mvc.AbstractFormController#formBackingObject(javax.servlet.http.HttpServletRequest) */ protected Object formBackingObject(HttpServletRequest request) throws ServletException { //default empty Object List<ConceptProposal> cpList = new Vector<ConceptProposal>(); Map<String, List<ConceptProposal>> origText = new HashMap<String, List<ConceptProposal>>(); //only fill the Object is the user has authenticated properly if (Context.isAuthenticated()) { ConceptService cs = Context.getConceptService(); log.debug("tmp value: " + request.getParameter("includeCompleted")); boolean b = new Boolean(request.getParameter("includeCompleted")); log.debug("b value: " + b); cpList = cs.getAllConceptProposals(b); } // create map of distinct OriginalText->#occurences for (ConceptProposal cp : cpList) { List<ConceptProposal> matchingProposals = origText.get(cp.getOriginalText()); if (matchingProposals == null) matchingProposals = new Vector<ConceptProposal>(); matchingProposals.add(cp); origText.put(cp.getOriginalText(), matchingProposals); } boolean asc = new Boolean("asc".equals(request.getParameter("sortOrder"))); String sortOn = request.getParameter("sortOn"); if (sortOn == null) sortOn = "occurences"; TreeMap<List<ConceptProposal>, Integer> cpMap = new TreeMap<List<ConceptProposal>, Integer>(); if (sortOn.equals("occurences")) cpMap = new TreeMap<List<ConceptProposal>, Integer>(new CompareListSize(asc)); else //if (sortOn.equals("text")) cpMap = new TreeMap<List<ConceptProposal>, Integer>(new CompareListText(asc)); // loop over that map to sort on size or text for (List<ConceptProposal> matchingProposals : origText.values()) { cpMap.put(matchingProposals, matchingProposals.size()); } return cpMap; } /** * @see org.springframework.web.servlet.mvc.SimpleFormController#referenceData(javax.servlet.http.HttpServletRequest, * java.lang.Object, org.springframework.validation.Errors) */ @Override protected Map<String, Object> referenceData(HttpServletRequest request, Object obj, Errors errors) throws Exception { Map<String, Object> map = new HashMap<String, Object>(); map.put("unmapped", OpenmrsConstants.CONCEPT_PROPOSAL_UNMAPPED); map.put("states", OpenmrsConstants.CONCEPT_PROPOSAL_STATES()); return map; } private class CompareListSize implements Comparator<List<?>> { private boolean asc = true; public CompareListSize(boolean asc) { this.asc = asc; } public int compare(List<?> list1, List<?> list2) throws ClassCastException { int value = list2.size() - list1.size(); // no items are equal if (value == 0) value = -1; if (asc) value = value * -1; return value; } } private class CompareListText implements Comparator<List<ConceptProposal>> { private boolean asc = true; public CompareListText(boolean asc) { this.asc = asc; } public int compare(List<ConceptProposal> list1, List<ConceptProposal> list2) throws ClassCastException { ConceptProposal cp1 = list1.get(0); ConceptProposal cp2 = list2.get(0); int value = cp2.getOriginalText().compareToIgnoreCase(cp1.getOriginalText()); // no items are equal if (value == 0) value = -1; if (asc) value = value * -1; return value; } } }