001 /**
002 * Copyright 2010 The Kuali Foundation Licensed under the
003 * Educational Community License, Version 2.0 (the "License"); you may
004 * not use this file except in compliance with the License. You may
005 * obtain a copy of the License at
006 *
007 * http://www.osedu.org/licenses/ECL-2.0
008 *
009 * Unless required by applicable law or agreed to in writing,
010 * software distributed under the License is distributed on an "AS IS"
011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
012 * or implied. See the License for the specific language governing
013 * permissions and limitations under the License.
014 */
015
016 package org.kuali.student.common.search.dto;
017
018 import java.io.Serializable;
019 import java.text.SimpleDateFormat;
020 import java.util.ArrayList;
021 import java.util.Collections;
022 import java.util.Comparator;
023 import java.util.Date;
024 import java.util.List;
025
026 import javax.xml.bind.annotation.XmlAccessType;
027 import javax.xml.bind.annotation.XmlAccessorType;
028
029 @XmlAccessorType(XmlAccessType.FIELD)
030 public class SearchResult implements Serializable {
031 private static final long serialVersionUID = 1L;
032 private Integer startAt;
033 private Integer totalResults;
034 private List<SearchResultRow> rows;
035 private String sortColumn;
036 private SortDirection sortDirection;
037 public Integer getStartAt() {
038 return startAt;
039 }
040 public void setStartAt(Integer startAt) {
041 this.startAt = startAt;
042 }
043 public Integer getTotalResults() {
044 return totalResults;
045 }
046 public void setTotalResults(Integer totalResults) {
047 this.totalResults = totalResults;
048 }
049 public List<SearchResultRow> getRows() {
050 if (rows == null) {
051 rows = new ArrayList<SearchResultRow>(0);
052 }
053 return rows;
054 }
055 public void setRows(List<SearchResultRow> rows) {
056 this.rows = rows;
057 }
058 public String getSortColumn() {
059 return sortColumn;
060 }
061 public void setSortColumn(String sortColumn) {
062 this.sortColumn = sortColumn;
063 }
064 public SortDirection getSortDirection() {
065 return sortDirection;
066 }
067 public void setSortDirection(SortDirection sortDirection) {
068 this.sortDirection = sortDirection;
069 }
070
071 public void sortRows() {
072 if (sortColumn != null) {
073 Collections.sort(getRows(), new SearchResultRowComparator(sortColumn, sortDirection));
074 }
075 }
076
077 /**
078 * Compares two SearchResultRow rows with a given sort direction and column
079 *
080 */
081 private static class SearchResultRowComparator implements Comparator<SearchResultRow> {
082 private String sortColumn;
083 private SortDirection sortDirection;
084
085 public SearchResultRowComparator(String sortColumn, SortDirection sortDirection) {
086 super();
087 this.sortColumn = sortColumn;
088 this.sortDirection = sortDirection;
089
090 }
091
092 @Override
093 public int compare(SearchResultRow r1, SearchResultRow r2) {
094 int compareResult = 0;
095
096 //Pares out the cell values to compare
097 String v1 = null;
098 String v2 = null;
099 for (SearchResultCell c : r1.getCells()) {
100 if (sortColumn.equals(c.getKey())) {
101 v1 = c.getValue();
102 break;
103 }
104 }
105 for (SearchResultCell c : r2.getCells()) {
106 if (sortColumn.equals(c.getKey())) {
107 v2 = c.getValue();
108 break;
109 }
110 }
111
112 //Compare the values wiuth the right type (SHould be done more efficiently
113 try {
114 Integer v1Integer = Integer.parseInt(v1);
115 Integer v2Integer = Integer.parseInt(v2);
116 compareResult = v1Integer.compareTo(v2Integer);
117 } catch (Exception e1) {
118 if (v1 != null && v2 != null && ("true".equals(v1.toLowerCase()) || "false".equals(v1.toLowerCase())) &&
119 ("true".equals(v2.toLowerCase()) || "false".equals(v2.toLowerCase()))) {
120 Boolean v1Boolean = Boolean.parseBoolean(v1);
121 Boolean v2Boolean = Boolean.parseBoolean(v2);
122 compareResult = v1Boolean.compareTo(v2Boolean);
123 } else {
124 try {
125 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
126 Date v1Date = df.parse(v1);
127 Date v2Date = df.parse(v2);
128 compareResult = v1Date.compareTo(v2Date);
129 } catch (Exception e) {
130 if (v1 != null && v2 != null) {
131 compareResult = v1.compareTo(v2);
132 } else if (v2 == null) {
133 compareResult = 0;
134 } else {
135 compareResult = -1;
136 }
137 }
138 }
139 }
140
141 //Sort reverse if order is descending
142 if (SortDirection.DESC.equals(sortDirection)) {
143 return -1 * compareResult;
144 }
145 return compareResult;
146 }
147 }
148 }