PageRenderTime 27ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/org/andya/confluence/plugins/metadata/model/MetadataSortOrder.java

https://bitbucket.org/jwalton/metadata-confluence-plugin
Java | 157 lines | 96 code | 15 blank | 46 comment | 32 complexity | 9ca7990da3ef240d5a25674676955dd5 MD5 | raw file
  1. /*
  2. * Copyright (c) 2006, 2007 Andy Armstrong, Kelsey Grant and other contributors.
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * * Redistributions of source code must retain the above copyright notice,
  9. * this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above copyright notice,
  11. * this list of conditions and the following disclaimer in the documentation
  12. * and/or other materials provided with the distribution.
  13. * * The names of contributors may not
  14. * be used to endorse or promote products derived from this software without
  15. * specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  18. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  21. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  24. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. */
  28. package org.andya.confluence.plugins.metadata.model;
  29. import com.atlassian.renderer.v2.macro.MacroException;
  30. import java.util.Comparator;
  31. import java.util.List;
  32. import java.util.ArrayList;
  33. import org.andya.confluence.utils.ContentService;
  34. import org.andya.confluence.utils.MacroConstants;
  35. import org.apache.commons.collections.comparators.ComparatorChain;
  36. /**
  37. * Represents the sort order for a single metadata value.
  38. */
  39. public class MetadataSortOrder {
  40. private String metadataName;
  41. private boolean ascending;
  42. protected String sortMethod;
  43. public MetadataSortOrder(String metadataName, boolean ascending, String sortMethod) {
  44. this.metadataName = metadataName;
  45. this.ascending = ascending;
  46. this.sortMethod = sortMethod;
  47. }
  48. public String getMetadataName() {
  49. return metadataName;
  50. }
  51. public boolean isAscending() {
  52. return ascending;
  53. }
  54. public Comparator<MetadataContent> getComparator() {
  55. return new Comparator<MetadataContent>() {
  56. public int compare(MetadataContent o1, MetadataContent o2) {
  57. String metadataName = getMetadataName();
  58. MetadataContent ceo1 = (MetadataContent)o1;
  59. MetadataContent ceo2 = (MetadataContent)o2;
  60. MetadataValue value1 = ceo1.getMetadataValue(metadataName);
  61. MetadataValue value2 = ceo2.getMetadataValue(metadataName);
  62. if (value1 == null)
  63. return value2 == null ? 0 : 1;
  64. else if (value2 == null)
  65. return -1;
  66. if(sortMethod.equals(MacroConstants.SORT_ISTRING))
  67. return (isAscending() ? 1 : -1) * value1.compareValueAsIStringTo(value2);
  68. if(sortMethod.equals(MacroConstants.SORT_STRING))
  69. return (isAscending() ? 1 : -1) * value1.compareValueAsStringTo(value2);
  70. if(sortMethod.equals(MacroConstants.SORT_NUMBER))
  71. return (isAscending() ? 1 : -1) * value1.compareValueAsNumberTo(value2);
  72. if(sortMethod.equals(MacroConstants.SORT_DATE))
  73. return (isAscending() ? 1 : -1) * value1.compareTo(value2);
  74. // Default parsing and comparison
  75. int result = value1.compareTo(value2);
  76. return isAscending() ? result : -result;
  77. }
  78. };
  79. }
  80. /**
  81. * Returns a comparator based on an array of MetadataSortOrders.
  82. * @param sortOrders An array of sort orders in order of priority
  83. * @param defaultColumn the default column to sort by, if all else fails
  84. * @return A comparator that can sort a collection of ContentEntityObjects
  85. */
  86. @SuppressWarnings("unchecked")
  87. public static Comparator<MetadataContent> getComparator(MetadataSortOrder[] sortOrders, String defaultColumn) {
  88. List<Comparator<MetadataContent>> comparators = new ArrayList<Comparator<MetadataContent>>();
  89. if (sortOrders != null) {
  90. for (int i=0; i < sortOrders.length; i++) {
  91. MetadataSortOrder sortOrder = sortOrders[i];
  92. comparators.add(sortOrder.getComparator());
  93. }
  94. }
  95. // If all else fails then sort by title
  96. if (defaultColumn != null)
  97. comparators.add(new MetadataSortOrder(defaultColumn, true, MacroConstants.SORT_DEFAULT).getComparator());
  98. return new ComparatorChain(comparators);
  99. }
  100. /**
  101. * Turns a comma-separated list of sort orders into an array of {@link MetadataSortOrder}s.
  102. * e.g. the string "Date desc, Title" will return two sort orders
  103. *
  104. * @param commaSeparatedSorts
  105. * @return
  106. * @throws MacroException
  107. */
  108. public static MetadataSortOrder[] getMetadataSortOrders(String commaSeparatedSorts) throws MacroException {
  109. commaSeparatedSorts = commaSeparatedSorts.trim();
  110. if (commaSeparatedSorts == null || commaSeparatedSorts.length() == 0)
  111. return null;
  112. String[] sortOrderStrings = commaSeparatedSorts.split(",");
  113. int sortOrderCount = sortOrderStrings.length;
  114. MetadataSortOrder[] sortOrders = new MetadataSortOrder[sortOrderCount];
  115. for (int i=0; i < sortOrderCount; i++) {
  116. String sortOrder = sortOrderStrings[i].trim();
  117. String sortMethod = MacroConstants.SORT_DEFAULT;
  118. if (sortOrder.length() == 0)
  119. throw new MacroException("Missing metadata name for sort value \"" + commaSeparatedSorts + "\"");
  120. if(sortOrder.contains(MacroConstants.SORT_DATE))
  121. sortMethod = MacroConstants.SORT_DATE;
  122. else if(sortOrder.contains(MacroConstants.SORT_NUMBER))
  123. sortMethod = MacroConstants.SORT_NUMBER;
  124. else if (sortOrder.contains(MacroConstants.SORT_STRING))
  125. sortMethod = MacroConstants.SORT_STRING;
  126. else if (sortOrder.contains(MacroConstants.SORT_ISTRING))
  127. sortMethod = MacroConstants.SORT_ISTRING;
  128. sortOrder = sortOrder.replace(sortMethod, "");
  129. int lastSpaceIndex = sortOrder.lastIndexOf(' ');
  130. String metadataName = sortOrder;
  131. boolean ascending = true;
  132. if (lastSpaceIndex >= 0) {
  133. String lastWord = sortOrder.substring(lastSpaceIndex + 1).toLowerCase();
  134. ascending = !lastWord.startsWith("desc");
  135. if (lastWord.startsWith("asc") || lastWord.startsWith("desc"))
  136. metadataName = sortOrder.substring(0, lastSpaceIndex);
  137. }
  138. sortOrders[i] = new MetadataSortOrder(metadataName, ascending, sortMethod);
  139. }
  140. return sortOrders;
  141. }
  142. }