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.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57
58
59
60
61 public class SiteMapVirtualUriMapping extends RegexpVirtualURIMapping {
62
63 public static final String XML_EXTENSION = ".xml";
64
65 private Logger log = LoggerFactory.getLogger(getClass());
66
67 private SystemContext context;
68
69 private Map<String, String> siteMapUrlMappings = new HashMap<String, String>();
70
71 private String prefix;
72
73 private AbstractPredicate<Node> siteMapNodePredicate = new AbstractPredicate<Node>() {
74 @Override
75 public boolean evaluateTyped(Node node) {
76 try {
77 return NodeUtil.isNodeType(node, SiteMapNodeTypes.SiteMap.NAME);
78 } catch (RepositoryException e) {
79 return false;
80 }
81 }
82 };
83
84 @Inject
85 public SiteMapVirtualUriMapping(SystemContext context) {
86 this.context = context;
87 ObservationUtil.registerChangeListener(GoogleSiteMapConfiguration.WORKSPACE, "/", true, new EventListener() {
88 @Override
89 public void onEvent(EventIterator events) {
90 reloadSiteMapNames();
91 }
92 });
93 reloadSiteMapNames();
94 }
95
96 private void reloadSiteMapNames() {
97 try {
98 siteMapUrlMappings.clear();
99 Node root = context.getJCRSession(GoogleSiteMapConfiguration.WORKSPACE).getRootNode();
100 final Iterator<Node> it = NodeUtil.collectAllChildren(root, siteMapNodePredicate).iterator();
101 while (it.hasNext()) {
102 Node node = it.next();
103 if (SiteMapNodeTypes.SiteMap.getUrl(node) != null) {
104 siteMapUrlMappings.put(SiteMapNodeTypes.SiteMap.getUrl(node), node.getPath() + XML_EXTENSION);
105 }
106 }
107 } catch (RepositoryException e) {
108 log.warn("Failed to collect sitemap names: ", e.getMessage());
109 }
110 }
111
112 @Override
113 public MappingResult mapURI(String uri) {
114 if (siteMapUrlMappings.containsKey(uri)) {
115 MappingResult result = new MappingResult();
116 result.setLevel(uri.length());
117 result.setToURI(prefix + siteMapUrlMappings.get(uri));
118 return result;
119 }
120 return null;
121 }
122
123 public void setPrefix(String prefix) {
124 this.prefix = prefix;
125 }
126 }