1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.templatingkit.util;
35
36
37
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.jcr.util.PropertyUtil;
40
41 import java.util.Calendar;
42 import java.util.Collections;
43 import java.util.Comparator;
44 import java.util.List;
45
46 import javax.jcr.Node;
47 import javax.jcr.RepositoryException;
48
49 import org.apache.commons.collections.CollectionUtils;
50 import org.apache.commons.collections.Predicate;
51 import org.apache.commons.lang.StringUtils;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55
56
57
58
59
60
61
62 public class STKDateContentUtil {
63
64 public static final Object INSTANCE = new STKDateContentUtil();
65
66 public static final String ASCENDING = "ascending";
67 public static final String DESCENDING = "descending";
68 private static final String DEFAULT_DATE_PROPERTY_NAME = "date";
69
70 private static final Logger log = LoggerFactory.getLogger(STKDateContentUtil.class);
71
72 public static void filterDateContentList(List<Node> itemsList, final Calendar minDate, final Calendar maxDate) {
73 filterDateContentList(itemsList, minDate, maxDate, DEFAULT_DATE_PROPERTY_NAME);
74 }
75
76 public static void filterDateContentList(List<Node> itemsList, final Calendar minDate, final Calendar maxDate, final String datePropertyName) {
77 filterDateContentList(itemsList, minDate, maxDate, datePropertyName, false);
78 }
79
80
81
82
83
84
85
86
87
88
89 public static void filterDateContentList(List<Node> itemsList, final Calendar minDate, final Calendar maxDate, final String datePropertyName, final boolean useCreationDate) {
90 CollectionUtils.filter(itemsList, new Predicate() {
91 @Override
92 public boolean evaluate(Object object) {
93 Node node = (Node) object;
94 Calendar date = resolveDate(node, datePropertyName, useCreationDate, Calendar.getInstance());
95
96 if (date.getTimeInMillis() == minDate.getTimeInMillis()) {
97 date.add(Calendar.SECOND, 1);
98 }
99 return date.after(minDate) && date.before(maxDate);
100 }
101 });
102 }
103
104 public static void sortDateContentList(final List<Node> itemsList, final String sortDirection) {
105 sortDateContentList(itemsList, sortDirection, DEFAULT_DATE_PROPERTY_NAME);
106 }
107
108 public static void sortDateContentList(final List<Node> itemsList, final String sortDirection, final String datePropertyName) {
109 Calendar veryOld = Calendar.getInstance();
110 veryOld.setTimeInMillis(0);
111 sortDateContentList(itemsList, sortDirection, datePropertyName, veryOld);
112 }
113
114 public static void sortDateContentList(final List<Node> itemsList, final String sortDirection, final String datePropertyName, final Calendar defaultDate) {
115 sortDateContentList(itemsList, sortDirection, datePropertyName, false, defaultDate);
116 }
117
118
119
120
121
122
123
124
125
126
127 public static void sortDateContentList(final List<Node> itemsList, final String sortDirection, final String datePropertyName, final boolean useCreationDate, final Calendar defaultDate) {
128 Collections.sort(itemsList, new Comparator<Node>(){
129 @Override
130 public int compare(Node c1, Node c2) {
131 Calendar date1 = resolveDate(c1, datePropertyName, useCreationDate, defaultDate);
132 Calendar date2 = resolveDate(c2, datePropertyName, useCreationDate, defaultDate);
133 if(StringUtils.equals(sortDirection, ASCENDING)){
134 return date2.compareTo(date1);
135 }
136 return date1.compareTo(date2);
137 }
138 });
139 }
140
141 private static Calendar resolveDate(Node node, String name, boolean useCreationDate, Calendar defaultValue) {
142 Calendar date = PropertyUtil.getDate(node, name);
143 if (date == null) {
144 if (useCreationDate) {
145 try {
146 date = NodeTypes.Created.getCreated(node);
147 if (date != null) {
148 PropertyUtil.setProperty(node, name, date);
149 }
150 } catch (RepositoryException e) {
151 log.warn("Can't set property [" + name + "] for node [" + node + "]");
152 }
153 }
154 }
155 return date != null ? date : defaultValue;
156 }
157
158 }