The Devoxx Schedule REST interface
People who would like to write a Devoxx schedule application can now use our REST interface.
Comments and suggestions are always welcome.
Hint: You can use the REST Client for Firefox plugin to test the methods.
REST URIs
The listed REST URIs return all JSON responses.
REST URI's
https://cfp.devoxx.com/rest/v1/events https://cfp.devoxx.com/rest/v1/events/users/activate https://cfp.devoxx.com/rest/v1/events/users/publish https://cfp.devoxx.com/rest/v1/events/users/email https://cfp.devoxx.com/rest/v1/events/users/validate https://cfp.devoxx.com/rest/v1/events/{event-id} https://cfp.devoxx.com/rest/v1/events/{event-id}/presentations https://cfp.devoxx.com/rest/v1/events/{event-id}/presentations/search?title={title} &abstract={abstract}&speaker={speakerName}&track={track}&type={presentationType}&experience={experienceLevel}&tags={commaTagList} https://cfp.devoxx.com/rest/v1/events/presentations/{presentation-id} https://cfp.devoxx.com/rest/v1/events/{event-id}/speakers https://cfp.devoxx.com/rest/v1/events/speakers/{speaker-id} https://cfp.devoxx.com/rest/v1/events/{event-id}/schedule https://cfp.devoxx.com/rest/v1/events/{event-id}/schedule/day/{number-of-day} https://cfp.devoxx.com/rest/v1/events/{event-id}/schedule/rooms https://cfp.devoxx.com/rest/v1/events/{event-id}/schedule/day/{number-of-day}/room/{room-id} https://cfp.devoxx.com/rest/v1/events/{event-id}/tracks https://cfp.devoxx.com/rest/v1/events/{event-id}/presentationtypes https://cfp.devoxx.com/rest/v1/events/{event-id}/experiencelevels
Get Events
/events
- GET : returns all active events (events that have taken place are not listed)
- Get Response :
[{"id":1,"from":"2010-11-15","to":"2010-11-19",
"enabled":true,"location":"MetroPolis",
"description":"The annual BeJUG international java conference.","name":"Devoxx 2010"}]
Get Event Details
/events/{event-Id}
- GET : Returns detailed event info for given event identifier.
- GET Response :
[{"id":1,"from":"2010-11-15","to":"2010-11-19",
"enabled":true,"location":"MetroPolis",
"description":"The annual BeJUG international java conference.","name":"Devoxx 2010"}]
Activate MySchedule User (NEW)
/events/users/activate
- POST : Submits a MySchedule user (firstname, lastname and email) and results in an activation code being emailed.
- POST Response: 201 Created
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- Form data:
firstname: stephan lastname: janssen email: xxxxx@yyyyyyyy.zzz
| See also the HTML5 mobile client to view the related JavaScript POST requests. |
Publish MySchedule (NEW)
/events/users/publish
- POST : Publish MySchedule to Devoxx wiki
- POST Response: 201 Created
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- Form data:
code: activationCode email: xxxxx@yyyyyyyy.zzz event:1 favorites:332 favorites:333 favorites:342 favorites:353 favorites:355 favorites:326 favorites:338 favorites:319 favorites:361
The activation code was received by email. The client should store this activation code and use it for every email/publish POST message!
Email MySchedule (NEW)
/events/users/email
- POST : Emails the MySchedule
- POST Response: 201 Created
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- Form data:
code: activationCode email: xxxxx@yyyyyyyy.zzz event: 1 favorites: 278 favorites: 341
The activation code was received by email. The client should store this activation code and use it for every email/publish POST message!
Validate activation code (NEW)
/events/users/validate
- POST : email and code to validate
- POST Response: 200 OK
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- Form data:
email: xxx@yyyy.com code: zzzzzzzzzzzzz
Get Presentations per event
/events/{event-Id}/presentations
- GET : Get all presentations for event-id
Get Presentation details
/events/presentations/{presentation-Id}
- GET : returns the presentation details. Users get status code HTTP/401 "Unauthorized" when presentation is not approved.
| To support multiple speakers per presentation we have added a JSON array named 'speakers'. We advice you to use this to show the related speaker(s) info. |
| We now also include presentation tags which can be used in the search to find related presentations! |
Get Speakers per event
/events/{event-Id}/speakers
- GET : Returns list of confirmed speakers
| The speakers JSON response now also includes a speaker image URI! |
Get Event Schedule
/events/{event-Id}/schedule
- GET : Returns the full schedule for the selected event
- GET Response :
[{"id":1,"fromTime":"2010-11-15 09:30:00.0","code":"D10_U_15_08_01","toTime":"2010-11-15 12:30:00.0","room":"Room 8"},
{"id":2,"fromTime":"2010-11-15 09:30:00.0","code":"D10_U_15_05_01","toTime":"2010-11-15 12:30:00.0","room":"Room 5"},
{"id":3,"fromTime":"2010-11-15 09:30:00.0","code":"D10_U_15_04_01","toTime":"2010-11-15 12:30:00.0","room":"Room 4"},
{"id":4,"fromTime":"2010-11-15 09:30:00.0","code":"D10_U_15_09_01","toTime":"2010-11-15 12:30:00.0","room":"Room 9"},
{"id":5,"fromTime":"2010-11-15 08:00:00.0","code":"Breakfast","toTime":"2010-11-15 09:30:00.0","room":"Hollywood Lounge"},
{"id":6,"fromTime":"2010-11-15 12:30:00.0","code":"Lunch","toTime":"2010-11-15 13:30:00.0","room":"Hollywood Lounge"},
{"id":7,"fromTime":"2010-11-15 13:30:00.0","code":"D10_U_15_08_02","toTime":"2010-11-15 16:30:00.0","room":"Room 8"},
{"id":8,"fromTime":"2010-11-15 13:30:00.0","code":"D10_U_15_05_02","toTime":"2010-11-15 16:30:00.0","room":"Room 5"},
{"id":9,"fromTime":"2010-11-15 13:30:00.0","code":"D10_U_15_04_02","toTime":"2010-11-15 16:30:00.0","room":"Room 4"},
{"id":10,"fromTime":"2010-11-15 13:30:00.0","code":"D10_U_15_09_02","toTime":"2010-11-15 16:30:00.0","room":"Room 9"},
{"id":11,"fromTime":"2010-11-15 16:30:00.0","code":"Coffee break","toTime":"2010-11-15 16:45:00.0","room":"Hollywood Lounge"},
{"id":12,"fromTime":"2010-11-15 16:45:00.0","code":"D10_T_15_08_01","toTime":"2010-11-15 17:15:00.0","room":"Room 8"},
{"id":13,"fromTime":"2010-11-15 16:45:00.0","code":"D10_T_15_05_01","toTime":"2010-11-15 17:15:00.0","room":"Room 5"},
{"id":14,"fromTime":"2010-11-15 16:45:00.0","code":"D10_T_15_04_01","toTime":"2010-11-15 17:15:00.0","room":"Room 4"},
{"id":15,"fromTime":"2010-11-15 16:45:00.0","code":"D10_T_15_09_01","toTime":"2010-11-15 17:15:00.0","room":"Room 9"}]
The full Devoxx 2010 schedule items are now available.
Get Event Schedule per day
/events/{event-Id}/schedule/day/1
- GET : Returns the schedule for day one for the selected event
/events/{event-Id}/schedule/day/2
- GET : Returns the schedule for day two for the selected event and throws status code HTTP/405 "Method Not Allowed" when day two does not exist.
| To support multiple speakers per presentation we have added a JSON array named 'speakers'. We advice you to use this to show the related speaker(s) info. |
Search Presentations
/events/{event-id}/presentations/search?title={title}
&abstract={abstract}&speaker={speakerName}&track={track}&type={presentationType}&experience={experienceLevel}&tags={commaTagList}
- GET : Returns approved presentations for a given event and used filter. The possible filter parameters are presentation title, abstract, speaker name, track, type of presentation and experience level.
To know which tracks, presentation types and experience levels exist you can call the following REST methods :
/events/{event-id}/tracks
/events/{event-id}/presentationtypes
/events/{event-id}/experiencelevels
HTTPS connection
Something different from last year is that the host cfp.devoxx.com is now using a wildcard SSL certificate and all traffic going to the standard http port is redirect to its https-equivalent.
Two solutions are possible to solve the connectivity issue when using an HttpClient from the Apache Http Components framework (http://hc.apache.org).
1) Use a SslSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER:
package com.devoxx.example; import javax.net.ssl.HostnameVerifier; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.X509HostnameVerifier; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.SingleClientConnManager; public class BrowserCompatibleHttpClient extends DefaultHttpClient { @Override protected ClientConnectionManager createClientConnectionManager() { final HostnameVerifier hostnameVerifier = SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER; final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); sslSocketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", sslSocketFactory, 443)); return new SingleClientConnManager(getParams(), registry); } }
2) Download, install and use the GeoTrust Cross Root CA
First, store the certificate locally in a file named 'mycert.pem'.
Second, follow the steps 2 and 3 on Crazy Bob's blog.
A DevoxxHttpClient will then look as follows:
package com.devoxx.example; import java.io.InputStream; import java.security.KeyStore; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.SingleClientConnManager; import android.content.Context; public class DevoxxHttpClient extends DefaultHttpClient { final Context mContext; public DevoxxHttpClient(Context mContext) { this.mContext = mContext; } @Override protected ClientConnectionManager createClientConnectionManager() { SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); registry.register(new Scheme("https", newSslSocketFactory(), 443)); return new SingleClientConnManager(getParams(), registry); } private SSLSocketFactory newSslSocketFactory() { try { KeyStore trusted = KeyStore.getInstance("BKS"); InputStream in = mContext.getResources().openRawResource( R.raw.mystore); try { trusted.load(in, "ez24get".toCharArray()); } finally { in.close(); } return new SSLSocketFactory(trusted); } catch (Exception e) { throw new AssertionError(e); } } }
2010 Schedule Clients
Below you can find a list of available schedule clients that are consuming the available REST interface.
A BIG thank you goes to the many developers who invested their (private) time and energy to make this initiative a success!
Native Android (New)
Peter Kuterna developed an awesome open-source native Android Scheduling client for Devoxx using the Devoxx REST API (code will be made available on Google Code).
Android (Old)
Filip Maelbrancke developed an open-source native Android Scheduling client for Devoxx but this was before the REST API existed.
The code is available on Google Code.
![]() |
![]() |
Griffon
Andres Almiray is currently working on a Scheduling client using the Griffon framework (an open source RIA framework which leverages the Groovy programming language). The code is available @ GitHub.
![]() |
![]() |
![]() |
JavaFX
Joeri Sykora and Johan Vos have started a JavaFX client, the project is open sourced and hosted on BitBucket.
![]() |
![]() |
Vaadin
Teemu Pöntelin (Vaadin Expert) developed a Devoxx schedule client using Vaadin. Vaadin is an open source web application framework for rich Internet applications. Ajax technology is used at the browser-side to ensure a rich and interactive user experience. On client-side Vaadin is built on top of and can be extended with Google Web Toolkit.
Source code available at Google Code.
Native iPhone client
A native (Objective-C) iPhone and iPad client developed by Arexo, available on Apple Store. What's really nice is that this client has also a local storage MySchedule!
|
|
|
|
|
iText PDF Client
Bruno Lowagie (founder of iText) has developed an open source client that generates our (PDF) conference schedule which we'll print and insert in your welcome bag! Bruno will also talk about this project (and lots more) during his Devoxx University session.
![]() |
![]() |
![]() |
Adobe AIR
The people at iDA-MediaFoundry have developed an Adobe AIR (desktop) application which can be installed from their welcome page.
Gaelyk
Guillaume Laforge (project lead of Groovy and creator of Gaelyk) developed a Groovy on Java Google App Engine example using Gaelyk and the REST CFP interface. Source code available on GitHub.
Google Web Toolkit
Salvador Diaz developed an open-source Google Web Toolkit (GWT) version of the REST CFP interface. Source code available on Google Code.
iCal Client
Alexis Hassler has developed an iCal Devoxx client which consumes the REST CFP interface and makes it available in Google calendar. Read his (french) blog for more information, source code available at GitHub.
Scala Client
Olivier Michallat has recently started an interactive Scala REST CFP client, code is available on GitHub where a working version is available in the downloads section.
Android Client
Yannick Van Godtsenhoven developed an open source Android client based on the Devoxx REST CFP interface.





































