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.column.jcr;
35
36 import info.magnolia.i18nsystem.SimpleTranslator;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.ui.contentapp.configuration.column.ConfiguredColumnDefinition;
39
40 import java.security.AccessControlException;
41
42 import javax.inject.Inject;
43 import javax.jcr.Item;
44 import javax.jcr.Node;
45 import javax.jcr.RepositoryException;
46 import javax.jcr.Session;
47
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 import com.vaadin.data.ValueProvider;
52 import com.vaadin.ui.renderers.AbstractRenderer;
53 import com.vaadin.ui.renderers.HtmlRenderer;
54
55 import lombok.Getter;
56 import lombok.Setter;
57
58
59
60
61 @Getter
62 @Setter
63 public class JcrStatusColumnDefinition extends ConfiguredColumnDefinition {
64
65 private static final Logger log = LoggerFactory.getLogger(JcrStatusColumnDefinition.class);
66
67
68 private boolean activation = true;
69
70 private boolean permissions = true;
71
72 @Override
73 public Class<? extends AbstractRenderer> getRenderer() {
74 return HtmlRenderer.class;
75 }
76
77 @Override
78 public Class<? extends ValueProvider> getValueProvider() {
79 return StatusValueProvider.class;
80 }
81
82
83
84
85 public static class StatusValueProvider implements ValueProvider<Item, String> {
86
87 private final SimpleTranslator i18n;
88 private final JcrStatusColumnDefinition definition;
89
90 @Inject
91 public StatusValueProvider(SimpleTranslator simpleTranslator, JcrStatusColumnDefinition columnDefinition) {
92 this.i18n = simpleTranslator;
93 this.definition = columnDefinition;
94 }
95
96 @Override
97 public String apply(Item node) {
98 if (!node.isNode()) {
99 return null;
100 }
101 String activationStatus = "";
102 ActivationStatus activationType;
103 String activationStatusMessage;
104 String permissionStatus = "";
105
106
107 if (definition.isActivation()) {
108 Integer status;
109 try {
110 status = NodeTypes.Activatable.getActivationStatus((Node) node);
111 } catch (RepositoryException e) {
112 status = NodeTypes.Activatable.ACTIVATION_STATUS_NOT_ACTIVATED;
113 }
114
115 switch (status) {
116 case NodeTypes.Activatable.ACTIVATION_STATUS_MODIFIED:
117 activationType = ActivationStatus.MODIFIED;
118 activationStatusMessage = i18n.translate("activation-status.columns.modified");
119 break;
120 case NodeTypes.Activatable.ACTIVATION_STATUS_ACTIVATED:
121 activationType = ActivationStatus.ACTIVATED;
122 activationStatusMessage = i18n.translate("activation-status.columns.activated");
123 break;
124 default:
125 activationType = ActivationStatus.NOT_ACTIVATED;
126 activationStatusMessage = i18n.translate("activation-status.columns.not-activated");
127 }
128 activationStatus = "<span class=\"" + activationType.getStyleName() + "\" title=\"" + activationStatusMessage + "\"></span>";
129 activationStatus = activationStatus + "<span class=\"hidden-for-aria\">" + activationStatusMessage + "</span>";
130 }
131
132
133 if (definition.isPermissions()) {
134 try {
135 node.getSession().checkPermission(node.getPath(), Session.ACTION_ADD_NODE + "," + Session.ACTION_REMOVE + "," + Session.ACTION_SET_PROPERTY);
136 } catch (AccessControlException e) {
137 permissionStatus = "<span class=\"icon-read-only\"></span>";
138 } catch (RepositoryException e) {
139 log.debug("Failed to resolve permissions status of the node [{}], yielding empty value", node, e);
140 return "";
141 }
142 }
143 return activationStatus + permissionStatus;
144 }
145 }
146
147
148
149
150 public enum ActivationStatus {
151
152 ACTIVATED("icon-status-green", "color-green"),
153 MODIFIED("icon-status-orange", "color-yellow"),
154 NOT_ACTIVATED("icon-status-red", "color-red");
155
156 private final String baseStyleName = "activation-status";
157 private String icon;
158 private String color;
159
160 ActivationStatus(String icon, String color) {
161 this.icon = icon;
162 this.color = color;
163 }
164
165 public String getStyleName() {
166 return baseStyleName + " " + icon + " " + color;
167 }
168
169 public String getIcon() {
170 return icon;
171 }
172
173 public String getColor() {
174 return color;
175 }
176 }
177 }