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.module.googlesitemap.config;
35
36 import info.magnolia.cms.beans.config.RegexpVirtualURIMapping;
37 import info.magnolia.cms.util.ObservationUtil;
38 import info.magnolia.context.SystemContext;
39 import info.magnolia.jcr.predicate.AbstractPredicate;
40 import info.magnolia.jcr.util.NodeUtil;
41 import info.magnolia.module.googlesitemap.GoogleSiteMapConfiguration;
42 import info.magnolia.module.googlesitemap.SiteMapNodeTypes;
43
44 import java.util.HashMap;
45 import java.util.Iterator;
46 import java.util.Map;
47
48 import javax.inject.Inject;
49 import javax.jcr.Node;
50 import javax.jcr.RepositoryException;
51 import javax.jcr.observation.EventIterator;
52 import javax.jcr.observation.EventListener;
53
54 import org.apache.commons.lang3.StringUtils;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58
59
60
61
62
63
64
65 @Deprecated
66 public class SiteMapVirtualUriMapping extends RegexpVirtualURIMapping {
67
68 public static final String XML_EXTENSION = ".xml";
69
70 private Logger log = LoggerFactory.getLogger(getClass());
71
72 private SystemContext context;
73
74 private Map<String, String> siteMapUrlMappings = new HashMap<String, String>();
75
76 private String prefix;
77
78 private AbstractPredicate<Node> siteMapNodePredicate = new AbstractPredicate<Node>() {
79 @Override
80 public boolean evaluateTyped(Node node) {
81 try {
82 return NodeUtil.isNodeType(node, SiteMapNodeTypes.SiteMap.NAME);
83 } catch (RepositoryException e) {
84 return false;
85 }
86 }
87 };
88
89 @Inject
90 public SiteMapVirtualUriMapping(SystemContext context) {
91 this.context = context;
92 ObservationUtil.registerChangeListener(GoogleSiteMapConfiguration.WORKSPACE, "/", true, new EventListener() {
93 @Override
94 public void onEvent(EventIterator events) {
95 reloadSiteMapNames();
96 }
97 });
98 reloadSiteMapNames();
99 }
100
101 private void reloadSiteMapNames() {
102 try {
103 siteMapUrlMappings.clear();
104 Node root = context.getJCRSession(GoogleSiteMapConfiguration.WORKSPACE).getRootNode();
105 final Iterator<Node> it = NodeUtil.collectAllChildren(root, siteMapNodePredicate).iterator();
106 while (it.hasNext()) {
107 Node node = it.next();
108 if (SiteMapNodeTypes.SiteMap.getUrl(node) != null) {
109 siteMapUrlMappings.put(SiteMapNodeTypes.SiteMap.getUrl(node), node.getPath() + XML_EXTENSION);
110 }
111 }
112 } catch (RepositoryException e) {
113 log.warn("Failed to collect sitemap names: ", e.getMessage());
114 }
115 }
116
117 @Override
118 public MappingResult mapURI(String uri) {
119 if (siteMapUrlMappings.containsKey(uri)) {
120 MappingResult result = new MappingResult();
121 result.setLevel(uri.length());
122 result.setToURI(prefix + siteMapUrlMappings.get(uri));
123 return result;
124 }
125 return null;
126 }
127
128 @Override
129 public boolean isValid() {
130 return StringUtils.isNotEmpty(prefix);
131 }
132
133 public void setPrefix(String prefix) {
134 this.prefix = prefix;
135 }
136 }