1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 }