1
22
23 package com.liferay.portal.util;
24
25 import com.liferay.portal.PortalException;
26 import com.liferay.portal.SystemException;
27 import com.liferay.portal.kernel.util.GetterUtil;
28 import com.liferay.portal.kernel.util.StringPool;
29 import com.liferay.portal.kernel.util.StringUtil;
30 import com.liferay.portal.kernel.util.UnicodeProperties;
31 import com.liferay.portal.kernel.util.Validator;
32 import com.liferay.portal.kernel.xml.Document;
33 import com.liferay.portal.kernel.xml.Element;
34 import com.liferay.portal.kernel.xml.SAXReaderUtil;
35 import com.liferay.portal.model.Layout;
36 import com.liferay.portal.service.LayoutLocalServiceUtil;
37 import com.liferay.portal.theme.ThemeDisplay;
38
39 import java.util.List;
40
41
46 public class SitemapUtil {
47
48 public static String getSitemap(
49 long groupId, boolean privateLayout, ThemeDisplay themeDisplay)
50 throws PortalException, SystemException {
51
52 Document doc = SAXReaderUtil.createDocument();
53
54 doc.setXMLEncoding(StringPool.UTF8);
55
56 Element root = doc.addElement(
57 "urlset", "http://www.google.com/schemas/sitemap/0.84");
58
59 List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
60 groupId, privateLayout);
61
62 _visitLayouts(root, layouts, themeDisplay);
63
64 return doc.asXML();
65 }
66
67 public static String encodeXML(String input) {
68 return StringUtil.replace(
69 input,
70 new String[] {"&", "<", ">", "'", "\""},
71 new String[] {"&", "<", ">", "'", """});
72 }
73
74 private static void _visitLayouts(
75 Element element, List<Layout> layouts, ThemeDisplay themeDisplay)
76 throws PortalException, SystemException {
77
78 for (Layout layout : layouts) {
79 UnicodeProperties props = layout.getTypeSettingsProperties();
80
81 if (PortalUtil.isLayoutSitemapable(layout) && !layout.isHidden() &&
82 GetterUtil.getBoolean(
83 props.getProperty("sitemap-include"), true)) {
84
85 Element url = element.addElement("url");
86
87 String layoutFullURL = PortalUtil.getLayoutFullURL(
88 layout, themeDisplay);
89
90 url.addElement("loc").addText(encodeXML(layoutFullURL));
91
92 String changefreq = props.getProperty("sitemap-changefreq");
93
94 if (Validator.isNotNull(changefreq)) {
95 url.addElement("changefreq").addText(changefreq);
96 }
97
98 String priority = props.getProperty("sitemap-priority");
99
100 if (Validator.isNotNull(priority)) {
101 url.addElement("priority").addText(priority);
102 }
103
104 List<Layout> children = layout.getChildren();
105
106 _visitLayouts(element, children, themeDisplay);
107 }
108 }
109 }
110
111 }