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.admininterface;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.version.ContentVersion;
38 import info.magnolia.cms.security.AccessDeniedException;
39 import java.util.Calendar;
40 import java.util.Comparator;
41 import java.util.Iterator;
42 import java.util.Set;
43 import java.util.TreeSet;
44
45 import javax.jcr.PathNotFoundException;
46 import javax.jcr.RepositoryException;
47 import javax.jcr.version.Version;
48
49 import org.apache.commons.collections.IteratorUtils;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53 public class VersionUtil {
54
55 private static final Logger log = LoggerFactory.getLogger(VersionUtil.class);
56
57 public static Set<Version> getSortedNotDeletedVersions(Content content) throws RepositoryException,
58 PathNotFoundException, AccessDeniedException {
59 final Iterator<Version> iterator = content.getAllVersions();
60 return getSortedVersions(iterator, content);
61 }
62
63 public static Set<Version> getSortedNotDeletedVersionsBefore(Content content, String versionName) throws RepositoryException {
64 final Iterator<Version> iterator = IteratorUtils.arrayIterator(content.getVersionedContent(versionName).getPredecessors());
65 return getSortedVersions(iterator, content);
66 }
67
68 private static Set<Version> getSortedVersions(Iterator<Version> iterator, Content versionBase) throws RepositoryException {
69 Set<Version> allVersions = new TreeSet<Version>(new Comparator<Version>() {
70 public int compare(Version o1, Version o2) {
71
72 Calendar c1, c2;
73 try {
74 c1 = o1.getCreated();
75 } catch (RepositoryException e) {
76 log.error(e.getMessage(), e);
77 return 1;
78 }
79 try {
80 c2 = o2.getCreated();
81 } catch (RepositoryException e) {
82 log.error(e.getMessage(), e);
83 return -1;
84 }
85
86
87 return c2.before(c1) ? -1 : c2.after(c1) ? 1 : 0;
88 }
89 });
90
91 if (iterator == null) {
92 return allVersions;
93 }
94
95 while (iterator.hasNext()) {
96 Version version = iterator.next();
97 ContentVersion versionedContent = versionBase.getVersionedContent(version);
98 if (versionedContent.hasContent("MetaData") && versionedContent.getContent("MetaData").hasNodeData("mgnl:template") && "mgnlDeleted".equals(versionedContent.getContent("MetaData").getNodeData("mgnl:template").getString())) {
99
100 log.debug("Found multiple deletion attempts for {}", versionedContent.getHandle());
101 } else {
102 allVersions.add(version);
103 }
104 }
105
106 return allVersions;
107 }
108
109 }