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