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