SlideShare ist ein Scribd-Unternehmen logo
1 von 83
Downloaden Sie, um offline zu lesen
Building add-ons using
add-ons
DANIEL WESTER • CO-FOUNDER • WITTIFIED • @DWESTER42A
Building add-ons using
add-ons
DANIEL WESTER • CO-FOUNDER • WITTIFIED • @DWESTER42A
About me
20%
Web Fragment Finder
My button
ACTIVE OBJECTS
p2 addon
ADDING A WEB ITEM
WEB RESOURCES
EVENTS
GETTING STARTED
ACTIVE OBJECTS
GETTING STARTED
p2 addon
ADDING A WEB ITEM
WEB RESOURCES
EVENTS
BASIC DESCRIPTOR
<atlassian-plugin key="${project.groupId}.${project.artifactId}" name="${project.name}"
plugins-version="2">
<plugin-info>
<description>${project.description}</description>
<version>${project.version}</version>
<vendor name="${project.organization.name}" url="${project.organization.url}" />
<param name="plugin-icon">images/pluginIcon.png</param>
<param name="plugin-logo">images/pluginLogo.png</param>
</plugin-info>
<component-import key="applicationProperties"
interface="com.atlassian.sal.api.ApplicationProperties" />
<component-import key="eventPublisher"
interface="com.atlassian.event.api.EventPublisher"/>
<component-import key="ao" name="Active Objects service"
interface="com.atlassian.activeobjects.external.ActiveObjects">
<description>Active Objects functionality from the plugin</description>
</component-import>
<ao key="ao-module">
<description>Active Objects entries</description>
<entity>com.wittified.pres.DashView</entity>
</ao>
<component key="dash-tracker-service"
class="com.wittified.pres.DashTrackerServiceImpl">
<interface>com.wittified.pres.DashTrackerService</interface>
</component>
<rest key="rest-end-points" path="/wittified/dashboards" version="1.0">
<description>REST interface to integrate with things</description>
</rest>
<resource type="i18n" name="i18n" location="dashboard-tracker"/>
<web-resource key="atlascamp-dashboard-tracker-resources" name="atlascamp-
dashboard-tracker Web Resources">
<dependency>com.atlassian.auiplugin:ajs</dependency>
<dependency>com.atlassian.auiplugin:dialog2</dependency>
<resource type="download" name="dashboard-tracker.css" location="/css/dashboard-
tracker.css"/>
<resource type="download" name="dashboard-tracker.js" location="/js/dashboard-
tracker.js"/>
<resource type="download" name="images/" location="/images"/>
<transformation extension="soy">
<transformer key="soyTransformer"/>
</transformation>
<resource type="download" name="dashboard-counter.soy.js" location="/soy/
TabularData.soy"/>
<context>atl.general</context>
</web-resource>
</atlassian-plugin>
ACTIVE OBJECTS ENTITY
package com.wittified.pres;

import net.java.ao.Entity;

import net.java.ao.schema.PrimaryKey;

public interface DashView extends Entity

{

public Long getDashboard();

public void setDashboard(Long dashboard);

public Long getViews();

public void setViews( Long count);

}
ACTIVE OBJECTS SERVICE
@Override

@Transactional

public void trackThis(long dashboard)

{

DashView[] dashViews = this.activeObjects.find(DashView.class, Query.select().where(" DASHBOARDS = ? ", dashboard) );

DashView dashView = null;

if(dashViews.length==0)

{

dashView = this.activeObjects.create( DashView.class);

dashView.setDashboard( dashboard);

dashView.setViews(0L);

}

else

{

dashView = dashViews[0];

}

dashView.setViews(dashView.getViews() + 1);

dashView.save();

}
REST
@GET

@Produces({MediaType.APPLICATION_JSON})

@Path("/all")

public Response getAll()

{

List<DashBoardEntity> dashBoardEntityList = new ArrayList<DashBoardEntity>();

for(DashView dashView: this.dashTrackerService.getAll())

{

PortalPage page = this.portalPageManager.getPortalPageById( dashView.getDashboard());

DashBoardEntity dashBoardEntity = new DashBoardEntity();

dashBoardEntity.setName( page.getName());

dashBoardEntity.setCount( dashView.getViews());

dashBoardEntity.setId( dashView.getDashboard());

if(page.getOwner()==null)

{

dashBoardEntity.setOwner("None");

}

else {

dashBoardEntity.setOwner(page.getOwner().getDisplayName());

}

dashBoardEntityList.add( dashBoardEntity);

}

return Response.ok( dashBoardEntityList).build();
EVENT LISTENER
public class DashBoardEventListener implements InitializingBean, DisposableBean

{

private final EventPublisher eventPublisher;

private final DashTrackerService dashTrackerService;

public DashBoardEventListener( final EventPublisher eventPublisher,

final DashTrackerService dashTrackerService)

{

this.eventPublisher = eventPublisher;

this.dashTrackerService = dashTrackerService;

}

@Override

public void destroy() throws Exception

{

this.eventPublisher.unregister( this);

}

@Override

public void afterPropertiesSet() throws Exception

{

this.eventPublisher.register( this);

}

}
ACTIVE OBJECTS
EVENTS
p2 addon
ADDING A WEB ITEM
WEB RESOURCES
GETTING STARTED
EVENT LISTENER
@EventListener

public void onDashboardViewEvent( DashboardViewEvent dashboardViewEvent)

{

this.dashTrackerService.trackThis( dashboardViewEvent.getId() );

}
EVENTS
ACTIVE OBJECTS
p2 addon
ADDING A WEB ITEM
WEB RESOURCES
GETTING STARTED
ACTIVE OBJECT SERVICE ERROR
ACTIVE OBJECT SERVICE ERROR
DashView[] dashViews = this.activeObjects.find(DashView.class, Query.select().where(" DASHBOARDS
= ? ", dashboard) );
ACTIVE OBJECT SERVICE FIXED
DashView[] dashViews = this.activeObjects.find(DashView.class, Query.select().where(" DASHBOARD
= ? ", dashboard) );
ACTIVE OBJECTS
ADDING A WEB ITEM
p2 addon
EVENTS
WEB RESOURCES
GETTING STARTED
TEMPLATEIZED WEB-ITEM
<web-item key="web-item-example" name="My Web Item"
section="gadgets.dashboard.menu" weight=“200">

<description key="my-web-item-desc">General description</description>

<label key="my-web-item-label" />

<link linkId=“my-web-item-link”>/my-web-item</link>

</web-item>
FLUSHED OUT WEB-ITEM
<web-item key="web-item-dashboard-usage" name="DashBoard Usage"
section="gadgets.dashboard.menu" weight="200">

<description key="my-web-item-desc">General description</
description>

<label key="Dashboard usage" />

<link linkId=“dashboard-usagelink">/</link>

</web-item>
ACTIVE OBJECTS
WEB RESOURCES
p2 addon
EVENTS
ADDING A WEB ITEM
GETTING STARTED
WEB RESOURCE ENTY: GENERAL
<web-resource key="atlascamp-dashboard-tracker-resources" name="atlascamp-dashboard-tracker Web
Resources">

<dependency>com.atlassian.auiplugin:ajs</dependency>

<dependency>com.atlassian.auiplugin:dialog2</dependency>



<resource type="download" name="dashboard-tracker.css" location="/css/dashboard-tracker.css"/>

<resource type="download" name="dashboard-tracker.js" location="/js/dashboard-tracker.js"/>

<resource type="download" name="images/" location="/images"/>

<transformation extension="soy">

<transformer key="soyTransformer"/>

</transformation>

<resource type="download" name="dashboard-counter.soy.js" location="/soy/TabularData.soy"/>

<context>atl.general</context>

</web-resource>
WEB RESOURCE ENTY: SPECIFIC
<web-resource key="atlascamp-dashboard-tracker-resources" name="atlascamp-dashboard-tracker Web
Resources">

<dependency>com.atlassian.auiplugin:ajs</dependency>

<dependency>com.atlassian.auiplugin:dialog2</dependency>



<resource type="download" name="dashboard-tracker.css" location="/css/dashboard-tracker.css"/>

<resource type="download" name="dashboard-tracker.js" location="/js/dashboard-tracker.js"/>

<resource type="download" name="images/" location="/images"/>

<transformation extension="soy">

<transformer key="soyTransformer"/>

</transformation>

<resource type="download" name="dashboard-counter.soy.js" location="/soy/TabularData.soy"/>

<context>atl.dashboard</context>

</web-resource>
ACTIVE OBJECTS
p2 addon
EVENTS
ADDING A WEB ITEM
GETTING STARTED
WEB RESOURCES
Web Fragment Finder functionality
• Identify Web Items/Panels/Sections/Resource locations
• Click to copy xml
• Active Objects Inspector
• Event inspector
But what about Atlassian Connect?
SOMEBODY FROM ATLASSIAN
”“
BASIC WEB ITEMS
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
HTTP
ADDING WEB PANELS
ISSUE PROPERTIES
ADVANCED WEB ITEMS
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
INSTALL ATLASSIAN CONNECT
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
HTTP
ADDING WEB PANELS
ISSUE PROPERTIES
ADVANCED WEB ITEMS
NORMAL STARTING OF AC ENABLED JIRA
atlas-run-standalone --product jira --version 6.5-OD-03-002 --bundled-plugins
com.atlassian.bundles:json-schema-validator-atlassian-bundle:
1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:2.0.0,com.atlassian.jwt:jwt-
plugin:1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19-
D20150321T001323,com.atlassian.plugins:atlassian-connect-plugin:1.1.27 --jvmargs -
Datlassian.upm.on.demand=true
(as of May 5th 2015)
STARTING OF AC ENABLED JIRA WITH WEBFRAGS
atlas-run-standalone --product jira
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
HTTP
ADDING WEB PANELS
ISSUE PROPERTIES
ADVANCED WEB ITEMS
BASIC WEB-ITEM FRAGMENT
{

"url": "/my-web-item",

"location": "system.top.navigation.bar",

"context": "addon",

"weight": 200,

"target": {

"type": "page"

},

"styleClasses": [

"webitem",

"system-present-webitem"

],

"tooltip": {

"value": "Example tooltip"

},

"icon": {

"width": 16,

"height": 16,

"url": "/maps/icon.png"

},

"key": "web-item-example",

"name": {

"value": "My Web Item"

}

}
BASIC WEB ITEMS
WORKING WITH P2 ADD ONS
Atlassian Connect
MANAGING AC ADDONS
HTTP
ADDING WEB PANELS
ISSUE PROPERTIES
ADVANCED WEB ITEMS
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
MANAGING AC ADDONS
Atlassian Connect
WORKING WITH P2 ADD ONS
HTTP
ADDING WEB PANELS
ISSUE PROPERTIES
ADVANCED WEB ITEMS
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
HTTP
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
ADDING WEB PANELS
ISSUE PROPERTIES
ADVANCED WEB ITEMS
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
ADDING WEB PANELS
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
HTTP
ISSUE PROPERTIES
ADVANCED WEB ITEMS
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
ISSUE PROPERTIES
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
HTTP
ADDING WEB PANELS
ADVANCED WEB ITEMS
INSTALL ATLASSIAN CONNECT
BASIC WEB ITEMS
ADVANCED WEB ITEMS
Atlassian Connect
WORKING WITH P2 ADD ONS
MANAGING AC ADDONS
HTTP
ADDING WEB PANELS
ISSUE PROPERTIES
INSTALL ATLASSIAN CONNECT
Web Fragment Finder functionality
• Identify Web Items/Panels/Sections/Resource locations
• Click to copy xml
• Active Objects Inspector
• Event inspector
Web Fragment Finder functionality
• Identify Web Items/Panels/
Sections/Resource locations
• Click to copy xml
• Active Objects Inspector
• Event inspector
• Identify Web Items/Panels/
Sections/Resource locations
• Click to copy json
• Manage Descriptors
• Start node applications
• HTTP traffic analyser
• Inspect properties
p2 AC
FINDING THE LOCATIONS
for (WebItemModuleDescriptor w : 

this.pluginAccessor.getEnabledModuleDescriptorsByClass( WebItemModuleDescriptor.class))

{

	 	 …

}

for (WebSectionModuleDescriptor w : 

this.pluginAccessor.getEnabledModuleDescriptorsByClass( WebSectionModuleDescriptor.class))

{

	 	 …

}

for (WebPanelModuleDescriptor w : 

this.pluginAccessor.getEnabledModuleDescriptorsByClass( WebPanelModuleDescriptor.class))

{

…

}
GENERATING THE PLUGIN
File file = File.createTempFile("plugin-generator",".jar");
FileOutputStream fos = new FileOutputStream(file);
ZipOutputStream zipOut = new ZipOutputStream( fos );
Map<String, String> resourceJS = this.generateWebResources();
for (String item: resourceJS.keySet())
{
zipOut.putNextEntry( new ZipEntry( String.format( "web-resources/%s.js", item)) );
zipOut.write( resourceJS.get( item).getBytes());
}
zipOut.putNextEntry(new ZipEntry("atlassian-plugin.xml"));
zipOut.write(this.generatePluginXml().getBytes());
zipOut.putNextEntry(new ZipEntry("com/wittified/fragfinder/conditions/WebItemCondition.class"));
IOUtils.copy(this.getClass().getClassLoader().getResourceAsStream(
"com/wittified/fragfinder/conditions/WebItemCondition.class"), zipOut);
…
PluginArtifact pluginArtifact = this.pluginArtifactFactory.create(file.toURI());
this.pluginController.installPlugins(pluginArtifact);
FINDING EVENTS
@EventListener
public void onAllEvents( Object eventObject)
{
String className = eventObject.getClass().getName();
….
}
PROXY SERVER BUILT IN
public class PluginEnablingListener implements LifecycleAware, DisposableBean
{
public void onStart()
{
this.httpProxyService.start();
}
public void destroy()
{
this.httpProxyService.stop();
}
}
ATLASSIAN CONNECT INSTALLATION
{"validFrom":"2015-05-05T04:02:59.097Z","validTo":"OPEN","environment":{"dev":
{"connectVersion":"1.1.29","jiraCommand":"atlas-run-standalone --product jira --version 6.5-OD-03-003 --bundled-plugins
com.atlassian.bundles:json-schema-validator-atlassian-bundle:1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:
2.0.0,com.atlassian.jwt:jwt-plugin:1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19-
D20150504T170409,com.atlassian.plugins:atlassian-connect-plugin:1.1.29 --jvmargs -
Datlassian.upm.on.demand=true","confluenceCommand":"atlas-run-standalone --product confluence --version 5.8-
OD-51-005 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle:
1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:1.0.6,com.atlassian.jwt:jwt-plugin:
1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19-
D20150504T170409,com.atlassian.plugins:atlassian-connect-plugin:1.1.29 --jvmargs -
Datlassian.upm.on.demand=true"},"prd":{"connectVersion":"1.1.27","jiraCommand":"atlas-run-standalone --product jira --
version 6.5-OD-03-002 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle:
1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:2.0.0,com.atlassian.jwt:jwt-plugin:
1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19-
D20150321T001323,com.atlassian.plugins:atlassian-connect-plugin:1.1.27 --jvmargs -
Datlassian.upm.on.demand=true","confluenceCommand":"atlas-run-standalone --product confluence --version 5.8-
OD-50-011 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle:
1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:1.0.6,com.atlassian.jwt:jwt-plugin:
1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19-
D20150422T024538,com.atlassian.plugins:atlassian-connect-plugin:1.1.27 --jvmargs -Datlassian.upm.on.demand=true"}}}
source: https://developer.atlassian.com/static/connect/commands/connect-versions.json
* Sorry Crowd
Available for almost all apps*
Dig into the resources
Use Web Fragment Finder
Thank you!
DANIEL WESTER • CO-FOUNDER • WITTIFIED • @DWESTER42A

Weitere ähnliche Inhalte

Was ist angesagt?

Orchard Harvest 2014 - The Future of Widgets?
Orchard Harvest 2014 - The Future of Widgets?Orchard Harvest 2014 - The Future of Widgets?
Orchard Harvest 2014 - The Future of Widgets?Steve Taylor
 
SPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking GlassSPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking GlassBrian Caauwe
 
Angular vs React for Web Application Development
Angular vs React for Web Application DevelopmentAngular vs React for Web Application Development
Angular vs React for Web Application DevelopmentFITC
 
AtlasCamp 2013: Modernizing your Plugin UI
AtlasCamp 2013: Modernizing your Plugin UI AtlasCamp 2013: Modernizing your Plugin UI
AtlasCamp 2013: Modernizing your Plugin UI colleenfry
 
Building Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOSBuilding Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOSFITC
 
WebcampZG - Rails 4
WebcampZG - Rails 4WebcampZG - Rails 4
WebcampZG - Rails 4shnikola
 
Gae Meets Django
Gae Meets DjangoGae Meets Django
Gae Meets Djangofool2nd
 
Introduction Django
Introduction DjangoIntroduction Django
Introduction DjangoWade Austin
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular UJoonas Lehtinen
 
Laravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleLaravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleKaty Slemon
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web ComponentsAndrew Rota
 
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Atlassian
 
Multi screen HTML5
Multi screen HTML5Multi screen HTML5
Multi screen HTML5Ron Reiter
 
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 enterpriseRené Winkelmeyer
 
The Future of CSS with Web Components
The Future of CSS with Web ComponentsThe Future of CSS with Web Components
The Future of CSS with Web ComponentsColdFusionConference
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSmurtazahaveliwala
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces Skills Matter
 
BPM-2 Introduction to Advanced Workflows
BPM-2 Introduction to Advanced WorkflowsBPM-2 Introduction to Advanced Workflows
BPM-2 Introduction to Advanced WorkflowsAlfresco Software
 

Was ist angesagt? (20)

Orchard Harvest 2014 - The Future of Widgets?
Orchard Harvest 2014 - The Future of Widgets?Orchard Harvest 2014 - The Future of Widgets?
Orchard Harvest 2014 - The Future of Widgets?
 
SPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking GlassSPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking Glass
 
Angular vs React for Web Application Development
Angular vs React for Web Application DevelopmentAngular vs React for Web Application Development
Angular vs React for Web Application Development
 
AtlasCamp 2013: Modernizing your Plugin UI
AtlasCamp 2013: Modernizing your Plugin UI AtlasCamp 2013: Modernizing your Plugin UI
AtlasCamp 2013: Modernizing your Plugin UI
 
Building Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOSBuilding Progressive Web Apps for Android and iOS
Building Progressive Web Apps for Android and iOS
 
WebcampZG - Rails 4
WebcampZG - Rails 4WebcampZG - Rails 4
WebcampZG - Rails 4
 
Gae Meets Django
Gae Meets DjangoGae Meets Django
Gae Meets Django
 
Apex & jQuery Mobile
Apex & jQuery MobileApex & jQuery Mobile
Apex & jQuery Mobile
 
Introduction Django
Introduction DjangoIntroduction Django
Introduction Django
 
Vaadin Components @ Angular U
Vaadin Components @ Angular UVaadin Components @ Angular U
Vaadin Components @ Angular U
 
Laravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleLaravel 8 export data as excel file with example
Laravel 8 export data as excel file with example
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web Components
 
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
 
Multi screen HTML5
Multi screen HTML5Multi screen HTML5
Multi screen HTML5
 
Vaadin Components
Vaadin ComponentsVaadin Components
Vaadin Components
 
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
 
The Future of CSS with Web Components
The Future of CSS with Web ComponentsThe Future of CSS with Web Components
The Future of CSS with Web Components
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
 
BPM-2 Introduction to Advanced Workflows
BPM-2 Introduction to Advanced WorkflowsBPM-2 Introduction to Advanced Workflows
BPM-2 Introduction to Advanced Workflows
 

Ähnlich wie AtlasCamp 2015: Using add-ons to build add-ons

Level up apps and websites with vue.js
Level up  apps and websites with vue.jsLevel up  apps and websites with vue.js
Level up apps and websites with vue.jsVioletta Villani
 
Level up apps and websites with vue.js
Level up  apps and websites with vue.jsLevel up  apps and websites with vue.js
Level up apps and websites with vue.jsCommit University
 
HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2James Pearce
 
I pv6+at+caribbean+sector
I pv6+at+caribbean+sectorI pv6+at+caribbean+sector
I pv6+at+caribbean+sectormax Firmin
 
Enough with the JavaScript already!
Enough with the JavaScript already!Enough with the JavaScript already!
Enough with the JavaScript already!Nicholas Zakas
 
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!Coulawrence
 
Enough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas ZakasEnough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas ZakasKubide
 
Creating GUI container components in Angular and Web Components
Creating GUI container components in Angular and Web ComponentsCreating GUI container components in Angular and Web Components
Creating GUI container components in Angular and Web ComponentsRachael L Moore
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Joao Lucas Santana
 
Introduction to jQuery Mobile
Introduction to jQuery MobileIntroduction to jQuery Mobile
Introduction to jQuery Mobileejlp12
 

Ähnlich wie AtlasCamp 2015: Using add-ons to build add-ons (20)

Vue.js for beginners
Vue.js for beginnersVue.js for beginners
Vue.js for beginners
 
iWebkit
iWebkitiWebkit
iWebkit
 
JQuery Mobile UI
JQuery Mobile UIJQuery Mobile UI
JQuery Mobile UI
 
Level up apps and websites with vue.js
Level up  apps and websites with vue.jsLevel up  apps and websites with vue.js
Level up apps and websites with vue.js
 
Level up apps and websites with vue.js
Level up  apps and websites with vue.jsLevel up  apps and websites with vue.js
Level up apps and websites with vue.js
 
Adobe & HTML5
Adobe & HTML5Adobe & HTML5
Adobe & HTML5
 
HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2
 
Xxx
XxxXxx
Xxx
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
I pv6+at+caribbean+sector
I pv6+at+caribbean+sectorI pv6+at+caribbean+sector
I pv6+at+caribbean+sector
 
Jquery Cheatsheet
Jquery CheatsheetJquery Cheatsheet
Jquery Cheatsheet
 
Enough with the JavaScript already!
Enough with the JavaScript already!Enough with the JavaScript already!
Enough with the JavaScript already!
 
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
 
Enough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas ZakasEnough with the javas cript already! de Nicholas Zakas
Enough with the javas cript already! de Nicholas Zakas
 
Creating GUI container components in Angular and Web Components
Creating GUI container components in Angular and Web ComponentsCreating GUI container components in Angular and Web Components
Creating GUI container components in Angular and Web Components
 
One Size Fits All
One Size Fits AllOne Size Fits All
One Size Fits All
 
Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)Desenvolvimento web com Ruby on Rails (parte 2)
Desenvolvimento web com Ruby on Rails (parte 2)
 
Introduction to jQuery Mobile
Introduction to jQuery MobileIntroduction to jQuery Mobile
Introduction to jQuery Mobile
 
Meet VueJs
Meet VueJsMeet VueJs
Meet VueJs
 
Polymer
PolymerPolymer
Polymer
 

Mehr von Atlassian

International Women's Day 2020
International Women's Day 2020International Women's Day 2020
International Women's Day 2020Atlassian
 
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 2020Atlassian
 
Forge App Showcase
Forge App ShowcaseForge App Showcase
Forge App ShowcaseAtlassian
 
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 UIAtlassian
 
Meet the Forge Runtime
Meet the Forge RuntimeMeet the Forge Runtime
Meet the Forge RuntimeAtlassian
 
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 ExperienceAtlassian
 
Take Action with Forge Triggers
Take Action with Forge TriggersTake Action with Forge Triggers
Take Action with Forge TriggersAtlassian
 
Observability and Troubleshooting in Forge
Observability and Troubleshooting in ForgeObservability and Troubleshooting in Forge
Observability and Troubleshooting in ForgeAtlassian
 
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 ModelAtlassian
 
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 SystemAtlassian
 
Forge: Under the Hood
Forge: Under the HoodForge: Under the Hood
Forge: Under the HoodAtlassian
 
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 APIsAtlassian
 
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 PluginAtlassian
 
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 BuildingAtlassian
 
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 MatterAtlassian
 
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 MindAtlassian
 
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 TeamsAtlassian
 
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 TeamAtlassian
 
Building Apps With Enterprise in Mind
Building Apps With Enterprise in MindBuilding Apps With Enterprise in Mind
Building Apps With Enterprise in MindAtlassian
 

Mehr von 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
 

Kürzlich hochgeladen

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 

Kürzlich hochgeladen (20)

Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 

AtlasCamp 2015: Using add-ons to build add-ons

  • 1. Building add-ons using add-ons DANIEL WESTER • CO-FOUNDER • WITTIFIED • @DWESTER42A
  • 2. Building add-ons using add-ons DANIEL WESTER • CO-FOUNDER • WITTIFIED • @DWESTER42A
  • 4. 20%
  • 5.
  • 7.
  • 9.
  • 10.
  • 11.
  • 12. ACTIVE OBJECTS p2 addon ADDING A WEB ITEM WEB RESOURCES EVENTS GETTING STARTED
  • 13. ACTIVE OBJECTS GETTING STARTED p2 addon ADDING A WEB ITEM WEB RESOURCES EVENTS
  • 14. BASIC DESCRIPTOR <atlassian-plugin key="${project.groupId}.${project.artifactId}" name="${project.name}" plugins-version="2"> <plugin-info> <description>${project.description}</description> <version>${project.version}</version> <vendor name="${project.organization.name}" url="${project.organization.url}" /> <param name="plugin-icon">images/pluginIcon.png</param> <param name="plugin-logo">images/pluginLogo.png</param> </plugin-info> <component-import key="applicationProperties" interface="com.atlassian.sal.api.ApplicationProperties" /> <component-import key="eventPublisher" interface="com.atlassian.event.api.EventPublisher"/> <component-import key="ao" name="Active Objects service" interface="com.atlassian.activeobjects.external.ActiveObjects"> <description>Active Objects functionality from the plugin</description> </component-import> <ao key="ao-module"> <description>Active Objects entries</description> <entity>com.wittified.pres.DashView</entity> </ao> <component key="dash-tracker-service" class="com.wittified.pres.DashTrackerServiceImpl"> <interface>com.wittified.pres.DashTrackerService</interface> </component> <rest key="rest-end-points" path="/wittified/dashboards" version="1.0"> <description>REST interface to integrate with things</description> </rest> <resource type="i18n" name="i18n" location="dashboard-tracker"/> <web-resource key="atlascamp-dashboard-tracker-resources" name="atlascamp- dashboard-tracker Web Resources"> <dependency>com.atlassian.auiplugin:ajs</dependency> <dependency>com.atlassian.auiplugin:dialog2</dependency> <resource type="download" name="dashboard-tracker.css" location="/css/dashboard- tracker.css"/> <resource type="download" name="dashboard-tracker.js" location="/js/dashboard- tracker.js"/> <resource type="download" name="images/" location="/images"/> <transformation extension="soy"> <transformer key="soyTransformer"/> </transformation> <resource type="download" name="dashboard-counter.soy.js" location="/soy/ TabularData.soy"/> <context>atl.general</context> </web-resource> </atlassian-plugin>
  • 15. ACTIVE OBJECTS ENTITY package com.wittified.pres; import net.java.ao.Entity; import net.java.ao.schema.PrimaryKey; public interface DashView extends Entity { public Long getDashboard(); public void setDashboard(Long dashboard); public Long getViews(); public void setViews( Long count); }
  • 16. ACTIVE OBJECTS SERVICE @Override @Transactional public void trackThis(long dashboard) { DashView[] dashViews = this.activeObjects.find(DashView.class, Query.select().where(" DASHBOARDS = ? ", dashboard) ); DashView dashView = null; if(dashViews.length==0) { dashView = this.activeObjects.create( DashView.class); dashView.setDashboard( dashboard); dashView.setViews(0L); } else { dashView = dashViews[0]; } dashView.setViews(dashView.getViews() + 1); dashView.save(); }
  • 17. REST @GET @Produces({MediaType.APPLICATION_JSON}) @Path("/all") public Response getAll() { List<DashBoardEntity> dashBoardEntityList = new ArrayList<DashBoardEntity>(); for(DashView dashView: this.dashTrackerService.getAll()) { PortalPage page = this.portalPageManager.getPortalPageById( dashView.getDashboard()); DashBoardEntity dashBoardEntity = new DashBoardEntity(); dashBoardEntity.setName( page.getName()); dashBoardEntity.setCount( dashView.getViews()); dashBoardEntity.setId( dashView.getDashboard()); if(page.getOwner()==null) { dashBoardEntity.setOwner("None"); } else { dashBoardEntity.setOwner(page.getOwner().getDisplayName()); } dashBoardEntityList.add( dashBoardEntity); } return Response.ok( dashBoardEntityList).build();
  • 18. EVENT LISTENER public class DashBoardEventListener implements InitializingBean, DisposableBean { private final EventPublisher eventPublisher; private final DashTrackerService dashTrackerService; public DashBoardEventListener( final EventPublisher eventPublisher, final DashTrackerService dashTrackerService) { this.eventPublisher = eventPublisher; this.dashTrackerService = dashTrackerService; } @Override public void destroy() throws Exception { this.eventPublisher.unregister( this); } @Override public void afterPropertiesSet() throws Exception { this.eventPublisher.register( this); } }
  • 19. ACTIVE OBJECTS EVENTS p2 addon ADDING A WEB ITEM WEB RESOURCES GETTING STARTED
  • 20.
  • 21. EVENT LISTENER @EventListener public void onDashboardViewEvent( DashboardViewEvent dashboardViewEvent) { this.dashTrackerService.trackThis( dashboardViewEvent.getId() ); }
  • 22. EVENTS ACTIVE OBJECTS p2 addon ADDING A WEB ITEM WEB RESOURCES GETTING STARTED
  • 23.
  • 25.
  • 26.
  • 27. ACTIVE OBJECT SERVICE ERROR DashView[] dashViews = this.activeObjects.find(DashView.class, Query.select().where(" DASHBOARDS = ? ", dashboard) );
  • 28. ACTIVE OBJECT SERVICE FIXED DashView[] dashViews = this.activeObjects.find(DashView.class, Query.select().where(" DASHBOARD = ? ", dashboard) );
  • 29.
  • 30. ACTIVE OBJECTS ADDING A WEB ITEM p2 addon EVENTS WEB RESOURCES GETTING STARTED
  • 31.
  • 32. TEMPLATEIZED WEB-ITEM <web-item key="web-item-example" name="My Web Item" section="gadgets.dashboard.menu" weight=“200"> <description key="my-web-item-desc">General description</description> <label key="my-web-item-label" /> <link linkId=“my-web-item-link”>/my-web-item</link> </web-item>
  • 33. FLUSHED OUT WEB-ITEM <web-item key="web-item-dashboard-usage" name="DashBoard Usage" section="gadgets.dashboard.menu" weight="200"> <description key="my-web-item-desc">General description</ description> <label key="Dashboard usage" /> <link linkId=“dashboard-usagelink">/</link> </web-item>
  • 34. ACTIVE OBJECTS WEB RESOURCES p2 addon EVENTS ADDING A WEB ITEM GETTING STARTED
  • 35. WEB RESOURCE ENTY: GENERAL <web-resource key="atlascamp-dashboard-tracker-resources" name="atlascamp-dashboard-tracker Web Resources"> <dependency>com.atlassian.auiplugin:ajs</dependency> <dependency>com.atlassian.auiplugin:dialog2</dependency> <resource type="download" name="dashboard-tracker.css" location="/css/dashboard-tracker.css"/> <resource type="download" name="dashboard-tracker.js" location="/js/dashboard-tracker.js"/> <resource type="download" name="images/" location="/images"/> <transformation extension="soy"> <transformer key="soyTransformer"/> </transformation> <resource type="download" name="dashboard-counter.soy.js" location="/soy/TabularData.soy"/> <context>atl.general</context> </web-resource>
  • 36.
  • 37.
  • 38. WEB RESOURCE ENTY: SPECIFIC <web-resource key="atlascamp-dashboard-tracker-resources" name="atlascamp-dashboard-tracker Web Resources"> <dependency>com.atlassian.auiplugin:ajs</dependency> <dependency>com.atlassian.auiplugin:dialog2</dependency> <resource type="download" name="dashboard-tracker.css" location="/css/dashboard-tracker.css"/> <resource type="download" name="dashboard-tracker.js" location="/js/dashboard-tracker.js"/> <resource type="download" name="images/" location="/images"/> <transformation extension="soy"> <transformer key="soyTransformer"/> </transformation> <resource type="download" name="dashboard-counter.soy.js" location="/soy/TabularData.soy"/> <context>atl.dashboard</context> </web-resource>
  • 39. ACTIVE OBJECTS p2 addon EVENTS ADDING A WEB ITEM GETTING STARTED WEB RESOURCES
  • 40.
  • 41. Web Fragment Finder functionality • Identify Web Items/Panels/Sections/Resource locations • Click to copy xml • Active Objects Inspector • Event inspector
  • 42. But what about Atlassian Connect? SOMEBODY FROM ATLASSIAN ”“
  • 43. BASIC WEB ITEMS Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS HTTP ADDING WEB PANELS ISSUE PROPERTIES ADVANCED WEB ITEMS INSTALL ATLASSIAN CONNECT
  • 44. BASIC WEB ITEMS INSTALL ATLASSIAN CONNECT Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS HTTP ADDING WEB PANELS ISSUE PROPERTIES ADVANCED WEB ITEMS
  • 45. NORMAL STARTING OF AC ENABLED JIRA atlas-run-standalone --product jira --version 6.5-OD-03-002 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle: 1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:2.0.0,com.atlassian.jwt:jwt- plugin:1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19- D20150321T001323,com.atlassian.plugins:atlassian-connect-plugin:1.1.27 --jvmargs - Datlassian.upm.on.demand=true (as of May 5th 2015)
  • 46. STARTING OF AC ENABLED JIRA WITH WEBFRAGS atlas-run-standalone --product jira
  • 47.
  • 48.
  • 49.
  • 50. INSTALL ATLASSIAN CONNECT BASIC WEB ITEMS Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS HTTP ADDING WEB PANELS ISSUE PROPERTIES ADVANCED WEB ITEMS
  • 51.
  • 52. BASIC WEB-ITEM FRAGMENT { "url": "/my-web-item", "location": "system.top.navigation.bar", "context": "addon", "weight": 200, "target": { "type": "page" }, "styleClasses": [ "webitem", "system-present-webitem" ], "tooltip": { "value": "Example tooltip" }, "icon": { "width": 16, "height": 16, "url": "/maps/icon.png" }, "key": "web-item-example", "name": { "value": "My Web Item" } }
  • 53. BASIC WEB ITEMS WORKING WITH P2 ADD ONS Atlassian Connect MANAGING AC ADDONS HTTP ADDING WEB PANELS ISSUE PROPERTIES ADVANCED WEB ITEMS INSTALL ATLASSIAN CONNECT
  • 54.
  • 55.
  • 56. BASIC WEB ITEMS MANAGING AC ADDONS Atlassian Connect WORKING WITH P2 ADD ONS HTTP ADDING WEB PANELS ISSUE PROPERTIES ADVANCED WEB ITEMS INSTALL ATLASSIAN CONNECT
  • 57.
  • 58.
  • 59.
  • 60. BASIC WEB ITEMS HTTP Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS ADDING WEB PANELS ISSUE PROPERTIES ADVANCED WEB ITEMS INSTALL ATLASSIAN CONNECT
  • 61.
  • 62. BASIC WEB ITEMS ADDING WEB PANELS Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS HTTP ISSUE PROPERTIES ADVANCED WEB ITEMS INSTALL ATLASSIAN CONNECT
  • 63.
  • 64.
  • 65.
  • 66. BASIC WEB ITEMS ISSUE PROPERTIES Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS HTTP ADDING WEB PANELS ADVANCED WEB ITEMS INSTALL ATLASSIAN CONNECT
  • 67.
  • 68. BASIC WEB ITEMS ADVANCED WEB ITEMS Atlassian Connect WORKING WITH P2 ADD ONS MANAGING AC ADDONS HTTP ADDING WEB PANELS ISSUE PROPERTIES INSTALL ATLASSIAN CONNECT
  • 69.
  • 70.
  • 71.
  • 72. Web Fragment Finder functionality • Identify Web Items/Panels/Sections/Resource locations • Click to copy xml • Active Objects Inspector • Event inspector
  • 73. Web Fragment Finder functionality • Identify Web Items/Panels/ Sections/Resource locations • Click to copy xml • Active Objects Inspector • Event inspector • Identify Web Items/Panels/ Sections/Resource locations • Click to copy json • Manage Descriptors • Start node applications • HTTP traffic analyser • Inspect properties p2 AC
  • 74. FINDING THE LOCATIONS for (WebItemModuleDescriptor w : 
 this.pluginAccessor.getEnabledModuleDescriptorsByClass( WebItemModuleDescriptor.class)) { … } for (WebSectionModuleDescriptor w : this.pluginAccessor.getEnabledModuleDescriptorsByClass( WebSectionModuleDescriptor.class)) { … } for (WebPanelModuleDescriptor w : 
 this.pluginAccessor.getEnabledModuleDescriptorsByClass( WebPanelModuleDescriptor.class)) { … }
  • 75. GENERATING THE PLUGIN File file = File.createTempFile("plugin-generator",".jar"); FileOutputStream fos = new FileOutputStream(file); ZipOutputStream zipOut = new ZipOutputStream( fos ); Map<String, String> resourceJS = this.generateWebResources(); for (String item: resourceJS.keySet()) { zipOut.putNextEntry( new ZipEntry( String.format( "web-resources/%s.js", item)) ); zipOut.write( resourceJS.get( item).getBytes()); } zipOut.putNextEntry(new ZipEntry("atlassian-plugin.xml")); zipOut.write(this.generatePluginXml().getBytes()); zipOut.putNextEntry(new ZipEntry("com/wittified/fragfinder/conditions/WebItemCondition.class")); IOUtils.copy(this.getClass().getClassLoader().getResourceAsStream( "com/wittified/fragfinder/conditions/WebItemCondition.class"), zipOut); … PluginArtifact pluginArtifact = this.pluginArtifactFactory.create(file.toURI()); this.pluginController.installPlugins(pluginArtifact);
  • 76. FINDING EVENTS @EventListener public void onAllEvents( Object eventObject) { String className = eventObject.getClass().getName(); …. }
  • 77. PROXY SERVER BUILT IN public class PluginEnablingListener implements LifecycleAware, DisposableBean { public void onStart() { this.httpProxyService.start(); } public void destroy() { this.httpProxyService.stop(); } }
  • 78. ATLASSIAN CONNECT INSTALLATION {"validFrom":"2015-05-05T04:02:59.097Z","validTo":"OPEN","environment":{"dev": {"connectVersion":"1.1.29","jiraCommand":"atlas-run-standalone --product jira --version 6.5-OD-03-003 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle:1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin: 2.0.0,com.atlassian.jwt:jwt-plugin:1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19- D20150504T170409,com.atlassian.plugins:atlassian-connect-plugin:1.1.29 --jvmargs - Datlassian.upm.on.demand=true","confluenceCommand":"atlas-run-standalone --product confluence --version 5.8- OD-51-005 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle: 1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:1.0.6,com.atlassian.jwt:jwt-plugin: 1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19- D20150504T170409,com.atlassian.plugins:atlassian-connect-plugin:1.1.29 --jvmargs - Datlassian.upm.on.demand=true"},"prd":{"connectVersion":"1.1.27","jiraCommand":"atlas-run-standalone --product jira -- version 6.5-OD-03-002 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle: 1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:2.0.0,com.atlassian.jwt:jwt-plugin: 1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19- D20150321T001323,com.atlassian.plugins:atlassian-connect-plugin:1.1.27 --jvmargs - Datlassian.upm.on.demand=true","confluenceCommand":"atlas-run-standalone --product confluence --version 5.8- OD-50-011 --bundled-plugins com.atlassian.bundles:json-schema-validator-atlassian-bundle: 1.0.4,com.atlassian.webhooks:atlassian-webhooks-plugin:1.0.6,com.atlassian.jwt:jwt-plugin: 1.2.2,com.atlassian.upm:atlassian-universal-plugin-manager-plugin:2.19- D20150422T024538,com.atlassian.plugins:atlassian-connect-plugin:1.1.27 --jvmargs -Datlassian.upm.on.demand=true"}}} source: https://developer.atlassian.com/static/connect/commands/connect-versions.json
  • 79. * Sorry Crowd Available for almost all apps*
  • 80. Dig into the resources
  • 81.
  • 83. Thank you! DANIEL WESTER • CO-FOUNDER • WITTIFIED • @DWESTER42A