This document provides an agenda for a workshop on developing a location aware application using Java EE 6, MongoDB and OpenShift. The workshop will cover getting started with OpenShift, developing a location aware application using JAX-RS for REST web services, CDI for dependency injection and MongoDB for the database. It will also cover deploying the application to OpenShift. The agenda includes sessions on OpenShift overview, setting up JAX-RS, configuring CDI and MongoDB, implementing CRUD operations and geospatial queries. Code examples will be provided on GitHub for attendees to follow along.
6. OpenShift
is
PaaS by Red Hat
Multi-language,
Auto-Scaling,
Self-service,
Elastic,
Cloud Application
Platform
7. WHY OPENSHIFT?
●
●
Supports MongoDB , PostgreSQL ,and MySQL
Multi-language support. Supports Java, Node.js, Perl,
Python, PHP and Ruby
●
Extensible via DIY and cartridges
●
No need to learn anything new
●
Open source – OpenShift Origin
●
Scalable
●
FREE!
12. LAB 1 : HELLO OPENSHIFT
1. Install OpenShift Eclipse plugin
2. Create new application with JBoss EAP and MongoDB
cartridges.
1. Sign up for OpenShift(if not already)
2. Create domain name or namespace
3. Upload SSH keys to OpenShift
4. Fill application creation wizard
5. Finish
3. Make a change in index.html
1. Commit the change using Git Staging view
2. Publish the change
4.View application in browser
12
13. LAB 2 : HOT DEPLOYMENT
1. Right click on your project and then go to
OpenShift > Configure Markers
2. Choose Hot Deploy marker
3. Commit to git repository
4. Go to servers view and publish your changes.
13
15. LAB 3 : REST INTRODUCTION
1. HTTP used right
2. Defines set of RESTful constraints
1. Everything is a resource
1. Eg. Post , Tweet , User , etc.
2. Every resource has an identifier
1. Eg. http://api/twitter.com/tweets/1000011111
3. Resource can have multiple representations
1. JSON , XML , YAML , etc.
4. All resources expose a uniform interface
1. GET , POST , PUT , DELETE
5. Hypermedia as the engine of application state
15
16. LAB 3 JAX-RS INTRODUCTION
1. Java API for REST Services
2. POJO based
3. Annotation heavy
4. HTTP Centric
5. Format independent
6. Container independent
7. Included with Java EE 6
In this workshop we will be talking about JAX-RS 1.1
16
17. LAB 3 : SET UP JAX RS
1. Update to Java 7
2. Update Maven war plugin to 2.3
3. Create JAX-RS configuration class.
4. Write PingResource
git remote add upstream -m master
https://github.com/shekhargulati/sharemylocation-demo.git
git fetch –all
git reset --hard upstream/lab3
17
19. CDI
1. CDI stands for Context and Dependency Injection
2. CDI simplifies and sanitizes the API for DI and AOP
like JPA did for ORM -- CDI Tutorial by Rick Hightower
3. Type safe approach to Dependency Injection
4. Strong typing and loose coupling
5. To configure CDI add beans.xml to
1. WEB-INF of WAR
2. META-INF of JAR
6. Beans can be injected at method , field , or
constructor.
19
22. WHAT IS MONGODB
Open Source NoSQL document datastore
– JSON style documents
Schema-less
– Each document is heterogeneous, and may have completely
unique structure compared to other documents
Fast and horizontally scalable
Rich query language
Rich documents
Easy to get running
Geospatial indexing
22
24. SOME QUERIES
// Find all the jobs with skill as mongodb
db.jobs.find({"skills":"mongodb"})
// Find all the jobs with python as skill and
near to given location
db.jobs.find({"lngLat":{$near :
[139.69 , 35.68]},
"skills":"python"})
// Find all the python or mongodb jobs
near to given location
db.jobs.find({"lngLat":{$near :
[139.69 , 35.68]},
"skills":{$in :
["mongodb","python"]}})
24
25. LAB 4 : ENABLE CDI AND
MONGODB CONFIGURATION
1. Create beans.xml in src/main/WEB-INF folder
2. Create ApplicationScoped bean for configuring
MongoDB
3. PingResource writes a document to dummy collection
4. Open Eclipse Remote System Explorer perspective
and connect to gear.
Right click on project
1. Team > Reset > Remote Tracking > upstream/lab4
25
26. LAB 5 : IMPLEMENT CREATE
AND FIND ALL STATUS
1. Creates Status domain class
2. Creates converter for Status to DBObject and vice
versa
3. Creates StatusResource with create and find all
endpoints.
4. Creates ApplicationDao with create and findAll
methods.
5. Creates Twitter Bootstrap and Backbonejs front end for
create and find all functionalities.
Right click on project
–
26
Team > Reset > Remote Tracking > upstream/lab5
27. LAB 6 : IMPLEMENT NEAR AND
GEONEAR FEATURES
1. Creates findNear and findGeoNear methods in
ApplicationDao
2. Creates near and geonear search REST endpoints in
StatusResource
3. Implements backbone views for search endpoints
4. Create Index
1. db.statuses.ensureIndex({“location”:”2dsphere”})
Right click on project
–
27
Team > Reset > Remote Tracking > upstream/lab6
32. GEOSPATIAL INDEXING
BASICS
What is it for?
Find all the MongoDB jobs near me – Proximity Queries
Find all the MongoDB jobs within Bangalore – Bounded
Queries
Find all the MongoDB job at this location – Exact Queries
●
Supports only two dimensional indexes.
You can only have one geospatial index per collection.
By default, 2d geospatial indexes assume longitude
and latitude have boundaries of -180 inclusive and 180
non-inclusive (i.e. [-180, 180))
32
33. HOW TO MAKE IT WORK
1)
Put your coordinates into an array
{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { foo : 50 , y : 30 } }
1) { loc : { lon : 40.739037, lat: 73.992964 } }
2)
Make a 2d index
db.places.ensureIndex( { loc : "2d" } )
3)
33
If you use latitude and longitude as your coordinate system,
always store longitude first. MongoDB’s 2d spherical index
operators only recognize [ longitude, latitude] ordering.