You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Alexander Klimetschek (JIRA)" <ji...@apache.org> on 2015/03/27 22:56:53 UTC
[jira] [Comment Edited] (SLING-4512) Traversal Warnings in OAK
while creating i18n JcrResourceBundle
[ https://issues.apache.org/jira/browse/SLING-4512?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14384754#comment-14384754 ]
Alexander Klimetschek edited comment on SLING-4512 at 3/27/15 9:56 PM:
-----------------------------------------------------------------------
Here is a new patch on top of trunk (since SLING-4543 has been fixed): [^SLING-4512-alex.patch]
It's a lot simpler - just uses {{javax.jcr.util.TraversingItemVisitor.Default}} and a straightforward node type check.
[~amitgupt] Yes, the node type check can be simplified since the JCR API naturally has support for this: {{node.isNodeType("sling:Message")}} (this covers node type inheritance). Also, checking just for the {{sling:Message}} (mixin) type, since the primary node type {{sling:MessageEntry}} inherits from the mixin.
{code:java}
private void loadSlingMessageDictionary(Resource dictionaryResource, final Map<String, Object> targetDictionary) {
log.info("Loading sling:Message dictionary: {}", dictionaryResource.getPath());
TraversingItemVisitor.Default visitor = new TraversingItemVisitor.Default() {
@Override
protected void entering(Node node, int level) throws RepositoryException {
if (node.isNodeType(NT_MESSAGE) && node.hasProperty(PROP_VALUE)) {
String key;
if (node.hasProperty(PROP_KEY)) {
key = node.getProperty(PROP_KEY).getString();
} else {
key = node.getName();
}
String value = node.getProperty(PROP_VALUE).getString();
targetDictionary.put(key, value);
}
}
};
try {
Node node = dictionaryResource.adaptTo(Node.class);
visitor.visit(node);
} catch (RepositoryException e) {
log.error("Could not read sling:Message dictionary: " + dictionaryResource.getPath(), e);
}
}
{code}
was (Author: alexander.klimetschek):
Here is a new patch on top of trunk (since SLING-4543 has been fixed): [^SLING-4512-alex.patch]
It's a lot simpler - just uses {{javax.jcr.util.TraversingItemVisitor.Default}} and a straightforward node type check.
[~amitgupt] Yes, the node type check can be simplified since the JCR API naturally has support for this: {{node.isNodeType("sling:Message")}} (this covers node type inheritance). Also, checking just for the {{sling:Message}} (mixin) type, since the primary node type {{sling:MessageEntry}} inherits from the mixin.
> Traversal Warnings in OAK while creating i18n JcrResourceBundle
> ---------------------------------------------------------------
>
> Key: SLING-4512
> URL: https://issues.apache.org/jira/browse/SLING-4512
> Project: Sling
> Issue Type: Improvement
> Components: Extensions
> Reporter: Srijan Bhatnagar
> Assignee: Amit Gupta
> Attachments: SLING-4512-alex.patch, SLING-4512.diff
>
>
> org.apache.sling.i18n.impl.JcrResourceBundle#loadFully uses an XPath query to load [sling:Message] nodes under given paths. If the subtree under the path is too big (>1000), we receive traversal warnings in Oak. The following warning is generated if the path is /libs/wcm/core/i18n/de :
> {code}
> GET /content/geometrixx/de.html HTTP/1.1] org.apache.jackrabbit.oak.spi.query.Cursors$TraversingCursor Traversed 1000 nodes with filter Filter(query=select [jcr:path], [jcr:score], * from [sling:Message] as a where isdescendantnode(a, '/libs/wcm/core/i18n/de') /* xpath: /jcr:root/libs/wcm/core/i18n/de//element(*,sling:Message) */, path=/libs/wcm/core/i18n/de//*); consider creating an index or changing the query
> {code}
> A suggestion would be to use [TreeTraverser|http://jackrabbit.apache.org/api/2.4/org/apache/jackrabbit/commons/flat/TreeTraverser.html] instead of XPath query since the subtree is mostly a flat list.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)