SlideShare a Scribd company logo
1 of 22
Download to read offline
OSGi and Spring Data 
for simple (Web) Application 
Development 
Christian Baranowski 
Content of my talk in a sentence 
„Java development with Bndtools and bnd is so much fun!“ 
My Talk in three Words - „Bndtools is cool!“
Bndtools 
Easy, powerful and productive way to develop 
OSGi applications. Based on bnd and Eclipse. 
http://bndtools.org/ 
„Development should be fun, so you need the right tools!“
enRoute 
• Getting started with OSGi → enRoute project 
http://enroute.osgi.org/ 
• The talk is based on the ideas from the enRoute blog demo 
project 
• enRoute OSGi blog sample project by Peter Kriens 
https://github.com/osgi/osgi.enroute.blog/ 
• Step by step tutorial from Peter Kriens 
http://goo.gl/Y569g5 
• Last OSGi Code Camp (Ludwigsburg 2013) was based on this 
step by step tutorial
Running Blog Example 
OSGi Framework 
(Equinox) 
MySQL 
… 
HTTP Server 
(Jetty) 
JPA 
(EclipseLink) 
Web Browser 
(IE, FF, Chrome, Safarie..) 
HTTP / 80 
simple.web.blog.web 
simple.web.blog.data 
MySQL JDBC / 3306 
Web Layer 
Persistence Layer
Persistence Layer (JPA) 
simple.web.blog 
.configuration 
Configuration extender" 
configuration/*.yaml 
javax.persistence.EntityManagerFactory" 
osgi.unit.name: Blog 
…jdbc.DataSourceFactory …cm.ConfigurationAdmin 
Eclipse Gemini 
dbaccess mysql 
osgi.configuration.yaml 
…cm.ManagedServiceFactory" 
Service PID: gemini.jpa.punit 
Apache Felix" 
Config Admin 
simple.web.blog.data 
Eclipse Gemini 
JPA 
JPA extender create service" 
javax.persistence.EntityManagerFactory 
Bundle Manifest contains" 
Meta-Persistence header 
org.eclipse.persistence.jpa com.mysql.jdbc 
org.yaml.snakeyaml
Spring Data Extender 
register the dynamic implementation of the service 
osgi.jpa.springdata 
… 
JPA-Repositories: 
sample.webapp.data.BlogRepository 
… 
provider 
MANIFEST.MF 
Extender for JPA Repositories 
public interface BlogRepository extends JpaRepository<Blog, Long> { 
! 
List<Blog> findByTitleContaining(String part); 
! 
} 
consumer 
@Entity 
public class Blog { 
@Id 
@GeneratedValue 
public Long id; 
public String title; 
public String content; 
} 
extender looks for bundles with " 
JPA-Repositories headers
Simple Transaction Management 
provider 
Service 
Registry 
setup a proxy service with the transaction logic 
@Reference(target = isTransactionalService) 
public void setService(Service srv) 
transactional.service = true requieres.tx.mgnt = true 
consumer osgi.jpa.tx 
Whiteboard for services which has a " 
requires.tx.mgnt service property 
Proxy " 
Service 
if (tx.isTransactionOpen()) { 
return method.invoke(bundleContext.getService(serviceReference), args); 
} 
try { 
tx.begin(); 
Object result = method.invoke(bundleContext.getService(serviceReference), args); 
tx.commit(); 
return result; 
} catch (Exception exp) { 
tx.rollback(); 
throw exp; 
} finally { 
bundleContext.ungetService(txMgrServiceReference); 
}
Spock based OSGi Integration Tests 
osgi.jpa.springdata 
simple.web.blog" 
.data 
Extender for JPA Repositories 
simple.web.blog.data.tests osgi.jpa.tx 
requieres.tx.mgnt = true 
transactional.service = true 
class BlogRepositorySpec extends Specification { 
! 
@OSGiService 
BlogRepository blogRepository 
def setup() { 
blogRepository.deleteAll() 
blogRepository.save(new Blog(title: 'OSGi Web Dev')) 
blogRepository.save(new Blog(title: 'OSGi V.S Java EE')) 
} 
def findBlogPostByTitleContainingOSGi() { 
when: 
def list = blogRepository.findByTitleContaining("OSGi") 
then: 
list.size() == 2 
} 
}
Web Layer 
https://github.com/alrra/browser-logos
Jersey MVC (Server Side Web-App) 
Handlebars View (list.hbs): 
<html> 
<head> 
{{#resource type="css"}} /css/app.css {{/resource}} 
</head> 
<body> 
<table class="table table-striped"> 
<thead> 
<th>#id</th><th>Title</th><th>Content</th><th></th> 
</thead> 
{{#html-table-content columns="id, title, content" resource="blog"}} 
{{/html-table-content}} 
</table> 
{{#html-pagination}} {{/html-pagination}} 
</body> 
</html> 
! 
@GET 
@Produces( MediaType.TEXT_HTML ) 
@Template(name="list.hbs") 
public Page<Blog> list( 
@QueryParam("page") @DefaultValue("0") Integer page, 
@QueryParam("size") @DefaultValue("10") Integer size) { 
return blogRepository.findAll(new PageRequest(page, size)); 
} 
com.github.jknack." 
handlebars 
Controller Method 
return the model 
Controller (BlogController): 
Handlebars " 
Helpers 
osgi-jax-rs-connector
Handlebars Helpers 
… 
osgi.web.templates" 
.handlebars.helpers 
com.github.jknack.handlebars.Helper" 
name = … 
…Helper" 
name=html-pagination 
Whiteboard for 
Helpers 
…Helper" 
name=html-table-content 
<thead> 
<th>#id</th><th>Title</th><th>Content</th><th></th> 
</thead> 
{{#html-table-content columns="id, title, content" resource="blog"}} 
{{/html-table-content}} 
osgi.web.templates" 
.handlebars 
org.glassfish.jersey.server.mvc.spi." 
TemplateProcessor<String> 
Whiteboard for " 
JAX-RS Provides 
osgi-jax-rs-connector 
Extend templates and provide components for the HTML UI
Static Web Bundles 
<html> 
<head> 
{{#resource type="css"}} 
/css/app.css 
{{/resource}} 
</head> 
OSGi way of web dependency management 
for CSS or JavaScript frameworks 
simple.web.blog.web osgi.web.bootstrap 
MANIFEST.MF MANIFEST.MF 
Require-Capability:  
bootstrap.css; 
filter:="(&(version>=3.1.1)(!(version>=4.0.0)))" 
Provide-Capability:  
bootstrap.css; 
version:Version=3.1.1; 
type=css 
@Requieres.Bootstrap 
@Component 
@Path("/products") 
public class BlogController 
More details see 
aQute.bnd.annotation.headers.RequireCapability" 
or" 
aQute.bnd.annotation.headers.ProvideCapability! 
bnd annotations.
Modern Web Applications 
HTTP / 8080 
REST Resource (API)" 
JSON 
UI 
business logic" 
data access logic 
HTML5" 
JavaScript (CoffeScript, …)" 
CSS3 (SASS, LESS, ..) 
JAVA 8" 
OSGi
Web Bundle build with Yeoman Grunt Bower 
yeoman Grunt bower 
• Scaffolding tool for webapps" 
• Yeoman helps kickstart new projects" 
• provide a generator ecosystem 
http://yeoman.io/ 
• JavaScript Task Runner " 
• Grunt ecosystem is huge" 
• minification, compilation, unit 
testing, linting, … 
http://gruntjs.com/ 
• package manager for the web" 
• solution to the problem of front-end 
package management" 
• ecosystem is huge 
http://bower.io/ 
Thats the tool chain web developers love…
Building Web Applications 
HTTP / 8080 
REST Resource (API)" 
JSON 
UI 
business logic" 
data access logic 
HTML5" 
JavaScript (CoffeScript, …)" 
CSS3 (SASS, LESS, ..) 
JAVA 8" 
OSGi 
yeomen, grunt, bower 
bndtools 
Gradle, tests and builds the OSGi and the Web application 
Web Developers 
Java Developers (OSGi)
AngularJS REST Consumer (Client) 
$blogResource (REST Consumer) 
! 
angular.module('blogApp') 
.factory('$blogResource', ['$resource', function($resource) { 
return $resource( '/rest/blog/:postId', { postId: '@postId' }, { }); 
}]); 
MainCtrl (the controller is using the REST resource to delete a blog entry) 
angular.module('blogApp') 
.controller('MainCtrl', ['$scope','$blogResource', function($scope, $blogResource) { 
$scope.posts = $blogResource.query(); 
$scope.deletePost = function(post) { 
$blogResource.delete({postId: post.id}).$promise.then(function() { 
$scope.posts = $blogResource.query(); 
}); 
}; 
}]);
REST Resource (JAX-RS) Provider 
@Component 
@Path("/rest/blog") 
public class BlogResource implements Resource { 
! 
BlogRepository blogRepository; 
! 
@Reference(target = isTransactionalService) 
public void setBlogRepository(BlogRepository blogRepository) { … } 
@GET 
public List<Blog> query() { return blogRepository.findAll(); } 
@GET 
@Path("/{id}") 
public Blog get(@PathParam("id") Long id) { return blogRepository.getOne(id); } 
@POST 
public void post(Blog blog) { blogRepository.save(blog); } 
@DELETE 
@Path("/{id}") 
public void delete(@PathParam("id") Long id) { blogRepository.delete(id); } 
} 
A REST Resource build in standard and flexible way based on JAX-RS
Integration Testing REST Resources 
simple.web.blog.web.tests 
simple.web.blog.data.BlogRepository" 
transactional.service = true 
simple.web.blog.web 
class BlogResourceSpec extends Specification { 
! 
@OSGiServiceRegistration(properties=["transactional.service = true"]) 
BlogRepository mockBlogRepository = Mock(BlogRepository) 
def getProductsByExistingId() { 
given: 
mockBlogRepository.findOne(42) >> new Blog(title: 'OSGi in Action', content: '-') 
when: 
Client client = ClientBuilder.newClient(); 
Response response = client 
.target("http://localhost:8080") 
.path("halres").path("blog").path("42").request().get(); 
then: 
response.status == Status.OK.statusCode 
} 
HTTP / 80
Testing AngularJS Controllers 
// Initialize the controller and a mock scope 
beforeEach(inject(function ($controller, $rootScope, $injector) { 
scope = $rootScope.$new(); 
$httpBackend = $injector.get('$httpBackend'); 
$httpBackend.expect('GET', '/rest/blog').respond([{id: 1}, {id: 42}]); 
MainCtrl = $controller('MainCtrl', { 
$scope: scope 
}); 
})); 
it('should send a request to delete a blog post', function () { 
$httpBackend.expect('DELETE', '/rest/blog/42').respond(200, 'success'); 
$httpBackend.expect('GET', '/rest/blog').respond([{id: 1}]); 
scope.deletePost({id: 42}); 
$httpBackend.flush(); 
expect(scope.posts.toString()).toBe([{id: 1}].toString()); 
});
Technologie Stack 
• Modern Web-Application OSGi Stack 
• AngularJS (Superheroic JavaScript Framework) 
https://angularjs.org/ 
• Jetty (Web Server) 
https://www.eclipse.org/jetty/ 
• osgi-jax-rs-connector (Jersey) 
https://github.com/hstaudacher/osgi-jax-rs-connector 
• Spring Data JPA (for simple JPA Services) 
http://projects.spring.io/spring-data-jpa/ 
• Spock (testing and specification framework) 
https://code.google.com/p/spock/ 
• Eclipse Equinox or Apache Felix as powerful OSGi Framework
Feedback 
„Erik Meijer: 
Are you saying you cannot write large programs in Java? 
Anders Hejlsberg: 
No, you can write large programs in Java. 
You just can’t maintain them. „ 
Quelle - http://t.co/Uw2iglqf 
Compose small “applications” (modules) 
in to large systems. 
Quelle - http://t.co/Uw2iglqf
Resources 
• OSGi Simple Blog App (Source, Slides) 
https://github.com/tux2323/simple.web.blog

More Related Content

What's hot

Go Fullstack: JSF for Public Sites (CONFESS 2012)
Go Fullstack: JSF for Public Sites (CONFESS 2012)Go Fullstack: JSF for Public Sites (CONFESS 2012)
Go Fullstack: JSF for Public Sites (CONFESS 2012)Michael Kurz
 
Java Web Programming [9/9] : Web Application Security
Java Web Programming [9/9] : Web Application SecurityJava Web Programming [9/9] : Web Application Security
Java Web Programming [9/9] : Web Application SecurityIMC Institute
 
Elasticsearch for SQL Users
Elasticsearch for SQL UsersElasticsearch for SQL Users
Elasticsearch for SQL UsersAll Things Open
 
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Ayes Chinmay
 
Developing node-mdb: a Node.js - based clone of SimpleDB
Developing node-mdb: a Node.js - based clone of SimpleDBDeveloping node-mdb: a Node.js - based clone of SimpleDB
Developing node-mdb: a Node.js - based clone of SimpleDBRob Tweed
 
HTML5 JavaScript APIs
HTML5 JavaScript APIsHTML5 JavaScript APIs
HTML5 JavaScript APIsRemy Sharp
 
Rest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsRest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsCarol McDonald
 
Java web programming
Java web programmingJava web programming
Java web programmingChing Yi Chan
 
Effiziente Datenpersistierung mit JPA 2.1 und Hibernate
Effiziente Datenpersistierung mit JPA 2.1 und HibernateEffiziente Datenpersistierung mit JPA 2.1 und Hibernate
Effiziente Datenpersistierung mit JPA 2.1 und HibernateThorben Janssen
 
Design and Development performance considerations
Design and Development performance considerationsDesign and Development performance considerations
Design and Development performance considerationsElaine Van Bergen
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node jsfakedarren
 
The Big Picture and How to Get Started
The Big Picture and How to Get StartedThe Big Picture and How to Get Started
The Big Picture and How to Get Startedguest1af57e
 
Building Your First Application with MongoDB
Building Your First Application with MongoDBBuilding Your First Application with MongoDB
Building Your First Application with MongoDBMongoDB
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackGaryCoady
 
Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014Brian Cavalier
 

What's hot (20)

Go Fullstack: JSF for Public Sites (CONFESS 2012)
Go Fullstack: JSF for Public Sites (CONFESS 2012)Go Fullstack: JSF for Public Sites (CONFESS 2012)
Go Fullstack: JSF for Public Sites (CONFESS 2012)
 
Java Web Programming [9/9] : Web Application Security
Java Web Programming [9/9] : Web Application SecurityJava Web Programming [9/9] : Web Application Security
Java Web Programming [9/9] : Web Application Security
 
Elasticsearch for SQL Users
Elasticsearch for SQL UsersElasticsearch for SQL Users
Elasticsearch for SQL Users
 
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
 
Developing node-mdb: a Node.js - based clone of SimpleDB
Developing node-mdb: a Node.js - based clone of SimpleDBDeveloping node-mdb: a Node.js - based clone of SimpleDB
Developing node-mdb: a Node.js - based clone of SimpleDB
 
HTML5 JavaScript APIs
HTML5 JavaScript APIsHTML5 JavaScript APIs
HTML5 JavaScript APIs
 
Rest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsRest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.js
 
Java web programming
Java web programmingJava web programming
Java web programming
 
Presentation
PresentationPresentation
Presentation
 
Geotalk presentation
Geotalk presentationGeotalk presentation
Geotalk presentation
 
Effiziente Datenpersistierung mit JPA 2.1 und Hibernate
Effiziente Datenpersistierung mit JPA 2.1 und HibernateEffiziente Datenpersistierung mit JPA 2.1 und Hibernate
Effiziente Datenpersistierung mit JPA 2.1 und Hibernate
 
Design and Development performance considerations
Design and Development performance considerationsDesign and Development performance considerations
Design and Development performance considerations
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node js
 
Microservices/dropwizard
Microservices/dropwizardMicroservices/dropwizard
Microservices/dropwizard
 
The Big Picture and How to Get Started
The Big Picture and How to Get StartedThe Big Picture and How to Get Started
The Big Picture and How to Get Started
 
Building Your First Application with MongoDB
Building Your First Application with MongoDBBuilding Your First Application with MongoDB
Building Your First Application with MongoDB
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014Differential Sync and JSON Patch @ SpringOne2GX 2014
Differential Sync and JSON Patch @ SpringOne2GX 2014
 
Jsp
JspJsp
Jsp
 
AngularJS By Vipin
AngularJS By VipinAngularJS By Vipin
AngularJS By Vipin
 

Viewers also liked

Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBMongoDB
 
Developing services in a Service Oriented Architecture for EAs
Developing services in a Service Oriented Architecture for EAsDeveloping services in a Service Oriented Architecture for EAs
Developing services in a Service Oriented Architecture for EAsPablo García Sánchez
 
A Service Oriented Architecture for EAs: applications and first results
A Service Oriented Architecture for EAs: applications and first resultsA Service Oriented Architecture for EAs: applications and first results
A Service Oriented Architecture for EAs: applications and first resultsPablo García Sánchez
 
Lessons learned from a large scale OSGi web app
Lessons learned from a large scale OSGi web appLessons learned from a large scale OSGi web app
Lessons learned from a large scale OSGi web appPaul Bakker
 
RESTful OSGi middleware for NoSQL databases with Docker
RESTful OSGi middleware for NoSQL databases with DockerRESTful OSGi middleware for NoSQL databases with Docker
RESTful OSGi middleware for NoSQL databases with DockerBertrand Delacretaz
 
Service Oriented Architecture for Adaptive Evolutionary Algorithms
Service Oriented Architecture for Adaptive Evolutionary AlgorithmsService Oriented Architecture for Adaptive Evolutionary Algorithms
Service Oriented Architecture for Adaptive Evolutionary AlgorithmsPablo García Sánchez
 
Moduarlity patterns with OSGi
Moduarlity patterns with OSGiModuarlity patterns with OSGi
Moduarlity patterns with OSGiPaul Bakker
 

Viewers also liked (13)

Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDB
 
Developing services in a Service Oriented Architecture for EAs
Developing services in a Service Oriented Architecture for EAsDeveloping services in a Service Oriented Architecture for EAs
Developing services in a Service Oriented Architecture for EAs
 
A Service Oriented Architecture for EAs: applications and first results
A Service Oriented Architecture for EAs: applications and first resultsA Service Oriented Architecture for EAs: applications and first results
A Service Oriented Architecture for EAs: applications and first results
 
Lessons learned from a large scale OSGi web app
Lessons learned from a large scale OSGi web appLessons learned from a large scale OSGi web app
Lessons learned from a large scale OSGi web app
 
RESTful OSGi middleware for NoSQL databases with Docker
RESTful OSGi middleware for NoSQL databases with DockerRESTful OSGi middleware for NoSQL databases with Docker
RESTful OSGi middleware for NoSQL databases with Docker
 
Service Oriented Architecture for Adaptive Evolutionary Algorithms
Service Oriented Architecture for Adaptive Evolutionary AlgorithmsService Oriented Architecture for Adaptive Evolutionary Algorithms
Service Oriented Architecture for Adaptive Evolutionary Algorithms
 
Moduarlity patterns with OSGi
Moduarlity patterns with OSGiModuarlity patterns with OSGi
Moduarlity patterns with OSGi
 
OSGi with the Spring Framework
OSGi with the Spring FrameworkOSGi with the Spring Framework
OSGi with the Spring Framework
 
Osgiliath cusl coffee
Osgiliath cusl coffeeOsgiliath cusl coffee
Osgiliath cusl coffee
 
Resumen #5Hackathon
Resumen #5HackathonResumen #5Hackathon
Resumen #5Hackathon
 
OSGiLiath + Processing
OSGiLiath + ProcessingOSGiLiath + Processing
OSGiLiath + Processing
 
Final Concursol SL Local #UGR
Final Concursol SL Local #UGRFinal Concursol SL Local #UGR
Final Concursol SL Local #UGR
 
Hackathon2014
Hackathon2014 Hackathon2014
Hackathon2014
 

Similar to OSGi and Spring Data for simple (Web) Application Development - Christian Baranowski

Going Serverless with Azure Functions
Going Serverless with Azure FunctionsGoing Serverless with Azure Functions
Going Serverless with Azure FunctionsShahed Chowdhuri
 
WordPress as the Backbone(.js)
WordPress as the Backbone(.js)WordPress as the Backbone(.js)
WordPress as the Backbone(.js)Beau Lebens
 
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
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
Nuxeo - OpenSocial
Nuxeo - OpenSocialNuxeo - OpenSocial
Nuxeo - OpenSocialThomas Roger
 
Javascript frameworks: Backbone.js
Javascript frameworks: Backbone.jsJavascript frameworks: Backbone.js
Javascript frameworks: Backbone.jsSoós Gábor
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationAndrew Rota
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutionswoutervugt
 
MongoDB Days Silicon Valley: Building Applications with the MEAN Stack
MongoDB Days Silicon Valley: Building Applications with the MEAN StackMongoDB Days Silicon Valley: Building Applications with the MEAN Stack
MongoDB Days Silicon Valley: Building Applications with the MEAN StackMongoDB
 
Single Page Applications on JavaScript and ASP.NET MVC4
Single Page Applications on JavaScript and ASP.NET MVC4Single Page Applications on JavaScript and ASP.NET MVC4
Single Page Applications on JavaScript and ASP.NET MVC4Yuriy Shapovalov
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Againjonknapp
 
JavaScript front end performance optimizations
JavaScript front end performance optimizationsJavaScript front end performance optimizations
JavaScript front end performance optimizationsChris Love
 
Html5 and web technology update
Html5 and web technology updateHtml5 and web technology update
Html5 and web technology updateDoug Domeny
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWAREFIWARE
 
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...SPTechCon
 
Course CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.jsCourse CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.jsVinícius de Moraes
 

Similar to OSGi and Spring Data for simple (Web) Application Development - Christian Baranowski (20)

Going Serverless with Azure Functions
Going Serverless with Azure FunctionsGoing Serverless with Azure Functions
Going Serverless with Azure Functions
 
Angular beans
Angular beansAngular beans
Angular beans
 
WordPress as the Backbone(.js)
WordPress as the Backbone(.js)WordPress as the Backbone(.js)
WordPress as the Backbone(.js)
 
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...
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Nuxeo - OpenSocial
Nuxeo - OpenSocialNuxeo - OpenSocial
Nuxeo - OpenSocial
 
Javascript frameworks: Backbone.js
Javascript frameworks: Backbone.jsJavascript frameworks: Backbone.js
Javascript frameworks: Backbone.js
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutions
 
MongoDB Days Silicon Valley: Building Applications with the MEAN Stack
MongoDB Days Silicon Valley: Building Applications with the MEAN StackMongoDB Days Silicon Valley: Building Applications with the MEAN Stack
MongoDB Days Silicon Valley: Building Applications with the MEAN Stack
 
Single Page Applications on JavaScript and ASP.NET MVC4
Single Page Applications on JavaScript and ASP.NET MVC4Single Page Applications on JavaScript and ASP.NET MVC4
Single Page Applications on JavaScript and ASP.NET MVC4
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
 
JavaScript front end performance optimizations
JavaScript front end performance optimizationsJavaScript front end performance optimizations
JavaScript front end performance optimizations
 
End-to-end testing with geb
End-to-end testing with gebEnd-to-end testing with geb
End-to-end testing with geb
 
Html5 and web technology update
Html5 and web technology updateHtml5 and web technology update
Html5 and web technology update
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
 
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
 
Course CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.jsCourse CodeSchool - Shaping up with Angular.js
Course CodeSchool - Shaping up with Angular.js
 
Azure F#unctions
Azure F#unctionsAzure F#unctions
Azure F#unctions
 

More from mfrancis

Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...
Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...
Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...mfrancis
 
OSGi and Java 9+ - BJ Hargrave (IBM)
OSGi and Java 9+ - BJ Hargrave (IBM)OSGi and Java 9+ - BJ Hargrave (IBM)
OSGi and Java 9+ - BJ Hargrave (IBM)mfrancis
 
Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)
Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)
Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)mfrancis
 
OSGi for the data centre - Connecting OSGi to Kubernetes - Frank Lyaruu
OSGi for the data centre - Connecting OSGi to Kubernetes - Frank LyaruuOSGi for the data centre - Connecting OSGi to Kubernetes - Frank Lyaruu
OSGi for the data centre - Connecting OSGi to Kubernetes - Frank Lyaruumfrancis
 
Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...
Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...
Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...mfrancis
 
OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...
OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...
OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...mfrancis
 
A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...
A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...
A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...mfrancis
 
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)mfrancis
 
Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...
Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...
Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...mfrancis
 
OSGi CDI Integration Specification - Ray Augé (Liferay)
OSGi CDI Integration Specification - Ray Augé (Liferay)OSGi CDI Integration Specification - Ray Augé (Liferay)
OSGi CDI Integration Specification - Ray Augé (Liferay)mfrancis
 
How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...
How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...
How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...mfrancis
 
Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...
Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...
Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...mfrancis
 
It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...
It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...
It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...mfrancis
 
Popular patterns revisited on OSGi - Christian Schneider (Adobe)
Popular patterns revisited on OSGi - Christian Schneider (Adobe)Popular patterns revisited on OSGi - Christian Schneider (Adobe)
Popular patterns revisited on OSGi - Christian Schneider (Adobe)mfrancis
 
Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)
Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)
Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)mfrancis
 
OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)
OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)
OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)mfrancis
 
Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...
Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...
Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...mfrancis
 
MicroProfile, OSGi was meant for this - Ray Auge (Liferay)
MicroProfile, OSGi was meant for this - Ray Auge (Liferay)MicroProfile, OSGi was meant for this - Ray Auge (Liferay)
MicroProfile, OSGi was meant for this - Ray Auge (Liferay)mfrancis
 
Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...
Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...
Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...mfrancis
 
How to connect your OSGi application - Dirk Fauth (Bosch)
How to connect your OSGi application - Dirk Fauth (Bosch)How to connect your OSGi application - Dirk Fauth (Bosch)
How to connect your OSGi application - Dirk Fauth (Bosch)mfrancis
 

More from mfrancis (20)

Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...
Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...
Eclipse Modeling Framework and plain OSGi the easy way - Mark Hoffman (Data I...
 
OSGi and Java 9+ - BJ Hargrave (IBM)
OSGi and Java 9+ - BJ Hargrave (IBM)OSGi and Java 9+ - BJ Hargrave (IBM)
OSGi and Java 9+ - BJ Hargrave (IBM)
 
Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)
Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)
Simplify Web UX Coding using OSGi Modularity Magic - Paul Fraser (A2Z Living)
 
OSGi for the data centre - Connecting OSGi to Kubernetes - Frank Lyaruu
OSGi for the data centre - Connecting OSGi to Kubernetes - Frank LyaruuOSGi for the data centre - Connecting OSGi to Kubernetes - Frank Lyaruu
OSGi for the data centre - Connecting OSGi to Kubernetes - Frank Lyaruu
 
Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...
Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...
Remote Management and Monitoring of Distributed OSGi Applications - Tim Verbe...
 
OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...
OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...
OSGi with Docker - a powerful way to develop Java systems - Udo Hafermann (So...
 
A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...
A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...
A real world use case with OSGi R7 - Jurgen Albert (Data In Motion Consulting...
 
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
OSGi Feature Model - Where Art Thou - David Bosschaert (Adobe)
 
Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...
Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...
Migrating from PDE to Bndtools in Practice - Amit Kumar Mondal (Deutsche Tele...
 
OSGi CDI Integration Specification - Ray Augé (Liferay)
OSGi CDI Integration Specification - Ray Augé (Liferay)OSGi CDI Integration Specification - Ray Augé (Liferay)
OSGi CDI Integration Specification - Ray Augé (Liferay)
 
How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...
How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...
How OSGi drives cross-sector energy management - Jörn Tümmler (SMA Solar Tech...
 
Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...
Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...
Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Co...
 
It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...
It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...
It Was Twenty Years Ago Today - Building an OSGi based Smart Home System - Ch...
 
Popular patterns revisited on OSGi - Christian Schneider (Adobe)
Popular patterns revisited on OSGi - Christian Schneider (Adobe)Popular patterns revisited on OSGi - Christian Schneider (Adobe)
Popular patterns revisited on OSGi - Christian Schneider (Adobe)
 
Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)
Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)
Integrating SLF4J and the new OSGi LogService 1.4 - BJ Hargrave (IBM)
 
OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)
OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)
OSG(a)i: because AI needs a runtime - Tim Verbelen (imec)
 
Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...
Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...
Flying to Jupiter with OSGi - Tony Walsh (ESA) & Hristo Indzhov (Telespazio V...
 
MicroProfile, OSGi was meant for this - Ray Auge (Liferay)
MicroProfile, OSGi was meant for this - Ray Auge (Liferay)MicroProfile, OSGi was meant for this - Ray Auge (Liferay)
MicroProfile, OSGi was meant for this - Ray Auge (Liferay)
 
Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...
Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...
Prototyping IoT systems with a hybrid OSGi & Node-RED platform - Bruce Jackso...
 
How to connect your OSGi application - Dirk Fauth (Bosch)
How to connect your OSGi application - Dirk Fauth (Bosch)How to connect your OSGi application - Dirk Fauth (Bosch)
How to connect your OSGi application - Dirk Fauth (Bosch)
 

Recently uploaded

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 

OSGi and Spring Data for simple (Web) Application Development - Christian Baranowski

  • 1. OSGi and Spring Data for simple (Web) Application Development Christian Baranowski Content of my talk in a sentence „Java development with Bndtools and bnd is so much fun!“ My Talk in three Words - „Bndtools is cool!“
  • 2. Bndtools Easy, powerful and productive way to develop OSGi applications. Based on bnd and Eclipse. http://bndtools.org/ „Development should be fun, so you need the right tools!“
  • 3. enRoute • Getting started with OSGi → enRoute project http://enroute.osgi.org/ • The talk is based on the ideas from the enRoute blog demo project • enRoute OSGi blog sample project by Peter Kriens https://github.com/osgi/osgi.enroute.blog/ • Step by step tutorial from Peter Kriens http://goo.gl/Y569g5 • Last OSGi Code Camp (Ludwigsburg 2013) was based on this step by step tutorial
  • 4. Running Blog Example OSGi Framework (Equinox) MySQL … HTTP Server (Jetty) JPA (EclipseLink) Web Browser (IE, FF, Chrome, Safarie..) HTTP / 80 simple.web.blog.web simple.web.blog.data MySQL JDBC / 3306 Web Layer Persistence Layer
  • 5. Persistence Layer (JPA) simple.web.blog .configuration Configuration extender" configuration/*.yaml javax.persistence.EntityManagerFactory" osgi.unit.name: Blog …jdbc.DataSourceFactory …cm.ConfigurationAdmin Eclipse Gemini dbaccess mysql osgi.configuration.yaml …cm.ManagedServiceFactory" Service PID: gemini.jpa.punit Apache Felix" Config Admin simple.web.blog.data Eclipse Gemini JPA JPA extender create service" javax.persistence.EntityManagerFactory Bundle Manifest contains" Meta-Persistence header org.eclipse.persistence.jpa com.mysql.jdbc org.yaml.snakeyaml
  • 6. Spring Data Extender register the dynamic implementation of the service osgi.jpa.springdata … JPA-Repositories: sample.webapp.data.BlogRepository … provider MANIFEST.MF Extender for JPA Repositories public interface BlogRepository extends JpaRepository<Blog, Long> { ! List<Blog> findByTitleContaining(String part); ! } consumer @Entity public class Blog { @Id @GeneratedValue public Long id; public String title; public String content; } extender looks for bundles with " JPA-Repositories headers
  • 7. Simple Transaction Management provider Service Registry setup a proxy service with the transaction logic @Reference(target = isTransactionalService) public void setService(Service srv) transactional.service = true requieres.tx.mgnt = true consumer osgi.jpa.tx Whiteboard for services which has a " requires.tx.mgnt service property Proxy " Service if (tx.isTransactionOpen()) { return method.invoke(bundleContext.getService(serviceReference), args); } try { tx.begin(); Object result = method.invoke(bundleContext.getService(serviceReference), args); tx.commit(); return result; } catch (Exception exp) { tx.rollback(); throw exp; } finally { bundleContext.ungetService(txMgrServiceReference); }
  • 8. Spock based OSGi Integration Tests osgi.jpa.springdata simple.web.blog" .data Extender for JPA Repositories simple.web.blog.data.tests osgi.jpa.tx requieres.tx.mgnt = true transactional.service = true class BlogRepositorySpec extends Specification { ! @OSGiService BlogRepository blogRepository def setup() { blogRepository.deleteAll() blogRepository.save(new Blog(title: 'OSGi Web Dev')) blogRepository.save(new Blog(title: 'OSGi V.S Java EE')) } def findBlogPostByTitleContainingOSGi() { when: def list = blogRepository.findByTitleContaining("OSGi") then: list.size() == 2 } }
  • 10. Jersey MVC (Server Side Web-App) Handlebars View (list.hbs): <html> <head> {{#resource type="css"}} /css/app.css {{/resource}} </head> <body> <table class="table table-striped"> <thead> <th>#id</th><th>Title</th><th>Content</th><th></th> </thead> {{#html-table-content columns="id, title, content" resource="blog"}} {{/html-table-content}} </table> {{#html-pagination}} {{/html-pagination}} </body> </html> ! @GET @Produces( MediaType.TEXT_HTML ) @Template(name="list.hbs") public Page<Blog> list( @QueryParam("page") @DefaultValue("0") Integer page, @QueryParam("size") @DefaultValue("10") Integer size) { return blogRepository.findAll(new PageRequest(page, size)); } com.github.jknack." handlebars Controller Method return the model Controller (BlogController): Handlebars " Helpers osgi-jax-rs-connector
  • 11. Handlebars Helpers … osgi.web.templates" .handlebars.helpers com.github.jknack.handlebars.Helper" name = … …Helper" name=html-pagination Whiteboard for Helpers …Helper" name=html-table-content <thead> <th>#id</th><th>Title</th><th>Content</th><th></th> </thead> {{#html-table-content columns="id, title, content" resource="blog"}} {{/html-table-content}} osgi.web.templates" .handlebars org.glassfish.jersey.server.mvc.spi." TemplateProcessor<String> Whiteboard for " JAX-RS Provides osgi-jax-rs-connector Extend templates and provide components for the HTML UI
  • 12. Static Web Bundles <html> <head> {{#resource type="css"}} /css/app.css {{/resource}} </head> OSGi way of web dependency management for CSS or JavaScript frameworks simple.web.blog.web osgi.web.bootstrap MANIFEST.MF MANIFEST.MF Require-Capability: bootstrap.css; filter:="(&(version>=3.1.1)(!(version>=4.0.0)))" Provide-Capability: bootstrap.css; version:Version=3.1.1; type=css @Requieres.Bootstrap @Component @Path("/products") public class BlogController More details see aQute.bnd.annotation.headers.RequireCapability" or" aQute.bnd.annotation.headers.ProvideCapability! bnd annotations.
  • 13. Modern Web Applications HTTP / 8080 REST Resource (API)" JSON UI business logic" data access logic HTML5" JavaScript (CoffeScript, …)" CSS3 (SASS, LESS, ..) JAVA 8" OSGi
  • 14. Web Bundle build with Yeoman Grunt Bower yeoman Grunt bower • Scaffolding tool for webapps" • Yeoman helps kickstart new projects" • provide a generator ecosystem http://yeoman.io/ • JavaScript Task Runner " • Grunt ecosystem is huge" • minification, compilation, unit testing, linting, … http://gruntjs.com/ • package manager for the web" • solution to the problem of front-end package management" • ecosystem is huge http://bower.io/ Thats the tool chain web developers love…
  • 15. Building Web Applications HTTP / 8080 REST Resource (API)" JSON UI business logic" data access logic HTML5" JavaScript (CoffeScript, …)" CSS3 (SASS, LESS, ..) JAVA 8" OSGi yeomen, grunt, bower bndtools Gradle, tests and builds the OSGi and the Web application Web Developers Java Developers (OSGi)
  • 16. AngularJS REST Consumer (Client) $blogResource (REST Consumer) ! angular.module('blogApp') .factory('$blogResource', ['$resource', function($resource) { return $resource( '/rest/blog/:postId', { postId: '@postId' }, { }); }]); MainCtrl (the controller is using the REST resource to delete a blog entry) angular.module('blogApp') .controller('MainCtrl', ['$scope','$blogResource', function($scope, $blogResource) { $scope.posts = $blogResource.query(); $scope.deletePost = function(post) { $blogResource.delete({postId: post.id}).$promise.then(function() { $scope.posts = $blogResource.query(); }); }; }]);
  • 17. REST Resource (JAX-RS) Provider @Component @Path("/rest/blog") public class BlogResource implements Resource { ! BlogRepository blogRepository; ! @Reference(target = isTransactionalService) public void setBlogRepository(BlogRepository blogRepository) { … } @GET public List<Blog> query() { return blogRepository.findAll(); } @GET @Path("/{id}") public Blog get(@PathParam("id") Long id) { return blogRepository.getOne(id); } @POST public void post(Blog blog) { blogRepository.save(blog); } @DELETE @Path("/{id}") public void delete(@PathParam("id") Long id) { blogRepository.delete(id); } } A REST Resource build in standard and flexible way based on JAX-RS
  • 18. Integration Testing REST Resources simple.web.blog.web.tests simple.web.blog.data.BlogRepository" transactional.service = true simple.web.blog.web class BlogResourceSpec extends Specification { ! @OSGiServiceRegistration(properties=["transactional.service = true"]) BlogRepository mockBlogRepository = Mock(BlogRepository) def getProductsByExistingId() { given: mockBlogRepository.findOne(42) >> new Blog(title: 'OSGi in Action', content: '-') when: Client client = ClientBuilder.newClient(); Response response = client .target("http://localhost:8080") .path("halres").path("blog").path("42").request().get(); then: response.status == Status.OK.statusCode } HTTP / 80
  • 19. Testing AngularJS Controllers // Initialize the controller and a mock scope beforeEach(inject(function ($controller, $rootScope, $injector) { scope = $rootScope.$new(); $httpBackend = $injector.get('$httpBackend'); $httpBackend.expect('GET', '/rest/blog').respond([{id: 1}, {id: 42}]); MainCtrl = $controller('MainCtrl', { $scope: scope }); })); it('should send a request to delete a blog post', function () { $httpBackend.expect('DELETE', '/rest/blog/42').respond(200, 'success'); $httpBackend.expect('GET', '/rest/blog').respond([{id: 1}]); scope.deletePost({id: 42}); $httpBackend.flush(); expect(scope.posts.toString()).toBe([{id: 1}].toString()); });
  • 20. Technologie Stack • Modern Web-Application OSGi Stack • AngularJS (Superheroic JavaScript Framework) https://angularjs.org/ • Jetty (Web Server) https://www.eclipse.org/jetty/ • osgi-jax-rs-connector (Jersey) https://github.com/hstaudacher/osgi-jax-rs-connector • Spring Data JPA (for simple JPA Services) http://projects.spring.io/spring-data-jpa/ • Spock (testing and specification framework) https://code.google.com/p/spock/ • Eclipse Equinox or Apache Felix as powerful OSGi Framework
  • 21. Feedback „Erik Meijer: Are you saying you cannot write large programs in Java? Anders Hejlsberg: No, you can write large programs in Java. You just can’t maintain them. „ Quelle - http://t.co/Uw2iglqf Compose small “applications” (modules) in to large systems. Quelle - http://t.co/Uw2iglqf
  • 22. Resources • OSGi Simple Blog App (Source, Slides) https://github.com/tux2323/simple.web.blog