5. When to build on Confluence?
• When to choose Confluence • When to avoid Confluence
• Content based • Structured data storage needs
• Collaborative • Specific, unsupported technology
• Confluence already being used by requirements
target audience • Core product customisation is required
5
5
14. Easy Development
• Confluence Source Provided
• Huge Development Community
• Forums
• Online Documentation
• Public issue tracking
• Tons of examples
• 400+ existing plugins
14
14
15. Architecture
• Example Application Service UI
s jQuer
Vel
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
15
15
16. Architecture - Core
• Confluence Managers Service UI
• Labels s jQuer
Vel
• Bandana
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
16
16
17. Architecture - Core
• Dependency Injection – Spring Framework Service UI
s jQuer
Vel
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
17
17
18. Architecture - Core
• Dependency Injection – Spring Framework Service UI
public class ExampleProcessor { s jQuer
• public ExampleProcessor(PageManager pageManager) { Vel
• ...
} REST API XW
public void setSpaceManager(SpaceManager spaceManager){ API
Feeds
...
} Plugin Core
}
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
18
18
19. Architecture - Core
• Shared Components - OSGi Service UI
s jQuer
Vel
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
19
20. Architecture - Core
• Shared Components - OSGi Service UI
• Export s jQuer
Vel
<component key="exampleService" name="Example Service" class="com.atlassian.example.impl.DefaultAppService">
<interface>com.atlassian.example.AppService</interface>
</component>
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
20
21. Architecture - Core
• Shared Components - OSGi Service UI
• Export s jQuer
Vel
<component key="exampleService" name="Example Service" class="com.atlassian.example.impl.DefaultAppService">
<interface>com.atlassian.example.AppService</interface>
</component>
REST API XW
• Import
<component-import name="exampleService" key="exampleService"> API
Feeds
<interface>com.atlassian.example.AppService</interface>
</component-import> Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
21
22. Architecture - Core
• New Features Service UI
• Commentable objects s jQuer
• Spaced UserStatus Vel
• Custom Space Types
REST API XW
• Multi-label queries
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
22
22
23. Architecture - Core
• New Features Service UI
• Bandana 3.0 s jQuer
• Custom storage contexts Vel
• Enumeration of stored keys per context
• Custom serialisers REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
23
23
24. Architecture – Traditional UI
• XWork Actions Service UI
• Velocity s jQuer
Vel
• Web Resources
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
24
24
25. Architecture – Traditional UI
<xwork name="Example Actions" key="exampleactions">
<package name="example" extends="default" namespace="/example">Service UI
<default-interceptor-ref name="defaultStack"/>
<action name="doStuff" class="bean:stuffAction"> s jQuer
Vel
<result name="input" type="velocity">/example/templates/action/dostuff.vm</result>
</action>
</package>
</xwork>
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
25
25
26. Architecture – Traditional UI
<xwork name="Example Actions" key="exampleactions">
<package name="example" extends="default" namespace="/example">Service UI
<default-interceptor-ref name="defaultStack"/>
<action name="doStuff" class="bean:stuffAction"> s jQuer
Vel
<result name="input" type="velocity">/example/templates/action/dostuff.vm</result>
</action>
</package>
</xwork>
REST API XW
API
Feeds
<web-resource key=“exampleResource">
<transformation extension="txt">
<transformer key=“example" /> Plugin Core
</transformation>
Blogs
Label
Page
Band
Attac
Com
User
<resource type="download" name="testTemplate.txt" />
</web-resource>
<web-resource-transformer key="example" class="bean:exampleTransformer" />
Search & Persistence
26
26
27. Architecture – REST UI
• Client Service UI
• JQuery s jQuer
• Atlassian User Interface Vel
• Server REST API XW
• Macros API
Feeds
• REST Framework 2.0
• Jersey Plugin Core
• Interceptors
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
27
27
28. Architecture – REST UI
<rest name="Example Rest Service" key="rest-service-example" path="/exampleService" version="1.0“/>
Service UI
s jQuer
Vel
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
28
28
29. Architecture – REST UI
<rest name="Example Rest Service" key="rest-service-example" path="/exampleService" version="1.0“/>
Service UI
@XmlRootElement(name = “example")
public class ExampleEntity { {
s jQuer
• @XmlElement public String name; name: name,
id: id
Vel
• @XmlAttribute public long id; }
}
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
29
29
30. Architecture – REST UI
<rest name="Example Rest Service" key="rest-service-example" path="/exampleService" version="1.0"/>
Service UI
@XmlRootElement(name = “example")
public class ExampleEntity { {
s jQuer
• @XmlElement public String name; name: name,
id: id
Vel
• @XmlAttribute public long id; }
}
REST API XW
@Path("/example")
API
Feeds
public class ExampleResource {
@GET
• public Response get() { Plugin Core
• ExampleEntity exampleEntity = …
Blogs
Label
Page
Band
Attac
Com
User
• return Response.ok(exampleEntity).build();
}
}
Search & Persistence
30
30
31. Architecture – REST UI
• <div id="exampleArea"/>
Service UI
s jQuer
Vel
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
31
31
32. Architecture – REST UI
• <div id="exampleArea"/>
Service UI
•
•
<div>
<span>{id}</span><input value="{name}"/> s jQuer
• </div> Vel
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
32
32
33. Architecture – REST UI
• <div id="exampleArea"/>
• <script type="text/x-template" title="entity-template"> Service UI
•
•
<div>
<span>{id}</span><input value="{name}"/> s jQuer
• </div> Vel
• </script>
REST API XW
API
Feeds
Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
33
33
34. Architecture – REST UI
• <div id="exampleArea"/>
• <script type="text/x-template" title="entity-template"> Service UI
•
•
<div>
<span>{id}</span><input value="{name}"/> s jQuer
• </div> Vel
• </script>
• jQuery.ajax({
REST API XW
• url: contextPath + '/rest/exampleService/1.0/example',
API
Feeds
• type: 'GET',
• dataType: 'json',
• contentType: 'application/json; charset=utf-8', Plugin Core
• success: function(entity) {
Blogs
Label
Page
Band
Attac
Com
User
•
• }
• });
Search & Persistence
34
34
35. Architecture – REST UI
• <div id="exampleArea"/>
• <script type="text/x-template" title="entity-template"> Service UI
•
•
<div>
<span>{id}</span><input value="{name}"/> s jQuer
• </div> Vel
• </script>
• jQuery.ajax({
REST API XW
• url: contextPath + '/rest/exampleService/1.0/example',
API
Feeds
• type: 'GET',
• dataType: 'json',
• contentType: 'application/json; charset=utf-8', Plugin Core
• success: function(entity) {
Blogs
Label
Page
Band
Attac
Com
User
• AJS.$('#exampleArea').append(AJS.template.load('entity-template').fill(entity).toString());
• }
• });
Search & Persistence
35
35
36. Architecture - Federation
• REST Service UI
• XML s jQuer
• JSON Vel
• Feeds REST API XW
• Gadgets API
Feeds
• Page Gadget Plugin Core
Blogs
Label
Page
Band
Attac
Com
User
Search & Persistence
36
36
38. Organisation Specific
• Confluence is already deployed
• No Resource Requirements
• Infrastructure Support
• Political Support
38
38
39. Commercial & Open Source
• Confluence has a huge customer base (22,000)
• Hosting on plugins.atlassian.com
• Open or closed source
• Free or commercial
• Confluence Blog
• Codegeist
• AtlasCamp
39
39
40. The Road Ahead
• Full REST APIs
• AppLinks
• Unified Plugin Manager
• Structured Data Storage
40
41. Summary
• Content based & Collaborative Applications will benefit
• Confers number of benefits
• Development is easy
• REST Application Architecture
• Audience
• Confluence Rocks for Small, Content-Driven Applications!
41
41
42. Where next?
• Sign up to the forums
• http://forums.atlassian.com/
• Download the plugin SDK
• Check out the Atlassian Developer Blog
• http://blogs.atlassian.com/developer/
• Check out the Confluence docs
• http://confluence.atlassian.com/
42
42