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.rest.delivery.jcr.i18n;
35
36 import info.magnolia.cms.i18n.I18nContentSupport;
37 import info.magnolia.i18nsystem.util.LocaleUtils;
38 import info.magnolia.jcr.decoration.ContentDecoratorNodeWrapper;
39 import info.magnolia.rest.delivery.jcr.decorator.AdditionNodeWrapper;
40 import info.magnolia.rest.delivery.jcr.decorator.PlaceholderProperty;
41
42 import java.util.List;
43 import java.util.Locale;
44 import java.util.stream.Collectors;
45
46 import javax.jcr.Item;
47 import javax.jcr.Node;
48 import javax.jcr.NodeIterator;
49 import javax.jcr.Property;
50 import javax.jcr.PropertyIterator;
51 import javax.jcr.RepositoryException;
52
53 import org.apache.commons.lang3.StringUtils;
54 import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
55 import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
56
57 import com.google.common.collect.Lists;
58
59
60
61
62
63 public class I18nDeliveryNodeWrapper extends ContentDecoratorNodeWrapper {
64 private I18nContentSupport i18nSupport;
65
66 public I18nDeliveryNodeWrapper(Node wrapped, I18nContentSupport i18nSupport) {
67 super(wrapped, new I18nDeliveryContentDecorator(i18nSupport));
68 this.i18nSupport = i18nSupport;
69 }
70
71 @Override
72 public boolean hasProperty(String relPath) throws RepositoryException {
73 return i18nSupport.hasProperty(getWrappedNode(), relPath);
74 }
75
76 @Override
77 public Property getProperty(String relPath) throws RepositoryException {
78 return wrapProperty(i18nSupport.getProperty(getWrappedNode(), relPath));
79 }
80
81 @Override
82 public Node getNode(String relPath) throws RepositoryException {
83 return wrapNode(i18nSupport.getNode(getWrappedNode(), relPath));
84 }
85
86 @Override
87 public PropertyIterator getProperties() throws RepositoryException {
88 List<Property> filtered = Lists.newArrayList(super.getProperties());
89 List<Property> properties = filtered.stream()
90 .filter(property -> !containsLocaleInName(property))
91 .map(matchedProperty -> {
92 try {
93 return new PlaceholderProperty(i18nSupport.getProperty(getWrappedNode(), matchedProperty.getName()), getNameWithoutLocale(matchedProperty.getName()));
94 } catch (RepositoryException e) {
95 return matchedProperty;
96 }
97 })
98 .collect(Collectors.toList());
99 return new PropertyIteratorAdapter(properties);
100 }
101
102 @Override
103 public NodeIterator getNodes() throws RepositoryException {
104 List<Node> filtered = Lists.newArrayList(super.getNodes());
105 List<Node> nodes = filtered.stream()
106 .filter(node -> !containsLocaleInName(node))
107 .map(matchedNode -> {
108 try {
109 return new AdditionNodeWrapper(i18nSupport.getNode(getWrappedNode(), matchedNode.getName()), getNameWithoutLocale(matchedNode.getName()));
110 } catch (RepositoryException e) {
111 return matchedNode;
112 }
113 })
114 .collect(Collectors.toList());
115
116 return wrapNodeIterator(new NodeIteratorAdapter(nodes));
117 }
118
119 private String getNameWithoutLocale(String name) {
120 Locale detectedLocale = LocaleUtils.parseFromFilename(name, null);
121 if (detectedLocale == null) {
122 return name;
123 }
124 name = StringUtils.removeEnd(name, "_" + detectedLocale.toString());
125 return name;
126 }
127
128 private boolean containsLocaleInName(Item item) {
129 try {
130 Locale validLocale = LocaleUtils.parseFromFilename(item.getName(), null);
131 return validLocale != null;
132 } catch (RepositoryException e) {
133
134 return false;
135 }
136 }
137 }