SlideShare a Scribd company logo
Plugins on OnDemand with
Remote Apps


Don Brown
Architect, Atlassian
Five years ago. . .
And now. . .
• Over 12k active, 9k paid OnDemand accounts
• 5 out of 10 add Greenhopper
• 1.5 out of 10 add Bonfire
• 1 out of 10 add Team Calendars

                                . . . Instances
The Fine Print
But isn‟t it just a copy?
Plugin Problems: Security
<% String eid = request.getParameter("eid"); %>
...
Employee ID: <%= eid %>
Plugin Problems: Performance
java.lang.OutOfMemoryError: Java heap space
   at org.apache.xerces.dom.DeferredDocumentImpl.createChunk(Unknown Source)
   at org.apache.xerces.dom.DeferredDocumentImpl.ensureCapacity(Unknown Source)
   at org.apache.xerces.dom.DeferredDocumentImpl.createNode(Unknown Source)
   at org.apache.xerces.dom.DeferredDocumentImpl.createDeferredEntityReference(Unknown Source)
   at org.apache.xerces.parsers.AbstractDOMParser.startGeneralEntity(Unknown Source)
   at org.apache.xerces.impl.dtd.XMLDTDValidator.startGeneralEntity(Unknown Source)
   at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.startEntity(Unknown Source)
   at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source)
   at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
   at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source
Plugin Problems: Upgrades
Product Dev

QA
        Everyone‟s Angry

                    Admins
 Plugin Dev
Introducing Remote Apps
This is a Remote App             key: app1
                                 name: Remote App - app1
                                 version: 1
• A single descriptor file       display-url: http://example.com
                                 description: This app
                                 vendor:
• Can be in XML, YAML, or JSON    name: Atlassian
                                  url: http://atlassian.com
• Contains
                                 permissions:
                                  permission:
 • App metadata                    - scope: browse_projects
 • Permissions                   general-page:
                                  - key: first
 • Extension points                 name: First
                                    url: /first
Examples: General Page
Plugin Steps                      Remote App Steps
 1. Add web-item config            1. Add general-page config
 2. Add servlet config             2. Implement URL
 3. Code servlet
 4. Try to get output decorated
Examples: React to Event
Plugin Steps                   Remote App Steps
 1. Add component config        1. Add web-hook config
 2. Dig through code to find    2. Implement URL
    event to listen for
 3. Register for events
 4. Handle event
 5. Make sure to unregister
Examples: Custom Macro Editor
Plugin Steps                      Remote App Steps
 1. Add web-resource and rest      1. Add custom-macro-editor
    config                            config
 2. Find and call JavaScript       2. Implement URL
    API to override edit button
 3. Create AUI dialog
 4. Implement REST
    resources
Shipping….Now.
Apps: Dropbox by AppFusions
• Share your documents
• Written in Java, deployed
  at Contegix
• Provides a custom page
  macro, and macro editor
  with MS Office edit
Apps: TFS4JIRA by Spartez
• Integrate JIRA with your
  Team Foundation Server
• Written in Java, deployed
  at Heroku
• Uses project and issue
  tabs, and an admin page
Apps: Lucidchart by . . .
Steps to create Lucidchart app
• Establish Trust
• Register App
• Implement General Page
• Implement macro
Establish Trust
Steps to create Lucidchart app
• Establish Trust
• Register App
• Implement General Page
• Implement macro
Register the app
• Receive from OnDemand as Request params:
 • OAuth consumer key
 • OAuth RSA public key
 • Base URL
Register the app
• Return to OnDemand description of the remote app
 • Can be in XML, JSON or YAML
Provide OAuth consumer key and
RSA public key
<remote-app key=“xxxxxxx"
    name="Lucidchart"
    version="1"
    icon-url="http://www.lucidchart.com/favicon.ico"
    display-url="https://www.lucidchart.com/ondemand">
  <vendor name="Lucidchart" url="http://www.lucidchart.com" />
  <description>Lucidchart example</description>
  <oauth …>
    <public-key>yyyyyy</public-key>
  </oauth>
...
Request permissions
...
<permissions>
  <permission scope="read_users_and_groups" />
  <permission scope="read_content" />
  <permission scope="modify_attachments" />
  <permission scope="modify_content" />
</permissions>
...
General Page
...
<general-page
    section="system.content.add/space"
    key="lucidAppGeneral"
    link-name="Lucidchart Diagram"
    name="Select or create a diagram"
    url="/doclist"
    width="1200"
    height="800"
    icon-url="/icon">
  <description>Insert or Create a Lucidchart Diagram</description>
  <context-param name="page_id" />
</general-page>
...
General Page
...
<general-page
   section="system.content.add/space"
    key="lucidAppGeneral"
    link-name="Lucidchart Diagram"
    name="Select or create a diagram"
    url="/doclist"
    width="1200"
    height="800"
    icon-url="/icon">
  <description>Insert or Create a Lucidchart Diagram</description>
  <context-param name="page_id" />
</general-page>
...
General Page
...
<general-page
    section="system.content.add/space"
    key="lucidAppGeneral"
    link-name="Lucidchart Diagram"
    name="Select or create a diagram"
   url="/doclist"
    width="1200"
    height="800"
    icon-url="/icon">
  <description>Insert or Create a Lucidchart Diagram</description>
  <context-param name="page_id" />
</general-page>
...
General Page
...
<general-page
    section="system.content.add/space"
    key="lucidAppGeneral"
    link-name="Lucidchart Diagram"
    name="Select or create a diagram"
    url="/doclist"
    width="1200"
    height="800"
    icon-url="/icon">
  <description>Insert or Create a Lucidchart Diagram</description>
  <context-param name="page_id" />
</general-page>
...
Macro
...
<macro key="lucidchart" url="/macro" output-type="block" body-type="none">
  <description>Create a Lucidchart Diagram</description>
  <category name="development" />
  <image-placeholder url="/imagePlaceHolder" width="140" height="140" apply-
chrome="true"/>
  <parameters>
    <parameter name="width" title="Width" type="string" default=“700"/>
    <parameter name="height" title="Height (if blank, image ratio is
preserved)" type="string" />
    <parameter name="align" type="enum" default="Left">
        <value name="Left"/>
        <value name="Right" />
    </parameter>
  </parameters>
</macro>
Macro
...
<macro key="lucidchart" url="/macro" output-type="block" body-type="none">
  <description>Create a Lucidchart Diagram</description>
  <category name="development" />
  <image-placeholder url="/imagePlaceHolder" width="140" height="140" apply-
chrome="true"/>
  <parameters>
    <parameter name="width" title="Width" type="string" default=“700"/>
    <parameter name="height" title="Height (if blank, image ratio is
preserved)" type="string" />
    <parameter name="align" type="enum" default="Left">
        <value name="Left"/>
        <value name="Right" />
    </parameter>
  </parameters>
</macro>
Macro
...
<macro key="lucidchart" url="/macro" output-type="block" body-type="none">
  <description>Create a Lucidchart Diagram</description>
  <category name="development" />
  <image-placeholder url="/imagePlaceHolder" width="140" height="140"
apply-chrome="true"/>
  <parameters>
    <parameter name="width" title="Width" type="string" default=“700"/>
    <parameter name="height" title="Height (if blank, image ratio is
preserved)" type="string" />
    <parameter name="align" type="enum" default="Left">
        <value name="Left"/>
        <value name="Right" />
    </parameter>
  </parameters>
</macro>
Macro
...
<macro key="lucidchart" url="/macro" output-type="block" body-type="none">
  <description>Create a Lucidchart Diagram</description>
  <category name="development" />
  <image-placeholder url="/imagePlaceHolder" width="140" height="140"/>
  <parameters>
    <parameter name="width" title="Width" type="string"
default=“700"/>
    <parameter name="height" title="Height" type="string" />
    <parameter name="align" type="enum" default="Left">
        <value name="Left"/>
        <value name="Right" />
    </parameter>
  </parameters>
</macro>
Steps to create Lucidchart app
• Establish Trust
• Register App
• Implement General Page
• Implement macro
Any language can be used
• Lucidchart is using PHP
Add Diagram (general page)
function doclist() {
  if (!$this->_hasValidOAuthSignature()) {
    $this->set("oauthValid", false);
    return;
  }

    $userId = @$_REQUEST['user_id'];
    $pageId = @$_REQUEST['page_id'];

  $redirectURL = "https://" . $_SERVER['SERVER_NAME'] .
'/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId;

    $this->layout = „ondemand';
    $this->set("baseUrl", $this->_getBaseURL());
    $this->set("callback", urlencode($redirectURL));
}
Add Diagram (general page)
function doclist() {
    if (!$this->_hasValidOAuthSignature()) {
      $this->set("oauthValid", false);
      return;
    }

    $userId = @$_REQUEST['user_id'];
    $pageId = @$_REQUEST['page_id'];

  $redirectURL = "https://" . $_SERVER['SERVER_NAME'] .
'/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId;

    $this->layout = „ondemand';
    $this->set("baseUrl", $this->_getBaseURL());
    $this->set("callback", urlencode($redirectURL));
}
Add Diagram (general page)
function doclist() {
  if (!$this->_hasValidOAuthSignature()) {
    $this->set("oauthValid", false);
    return;
  }

    $userId = @$_REQUEST['user_id'];
    $pageId = @$_REQUEST['page_id'];

  $redirectURL = "https://" . $_SERVER['SERVER_NAME'] .
'/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId;

    $this->layout = „ondemand';
    $this->set("baseUrl", $this->_getBaseURL());
    $this->set("callback", urlencode($redirectURL));
}
Add Diagram (general page)
function doclist() {
  if (!$this->_hasValidOAuthSignature()) {
    $this->set("oauthValid", false);
    return;
  }

    $userId = @$_REQUEST['user_id'];
    $pageId = @$_REQUEST['page_id'];

  $redirectURL = "https://" . $_SERVER['SERVER_NAME'] .
'/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId;

    $this->layout = „ondemand';
    $this->set("baseUrl", $this->_getBaseURL());
    $this->set("callback", urlencode($redirectURL));
}
Make API calls to attach diagram
function attachDocument() {
...
    $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId;
    $auth_header = $this->_getAuthHeader($fullUrl);
    xmlrpc_set_type($imageBytes, "base64");
    $attachmentMetaData = array("fileName"=>$attachmentName,
        "contentType"=>"image/png",
        "comment"=>"Imported from Lucidchart (do not deleted)");
    $addAttachmentBody= xmlrpc_encode_request(
        "confluence2.addAttachment",
        array("", $pageId, $attachmentMetaData ,$imageBytes));
     $this->_sendXMLRPCRequest($fullUrl, array(
        "Content-Type: text/xml",
        $auth_header),
        $addAttachmentBody);
...
}
Make API calls to attach diagram
function attachDocument() {
...
      $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId;
    $auth_header = $this->_getAuthHeader($fullUrl);
    xmlrpc_set_type($imageBytes, "base64");
    $attachmentMetaData = array("fileName"=>$attachmentName,
        "contentType"=>"image/png",
        "comment"=>"Imported from Lucidchart (do not deleted)");
    $addAttachmentBody= xmlrpc_encode_request(
        "confluence2.addAttachment",
        array("", $pageId, $attachmentMetaData ,$imageBytes));
     $this->_sendXMLRPCRequest($fullUrl, array(
        "Content-Type: text/xml",
        $auth_header),
        $addAttachmentBody);
...
}
Make API calls to attach diagram
function attachDocument() {
...
    $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId;
      $auth_header = $this->_getAuthHeader($fullUrl);
    xmlrpc_set_type($imageBytes, "base64");
    $attachmentMetaData = array("fileName"=>$attachmentName,
        "contentType"=>"image/png",
        "comment"=>"Imported from Lucidchart (do not deleted)");
    $addAttachmentBody= xmlrpc_encode_request(
        "confluence2.addAttachment",
        array("", $pageId, $attachmentMetaData ,$imageBytes));
     $this->_sendXMLRPCRequest($fullUrl, array(
        "Content-Type: text/xml",
        $auth_header),
        $addAttachmentBody);
...
}
Make API calls to attach diagram
function attachDocument() {
...
    $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId;
    $auth_header = $this->_getAuthHeader($fullUrl);
    xmlrpc_set_type($imageBytes, "base64");
    $attachmentMetaData = array("fileName"=>$attachmentName,
        "contentType"=>"image/png",
        "comment"=>"Imported from Lucidchart (do not deleted)");
    $addAttachmentBody= xmlrpc_encode_request(
        "confluence2.addAttachment",
        array("", $pageId, $attachmentMetaData ,$imageBytes));
     $this->_sendXMLRPCRequest($fullUrl, array(
        "Content-Type: text/xml",
        $auth_header),
        $addAttachmentBody);
...
}
Steps to create Lucidchart app
• Establish Trust
• Register App
• Implement General Page
• Implement macro
Macro
• Receive macro params
• Return HTML
 • Will be cached (caching header can be returned)
 • No CSS, inline styles or JavaScript
Macro : Receive macro params
function macro() {

  $userId = $_REQUEST['user_id'];
  $name = $_REQUEST['name'];
  $pageId = $_REQUEST['pageId'];
  $docId = $_REQUEST['id'];
  $width= $_REQUEST['width'];
  $height = $_REQUEST['height'];
  $align = $_REQUEST['align'];
  $outputType = $_REQUEST['ctx_output_type'];
...
Macro: Return HTML
<div style="float: “ . $align . "; margin: 0 auto; width: " . (intVal($width)
+ 2) . "px;">
    <img
      src=“$pageAttachment['url']”
      width=“$width”
      height=“$height”/>
    <div style="text-align: center">
      <a href='sign://"$host/editDocument/$docId?attachment= $name'>Edit
Diagram</a> |
      <a href=$baseUrl/plugins/servlet/remoteapps/lucidchart-
app/lucidAppRemove?page_id=$pageId&doc_id=$docId&attachment=$name'>Remove
Diagram</a>
    </div>
</div>
That‟s it!

Straightforward approach to get your
    app available for OnDemand
We‟re taking Apps to the next level
What if you could . . .
• Tap into our 12k+
  OnDemand customer base
• Register your app with one
  click
• Have full control over your
  app
If you want to integrate, call us!
• Currently targeted towards
  SaaS integrations
• Feature set in early stages   Diagram here
• Working on solution for
  “extensions”
You can finally integrate your site into OnDemand
with Remote Apps




     #summit12
Thank you!
Getting started


    https://remoteapps.jira.com

More Related Content

What's hot

AtlasCamp 2015: Connect everywhere - Cloud and Server
AtlasCamp 2015: Connect everywhere - Cloud and ServerAtlasCamp 2015: Connect everywhere - Cloud and Server
AtlasCamp 2015: Connect everywhere - Cloud and Server
Atlassian
 
Api Doc
Api DocApi Doc
Api Doc
web2magic
 
JSF 2.0 Preview
JSF 2.0 PreviewJSF 2.0 Preview
JSF 2.0 Preview
Skills Matter
 
Selenium WebDriver
Selenium WebDriverSelenium WebDriver
Selenium WebDriver
Rajathi-QA
 
QuickConnect
QuickConnectQuickConnect
QuickConnectAnnu G
 
Rest Security with JAX-RS
Rest Security with JAX-RSRest Security with JAX-RS
Rest Security with JAX-RSFrank Kim
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
Arun Gupta
 
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
IT Event
 
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...Atlassian
 
AtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using nowAtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using now
Atlassian
 
Presentation
PresentationPresentation
Presentation
Manav Prasad
 
ILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterpriseILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterprise
René Winkelmeyer
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!
David Gibbons
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
Atlassian
 
The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)
David Gibbons
 
An Introduction to Django Web Framework
An Introduction to Django Web FrameworkAn Introduction to Django Web Framework
An Introduction to Django Web Framework
David Gibbons
 
Templates
TemplatesTemplates
Templatessoon
 
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
SPTechCon
 

What's hot (20)

AtlasCamp 2015: Connect everywhere - Cloud and Server
AtlasCamp 2015: Connect everywhere - Cloud and ServerAtlasCamp 2015: Connect everywhere - Cloud and Server
AtlasCamp 2015: Connect everywhere - Cloud and Server
 
Api Doc
Api DocApi Doc
Api Doc
 
Api Doc
Api DocApi Doc
Api Doc
 
JSF 2.0 Preview
JSF 2.0 PreviewJSF 2.0 Preview
JSF 2.0 Preview
 
Jsp
JspJsp
Jsp
 
Selenium WebDriver
Selenium WebDriverSelenium WebDriver
Selenium WebDriver
 
QuickConnect
QuickConnectQuickConnect
QuickConnect
 
Rest Security with JAX-RS
Rest Security with JAX-RSRest Security with JAX-RS
Rest Security with JAX-RS
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
 
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
 
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
No Coding Necessary: Building Confluence User Macros Cheat Sheet - Atlassian ...
 
AtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using nowAtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using now
 
Presentation
PresentationPresentation
Presentation
 
ILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterpriseILUG 2010 - Deploying plug-ins to the enterprise
ILUG 2010 - Deploying plug-ins to the enterprise
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!
 
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
No Coding Necessary: Building User Macros and Dynamic Reports Inside Confluen...
 
The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)
 
An Introduction to Django Web Framework
An Introduction to Django Web FrameworkAn Introduction to Django Web Framework
An Introduction to Django Web Framework
 
Templates
TemplatesTemplates
Templates
 
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
 

Viewers also liked

Jazz + Zenefits - Steps to a Successful Onboarding Process
Jazz + Zenefits - Steps to a Successful Onboarding Process Jazz + Zenefits - Steps to a Successful Onboarding Process
Jazz + Zenefits - Steps to a Successful Onboarding Process
Jazz
 
Kahuna Corporate Profile
Kahuna Corporate ProfileKahuna Corporate Profile
Kahuna Corporate Profilekahunasystems
 
Lucidchart AWS Tools [Case Study]
Lucidchart AWS Tools [Case Study]Lucidchart AWS Tools [Case Study]
Lucidchart AWS Tools [Case Study]
Lucidchart
 
Tkcis Corp Overview 2010
Tkcis Corp Overview 2010Tkcis Corp Overview 2010
Tkcis Corp Overview 2010
jetdefensor
 
Mobi hub - Mobile Application Development Practice @ Kahuna Systems
Mobi hub - Mobile Application Development Practice @ Kahuna SystemsMobi hub - Mobile Application Development Practice @ Kahuna Systems
Mobi hub - Mobile Application Development Practice @ Kahuna Systems
kahunasystems
 
Wayne’s Front Yard
Wayne’s Front YardWayne’s Front Yard
Wayne’s Front YardLinda Record
 
Lucidchart
LucidchartLucidchart
Lucidchart
janet canseco
 
Magenta Pigment Isolation From Fungus
Magenta Pigment Isolation From FungusMagenta Pigment Isolation From Fungus
Magenta Pigment Isolation From Fungus
Arkabrata Bandyapadhyay
 
Five Ways To Increase Email Engagement With Mobile Behavioral Data
Five Ways To Increase Email Engagement With Mobile Behavioral DataFive Ways To Increase Email Engagement With Mobile Behavioral Data
Five Ways To Increase Email Engagement With Mobile Behavioral Data
Kahuna
 
Strategies for Growth for Zenefits
Strategies for Growth for ZenefitsStrategies for Growth for Zenefits
Strategies for Growth for ZenefitsAbhishek Dale
 
Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...
Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...
Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...
Sales Hacker
 
The Future of Work – Workfront Leap 2016
The Future of Work – Workfront Leap 2016The Future of Work – Workfront Leap 2016
The Future of Work – Workfront Leap 2016
Philip Sheldrake
 
Corporate Overview
Corporate OverviewCorporate Overview
Corporate OverviewMike Peck
 
Nokia Corporate Overview 01jul08
Nokia Corporate Overview 01jul08Nokia Corporate Overview 01jul08
Nokia Corporate Overview 01jul08
Nokia Conversations
 
Staco Energy: Corporate Overview
Staco Energy: Corporate OverviewStaco Energy: Corporate Overview
Staco Energy: Corporate Overview
Staco Energy
 
SplunkLive! Customer Presentation--ServiceNow
SplunkLive! Customer Presentation--ServiceNowSplunkLive! Customer Presentation--ServiceNow
SplunkLive! Customer Presentation--ServiceNow
Splunk
 
ZENworks 2017 - Overview
ZENworks 2017 - OverviewZENworks 2017 - Overview
ZENworks 2017 - Overview
GWAVA
 
App dynamics and servicenow v5
App dynamics and servicenow   v5App dynamics and servicenow   v5
App dynamics and servicenow v5
BrendanBooth
 

Viewers also liked (18)

Jazz + Zenefits - Steps to a Successful Onboarding Process
Jazz + Zenefits - Steps to a Successful Onboarding Process Jazz + Zenefits - Steps to a Successful Onboarding Process
Jazz + Zenefits - Steps to a Successful Onboarding Process
 
Kahuna Corporate Profile
Kahuna Corporate ProfileKahuna Corporate Profile
Kahuna Corporate Profile
 
Lucidchart AWS Tools [Case Study]
Lucidchart AWS Tools [Case Study]Lucidchart AWS Tools [Case Study]
Lucidchart AWS Tools [Case Study]
 
Tkcis Corp Overview 2010
Tkcis Corp Overview 2010Tkcis Corp Overview 2010
Tkcis Corp Overview 2010
 
Mobi hub - Mobile Application Development Practice @ Kahuna Systems
Mobi hub - Mobile Application Development Practice @ Kahuna SystemsMobi hub - Mobile Application Development Practice @ Kahuna Systems
Mobi hub - Mobile Application Development Practice @ Kahuna Systems
 
Wayne’s Front Yard
Wayne’s Front YardWayne’s Front Yard
Wayne’s Front Yard
 
Lucidchart
LucidchartLucidchart
Lucidchart
 
Magenta Pigment Isolation From Fungus
Magenta Pigment Isolation From FungusMagenta Pigment Isolation From Fungus
Magenta Pigment Isolation From Fungus
 
Five Ways To Increase Email Engagement With Mobile Behavioral Data
Five Ways To Increase Email Engagement With Mobile Behavioral DataFive Ways To Increase Email Engagement With Mobile Behavioral Data
Five Ways To Increase Email Engagement With Mobile Behavioral Data
 
Strategies for Growth for Zenefits
Strategies for Growth for ZenefitsStrategies for Growth for Zenefits
Strategies for Growth for Zenefits
 
Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...
Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...
Sales Hacker Conference San Francisco - Sam Blond - What I Learned Scaling fr...
 
The Future of Work – Workfront Leap 2016
The Future of Work – Workfront Leap 2016The Future of Work – Workfront Leap 2016
The Future of Work – Workfront Leap 2016
 
Corporate Overview
Corporate OverviewCorporate Overview
Corporate Overview
 
Nokia Corporate Overview 01jul08
Nokia Corporate Overview 01jul08Nokia Corporate Overview 01jul08
Nokia Corporate Overview 01jul08
 
Staco Energy: Corporate Overview
Staco Energy: Corporate OverviewStaco Energy: Corporate Overview
Staco Energy: Corporate Overview
 
SplunkLive! Customer Presentation--ServiceNow
SplunkLive! Customer Presentation--ServiceNowSplunkLive! Customer Presentation--ServiceNow
SplunkLive! Customer Presentation--ServiceNow
 
ZENworks 2017 - Overview
ZENworks 2017 - OverviewZENworks 2017 - Overview
ZENworks 2017 - Overview
 
App dynamics and servicenow v5
App dynamics and servicenow   v5App dynamics and servicenow   v5
App dynamics and servicenow v5
 

Similar to Plugins on OnDemand with Remote Apps - Atlassian Summit 2012

An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to TornadoGavin Roy
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
Alexander Zamkovyi
 
Parse Apps with Ember.js
Parse Apps with Ember.jsParse Apps with Ember.js
Parse Apps with Ember.js
Matthew Beale
 
SharePoint Saturday Atlanta 2015
SharePoint Saturday Atlanta 2015SharePoint Saturday Atlanta 2015
SharePoint Saturday Atlanta 2015
Pushkar Chivate
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
Adam Lu
 
Android networking-2
Android networking-2Android networking-2
Android networking-2
Aravindharamanan S
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineYared Ayalew
 
Chrome Devtools Protocol via Selenium/Appium (English)
Chrome Devtools Protocol via Selenium/Appium (English)Chrome Devtools Protocol via Selenium/Appium (English)
Chrome Devtools Protocol via Selenium/Appium (English)
Kazuaki Matsuo
 
Chrome Apps & Extensions
Chrome Apps & ExtensionsChrome Apps & Extensions
Chrome Apps & ExtensionsVarun Raj
 
Reaching out from ADF Mobile (ODTUG KScope 2014)
Reaching out from ADF Mobile (ODTUG KScope 2014)Reaching out from ADF Mobile (ODTUG KScope 2014)
Reaching out from ADF Mobile (ODTUG KScope 2014)
Luc Bors
 
Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...
Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...
Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...
RootedCON
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Rapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformRapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformWSO2
 
Aura Framework Overview
Aura Framework OverviewAura Framework Overview
Aura Framework Overview
rajdeep
 
Staying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHPStaying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHP
Oscar Merida
 
Web APIs & Apps - Mozilla
Web APIs & Apps - MozillaWeb APIs & Apps - Mozilla
Web APIs & Apps - MozillaRobert Nyman
 
20141002 delapsley-socalangularjs-final
20141002 delapsley-socalangularjs-final20141002 delapsley-socalangularjs-final
20141002 delapsley-socalangularjs-final
David Lapsley
 
Building iPad apps with Flex - 360Flex
Building iPad apps with Flex - 360FlexBuilding iPad apps with Flex - 360Flex
Building iPad apps with Flex - 360Flex
danielwanja
 
The Open & Social Web - Kings of Code 2009
The Open & Social Web - Kings of Code 2009The Open & Social Web - Kings of Code 2009
The Open & Social Web - Kings of Code 2009
Chris Chabot
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
Richard Leland
 

Similar to Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 (20)

An Introduction to Tornado
An Introduction to TornadoAn Introduction to Tornado
An Introduction to Tornado
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
Parse Apps with Ember.js
Parse Apps with Ember.jsParse Apps with Ember.js
Parse Apps with Ember.js
 
SharePoint Saturday Atlanta 2015
SharePoint Saturday Atlanta 2015SharePoint Saturday Atlanta 2015
SharePoint Saturday Atlanta 2015
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
 
Android networking-2
Android networking-2Android networking-2
Android networking-2
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App Engine
 
Chrome Devtools Protocol via Selenium/Appium (English)
Chrome Devtools Protocol via Selenium/Appium (English)Chrome Devtools Protocol via Selenium/Appium (English)
Chrome Devtools Protocol via Selenium/Appium (English)
 
Chrome Apps & Extensions
Chrome Apps & ExtensionsChrome Apps & Extensions
Chrome Apps & Extensions
 
Reaching out from ADF Mobile (ODTUG KScope 2014)
Reaching out from ADF Mobile (ODTUG KScope 2014)Reaching out from ADF Mobile (ODTUG KScope 2014)
Reaching out from ADF Mobile (ODTUG KScope 2014)
 
Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...
Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...
Daniel Kachakil - Android's Download Provider: Discovering and exploiting thr...
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Rapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 PlatformRapid Application Development with WSO2 Platform
Rapid Application Development with WSO2 Platform
 
Aura Framework Overview
Aura Framework OverviewAura Framework Overview
Aura Framework Overview
 
Staying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHPStaying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHP
 
Web APIs & Apps - Mozilla
Web APIs & Apps - MozillaWeb APIs & Apps - Mozilla
Web APIs & Apps - Mozilla
 
20141002 delapsley-socalangularjs-final
20141002 delapsley-socalangularjs-final20141002 delapsley-socalangularjs-final
20141002 delapsley-socalangularjs-final
 
Building iPad apps with Flex - 360Flex
Building iPad apps with Flex - 360FlexBuilding iPad apps with Flex - 360Flex
Building iPad apps with Flex - 360Flex
 
The Open & Social Web - Kings of Code 2009
The Open & Social Web - Kings of Code 2009The Open & Social Web - Kings of Code 2009
The Open & Social Web - Kings of Code 2009
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 

More from Atlassian

International Women's Day 2020
International Women's Day 2020International Women's Day 2020
International Women's Day 2020
Atlassian
 
10 emerging trends that will unbreak your workplace in 2020
10 emerging trends that will unbreak your workplace in 202010 emerging trends that will unbreak your workplace in 2020
10 emerging trends that will unbreak your workplace in 2020
Atlassian
 
Forge App Showcase
Forge App ShowcaseForge App Showcase
Forge App Showcase
Atlassian
 
Let's Build an Editor Macro with Forge UI
Let's Build an Editor Macro with Forge UILet's Build an Editor Macro with Forge UI
Let's Build an Editor Macro with Forge UI
Atlassian
 
Meet the Forge Runtime
Meet the Forge RuntimeMeet the Forge Runtime
Meet the Forge Runtime
Atlassian
 
Forge UI: A New Way to Customize the Atlassian User Experience
Forge UI: A New Way to Customize the Atlassian User ExperienceForge UI: A New Way to Customize the Atlassian User Experience
Forge UI: A New Way to Customize the Atlassian User Experience
Atlassian
 
Take Action with Forge Triggers
Take Action with Forge TriggersTake Action with Forge Triggers
Take Action with Forge Triggers
Atlassian
 
Observability and Troubleshooting in Forge
Observability and Troubleshooting in ForgeObservability and Troubleshooting in Forge
Observability and Troubleshooting in Forge
Atlassian
 
Trusted by Default: The Forge Security & Privacy Model
Trusted by Default: The Forge Security & Privacy ModelTrusted by Default: The Forge Security & Privacy Model
Trusted by Default: The Forge Security & Privacy Model
Atlassian
 
Designing Forge UI: A Story of Designing an App UI System
Designing Forge UI: A Story of Designing an App UI SystemDesigning Forge UI: A Story of Designing an App UI System
Designing Forge UI: A Story of Designing an App UI System
Atlassian
 
Forge: Under the Hood
Forge: Under the HoodForge: Under the Hood
Forge: Under the Hood
Atlassian
 
Access to User Activities - Activity Platform APIs
Access to User Activities - Activity Platform APIsAccess to User Activities - Activity Platform APIs
Access to User Activities - Activity Platform APIs
Atlassian
 
Design Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch PluginDesign Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch Plugin
Atlassian
 
Tear Up Your Roadmap and Get Out of the Building
Tear Up Your Roadmap and Get Out of the BuildingTear Up Your Roadmap and Get Out of the Building
Tear Up Your Roadmap and Get Out of the Building
Atlassian
 
Nailing Measurement: a Framework for Measuring Metrics that Matter
Nailing Measurement: a Framework for Measuring Metrics that MatterNailing Measurement: a Framework for Measuring Metrics that Matter
Nailing Measurement: a Framework for Measuring Metrics that Matter
Atlassian
 
Building Apps With Color Blind Users in Mind
Building Apps With Color Blind Users in MindBuilding Apps With Color Blind Users in Mind
Building Apps With Color Blind Users in Mind
Atlassian
 
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Atlassian
 
Beyond Diversity: A Guide to Building Balanced Teams
Beyond Diversity: A Guide to Building Balanced TeamsBeyond Diversity: A Guide to Building Balanced Teams
Beyond Diversity: A Guide to Building Balanced Teams
Atlassian
 
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed TeamThe Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
Atlassian
 
Building Apps With Enterprise in Mind
Building Apps With Enterprise in MindBuilding Apps With Enterprise in Mind
Building Apps With Enterprise in Mind
Atlassian
 

More from Atlassian (20)

International Women's Day 2020
International Women's Day 2020International Women's Day 2020
International Women's Day 2020
 
10 emerging trends that will unbreak your workplace in 2020
10 emerging trends that will unbreak your workplace in 202010 emerging trends that will unbreak your workplace in 2020
10 emerging trends that will unbreak your workplace in 2020
 
Forge App Showcase
Forge App ShowcaseForge App Showcase
Forge App Showcase
 
Let's Build an Editor Macro with Forge UI
Let's Build an Editor Macro with Forge UILet's Build an Editor Macro with Forge UI
Let's Build an Editor Macro with Forge UI
 
Meet the Forge Runtime
Meet the Forge RuntimeMeet the Forge Runtime
Meet the Forge Runtime
 
Forge UI: A New Way to Customize the Atlassian User Experience
Forge UI: A New Way to Customize the Atlassian User ExperienceForge UI: A New Way to Customize the Atlassian User Experience
Forge UI: A New Way to Customize the Atlassian User Experience
 
Take Action with Forge Triggers
Take Action with Forge TriggersTake Action with Forge Triggers
Take Action with Forge Triggers
 
Observability and Troubleshooting in Forge
Observability and Troubleshooting in ForgeObservability and Troubleshooting in Forge
Observability and Troubleshooting in Forge
 
Trusted by Default: The Forge Security & Privacy Model
Trusted by Default: The Forge Security & Privacy ModelTrusted by Default: The Forge Security & Privacy Model
Trusted by Default: The Forge Security & Privacy Model
 
Designing Forge UI: A Story of Designing an App UI System
Designing Forge UI: A Story of Designing an App UI SystemDesigning Forge UI: A Story of Designing an App UI System
Designing Forge UI: A Story of Designing an App UI System
 
Forge: Under the Hood
Forge: Under the HoodForge: Under the Hood
Forge: Under the Hood
 
Access to User Activities - Activity Platform APIs
Access to User Activities - Activity Platform APIsAccess to User Activities - Activity Platform APIs
Access to User Activities - Activity Platform APIs
 
Design Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch PluginDesign Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch Plugin
 
Tear Up Your Roadmap and Get Out of the Building
Tear Up Your Roadmap and Get Out of the BuildingTear Up Your Roadmap and Get Out of the Building
Tear Up Your Roadmap and Get Out of the Building
 
Nailing Measurement: a Framework for Measuring Metrics that Matter
Nailing Measurement: a Framework for Measuring Metrics that MatterNailing Measurement: a Framework for Measuring Metrics that Matter
Nailing Measurement: a Framework for Measuring Metrics that Matter
 
Building Apps With Color Blind Users in Mind
Building Apps With Color Blind Users in MindBuilding Apps With Color Blind Users in Mind
Building Apps With Color Blind Users in Mind
 
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
 
Beyond Diversity: A Guide to Building Balanced Teams
Beyond Diversity: A Guide to Building Balanced TeamsBeyond Diversity: A Guide to Building Balanced Teams
Beyond Diversity: A Guide to Building Balanced Teams
 
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed TeamThe Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
 
Building Apps With Enterprise in Mind
Building Apps With Enterprise in MindBuilding Apps With Enterprise in Mind
Building Apps With Enterprise in Mind
 

Recently uploaded

FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
Alison B. Lowndes
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 

Recently uploaded (20)

FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 

Plugins on OnDemand with Remote Apps - Atlassian Summit 2012

  • 1.
  • 2. Plugins on OnDemand with Remote Apps Don Brown Architect, Atlassian
  • 4. And now. . . • Over 12k active, 9k paid OnDemand accounts • 5 out of 10 add Greenhopper • 1.5 out of 10 add Bonfire • 1 out of 10 add Team Calendars . . . Instances
  • 6. But isn‟t it just a copy?
  • 7. Plugin Problems: Security <% String eid = request.getParameter("eid"); %> ... Employee ID: <%= eid %>
  • 8. Plugin Problems: Performance java.lang.OutOfMemoryError: Java heap space at org.apache.xerces.dom.DeferredDocumentImpl.createChunk(Unknown Source) at org.apache.xerces.dom.DeferredDocumentImpl.ensureCapacity(Unknown Source) at org.apache.xerces.dom.DeferredDocumentImpl.createNode(Unknown Source) at org.apache.xerces.dom.DeferredDocumentImpl.createDeferredEntityReference(Unknown Source) at org.apache.xerces.parsers.AbstractDOMParser.startGeneralEntity(Unknown Source) at org.apache.xerces.impl.dtd.XMLDTDValidator.startGeneralEntity(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.startEntity(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source
  • 10. Product Dev QA Everyone‟s Angry Admins Plugin Dev
  • 12. This is a Remote App key: app1 name: Remote App - app1 version: 1 • A single descriptor file display-url: http://example.com description: This app vendor: • Can be in XML, YAML, or JSON name: Atlassian url: http://atlassian.com • Contains permissions: permission: • App metadata - scope: browse_projects • Permissions general-page: - key: first • Extension points name: First url: /first
  • 13. Examples: General Page Plugin Steps Remote App Steps 1. Add web-item config 1. Add general-page config 2. Add servlet config 2. Implement URL 3. Code servlet 4. Try to get output decorated
  • 14. Examples: React to Event Plugin Steps Remote App Steps 1. Add component config 1. Add web-hook config 2. Dig through code to find 2. Implement URL event to listen for 3. Register for events 4. Handle event 5. Make sure to unregister
  • 15. Examples: Custom Macro Editor Plugin Steps Remote App Steps 1. Add web-resource and rest 1. Add custom-macro-editor config config 2. Find and call JavaScript 2. Implement URL API to override edit button 3. Create AUI dialog 4. Implement REST resources
  • 17. Apps: Dropbox by AppFusions • Share your documents • Written in Java, deployed at Contegix • Provides a custom page macro, and macro editor with MS Office edit
  • 18.
  • 19.
  • 20. Apps: TFS4JIRA by Spartez • Integrate JIRA with your Team Foundation Server • Written in Java, deployed at Heroku • Uses project and issue tabs, and an admin page
  • 21.
  • 23. Steps to create Lucidchart app • Establish Trust • Register App • Implement General Page • Implement macro
  • 25. Steps to create Lucidchart app • Establish Trust • Register App • Implement General Page • Implement macro
  • 26. Register the app • Receive from OnDemand as Request params: • OAuth consumer key • OAuth RSA public key • Base URL
  • 27. Register the app • Return to OnDemand description of the remote app • Can be in XML, JSON or YAML
  • 28. Provide OAuth consumer key and RSA public key <remote-app key=“xxxxxxx" name="Lucidchart" version="1" icon-url="http://www.lucidchart.com/favicon.ico" display-url="https://www.lucidchart.com/ondemand"> <vendor name="Lucidchart" url="http://www.lucidchart.com" /> <description>Lucidchart example</description> <oauth …> <public-key>yyyyyy</public-key> </oauth> ...
  • 29. Request permissions ... <permissions> <permission scope="read_users_and_groups" /> <permission scope="read_content" /> <permission scope="modify_attachments" /> <permission scope="modify_content" /> </permissions> ...
  • 30. General Page ... <general-page section="system.content.add/space" key="lucidAppGeneral" link-name="Lucidchart Diagram" name="Select or create a diagram" url="/doclist" width="1200" height="800" icon-url="/icon"> <description>Insert or Create a Lucidchart Diagram</description> <context-param name="page_id" /> </general-page> ...
  • 31. General Page ... <general-page section="system.content.add/space" key="lucidAppGeneral" link-name="Lucidchart Diagram" name="Select or create a diagram" url="/doclist" width="1200" height="800" icon-url="/icon"> <description>Insert or Create a Lucidchart Diagram</description> <context-param name="page_id" /> </general-page> ...
  • 32. General Page ... <general-page section="system.content.add/space" key="lucidAppGeneral" link-name="Lucidchart Diagram" name="Select or create a diagram" url="/doclist" width="1200" height="800" icon-url="/icon"> <description>Insert or Create a Lucidchart Diagram</description> <context-param name="page_id" /> </general-page> ...
  • 33. General Page ... <general-page section="system.content.add/space" key="lucidAppGeneral" link-name="Lucidchart Diagram" name="Select or create a diagram" url="/doclist" width="1200" height="800" icon-url="/icon"> <description>Insert or Create a Lucidchart Diagram</description> <context-param name="page_id" /> </general-page> ...
  • 34. Macro ... <macro key="lucidchart" url="/macro" output-type="block" body-type="none"> <description>Create a Lucidchart Diagram</description> <category name="development" /> <image-placeholder url="/imagePlaceHolder" width="140" height="140" apply- chrome="true"/> <parameters> <parameter name="width" title="Width" type="string" default=“700"/> <parameter name="height" title="Height (if blank, image ratio is preserved)" type="string" /> <parameter name="align" type="enum" default="Left"> <value name="Left"/> <value name="Right" /> </parameter> </parameters> </macro>
  • 35. Macro ... <macro key="lucidchart" url="/macro" output-type="block" body-type="none"> <description>Create a Lucidchart Diagram</description> <category name="development" /> <image-placeholder url="/imagePlaceHolder" width="140" height="140" apply- chrome="true"/> <parameters> <parameter name="width" title="Width" type="string" default=“700"/> <parameter name="height" title="Height (if blank, image ratio is preserved)" type="string" /> <parameter name="align" type="enum" default="Left"> <value name="Left"/> <value name="Right" /> </parameter> </parameters> </macro>
  • 36. Macro ... <macro key="lucidchart" url="/macro" output-type="block" body-type="none"> <description>Create a Lucidchart Diagram</description> <category name="development" /> <image-placeholder url="/imagePlaceHolder" width="140" height="140" apply-chrome="true"/> <parameters> <parameter name="width" title="Width" type="string" default=“700"/> <parameter name="height" title="Height (if blank, image ratio is preserved)" type="string" /> <parameter name="align" type="enum" default="Left"> <value name="Left"/> <value name="Right" /> </parameter> </parameters> </macro>
  • 37. Macro ... <macro key="lucidchart" url="/macro" output-type="block" body-type="none"> <description>Create a Lucidchart Diagram</description> <category name="development" /> <image-placeholder url="/imagePlaceHolder" width="140" height="140"/> <parameters> <parameter name="width" title="Width" type="string" default=“700"/> <parameter name="height" title="Height" type="string" /> <parameter name="align" type="enum" default="Left"> <value name="Left"/> <value name="Right" /> </parameter> </parameters> </macro>
  • 38. Steps to create Lucidchart app • Establish Trust • Register App • Implement General Page • Implement macro
  • 39. Any language can be used • Lucidchart is using PHP
  • 40. Add Diagram (general page) function doclist() { if (!$this->_hasValidOAuthSignature()) { $this->set("oauthValid", false); return; } $userId = @$_REQUEST['user_id']; $pageId = @$_REQUEST['page_id']; $redirectURL = "https://" . $_SERVER['SERVER_NAME'] . '/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId; $this->layout = „ondemand'; $this->set("baseUrl", $this->_getBaseURL()); $this->set("callback", urlencode($redirectURL)); }
  • 41. Add Diagram (general page) function doclist() { if (!$this->_hasValidOAuthSignature()) { $this->set("oauthValid", false); return; } $userId = @$_REQUEST['user_id']; $pageId = @$_REQUEST['page_id']; $redirectURL = "https://" . $_SERVER['SERVER_NAME'] . '/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId; $this->layout = „ondemand'; $this->set("baseUrl", $this->_getBaseURL()); $this->set("callback", urlencode($redirectURL)); }
  • 42. Add Diagram (general page) function doclist() { if (!$this->_hasValidOAuthSignature()) { $this->set("oauthValid", false); return; } $userId = @$_REQUEST['user_id']; $pageId = @$_REQUEST['page_id']; $redirectURL = "https://" . $_SERVER['SERVER_NAME'] . '/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId; $this->layout = „ondemand'; $this->set("baseUrl", $this->_getBaseURL()); $this->set("callback", urlencode($redirectURL)); }
  • 43. Add Diagram (general page) function doclist() { if (!$this->_hasValidOAuthSignature()) { $this->set("oauthValid", false); return; } $userId = @$_REQUEST['user_id']; $pageId = @$_REQUEST['page_id']; $redirectURL = "https://" . $_SERVER['SERVER_NAME'] . '/ondemand/attachDocument?page_id=' . $pageId . "&user_id=" . $userId; $this->layout = „ondemand'; $this->set("baseUrl", $this->_getBaseURL()); $this->set("callback", urlencode($redirectURL)); }
  • 44. Make API calls to attach diagram function attachDocument() { ... $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId; $auth_header = $this->_getAuthHeader($fullUrl); xmlrpc_set_type($imageBytes, "base64"); $attachmentMetaData = array("fileName"=>$attachmentName, "contentType"=>"image/png", "comment"=>"Imported from Lucidchart (do not deleted)"); $addAttachmentBody= xmlrpc_encode_request( "confluence2.addAttachment", array("", $pageId, $attachmentMetaData ,$imageBytes)); $this->_sendXMLRPCRequest($fullUrl, array( "Content-Type: text/xml", $auth_header), $addAttachmentBody); ... }
  • 45. Make API calls to attach diagram function attachDocument() { ... $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId; $auth_header = $this->_getAuthHeader($fullUrl); xmlrpc_set_type($imageBytes, "base64"); $attachmentMetaData = array("fileName"=>$attachmentName, "contentType"=>"image/png", "comment"=>"Imported from Lucidchart (do not deleted)"); $addAttachmentBody= xmlrpc_encode_request( "confluence2.addAttachment", array("", $pageId, $attachmentMetaData ,$imageBytes)); $this->_sendXMLRPCRequest($fullUrl, array( "Content-Type: text/xml", $auth_header), $addAttachmentBody); ... }
  • 46. Make API calls to attach diagram function attachDocument() { ... $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId; $auth_header = $this->_getAuthHeader($fullUrl); xmlrpc_set_type($imageBytes, "base64"); $attachmentMetaData = array("fileName"=>$attachmentName, "contentType"=>"image/png", "comment"=>"Imported from Lucidchart (do not deleted)"); $addAttachmentBody= xmlrpc_encode_request( "confluence2.addAttachment", array("", $pageId, $attachmentMetaData ,$imageBytes)); $this->_sendXMLRPCRequest($fullUrl, array( "Content-Type: text/xml", $auth_header), $addAttachmentBody); ... }
  • 47. Make API calls to attach diagram function attachDocument() { ... $fullUrl = $baseURL . "/rpc/xmlrpc?user_id=" . $userId; $auth_header = $this->_getAuthHeader($fullUrl); xmlrpc_set_type($imageBytes, "base64"); $attachmentMetaData = array("fileName"=>$attachmentName, "contentType"=>"image/png", "comment"=>"Imported from Lucidchart (do not deleted)"); $addAttachmentBody= xmlrpc_encode_request( "confluence2.addAttachment", array("", $pageId, $attachmentMetaData ,$imageBytes)); $this->_sendXMLRPCRequest($fullUrl, array( "Content-Type: text/xml", $auth_header), $addAttachmentBody); ... }
  • 48. Steps to create Lucidchart app • Establish Trust • Register App • Implement General Page • Implement macro
  • 49. Macro • Receive macro params • Return HTML • Will be cached (caching header can be returned) • No CSS, inline styles or JavaScript
  • 50. Macro : Receive macro params function macro() { $userId = $_REQUEST['user_id']; $name = $_REQUEST['name']; $pageId = $_REQUEST['pageId']; $docId = $_REQUEST['id']; $width= $_REQUEST['width']; $height = $_REQUEST['height']; $align = $_REQUEST['align']; $outputType = $_REQUEST['ctx_output_type']; ...
  • 51. Macro: Return HTML <div style="float: “ . $align . "; margin: 0 auto; width: " . (intVal($width) + 2) . "px;"> <img src=“$pageAttachment['url']” width=“$width” height=“$height”/> <div style="text-align: center"> <a href='sign://"$host/editDocument/$docId?attachment= $name'>Edit Diagram</a> | <a href=$baseUrl/plugins/servlet/remoteapps/lucidchart- app/lucidAppRemove?page_id=$pageId&doc_id=$docId&attachment=$name'>Remove Diagram</a> </div> </div>
  • 52. That‟s it! Straightforward approach to get your app available for OnDemand
  • 53. We‟re taking Apps to the next level
  • 54. What if you could . . . • Tap into our 12k+ OnDemand customer base • Register your app with one click • Have full control over your app
  • 55. If you want to integrate, call us! • Currently targeted towards SaaS integrations • Feature set in early stages Diagram here • Working on solution for “extensions”
  • 56. You can finally integrate your site into OnDemand with Remote Apps #summit12
  • 58. Getting started https://remoteapps.jira.com