diff options
Diffstat (limited to 'framework/src/onos/utils/osgi')
7 files changed, 324 insertions, 0 deletions
diff --git a/framework/src/onos/utils/osgi/pom.xml b/framework/src/onos/utils/osgi/pom.xml new file mode 100644 index 00000000..7be6c69d --- /dev/null +++ b/framework/src/onos/utils/osgi/pom.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright 2014 Open Networking Laboratory + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onosproject</groupId> + <artifactId>onlab-utils</artifactId> + <version>1.3.0-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>onlab-osgi</artifactId> + <packaging>bundle</packaging> + + <description>ON.Lab OSGI utilities</description> + + <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + </dependency> + <dependency> + <groupId>org.onosproject</groupId> + <artifactId>onlab-junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + +</project> diff --git a/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java new file mode 100644 index 00000000..b3421485 --- /dev/null +++ b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java @@ -0,0 +1,53 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.osgi; + +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; + +/** + * Default implementation of the service directory using OSGi framework utilities. + */ +public class DefaultServiceDirectory implements ServiceDirectory { + + /** + * Returns the reference to the implementation of the specified service. + * + * @param serviceClass service class + * @param <T> type of service + * @return service implementation + */ + public static <T> T getService(Class<T> serviceClass) { + BundleContext bc = FrameworkUtil.getBundle(serviceClass).getBundleContext(); + if (bc != null) { + ServiceReference<T> reference = bc.getServiceReference(serviceClass); + if (reference != null) { + T impl = bc.getService(reference); + if (impl != null) { + return impl; + } + } + } + throw new ServiceNotFoundException("Service " + serviceClass.getName() + " not found"); + } + + @Override + public <T> T get(Class<T> serviceClass) { + return getService(serviceClass); + } + +} diff --git a/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/ServiceDirectory.java b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/ServiceDirectory.java new file mode 100644 index 00000000..f9ffed74 --- /dev/null +++ b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/ServiceDirectory.java @@ -0,0 +1,34 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.osgi; + +/** + * Simple abstraction of a service directory where service implementations can + * be found by the class name of the interfaces they provide. + */ +public interface ServiceDirectory { + + /** + * Returns implementation of the specified service class. + * + * @param serviceClass service class + * @param <T> type of service + * @return implementation class + * @throws ServiceNotFoundException if no implementation found + */ + <T> T get(Class<T> serviceClass); + +} diff --git a/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/ServiceNotFoundException.java b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/ServiceNotFoundException.java new file mode 100644 index 00000000..8b14227e --- /dev/null +++ b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/ServiceNotFoundException.java @@ -0,0 +1,46 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.osgi; + +/** + * Represents condition where some service is not found or not available. + */ +public class ServiceNotFoundException extends RuntimeException { + + /** + * Creates a new exception with no message. + */ + public ServiceNotFoundException() { + } + + /** + * Creates a new exception with the supplied message. + * @param message error message + */ + public ServiceNotFoundException(String message) { + super(message); + } + + /** + * Creates a new exception with the supplied message and cause. + * @param message error message + * @param cause cause of the error + */ + public ServiceNotFoundException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/package-info.java b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/package-info.java new file mode 100644 index 00000000..289c60a4 --- /dev/null +++ b/framework/src/onos/utils/osgi/src/main/java/org/onlab/osgi/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Facilities for building testable components in OSGi independent fashion. + */ +package org.onlab.osgi; diff --git a/framework/src/onos/utils/osgi/src/test/java/org/onlab/osgi/ComponentContextAdapter.java b/framework/src/onos/utils/osgi/src/test/java/org/onlab/osgi/ComponentContextAdapter.java new file mode 100644 index 00000000..0278ccd6 --- /dev/null +++ b/framework/src/onos/utils/osgi/src/test/java/org/onlab/osgi/ComponentContextAdapter.java @@ -0,0 +1,79 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.osgi; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.ComponentInstance; + +import java.util.Dictionary; + +/** + * Adapter implementation of OSGI component context. + */ +public class ComponentContextAdapter implements ComponentContext { + @Override + public Dictionary getProperties() { + return null; + } + + @Override + public Object locateService(String name) { + return null; + } + + @Override + public Object locateService(String name, ServiceReference reference) { + return null; + } + + @Override + public Object[] locateServices(String name) { + return new Object[0]; + } + + @Override + public BundleContext getBundleContext() { + return null; + } + + @Override + public Bundle getUsingBundle() { + return null; + } + + @Override + public ComponentInstance getComponentInstance() { + return null; + } + + @Override + public void enableComponent(String name) { + + } + + @Override + public void disableComponent(String name) { + + } + + @Override + public ServiceReference getServiceReference() { + return null; + } +} diff --git a/framework/src/onos/utils/osgi/src/test/java/org/onlab/osgi/TestServiceDirectory.java b/framework/src/onos/utils/osgi/src/test/java/org/onlab/osgi/TestServiceDirectory.java new file mode 100644 index 00000000..08089ada --- /dev/null +++ b/framework/src/onos/utils/osgi/src/test/java/org/onlab/osgi/TestServiceDirectory.java @@ -0,0 +1,46 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.osgi; + +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; + +/** + * Service directory implementation suitable for testing. + */ +@SuppressWarnings("unchecked") +public class TestServiceDirectory implements ServiceDirectory { + + private ClassToInstanceMap<Object> services = MutableClassToInstanceMap.create(); + + @Override + public <T> T get(Class<T> serviceClass) { + return services.getInstance(serviceClass); + } + + /** + * Adds a new service to the directory. + * + * @param serviceClass service class + * @param service service instance + * @return self + */ + public TestServiceDirectory add(Class serviceClass, Object service) { + services.putInstance(serviceClass, service); + return this; + } + +} |