Showing posts with label open source. Show all posts
Showing posts with label open source. Show all posts

Tuesday, September 18, 2012

Opentravel Mobile Android App development with the JiBX open source framework

This example demonstrates how easy it is to create an Android app that can communicate with travel sites using the opentravel.org message schema.

The JiBX open source project is a java data-binding utility that simplifies handling of xml schema. The JiBX schema library includes pre-built bindings for many message schema, including the complete opentravel schema.

This app uses the 2011B version of the opentravel touractivities search request and reply.

Here is what this app looks like on my phone. Select a date and the available tour activities will display:
Tap on a tour for a detail display:


To illustrate what is happening, let's jump right into the actual source code. I create an opentravel xml touractivity search request and then read through the returned xml reply message.

// Populate the search request
SearchRQ searchRQ = new SearchRQ();
OTAPayloadStdAttributes payload = BaseService.createStandardPayload();
searchRQ.setOTAPayloadStdAttributes(payload);
DateTimePref dateTimePref = new DateTimePref();
searchRQ.setDateTimePref(dateTimePref);
dateTimePref.setStart(YMDdate);
dateTimePref.setEnd(YMDdate);

// Send it to the server and get the result
SearchRS searchRS = search(searchRQ);
if (searchRS == null)
return null;

// Extract the information from the results
List tourProducts = new Vector();
List tourActivities = searchRS.getTourActivityInfoList();
if ((tourActivities == null) || (searchRS.getErrors() != null))
return getErrorMessage(searchRS);
for (TourActivityInfo tourActivityInfo : tourActivities)
{
TourInfo tourInfo = new TourInfo();
TourActivityID tourActivityID = tourActivityInfo.getBasicInfo();
tourInfo.tourID = tourActivityID.getTourActivityID();
TourActivityDescription tourActivityDescription =  tourActivityInfo.getDescription();
if (tourActivityDescription != null)
tourInfo.description = tourActivityDescription.getShortDescription();
Pricing pricing = tourActivityInfo.getPricing();
if (pricing != null)
{
tourInfo.minPrice = pricing.getMinPrice();
tourInfo.maxPrice = pricing.getMaxPrice();
}
tourProducts.add(tourInfo);
}

// Return the tours to display
return tourProducts;

As you can see, manipulating the xml with java objects instead of xml makes the code easy to understand.

The rest of the code in this application handles the UI and the client calls. It should be familiar to any Android programmer. One of the nice features of Android is the inclusion of many popular open-source libraries, such as the Apache http Client library and the XMLPull parser.

This app is pretty simple. Setting up your development environment is a little tricky.

First, you will need a server that is set up to service your requests. Just follow the steps in my post here: http://blog.tourgeek.com/2012/04/creating-soap-and-rest-services-for.html . Make sure the server is working by pointing a browser to the server with this url (just replace this IP address with your server's IP): http://192.168.1.100:8181/cxf/touractivity/search/2012-09-04/2012-09-04 . You should get an XML reply message. Our app will be (html) posting a RESTful XML request rather than using url parameters.

Now we're ready to create our Android application.

Check out this example from github: https://github.com/jibx/schema-library/tree/master/schema-utilities/examples/android/org.jibx.android.demo.touractivity

I prefer maven for my Android development since it automatically includes all the correct opentravel binding modules automatically . You will need to set up maven for Android by following the directions here: http://www.sonatype.com/books/mvnref-book/reference/android-dev.html . Make sure you have deployed android 4.0_r3 into your local maven repo.

To build the code, just type:
mvn clean install

Now install your .apk file (from the maven target directory) onto your Android device.

Once you run the app, click the menu button to change the settings. Enter the IP address of your server and click okay:
You should see the tour display. Try changing the date to update the tour display (Some of the tours do not run on Tuesdays).

VoilĂ !

Take a look at the source code. You'll be amazed at how simple it is.

I hope this example helps you create your own app using the opentravel schema. If you have questions, contact me at don@tourgeek.com or place a comment in the space below.

Don

Wednesday, April 25, 2012

Creating SOAP and REST services for opentravel messages

I'm going to show you how easy it is to write a web service to access a travel product using open source software.

There are two parts to every software project.

First, you have to write the business logic. For example, return the price of a tour on a particular date. This is the fun part.

Second, you have to set up all the extra stuff to make your software work. Web servers, SOAP and REST configuration, etc. This is a pain.

By leveraging open source software, you can minimize the painful part.

For this example we'll assume that you are a local sightseeing company. Your customers want to be able to access real-time pricing and availability for all of our tours.

They use the opentravel 2012A Tour Activity Availability message pair using SOAP over HTTP.

This means you need a web server, a SOAP processing module, and a schema parser, as well as your code. Luckily open source software does most this.

If you're impatient and you just want this demo up and running with a just a few commands, click here for the schema library rest example.

I've created a template for your sample project. To create your project from this template, start eclipse and select:

File -> New -> Project -> Maven Project
On the Archetype screen, select the archetype: opentravel-touractivity-ws-service-archetype. If the artifact doesn't appear, click the 'add archetype' button; GroupId: org.jibx.schema.org.opentravel._2012A.ws, ArtifactId: opentravel-touractivity-ws-service-archetype, Version: 1.0.6 (Not the version show in this image)

On the Project screen, enter your group, artifact name, and version.

You can enter anything you want here. You will need your project group, artifact, and version when you deploy your project.
Click finish to build your project.

This project has two files.

The blueprint.xml file is the configuration file. This blueprint tells the system to register this service to handle opentravel touractivity messages.

The source file handles the actual messages. This code is expected to process request messages and return a response.

If you look at the source code, you will find the method:
public AvailRS avail(AvailRQ request)
I have included some sample code that returns availability and pricing for several fake tours. This is where you would access your inventory and pricing and populate the return message.
The cool part of using a java representation of the opentravel xml message is you can use all the eclipse programming shortcuts, such as auto-complete and documentation display. All the comments and xml snippets from the (complex) opentravel schema have been transferred to the java source code. Try to ctrl-click one of the request or response method names and you will be looking at the java source code model of the xml message. Nice!

To build the project, right-click the project name in the project explorer and select Run as -> Maven install

Now we are ready to deploy this code.

For this example, I'll use servicemix. You can also use any one of the enhanced esb servers such as Talend or Fuse. In fact, this code uses only open specifications, so you should be able to run it with minor configuration changes on almost any java app server.

Download servicemix, unzip, and run it:

tar zxvf apache-servicemix-4.4.2.tar.gz
cd apache-servicemix-4.4.2
bin/servicemix

Now start the RESTful server and the SOAP server. These servers are configured to send incoming messages to a service registered to handle touractivity messages. (The blueprint.xml file does this) Type these command into the servicemix console.
features:install obr
obr:addurl http://www.jibx.org/repository.xml
obr:deploy org.jibx.schema.org.opentravel._2012A.touractivity.ws.soap
obr:deploy org.jibx.schema.org.opentravel._2012A.touractivity.ws.rest
# Enter the actual group/artifact/version of your project here:
install mvn:org.jibx.schema.org.opentravel.ws/org.jibx.schema.org.opentravel._2012A.touractivity.ws.service/0.0.1-SNAPSHOT
# Note: Due to an OSGi issue, you will need to shutdown and restart servicemix here (ignore any errors on startup):
shutdown
bin/servicemix


# After it starts back up, start your services:
start org.jibx.schema.org.opentravel._2012A.touractivity.ws.service
start org.jibx.schema.org.opentravel._2012A.touractivity.ws.soap
start org.jibx.schema.org.opentravel._2012A.touractivity.ws.rest

Give it a moment to start, then try out the rest service by clicking this link:
http://localhost:8181/cxf/touractivity/avail/cityss/2012-04-12

You can test the SOAP service using soapui. The wsdl location is http://localhost:8092/soap/touractivity?wsdl.Try sending this soap message:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <ns:OTA_TourActivityAvailRQ TimeStamp="2012-04-19T05:16:51.353Z" Target="Production" Version="1.0"
           xmlns:ns="http://www.opentravel.org/OTA/2003/05">
         <ns:TourActivity>
            <ns:BasicInfo TourActivityID="CITYSS"/>
            <ns:Schedule>
               <ns:StartTime>2012-05-11</ns:StartTime>
            </ns:Schedule>
            <ns:ParticipantCount Quantity="1"/>
         </ns:TourActivity>
      </ns:OTA_TourActivityAvailRQ>
   </soapenv:Body>
</soapenv:Envelope>
Your response should look something like this:
VoilĂ