Author: stillalex Date: Thu May 2 11:48:10 2019 New Revision: 1858530 URL: http://svn.apache.org/viewvc?rev=1858530&view=rev Log: OAK-8249 NodeImpl#isNodeType could load mixin info lazily
Modified: jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/EffectiveNodeTypeProvider.java jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/package-info.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/AccessManager.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java Modified: jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/EffectiveNodeTypeProvider.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/EffectiveNodeTypeProvider.java?rev=1858530&r1=1858529&r2=1858530&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/EffectiveNodeTypeProvider.java (original) +++ jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/EffectiveNodeTypeProvider.java Thu May 2 11:48:10 2019 @@ -16,7 +16,10 @@ */ package org.apache.jackrabbit.oak.spi.nodetype; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; + import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.nodetype.NoSuchNodeTypeException; @@ -36,6 +39,11 @@ public interface EffectiveNodeTypeProvid * type or mixin type, or a subtype thereof respecting the effective node * type of the {@code tree}. Returns {@code false} otherwise. * + * Note: caution must be taken while calling this api because it doesn't + * offer the same strict guarantees as the {@code Node#isNodeType(String)} + * method in the case where the session doesn't have access to the + * {@code jcr:mixinTypes} property. + * * @param tree The tree to be tested. * @param nodeTypeName The internal oak name of the node type to be tested. * @return true if the specified node is of the given node type. @@ -54,8 +62,29 @@ public interface EffectiveNodeTypeProvid * refer to an existing node type. * @throws RepositoryException If the given node type name is invalid or if * some other error occurs. + * @deprecated use {@link #isNodeType(String, Iterable, String)} instead + */ + @Deprecated + default boolean isNodeType(@NotNull String primaryTypeName, @NotNull Iterator<String> mixinTypes, @NotNull String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException { + List<String> mixins = new ArrayList<>(); + mixinTypes.forEachRemaining(mixins::add); + return isNodeType(primaryTypeName, mixins, nodeTypeName); + } + + /** + * Returns {@code true} if {@code typeName} is of the specified primary node + * type or mixin type, or a subtype thereof. Returns {@code false} otherwise. + * + * @param primaryTypeName the internal oak name of the node to test + * @param mixinTypes the internal oak names of the node to test. + * @param nodeTypeName The internal oak name of the node type to be tested. + * @return {@code true} if the specified node type is of the given node type. + * @throws NoSuchNodeTypeException If the specified node type name doesn't + * refer to an existing node type. + * @throws RepositoryException If the given node type name is invalid or if + * some other error occurs. */ - boolean isNodeType(@NotNull String primaryTypeName, @NotNull Iterator<String> mixinTypes, @NotNull String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException; + boolean isNodeType(@NotNull String primaryTypeName, @NotNull Iterable<String> mixinTypes, @NotNull String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException; /** * Returns {@code true} if {@code typeName} is of the specified primary node Modified: jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/package-info.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/package-info.java?rev=1858530&r1=1858529&r2=1858530&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/package-info.java (original) +++ jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/nodetype/package-info.java Thu May 2 11:48:10 2019 @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@Version("1.0.2") +@Version("1.1.0") package org.apache.jackrabbit.oak.spi.nodetype; import org.osgi.annotation.versioning.Version; Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java?rev=1858530&r1=1858529&r2=1858530&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/ReadOnlyNodeTypeManager.java Thu May 2 11:48:10 2019 @@ -25,7 +25,6 @@ import static org.apache.jackrabbit.oak. import static org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants.NODE_TYPES_PATH; import static org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants.REP_SUPERTYPES; -import java.util.Iterator; import java.util.List; import javax.jcr.Node; @@ -285,7 +284,7 @@ public abstract class ReadOnlyNodeTypeMa } @Override - public boolean isNodeType(@Nullable String primaryTypeName, @NotNull Iterator<String> mixinTypes, @NotNull String nodeTypeName) { + public boolean isNodeType(@Nullable String primaryTypeName, @NotNull Iterable<String> mixinTypes, @NotNull String nodeTypeName) { // shortcut if (JcrConstants.NT_BASE.equals(nodeTypeName)) { return true; @@ -294,8 +293,8 @@ public abstract class ReadOnlyNodeTypeMa if (primaryTypeName != null && isa(types, primaryTypeName, nodeTypeName)) { return true; } - while (mixinTypes.hasNext()) { - if (isa(types, mixinTypes.next(), nodeTypeName)) { + for (String mixin : mixinTypes) { + if (isa(types, mixin, nodeTypeName)) { return true; } } Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/AccessManager.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/AccessManager.java?rev=1858530&r1=1858529&r2=1858530&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/AccessManager.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/AccessManager.java Thu May 2 11:48:10 2019 @@ -50,7 +50,7 @@ public class AccessManager { }); } - public boolean hasPermissions(@NotNull final Tree tree, @Nullable final PropertyState property, final long permissions) throws RepositoryException { + public boolean hasPermissions(@NotNull final Tree tree, @Nullable final PropertyState property, final long permissions) { return delegate.safePerform(new SessionOperation<Boolean>("hasPermissions") { @NotNull @Override Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1858530&r1=1858529&r2=1858530&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java Thu May 2 11:48:10 2019 @@ -938,7 +938,8 @@ public class NodeImpl<T extends NodeDele @Override public Boolean perform() throws RepositoryException { Tree tree = node.getTree(); - return getNodeTypeManager().isNodeType(getPrimaryTypeName(tree), getMixinTypeNames(tree), oakName); + Iterable<String> mixins = () -> getMixinTypeNames(tree); + return getNodeTypeManager().isNodeType(getPrimaryTypeName(tree), mixins, oakName); } }); } @@ -1294,7 +1295,7 @@ public class NodeImpl<T extends NodeDele } @NotNull - private Iterator<String> getMixinTypeNames(@NotNull Tree tree) throws RepositoryException { + private Iterator<String> getMixinTypeNames(@NotNull Tree tree) { if (tree.hasProperty(JcrConstants.JCR_MIXINTYPES) || canReadMixinTypes(tree)) { return TreeUtil.getMixinTypeNames(tree).iterator(); } else { @@ -1312,7 +1313,7 @@ public class NodeImpl<T extends NodeDele }; } - private boolean canReadMixinTypes(@NotNull Tree tree) throws RepositoryException { + private boolean canReadMixinTypes(@NotNull Tree tree) { return sessionContext.getAccessManager().hasPermissions( tree, EMPTY_MIXIN_TYPES, Permissions.READ_PROPERTY); } Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java?rev=1858530&r1=1858529&r2=1858530&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java (original) +++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java Thu May 2 11:48:10 2019 @@ -404,7 +404,7 @@ public class SessionContext implements N } @NotNull - public AccessManager getAccessManager() throws RepositoryException { + public AccessManager getAccessManager() { if (accessManager == null) { accessManager = new AccessManager(delegate, delegate.getPermissionProvider()); }