{"id":112,"date":"2008-04-02T13:47:08","date_gmt":"2008-04-02T18:47:08","guid":{"rendered":"http:\/\/dilettantes.code4lib.org\/2008\/04\/02\/bootstrapping-jangle\/"},"modified":"2008-04-02T13:47:08","modified_gmt":"2008-04-02T18:47:08","slug":"bootstrapping-jangle","status":"publish","type":"post","link":"https:\/\/rossfsinger.me\/blog\/2008\/04\/bootstrapping-jangle\/","title":{"rendered":"Bootstrapping Jangle"},"content":{"rendered":"<p>After several months of trying, <a href=\"http:\/\/jangle.org\/\" target=\"_blank\">Jangle.org<\/a> is finally starting to take off.\u00c2\u00a0 I set up a Drupal instance yesterday on our new web host.<\/p>\n<p>When I was still at Georgia Tech, one of the things I was trying to work on was a framework to consistently and easily expose the library&#8217;s data from its various silos into external services.  In that case, my initial focus was the <a href=\"https:\/\/t-square.gatech.edu\/portal\" target=\"_blank\">Sakai implementation<\/a> that we were rolling into production, but the intention was to make it as generic as possible (i.e. the opposite of a &#8220;<a href=\"http:\/\/www.blackboard.com\/extend\/b2\/\" target=\"_blank\">Blackboard Building Block<\/a>&#8220;) so it could be consumed and reconstituted into as many applications as we wanted.<\/p>\n<p>Coincidentally (and, for me, conveniently), Talis was also thinking about such a framework that would supply a generic <abbr title=\"Service Oriented Architecture\">SOA<\/abbr> layer to libraries (and potentially beyond) and contacted me about possibly collaborating with them on it as an open source project.  Obviously that relationship changed a bit when they hired me and they put me and my colleague <a href=\"http:\/\/townx.org\/\" target=\"_blank\">Elliot Smith<\/a> (reports of his demise have been greatly exaggerated) in charge of trying to get this project off the ground.  Thankfully, Elliot is the other Talis malcontent who prefers Ruby, so our early prototypes all focused on Rails (the Java that originally seeded the project, like all Java, made my eyes glaze over).<\/p>\n<p>We had a hard time getting anywhere at first.  Not even taking into consideration the fact that he and I were an ocean apart, we really had no idea what it was that we should be building or why it would be useful to Talis (after all, they are paying the bills) since they already have an SOA product, <a href=\"http:\/\/www.talis.com\/keystone\/\" target=\"_blank\">Keystone<\/a>.  Also, we didn&#8217;t want to recreate <a href=\"http:\/\/synapse.apache.org\/\" target=\"_blank\">Apache Synapse<\/a> or <a href=\"http:\/\/rice.kuali.org\/\" target=\"_blank\">Kuali Rice<\/a>.  In essence, we were trying to find a solution to a problem we hadn&#8217;t really defined, yet.<\/p>\n<p>In December and early January, I drove across town for a couple of meetings with Mike Rylander, Bill Erickson and Jason Etheridge from <a href=\"http:\/\/esilibrary.com\/esi\/\" target=\"_blank\">Equinox<\/a> to try to generate interest in Jangle and, at the same time, solicit ideas from them as to what this project should look like and do.  Thankfully, they gave me both.<\/p>\n<p>Jangle still foundered a bit through February.  We were waiting for the <a href=\"https:\/\/project.library.upenn.edu\/confluence\/display\/ilsapi\/Draft+Recommendation\" target=\"_blank\">DLF&#8217;s ILS and Discovery Systems API recommendation<\/a> to come out (since we had targeted that as goal) and Elliot produced a prototype in JRuby (we had long abandoned Rails for this) that effectively consumed the Java classes used for Keystone and rewrote them for Jangle.\u00c2\u00a0 The problem we were still facing, though, is that we were, effectively, just creating another niche library interface from scratch and there were too many possible avenues to take to accomplish that.\u00c2\u00a0 Our freedom was paralyzing us.<\/p>\n<p>I gave a <a href=\"\/wp-content\/uploads\/2008\/04\/jangle-lightning-talk.pdf\" target=\"_blank\">lightning talk on Jangle at Code4lib2008<\/a> that was big on rah-rah rhetoric (free your data!) and short on details (since we hadn&#8217;t really come up with any yet) that generated some interest and a few more subscriptions to our <a href=\"http:\/\/groups.google.com\/group\/jangle-discuss\" target=\"_blank\">Google Group<\/a>.\u00c2\u00a0 A week later, the DLF met with the vendors to talk about their recommendation.\u00c2\u00a0\u00c2\u00a0 I attended by phone.\u00c2\u00a0 While in many ways I feel the meeting was a wash, it did help define for me what Jangle needed to do.<\/p>\n<p>At the end of my first meeting with Equinox, Mike Rylander asked me if we had considered supporting the <a href=\"http:\/\/bitworking.org\/projects\/atom\/rfc5023.html\" target=\"_blank\">Atom Publishing Protocol<\/a> in Jangle.\u00c2\u00a0 At the time, I hadn&#8217;t.\u00c2\u00a0 In fact, I didn&#8217;t until I sat on the phone for 8 hours listening to the vendors hem and haw over the DLF&#8217;s recommendation.\u00c2\u00a0 The more I sat there (with my ear getting sore), the more I realized that AtomPub might be a good constraint to get things moving (as well as useful to appealing to non-library developers).<\/p>\n<p>We are just now trying to start building how this spec might work.\u00c2\u00a0 Basically there are two parts.\u00c2\u00a0 First, the Jangle &#8220;core&#8221; which is an AtomPub interface to external clients.\u00c2\u00a0 It&#8217;s at this level that we need to model how library resources map to Atom (and other common web data structures, like vCard) and where we need to extend Atom to include data like MARC (when necessary).\u00c2\u00a0 The Jangle core also proxies these requests to the service &#8220;connectors&#8221; and translates their responses back to the AtomPub client.\u00c2\u00a0 The connectors are service specific applications that takes the specific schema and values in, say, a particular ILS&#8217;s RDBMS and puts them in a more syntax to send back to the Jangle core.\u00c2\u00a0 Right now, the proposal is that all communication between the core and connectors would be JSON over HTTP (again, to help forward momentum).<\/p>\n<p>So at this point you may be asking why AtomPub rather than implementing the recommendations of the DLF directly?\u00c2\u00a0 The recommendation assumes the vendors will be complicit, uniform and timely in implementing their API and I cynically feel that is unrealistic.\u00c2\u00a0 I also think it helps to get a common, consistent interface to help build interoperability (like the kind that the DLF group is advocating), since then you&#8217;d only have to write one, say, NCIP adapter and it would work for all services that have a Jangle connector.\u00c2\u00a0 Also, by leveraging non-library technologies, it opens up our data to groups outside our walls.<\/p>\n<p>So, if you&#8217;re interested in freeing your data (rah-rah!), come help us build this spec.\u00c2\u00a0 We&#8217;re trying to conform to the <a href=\"http:\/\/wiki.code4lib.org\/index.php\/Rogue\" target=\"_blank\">Rogue &#8217;05 specification<\/a> that <a href=\"http:\/\/onebiglibrary.net\/\" target=\"_blank\">Dan Chudnov<\/a> came up with for development of this so, while it will still be a painful process, it won&#8217;t be painful and long. :)\u00c2\u00a0 In other words, this ain&#8217;t NISO.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After several months of trying, Jangle.org is finally starting to take off.\u00c2\u00a0 I set up a Drupal instance yesterday on our new web host. When I was still at Georgia Tech, one of the things I was trying to work on was a framework to consistently and easily expose the library&#8217;s data from its various [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,47],"tags":[],"class_list":["post-112","post","type-post","status-publish","format-standard","hentry","category-community-building","category-jangle"],"_links":{"self":[{"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/posts\/112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/comments?post=112"}],"version-history":[{"count":0,"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/posts\/112\/revisions"}],"wp:attachment":[{"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/media?parent=112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/categories?post=112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rossfsinger.me\/blog\/wp-json\/wp\/v2\/tags?post=112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}