001: /*
002: * Copyright 2006-2007 The Kuali Foundation.
003: *
004: * Licensed under the Educational Community License, Version 1.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.opensource.org/licenses/ecl1.php
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.kuali.core.web.comparator;
017:
018: import java.util.Comparator;
019: import java.util.regex.Matcher;
020: import java.util.regex.Pattern;
021:
022: import org.apache.commons.collections.comparators.ComparableComparator;
023: import org.apache.commons.lang.StringUtils;
024: import org.displaytag.model.Cell;
025: import org.kuali.core.util.TypeUtils;
026:
027: /**
028: * This class...
029: */
030: public class CellComparatorHelper {
031:
032: static private Pattern HREF_ENCLOSURE = Pattern.compile(
033: "<a [^>]+>([^<]*)</a>.*", Pattern.MULTILINE);
034:
035: /**
036: * This method is intended to be used in conjunction with displaytag.
037: *
038: * @see #getSanitizedStaticValue(String)
039: *
040: * @param cell
041: * @return a sanitized version of cell.getStaticValue().toString().
042: */
043: static public String getSanitizedStaticValue(Cell cell) {
044: if (null == cell) {
045: return null;
046: }
047:
048: return null == cell.getStaticValue() ? null
049: : getSanitizedStaticValue(cell.getStaticValue()
050: .toString());
051: }
052:
053: /**
054: * Remove all end-of-line and tab characters (\r, \n, \t). If the value is enclosed in an html anchor tag, strip the html anchor
055: * tag. If the value ends in one or many " "s, strip them off. Return the modified String.
056: *
057: * @param staticValue
058: * @return a sanitized version of staticValue
059: */
060: static public String getSanitizedStaticValue(String staticValue) {
061:
062: if (null == staticValue) {
063: return null;
064: }
065:
066: staticValue = StringUtils.replace(staticValue, "\r", "");
067: staticValue = StringUtils.replace(staticValue, "\n", "");
068: staticValue = StringUtils.replace(staticValue, "\t", "");
069:
070: String sanitizedValue = staticValue;
071:
072: // Extract the value if it's wrapped in an href.
073: Matcher matcher = HREF_ENCLOSURE.matcher(staticValue);
074: if (matcher.matches()) {
075:
076: sanitizedValue = matcher.group(1).trim();
077:
078: }
079:
080: // Strip off any " "s if they come at the end of the value.
081: while (sanitizedValue.endsWith(" ")) {
082:
083: sanitizedValue = sanitizedValue.substring(0,
084: sanitizedValue.length() - 6).trim();
085:
086: }
087:
088: return sanitizedValue;
089:
090: }
091:
092: /**
093: * This method returns a comparator to be used for comparing the contents of cells, that is
094: * the compareTo method will be invoked w/ displaytag Cell objects
095: * @param propClass
096: * @return
097: */
098: public static Comparator getAppropriateComparatorForPropertyClass(
099: Class propClass) {
100: // TODO, do we really need to create so many comparators (1 per each cell)?
101: if (propClass == null) {
102: return new NullCellComparator();
103: } else if (TypeUtils.isDecimalClass(propClass)
104: || TypeUtils.isIntegralClass(propClass)) {
105: return new NumericCellComparator();
106: } else if (TypeUtils.isTemporalClass(propClass)) {
107: return new TemporalCellComparator();
108: } else if (String.class.equals(propClass)) {
109: // StringCellComparator is smarter about nulls than String.CASE_INSENSITIVE_ORDER
110: return new StringCellComparator();
111: } else {
112: return ComparableComparator.getInstance();
113: }
114: }
115:
116: /**
117: * This method returns a comparator to be used for comparing propertyValues (in String form)
118: * @param propClass
119: * @return
120: */
121: public static Comparator getAppropriateValueComparatorForPropertyClass(
122: Class propClass) {
123: if (propClass == null) {
124: return NullValueComparator.getInstance();
125: } else if (TypeUtils.isDecimalClass(propClass)
126: || TypeUtils.isIntegralClass(propClass)) {
127: return NumericValueComparator.getInstance();
128: } else if (TypeUtils.isTemporalClass(propClass)) {
129: return TemporalValueComparator.getInstance();
130: } else if (String.class.equals(propClass)) {
131: // StringCellComparator is smarter about nulls than String.CASE_INSENSITIVE_ORDER
132: return StringValueComparator.getInstance();
133: } else {
134: return ComparableComparator.getInstance();
135: }
136: }
137: }
|