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.ui.contentapp.browser.action;
35
36 import info.magnolia.event.EventBus;
37 import info.magnolia.ui.api.action.AbstractAction;
38 import info.magnolia.ui.api.action.ActionExecutionException;
39 import info.magnolia.ui.api.event.AdmincentralEventBus;
40 import info.magnolia.ui.api.event.ContentChangedEvent;
41 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
42 import info.magnolia.ui.vaadin.integration.jcr.AbstractJcrNodeAdapter;
43 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
44 import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyAdapter;
45 import info.magnolia.ui.vaadin.integration.jcr.JcrPropertyItemId;
46
47 import java.util.Set;
48
49 import javax.inject.Inject;
50 import javax.inject.Named;
51 import javax.jcr.Node;
52 import javax.jcr.RepositoryException;
53
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 import com.vaadin.v7.data.Item;
58 import com.vaadin.v7.data.Property;
59
60
61
62
63 public class SaveItemPropertyAction extends AbstractAction<SaveItemPropertyActionDefinition> {
64
65 private static final Logger log = LoggerFactory.getLogger(SaveItemPropertyAction.class);
66 private final EventBus eventBus;
67 private final ContentConnector contentConnector;
68 private final Object itemId;
69 private final Object propertyId;
70 private final Property<?> propertyDataSource;
71
72 @Inject
73 public SaveItemPropertyAction(SaveItemPropertyActionDefinition definition, @Named(AdmincentralEventBus.NAME) EventBus eventBus, ContentConnector contentConnector, Object... args) {
74 super(definition);
75 this.eventBus = eventBus;
76 this.contentConnector = contentConnector;
77 this.itemId = ((Set<Object>) args[0]).iterator().next();
78 this.propertyId = args[1];
79 this.propertyDataSource = (Property<?>) args[2];
80 }
81
82 @Override
83 public void execute() throws ActionExecutionException {
84
85 Item item = contentConnector.getItem(itemId);
86
87 if (!(item instanceof JcrItemAdapter)) {
88 return;
89 }
90
91 Property itemProperty = item.getItemProperty(propertyId);
92 itemProperty.setValue(propertyDataSource.getValue());
93
94
95 if (!((JcrItemAdapter) item).hasChangedProperties()) {
96 return;
97 }
98
99 if (item instanceof AbstractJcrNodeAdapter) {
100
101 AbstractJcrNodeAdapter nodeAdapter = (AbstractJcrNodeAdapter) item;
102 try {
103
104 Node node = nodeAdapter.applyChanges();
105 node.getSession().save();
106 } catch (RepositoryException e) {
107 log.error("Could not save changes to node", e);
108 }
109
110 } else if (item instanceof JcrPropertyAdapter) {
111
112 JcrPropertyAdapter propertyAdapter = (JcrPropertyAdapter) item;
113 try {
114
115 Node parent = propertyAdapter.getJcrItem().getParent();
116
117
118 propertyAdapter.applyChanges();
119 parent.getSession().save();
120
121
122 JcrPropertyItemId newItemId = propertyAdapter.getItemId();
123 eventBus.fireEvent(new ContentChangedEvent(newItemId));
124 } catch (RepositoryException e) {
125 log.error("Could not save changes to property", e);
126 }
127 }
128 }
129
130 }