View Javadoc
1   /*
2    * #%L
3    * wcm.io
4    * %%
5    * Copyright (C) 2025 wcm.io
6    * %%
7    * Licensed under the Apache License, Version 2.0 (the "License");
8    * you may not use this file except in compliance with the License.
9    * You may obtain a copy of the License at
10   *
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   * #L%
19   */
20  package io.wcm.wcm.ui.granite.util.impl;
21  
22  import org.apache.commons.collections4.Predicate;
23  import org.apache.sling.api.resource.Resource;
24  import org.jetbrains.annotations.NotNull;
25  import org.jetbrains.annotations.Nullable;
26  import org.osgi.framework.BundleContext;
27  import org.osgi.framework.ServiceReference;
28  
29  /**
30   * Wrapper for latest PredicateProvider implementation that returns java.util.function.Predicate.
31   */
32  class LatestPredicateProviderWrapper extends AbstractPredicateProviderWrapper {
33  
34    private static final String NODE_PREDICATE_INTERFACE = "com.day.cq.commons.predicates.NodePredicate";
35  
36    LatestPredicateProviderWrapper(ServiceReference<?> serviceReference, BundleContext bundleContext) {
37      super(serviceReference, bundleContext);
38    }
39  
40    @SuppressWarnings("unchecked")
41    @Override
42    public @Nullable Predicate<Resource> getPredicate(@NotNull String name) {
43      java.util.function.Predicate<Resource> predicate = (java.util.function.Predicate)getPredicateInternal(name);
44      if (predicate == null) {
45        return null;
46      }
47      if (isNodePredicate(predicate)) {
48        return new NodePredicateWrapper((java.util.function.Predicate)predicate)::test;
49      }
50      return predicate::test;
51    }
52  
53    /**
54     * Checks if the given predicate implementation implements the NodePredicate interface.
55     * @param obj Predicate implementation
56     * @return true if NodePredicate
57     */
58    private static boolean isNodePredicate(Object obj) {
59      for (Class<?> intf : obj.getClass().getInterfaces()) {
60        if (NODE_PREDICATE_INTERFACE.equals(intf.getName())) {
61          return true;
62        }
63      }
64      return false;
65    }
66  
67  }