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