Friday, April 27, 2012

A Tribute to Todd Simko

I was planning on continuing my series of blog posts today on Neo4J however I was saddened yesterday but the news of the death of Todd Simko.  Todd was once the members of one of my favorite bands (Pure) and also someone whom I had the joy of working with in the studio.  This photo was taken the last time we were together with John Webster recording our second studio album at mushroom studios.  Todd Simko has a credit on 22nd Century's 2011 "Where's Howie!??" but the words "mastered by Tom Simko" just don't do him justice.


Left to right - John Webster, myself (Duane Chaos) and the late Todd Simko.


I clearly remember this day.  We were trying to do the final mixing of the song Runaway and John kept blowing fuses and getting frustrated.   The studio runner (Alexis) went out and came back with some fine French wine which we made short work of.   I distinctly remember John Webster repeating "keep that stuff away from the mixing console you two" about every five minutes.   These were good times.  Just guys, hanging out doing music, there was no time, we were all in the present and enjoying that special moment.  Todd, may you rest in peace.  Your inspiration to so many of us will never die.  Thank you for the gifts and memories you gave us both in person and on stage.    Your style inspires today and your friendliness is infectious.

Addendum:  Todd's wife issued a statement which I will repeat here:

"Minna Simko has offered the following statement on Facebook concerning her husband's passing:

"Todd may your soul be finally at peace. You are not only the most fantastic father and husband one could have, but also you were also a great friend, musician, teacher, guide, mentor and music engineer.

"The music community has suffered now a great loss and talent. Not only did you touch all the hearts of people in music but also in the lives of family, my peers and especially our daughters friends and family. You will forever remain close by in our hearts and you will be greatly missed by all."

Thursday, April 26, 2012

NEO4J - Installing, Running and the Shell!

Yesterday I write a brief intro to Neo4J and promised to write more.  Yesterday's post focused in on what a Graph Database is.  Today we'll actually download and install the software itself.  First, and I know you all hate this part, please make sure you have the pre-requisites installed.  The people who write most software today all take time to document this so you get to have a better experience.

For reference, the machine I am on is a Mac Pro, 12 GB RAM and running OSX 10.7.3. It has 2 X 3 GHz Quad Core Intel Xeon processors so it should make short work of anything I through at it.  My machine is Unix based so please modify the instructions based on your operating system.  Linux users will be roughly the same.

1. Grab your browser (Chrome of course) and point it at http://neo4j.org/download/

2. There are a variety of options open.  Unless you want to start with the über - enterprise version or build Neo4J Community from GitHub source, simply grab the latest stable version.  In this case it is the Community (ie "free") version 1.7.  If you have a slow connection, use the time wisely to view Emil's video while the download completes.  You will have to choose a location for the download.

3. Unpack the source with whatever tools your Operating System provides.  Once unpacked, it will look something like this:


4.  To start Neo4J, it is quite easy.  Grab a terminal (Shell) and navigate to the <neo4J_Home_Directory>/bin directory and type in sh ./neo4j     This will give you a list of available options for starting the database as shown below:



5. These are very  simple and self explanatory.  To start neo4J, simply type in sh ./neo4j start 


6. There are two ways to verify the neo4j instance has started.  the first is to type in the command sh ./neo4j status which gives you a simple acknowledgement that it has started and the process ID (Unix based systems).  A second, more verbose set of details, can be retrieved by typing in the command sh ./neo4j info   This gives you a wealth of information including every jar in the CLASSPATH, JAVA_OPTS (options), the environmental variable JAVA_HOME, the NEO4J_INSTANCE which is a path to the current instance, the server PORT it is using over HTTP and the NEO4J_HOME environmental variable as well as the current JDK value.  


Validating the port is fairly easy.  Just grab your handy browser (Chrome please) and go to http://localhost:7474 (unless you've already changed the configuration file to a different port).  YOu should see a newly initalized databased as such:



So where can we configure these?  Let's start with the JAVA_OPTS.  YOu will see a line that looks like this -Dorg.neo4j.server.properties=conf/neo4j-server.properties The first part of this configuration starting with -Dorg.neo... is specified within a file that is under the /conf directory named neo4j-wrapper.conf.  The JVM parameters are all specified here but are actually pointers to other configuration files.  If you open this fine, you will see the same lines here:

wrapper.java.additional.1=-Dorg.neo4j.server.properties=conf/neo4j-server.properties
wrapper.java.additional.2=-Djava.util.logging.config.file=conf/logging.properties
wrapper.java.additional.3=-Dfile.encoding=UTF-8

Note that on OSX, the Java Version simply says "CurrentJDK" which is pretty bloody useless.  If you really want to know the JDK version, use your command window and type in java -version.  In my case I am running
 java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-11M3635)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode)

Within the neo4j-wrapper.conf there are several properties such as the initial and maximum  java heap sizes along with some warnings.  It is probably a good idea to become familiar with the warnings before you go about tinkering with these settings.  The one I found useful was to be able to uncomment line 10 to allow garbage collection logging.  This data can be valuable in determining what is going on under the hood so I change it with every install. 

This information is important for the next steps when we will embed neo4J into an Eclispe project.  For today, let's play with our new Neo4J instance.  In order to get the neo4j shell, simply type in the command (under the same <neo4J_Home_Directory>/bin directory) sh ./neo4j-shell  This will now enable you to look around at some of the available options.  Type in help for a list of commands.


The shell commands are all well documented at http://docs.neo4j.org/chunked/stable/shell-starting.html.  Note that the shell is configured and enabled from the configuration of the Neo4j kernel (again in the /conf folder).  Okay - enough foreplay.  Let's make some nodes!  Build your first few nodes ny using the mknode command.  I can make two nodes, one with my name and one with my wife's name as such.

neo4j-sh (0)$ mknode Duane
neo4j-sh (0)$ mknode Bettina

If I go back and check the browser aimed at http://localhost:7474 it will confirm that now in addition to the root node, there are two additional nodes for a total of three.  Congratulations.  You have just made some nodes!  So how do you get to those nodes?  This is why I started the documentation on Technoracle.  I found it confusing using the neo4j-shell since almost every command resulted in an empty query until I read the documentation (an engineer's last resort).  The GraphDB works almost exactly like a unix filesystem which means your learning curve should be tens times faster (assuming you're familiar with unix commands).  When you invoke the shell, you are basically in the "~" directory or "me" as the neo4J folks call it.  To traverse somewhere (to Duane or Bettina for example, you need to make a relationship using the mkrel command.  It is very simple.  Type in the following, 

mkrel -ct KNOWS Duane

Now let's dissect this.  mkrel is the command to make a relationship.  There are two variables "-ct".  C should be supplied if you are creating a new node (the wording is a bit rough to read using the "man pages and it took a while to figure out that a a relationship is basically a node as well. 

If you want to nuke the graph, you can also do this using rmnode to delete nodes and rmrel to delete relationships.  rmnode comes with a nasty little flag -f which has the same effect as the unix command "su rm -r *" which removes everything.   As you probably guessed, using rmnode with the -f flag was irresistable and I had to try it so I typed in rmnode -f.  Now beware, this removes all including the current node.  Once you run this and try an ls, the return will be a question mark since there is no current node (or at least it didn't seem to be reachable.  After running this you get:

neo4j-sh (?)$ ls
Node <ref> not found

To fix this, simply create a new root current node.  You can even use JSON to give it a more robust meaningful name.

neo4j-sh (?)$ mknode --cd --np "{'name':'me'}"
neo4j-sh (me,10)$ 

Don't ask me why I do stuff like this.  I think I just like to explore what is possible and how to recover before doing any serious work.  


Earlier we created nodes that had no relationships we could traverse.  Now we will use a different syntax to create new nodes we can reach.  This easier way to create new nodes you can traverse to using the shell is to use the mkrel command.  This command can actually create the new nodes as well as the relationship between the current and newly created node.  To do this, type in the following:

mkrel -t LOVES neo4j and then type in ls into the prompt after that has finished.


Ta-da!  You can now traverse the node using the trav command.  The traverse command is very complex and can build very powerful statements and filters.  For this lesson, all we want to do is go from the current node to the node we just created (node 11) in this case.  To do this, use the syntax

trav -o depth -r LOVES:both,HAS_.*:incoming 

trav = traverse
-o depth = the traversal order.  The only possible values are BREADTH_FIRST DEPTH_FIRST breadth or depth.  Think of these as controls over a funnel - very wide and shallow or very narrow and deep)
-r LOVES:both,HAS_.*:incoming= the r flag sets the relationship type.  In this case apparently (me) - [:LOVES] -> (11) or I love node 11.  To be honest, I might delete it right after this tutorial as I am already growing tired of this  relationship ;-)   I am somewhat not clear on the ":both,HAS_.*:incoming" however I believe it specifies that the traversal is to disregard the fact it is incoming or outgoing.

Okay - enough for today boys and girls.   More soon.  In the meantime, please do try this at home!









Wednesday, April 25, 2012

Getting started with Neo4J - a Beginners Tutorial

I've worked with databases for a long time.  Recently, a came across neo4J and cannot believe how awesome it is.  I want to devote this blog post to helping people get it installed and the fun you can have.

First, a little bit abut Graph Databases.  Graph databases are substantially different than RDBMS systems. As one person puts it, if you write, you can write code, if you can draw you can draw graphs.  It is really that simple.  A graph database starts with a root node.  The database is comprised of nodes, relationships, indexes and properties.  A simplification of this is the following chart:


A simple graph database.

A graph database keeps track of nodes and relationships as well as indexes (we'll get into that later).  For now think of this in kinderSpiele terms.  A graph is simply a drawing that show how things are connected.  Each connection might have a name.  each node might also have a name.  Here is a simplistic view of a graph.


In this simple graph, Duane - [LOVES] -> Neo4j, the latter of this has a property of being binary.  Now psychology aside (this in fact would be an unhealthy physical relationship), this captures several important concepts yet leaves out several very relevant ontological answers. Relationships organize Nodes into structures that allow a Graph to resemble many natural structures including a List, a Tree, a Map, or a compound Entity – any of which can be combined into yet more complex, richly inter-connected structures.  It is obvious that Duane loves Neo4J but here are some questions that are left unanswered.

1. Does neo4J love Duane back?
2. Is Neo4J even aware that Duane loves it?
3. Is Duane able to see that Neo4J is in fact a binary node and probably not suited for a proper relationship?

All are possible but undefined in this scenario.    That is why the next concept that must be introduced is a traversal mechanism.  Traversals allow navigation of graphs via statements that can select exact routing between many of these objects.  THese can be written in many languages such as cypher and allow a filter to be applied to find a path though the nodes and relationships to find answers to certain questions.  Such a question in the real world may be "How many friends do I have who enjoy eating spumonte ice crean while reading up on graph databases on Technoracle".  In reality that subset of the population is likely very small but when applied to something like Facebook or Google Plus, become highly relevant.

Here is a depiction of how traversals work. Again this is rudimentary.



Again,. this is very simple but you get the idea.  The traversal mechanism can take a set of instructions, then use if to find data it requires very efficiently.  An example might be that you use Facebook.  When you log in, it starts with the node of "you".  As the page loads, the javaScript on the page creates a backend query that says find all the nodes that are related to the user down to a layer of X deep.  Neo4J's Java API supports depth limits making it idea for this sort of operation.  Unlike an RDBSM system where an entire table might have to be walked, Neo4J allows you to set limits and take actions based on the current state.   Paths are predefined statements, often written in Cypher.

Keeping with the Facebook example, an INDEX is often a useful tool.  When a certain node is required a a start point over and over again, you can use it as an index to start with.  By contract, RDBS systems use a table and rows lookup to find the startpoint.  The index is simply a contextual based starting point.  Indexes can map directly to a node, a relationship or backwards from a property.  Instead of saying:
SELECT * FROM TABLES WHERE * EQUALS "Duane Nickull"....  you can tell a graphDB to "get Duane Nickull" then traverse outwards from him.  Simple and efficient.

Neo4J is a commercially supported, free and open source graph database that is going to rock the world.  Trust me on this.  Next post will be getting started.  All the sordid details (at least 3 easy steps) it takes to get up and running.





Tuesday, April 24, 2012

Renaissance Hotels Censoring their Facebook page

Yesterday I made a post on the unfair and immoral practice of using a company like SonicBids that gets a monopoly on a music event causing all acts that want to play there to "PayP" to apply to play at the event.  They get exclusive rights on events like SXSW.  I found to my horror that they were trying to move into Canada via an event at the Renaissance hotel here.  I worded a polite but factual post to help them understand the system they  were promoting.  It got posted but was censored by the hotel chain webmaster.  here is the link to the event:

http://www.sonicbids.com/Opportunity/OpportunityView.aspx?opportunity_id=107186

Here is a screenshot before being censored:


yet an hour later it is gone:


Censorship to prevent the world from knowing you are supporting an business model that takes money unfairly out of the hands on musicians.  Yes - no one will ever figure that out.  Whoops!  #SHAME!


Monday, April 23, 2012

Why I boycott SXSW and Urge You do to the Same

As both a tech guy and a musician, I have made a decision to boycott SXSW.  They use an evil and monopolistic business practice to force bands to PAY MONEY to apply to play music using a service called Sonicbids.   If you are a musician, your trade (performing music) is your primary source of income hence it is your "work".   One year we (22nd Century) decided to apply to play given we had fairly good radio audience in Texas and also had lots of MySpace and other fans in the area. The tech/developer crowd is also one of our primary audiences.    We went to the SXSW website and it read something to the effect of:

"All artists interested in performing at SXSW must complete an online application through our exclusive online musical event submission platform Sonicbids." followed by the sentence "You'll only hear from us before that time if we encounter a problem or require more information.

Source: http://sxsw.com/music/shows/faq

To apply to work your trade, indie artists are forced to hand over $40.00.  The facts can be verified at this web page on Sonicbids.  Once you apply (yes we did this once even though it is morally offensive), it is not transparent.   You apply along with thousands of other artists and hear nothing back.   That's it.  They took your money and you got nothing in return.  There is no clear statement about how many SonicBids artists actually get to play at SXSW.  It says they are exclusive, but I find it hard to believe guys like Duff McKagan, a former music panelist at SXSW and good friends with my friends Randy Rampage and Zippy Pinhead, would pay this fee.   Is it possible that SXSW hires the bands they want anyways and maybe gives X remaining slots to SonicBids hires?  No one knows the truth other than SonicBids and SXSW.

All of a sudden you see an announcement like this one from NPR music saying that Fiona Apple, Bruce Springsteen and others are playing. Let me ask you some basic questions.

Do you think they (Bruce and Fiona) paid $40.00 to apply to work at SXSW?  Would you pay your boss $40.00 every day to ask him if you could work and the response might either be "yes" or complete silence?

I personally answer "no" to both of these questions.  Read the statement above again.  It says "exclusive".   Here is an open question to anyone.  Have you ever seen a band play at SXSW through another vehicle that SonicBids?  If so, please tell us about it.

So what is going on here?  Simple.  This is illegal in most countries.  We are musicians.  Granted I do not need to personally make money on music but many of my dear friends to.  This system is shameful and it is not conducive of fair trade.  SXSW should immediately to the right thing and move to a crowd sourced model which musicians are allowed to freely enter and the system is completely transparent.  This closed doors, money grab is a slap in the face to the artists, many of who are trying to simply survive while pursuing their passion in music.  Who loses?  Everyone except SonicBids.  You the music fans at SXSW do not get to vote on who you want to see, the musicians lose money and get noting in return and SXSW makes the ultimate choices. SXSW does not get the best customer experience from those who attend, hence also loses.  I am not sure if SonicBids kicks back any money to SXSW and would love to see the financial statements.  Oh, I guess they are not for public eyes.

Wait!  This gets worse.  As noted by Jeff Price, the founder of TuneCore:

"Who's benefiting from it? All the wrong people," stresses Jeff Price, founder and CEO of TuneCore, a digital music distribution service. "The traditional music industry now has a new income stream that is based on other people's music and copyrights being exploited and sold. It is the largest global scam that exists in the music industry today, depriving artists and songwriters of hundreds of millions of dollars."

Jeff nailed it (thank you Jeff).  Not only are the artists getting their music downloaded for free, they are forced to pay to apply to ply their trade, and the streams are also stolen and no money flows back.  This is morally offensive.  I write this blog post and ask you all to think about this.  I'm sure if you're planning to go to SXSW you will still go but if there is anything you can do to raise attention to this situation, my brothers and sisters, the artists of the music industry, the lowest rung on the ladder, would appreciate it.  You see, we no longer have power in this matter.  This is a plea to you to help us.

It's very simple.  If we do not have fair trade introduced into the mix, the arts suffer.  It becomes run by the mainstream media who decide for you what you will see.  All we ask for is an equal chance to perform.  All we ask is to be able to ply our trade without being robbed, used and actually get a fair compensation for our work.  We put in ten thousand hours of practice, buy our own instruments and gear, pay our own way to go to shows and perform.  Being preyed on by monopolistic business practices hurts us.

Dear SonicBids, if you ever try to come to British Columbia, you will be met with a swift response of getting the BC labour relations board immediately aware that you are violating several provincial statues around the labour market.  That is before the BC Gaming Commission looks at you for opening up a "lottery" and allowing bands with minors to place bets based on their believe they will be hired to money.  If you do manage to get by them, any gig you try in a major city will be met with swift and violent boycotts.  I will put myself on the front line as many of my Vancouver friends will do to stop you from migrating your business to British Columbia, Canada.  We will not let any musician play a gig in Vancouver if they had to pay SonicBids to apply to play!  It is that simple.  Stay out of our province.  There several hundred of us who will show up at such a gig to shut it down.

Dear people elsewhere, use this as a template.  Understand the system and realize by going to SXSW you are part of a system that takes advantage of indie musicians and artists, who are often the amongst the poorest of the system.  Help support them by demanding SXSW and other bars engage in fair trade practices and demand your right to crowd source music.  Bring this up at panels or ask the people on the music panel what they think about this.  Raise awareness.  Help us!

To SXSW - expect me to be a thorn in your side until you fix this.  I will personally offer to help you devise and implement a better system that treats musicians fairly.  If you show the courage to acknowledge this error and move forward to correct the situation, I am positive the crowds of people attending will be happy to help vote the bands they want to see play.  The ball is in your court to acknowledge an injustice and correct it.  Until then, you will not see me and I will be vocal in fighting what I and my local laws deem illegal.

SXSW - the next move is yours to fix this. I'm here to help if you want.

Wednesday, April 18, 2012

Uberity, LiveCycle and Mobile Forms

I get pinged a lot asking if we have any "LiveCycle Developers for hire".  At Uberity we also get asked this a lot.  The blog post referenced above explain what we can and cannot do but failed to mention training and mobile.  One of the key offerings that I believe any enterprise software company can give is training and knowledge transfer to their customers.  It is one thing to go into a customer and install a system or solution, but there is an onus to train the customer how to use it.  We believe this is an essential part of any LiveCycle deal.

With Adobe LiveCycle, we see a repeatable pattern of people who have bought LiveCycle ES and also are not using it to the full potential.  This means they are not getting the most optimal return on their IT investment.  Learning LiveCycle is daunting however.  If you want to really get good at it, there are about 20 different course modules to take.  One of the most recent patterns that is emerging is the aspect of mobile devices.

Mobile and LiveCycle ES

We have started building our own technology platform that will compliment LiveCycle ES.  Going to mobile or wireless devices from LC ES is also a challenge.  There is a mistaken belief that PDF or XDP forms can work for this.  Even if it did work, it is most certainly not the right solution.  Adobe is rumoured to be brewing up an in house way to round trip from LiveCycle to Mobile but the reality is that most companies will use only a small subset of mobile features and the first iteration will likely focus on forms.  Uberity has build up a set of native components and functionally re-usable code module that can be leveraged for those who want fast applications that can access low level API's on various mobile systems.  We firmly believe that we are doing is a superior solution, just potentially more costly for the end user.  To help people understand the issues, we published a white paper entitled "Mobile Application Development Strategies which is free to download and share.

If your organization is considering such patterns, please come and talk to us by emailing info at uberity dot com.  We don't bite (well usually).  If you need it fast, we can help.


Friday, April 13, 2012

Battenkill 2012 Live Video Stream

The Tour of the Battenkill is a classic American Bicycle race.  Many people are interested in watching it and until now there are no live video streams.  Uberity has launched a mobile application as part of it's new platform that combines mobile video, social media and collaborative capabilities to increase user experience.  Think about an application that will eventually provide the best of live TV, commentating, twitter feeds (via our friends at HootSuite), interactive media and more.   The live video stream of the the Tour of the Battenkill application is Android only in this year's release.  You can get it and watch the race live on Sunday by pointing your Android device at  http://uberity.com/app. 


/*** UPDATE
   *  Unfortunately, there is a technical issue at the broadcast site.  
   *  This is being worked on
   *  and hope to have it resolved by Sunday.
   *  UPDATE 2: It's live right now showing finish line - http://uberity.com/app.
   */
More about the Battenkill


Most years thousands of spectators and cycling enthusiasts flock to see top pros and fast amateur racers battle on what is undeniably one of the most challenging courses.  There are sections that have no asphalt and tough short climbs for 82 miles.  With attacks likely to start at mile zero, the 2012 race will be one of attrition and an exciting event to watch.  On that latter point, we realized there was no way to actually watch the event as it is not televised.  After some brainstorming and less than a week of development time,  we are pleased to announce a free application based on the Uberity mobile platform for live events.    Please be kind – there are bound to be technical difficulties in keeping the stream.

Tuesday, April 10, 2012

SOA White Paper - Service Oriented Architecture (SOA) and Specialized Messaging Patterns

This blog post is based on an original article I wrote around 6 years ago. While the terms used to describe Service Oriented Architecture (SOA) have changed in recent years (to terms like "Cloud Computing" and "SaaS"), the basic tenets are still valid.  Therefore, I am posting the original white paper here on Technoracle with a series of updates to the topics in an attempt to explore the concept of SOA within the context of mobile application development in a subsequent series of blog posts.  To be the first to read the new data, subscribe to this blog.
Service Oriented Architecture (SOA) and Specialized Messaging Patterns


1.0 Thesis

The widespread emergence of the Internet in the mid 1990s as a platform for electronic data distribution and the advent of structured information have revolutionized our ability to deliver information to any corner of the world. While the introduction of Extensible Markup Language (XML) as a structured format was a major enabling factor, the promise offered by SOAP based webservices triggered the discovery of architectural patterns that are now known as Service Oriented Architecture (SOA).  XML and the JavaScript Object Notation (JSON) format, enabled portable data but the architecture based on services was the real coup in the expansion of data sharing.

Service Oriented Architecture or SOA is an architectural paradigm and discipline that may be used to build infrastructures enabling those with needs (consumers) and those with capabilities (providers) to interact via services across disparate domains of technology and ownership. Services act as the core facilitator of electronic data interchanges yet require additional mechanisms in order to function. Several new trends in the computer industry rely upon SOA as the enabling foundation. These include the automation of Business Process Management (BPM), composite applications (applications that aggregate multiple services to function), and the multitude of new architecture and design patterns generally referred to as Web 2.0. The latter, Web 2.0, is not defined as a static architecture. Web 2.0 can be generally characterized as a common set of architecture and design patterns, which can be implemented in multiple contexts. The list of common patterns includes the Mashup, Collaboration-Participation, Software as a Service (SaaS), Semantic Tagging (folksonomy), and Rich User Experience (also known as Rich Internet Application) patterns among others. These are augmented with themes for software architects such as trusting your users and harnessing collective intelligence. Most Web 2.0 architecture patterns rely on Service Oriented Architecture in order to function. When designing Web 2.0 applications based on these patterns, architects often have highly specialized requirements for moving data. Enterprise adoption of these patterns requires special considerations for scalability, flexibility (in terms of multiple message exchange patterns), and the ability to deliver these services to a multitude of disparate consumers. Architects often need to expand data interchanges beyond simple request-response patterns and adopt more robust message exchange patterns, triggered by multiple types of events. As a result, many specialized platforms are evolving to meet these needs.

This white paper discusses specializations for advanced data exchanges within enterprise service oriented environments and illustrates some of the common architectures of these new platforms.
2.0 An Introduction to Service Oriented Architecture

Service Oriented Architecture (SOA) is a paradigm for organizing and utilizing distributed capabilities that may be under the control of different ownership domains and implemented using various technology stacks. In general, entities (people and organizations) create capabilities to solve or support a solution for the problems they face in the course of their business. It is natural to think of one person’s needs being met by capabilities offered by someone else; or, in the world of distributed computing, one computer agent’s requirements being met by a computer agent belonging to a different owner. The term owner here may be used to denote different divisions of one business or perhaps unrelated entities in different countries.

There is not necessarily a one-to-one correlation between needs and capabilities; the granularity of needs and capabilities vary from fundamental to complex, and any given need may require a combination of numerous capabilities while any single capability may address more than one need. One perceived value of SOA is that it provides a powerful framework for matching needs and capabilities and for combining capabilities to address those needs by leveraging other capabilities. One capability may be repurposed across a multitude of needs. SOA is a “view” of architecture that focuses in on services as the action boundaries between the needs and capabilities in a manner conducive to service discovery and repurposing.
2.1 Requirements for SOA






Figure 2-1 shows an example of an information system scenario that could benefit from a migration to SOA. Within one organization, three separate business processes use the same functionality, each encapsulating it within an application. In this scenario, the login function, the ability to change the user name, and the ability to persist it are common tasks implemented redundantly in all three processes. This is a suboptimal situation because the company has paid to implement the same basic functionality three times.



Figure 2.1 – three business processes within one company duplicating functionality

Moreover, such scenarios are highly inefficient and introduce maintenance complexity within IT infrastructures. For example, consider an implementation in which the state of a user is not synchronized across all three processes. In this environment users might have to remember multiple login username/password tokens and manage changes to their profiles in three separate areas. Additionally, if a manager wanted to deny a user access to all three processes, it is likely that three different procedures would be required (one for each of the applications). Corporate IT workers managing such a system would be effectively tripling their work –and spending more for software and hardware systems.

In a more efficient scenario, common tasks would be shared across all three processes. This can be implemented by decoupling the functionality from each process or application and building a standalone authentication and user management application that can be accessed as a service. In such a scenario, the service itself can be repurposed across multiple processes and applications and the company owning it only has to maintain the functionality in one central place. This would be a simple example of Service Oriented Architecture in practice. The resultant IT infrastructure would resemble Figure 2.2.



Figure 2.2 – three business processes repurposing one service for common tasks.

In figure 2.2, the shared user account tasks have been separated from each process and implemented in a way that enables other processes to call them as a service. This allows the shared functions to be repurposed across all three processes. The common service bus is really a virtual environment whereby services are made available to all potential consumers on a fabric. This is typically referred to as an Enterprise Service Bus (ESB) and has a collection of specialized subcomponents including naming and lookup directories, registry-repositories, and service provider interfaces (for connecting capabilities and integrating systems) as well as a standardized collection of standards and protocols to make communications seamless across all connected devices. Advanced ESB vendors have tools that can aggregate services into complex processes and workflows.

In the preceding example of SOA, the complications were relatively minor as the entire infrastructure existed within one domain. In reality, enterprise SOA is much more difficult because services may be deployed across multiple domains of ownership. To make interactions possible, mechanisms have to be present to convey semantics, declare and enforce policies and contracts, the ability to use constraints for data passed in and out of the services as well as expressions for the behavior models of services. The ability to understand both the structure and semantics of data passing between service endpoints is essential for all parties involved.

While most SOA examples are typically shown as a request-response interaction pattern, more robust exchanges are required. Additionally, modern service platforms also need the flexibility to support these advanced message exchange patterns. Before discussing the platform and reference architecture, this white paper will briefly delve into SOA in more detail.

2.3 A Reference Model for Service Oriented Architecture

As with any other architecture, Service Oriented Architecture can be expressed in a manner that is decoupled from implementation. Software architects generally use standardized conventions for capturing and sharing knowledge. This group of conventions is often referred to as an Architecture Description Language (ADL). There are also several normalized artifacts used to facilitate a shared understanding of the structure of a system, its major components, the relationships between them, and their externally visible properties. This white paper will make use of two special types of these artifacts – a Reference Model and Reference Architecture.

A Reference Model is an abstract framework for understanding significant entities and relationships between them. It may be used for the further development of more concrete artifacts such as architectures and blueprints. Reference models themselves do not contain a sufficient level of detail sufficient to enable the direct implementation of a system. In the case of a reference model for SOA, the Organization for the Advancement of Structured Information Systems (OASIS) has a standard Reference Model for SOA, shown in Figure 2.3, that is not directly tied to any standards, technologies, or other concrete implementation details.

In order for SOA to be meet these challenges, services must have accompanying service descriptions to convey the meaning and real world effects of invoking the service. These descriptions must additionally convey both semantics and syntax for both humans and applications to use.

Each service has an interaction model, which is the externally visible aspects of invoking a service. In this paper, this will be decomposed further to examine the data service aspects of SOA.


Figure 2.3 – the core OASIS Reference Model for Service Oriented Architecture

Visibility and Real World Effect are also key concepts for SOA. Visibility is the capacity for those with needs and those with capabilities to be able to see and interact with each other. This is typically implemented by using a common set of protocols, standards, and technologies across service providers and service consumers. For consumers to determine if they can interact with a specific service, Service Descriptions provide declarations of aspects such as functions and technical requirements, related constraints and policies, and mechanisms for access or response. In many real world situations, service descriptions may be technically described in instances of Web Services Description Language (WSDL) documents.

The descriptions must be in a form (or can be transformed to a form) in which their syntax and semantics are widely accessible and understandable. The execution context is the set of specific circumstances surrounding any given interaction with a service and may affect how the service is invoked.

Since SOA permits service providers and consumers to interact, it also provides a decision point for any policies and contracts that may be in force. The purpose of using a capability is to realize one or more real world effects. At its core, an interaction is “an act” as opposed to “an 4object” and the result of an interaction is an effect (or a set/series of effects). Real world effects are, then, couched in terms of changes to this shared state. This may specifically mutate the shared state of data in multiple places within an enterprise and beyond.

The concept of policy also must be applicable to data represented as documents and policies must persist to protect this data far beyond enterprise walls. This requirement is a logical evolution of the “locked file cabinet” model which has failed many IT organizations in recent years. Policies must be able to persist with the data that is involved with services, wherever the data persists. A contract is formed when at least one other party to a service oriented interaction adheres to the policies of another. Service contracts may be either short lived or long lived.

2.3 Decomposing the Interaction Model

Whereas visibility introduces the possibilities for matching needs to capabilities (and vice versa), interaction is the act of actually using a capability via the service. Typically mediated by the exchange of messages, an interaction proceeds through a series of information exchanges and invoked actions. There are many facets of interaction; but they are all grounded in a particular execution context – the set of technical and business elements that form a path between those with needs and those with capabilities. Architects building Rich Internet Applications (RIAs), are faced with special considerations when designing their systems from this perspective. The concept of “Mashups” surrounds a model whereby a single client RIA may actually provide a view composed by binding data from multiple sources persisting in multiple domains across many tiers.



Figure 2.4 – a decomposition of the Interaction Model (courtesy of OASIS Reference Model for SOA)

As depicted in Figure 2.4, the interaction model can be further decomposed into a data model and behavior model. The data model is present in all service instances. Even if the value is “null”, the service is still deemed to have a data model. The data models are strongly linked to the behavior models. For example, in a Request-Response behavior model, the corresponding data model would have two components – the input (service Request) data model and the output (service Response) data model. Data models may be further specialized to match the behavior model if it is other than “Request-Response”.

The behavior model is decomposable into the action model and the process model. The sequence of messages flowing into and out of the service is captured in the action model while the service’s 5processing of those signals is captured in the processing model. The processing model is potentially confusing as some aspects of it may remain invisible to external entities and its inner working known only to the service provider.

3.0 A Reference Architecture for Service Oriented Architecture


A reference architecture is a more concrete artifact used by architects. Unlike the reference model, it can introduce additional details and concepts to provide a more complete picture for those who may implement a particular class. Reference architectures declare details that would be in all instances of a certain class, much like an abstract constructor class in programming. Each subsequent architecture designed from the reference architecture would be specialized for a specific set of requirements. Reference architectures often introduce concepts such as cardinality, structure, infrastructure, and other types of binary relationship details. Accordingly, reference models do not have service providers and consumers. If they did, then a reference model would have infrastructure (between the two concrete entities) and it would not longer be a model.

The reference model and the reference architecture are intended to be part of a set of guiding artifacts that are used with patterns. Architects can use these artifacts in conjunction with others to compose their own SOA. The relationships are depicted in Figure 3.1.


Figure 3.1 – The architectural framework for SOA (Courtesy of OASIS).

The concepts and relationships defined by the reference model are intended to be the basis for describing reference architectures that will define more specific categories of SOA designs. Specifically, these specialized architectures will enable solution patterns to solve particular problems. Concrete architectures may be developed based upon a combination of reference architectures, architectural patterns, and additional requirements, including those imposed by technology environments. Architecture is not done in isolation; it must account for the goals, motivation, and requirements that define the actual problems being addressed. While reference architectures can form the basis of classes of solutions, concrete architectures will define specific solution approaches.

Architects and developers also need to bind their own SOA to concrete standards technologies and protocols at some point. These are typically part of the requirements process. For example, when building a highly efficient client side Mashup application, a developer might opt for the ActionScript Messaging Format (AMF) to provide the most efficient communication between remote services and the client .

Neutrality

The reference architecture shown in Figure 3.2 is not tied to any specific technologies, standards, or protocols. In fact, it would be equally applicable to a .NET or J2EE environment and can be used with either the Web Service family of technologies, plain old XML-RPC (XML – Remote Procedure Call), or a proprietary set of standards. This reference architecture allows developers to make decisions and adopt technologies that are best suited to their specific requirements.



Figure 3.2 – A generic SOA Reference Architecture for implementing core Web 2.0 design patterns
(Courtesy of O’Reilly Media)

3.1 Service Tier

The server side component of the reference architecture has a number of commonly used components. The Service Provider Interface is the main integration point whereby service providers connect to capabilities that exist in internal systems in order to expose them as services. These internal applications typically reside in a resource tier, a virtual collection of capabilities that become exposed as services so consumers can access their functionality. Service providers may integrate such capabilities using numerous mechanisms, including using other services. In most cases, an enterprise will use the Application Programmatic Interface (API) of the system as provided by the application vendor.

The Service Invocation Layer is where services are invoked. A service may be invoked when an external messages being received or, alternatively, it can be invoked by an internal system or by a non-message based event (such as a time out). It is essential to understand that services may be invoked via messages from multiple sets of standards and protocols working together. Common examples of external service interface endpoints include:

• Asynchronous JavaScript and XML (AJAX),
• Simple Object Access Protocol (SOAP),
• XML Remote Procedure Call (XML-RPC),
• a watched folder being polled for content,
• an email endpoint, and
• other REST(viii) style endpoints including plain old HTTP and HTTP/S.

Services may also be invoked by local consumers including environments like J2EE and language specific interfaces (for example - Plain Old Java Objects or POJO’s).

Each service invocation is often handed to a new instance of a service container. The service container is responsible for handling the service invocation request for its entire lifecycle, until either it reaches a successful conclusion or failed end state. Regardless of its ultimate end state, the service container may also delegate responsibilities for certain aspects of the service’s runtime to other services for common tasks. These tasks typically include logging functions, archiving, security, and authentication, among others.

To facilitate orchestration and aggregation of services into processes and composite applications, a registry-repository is often used. During the process design phase, the registry-repository provides a single view of all services and related artifacts. The repository provides a persistence mechanism for artifacts during the runtime of processes and workflows. If multiple system actors use and interact with a form, the repository can persist it while allowing access to privileged individuals.

Design, development and governance tools are also commonly used by humans to deploy, monitor, and aggregate multiple services into more complex processes and applications.


3.2 Client Tier


While much attention has been focused on the server side aspects of SOA, less has been written about the new breed of clients evolving for consuming services. The clients have evolved to embrace many common architecture and design patterns discussed in greater detail in the next section. A highly visible example of this is the ability of most modern browsers to subscribe to RSS feeds.



Figure 3.3 – client application architecture

As depicted in Figure 3.3, clients must have far more robust communications services than a decade ago. In fact, any communication standards, protocols and technologies (such as SOAP), ActionScript Messaging Format, or XML-RPC) have to be implemented on both sides to facilitate proper communications. Client side communications buses also need to monitor the state of communications including potentially both synchronous and asynchronous exchange patterns.

The main controller of each client application must be capable of launching various runtime environments. This is typically done via launching one or more virtual machines that can interpret scripting languages or consume bytecode as in Adobe Flash. The architecture for these virtual machines varies greatly depending upon the language used. Some compile an intermediate level bytecode just in time to run a program while others must be launched and make.

Representational State Transfer (REST) is an important component of Roy Fielding’s Dissertation
Architectural Styles and the Design of Network-based Software Architectures -
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

The Simple Object Access Protocol is a W3C Recommendation - http://www.w3.org/TR/soap/ multiple passes over a script (usually once to check it for errors, another time to run the script, and a concurrent iteration to collect garbage and free up memory as it becomes possible to
reallocate.

Most modern clients have some form of data persistence and state management. Data persistence is not always done using a traditional database. Increasingly, NoSQL Graph Databases are being used to store nodes which offer greater flexibility and scalability, as well as increased performance. This usually works in conjunction with the clients’ communications services to allow the controller to use cached resources rather than attempting to synchronize states if communications are down. Additionally, rendering and media functionality specific to one or more languages is used to ensure the view of the application is built in accordance with the intentions of the application developer.

The security models used by different clients also vary somewhat. The usual tenets are to prevent unauthorized and undetected manipulation of local resources. In distributed computing architectures, identity (knowing who and what) is a major problem that requires a complex architecture to address. Each client side application must be architected in accordance with the acceptable level of risk based on the user requirements.

3.3 Architectural Conventions spanning multiple tiers


While examining the client and service tiers of the reference architecture, developers will note some commonalities. Architects need to employ common models for determining what constitutes an object, what constitutes an event, how an event gets noticed or captured, what constitutes a change in state, and more. As a result, architecture must take note of several common architectural models over all tiers of modern SOAs.

First and foremost, the core axioms of service oriented architecture should be observed. Services themselves should be treated as subservient to the higher level system or systems that use them. If you are deploying services to be part of an automated process management system, the services themselves should not know (or care) what they are being used for.

Services that are designed otherwise are architecturally inelegant for a number of reasons. First, if services were required to know the state of the overall process, state misalignment would likely result if two services had differing states for even a fraction of a second. In such instances, errors might be thrown when this is detected or worse, developers would have to rely on using a series of synchronous calls to services rather than forking a process into asynchronous calls. As depicted in Figure 3.4, services should remain agnostic to what they are used for. The state of a process or other application using services should be kept within the higher layer of logic that uses consumers to invoke the services.



Figure 3.4 – services within overall architecture

Second, if the overall process stalled or failed for some reason, each service used would have to be notified and rolled back to a previous state. Having services maintain or store the overall state of a process that uses more than one service is an anti-pattern of SOA and should be avoided.

Another core architectural convention is to keep the service consumers agnostic to how the services are delivering their functionality. This results in a clean decoupling of components, another architecturally elegant feature of modern service oriented systems. Having dependencies on knowing the internal working of the services functionality is another anti-pattern of SOA and should also be avoided.

Service composition, the act of building an application out of multiple services, is likewise an anti-pattern of SOA, if composition is defined as per Unified Modeling Language (UML) 2.0. Composition is depicted as a “has a” relationship and the whole is composed of the parts. The correct terminology should be service aggregation. Aggregation is a “uses a” type of relationship. The differences are quite subtle but nevertheless important to grasp. In composition relationships, the life cycles of parts are tied to the lifecycle of the whole and when the whole no longer exists, the parts no longer exist either. In aggregation, the parts exist independent of the whole and can go on living after the entity that uses them no longer exists. This terminology is common within both OOPSLA and UML. Regardless, the term “service composition” has been misused widely within the computer industry and will likely prevail as a norm. Architects and developers should pay close attention to the types of binary relationships between components in loosely coupled, distributed systems and bear these definitions in mind.

3.4 Events


Architects and developers using the reference architecture within this paper should also consider the event architecture. Events often must be detected and acted upon. Each specific programming language has a form of event architecture for detection, dispatching messages, and capturing and linking behaviors to events. The main challenge presented in distributed, service oriented systems is that the event model must traverse multiple environments and possibly span multiple domains. Detecting an event in one domain, dispatching a message to a remote system and linking the event to an action in a virtual machine running on the remote system presents multiple challenges. Architects and developers must often bridge disparate systems. Having a common model used by all systems makes the traversal of systems much easier for developers and architects alike.

3.5 Objects

In much the same way they treat events, each disparate environment in a distributed service oriented environment might have a distinct notion of what constitutes an object. Relying on programming environments and languages that are aligned conceptually with respect to objects (that is, “object-oriented”) makes the work of architects and developers much easier. Languages such as JavaScript (specifically JavaScript Object Notation or JSON), Java, ActionScript, and others have alignment on object concepts. (Note: ECMA’s ActionScript 3.0 is much more object-oriented than previous incarnations and is strongly tied to Java). When a developer must implement a pattern where an object’s state must be tracked in a remote location and action taken upon a state change on the object, a common model for object and encapsulation is important.

3.6 Architectural Patterns

As noted in the reference architecture in Figure 3.1, architecture and design patterns are an important aspect of any architecture.

Patterns are recurring solutions to recurring problems. A pattern is composed of a problem, the context in which the problem occurs, and the solution to resolve this problem. The focus of a documented software architecture pattern is to illustrate a model to capture the structural organization of a system, relate that to its requirements and highlight the key relationships between entities within the system.

Patterns can be classified into three broad categories:

Architecture patterns

Architecture patterns are high level patterns on how systems are laid out and how large systems are divided. These typically account for the major components, their externally visible properties, the major functionality of each component, and the relationships between them.

Design patterns

Design patterns provide a scheme for refining the subsystems or components of a software system, and the relationships between them. They describe a commonly recurring structure of communicating components that solves a general design problem within a specific context.

Idioms

Idioms are the lowest-level patterns and may be specific to a programming language. An idiom guides the implementation aspects of components and the relationships between them, using features specific to a given language or environment.

The modern day concept of patterns evolved from work by Christopher Alexander, the primary author of a book called “A Pattern Language” (xiii) which had a great influence on object-oriented
programming. The basic concept of the book was a realization that patterns are the same when architecting a city, a block, a house and a room. Each of these entities employs similar patterns. The concepts of patterns in software architecture have been widely adopted since being modified by the infamous Gang of Four and are now an accepted part of the engineering trade.  There are also many industry standards and pseudo standards for architectural patterns meta models including the MacKenzie-Nickull Meta-model for Architectural Patterns, which is widely used today.

4.0 Data and Message Exchange Patterns for Enterprise SOA

The most basic message exchange pattern is a common Request-Response where the parties can simply communicate with each other. This is the basic building block of most SOA interactions and is depicted below.

4.1 Request-Response

Request-Response is a pattern in which the service consumer uses configured client software to issue an invocation request to a service provided by the service provider. The request results in an optional response, as shown in Figure 4-1.



Figure 4-1. SOA Request-Response pattern

4.2 Request-Response via Service Registry (or Directory)

An optional service registry can be used within the architecture to help the client automatically configure certain aspects of its service client. The service provider pushes changes regarding the service’s details to the registry to which the consumer has subscribed. When the changes are made, the service consumer is notified of these changes and can configure its service client to talk to the service. This is represented conceptually in Figure 4-2.



Figure 4-2. SOA Request-Response pattern with a service registry

4.3 Subscribe-Push


A third pattern for interaction is called Subscribe-Push, shown in Figure 4-3. In this pattern, one or more clients register subscriptions with a service to receive messages based on some criteria. Regardless of the criteria, the externally visible pattern remains the same. Subscriptions may remain in effect over long periods before being canceled or revoked. A subscription may, in some cases, also register another service endpoint to receive notifications. For example, an emergency management system may notify all fire stations in the event of a major earthquake using a common language such as the OASIS Common Alerting Protocol (CAP)(x v i).



Figure 4-3. SOA Subscribe-Push pattern
Note that this pattern can be triggered by a multitude of events. In figure 4-3, an auditable event is triggering a message being sent to a subscribed client. The trigger could be a service consumer’s action, a timeout action, or a number of other actions that are not listed in the example above. Each of these represents a specialization of the Subscribe-Push pattern. This particular pattern is becoming dominent in mobile application development that uses SOA principles.  Often a user has an application and the application pushes a notification to the user when a new piece of data or event is available that the user has expressed an interest in.

4.4 Probe and Match

A pattern used for discovery of services is the Probe and Match pattern. In this variation, shown in Figure 4-4, a single client may multicast or broadcast a message to several endpoints on a single fabric, prompting them to respond based on certain criteria. For example, this pattern may be used to determine whether large numbers of servers on a server farm are capable of handling more traffic by checking if they are scaled at less than 50% capacity. This variation of the SOA message exchange pattern may also be used to locate specific services. There are caveats with using such a pattern, as it may become bandwidth-intensive if used often. Utilizing a registry or another centralized metadata facility may be a better option because the registry interaction does not require sending the prob e() messages to all endpoints to find one. By convention, they allow the query to locate the endpoint using a filter query or other search algorithm.



Figure 4-4. SOA Probe and Match pattern

In the Probe and Match scenario in Figure 4-4, the service client probes three services, yet only the middle one returns an associated match() message. A hybrid approach could use the best of both the registry and the probe and match models for locating service endpoints. In the future, registry software could implement a probe interface to allow service location without requiring wire transactions going to all endpoints and the searching mechanism could probe multiple registries at the same time.

4.5 Patterns for RIAs

Creating Rich Internet Applications (RIAs) requires a level of data management that goes beyond the traditional Request-Response model. Providing a richer, more expressive experience often requires more data-intensive interaction and introduces new challenges in managing data between the client and server tiers.

Data synchronization is a key concept and requires states to be shared among multiple machines. These are usually the clients who have subscribed to the state of an object somewhere within the tier of a distributed system as depicted in Figure 4.5.



Figure 4.5 – data synchronization across multiple clients (courtesy James Ward).

4.6 Data paging

Some services automatically facilitate the paging of large data sets, enabling developers to focus on core application business logic instead of worrying about basic data management infrastructure. Modern service oriented clients and server infrastructures automatically handle temporary disconnects, ensuring reliable delivery of data to and from the client application.  Data paging is built into the model used by Neo4J and Mongo.db.  Being graph databases, you can start by examining a specific node of data, then request incremental pieces of data based on your use case for the data.

4.7 Data push

Some services offer data-push capability, enabling data to automatically be pushed to the client application without polling (contrast this pattern to the “Subscribe-Push pattern listed above). This can be done via intuitive or inference methods to ensure data is provided as required. This highly scalable capability can push data to thousands of concurrent users, providing up-to-the-second views of critical data, such as stock trader applications, live resource monitoring, shop floor automation, and more.

Data push can be further specialized into broadcast, unicast, multicast, and several other specializations of the basic pattern.

5.0 A Final Word

This white paper has been prepared to share ideas about data interaction patterns within SOA and to illustrate some common concepts with a service oriented environment. It is based on input provided by a number of people from different companies and is not considered the work of any one company. It is free to share, use, quote, and post wherever and however you want. Service Oriented Architecture will likely remain the mainstay of technology platforms for the foreseeable future. It is our hope that the companies who have contributed to this will continue to write more on specialized patterns of SOA.

This work is licensed under a Creative Commons Attribution 3.0 Unported License. You may redistribute and quote from parts of this article however attribution is expected. There is no need to seek explicit permission to reuse part of this paper or quote from it.

6.0 References


i. The Extensible Markup Language (XML) is a W3C Recommendation - http://www.w3.org/XML/ and JSON, described at http://www.json.org.
ii. Service Oriented Architecture is an architectural paradigm expressed as a Reference Model by OASIS at
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=soa-rm
iii. Web 2.0 is defined as a set of Design Patterns in the O’Reilly book Web 2.0 Design Patterns -
http://www.amazon.com/Web-2-0-Design-Patterns-entrepreneurs/dp/0596514433


(iv) AMF - http://osflash.org/documentation/amf
(v) .NET is a trademark and technology from Microsoft -
http://msdn2.microsoft.com/en-us/netframework/default.aspx
(vi.) Java 2 Enterprise Edition is a trademark of Sun Microsystems
(vii.) Asynchronous JavaScript And XML is described on Wikipedia in more details at
http://en.wikipedia.org/wiki/Ajax_(programming)


x. Unified Modeling Language is owned by the Object Management Group (OMG) and Described here -
http://www.omg.org/technology/documents/formal/uml.htm
xi. OOPSLA is an annual conference around Object Oriented Programming, Systems Languages and
Applications - http://www.oopsla.org
xii. JavaScript Object Notation (JSON) is RFC 4627 available at http://tools.ietf.org/html/rfc4627
10The modern day concept of patterns evolved from work by Christopher Alexander, the primary
author of a book called “A Pattern Language”

xiii. http://www.amazon.com/Pattern-Language-Buildings-Construction-Environmental/dp/0195019199
xiv. See “Design Patterns: Element of Reusable Object-Oriented Software” by Erich Gamma, Richard Helm,
Ralph Johnson, John Vlissides

xv. The Organization for the Advancement of Structured Information Systems (OASIS) at
http://www.oasis-open.org
xvi. OASIS CAP is a product of the OASIS Emergency Services Technical Committee -
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=emergency