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.column;
35
36 import info.magnolia.cms.beans.config.URI2RepositoryManager;
37 import info.magnolia.cms.beans.config.VirtualURIManager;
38 import info.magnolia.i18nsystem.SimpleTranslator;
39 import info.magnolia.objectfactory.ComponentProvider;
40 import info.magnolia.repository.RepositoryConstants;
41 import info.magnolia.ui.workbench.column.AbstractColumnFormatter;
42 import info.magnolia.ui.workbench.column.StatusColumnFormatter.ActivationStatus;
43 import info.magnolia.ui.workbench.column.definition.ColumnFormatter;
44 import info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition;
45 import info.magnolia.virtualuri.VirtualUriRegistry;
46
47 import java.net.URI;
48 import java.util.Optional;
49
50 import javax.inject.Inject;
51 import javax.jcr.Item;
52 import javax.jcr.Node;
53 import javax.jcr.RepositoryException;
54
55 import org.apache.commons.lang3.StringUtils;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59 import com.vaadin.v7.ui.Table;
60
61
62
63
64 public class PageNameColumnFormatter extends AbstractColumnFormatter<PropertyColumnDefinition> {
65
66 private static Logger log = LoggerFactory.getLogger(PageNameColumnFormatter.class);
67
68 private ColumnFormatter innerFormatter;
69
70 private final URI2RepositoryManager uriManager;
71 private final VirtualUriRegistry virtualUriRegistry;
72 private final Definition definition;
73 private final SimpleTranslator i18n;
74
75 @Inject
76 public PageNameColumnFormatter(Definition definition, SimpleTranslator i18n, URI2RepositoryManager uriManager, ComponentProvider componentProvider, VirtualUriRegistry virtualUriRegistry) {
77 super(definition);
78 this.i18n = i18n;
79 this.definition = definition;
80 this.uriManager = uriManager;
81 this.virtualUriRegistry = virtualUriRegistry;
82 if (definition.getInnerFormatter() != null) {
83 this.innerFormatter = componentProvider.newInstance(definition.getInnerFormatter(), definition, i18n);
84 }
85 }
86
87
88
89
90 @Deprecated
91 public PageNameColumnFormatter(Definition definition, SimpleTranslator i18n, URI2RepositoryManager uriManager, VirtualURIManager vuriManager, ComponentProvider componentProvider) {
92 this(definition, i18n, uriManager, componentProvider, componentProvider.getComponent(VirtualUriRegistry.class));
93 }
94
95 @Override
96 public Object generateCell(Table source, Object itemId, Object columnId) {
97 String basicStatus = null;
98 final Item jcrItem = getJcrItem(source, itemId);
99 if (innerFormatter != null) {
100 basicStatus = (String) innerFormatter.generateCell(source, itemId, columnId);
101 } else if (jcrItem != null) {
102 try {
103 basicStatus = jcrItem.getName();
104 } catch (RepositoryException re) {
105 log.debug("Failed to retrieve path for item '{}':", jcrItem.toString(), re);
106 }
107 }
108
109
110 String conflictStatus = null;
111 try {
112 if (jcrItem != null && jcrItem.isNode()) {
113 Node node = (Node) jcrItem;
114 String nodePath = node.getPath();
115 if (!RepositoryConstants.WEBSITE.equals(uriManager.getRepository(nodePath))) {
116 String conflictStatusMessage = i18n.translate("pages.browser.status-column.uriConflictDetected");
117 conflictStatus = "<span class=\"conflict-status " + ActivationStatus.NOT_ACTIVATED.getBaseStyleName()
118 + " icon-error color-red\" title=\"" + conflictStatusMessage + "\"></span>";
119 }
120 if (definition.isReportVirtualURIConflicts()) {
121 boolean conflicting = virtualUriRegistry.getAllDefinitions().stream()
122 .map(uriMapping -> uriMapping.mapUri(URI.create(nodePath)))
123 .anyMatch(Optional::isPresent);
124 if (conflicting) {
125 String conflictStatusMessage = i18n.translate("pages.browser.status-column.virtualUriConflictDetected");
126 conflictStatus = "<span class=\"conflict-status " + ActivationStatus.MODIFIED.getBaseStyleName()
127 + " icon-warning color-yellow\" title=\"" + conflictStatusMessage + "\"></span>";
128 }
129 }
130 }
131 } catch (RepositoryException e) {
132 log.debug("Could not access the JCR item for the following node identifier " + itemId, e);
133 }
134 return StringUtils.defaultIfEmpty((basicStatus == null ? "" : basicStatus) + (conflictStatus == null ? "" : conflictStatus), null);
135 }
136
137
138
139
140 public static class Definition extends PropertyColumnDefinition {
141 private boolean isVirtualURICheckEnabled;
142 private Class<? extends ColumnFormatter> innerFormatter;
143
144 @Override
145 public void setFormatterClass(Class<? extends ColumnFormatter> formatterClass) {
146 this.innerFormatter = formatterClass;
147 }
148
149 public Class<? extends ColumnFormatter> getInnerFormatter() {
150 return innerFormatter;
151 }
152
153 @Override
154 public Class<? extends ColumnFormatter> getFormatterClass() {
155 return PageNameColumnFormatter.class;
156 }
157
158 public boolean isReportVirtualURIConflicts() {
159 return isVirtualURICheckEnabled;
160 }
161
162 public void setReportVirtualURIConflicts(boolean isVirtualURICheckEnabled) {
163 this.isVirtualURICheckEnabled = isVirtualURICheckEnabled;
164 }
165
166 }
167 }