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.service; |
35 |
|
|
36 |
|
import info.magnolia.cms.core.MetaData; |
37 |
|
import info.magnolia.cms.core.MgnlNodeType; |
38 |
|
import info.magnolia.cms.i18n.I18nContentSupport; |
39 |
|
import info.magnolia.cms.i18n.I18nContentSupportFactory; |
40 |
|
import info.magnolia.cms.util.ContentUtil; |
41 |
|
import info.magnolia.context.MgnlContext; |
42 |
|
import info.magnolia.jcr.util.MetaDataUtil; |
43 |
|
import info.magnolia.link.LinkUtil; |
44 |
|
import info.magnolia.module.googlesitemap.GoogleSiteMapConfiguration; |
45 |
|
import info.magnolia.module.googlesitemap.bean.SiteMapEntry; |
46 |
|
import info.magnolia.module.googlesitemap.service.query.QueryUtil; |
47 |
|
import info.magnolia.module.templatingkit.sites.Site; |
48 |
|
import info.magnolia.module.templatingkit.sites.SiteManager; |
49 |
|
import info.magnolia.repository.RepositoryConstants; |
50 |
|
|
51 |
|
import java.util.ArrayList; |
52 |
|
import java.util.Calendar; |
53 |
|
import java.util.List; |
54 |
|
import java.util.Locale; |
55 |
|
|
56 |
|
import javax.inject.Inject; |
57 |
|
import javax.inject.Singleton; |
58 |
|
import javax.jcr.Node; |
59 |
|
import javax.jcr.NodeIterator; |
60 |
|
import javax.jcr.RepositoryException; |
61 |
|
|
62 |
|
import org.apache.jackrabbit.commons.iterator.FilteringNodeIterator; |
63 |
|
import org.apache.jackrabbit.commons.predicate.NodeTypePredicate; |
64 |
|
import org.slf4j.Logger; |
65 |
|
import org.slf4j.LoggerFactory; |
66 |
|
|
67 |
|
|
68 |
|
|
69 |
|
|
70 |
|
|
71 |
|
|
72 |
|
|
73 |
|
|
74 |
|
@version |
75 |
|
|
76 |
|
|
77 |
|
@Singleton |
|
|
| 87.2% |
Uncovered Elements: 24 (188) |
Complexity: 51 |
Complexity Density: 0.45 |
|
78 |
|
public class SiteMapService { |
79 |
|
|
80 |
|
private static final Logger log = LoggerFactory.getLogger(SiteMapService.class); |
81 |
|
|
82 |
|
|
83 |
|
|
84 |
|
private SiteManager siteManager; |
85 |
|
private I18nContentSupport i18nSupport; |
86 |
|
private GoogleSiteMapConfiguration configuration; |
87 |
|
private QueryUtil queryUtil; |
88 |
|
|
89 |
|
|
90 |
|
|
91 |
|
private String lastMod = RepositoryConstants.NAMESPACE_PREFIX + ":" + MetaData.LAST_MODIFIED; |
92 |
|
private String creation = RepositoryConstants.NAMESPACE_PREFIX + ":" + MetaData.CREATION_DATE; |
93 |
|
|
94 |
|
|
95 |
|
|
96 |
|
|
97 |
|
@param |
98 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
99 |
24
|
@Inject... |
100 |
|
public SiteMapService(SiteManager siteManager, GoogleSiteMapConfiguration configuration, QueryUtil queryUtil) { |
101 |
24
|
this.siteManager = siteManager; |
102 |
24
|
this.configuration = configuration; |
103 |
24
|
this.queryUtil = queryUtil; |
104 |
24
|
i18nSupport = I18nContentSupportFactory.getI18nSupport(); |
105 |
|
} |
106 |
|
|
107 |
|
|
108 |
|
|
109 |
|
|
110 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (6) |
Complexity: 1 |
Complexity Density: 0.17 |
|
111 |
8
|
public List<SiteMapEntry> getSiteMapBeanForVirtualUri( boolean isForEdit) throws RepositoryException{... |
112 |
|
|
113 |
8
|
List<SiteMapEntry> res = new ArrayList<SiteMapEntry>(); |
114 |
8
|
NodeIterator nodeIterator = null; |
115 |
|
|
116 |
8
|
log.info("Requested virtualUri info's for EDIT "); |
117 |
|
|
118 |
8
|
nodeIterator = searchVirtualUriNodes(); |
119 |
8
|
feedVirtualUriMapBeans(res, nodeIterator, isForEdit); |
120 |
|
|
121 |
8
|
return res; |
122 |
|
} |
123 |
|
|
124 |
|
|
125 |
|
|
126 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
127 |
8
|
private NodeIterator searchVirtualUriNodes() {... |
128 |
8
|
NodeIterator nodes = null; |
129 |
|
|
130 |
8
|
String xpath = "//virtualURIMapping//element(*,"+MgnlNodeType.NT_CONTENTNODE+")"; |
131 |
8
|
nodes = queryUtil.query(RepositoryConstants.CONFIG, xpath, "xpath", MgnlNodeType.NT_CONTENTNODE); |
132 |
|
|
133 |
8
|
return nodes; |
134 |
|
} |
135 |
|
|
136 |
|
|
137 |
|
|
138 |
|
|
139 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (9) |
Complexity: 3 |
Complexity Density: 0.6 |
|
140 |
8
|
private void feedVirtualUriMapBeans(List<SiteMapEntry> siteMapBeans, NodeIterator nodes, boolean isForEdit) throws RepositoryException {... |
141 |
24
|
while(nodes.hasNext()) { |
142 |
|
|
143 |
16
|
Node child = nodes.nextNode(); |
144 |
16
|
if(hasToBePopulated(child, true, isForEdit, null)) { |
145 |
|
|
146 |
11
|
SiteMapEntry siteMapBean = populateBean(child, true, isForEdit , null, null); |
147 |
|
|
148 |
11
|
siteMapBeans.add(siteMapBean); |
149 |
|
} |
150 |
|
} |
151 |
|
} |
152 |
|
|
153 |
|
|
154 |
|
|
155 |
|
|
156 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (6) |
Complexity: 1 |
Complexity Density: 0.17 |
|
157 |
24
|
public List<SiteMapEntry> getSiteMapBeanForSite(Node rootNode, boolean isForEdit) throws RepositoryException{... |
158 |
|
|
159 |
24
|
List<SiteMapEntry> res = new ArrayList<SiteMapEntry>(); |
160 |
24
|
NodeIterator nodeIterator = null; |
161 |
|
|
162 |
24
|
log.info("Requested siteMap info's for EDIT based on the following root: "+rootNode.getPath()); |
163 |
|
|
164 |
24
|
nodeIterator = searchSiteChildNodes(rootNode); |
165 |
24
|
feedSiteMapBeans(res, nodeIterator, isForEdit, null); |
166 |
|
|
167 |
24
|
return res; |
168 |
|
} |
169 |
|
|
170 |
|
|
171 |
|
|
172 |
|
|
173 |
|
@throws |
174 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (4) |
Complexity: 1 |
Complexity Density: 0.25 |
|
175 |
53
|
private NodeIterator searchSiteChildNodes(Node root) throws RepositoryException {... |
176 |
53
|
NodeIterator nodes = null; |
177 |
|
|
178 |
53
|
NodeTypePredicate predicate = new NodeTypePredicate(MgnlNodeType.NT_CONTENT, true); |
179 |
53
|
nodes = new FilteringNodeIterator(root.getNodes(), predicate); |
180 |
|
|
181 |
53
|
return nodes; |
182 |
|
} |
183 |
|
|
184 |
|
|
185 |
|
|
186 |
|
|
187 |
|
|
|
|
| 76% |
Uncovered Elements: 12 (50) |
Complexity: 15 |
Complexity Density: 0.54 |
|
188 |
31
|
private void feedSiteMapBeans(List<SiteMapEntry> siteMapBeans, NodeIterator nodes, boolean isForEdit, Boolean inheritedParentDisplayColor) throws RepositoryException {... |
189 |
|
|
190 |
71
|
while(nodes.hasNext()) { |
191 |
|
|
192 |
40
|
Node child = nodes.nextNode(); |
193 |
40
|
Site site = siteManager.getAssignedSite(child); |
194 |
|
|
195 |
40
|
if(hasToBePopulated(child, false, isForEdit, site)) { |
196 |
|
|
197 |
29
|
SiteMapEntry siteMapBean = populateBean(child, false, isForEdit , site, inheritedParentDisplayColor); |
198 |
29
|
NodeIterator childNodes = searchSiteChildNodes(child); |
199 |
29
|
boolean hasChild = (childNodes!=null && childNodes.hasNext()) ? true:false; |
200 |
|
|
201 |
29
|
if(isForEdit) { |
202 |
|
|
203 |
9
|
siteMapBeans.add(siteMapBean); |
204 |
|
|
205 |
9
|
if(hasChild) { |
206 |
|
|
207 |
3
|
Boolean hideNodeChildInGoogleSitemapTmp = null; |
208 |
|
|
209 |
3
|
if(inheritedParentDisplayColor != null) { |
210 |
0
|
hideNodeChildInGoogleSitemapTmp = inheritedParentDisplayColor; |
211 |
3
|
}else if(hideNodeChildInGoogleSitemap(child)) { |
212 |
1
|
hideNodeChildInGoogleSitemapTmp = Boolean.TRUE; |
213 |
|
} |
214 |
|
|
215 |
3
|
feedSiteMapBeans(siteMapBeans, childNodes, isForEdit, hideNodeChildInGoogleSitemapTmp); |
216 |
|
} |
217 |
|
|
218 |
|
} else { |
219 |
|
|
220 |
|
|
221 |
20
|
if (!hideNodeInGoogleSitemap(child)){ |
222 |
|
|
223 |
19
|
if(i18nSupport.isEnabled() && site.getI18n().isEnabled()) { |
224 |
0
|
Locale currentLocale = i18nSupport.getLocale(); |
225 |
0
|
for(Locale locale:site.getI18n().getLocales() ){ |
226 |
0
|
i18nSupport.setLocale(locale); |
227 |
0
|
SiteMapEntry siteMapBeanLocale = populateBean(child, false, isForEdit, site, null); |
228 |
0
|
if(siteMapBeanLocale != null) { |
229 |
0
|
siteMapBeans.add(siteMapBeanLocale); |
230 |
|
} |
231 |
|
} |
232 |
0
|
i18nSupport.setLocale(currentLocale); |
233 |
|
} else { |
234 |
19
|
siteMapBeans.add(siteMapBean); |
235 |
|
} |
236 |
|
} |
237 |
|
|
238 |
20
|
if(hasChild && !hideNodeChildInGoogleSitemap(child)) { |
239 |
|
|
240 |
4
|
feedSiteMapBeans(siteMapBeans, childNodes, isForEdit, null); |
241 |
|
} |
242 |
|
|
243 |
|
} |
244 |
|
|
245 |
|
} |
246 |
|
|
247 |
|
} |
248 |
|
} |
249 |
|
|
250 |
|
|
251 |
|
|
252 |
|
|
|
|
| 81.6% |
Uncovered Elements: 7 (38) |
Complexity: 7 |
Complexity Density: 0.27 |
|
253 |
40
|
private SiteMapEntry populateBean( Node child, boolean isForUriMapping, boolean isForEdit, Site site, Boolean inheritedParentDisplayColor ) throws RepositoryException {... |
254 |
40
|
SiteMapEntry res = null; |
255 |
|
|
256 |
40
|
if(hasToBePopulated(child, isForUriMapping, isForEdit, site)) { |
257 |
40
|
double priority = 0.5; |
258 |
40
|
String changefreq = "weekly"; |
259 |
40
|
String lastmod = ""; |
260 |
40
|
int level = -1; |
261 |
40
|
String loc = null; |
262 |
|
|
263 |
|
|
264 |
40
|
level = child.getDepth(); |
265 |
|
|
266 |
|
|
267 |
40
|
if(child.hasProperty(GoogleSiteMapConfiguration.DEFAULT_PRIORITY_NODEDATA)) { |
268 |
0
|
priority = child.getProperty(GoogleSiteMapConfiguration.DEFAULT_PRIORITY_NODEDATA).getDouble(); |
269 |
|
} |
270 |
|
|
271 |
|
|
272 |
40
|
if(child.hasProperty(GoogleSiteMapConfiguration.DEFAULT_CHANGEFREQ_NODEDATA)) { |
273 |
0
|
changefreq = child.getProperty(GoogleSiteMapConfiguration.DEFAULT_CHANGEFREQ_NODEDATA).getString(); |
274 |
|
} |
275 |
|
|
276 |
|
|
277 |
40
|
Node metaData = child.getNode(MetaData.DEFAULT_META_NODE); |
278 |
40
|
Calendar date = null; |
279 |
40
|
if(metaData.hasProperty(lastMod)) { |
280 |
40
|
date = metaData.getProperty(lastMod).getDate(); |
281 |
|
} else { |
282 |
0
|
date = metaData.getProperty(creation).getDate(); |
283 |
|
} |
284 |
40
|
lastmod = configuration.getFastDateFormat().format(date.getTime()); |
285 |
|
|
286 |
|
|
287 |
40
|
if(isForUriMapping) { |
288 |
11
|
loc = MgnlContext.getContextPath()+child.getProperty("fromURI").getString(); |
289 |
|
}else { |
290 |
29
|
loc = LinkUtil.createExternalLink(ContentUtil.asContent(child)); |
291 |
|
} |
292 |
|
|
293 |
|
|
294 |
40
|
res = new SiteMapEntry(loc, lastmod, changefreq, Double.toString(priority), level); |
295 |
40
|
log.debug("Populate Basic info for Node: "+child.getPath()+ " with values "+res.toStringDisplay()); |
296 |
|
|
297 |
40
|
if(isForEdit) { |
298 |
14
|
res = populateBeanForEdit(child, isForUriMapping, res, inheritedParentDisplayColor); |
299 |
|
} |
300 |
|
} |
301 |
|
|
302 |
40
|
return res; |
303 |
|
} |
304 |
|
|
305 |
|
|
306 |
|
|
307 |
|
|
308 |
|
|
|
|
| 85% |
Uncovered Elements: 3 (20) |
Complexity: 6 |
Complexity Density: 0.6 |
|
309 |
14
|
private SiteMapEntry populateBeanForEdit(Node child, boolean isForUriMapping, SiteMapEntry siteMapBean, Boolean inheritedParentDisplayColor) throws RepositoryException {... |
310 |
|
|
311 |
14
|
siteMapBean.setPath(child.getPath()); |
312 |
|
|
313 |
14
|
if(isForUriMapping) { |
314 |
|
|
315 |
5
|
siteMapBean.setFrom(child.hasProperty("fromURI")?child.getProperty("fromURI").getString():""); |
316 |
5
|
siteMapBean.setTo(child.hasProperty("toURI")?child.getProperty("toURI").getString():""); |
317 |
5
|
siteMapBean.setStyleAlert(hideNodeInGoogleSitemap(child)); |
318 |
5
|
log.debug("Populate Edit VirtualUri info for Node: "+child.getPath()+ " with values "+siteMapBean.toStringVirtualUri()); |
319 |
|
} else { |
320 |
|
|
321 |
9
|
siteMapBean.setPageName(child.hasProperty("title")?child.getProperty("title").getString():""); |
322 |
9
|
siteMapBean.setStyleAlert(inheritedParentDisplayColor!=null?inheritedParentDisplayColor.booleanValue():hideNodeInGoogleSitemap(child)); |
323 |
9
|
log.debug("Populate Edit Site info for Node: "+child.getPath()+ " with values "+siteMapBean.toStringSite()); |
324 |
|
} |
325 |
14
|
return siteMapBean; |
326 |
|
} |
327 |
|
|
328 |
|
|
329 |
|
|
330 |
|
|
331 |
|
|
332 |
|
|
333 |
|
|
334 |
|
|
335 |
|
|
336 |
|
|
|
|
| 91.3% |
Uncovered Elements: 2 (23) |
Complexity: 11 |
Complexity Density: 0.85 |
|
337 |
96
|
private boolean hasToBePopulated( Node child, boolean isForUriMapping, boolean isForEdit, Site site ) throws RepositoryException {... |
338 |
96
|
boolean hasCreationDate = child.hasNode(MetaData.DEFAULT_META_NODE) && child.getNode(MetaData.DEFAULT_META_NODE).hasProperty(creation); |
339 |
96
|
boolean hasModificationDate = child.hasNode(MetaData.DEFAULT_META_NODE) && child.getNode(MetaData.DEFAULT_META_NODE).hasProperty(lastMod); |
340 |
|
|
341 |
|
|
342 |
96
|
if(MetaDataUtil.getTemplate(child).endsWith(GoogleSiteMapConfiguration.SITE_MAP_TEMPLATE_NAME)) { |
343 |
0
|
return false; |
344 |
|
} |
345 |
|
|
346 |
|
|
347 |
96
|
if(isForEdit) { |
348 |
32
|
return hasCreationDate; |
349 |
|
} |
350 |
|
|
351 |
|
|
352 |
64
|
if(hideNodeInGoogleSitemap(child) && (isForUriMapping || hideNodeChildInGoogleSitemap(child))) { |
353 |
1
|
return false; |
354 |
|
} |
355 |
|
|
356 |
63
|
if(isForUriMapping && hasModificationDate) { |
357 |
12
|
return true; |
358 |
|
} |
359 |
|
|
360 |
51
|
if(!isForUriMapping && site.isEnabled() && hasCreationDate ) { |
361 |
40
|
return true; |
362 |
|
} |
363 |
|
|
364 |
11
|
return false; |
365 |
|
} |
366 |
|
|
367 |
|
|
368 |
|
|
369 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (6) |
Complexity: 2 |
Complexity Density: 0.5 |
|
370 |
97
|
private boolean hideNodeInGoogleSitemap(Node child) throws RepositoryException {... |
371 |
97
|
boolean res = false; |
372 |
|
|
373 |
97
|
if(child.hasProperty(GoogleSiteMapConfiguration.DEFAULT_HIDEINGOOGLESITEMAP_NODEDATA)) { |
374 |
6
|
res = child.getProperty(GoogleSiteMapConfiguration.DEFAULT_HIDEINGOOGLESITEMAP_NODEDATA).getBoolean(); |
375 |
|
} |
376 |
|
|
377 |
97
|
return res; |
378 |
|
} |
379 |
|
|
380 |
|
|
381 |
|
|
382 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (6) |
Complexity: 2 |
Complexity Density: 0.5 |
|
383 |
10
|
private boolean hideNodeChildInGoogleSitemap(Node child) throws RepositoryException {... |
384 |
10
|
boolean res = false; |
385 |
|
|
386 |
10
|
if(child.hasProperty(GoogleSiteMapConfiguration.DEFAULT_HIDEINGOOGLESITEMAPCHILDREN_NODEDATA)) { |
387 |
2
|
res = child.getProperty(GoogleSiteMapConfiguration.DEFAULT_HIDEINGOOGLESITEMAPCHILDREN_NODEDATA).getBoolean(); |
388 |
|
} |
389 |
|
|
390 |
10
|
return res; |
391 |
|
} |
392 |
|
|
393 |
|
} |