blob: 40894e3fe16d50e0ec1510b6370ff8116af9a841 [file] [log] [blame]
Thomas Vachuska24c849c2014-10-27 09:53:05 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
Thomas Vachuska24c849c2014-10-27 09:53:05 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska24c849c2014-10-27 09:53:05 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska24c849c2014-10-27 09:53:05 -070015 */
tom0eb04ca2014-08-25 14:34:51 -070016package org.onlab.osgi;
17
Ray Milkey816db102018-05-30 14:16:37 -070018import org.osgi.framework.Bundle;
tom0eb04ca2014-08-25 14:34:51 -070019import org.osgi.framework.BundleContext;
20import org.osgi.framework.FrameworkUtil;
tomcaf3bf72014-09-23 13:20:53 -070021import org.osgi.framework.ServiceReference;
tom0eb04ca2014-08-25 14:34:51 -070022
23/**
24 * Default implementation of the service directory using OSGi framework utilities.
25 */
26public class DefaultServiceDirectory implements ServiceDirectory {
tom0872a172014-09-23 11:24:26 -070027
28 /**
29 * Returns the reference to the implementation of the specified service.
30 *
31 * @param serviceClass service class
32 * @param <T> type of service
33 * @return service implementation
34 */
35 public static <T> T getService(Class<T> serviceClass) {
Ray Milkey816db102018-05-30 14:16:37 -070036 Bundle bundle = FrameworkUtil.getBundle(serviceClass);
37 if (bundle != null) {
38 BundleContext bc = bundle.getBundleContext();
39 if (bc != null) {
40 ServiceReference<T> reference = bc.getServiceReference(serviceClass);
41 if (reference != null) {
42 T impl = bc.getService(reference);
43 if (impl != null) {
44 return impl;
45 }
tomcaf3bf72014-09-23 13:20:53 -070046 }
47 }
tom0eb04ca2014-08-25 14:34:51 -070048 }
tomcaf3bf72014-09-23 13:20:53 -070049 throw new ServiceNotFoundException("Service " + serviceClass.getName() + " not found");
tom0eb04ca2014-08-25 14:34:51 -070050 }
tom0872a172014-09-23 11:24:26 -070051
52 @Override
53 public <T> T get(Class<T> serviceClass) {
54 return getService(serviceClass);
55 }
56
tom0eb04ca2014-08-25 14:34:51 -070057}