Welcome!

Weblogic Authors: Yeshim Deniz, Elizabeth White, Michael Meiner, Michael Bushong, Avi Rosenthal

Related Topics: Java IoT, Industrial IoT, Mobile IoT, Microservices Expo, IBM Cloud, Weblogic, Machine Learning

Java IoT: Article

Component Models in Java | Part 2

OSGi Component Model

OSGi is the latest component model to join the bandwagon of component models, which provides a platform for component oriented development and assembly. OSGi framework is a standards based platform whose specifications are provided by the OSGi Alliance (www.osgi.org, formerly OSGi was referred as Open Services Gateway Initiative). OSGi Alliance is an industry backed nonprofit organization which was founded in March 1999. The OSGi specification has gone through many releases and the current major version in use is 4 and version 5 has been introduced recently.

The OSGi defines a dynamic module system for Java. This offers help for Java's modularity problems by providing better control to the code structure, manage the lifecycle of the code and a complete loosely coupled approach that is much needed for component-oriented development.

The OSGi specification consists of two parts:

  • OSGi Framework
  • OSGi Standard services

The OSGi framework is the OSGi runtime environment that provides all the functionality as per the specifications. Applications are deployed and executed in the OSGi framework. The OSGi framework provides an API for the development of components. There are a number of framework implementations and some of the popular ones are Eclipse Equinox, Apache Felix and Knoplerfish. OSGi standard services define reusable services that should be provided as part of the development platform implementation. There are three conceptual layers in OSGi framework:

  • Module layer - Responsible for packaging and sharing code
  • Lifecycle layer - Responsible for managing the lifecycle of deployed module during runtime
  • Service layer - Responsible for dynamic service publication, searching and binding

OSGi Bundle
An OSGi bundle is a deployment module in the form of a JAR file. A module in OSGi parlance is known as a bundle. Bundles contain class files and resource files, similar to the regular JAR file in Java, but in addition they contain manifest information that contains metadata about the bundle. Apart from the regular JAR file's manifest contents, a bundle's manifest file has OSGi specific information such as module name, version number, dependencies, etc., thus giving better modularity and easy maintainability. Bundles are more powerful than JAR files in enforcing module boundaries, because a bundle needs to explicitly define what portion of its internal code is externally visible. Similarly, a bundle must explicitly declare any external dependencies that it has with the code exposed by other bundles. A bundle must have a unique identity - Bundle Name and Version.

The OSGi framework matches the exports and imports of deployed bundles to dynamically wire the entire application. This process of bundle resolution ensures consistency among the different bundles in terms of versions and other constraints. An application in OSGi is nothing but a collection of bundles with explicitly defined dependencies. A bundle is deployed in OSGi framework once it is developed.

OSGi Service Registry
The OSGi Service registry promotes service oriented programming. The service registry provides service publication service discovery and service binding. The bundles deployed in the OSGi framework can leverage the service registry later for publishing and consuming services. A bundle providing a service publishes the service in the OSGi Service Registry. A service is defined by a Java Interface, which represents a conceptual contract between the provider and consumer. A potential consumer can use the registry to search for providers of a particular service. Once if finds a service provider, it can bind and use the service. Services layer in OSGi facilitates one more level of dynamism other than bundles. Just as bundles can be added and removed in a running application, the Services can appear and go dynamically in a runtime application.

OSGi Component
As discussed earlier, a bundle is the deployment unit in OSGi component model. A bundle is a JAR file that contains:

  • Class files
  • Resource files
  • Manifest file (with additional metadata)

The class files are typically the interface and the implementation which constitutes the component. The manifest will have additional metadata as shown below:

Manifest-Version: 1.0

Bundle-ManifestVersion: 2

Bundle-Name: com.demo.helloWorld

Bundle-SymbolicName: com.demo.helloWorld

Bundle-Version: 1.0.0.qualifier

Bundle-Activator: com.demo.Activator

Bundle-Vendor: PIRAM

Bundle-RequiredExecutionEnvironment: JavaSE-1.7

Import-Package: org.osgi.framework;version="1.3.0"

Bundle-ActivationPolicy: lazy

The OSGi Framework provides an inbuilt API called BundleActivator which helps the bundle to hook its own lifecycle management. The BundleActivator interface has two methods - start() and stop() which are invoked when the bundle is started and stopped respectively. Any bundle can implement this interface to check its own life cycle. The bundle could perform actions as specified in the start and stop methods of the Activator class. The use of bundle as a component for building application on the OSGi framework does not just depend on the bundle doing the work whenever it is started or stopped. The bundle needs to be able to expose certain functionality as provided interfaces and it needs to consume functionalities as per the require interfaces. Thus a collection of bundles made into an assembly should be able to work together to form a system. Generally the provided interface will be created as a separate bundle and the implementations can be wired dynamically by the OSGi runtime from the implementation bundles. There can be more than one implementation, the wiring happens depending on the runtime.

Example to understand OSGi Component Model
The OSGi component model can be understood with the same shopping Cart example discussed in the earlier models.

Figure 3: OSGi Component Model - Cart Component Example

The Cart application in this example is created with the following bundles for better modularity and maintainability.

  1. Interface Bundle (com.online.shopping)
  2. Implementation Bundle (CartImpl)
  3. Client Bundle (CartClient)

The Cart component is comprised of interface bundle and implementation bundle. The interface bundle (com.online.shopping) defines an interface ICart. This interface will be used by the implementation bundle to invoke the exposed services. The client bundle will use the interface for invoking the required services which gets bounded to the implementation bundle by the service registry.

Interface Bundle
The interface bundle contains the interface ICart for the Cart component and is defined as below:

package com.online.shopping;

import java.util.Collection;

public interface ICart {
public void addItem(Product product, int quantity);
public Collection<Product> listItems();    
public double getTotalPrice();
public void clearCart();
}

This bundle has ONLY the interface and its helper class and it exports the com.online.shopping package as shown in the manifest file below:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CartIntf
Bundle-SymbolicName: CartIntf
Bundle-Version: 1.0.0.qualifier
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
Export-Package: com.online.shopping

The structure of the bundle jar file is as below:

Figure 4: Structure of Interface Bundle

Implementation Bundle
ICart interface is implemented by the class CartImpl, whose code as demonstrated below:

package com.online.shopping.impl;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import com.online.shopping.ICart;
import com.online.shopping.Product;

public class CartImpl implements ICart {
Map<Product, Integer> items = new HashMap<Product, Integer>();      

@Override
public void addItem(Product product, int quantity) {
if(items.containsKey(product)) {
quantity +=items.get(product);
}
items.put(product, quantity);
}

@Override

public Collection<Product> listItems() {

return items.keySet();

}

@Override
public double getTotalPrice() {
double totalPrice = 0;
for(Product product: items.keySet()) {
totalPrice+=product.getPrice()* items.get(product);           
}
return totalPrice;
}

@Override
public void clearCart() {
items.clear();
}

}

The CartImpl is the class in the implementation bundle that implements the ICart interface and provides the ICart service implementation. In the implementation bundle, the interface com.online.shopping.ICart is not added to the CLASSPATH, but imported by the OSGi framework. This bundle imports the interface bundle as explained in the MANIFEST.MF below:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CartImpl
Bundle-SymbolicName: CartImpl
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.online.shopping,
org.osgi.framework;version="1.6.0"
Service-Component: META-INF/component.xml

The implementation bundle is exposed as a declarative service component. From the manifest file, it is evident that the bundle is not exported as a package, but it is exposed as a service with the entry - Service-Component that this is exposed as a component and the component description is available in component.xml. With the help of such XML files, components declare their provided services. The OSGi framework helps to publish the CartImpl as a service in the OSGi service registry. The component.xml is as below:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="CartImpl">
<implementation class="com.online.shopping.impl.CartImpl"/>
<service>
<provide interface="com.online.shopping.ICart"/>
</service>
</scr:component>

The ICart is exposed as a service and the service is implemented by the CartImpl implementation class. Looking at the component.xml, it is clear that the component provides the ICart service. The component declares the implementation class and the provided interface. The declarative services in the OSGi framework publish the service at the execution time after the bundle is activated. The structure of the JAR file of the bundle is as follows:

Figure 5: Structure of Implementation Bundle

Client Bundle
The client bundle is supposed to consume the services exposed by the ICart service implementation and consume it. The client bundle is another component that imports the com.online.shopping package and consumes the service through OSGi service registry. The client bundle's manifest looks as below:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CartClient
Bundle-SymbolicName: CartClient
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.online.shopping,
org.osgi.framework;version="1.6.0",
org.osgi.service.component;version="1.1.0"
Service-Component: META-INF/component.xml

The client is also a component which consumes the services provided by the ICart component.

Figure 6: Structure of Client Bundle

The component.xml in client bundle has reference to the ICart service interface.

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="CartClient">
<implementation class="com.client.CartClient"/>
<reference bind="gotService" cardinality="1..1" interface="com.online.shopping.ICart" name="ICart" policy="dynamic" unbind="lostService"/>
</scr:component>

Apart from the interface reference, the component.xml also refers to some methods called ‘gotService' and ‘lostService' during binding and unbinding of service references. These are the methods defined in the client class which will be invoked with the associated service references into the service object. This allows the component to find out the services without retrieving them. The declarative specifications in OSGi framework defines the methods where the service reference will be injected. The component service policy may be static or dynamic. In static policy, the service reference is injected once and not changed until the component is deactivated. Where as in the dynamic policy, the component is notified whenever the service comes or goes utilizing the true dynamism. In the example, it is dynamic. The client invokes the ICart service as follows:

package com.client;

import java.util.Collection;

import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;

import com.online.shopping.ICart;
import com.online.shopping.Product;

public class CartClient {

ComponentContext context;
ServiceReference reference;
ICart cart;

public void activate(ComponentContext context) {
System.out.println("Activate Component");

if(reference!= null) {
cart = (ICart)context.locateService("ICart", reference);

Product product = new Product();
product.setName("OSGi");
product.setPrice(550.00);
cart.addItem(product, 20);

Product newProduct = new Product();
newProduct.setName("Enterprise OSGi");
newProduct.setPrice(400.00);
cart.addItem(newProduct, 10);

Collection<Product> productItems = cart.listItems();
for(Product items: productItems) {
System.out.println(items.getName()+"******"+ items.getPrice());             
}            

System.out.println("Total Price of Cart Items: "+cart.getTotalPrice());

cart.clearCart();
}

}

public void gotService(ServiceReference reference) {
System.out.println("Bind Service");
this.reference = reference;
}

public void lostService(ServiceReference reference) {
System.out.println("unbind Service");
this.reference = null;           
}

}

The client has defined three methods:

  • activate - part of declarative services API. This method is invoked when this component is activated. The ComponentContext is used to locate the ICart with the injected service reference.
  • gotService - user defined method as available in the component.xml, this method is invoked with the service reference (using dependency injection) when the service object is binded.
  • lostService - user defined method as mentioned in the client component.xml, this method is invoked with the injected service reference when the service object is unbinded.

Figure 7: Cart Component Bundles Deployment in OSGi Container

The client is not even aware of the implementation bundle. If there are multiple implementations available for the same service, the service is bounded dynamically by the environment. If there is any change in the implementation, only the implementation bundle will undergo change. A revised bundle can provide additional services which can be consumed by clients. So replacing components is easier and will not affect any other component. This way, OSGi gives good modularity by de-coupling components and a pluggable dynamic service model which are much needed features of a component model.

More Stories By Piram Manickam

Piram Manickam works at Infosys Limited. He would like to acknowledge and thank Sangeetha S, a beloved colleague and friend, for her invaluable contributions in this work.

More Stories By Subrahmanya SV

Subrahmanya SV works at Infosys Limited. He would like to acknowledge and thank Sangeetha S, a beloved colleague and friend, for her invaluable contributions in this work.

More Stories By S Sangeetha

S Sangeetha is a Senior Technical Architect at the E-Commerce Research Labs at Infosys Limited. She has over 15 years of experience in architecture, design and development of enterprise Java applications. She is also involved in enhancing the technical skills of Architects at Infosys. She has co-authored a book on ‘J2EE Architecture’ and also has written numerous articles on Java for various online Java forums like JavaWorld, java.net, DevX.com and internet.com. She can be reached at [email protected]

Comments (0)

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


@ThingsExpo Stories
SYS-CON Events announced today that T-Mobile will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. As America's Un-carrier, T-Mobile US, Inc., is redefining the way consumers and businesses buy wireless services through leading product and service innovation. The Company's advanced nationwide 4G LTE network delivers outstanding wireless experiences to 67.4 million customers who are unwilling to compromise on ...
With major technology companies and startups seriously embracing Cloud strategies, now is the perfect time to attend @CloudExpo | @ThingsExpo, June 6-8, 2017, at the Javits Center in New York City, NY and October 31 - November 2, 2017, Santa Clara Convention Center, CA. Learn what is going on, contribute to the discussions, and ensure that your enterprise is on the right path to Digital Transformation.
20th Cloud Expo, taking place June 6-8, 2017, at the Javits Center in New York City, NY, will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud strategy.
Data is an unusual currency; it is not restricted by the same transactional limitations as money or people. In fact, the more that you leverage your data across multiple business use cases, the more valuable it becomes to the organization. And the same can be said about the organization’s analytics. In his session at 19th Cloud Expo, Bill Schmarzo, CTO for the Big Data Practice at Dell EMC, introduced a methodology for capturing, enriching and sharing data (and analytics) across the organization...
Five years ago development was seen as a dead-end career, now it’s anything but – with an explosion in mobile and IoT initiatives increasing the demand for skilled engineers. But apart from having a ready supply of great coders, what constitutes true ‘DevOps Royalty’? It’ll be the ability to craft resilient architectures, supportability, security everywhere across the software lifecycle. In his keynote at @DevOpsSummit at 20th Cloud Expo, Jeffrey Scheaffer, GM and SVP, Continuous Delivery Busine...
With major technology companies and startups seriously embracing IoT strategies, now is the perfect time to attend @ThingsExpo 2016 in New York. Learn what is going on, contribute to the discussions, and ensure that your enterprise is as "IoT-Ready" as it can be! Internet of @ThingsExpo, taking place June 6-8, 2017, at the Javits Center in New York City, New York, is co-located with 20th Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry p...
SYS-CON Events announced today that Juniper Networks (NYSE: JNPR), an industry leader in automated, scalable and secure networks, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Juniper Networks challenges the status quo with products, solutions and services that transform the economics of networking. The company co-innovates with customers and partners to deliver automated, scalable and secure network...
New competitors, disruptive technologies, and growing expectations are pushing every business to both adopt and deliver new digital services. This ‘Digital Transformation’ demands rapid delivery and continuous iteration of new competitive services via multiple channels, which in turn demands new service delivery techniques – including DevOps. In this power panel at @DevOpsSummit 20th Cloud Expo, moderated by DevOps Conference Co-Chair Andi Mann, panelists will examine how DevOps helps to meet th...
SYS-CON Events announced today that Hitachi, the leading provider the Internet of Things and Digital Transformation, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Hitachi Data Systems, a wholly owned subsidiary of Hitachi, Ltd., offers an integrated portfolio of services and solutions that enable digital transformation through enhanced data management, governance, mobility and analytics. We help globa...
@GonzalezCarmen has been ranked the Number One Influencer and @ThingsExpo has been named the Number One Brand in the “M2M 2016: Top 100 Influencers and Brands” by Analytic. Onalytica analyzed tweets over the last 6 months mentioning the keywords M2M OR “Machine to Machine.” They then identified the top 100 most influential brands and individuals leading the discussion on Twitter.
SYS-CON Events announced today that Hitachi, the leading provider the Internet of Things and Digital Transformation, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Hitachi Data Systems, a wholly owned subsidiary of Hitachi, Ltd., offers an integrated portfolio of services and solutions that enable digital transformation through enhanced data management, governance, mobility and analytics. We help globa...
Most technology leaders, contemporary and from the hardware era, are reshaping their businesses to do software in the hope of capturing value in IoT. Although IoT is relatively new in the market, it has already gone through many promotional terms such as IoE, IoX, SDX, Edge/Fog, Mist Compute, etc. Ultimately, irrespective of the name, it is about deriving value from independent software assets participating in an ecosystem as one comprehensive solution.
NHK, Japan Broadcasting, will feature the upcoming @ThingsExpo Silicon Valley in a special 'Internet of Things' and smart technology documentary that will be filmed on the expo floor between November 3 to 5, 2015, in Santa Clara. NHK is the sole public TV network in Japan equivalent to the BBC in the UK and the largest in Asia with many award-winning science and technology programs. Japanese TV is producing a documentary about IoT and Smart technology and will be covering @ThingsExpo Silicon Val...
The explosion of new web/cloud/IoT-based applications and the data they generate are transforming our world right before our eyes. In this rush to adopt these new technologies, organizations are often ignoring fundamental questions concerning who owns the data and failing to ask for permission to conduct invasive surveillance of their customers. Organizations that are not transparent about how their systems gather data telemetry without offering shared data ownership risk product rejection, regu...
SYS-CON Events announced today that SoftLayer, an IBM Company, has been named “Gold Sponsor” of SYS-CON's 18th Cloud Expo, which will take place on June 7-9, 2016, at the Javits Center in New York, New York. SoftLayer, an IBM Company, provides cloud infrastructure as a service from a growing number of data centers and network points of presence around the world. SoftLayer’s customers range from Web startups to global enterprises.
Bert Loomis was a visionary. This general session will highlight how Bert Loomis and people like him inspire us to build great things with small inventions. In their general session at 19th Cloud Expo, Harold Hannon, Architect at IBM Bluemix, and Michael O'Neill, Strategic Business Development at Nvidia, discussed the accelerating pace of AI development and how IBM Cloud and NVIDIA are partnering to bring AI capabilities to "every day," on-demand. They also reviewed two "free infrastructure" pr...
SYS-CON Events announced today that Super Micro Computer, Inc., a global leader in compute, storage and networking technologies, will exhibit at SYS-CON's 20th International Cloud Expo®, which will take place on June 6-8, 2017, at the Javits Center in New York City, NY. Supermicro (NASDAQ: SMCI), the leading innovator in high-performance, high-efficiency server technology, is a premier provider of advanced server Building Block Solutions® for Data Center, Cloud Computing, Enterprise IT, Hadoop/...
Judith Hurwitz is president and CEO of Hurwitz & Associates, a Needham, Mass., research and consulting firm focused on emerging technology, including big data, cognitive computing and governance. She is co-author of the book Cognitive Computing and Big Data Analytics, published in 2015. Her Cloud Expo session, "What Is the Business Imperative for Cognitive Computing?" is scheduled for Wednesday, June 8, at 8:40 a.m. In it, she puts cognitive computing into perspective with its value to the busin...
NHK, Japan Broadcasting, will feature the upcoming @ThingsExpo Silicon Valley in a special 'Internet of Things' and smart technology documentary that will be filmed on the expo floor between November 3 to 5, 2015, in Santa Clara. NHK is the sole public TV network in Japan equivalent to the BBC in the UK and the largest in Asia with many award-winning science and technology programs. Japanese TV is producing a documentary about IoT and Smart technology and will be covering @ThingsExpo Silicon Val...
The 20th International Cloud Expo has announced that its Call for Papers is open. Cloud Expo, to be held June 6-8, 2017, at the Javits Center in New York City, brings together Cloud Computing, Big Data, Internet of Things, DevOps, Containers, Microservices and WebRTC to one location. With cloud computing driving a higher percentage of enterprise IT budgets every year, it becomes increasingly important to plant your flag in this fast-expanding business opportunity. Submit your speaking proposal ...