SlideShare uma empresa Scribd logo
1 de 47
OSGi on the Web: Here’s How Don Brown Atlassian
Raising the abstraction with Struts
Raising the abstraction with OSGi
Why we needed OSGi
One feature * five products =  Dashboard
Multiple teams across the globe Gda ń sk, Poland San Francisco, USA Kuala Lumpur, Malaysia Sydney, Australia
Plugin development slow ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Plugins break on product upgrade ,[object Object],[object Object]
OSGi in one slide ,[object Object],[object Object],[object Object],[object Object],[object Object]
Features written once ,[object Object],[object Object],[object Object]
Each team can “own” a bundle ,[object Object],[object Object],[object Object]
Dynamic deployment = faster dev cycle ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],. . . from code to browser in one or two seconds
Sandboxed plugins
Architecture options
Architecture: OSGi server ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Architecture: Embed OSGi via bridge ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Architecture: Embed OSGi via plugins ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Development experience ,[object Object],[object Object],[object Object],[object Object]
Services: What the tutorials show  ,[object Object],MovieFinder finder =  new  BasicMovieFinderImpl(); registration = context.registerService( MovieFinder. class .getName(), finder,  null ); ,[object Object],ServiceReference ref = bundleContext.getServiceReference( MovieFinder. class .getName()); MovieFinder finder = (MovieFinder)  bundleContext.getService(ref);
Services: The old school reality public class MovieFinderTracker extends ServiceTracker { private final MovieListerImpl lister = new MovieListerImpl(); private int finderCount = 0; private ServiceRegistration registration = null; public MovieFinderTracker(BundleContext context) { super(context, MovieFinder.class.getName(), null); } private boolean registering = false;  public Object addingService(ServiceReference reference) {  MovieFinder finder = (MovieFinder) context.getService(reference);  lister.bindFinder(finder);  synchronized(this) {  finderCount ++;  if (registering)  return finder;  registering = (finderCount == 1);  if (!registering)  return finder;  }  ServiceRegistration reg = context.registerService(  MovieLister.class.getName(), lister, null);  synchronized(this) {  registering = false;  registration = reg;  }  return finder;  }  public void removedService(ServiceReference reference, Object service) {  MovieFinder finder = (MovieFinder) service;  lister.unbindFinder(finder);  context.ungetService(reference);  ServiceRegistration needsUnregistration = null;  synchronized(this) {  finderCount --;  if (finderCount == 0) {  needsUnregistration = registration;  registration = null;  }  }  if(needsUnregistration != null) {  needsUnregistration.unregister();  }  }  }
Spring Dynamic Modules ,[object Object],[object Object],[object Object],< service   ref = &quot;beanToBeExported&quot;   interface = &quot;com.xyz.MyServiceInterface&quot; > < service-properties > < beans:entry   key = &quot;myOtherKey&quot;   value = &quot;aStringValue&quot; /> < beans:entry   key = &quot;aThirdKey&quot;   value-ref = &quot;beanToExposeAsProperty&quot; /> </ service-properties > </ service > < reference   id = &quot;asyncMessageService&quot;   interface = &quot;com.xyz.MessageService&quot; filter = &quot;(asynchronous-delivery=true)&quot; />
Peaberry using Guice ,[object Object],[object Object],[object Object],bind(export(StockQuote. class )).toProvider( service(myQuoteImpl).attributes(names( &quot;Currency=GBP&quot; )).export()); bind(StockQuote. class ).toProvider( service(StockQuote. class ).filter(ldap( &quot;(Currency=GBP)&quot; )).single());
Declarative Services ,[object Object],[object Object],[object Object],< component   name = ”stockQuote &quot; > < implementation   class = ”com.xyz.internal.MyStockQuote &quot; /> < service > < provide   interface = ”com.xyz.StockQuote &quot; /> </ service > < reference   name = &quot;RUNNABLE&quot; interface = &quot;java.lang.Runnable&quot; bind = &quot;setRunnable&quot; unbind = &quot;unsetRunnable&quot; cardinality = &quot;0..1&quot; policy = &quot;dynamic&quot; /> </ component >
Bundle packaging ,[object Object]
Using the bundle tool BND  ,[object Object],[object Object],< plugin > < groupId > org.apache.felix </ groupId > < artifactId > maven-bundle-plugin </ artifactId > < extensions > true </ extensions > < configuration > < instructions > < Export-Package > org.foo.myproject.api </ Export-Package > < Private-Package > org.foo.myproject.* </ Private-Package > < Bundle-Activator > org.foo.myproject.impl1.Activator </ Bundle-Activator > </ instructions > </ configuration > </ plugin >
SpringSource’s Bundlor ,[object Object],[object Object],Bundle-ManifestVersion : 2 Bundle-SymbolicName : org.springframework.binding Bundle-Name : Spring Binding Bundle-Vendor : SpringSource Import-Package : ognl;version =&quot;[2.6.9, 3.0.0)&quot;; resolution :=optional, org.jboss.el;version =&quot;[2.0.0, 3.0.0)&quot;; resolution :=optional Import-Template : org.springframework.*;version =&quot;[2.5.4.A, 3.0.0)&quot;, org.apache.commons.logging;version =&quot;[1.1.1, 2.0.0)&quot;, javax.el;version =&quot;[2.1.0, 3.0.0)&quot;; resolution :=optional
How we did it - Atlassian Plugins ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
One more thing - Minimal OSGi required ,[object Object]
Plugins architecture
Plugin descriptor ,[object Object],< atlassian-plugin   key = &quot;com.xyz.example&quot;   name = &quot;Example   Plugin ” plugins-version = “2” > < plugin-info > < description > A sample plugin </ description > < version > 1.0 </ version > < vendor   name = &quot;Atlassian&quot;   url = &quot;http://www.atlassian.com/&quot; /> </ plugin-info > < servlet   key = ”test &quot;   name = ”Test   Servlet &quot;   class = &quot;com.xyz.TestServlet&quot; > < description > An example servlet </ description > </ servlet > </ atlassian-plugin >
Available modules General Confluence JIRA Servlet Job Search Servlet filter Macro Custom field Link Theme Issue tab Link section Workflow Portlet REST (JAX-RS) Language pack RPC Component Editor Workflow Component import Event listener User format Module type RPC Report
Plugin descriptor - Hidden OSGi ,[object Object],<atlassian-plugin key= &quot;com.xyz.example&quot;   name= &quot;Example  Plugin” plugins-version= “2” > … < component   key = ”myComponent &quot;   class = &quot;com.xyz.MyComponent” public = “true” > < interface > com.xyz.Component </ interface > < / component > < component-import   key = ”otherComponent &quot;   interface = &quot;com.abc.OtherComponent”   /> </atlassian-plugin>
Plugin descriptor - Hidden OSGi ,[object Object],< beans   … > < bean   id = “myComponent   class = “com.xyz.MyComponent”   /> < osgi:service   id = “myComponent_service”   ref = “myComponent” interface = “com.xyz.Component”   /> < osgi:reference   id = “otherComponent &quot;   interface = &quot;com.abc.OtherComponent”   /> </ beans >
Plugin to bundle process ,[object Object],[object Object],[object Object],[object Object],[object Object]
DEMO: Using Atlassian Plugins http://atlassian.com/opensource
Lessons learned
Training key ,[object Object],[object Object],[object Object],[object Object],[object Object]
Be prepared for classloader hell ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Focus on development experience early ,[object Object],[object Object],[object Object],[object Object]
Deployment environments matter ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Takeaway:  ,[object Object]
Questions
Don Brown [email_address]

Mais conteúdo relacionado

Mais procurados

What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...
mfrancis
 
Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...
Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...
Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...
mfrancis
 

Mais procurados (19)

Modular Java applications with OSGi on Apache Karaf
Modular Java applications with OSGi on Apache KarafModular Java applications with OSGi on Apache Karaf
Modular Java applications with OSGi on Apache Karaf
 
OSGi Blueprint Services
OSGi Blueprint ServicesOSGi Blueprint Services
OSGi Blueprint Services
 
Use Case: Building OSGi Enterprise Applications (QCon 14)
Use Case: Building OSGi Enterprise Applications (QCon 14)Use Case: Building OSGi Enterprise Applications (QCon 14)
Use Case: Building OSGi Enterprise Applications (QCon 14)
 
Intro to OSGi
Intro to OSGiIntro to OSGi
Intro to OSGi
 
Apache, osgi and karaf par Guillaume Nodet
Apache, osgi and karaf par Guillaume NodetApache, osgi and karaf par Guillaume Nodet
Apache, osgi and karaf par Guillaume Nodet
 
Embrace Change - Embrace OSGi
Embrace Change - Embrace OSGiEmbrace Change - Embrace OSGi
Embrace Change - Embrace OSGi
 
CamelOne 2013 Karaf A-MQ Camel CXF Security
CamelOne 2013 Karaf A-MQ Camel CXF SecurityCamelOne 2013 Karaf A-MQ Camel CXF Security
CamelOne 2013 Karaf A-MQ Camel CXF Security
 
OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneider
 
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - David Bo...
 
Monitoring OSGi Applications with the Web Console - Carsten Ziegeler
Monitoring OSGi Applications with the Web Console - Carsten ZiegelerMonitoring OSGi Applications with the Web Console - Carsten Ziegeler
Monitoring OSGi Applications with the Web Console - Carsten Ziegeler
 
W-JAX 2011: OSGi with Apache Karaf
W-JAX 2011: OSGi with Apache KarafW-JAX 2011: OSGi with Apache Karaf
W-JAX 2011: OSGi with Apache Karaf
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
Java11 New Features
Java11 New FeaturesJava11 New Features
Java11 New Features
 
Discuss about java 9 with latest features
Discuss about java 9 with latest featuresDiscuss about java 9 with latest features
Discuss about java 9 with latest features
 
Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...
Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...
Aspecio - aspect-oriented programming meets the OSGi service model - Simon Ch...
 
Java 9 Modularity in Action
Java 9 Modularity in ActionJava 9 Modularity in Action
Java 9 Modularity in Action
 
Java 10 New Features
Java 10 New FeaturesJava 10 New Features
Java 10 New Features
 
GlassFish v3 Prelude Aquarium Paris
GlassFish v3 Prelude Aquarium ParisGlassFish v3 Prelude Aquarium Paris
GlassFish v3 Prelude Aquarium Paris
 
Step by step guide to create theme for liferay dxp 7
Step by step guide to create theme for liferay dxp 7Step by step guide to create theme for liferay dxp 7
Step by step guide to create theme for liferay dxp 7
 

Destaque

Security in OSGi applications: Robust OSGi Platforms, secure Bundles
Security in OSGi applications: Robust OSGi Platforms, secure BundlesSecurity in OSGi applications: Robust OSGi Platforms, secure Bundles
Security in OSGi applications: Robust OSGi Platforms, secure Bundles
Kai Hackbarth
 
OSGi Web Development in Action
OSGi Web Development in Action	OSGi Web Development in Action
OSGi Web Development in Action
OSGiUsers
 
Building LinkedIn's Next Generation Architecture with OSGi
Building LinkedIn's Next Generation  Architecture with OSGiBuilding LinkedIn's Next Generation  Architecture with OSGi
Building LinkedIn's Next Generation Architecture with OSGi
LinkedIn
 
Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)
Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)
Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)
Savita Marwal
 

Destaque (11)

Introduction to OSGi
Introduction to OSGiIntroduction to OSGi
Introduction to OSGi
 
Deep dive into OSGi Lifecycle Layer
Deep dive into OSGi Lifecycle LayerDeep dive into OSGi Lifecycle Layer
Deep dive into OSGi Lifecycle Layer
 
OSGi-enabled Java EE applications in GlassFish
OSGi-enabled Java EE applications in GlassFishOSGi-enabled Java EE applications in GlassFish
OSGi-enabled Java EE applications in GlassFish
 
Introduction To OSGi
Introduction To OSGiIntroduction To OSGi
Introduction To OSGi
 
Common Security Services. Consolidation patterns for legacy components - Stef...
Common Security Services. Consolidation patterns for legacy components - Stef...Common Security Services. Consolidation patterns for legacy components - Stef...
Common Security Services. Consolidation patterns for legacy components - Stef...
 
Security in OSGi applications: Robust OSGi Platforms, secure Bundles
Security in OSGi applications: Robust OSGi Platforms, secure BundlesSecurity in OSGi applications: Robust OSGi Platforms, secure Bundles
Security in OSGi applications: Robust OSGi Platforms, secure Bundles
 
Security Policy Enforcement for the OSGi Framework using Aspect-Oriented Pr...
Security Policy Enforcement for the OSGi Framework using Aspect-Oriented Pr...Security Policy Enforcement for the OSGi Framework using Aspect-Oriented Pr...
Security Policy Enforcement for the OSGi Framework using Aspect-Oriented Pr...
 
Why OSGi?
Why OSGi?Why OSGi?
Why OSGi?
 
OSGi Web Development in Action
OSGi Web Development in Action	OSGi Web Development in Action
OSGi Web Development in Action
 
Building LinkedIn's Next Generation Architecture with OSGi
Building LinkedIn's Next Generation  Architecture with OSGiBuilding LinkedIn's Next Generation  Architecture with OSGi
Building LinkedIn's Next Generation Architecture with OSGi
 
Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)
Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)
Payment and Settlement Systems(SWIFT,NEFT and Securities Cycle)
 

Semelhante a The Web on OSGi: Here's How

Declarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi StyleDeclarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi Style
Felix Meschberger
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 

Semelhante a The Web on OSGi: Here's How (20)

Cocoon OSGi CocoonGT2007
Cocoon OSGi CocoonGT2007Cocoon OSGi CocoonGT2007
Cocoon OSGi CocoonGT2007
 
Plugins 2.0: The Overview
Plugins 2.0: The OverviewPlugins 2.0: The Overview
Plugins 2.0: The Overview
 
Declarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi StyleDeclarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi Style
 
Declarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi StyleDeclarative Services - Dependency Injection OSGi Style
Declarative Services - Dependency Injection OSGi Style
 
Mastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium SuccessfullyMastering Test Automation: How To Use Selenium Successfully
Mastering Test Automation: How To Use Selenium Successfully
 
Apache Aries Blog Sample
Apache Aries Blog SampleApache Aries Blog Sample
Apache Aries Blog Sample
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0
 
JBUG 11 - Django-The Web Framework For Perfectionists With Deadlines
JBUG 11 - Django-The Web Framework For Perfectionists With DeadlinesJBUG 11 - Django-The Web Framework For Perfectionists With Deadlines
JBUG 11 - Django-The Web Framework For Perfectionists With Deadlines
 
Understanding Framework Architecture using Eclipse
Understanding Framework Architecture using EclipseUnderstanding Framework Architecture using Eclipse
Understanding Framework Architecture using Eclipse
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
 
OSGi with the Spring Framework
OSGi with the Spring FrameworkOSGi with the Spring Framework
OSGi with the Spring Framework
 
Introduction To Eclipse RCP
Introduction To Eclipse RCPIntroduction To Eclipse RCP
Introduction To Eclipse RCP
 
Rewriting a Plugin Architecture 3 Times to Harness the API Economy
Rewriting a Plugin Architecture 3 Times to Harness the API EconomyRewriting a Plugin Architecture 3 Times to Harness the API Economy
Rewriting a Plugin Architecture 3 Times to Harness the API Economy
 
Serverless in production, an experience report (JeffConf)
Serverless in production, an experience report (JeffConf)Serverless in production, an experience report (JeffConf)
Serverless in production, an experience report (JeffConf)
 
Dependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony ContainerDependency Injection, Zend Framework and Symfony Container
Dependency Injection, Zend Framework and Symfony Container
 
Moduarlity patterns with OSGi
Moduarlity patterns with OSGiModuarlity patterns with OSGi
Moduarlity patterns with OSGi
 
Ext Js
Ext JsExt Js
Ext Js
 
Declarative Services Dependency Injection OSGi style
Declarative Services Dependency Injection OSGi styleDeclarative Services Dependency Injection OSGi style
Declarative Services Dependency Injection OSGi style
 

Último

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 

The Web on OSGi: Here's How

  • 1. OSGi on the Web: Here’s How Don Brown Atlassian
  • 2.
  • 3.
  • 4.
  • 5.
  • 9. One feature * five products = Dashboard
  • 10. Multiple teams across the globe Gda ń sk, Poland San Francisco, USA Kuala Lumpur, Malaysia Sydney, Australia
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24. Services: The old school reality public class MovieFinderTracker extends ServiceTracker { private final MovieListerImpl lister = new MovieListerImpl(); private int finderCount = 0; private ServiceRegistration registration = null; public MovieFinderTracker(BundleContext context) { super(context, MovieFinder.class.getName(), null); } private boolean registering = false; public Object addingService(ServiceReference reference) { MovieFinder finder = (MovieFinder) context.getService(reference); lister.bindFinder(finder); synchronized(this) { finderCount ++; if (registering) return finder; registering = (finderCount == 1); if (!registering) return finder; } ServiceRegistration reg = context.registerService( MovieLister.class.getName(), lister, null); synchronized(this) { registering = false; registration = reg; } return finder; } public void removedService(ServiceReference reference, Object service) { MovieFinder finder = (MovieFinder) service; lister.unbindFinder(finder); context.ungetService(reference); ServiceRegistration needsUnregistration = null; synchronized(this) { finderCount --; if (finderCount == 0) { needsUnregistration = registration; registration = null; } } if(needsUnregistration != null) { needsUnregistration.unregister(); } } }
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 34.
  • 35. Available modules General Confluence JIRA Servlet Job Search Servlet filter Macro Custom field Link Theme Issue tab Link section Workflow Portlet REST (JAX-RS) Language pack RPC Component Editor Workflow Component import Event listener User format Module type RPC Report
  • 36.
  • 37.
  • 38.
  • 39. DEMO: Using Atlassian Plugins http://atlassian.com/opensource
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.