Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Social Connections VI Prague - An introduction to ibm connections as an appdev platform


Published on

"There’s an API for that! Why and how to build on the IBM Connections PLATFORM " presentation from Social Connections VI in Prague on 16-17 June 2014.

Published in: Software, Technology, Travel

Social Connections VI Prague - An introduction to ibm connections as an appdev platform

  1. 1. There’s  an  API  for  that!  Why  and   how  to  build  on  the  IBM   Connec=ons  PLATFORM     Mikkel  Flindt  Heisterberg   OnTime®  by  IntraVision  
  2. 2. Agenda   •  Brief  intro  to  IBM  Connec=ons  as  a  PLATFORM   •  Briefer  intro  to  widgets  for  IBM  Connec=ons   •  Boxer  brief  intro  to  developing  for  the  Ac=vity   Stream   •  Ultra  brief  intro  to  event  handlers   •  Running  short  on  =me  and  taking  ques=ons  in   the  hall   Mikkel  Flindt  Heisterberg     TwiNer:  @lekkim   E-­‐mail:   hNp://   hNp://  
  3. 3. There’s  more  beneath  the  surface  
  4. 4. The  IBM  Connec=ons  plaVorm  
  5. 5. Widgets  
  6. 6. Widgets  –  descriptor   <iw:iwidget id="com.example.ExampleWidget" supportedModes="view fullpage” mode="view” lang="en" xmlns:iw="" iScope="com.example.ExampleWidget"> <iw:resource uri="" /> <iw:resource uri="" /> <iw:content mode="view"> <![CDATA[ <div id="_IWID_widgetContent">Loading...</div> ]]> </iw:content> <iw:content mode="fullpage"> <![CDATA[ <div id="_IWID_widgetContent">Loading...</div> ]]> </iw:content> </iw:iwidget>
  7. 7. Widgets  –  iScope   dojo.provide("com.example.ExampleWidget"); dojo.declare("com.example.ExampleWidget", null, { constructor: function() {}, onLoad: function() {}, onView: function() {}, onEdit: function() {}, onFullpage: function() {}, onSearch: function() {} });
  8. 8. Widgets  –  declara=on   Declara=vely  configured  using  widgets-­‐config.xml     <widgetDef defId="com.example.ExampleWidget” url="/ExampleWidget.xml" loginRequired="true” showInPallette=”true”> <itemSet> <item name="resourceId" value="{resourceId}" /> <item name="profilesCtx" value="{profilesSvcRef}" /> <item name="myProp" value="Abc123" /> </itemSet> </widgetDef>
  9. 9. Widgets  –  iContext   •  An  iContext  instance  is  set  into  the  iScope  instance   •  The  iContext  provides  access  to  the  widget  markup  (e.g.  root   element),  I/O  related  func=ons  (i.e.  URL  rewri=ng),  widget   aNributes  etc.   •  The  iContext  is  easily  accessed  from  the  iScope  class  using   this.iContext •  Important  func=ons  include: –  iContext.getRootElement() : DOM Element –  iContext.getElementById(id:string) : DOM Element –  iContext.getiWidgetAttributes() : ItemSet –  iContext.getUserProfile() : ItemSet – : string –  iContext.iEvents.fireEvent(name:string, type:string, payload:object)
  10. 10. Ac=vity  Stream   •  The  following  is  based  on  my  highly  acclaimed   (cough,  cough)  presenta=on  on  the  Ac=vity   Stream   •  Much  more  detail  and  many  examples  there   •  See  hNp://   Mikkel  Flindt  Heisterberg     TwiNer:  @lekkim   E-­‐mail:   hNp://   hNp://  
  11. 11. Ac=vity  Stream   •  IS   – River  of  news  –  it’s  like  water  flowing  by  you   – No=fica=ons  about  ”stuff”  happening  in  (other)   systems  –  we  refer  to  these  no=fica=ons  as   entries   •  ISN’T   – A  new  inbox  –  doesn’t  replace  email   – A  perpeptual  data  store  –  entries  are  deleted   based  on  a  server  defined  purge  interval  (default   is  30  days)  unless  saved  or  ac<onable  
  12. 12. Ac=vity  Stream   •  In  my  opinion  it  makes  most  sense  to  not  consider   the  ac=vity  stream  as  one  single  stream   •  Instead  think  that   – Each  user  has  his/her  own  (@me)   – There  is  a  public  stream  (@public)   – A  community  may  have  a  stream  if  the  widget  has   been  added  by  a  community  owner  –  if  there’s  no   stream  for  a  community  pos=ng  to  it  will  return  a   ”403  Forbidden”  
  13. 13. Ac=vity  Stream   •  You  will  mainly  use  the  POST  and  PUT  methods  to  send  JSON  data  (Content-­‐Type:   applica=on/json)  to  the  API   •  JSON  is  super  simple  key/value  data  format.  It  has  simple  datatypes  (strings,   numbers,  booleans),  objects  and  arrays   { ”email”: ””, ”niceGuy”: true, ”age”: 37, ”name”: { ”first”: ”Mikkel Flindt”, ”last”: ” Heisterberg” }, ”Connectospheres”: [6, 7, 8, 9, 10, 11, 12, 13, 14] }
  14. 14. Ac=vity  Stream   { "actor": {"id": "@me"}, "verb": "post", "title": "Some entry title", "updated": "2013-05-17T12:00:00.000Z", "object": { "title": "Some object title", "objectType": "note", "id": "1234567890-1234567890-1234567890" } }
  15. 15. Ac=vity  Stream   hNps://<host>/connec=ons/opensocial/<auth>/rest/ac=vitystreams   /<user  ID>/<group  ID>/<applica<on  ID>/<ac<vity  ID>   Component   Meaning   <auth>   (op<onal)  If  using  form  based  authen=ca=on  leave  this  component  out.  Otherwise  op=ons   are  anonymos,  basic,    oauth.   <user  ID>   The  user  whose  stream  you’re  addressing  –  use  @me  for  current  users  stream,  @public  for   public  stream  or  a  community  ID  for  the  stream  in  a  community.   <group  ID>   The  group  of  entries  you’re  addressing  –  use  @all  for  all  posts  or  op=ons  for  special   meaning  such  as  @saved,  @ac<ons,  @men<ons.  Refer  for  InfoCenter  and  resources  slide   for  more.     <applica=on  ID>   When  retrieving  entries  this  refers  to  the  applica=on  (or  ”generator”)  that  created  the   entry.  All  the  IBM  Connec=ons  app  names  can  be  used  (profiles,  blogs,  wikis  etc.)  plus   custom  ones  (e.g.  on<megc).  @all  used  for  all  applica=ons.   <ac=vity  ID>   Used  to  reference  a  specific  event  e.g.  for  upda=ng  saved  status.  
  16. 16. Ac=vity  Stream   1.  /activitystreams/@me/@all List my (current users) entries 2.  /activitystreams/@public/@all List public stream entries 3.  /activitystreams/@me/@actions List my actionable events 4.  /activitystreams/@me/@saved/blogs List my saved events from blogs 5.  /@me/@all/@all/… Work with entry from my stream based on ID * All URLs above start with https://<host>/connections/opensocial/<auth>/rest Also used when creating new entries (e.g. POSTing)
  17. 17. Other  Programming  Interfaces   •  SPIs  are  lower-­‐level  programming  interfaces  which  may  be  subject  to   modifica<on  from  release  to  release.     •  Event  SPI   –  The  IBM  Connec=ons  Event  SPI  allows  third  par=es  to  consume  event  data  generated  by   IBM  Connec=ons.   •  Seedlist  SPI   –  Use  the  Seedlist  service  provider  interface  (SPI)  provided  with  IBM  Connec=ons  to   integrate  your  search  engine  with  IBM  Connec=ons  content.   •  Service  SPI   –  You  can  use  the  IBM  Connec=ons  Service  SPI  to  learn  about  the  applica=ons  running  in   your  IBM  Connec=ons  deployment.   •  User  SPI   –  You  can  use  the  IBM  Connec=ons  User  SPIs  to  access  informa=on  about  the  users  in   your  IBM  Connec=ons  deployment.  
  18. 18. Event  Handlers  –  declara=on   Declara=vely  configured  using  events-­‐config.xml     <postHandler enabled=”true" invoke="ASYNC" name=”MyEventHandler” class="com.example.MyEventHandler"> <subscriptions> <subscription source="*" type="*" eventName="*"/> <!-- <subscription source=”PROFILES" type="*" eventName=”profiles.updated"/> <subscription source=”PROFILES" type="*" eventName=”"/> --> </subscriptions> </postHandler>
  19. 19. Event  Handlers  –  implementa=on   import public class MyEventHandler implements EventHandler { public void init() throws EventHandlerInitException {} public void destroy() {} public void handleEvent(Event event) throws EventHandlerException { String eventName = event.getName(); // event name Person actor = event.getActor(); // person that triggered event // look at the event name if (event.getName().equals("")) { // a profile photo was updated this.doEventProfilesPhotoUpdated(event); } else if (event.getName().equals("profiles.updated")) { // a profile was updated this.doEventProfilesUpdated(event); } } }
  20. 20. Event  Handlers  –  summary   •  Make  event  handlers  asynchroneous   •  What  happens  if  your  event  handler  fail?   •  What  happens  if  the  recipient  of  the  event   (3rd  party  API)  fail?   •  Be  defensive  –  consider  what  happens  if   events  are  lost  
  21. 21. Thank  you   •  Presenta=ons  on  –  this  one  is   coming   •  Contact  me  –  ojen  =mes  more  than  willing  to   help  –  I’ll  let  you  know  when  it’s  a  project  J   Mikkel  Flindt  Heisterberg     TwiNer:  @lekkim   E-­‐mail:   hNp://   hNp://