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.pages.app.action;
35
36 import info.magnolia.cms.core.version.VersionManager;
37 import info.magnolia.event.EventBus;
38 import info.magnolia.i18nsystem.SimpleTranslator;
39 import info.magnolia.ui.api.action.AbstractAction;
40 import info.magnolia.ui.api.action.ActionExecutionException;
41 import info.magnolia.ui.api.app.SubAppContext;
42 import info.magnolia.ui.api.event.AdmincentralEventBus;
43 import info.magnolia.ui.api.event.ContentChangedEvent;
44 import info.magnolia.ui.api.location.LocationController;
45 import info.magnolia.ui.contentapp.detail.DetailLocation;
46 import info.magnolia.ui.contentapp.detail.DetailView;
47 import info.magnolia.ui.vaadin.integration.jcr.AbstractJcrNodeAdapter;
48 import info.magnolia.ui.vaadin.integration.jcr.JcrItemUtil;
49 import info.magnolia.ui.vaadin.overlay.MessageStyleTypeEnum;
50
51 import javax.inject.Inject;
52 import javax.inject.Named;
53 import javax.jcr.Node;
54 import javax.jcr.RepositoryException;
55 import javax.jcr.version.Version;
56 import javax.jcr.version.VersionIterator;
57
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60
61
62
63
64 public class RestorePreviousVersionAction extends AbstractAction<RestorePreviousVersionActionDefinition> {
65 private final Logger log = LoggerFactory.getLogger(getClass());
66 private final AbstractJcrNodeAdapter nodeItemToEdit;
67 private final LocationController locationController;
68 private final VersionManager versionManager;
69 private final SubAppContext subAppContext;
70 private final SimpleTranslator i18n;
71 private EventBus eventBus;
72
73
74
75
76 public RestorePreviousVersionAction(RestorePreviousVersionActionDefinition definition, AbstractJcrNodeAdapter nodeItemToEdit, LocationController locationController,
77 VersionManager versionManager, SubAppContext subAppContext, SimpleTranslator i18n) {
78 this(definition, nodeItemToEdit, locationController, versionManager, subAppContext, i18n, null);
79 }
80
81 @Inject
82 public RestorePreviousVersionAction(RestorePreviousVersionActionDefinition definition, AbstractJcrNodeAdapter nodeItemToEdit, LocationController locationController,
83 VersionManager versionManager, SubAppContext subAppContext, SimpleTranslator i18n, @Named(AdmincentralEventBus.NAME) final EventBus eventBus) {
84 super(definition);
85 this.nodeItemToEdit = nodeItemToEdit;
86 this.locationController = locationController;
87 this.versionManager = versionManager;
88 this.subAppContext = subAppContext;
89 this.i18n = i18n;
90 this.eventBus = eventBus;
91 }
92
93 @Override
94 public void execute() throws ActionExecutionException {
95 try {
96 final String path = nodeItemToEdit.getJcrItem().getPath();
97
98
99 Version version = getPreviousVersion();
100
101 if (version == null) {
102
103 subAppContext.openNotification(MessageStyleTypeEnum.ERROR, true, i18n.translate("pages.restorePreviousVersionAction.noVersion.actionCanceled.message"));
104 return;
105 }
106
107 Node node = nodeItemToEdit.getJcrItem();
108 versionManager.restore(node, version, true);
109
110 if (this.getDefinition().isShowPreview()) {
111 DetailLocation location = new DetailLocation("pages", "detail", DetailView.ViewType.EDIT, path, "");
112 locationController.goTo(location);
113 } else if (eventBus != null) {
114 Object itemId = JcrItemUtil.getItemId(node);
115 eventBus.fireEvent(new ContentChangedEvent(itemId, true));
116 }
117
118 } catch (RepositoryException e) {
119 subAppContext.openNotification(MessageStyleTypeEnum.ERROR, true, i18n.translate("pages.restorePreviousVersionAction.repositoryException.actionCanceled.message"));
120 throw new ActionExecutionException("Could not execute RestorePreviousVersionAction: ", e);
121 }
122 }
123
124
125
126
127 private Version getPreviousVersion() throws RepositoryException {
128 Version previousVersion = null;
129 VersionIterator versionIterator = versionManager.getAllVersions(nodeItemToEdit.getJcrItem());
130 if (versionIterator == null) {
131 return previousVersion;
132 }
133
134 while (versionIterator.hasNext()) {
135 previousVersion = versionIterator.nextVersion();
136 }
137
138 return previousVersion;
139 }
140 }