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.commands.impl;
35
36 import info.magnolia.cms.core.version.VersionManager;
37 import info.magnolia.context.Context;
38 import info.magnolia.jcr.predicate.NodeTypePredicate;
39 import info.magnolia.jcr.util.NodeUtil;
40
41 import javax.inject.Inject;
42 import javax.jcr.Node;
43 import javax.jcr.RepositoryException;
44 import javax.jcr.version.Version;
45 import javax.jcr.version.VersionIterator;
46
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51
52
53 public class RestorePreviousVersionCommand extends BaseRepositoryCommand {
54 private static final Logger log = LoggerFactory.getLogger(RestorePreviousVersionCommand.class);
55
56 private VersionManager versionManager;
57
58 private boolean parentNodeTypeOnly = false;
59
60 @Inject
61 public RestorePreviousVersionCommand(VersionManager versionManager) {
62 this.versionManager = versionManager;
63 }
64
65 @Override
66 public boolean execute(Context context) throws Exception {
67
68 final Node node = getJCRNode(context);
69
70 parentNodeTypeOnly = (Boolean) (context.containsKey("parentNodeTypeOnly") ? context.get("parentNodeTypeOnly") : false);
71
72 restore(node);
73
74 return true;
75 }
76
77 private void restore(Node node) throws RepositoryException {
78 String nodeType = node.getPrimaryNodeType().getName();
79
80 log.debug("Restoring previous version of node at {} of type {}", node.getPath(), nodeType);
81
82
83 Version version = getPreviousVersion(node);
84
85 if (version == null) {
86 throw new RepositoryException("No previous version found for node at " + node.getPath());
87 }
88
89
90 versionManager.restore(node, version, true);
91
92 restoreAllChildren(node, nodeType);
93 }
94
95
96
97
98
99
100 protected void restoreAllChildren(Node node, String parentNodeType) throws RepositoryException {
101
102 Iterable<Node> children = isParentNodeTypeOnly() ? NodeUtil.collectAllChildren(node, new NodeTypePredicate(parentNodeType)) : NodeUtil.collectAllChildren(node);
103
104 for (Node child : children) {
105 Version childVersion = getPreviousVersion(child);
106 if (childVersion == null) {
107 log.debug("No previous version found for subnode {}. Skipping restore...", child.getPath());
108 continue;
109 }
110 versionManager.restore(child, childVersion, true);
111 }
112 }
113
114
115
116
117 private Version getPreviousVersion(Node node) throws RepositoryException {
118 Version previousVersion = null;
119 VersionIterator versionIterator = versionManager.getAllVersions(node);
120
121 while (versionIterator.hasNext()) {
122 previousVersion = versionIterator.nextVersion();
123 }
124
125 return previousVersion;
126 }
127
128
129
130
131 public boolean isParentNodeTypeOnly() {
132 return parentNodeTypeOnly;
133 }
134 }