Joerg Hoh created OAK-11811: ------------------------------- Summary: Resolve questionable recursion in NodeTypeImpl Key: OAK-11811 URL: https://issues.apache.org/jira/browse/OAK-11811 Project: Jackrabbit Oak Issue Type: Task Components: core Affects Versions: 1.80.0 Reporter: Joerg Hoh
NodeTypeImpl.internalIsNodeType does a recursive call to itself, but it re-uses the same parameter {{oakName}} which it is getting passed. That means it either returns early or runs into an endless recursion. [Github|https://github.com/apache/jackrabbit-oak/blob/06b7ff2278cdfe432c2ed7cfcdb17f195fca9722/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/NodeTypeImpl.java#L494-L504] {noformat} boolean internalIsNodeType(String oakName) { if (getOakName().equals(oakName)) { return true; } for (NodeType type : getDeclaredSupertypes()) { if (((NodeTypeImpl) type).internalIsNodeType(oakName)) { return true; } } return false; } {noformat} A quick test shows, that with this diff applied it also passes all unittests: {noformat} @@ -496,7 +496,7 @@ class NodeTypeImpl extends AbstractTypeDefinition implements NodeType { return true; } for (NodeType type : getDeclaredSupertypes()) { - if (((NodeTypeImpl) type).internalIsNodeType(oakName)) { + if (((NodeTypeImpl) type).getOakName().equals(oakName)) { return true; } } {noformat} Is this is the correct and intended behavior? I am not entirely sure about this, as it would mean that {{getDeclaredSupertypes()}} would need to return all transitive supertypes as well, and I don't see that in the code. -- This message was sent by Atlassian Jira (v8.20.10#820010)