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