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 java.lang.reflect.InvocationTargetException;
23  import java.lang.reflect.Method;
24  
25  import org.jetbrains.annotations.NotNull;
26  import org.jetbrains.annotations.Nullable;
27  import org.osgi.framework.BundleContext;
28  import org.osgi.framework.ServiceReference;
29  import org.slf4j.Logger;
30  import org.slf4j.LoggerFactory;
31  
32  abstract class AbstractPredicateProviderWrapper implements PredicateProviderWrapper {
33  
34    private final ServiceReference<?> serviceReference;
35    private final BundleContext bundleContext;
36    private final Object service;
37    private Method getPredicateMethod;
38  
39    protected final Logger log = LoggerFactory.getLogger(getClass());
40  
41    AbstractPredicateProviderWrapper(ServiceReference<?> serviceReference, BundleContext bundleContext) {
42      this.serviceReference = serviceReference;
43      this.bundleContext = bundleContext;
44      service = bundleContext.getService(serviceReference);
45      if (service != null) {
46        try {
47          getPredicateMethod = service.getClass().getMethod("getPredicate", String.class);
48        }
49        catch (NoSuchMethodException | SecurityException ex) {
50          log.warn("Legacy PredicateProvider service does not implement expected method 'getPredicate(String)'.", ex);
51        }
52      }
53    }
54  
55    protected @Nullable Object getPredicateInternal(@NotNull String name) {
56      if (getPredicateMethod != null) {
57        try {
58          return getPredicateMethod.invoke(service, name);
59        }
60        catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
61          log.warn("Error calling 'getPredicate(String)' method.", ex);
62        }
63      }
64      return null;
65    }
66  
67    @Override
68    public void close() {
69      bundleContext.ungetService(serviceReference);
70    }
71  
72  }