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

Google Developer Group(GDG) DevFest Event 2012 Android talk
Google Developer Group(GDG) DevFest Event 2012 Android talkGoogle Developer Group(GDG) DevFest Event 2012 Android talk
Google Developer Group(GDG) DevFest Event 2012 Android talk
Imam Raza
 
Single Page WebApp Architecture
Single Page WebApp ArchitectureSingle Page WebApp Architecture
Single Page WebApp Architecture
Morgan Cheng
 

What's hot (20)

Esri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc FinalEsri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc Final
 
AngularJS Basics
AngularJS BasicsAngularJS Basics
AngularJS Basics
 
Javascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
Javascript Frameworks Comparison - Angular, Knockout, Ember and BackboneJavascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
Javascript Frameworks Comparison - Angular, Knockout, Ember and Backbone
 
Getting started with angular js
Getting started with angular jsGetting started with angular js
Getting started with angular js
 
Data presentation with dust js technologies backing linkedin
Data presentation with dust js   technologies backing linkedinData presentation with dust js   technologies backing linkedin
Data presentation with dust js technologies backing linkedin
 
AngularJS One Day Workshop
AngularJS One Day WorkshopAngularJS One Day Workshop
AngularJS One Day Workshop
 
React native: building native iOS apps with javascript
React native: building native iOS apps with javascriptReact native: building native iOS apps with javascript
React native: building native iOS apps with javascript
 
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
 
AngularJS - Architecture decisions in a large project 
AngularJS - Architecture decisionsin a large project AngularJS - Architecture decisionsin a large project 
AngularJS - Architecture decisions in a large project 
 
Learn Developing REST API in Node.js using LoopBack Framework
Learn Developing REST API  in Node.js using LoopBack FrameworkLearn Developing REST API  in Node.js using LoopBack Framework
Learn Developing REST API in Node.js using LoopBack Framework
 
Java EE and Spring Side-by-Side
Java EE and Spring Side-by-SideJava EE and Spring Side-by-Side
Java EE and Spring Side-by-Side
 
Step by Step - AngularJS
Step by Step - AngularJSStep by Step - AngularJS
Step by Step - AngularJS
 
Google Developer Group(GDG) DevFest Event 2012 Android talk
Google Developer Group(GDG) DevFest Event 2012 Android talkGoogle Developer Group(GDG) DevFest Event 2012 Android talk
Google Developer Group(GDG) DevFest Event 2012 Android talk
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
 
Adobe AEM CQ5 - Developer Introduction
Adobe AEM CQ5 - Developer IntroductionAdobe AEM CQ5 - Developer Introduction
Adobe AEM CQ5 - Developer Introduction
 
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
 
Single Page WebApp Architecture
Single Page WebApp ArchitectureSingle Page WebApp Architecture
Single Page WebApp Architecture
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components Everywhere
 
Custom Elements with Polymer Web Components #econfpsu16
Custom Elements with Polymer Web Components #econfpsu16Custom Elements with Polymer Web Components #econfpsu16
Custom Elements with Polymer Web Components #econfpsu16
 
AngularJS + React
AngularJS + ReactAngularJS + React
AngularJS + React
 

Viewers also liked

Transaction Control – a Functional Approach to Modular Transaction Management...
Transaction Control – a Functional Approach to Modular Transaction Management...Transaction Control – a Functional Approach to Modular Transaction Management...
Transaction Control – a Functional Approach to Modular Transaction Management...
mfrancis
 
Spring Dynamic Modules for OSGi by Example - Martin Lippert, Consultant
Spring Dynamic Modules for OSGi by Example - Martin Lippert, ConsultantSpring Dynamic Modules for OSGi by Example - Martin Lippert, Consultant
Spring Dynamic Modules for OSGi by Example - Martin Lippert, Consultant
mfrancis
 
Going Native With The OSGi Service Layer - Sascha Zelzer
Going Native With The OSGi Service Layer - Sascha ZelzerGoing Native With The OSGi Service Layer - Sascha Zelzer
Going Native With The OSGi Service Layer - Sascha Zelzer
mfrancis
 
Developing modular, polyglot applications with Spring (SpringOne India 2012)
Developing modular, polyglot applications with Spring (SpringOne India 2012)Developing modular, polyglot applications with Spring (SpringOne India 2012)
Developing modular, polyglot applications with Spring (SpringOne India 2012)
Chris Richardson
 
OSGi for European and Japanese smart cities - experiences and lessons learnt ...
OSGi for European and Japanese smart cities - experiences and lessons learnt ...OSGi for European and Japanese smart cities - experiences and lessons learnt ...
OSGi for European and Japanese smart cities - experiences and lessons learnt ...
mfrancis
 

Viewers also liked (17)

Developing modular Java applications
Developing modular Java applicationsDeveloping modular Java applications
Developing modular Java applications
 
Getting to the Next Level with Eclipse Concierge - Jan Rellermeyer + Tim Verb...
Getting to the Next Level with Eclipse Concierge - Jan Rellermeyer + Tim Verb...Getting to the Next Level with Eclipse Concierge - Jan Rellermeyer + Tim Verb...
Getting to the Next Level with Eclipse Concierge - Jan Rellermeyer + Tim Verb...
 
Transaction Control – a Functional Approach to Modular Transaction Management...
Transaction Control – a Functional Approach to Modular Transaction Management...Transaction Control – a Functional Approach to Modular Transaction Management...
Transaction Control – a Functional Approach to Modular Transaction Management...
 
WebSockets and Equinox OSGi in a Servlet Container - Nedelcho Delchev
WebSockets and Equinox OSGi in a Servlet Container - Nedelcho DelchevWebSockets and Equinox OSGi in a Servlet Container - Nedelcho Delchev
WebSockets and Equinox OSGi in a Servlet Container - Nedelcho Delchev
 
Spring Dynamic Modules for OSGi by Example - Martin Lippert, Consultant
Spring Dynamic Modules for OSGi by Example - Martin Lippert, ConsultantSpring Dynamic Modules for OSGi by Example - Martin Lippert, Consultant
Spring Dynamic Modules for OSGi by Example - Martin Lippert, Consultant
 
Going Native With The OSGi Service Layer - Sascha Zelzer
Going Native With The OSGi Service Layer - Sascha ZelzerGoing Native With The OSGi Service Layer - Sascha Zelzer
Going Native With The OSGi Service Layer - Sascha Zelzer
 
OSGi with the Spring Framework
OSGi with the Spring FrameworkOSGi with the Spring Framework
OSGi with the Spring Framework
 
OSGi Remote Services With Sca
OSGi Remote Services With ScaOSGi Remote Services With Sca
OSGi Remote Services With Sca
 
TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...
TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...
TS-2614 - Jini™ Network Technology-Enabled Service-Oriented Architecture, A L...
 
Dockerizing apps for the Deployment Platform of the Month with OSGi - David B...
Dockerizing apps for the Deployment Platform of the Month with OSGi - David B...Dockerizing apps for the Deployment Platform of the Month with OSGi - David B...
Dockerizing apps for the Deployment Platform of the Month with OSGi - David B...
 
Avoid the chaos - Handling 100+ OSGi Components - Balázs Zsoldos
Avoid the chaos - Handling 100+ OSGi Components - Balázs ZsoldosAvoid the chaos - Handling 100+ OSGi Components - Balázs Zsoldos
Avoid the chaos - Handling 100+ OSGi Components - Balázs Zsoldos
 
OSGi for outsiders - Milen Dyankov
OSGi for outsiders - Milen DyankovOSGi for outsiders - Milen Dyankov
OSGi for outsiders - Milen Dyankov
 
GeoServer an introduction for beginners
GeoServer an introduction for beginnersGeoServer an introduction for beginners
GeoServer an introduction for beginners
 
Developing modular, polyglot applications with Spring (SpringOne India 2012)
Developing modular, polyglot applications with Spring (SpringOne India 2012)Developing modular, polyglot applications with Spring (SpringOne India 2012)
Developing modular, polyglot applications with Spring (SpringOne India 2012)
 
OSGi Blueprint Services
OSGi Blueprint ServicesOSGi Blueprint Services
OSGi Blueprint Services
 
Building Stuff for Fun and Profit - confessions from a life in code and cables
Building Stuff for Fun and Profit - confessions from a life in code and cablesBuilding Stuff for Fun and Profit - confessions from a life in code and cables
Building Stuff for Fun and Profit - confessions from a life in code and cables
 
OSGi for European and Japanese smart cities - experiences and lessons learnt ...
OSGi for European and Japanese smart cities - experiences and lessons learnt ...OSGi for European and Japanese smart cities - experiences and lessons learnt ...
OSGi for European and Japanese smart cities - experiences and lessons learnt ...
 

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

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
 
Nuxeo - OpenSocial
Nuxeo - OpenSocialNuxeo - OpenSocial
Nuxeo - OpenSocial
Thomas Roger
 
Javascript frameworks: Backbone.js
Javascript frameworks: Backbone.jsJavascript frameworks: Backbone.js
Javascript frameworks: Backbone.js
Soós Gábor
 
Hdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed SolutionsHdv309 - Real World Sandboxed Solutions
Hdv309 - Real World Sandboxed Solutions
woutervugt
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
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...
SPTechCon
 

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

Html5 For Jjugccc2009fall
Html5 For Jjugccc2009fallHtml5 For Jjugccc2009fall
Html5 For Jjugccc2009fall
 
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)
 
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
 
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
 
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
 

More from Christian Baranowski

Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?
Christian Baranowski
 
Einführung in die Software-Qualitätssicherung
Einführung in die Software-QualitätssicherungEinführung in die Software-Qualitätssicherung
Einführung in die Software-Qualitätssicherung
Christian Baranowski
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
Christian Baranowski
 
Software Testing und Qualitätssicherung
Software Testing und QualitätssicherungSoftware Testing und Qualitätssicherung
Software Testing und Qualitätssicherung
Christian Baranowski
 
Einführung Software Testing und Qualitätssicherung
Einführung Software Testing und QualitätssicherungEinführung Software Testing und Qualitätssicherung
Einführung Software Testing und Qualitätssicherung
Christian Baranowski
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
Christian Baranowski
 

More from Christian Baranowski (20)

Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?
 
BDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
BDD - Behavior Driven Development Webapps mit Groovy Spock und GebBDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
BDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
 
Komponententests und Testabdeckung
Komponententests und TestabdeckungKomponententests und Testabdeckung
Komponententests und Testabdeckung
 
Einführung in die Software-Qualitätssicherung
Einführung in die Software-QualitätssicherungEinführung in die Software-Qualitätssicherung
Einführung in die Software-Qualitätssicherung
 
OSGi Web Development in Action
OSGi Web Development in ActionOSGi Web Development in Action
OSGi Web Development in Action
 
Spock and Geb in Action
Spock and Geb in ActionSpock and Geb in Action
Spock and Geb in Action
 
Continuous Delivery in Action
Continuous Delivery in ActionContinuous Delivery in Action
Continuous Delivery in Action
 
Gradle and Continuous Delivery
Gradle and Continuous DeliveryGradle and Continuous Delivery
Gradle and Continuous Delivery
 
Spock and Geb
Spock and GebSpock and Geb
Spock and Geb
 
Semantic Versioning
Semantic VersioningSemantic Versioning
Semantic Versioning
 
OSGi Community Updates 2012
OSGi Community Updates 2012OSGi Community Updates 2012
OSGi Community Updates 2012
 
OSGi Mars World in Action
OSGi Mars World in ActionOSGi Mars World in Action
OSGi Mars World in Action
 
Warum OSGi?
Warum OSGi?Warum OSGi?
Warum OSGi?
 
Top10- Software Engineering Books
Top10- Software Engineering BooksTop10- Software Engineering Books
Top10- Software Engineering Books
 
Domain Driven Design - 10min
Domain Driven Design - 10minDomain Driven Design - 10min
Domain Driven Design - 10min
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
 
Software Testing und Qualitätssicherung
Software Testing und QualitätssicherungSoftware Testing und Qualitätssicherung
Software Testing und Qualitätssicherung
 
Einführung Software Testing und Qualitätssicherung
Einführung Software Testing und QualitätssicherungEinführung Software Testing und Qualitätssicherung
Einführung Software Testing und Qualitätssicherung
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 

OSGi and Spring Data for simple (Web) Application Development

  • 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