This is an automated email from the ASF dual-hosted git repository.

daim pushed a commit to branch OAK-11451
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit b1e2be891e6adb292728f0e809f978e94afcb0c3
Author: Rishabh Kumar <[email protected]>
AuthorDate: Sun Feb 2 15:37:55 2025 +0530

    OAK-11451 : removed usage of Guava Iterables.concat
---
 .../authentication/external/impl/ExternalLoginModule.java     |  3 ++-
 .../impl/principal/ExternalGroupPrincipalProvider.java        |  2 +-
 .../impl/PrincipalBasedAccessControlManager.java              |  3 ++-
 .../authorization/principalbased/PrinicipalBasedReadTest.java |  3 ++-
 .../oak/plugins/index/nodetype/NodeTypeIndexLookup.java       |  3 ++-
 .../oak/plugins/index/property/PropertyIndexLookup.java       |  4 +++-
 .../oak/plugins/index/property/PropertyIndexPlan.java         |  4 +++-
 .../oak/plugins/index/reference/ReferenceIndex.java           |  5 ++++-
 .../oak/plugins/migration/AbstractDecoratedNodeState.java     |  4 +++-
 .../oak/plugins/migration/version/VersionHistoryUtil.java     |  4 ++--
 .../oak/plugins/nodetype/EffectiveNodeTypeImpl.java           |  8 ++++++--
 .../apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java |  3 +--
 .../oak/security/authentication/token/TokenLoginModule.java   |  3 ++-
 .../oak/security/authentication/user/LoginModuleImpl.java     |  3 ++-
 .../oak/security/authorization/AuthorizationContext.java      |  3 ++-
 .../oak/security/internal/SecurityProviderRegistration.java   |  5 ++++-
 .../oak/plugins/index/lucene/LuceneIndexNodeManager.java      |  3 ++-
 .../oak/plugins/index/lucene/LucenePropertyIndex.java         |  3 ++-
 .../oak/plugins/index/lucene/hybrid/LuceneDocumentHolder.java |  3 ++-
 .../index/lucene/property/HybridPropertyIndexLookup.java      |  3 ++-
 .../index/lucene/property/UniquenessConstraintValidator.java  |  3 ++-
 .../oak/plugins/index/lucene/util/IndexDefinitionBuilder.java |  3 ++-
 .../plugins/index/lucene/writer/MultiplexingIndexWriter.java  |  4 ++--
 .../oak/index/indexer/document/NodeStateEntryTraverser.java   |  4 ++--
 .../main/java/org/apache/jackrabbit/oak/run/cli/Options.java  |  3 ++-
 .../index/search/spi/editor/FulltextDocumentMaker.java        |  3 ++-
 .../plugins/index/search/spi/editor/FulltextIndexEditor.java  |  3 ++-
 .../oak/plugins/index/search/util/IndexDefinitionBuilder.java |  3 ++-
 .../jackrabbit/oak/spi/security/CompositeConfiguration.java   |  6 ++++--
 .../java/org/apache/jackrabbit/oak/segment/MapRecord.java     | 10 +++++++---
 .../org/apache/jackrabbit/oak/plugins/document/Branch.java    | 10 ++++++----
 .../apache/jackrabbit/oak/plugins/document/NodeDocument.java  |  7 ++++++-
 .../jackrabbit/oak/plugins/document/TieredDiffCache.java      |  3 ++-
 .../oak/plugins/document/cache/NodeDocumentCache.java         |  5 +++--
 .../oak/plugins/document/mongo/MongoVersionGCSupport.java     |  4 ++--
 .../oak/plugins/document/rdb/RDBVersionGCSupport.java         |  3 ++-
 .../jackrabbit/oak/plugins/memory/ModifiedNodeState.java      | 11 ++++++-----
 .../org/apache/jackrabbit/oak/spi/commit/MoveTracker.java     |  4 +++-
 38 files changed, 106 insertions(+), 55 deletions(-)

diff --git 
a/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
 
b/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
index 723e4d1030..9239ebdac6 100644
--- 
a/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
+++ 
b/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.spi.security.authentication.external.impl;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.api.security.user.UserManager;
@@ -457,7 +458,7 @@ public class ExternalLoginModule extends 
AbstractLoginModule {
         if (creds != null) {
             attributes.putAll(credentialsSupport.getAttributes(creds));
         }
-        return new AuthInfoImpl(userId, attributes, 
Iterables.concat(principals, subject.getPrincipals()));
+        return new AuthInfoImpl(userId, attributes, 
IterableUtils.chainedIterable(principals, subject.getPrincipals()));
     }
 
     @NotNull
diff --git 
a/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
 
b/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
index 73642cf86a..38a08b767e 100644
--- 
a/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
+++ 
b/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/principal/ExternalGroupPrincipalProvider.java
@@ -166,7 +166,7 @@ class ExternalGroupPrincipalProvider implements 
PrincipalProvider, ExternalIdent
         this.hasOnlyDynamicGroups = hasOnlyDynamicGroups;
 
         autoMembershipPrincipals = new AutoMembershipPrincipals(userManager, 
-                Collections.singletonMap(idpName, 
Iterables.toArray(Iterables.concat(syncConfig.user().getAutoMembership(),syncConfig.group().getAutoMembership()),
 String.class)),
+                Collections.singletonMap(idpName, 
Iterables.toArray(IterableUtils.chainedIterable(syncConfig.user().getAutoMembership(),syncConfig.group().getAutoMembership()),
 String.class)),
                 Collections.singletonMap(idpName, 
syncConfig.user().getAutoMembershipConfig()));
         groupAutoMembershipPrincipals = (idpNamesWithDynamicGroups.isEmpty()) 
? null : 
                 new AutoMembershipPrincipals(userManager, 
diff --git 
a/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManager.java
 
b/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManager.java
index 9d55463b5f..929a6ff81d 100644
--- 
a/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManager.java
+++ 
b/oak-authorization-principalbased/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/principalbased/impl/PrincipalBasedAccessControlManager.java
@@ -16,6 +16,7 @@
  */
 package 
org.apache.jackrabbit.oak.spi.security.authorization.principalbased.impl;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlPolicy;
@@ -233,7 +234,7 @@ class PrincipalBasedAccessControlManager extends 
AbstractAccessControlManager im
             Iterable<PrincipalAccessControlList> acls = 
Iterables.transform(m.entrySet(), entry -> new 
ImmutablePrincipalPolicy(entry.getKey(), filter.getOakPath(entry.getKey()), 
entry.getValue(), mgrProvider.getRestrictionProvider(), getNamePathMapper()));
 
             if (ReadPolicy.hasEffectiveReadPolicy(readPaths, oakPath)) {
-                Iterable<AccessControlPolicy> iterable = 
Iterables.concat(acls, Collections.singleton(ReadPolicy.INSTANCE));
+                Iterable<AccessControlPolicy> iterable = 
IterableUtils.chainedIterable(acls, Collections.singleton(ReadPolicy.INSTANCE));
                 return Iterables.toArray(iterable, AccessControlPolicy.class);
             } else {
                 return Iterables.toArray(acls, 
PrincipalAccessControlList.class);
diff --git 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java
 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java
index 8587b57954..8f0cdb44d4 100644
--- 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java
+++ 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/principalbased/PrinicipalBasedReadTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.benchmark.authorization.principalbased;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.guava.common.collect.Iterators;
 import org.apache.jackrabbit.api.JackrabbitSession;
@@ -159,7 +160,7 @@ public class PrinicipalBasedReadTest extends 
ReadDeepTreeTest {
             }
             added = acl.addAccessControlEntry(principal, privileges);
         } else {
-            for (JackrabbitAccessControlPolicy policy : 
Iterables.concat(Arrays.asList(acMgr.getApplicablePolicies(principal)),
+            for (JackrabbitAccessControlPolicy policy : 
IterableUtils.chainedIterable(Arrays.asList(acMgr.getApplicablePolicies(principal)),
                     Arrays.asList(acMgr.getPolicies(principal)))) {
                 if (policy instanceof PrincipalAccessControlList) {
                     acl = (PrincipalAccessControlList) policy;
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexLookup.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexLookup.java
index ad6f961578..c2b0f9efca 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexLookup.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexLookup.java
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.plugins.index.nodetype;
 
 import static org.apache.jackrabbit.oak.plugins.memory.PropertyValues.newName;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexLookup;
 import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
@@ -89,7 +90,7 @@ class NodeTypeIndexLookup implements JcrConstants {
      */
     public Iterable<String> query(Filter filter) {
         PropertyIndexLookup lookup = new PropertyIndexLookup(root, 
mountInfoProvider);
-        return Iterables.concat(
+        return IterableUtils.chainedIterable(
                 lookup.query(filter, JCR_PRIMARYTYPE, 
newName(filter.getPrimaryTypes())),
                 lookup.query(filter, JCR_MIXINTYPES, 
newName(filter.getMixinTypes())));
     }
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java
index 389bf5e263..4a39124031 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexLookup.java
@@ -28,12 +28,14 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import 
org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
 import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
@@ -126,7 +128,7 @@ public class PropertyIndexLookup {
             iterables.add(s.query(filter, propertyName, indexMeta,
                     encode(value, pattern)));
         }
-        return Iterables.concat(iterables);
+        return 
StreamUtils.toStream(iterables).flatMap(StreamUtils::toStream).collect(Collectors.toList());
     }
 
     Set<IndexStoreStrategy> getStrategies(NodeState definition) {
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
index d03e25a44c..0cf76e39da 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexPlan.java
@@ -24,7 +24,9 @@ import static 
org.apache.jackrabbit.oak.plugins.index.IndexConstants.PROPERTY_NA
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.collections.SetUtils;
 import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
@@ -216,7 +218,7 @@ public class PropertyIndexPlan {
         for (IndexStoreStrategy s : strategies) {
             iterables.add(s.query(filter, name, definition, values));
         }
-        Cursor cursor = Cursors.newPathCursor(Iterables.concat(iterables),
+        Cursor cursor = 
Cursors.newPathCursor(StreamUtils.toStream(iterables).flatMap(StreamUtils::toStream).collect(Collectors.toList()),
                 settings);
         if (depth > 1) {
             cursor = Cursors.newAncestorCursor(cursor, depth - 1, settings);
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
index a4810b12eb..f450fd1ff6 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/reference/ReferenceIndex.java
@@ -33,7 +33,10 @@ import static 
org.apache.jackrabbit.oak.plugins.index.reference.NodeReferenceCon
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.plugins.index.property.Multiplexers;
 import 
org.apache.jackrabbit.oak.plugins.index.property.strategy.IndexStoreStrategy;
 import org.apache.jackrabbit.oak.query.SQL2Parser;
@@ -133,7 +136,7 @@ class ReferenceIndex implements QueryIndex {
             iterables.add(s.query(filter, index + "("
                     + uuid + ")", indexRoot, Set.of(uuid)));
         }
-        Iterable<String> paths = Iterables.concat(iterables);
+        Iterable<String> paths = 
StreamUtils.toStream(iterables).flatMap(StreamUtils::toStream).collect(Collectors.toList());
 
         if (!"*".equals(name)) {
             paths = filter(paths, path -> name.equals(getName(path)));
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java
index a284301da4..abc3f2259a 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/AbstractDecoratedNodeState.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.migration;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
@@ -35,6 +36,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 import static 
org.apache.jackrabbit.oak.plugins.tree.TreeConstants.OAK_CHILD_ORDER;
@@ -171,7 +173,7 @@ public abstract class AbstractDecoratedNodeState extends 
AbstractNodeState {
         final Iterable<PropertyState> propertyStates = Iterables.transform(
                 delegate.getProperties(),
                 propertyState -> decorate(propertyState));
-        return Iterables.filter(Iterables.concat(propertyStates, 
getNewPropertyStates()), x -> x != null);
+        return Iterables.filter(IterableUtils.chainedIterable(propertyStates, 
getNewPropertyStates()), Objects::nonNull);
     }
 
     /**
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionHistoryUtil.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionHistoryUtil.java
index 4c16650e57..b2194284de 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionHistoryUtil.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionHistoryUtil.java
@@ -16,7 +16,6 @@
  */
 package org.apache.jackrabbit.oak.plugins.migration.version;
 
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static java.util.Collections.singleton;
 import static org.apache.jackrabbit.JcrConstants.JCR_BASEVERSION;
 import static org.apache.jackrabbit.JcrConstants.JCR_CREATED;
@@ -38,6 +37,7 @@ import java.util.Calendar;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.collections.SetUtils;
@@ -55,7 +55,7 @@ public class VersionHistoryUtil {
     private static final Logger LOG = 
LoggerFactory.getLogger(VersionHistoryUtil.class);
 
     public static String getRelativeVersionHistoryPath(String versionableUuid) 
{
-        return String.join("/", concat(
+        return String.join("/", IterableUtils.chainedIterable(
                 singleton(""),
                 getRelativeVersionHistoryPathSegments(versionableUuid),
                 singleton(versionableUuid)));
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
index a7ffed97b2..6ec4606c32 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveNodeTypeImpl.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -35,8 +36,10 @@ import javax.jcr.nodetype.NodeDefinition;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.nodetype.PropertyDefinition;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.plugins.value.jcr.PartialValueFactory;
 import org.apache.jackrabbit.oak.spi.nodetype.EffectiveNodeType;
 import org.jetbrains.annotations.NotNull;
@@ -204,8 +207,9 @@ class EffectiveNodeTypeImpl implements EffectiveNodeType {
     @NotNull
     @Override
     public Iterable<NodeDefinition> getNamedNodeDefinitions(@NotNull final 
String oakName) {
-        return Iterables.concat(Iterables.transform(nodeTypes.values(),
-                input -> input.getDeclaredNamedNodeDefinitions(oakName)));
+        return StreamUtils.toStream(Iterables.transform(nodeTypes.values(), 
input -> input.getDeclaredNamedNodeDefinitions(oakName)))
+                .flatMap(StreamUtils::toStream)
+                .collect(Collectors.toList());
     }
 
     /**
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
index 44f42457e3..434c778eb4 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/EffectiveType.java
@@ -31,7 +31,6 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import static java.util.Objects.requireNonNull;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static org.apache.jackrabbit.JcrConstants.JCR_DEFAULTPRIMARYTYPE;
 import static org.apache.jackrabbit.JcrConstants.JCR_MANDATORY;
 import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
@@ -243,7 +242,7 @@ class EffectiveType {
             NodeState residual = type
                     .getChildNode(REP_RESIDUAL_CHILD_NODE_DEFINITIONS);
 
-            for (ChildNodeEntry entry : concat(
+            for (ChildNodeEntry entry : IterableUtils.chainedIterable(
                     named.getChildNodeEntries(),
                     residual.getChildNodeEntries())) {
                 NodeState definition = entry.getNodeState();
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenLoginModule.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenLoginModule.java
index c159845a3d..f7d8434d32 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenLoginModule.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/token/TokenLoginModule.java
@@ -31,6 +31,7 @@ import javax.security.auth.callback.Callback;
 import javax.security.auth.callback.UnsupportedCallbackException;
 import javax.security.auth.login.LoginException;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import 
org.apache.jackrabbit.api.security.authentication.token.TokenCredentials;
 import org.apache.jackrabbit.oak.api.AuthInfo;
@@ -157,7 +158,7 @@ public final class TokenLoginModule extends 
AbstractLoginModule {
     public boolean commit() throws LoginException {
         if (tokenCredentials != null && tokenInfo != null) {
             principals = (principal != null) ? getPrincipals(principal) : 
getPrincipals(tokenInfo.getUserId());
-            authInfo = getAuthInfo(tokenInfo, Iterables.concat(principals, 
subject.getPrincipals()));
+            authInfo = getAuthInfo(tokenInfo, 
IterableUtils.chainedIterable(principals, subject.getPrincipals()));
             updateSubject(subject, tokenCredentials, authInfo);
             closeSystemSession();
             return true;
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
index 43310e3672..ccd6740283 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.security.authentication.user;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.AuthInfo;
 import org.apache.jackrabbit.oak.api.Root;
@@ -282,6 +283,6 @@ public final class LoginModuleImpl extends 
AbstractLoginModule {
                 attributes.put(attrName, sc.getAttribute(attrName));
             }
         }
-        return new AuthInfoImpl(userId, attributes, 
Iterables.concat(principals, subject.getPrincipals()));
+        return new AuthInfoImpl(userId, attributes, 
IterableUtils.chainedIterable(principals, subject.getPrincipals()));
     }
 }
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
index 59afaa488e..a85c83c189 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationContext.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.security.authorization;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -30,7 +31,7 @@ final class AuthorizationContext implements Context, 
AccessControlConstants, Per
 
     private static final String[] NODE_NAMES = POLICY_NODE_NAMES.toArray(new 
String[0]);
     private static final String[] PROPERTY_NAMES = 
ACE_PROPERTY_NAMES.toArray(new String[0]);
-    private static final String[] NT_NAMES = 
Iterables.toArray(Iterables.concat(AC_NODETYPE_NAMES, 
PERMISSION_NODETYPE_NAMES), String.class);
+    private static final String[] NT_NAMES = 
Iterables.toArray(IterableUtils.chainedIterable(AC_NODETYPE_NAMES, 
PERMISSION_NODETYPE_NAMES), String.class);
 
     private static final Context INSTANCE = new AuthorizationContext();
 
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
index 00e91753e0..7ab319f36c 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java
@@ -16,10 +16,12 @@
  */
 package org.apache.jackrabbit.oak.security.internal;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
 import org.apache.jackrabbit.oak.commons.PropertiesUtil;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
 import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
@@ -86,6 +88,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import static org.apache.jackrabbit.oak.commons.IOUtils.closeQuietly;
 import static 
org.apache.jackrabbit.oak.spi.security.ConfigurationParameters.EMPTY;
@@ -528,7 +531,7 @@ public class SecurityProviderRegistration {
 
         closer = Closer.create();
         Iterable<Iterable<Monitor<?>>> monitors = 
Iterables.transform(securityProvider.getConfigurations(), sc -> 
sc.getMonitors(statisticsProvider));
-        for (Monitor monitor : Iterables.concat(monitors)) {
+        for (Monitor monitor : 
StreamUtils.toStream(monitors).flatMap(StreamUtils::toStream).collect(Collectors.toList()))
 {
             Registration reg = whiteboard.register(monitor.getMonitorClass(), 
monitor, monitor.getMonitorProperties());
             closer.register(reg::unregister);
 
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexNodeManager.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexNodeManager.java
index 6597c380b0..16ba4d8aa1 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexNodeManager.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexNodeManager.java
@@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.PerfLogger;
@@ -251,7 +252,7 @@ public class LuceneIndexNodeManager {
 
         IndexReader[] readerArr = new IndexReader[readers.size() + 
nrtReaders.size()];
         int i = 0;
-        for (LuceneIndexReader r : Iterables.concat(readers, nrtReaders)){
+        for (LuceneIndexReader r : IterableUtils.chainedIterable(readers, 
nrtReaders)){
             readerArr[i++] = r.getReader();
         }
         return new MultiReader(readerArr, false);
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
index 63b5f99d3a..d2760530d8 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndex.java
@@ -37,6 +37,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Predicate;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.AbstractIterator;
 import org.apache.jackrabbit.guava.common.collect.FluentIterable;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
@@ -1607,7 +1608,7 @@ public class LucenePropertyIndex extends FulltextIndex {
         } else {
             Validate.checkState(pr.evaluateSyncNodeTypeRestriction()); 
//Either of property or nodetype should not be null
             Filter filter = plan.getFilter();
-            paths = FluentIterable.from(Iterables.concat(
+            paths = FluentIterable.from(IterableUtils.chainedIterable(
                     lookup.query(filter, JCR_PRIMARYTYPE, 
newName(filter.getPrimaryTypes())),
                     lookup.query(filter, JCR_MIXINTYPES, 
newName(filter.getMixinTypes()))));
         }
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/LuceneDocumentHolder.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/LuceneDocumentHolder.java
index ba48e4b690..fe3fa923e9 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/LuceneDocumentHolder.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/hybrid/LuceneDocumentHolder.java
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugins.index.lucene.hybrid;
 import java.util.Collection;
 import java.util.Map;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.ListValuedMap;
 import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
@@ -98,7 +99,7 @@ public class LuceneDocumentHolder implements JournalProperty {
      * may be directly forwarded to the queue or held in memory for later 
processing
      */
     Iterable<? extends LuceneDocInfo> getAllLuceneDocInfo(){
-        return Iterables.concat(nrtIndexedList.values(), 
syncIndexedList.values(),
+        return IterableUtils.chainedIterable(nrtIndexedList.values(), 
syncIndexedList.values(),
                 asLuceneDocInfo(queuedNrtIndexedPath), 
queuedSyncIndexedPath.values());
     }
 
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
index b211da3b67..babd278252 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/HybridPropertyIndexLookup.java
@@ -22,6 +22,7 @@ package 
org.apache.jackrabbit.oak.plugins.index.lucene.property;
 import java.util.Collections;
 import java.util.Set;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Type;
@@ -121,7 +122,7 @@ public class HybridPropertyIndexLookup {
 
     private Iterable<String> querySimple(Filter filter, String indexName, 
NodeState propIndexNode,
                                          Set<String> values) {
-        return Iterables.concat(
+        return IterableUtils.chainedIterable(
                 queryBucket(filter, indexName, propIndexNode, 
PROP_HEAD_BUCKET, values),
                 queryBucket(filter, indexName, propIndexNode, 
PROP_PREVIOUS_BUCKET, values)
         );
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/UniquenessConstraintValidator.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/UniquenessConstraintValidator.java
index 634e768b56..f7eb5d16a1 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/UniquenessConstraintValidator.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/property/UniquenessConstraintValidator.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.HashMultimap;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.guava.common.collect.Multimap;
@@ -88,7 +89,7 @@ public class UniquenessConstraintValidator {
     }
 
     private Iterable<String> getIndexedPaths(String propertyRelativePath, 
String value) {
-        return Iterables.concat(
+        return IterableUtils.chainedIterable(
                 firstStore.getIndexedPaths(propertyRelativePath, value),
                 secondStore.getIndexedPaths(propertyRelativePath, value)
         );
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
index 7658a11232..36d4ab7c96 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/util/IndexDefinitionBuilder.java
@@ -29,6 +29,7 @@ import javax.jcr.Node;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -155,7 +156,7 @@ public final class IndexDefinitionBuilder {
         if (tree.hasProperty(INDEX_TAGS)) {
             currTags = 
SetUtils.toSet(tree.getProperty(INDEX_TAGS).getValue(STRINGS));
         }
-        Set<String> tagVals = SetUtils.toSet(Iterables.concat(currTags, 
asList(additionalTagVals)));
+        Set<String> tagVals = 
SetUtils.toSet(IterableUtils.chainedIterable(currTags, 
asList(additionalTagVals)));
         boolean noAdditionalTags = currTags.containsAll(tagVals);
         if (!noAdditionalTags) {
             tree.removeProperty(INDEX_TAGS);
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/MultiplexingIndexWriter.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/MultiplexingIndexWriter.java
index b62a8a00f1..f2e67bf4e3 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/MultiplexingIndexWriter.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/writer/MultiplexingIndexWriter.java
@@ -24,6 +24,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.StreamSupport;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexDefinition;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.directory.DirectoryFactory;
 import org.apache.jackrabbit.oak.spi.mount.Mount;
@@ -31,7 +32,6 @@ import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.lucene.index.IndexableField;
 
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static java.util.Collections.singleton;
 
 class MultiplexingIndexWriter implements LuceneIndexWriter {
@@ -81,7 +81,7 @@ class MultiplexingIndexWriter implements LuceneIndexWriter {
         // explicitly get writers for mounts which haven't got writers even at 
close.
         // This essentially ensures we respect DefaultIndexWriters#close's 
intent to
         // create empty index even if nothing has been written during re-index.
-        
StreamSupport.stream(concat(singleton(mountInfoProvider.getDefaultMount()), 
mountInfoProvider.getNonDefaultMounts())
+        
StreamSupport.stream(IterableUtils.chainedIterable(singleton(mountInfoProvider.getDefaultMount()),
 mountInfoProvider.getNonDefaultMounts())
                 .spliterator(), false)
                 .filter(m ->  reindex && !m.isReadOnly()) // only needed when 
re-indexing for read-write mounts.
                                                          // reindex for 
ro-mount doesn't make sense in this case anyway.
diff --git 
a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateEntryTraverser.java
 
b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateEntryTraverser.java
index 65bf0a678f..88a46bd4c0 100644
--- 
a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateEntryTraverser.java
+++ 
b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/NodeStateEntryTraverser.java
@@ -19,6 +19,7 @@
 
 package org.apache.jackrabbit.oak.index.indexer.document;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.FluentIterable;
 import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
@@ -40,7 +41,6 @@ import java.util.function.Consumer;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singleton;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.transform;
 
 public class NodeStateEntryTraverser implements Iterable<NodeStateEntry>, 
Closeable {
@@ -124,7 +124,7 @@ public class NodeStateEntryTraverser implements 
Iterable<NodeStateEntry>, Closea
         }
 
         return transform(
-                concat(singleton(nodeState),
+                IterableUtils.chainedIterable(singleton(nodeState),
                     nodeState.getAllBundledNodesStates()),
                 dns -> {
                     NodeStateEntry.NodeStateEntryBuilder builder =  new 
NodeStateEntry.NodeStateEntryBuilder(dns, dns.getPath().toString());
diff --git 
a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/Options.java 
b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/Options.java
index 62b8b94dde..ef20190f9b 100644
--- 
a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/Options.java
+++ 
b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/Options.java
@@ -19,6 +19,7 @@
 
 package org.apache.jackrabbit.oak.run.cli;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import joptsimple.OptionParser;
 import joptsimple.OptionSet;
@@ -70,7 +71,7 @@ public class Options {
      * @return optionSet returned from OptionParser
      */
     public OptionSet parseAndConfigure(OptionParser parser, String[] args, 
boolean checkNonOptions) throws IOException {
-        for (OptionsBeanFactory o : Iterables.concat(oakRunOptions, 
beanFactories)){
+        for (OptionsBeanFactory o : 
IterableUtils.chainedIterable(oakRunOptions, beanFactories)){
             OptionsBean bean = o.newInstance(parser);
             optionBeans.put(bean.getClass(), bean);
         }
diff --git 
a/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextDocumentMaker.java
 
b/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextDocumentMaker.java
index 0f5e0e1e72..af78beba4f 100644
--- 
a/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextDocumentMaker.java
+++ 
b/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextDocumentMaker.java
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
 
 import javax.jcr.PropertyType;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -163,7 +164,7 @@ public abstract class FulltextDocumentMaker<D> implements 
DocumentMaker<D> {
         //regex for node name indexing
         PropertyState nodenamePS =
                 new StringPropertyState(FieldNames.NODE_NAME, getName(path));
-        for (PropertyState property : Iterables.concat(state.getProperties(), 
Collections.singleton(nodenamePS))) {
+        for (PropertyState property : 
IterableUtils.chainedIterable(state.getProperties(), 
Collections.singleton(nodenamePS))) {
             String pname = property.getName();
 
             if (!isVisible(pname) && !FieldNames.NODE_NAME.equals(pname)) {
diff --git 
a/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextIndexEditor.java
 
b/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextIndexEditor.java
index b6a0e55d73..5118423b13 100644
--- 
a/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextIndexEditor.java
+++ 
b/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/spi/editor/FulltextIndexEditor.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -287,7 +288,7 @@ public class FulltextIndexEditor<D> implements IndexEditor, 
Aggregate.AggregateR
   private MatcherState getMatcherState(String name, NodeState after) {
     List<Aggregate.Matcher> matched = new ArrayList<>();
     List<Aggregate.Matcher> inherited = new ArrayList<>();
-    for (Aggregate.Matcher m : Iterables.concat(matcherState.inherited, 
currentMatchers)) {
+    for (Aggregate.Matcher m : 
IterableUtils.chainedIterable(matcherState.inherited, currentMatchers)) {
       Aggregate.Matcher result = m.match(name, after);
       if (result.getStatus() == Aggregate.Matcher.Status.MATCH_FOUND){
         matched.add(result);
diff --git 
a/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/IndexDefinitionBuilder.java
 
b/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/IndexDefinitionBuilder.java
index 47914275cf..203a22400c 100644
--- 
a/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/IndexDefinitionBuilder.java
+++ 
b/oak-search/src/main/java/org/apache/jackrabbit/oak/plugins/index/search/util/IndexDefinitionBuilder.java
@@ -18,6 +18,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.search.util;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -168,7 +169,7 @@ public class IndexDefinitionBuilder {
         if (tree.hasProperty(INDEX_TAGS)) {
             currTags = 
SetUtils.toSet(tree.getProperty(INDEX_TAGS).getValue(STRINGS));
         }
-        Set<String> tagVals = SetUtils.toSet(Iterables.concat(currTags, 
asList(additionalTagVals)));
+        Set<String> tagVals = 
SetUtils.toSet(IterableUtils.chainedIterable(currTags, 
asList(additionalTagVals)));
         boolean noAdditionalTags = currTags.containsAll(tagVals);
         if (!noAdditionalTags) {
             tree.removeProperty(INDEX_TAGS);
diff --git 
a/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/CompositeConfiguration.java
 
b/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/CompositeConfiguration.java
index 6c09270611..39cc6b8e92 100644
--- 
a/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/CompositeConfiguration.java
+++ 
b/oak-security-spi/src/main/java/org/apache/jackrabbit/oak/spi/security/CompositeConfiguration.java
@@ -23,6 +23,7 @@ import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.commons.collections.SetUtils;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
@@ -262,8 +263,9 @@ public abstract class CompositeConfiguration<T extends 
SecurityConfiguration> im
     @NotNull
     @Override
     public Iterable<Monitor<?>> getMonitors(@NotNull StatisticsProvider 
statisticsProvider) {
-        return Iterables.concat(
-                Iterables.transform(getConfigurations(), securityConfiguration 
-> securityConfiguration.getMonitors(statisticsProvider)));
+        return StreamUtils.toStream(Iterables.transform(getConfigurations(), 
securityConfiguration -> securityConfiguration.getMonitors(statisticsProvider)))
+                .flatMap(StreamUtils::toStream)
+                .collect(Collectors.toSet());
     }
 
     private static final class Ranking {
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
index 13a03cd091..db7418270a 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
@@ -22,7 +22,6 @@ import static java.lang.Integer.bitCount;
 import static java.lang.Integer.highestOneBit;
 import static java.lang.Integer.numberOfTrailingZeros;
 import static java.util.Objects.requireNonNull;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static org.apache.jackrabbit.oak.segment.MapEntry.newMapEntry;
 
 import java.util.ArrayList;
@@ -31,8 +30,11 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 
 import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
@@ -335,7 +337,9 @@ public class MapRecord extends Record {
                     }
                 });
             }
-            return concat(keys);
+            return keys.stream()
+                    .flatMap(StreamUtils::toStream)
+                    .collect(Collectors.toList());
         }
 
         RecordId[] ids = new RecordId[size];
@@ -385,7 +389,7 @@ public class MapRecord extends Record {
                     }
                 });
             }
-            return concat(entries);
+            return 
entries.stream().flatMap(StreamUtils::toStream).collect(Collectors.toList());
         }
 
         MapEntry[] entries = new MapEntry[size];
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
index ed49a51f4c..d6073e64fc 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/Branch.java
@@ -32,9 +32,12 @@ import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -279,7 +282,7 @@ class Branch {
                         && input.getKey().compareRevisionTime(r) <= 0;
             }
         }::test), input -> input.getValue().getModifiedPaths());
-        return Iterables.concat(paths);
+        return 
StreamUtils.toStream(paths).flatMap(StreamUtils::toStream).collect(Collectors.toSet());
     }
 
     @Override
@@ -405,9 +408,8 @@ class Branch {
 
         @Override
         Iterable<Path> getModifiedPaths() {
-            Iterable<Iterable<Path>> paths = transform(previous.values(),
-                    branchCommit -> branchCommit.getModifiedPaths());
-            return Iterables.concat(paths);
+            Iterable<Iterable<Path>> paths = transform(previous.values(), 
BranchCommit::getModifiedPaths);
+            return 
StreamUtils.toStream(paths).flatMap(StreamUtils::toStream).collect(Collectors.toSet());
         }
 
         /**
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
index bf66adb160..086f6c0829 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
@@ -51,7 +51,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.cache.Cache;
 import org.apache.jackrabbit.guava.common.collect.AbstractIterator;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
@@ -59,6 +62,7 @@ import org.apache.jackrabbit.guava.common.collect.Ordering;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.collections.DequeUtils;
+import org.apache.jackrabbit.oak.commons.collections.StreamUtils;
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.commons.json.JsopReader;
 import org.apache.jackrabbit.oak.commons.json.JsopTokenizer;
@@ -1816,7 +1820,8 @@ public final class NodeDocument extends Document {
                 }
             };
         } else {
-            changes = Iterables.concat(transform(List.copyOf(ranges), 
rangeToChanges::apply));
+            changes = StreamUtils.toStream(transform(List.copyOf(ranges), 
rangeToChanges::apply))
+                    
.flatMap(StreamUtils::toStream).collect(Collectors.toList());
         }
         return filter(changes, input -> 
!readRev.isRevisionNewer(input.getKey()));
     }
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java
index 1592397f8a..8dce4967b6 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/TieredDiffCache.java
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.cache.Cache;
 import org.apache.jackrabbit.guava.common.cache.CacheBuilder;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
@@ -95,7 +96,7 @@ class TieredDiffCache extends DiffCache {
     @NotNull
     @Override
     public Iterable<CacheStats> getStats() {
-        return Iterables.concat(localCache.getStats(), memoryCache.getStats());
+        return IterableUtils.chainedIterable(localCache.getStats(), 
memoryCache.getStats());
     }
 
     @Override
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
index c7664a1373..93d1ef095c 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/cache/NodeDocumentCache.java
@@ -33,6 +33,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.locks.Lock;
 import java.util.function.Predicate;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.cache.Cache;
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -324,14 +325,14 @@ public class NodeDocumentCache implements Closeable {
      * @return keys stored in cache
      */
     public Iterable<CacheValue> keys() {
-        return Iterables.concat(nodeDocumentsCache.asMap().keySet(), 
prevDocumentsCache.asMap().keySet());
+        return 
IterableUtils.chainedIterable(nodeDocumentsCache.asMap().keySet(), 
prevDocumentsCache.asMap().keySet());
     }
 
     /**
      * @return values stored in cache
      */
     public Iterable<NodeDocument> values() {
-        return Iterables.concat(nodeDocumentsCache.asMap().values(), 
prevDocumentsCache.asMap().values());
+        return 
IterableUtils.chainedIterable(nodeDocumentsCache.asMap().values(), 
prevDocumentsCache.asMap().values());
     }
 
     public Iterable<CacheStats> getCacheStats() {
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
index 1d6e535d78..1bd5d177d3 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
@@ -26,7 +26,6 @@ import static com.mongodb.client.model.Projections.include;
 import static com.mongodb.client.model.Sorts.ascending;
 import static java.util.Optional.empty;
 import static java.util.Optional.ofNullable;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.filter;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.transform;
 import static com.mongodb.client.model.Filters.and;
@@ -56,6 +55,7 @@ import java.util.regex.Pattern;
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoCursor;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
@@ -352,7 +352,7 @@ public class MongoVersionGCSupport extends VersionGCSupport 
{
                     .maxTime(15, TimeUnit.MINUTES).hint(hint),
                     input -> store.convertFromDBObject(NODES, input)),
                     input -> !isDefaultNoBranchSplitNewerThan(input, 
sweepRevs));
-            allResults = concat(allResults, iterable);
+            allResults = IterableUtils.chainedIterable(allResults, iterable);
         }
         return allResults;
     }
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java
index b3adab9788..1e545008bc 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.commons.properties.SystemPropertySupplier;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
@@ -160,7 +161,7 @@ public class RDBVersionGCSupport extends VersionGCSupport {
         final CountingPredicate<NodeDocument> cp1 = new 
CountingPredicate<NodeDocument>(name1, pred);
         final CountingPredicate<NodeDocument> cp2 = new 
CountingPredicate<NodeDocument>(name2, pred);
 
-        return CloseableIterable.wrap(Iterables.concat(Iterables.filter(fit1, 
cp1::test), Iterables.filter(fit2, cp2::test)),
+        return 
CloseableIterable.wrap(IterableUtils.chainedIterable(Iterables.filter(fit1, 
cp1::test), Iterables.filter(fit2, cp2::test)),
                 new Closeable() {
                     @Override
             public void close() throws IOException {
diff --git 
a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
 
b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
index 7e85eefb7a..035912f190 100644
--- 
a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
+++ 
b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugins.memory;
 
 import static java.util.Objects.requireNonNull;
 
-import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.filter;
 
 import static java.util.Collections.emptyList;
@@ -28,9 +27,11 @@ import static 
org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry.iter
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Set;
 import java.util.function.Predicate;
 
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.commons.collections.MapUtils;
 import org.apache.jackrabbit.oak.spi.state.AbstractNodeState;
@@ -163,9 +164,9 @@ public class ModifiedNodeState extends AbstractNodeState {
             final Set<String> keys = properties.keySet();
             Predicate<PropertyState> predicate =
                     x -> !keys.contains(x == null ? null : x.getName());
-            return concat(
+            return IterableUtils.chainedIterable(
                     filter(base.getProperties(), predicate::test),
-                    filter(properties.values(), x -> x != null));
+                    filter(properties.values(), Objects::nonNull));
         }
     }
 
@@ -213,7 +214,7 @@ public class ModifiedNodeState extends AbstractNodeState {
                 nodes = new HashMap<>(nodes);
             }
             final Set<String> keys = nodes.keySet(); 
-            return concat(
+            return IterableUtils.chainedIterable(
                     filter(base.getChildNodeNames(), x -> !keys.contains(x)),
                     MapUtils.filterValues(nodes, NodeState.EXISTS).keySet());
         }
@@ -346,7 +347,7 @@ public class ModifiedNodeState extends AbstractNodeState {
             final Set<String> keys = nodes.keySet();
             Predicate<ChildNodeEntry> predicate =
                     x -> !keys.contains(x == null ? null : x.getName());
-            return concat(
+            return IterableUtils.chainedIterable(
                     filter(base.getChildNodeEntries(), predicate::test),
                     iterable(MapUtils.filterValues(nodes, 
NodeState.EXISTS).entrySet()));
         }
diff --git 
a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/MoveTracker.java
 
b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/MoveTracker.java
index 5a4b47ebfa..3636adc260 100644
--- 
a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/MoveTracker.java
+++ 
b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/MoveTracker.java
@@ -20,6 +20,8 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+
+import org.apache.commons.collections4.IterableUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.collections.ListUtils;
@@ -88,7 +90,7 @@ public class MoveTracker {
 
     public boolean containsMove(@Nullable String path) {
         if (path != null) {
-            for (String p : Iterables.concat(parentSourcePaths, 
parentDestPaths)) {
+            for (String p : IterableUtils.chainedIterable(parentSourcePaths, 
parentDestPaths)) {
                 if (Text.isDescendantOrEqual(path, p)) {
                     return true;
                 }

Reply via email to