Plugin Framework

ulotrichousblueberryΛογισμικό & κατασκευή λογ/κού

3 Νοε 2013 (πριν από 4 χρόνια και 9 μέρες)

202 εμφανίσεις

1
.

Plugin Framework
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1
.
1


Writing Atlassian Plugins
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1
.
1
.
1


Creating your Plugin Descriptor
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1
.
1
.
2


Plugin Module Types
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1
.
1
.
2
.
1


Component Import Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1
.
1
.
2
.
2


Component Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
1
.
1
.
2
.
3


Module Type Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1
.
1
.
2
.
4


Servlet Context Listener Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1
.
1
.
2
.
5


Servlet Context Parameter Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
1
.
1
.
2
.
6


Servlet Filter Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1
.
1
.
2
.
7


Servlet Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
1
.
1
.
2
.
8


Template Context Item Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
1
.
1
.
2
.
9


Web Item Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
1
.
1
.
2
.
10


Web Panel Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
1
.
1
.
2
.
11


Web Panel Renderer Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
1
.
1
.
2
.
12


Web Resource Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
1
.
1
.
2
.
13


Web Resource Transformer Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
1
.
1
.
2
.
14


Web Section Plugin Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
1
.
1
.
3


Adding Plugin and Module Resources
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
1
.
1
.
4


Supporting Minification of JavaScript and CSS Resources
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
1
.
1
.
5


Adding a Configuration UI for your Plugin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
1
.
1
.
6


Ensuring Standard Page Decoration in your Plugin UI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
1
.
1
.
7


Using Packages and Components Exposed by an Application
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
1
.
1
.
8


Creating Plugin Module Instances
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
1
.
1
.
9


Plugin Developer's Cookbook
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
1
.
1
.
9
.
1


Consuming a Service in my Plugin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
1
.
1
.
9
.
2


Declaring a Dependency on Another Plugin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
1
.
1
.
9
.
3


Declaring a Dependency on a Third-Party Package
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
1
.
1
.
9
.
4


Defining an Extension Point in my Plugin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
1
.
1
.
9
.
5


Exposing a Service in my Plugin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
1
.
1
.
10


OSGi, Spring and the Plugin Framework
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
1
.
1
.
10
.
1


Behind the Scenes in the Plugin Framework
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
1
.
1
.
10
.
1
.
1


Going from Plugin to OSGi Bundle
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
1
.
1
.
10
.
1
.
2


Lifecycle of a Bundle
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
1
.
1
.
10
.
1
.
3


Dynamic Module Types
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
1
.
1
.
10
.
1
.
4


Automatic Generation of Spring Configuration
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
1
.
1
.
10
.
2


Converting a Plugin to Plugin Framework 2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
1
.
1
.
10
.
3


OSGi and Spring Reference Documents
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
1
.
2


Plugin Dev Platform Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
1
.
2
.
1


Plugin Framework 2.0.3 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
1
.
2
.
2


Plugin Framework 2.0.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
1
.
2
.
3


Plugin Framework 2.0.5 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
1
.
2
.
4


Plugin Framework 2.1.1 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
1
.
2
.
5


Plugin Framework 2.1.2 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
1
.
2
.
6


Plugin Framework 2.1.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
1
.
2
.
7


Plugin Framework 2.1 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
1
.
2
.
8


Plugin Framework 2.2.1 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
1
.
2
.
9


Plugin Framework 2.2.2 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
1
.
2
.
10


Plugin Framework 2.2.3 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
1
.
2
.
11


Plugin Framework 2.2.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
1
.
2
.
12


Plugin Framework 2.2 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
1
.
2
.
13


Plugin Framework 2.3.1 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
1
.
2
.
14


Plugin Framework 2.3.2 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
1
.
2
.
15


Plugin Framework 2.3.3 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
1
.
2
.
16


Plugin Framework 2.3.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
1
.
2
.
17


Plugin Framework 2.3.5 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
1
.
2
.
18


Plugin Framework 2.3.6 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
1
.
2
.
19


Plugin Framework 2.3.7 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
1
.
2
.
20


Plugin Framework 2.3.8 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
1
.
2
.
21


Plugin Framework 2.3.9 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
1
.
2
.
22


Plugin Framework 2.3.10 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
1
.
2
.
23


Plugin Framework 2.3 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
1
.
2
.
24


Plugin Framework 2.4.1 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
1
.
2
.
25


Plugin Framework 2.4.2 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
1
.
2
.
26


Plugin Framework 2.4.3 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
1
.
2
.
27


Plugin Framework 2.4.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
1
.
2
.
28


Plugin Framework 2.4.5 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
1
.
2
.
29


Plugin Framework 2.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
1
.
2
.
30


Plugin Framework 2.5.1 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
1
.
2
.
31


Plugin Framework 2.5.2 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
1
.
2
.
32


Plugin Framework 2.5.3 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
1
.
2
.
33


Plugin Framework 2.5.4 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
1
.
2
.
34


Plugin Framework 2.5 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
1
.
2
.
34
.
1


Plugin Framework 2.5 Migration Guide
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
1
.
2
.
35


Plugin Framework 2.6 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
1
.
2
.
35
.
1


Plugin Framework 2.6 Migration Guide
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
1
.
2
.
36


Plugin Framework 2.7 Release Notes (Draft)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
1
.
2
.
37


Plugin Development Platform 2.8 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
101
1
.
2
.
37
.
1


Plugin Development Platform 2.8 Upgrade Guide
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
102
1
.
2
.
38


Plugin Development Platform 2.9 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
102
1
.
2
.
39


Plugin Development Platform 2.10 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
104
1
.
2
.
40


Plugin Development Platform 2.11 Release Notes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
106
1
.
3


Plugin Framework Version Matrix
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
107
1
.
4


Plugin Framework FAQ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
109
1
.
4
.
1


Development FAQ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
109
1
.
4
.
1
.
1


About the RefApp
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
110
1
.
4
.
1
.
2


Access components statically
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
110
1
.
4
.
1
.
3


Accessing Classes from Another Plugin
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
110
1
.
4
.
1
.
4


Differences between Spring and Pico
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
111
1
.
4
.
1
.
5


Differences between Version 1 Plugins and Version 2 Plugins
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
111
1
.
4
.
1
.
6


Instant Loading of Plugin Resources
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
112
1
.
4
.
1
.
7


Marking Packages as Optional Imports
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
112
1
.
4
.
1
.
8


My public component just disappeared!
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
112
1
.
4
.
1
.
9


Plugin Modules that Cannot be Disabled
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
112
1
.
4
.
1
.
10


Plugin Modules that Require a Restart
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
113
1
.
4
.
1
.
11


Using JDOM in OSGi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
113
1
.
4
.
2


Platform FAQ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
115
1
.
4
.
2
.
1


Running on WebSphere 6.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
115
1
.
4
.
3


Troubleshooting FAQ
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
115
1
.
4
.
3
.
1


Troubleshooting a BundleException
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
115
1
.
4
.
3
.
2


Troubleshooting a BundleException with no bundle constraint specified
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
116
1
.
4
.
3
.
3


Troubleshooting a ClassNotFoundException
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
117
1
.
4
.
3
.
4


Troubleshooting a LinkageError
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
118
1
.
4
.
3
.
5


Troubleshooting Dependency Issues during Plugin Initialisation
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
119
1
.
4
.
3
.
6


Troubleshooting Velocity in OSGi
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
120
1
.
5


Plugin Framework Glossary
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
1
.
5
.
1


Bundle (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
1
.
5
.
2


Complex Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
1
.
5
.
3


Cross-Product Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
1
.
5
.
4


Dynamic Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
1
.
5
.
5


Lifecycle (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
122
1
.
5
.
6


Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
122
1
.
5
.
7


Service (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
122
1
.
5
.
8


Service Registry (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
122
1
.
5
.
9


Simple Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
122
1
.
5
.
10


Static Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
123
1
.
5
.
11


Version 1 or Version 2 Plugin (Glossary Entry)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
123
1
.
6


Additional Frameworks
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
123
1
.
6
.
1


Activity Streams
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
123
1
.
6
.
1
.
1


Activity Streams Version Matrix
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
123
1
.
6
.
1
.
2


Consuming an Activity Streams Feed
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
124
1
.
6
.
1
.
3


Making Pluggable Actions for Activity Streams
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
129
1
.
6
.
1
.
4


Making your own Activity Streams Provider
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
139
1
.
6
.
2


Application Links
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
144
1
.
6
.
3


Atlassian Template Renderer
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
144
1
.
6
.
4


Universal Plugin Manager
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
145
1
.
6
.
4
.
1


Configuring Plugins to Work with the Universal Plugin Manager
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
145
1
.
7


Embedding the Plugin Framework
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
145
1
.
7
.
1


Quick Start Guide to Embedding
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
146
1
.
7
.
2


Exposing Host Components via Spring
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
148
1
.
7
.
3


Using the Built-In Plugin Modules
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
149
1
.
7
.
3
.
1


Servlet Modules
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
149
1
.
7
.
3
.
2


Web Fragment Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
151
1
.
7
.
3
.
3


Web Resources Module
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
151
1
.
7
.
4


Writing a Plugin Module Descriptor
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
151
1
.
7
.
5


License and Copyright for the Atlassian Plugin Framework
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
151
Plugin Framework
Getting Started
With Atlassian's plugin development platform, you can create plugins that extend the functionality of Atlassian applications such as
,
JIRA
and
.
Confluence
others
The platform consists of a plugin framework and set of components that provide useful tools to plugin developers. To see how the pieces fit
together, take a look at the
. To get started writing plugins, download and set up the
. Then
overview of the platform
Atlassian Plugin SDK
follow the plugin development guidelines for your specific application, as listed
.
below
If you need detailed information about the plugin framework itself, read the details
.
below
Plugin Framework in Detail
Atlassian Plugin SDK
Get started by setting up your Atlassian plugin development environment.
Plugin Descriptor
See how to define your plugin via an XML file, the 'plugin descriptor'.
OSGi, Spring and the Plugin Framework
Read the in-depth information about how we use OSGi in the Atlassian Plugin Framework.
Embedding the Plugin Framework
Find out how to transform your web application into a platform that can be extended at runtime via plugins.
Atlassian Development Hubs
Developer Network
Plugin Framework
Gadgets
REST APIs
Confluence
JIRA
GreenHopper
Bamboo
Crowd
FishEye/Crucible
JIRA Mobile Connect
Resources
Atlassian Plugin Development Platform
Application Version Matrix
Javadoc
Plugin Exchange
Source code
Binaries
Help
Plugin Framework FAQ
Answers from the community
Feature requests and bug reports
Mailing lists at my.atlassian.com
Atlassian Developer Blog
Plugin Driven Development- Developing JIRA's new Project Configuration pages
The road to HAMS 3.0 - Transaction boundaries
Make your plugin sizzle with new Plugin Exchange enhancements
Testing's In Session
AtlasCamp 2011
Plugin Modules
Component Import Plugin Module
Component Plugin Module
Module Type Plugin Module
Servlet Context Listener Plugin Module
Servlet Context Parameter Plugin Module
Servlet Filter Plugin Module
Servlet Plugin Module
Template Context Item Plugin Module
Web Item Plugin Module
Web Panel Plugin Module
Web Panel Renderer Plugin Module
Web Resource Plugin Module
Web Resource Transformer Plugin Module
Web Section Plugin Module
Writing Atlassian Plugins
The Atlassian Plugin Framework is a library for developers wanting to extend the functionality of Atlassian applications such as
,
JIRA
and
. The plugin framework is part of the
.
Confluence
others
Atlassian Plugin Development Platform
Getting Started
To get started writing plugins, download and set up the
.
Atlassian Plugin SDK
Plugin Development Platform
These are the major components in the Atlassian Plugin Development Platform:
Plugin Framework
 The framework that executes the plugins and manages the available plugin modules.
Shared Access Layer (SAL)
 The API for accessing common services, regardless of the underlying Atlassian application
interfaces.
Atlassian User Interface (AUI)
 A set of reusable, cross-browser tested JavaScript and CSS UI components.
Atlassian REST Plugin Module
 An Atlassian plugin module that you can use to create plugin points easily in Atlassian
applications, by exposing services and data entities as REST APIs.
Atlassian Template Renderer
 A library that provides an abstraction on top of various templating libraries, making it easier to use
the templating libraries. For example, instead of your having to create a VelocityEngine object and configure it, we provide a factory
to do that for you. See the
and the
.
Javadoc
wiki documentation
Universal Plugin Manager (UPM)
 The UI for installing, managing, upgrading, and sharing Atlassian plugins.
Application Links (AppLinks)
 An Atlassian plugin module that allows you to link your
,
,
,
and
JIRA
Confluence
FishEye
Crucible
applications.
Bamboo
(See the full guide to the
.)
Atlassian Plugin Development Platform
Plugin Framework
The plugin framework is based on
using an embedded
container. See
Spring Dynamic Modules
OSGi
OSGi, Spring and the Plugin
. Plugin modules are implemented as new bundles with their own Spring namespace.
Framework
The Atlassian Plugin Framework 2 replaces the original Atlassian Plugins framework, described in the
. The new
Developer Network
framework is based on
, a dynamic module system for Java.
OSGi
Main advantage:
The new framework supports cross-product plugin development and consistent plugin behaviour in all products.
Features of the Atlassian Plugin Framework 2:
Ensures backwards compatibility with existing plugins.
Ensures minimal migration effort for developers upgrading existing plugins.
Supports first-class plugin dependency management.
Supports version-controlled sharing of classes and libraries between plugins, via the internal module system.
Provides a predictable plugin load order.
Provides consistent plugin behaviour across products.
Allows developers to create cross-product plugins.
Allows plugins to provide their own pluggable extension points and expose their services for use by other plugins.
Supports plugins of all levels of complexity.
Insulates plugins against product upgrades.
Allows in-container testing for faster plugin development.
Table of Contents
Creating your Plugin Descriptor
Plugin Module Types
Component Import Plugin Module
Component Plugin Module
Module Type Plugin Module
Servlet Context Listener Plugin Module
Servlet Context Parameter Plugin Module
Servlet Filter Plugin Module
Servlet Plugin Module
Template Context Item Plugin Module
Web Item Plugin Module
Web Panel Plugin Module
Web Panel Renderer Plugin Module
Web Resource Plugin Module
Web Resource Transformer Plugin Module
Web Section Plugin Module
Adding Plugin and Module Resources
Supporting Minification of JavaScript and CSS Resources
Adding a Configuration UI for your Plugin
Ensuring Standard Page Decoration in your Plugin UI
Using Packages and Components Exposed by an Application
Creating Plugin Module Instances
Plugin Developer's Cookbook
Consuming a Service in my Plugin
Declaring a Dependency on Another Plugin
Declaring a Dependency on a Third-Party Package
Defining an Extension Point in my Plugin
Exposing a Service in my Plugin
OSGi, Spring and the Plugin Framework
Behind the Scenes in the Plugin Framework
Going from Plugin to OSGi Bundle
Lifecycle of a Bundle
Dynamic Module Types
Automatic Generation of Spring Configuration
Converting a Plugin to Plugin Framework 2
OSGi and Spring Reference Documents
Creating your Plugin Descriptor
On this page:
Purpose of a Plugin Descriptor
Example of a Plugin Descriptor
Contents of the Plugin Descriptor
element
atlassian-plugin
element
plugin-info
element
description
element
version
element
application-version
element
vendor
element
param
element
bundle-instructions
Elements Describing Plugin Modules
Purpose of a Plugin Descriptor
When developing a plugin for an Atlassian application such as Confluence or JIRA, you need to create a 'plugin descriptor' for your plugin.
The plugin descriptor is an XML file that tells the application all about the plugin and the modules contained within it. The descriptor must be
a single file named
and must be located at the root of the plugin's jar file.
atlassian-plugin.xml
Example of a Plugin Descriptor
Here is a sample plugin descriptor:
Contents of the Plugin Descriptor
Below is a description of the plugin information provided in the descriptor XML file.
atlassian-plugin
element
This is the root element for your plugin descriptor. For example, the plugin descriptor file should have this structure:
Attribute
Description
key
Each plugin has a plugin key which must be unique to the plugin. We suggest using the Java convention of reversing
your domain name in order to ensure your key is unique.
The plugin key must be defined in
in the plugin descriptor. When you call the plugin via a macro in Wiki
lower case
Markup, you can use any capitalisation, e.g. {module1} or {Module1}.
Within the plugin, each module has a module key. Refer to the information on module types for information about the
module key.
name
This is a human-readable name, used for display in menus within the application.
state
To disable the entire plugin by default, specify
.
<atlassian-plugin state="disabled"/>
plugins-version
To create an OSGi plugin, use
.
plugins-version="2"
The attribute
is still supported but has been
since version 2.1 of the plugin
pluginsVersion
deprecated
framework.
plugin-info
element
This element contains plugin information displayed by the application for administrators, plugin parameters and OSGi bundle instructions. Its
parent element is
, and it supports several nested elements.
<atlassian-plugin>
Nested element
Description
<description>
A human-readable description of your plugin.
<version>
The version of your plugin. This number is displayed in the application's plugin manager.
<application-version>
Supply the versions of the application that will support your plugin.
<vendor>
Supply information about the developer of the plugin.
<param>
Supply parameter values if required by your plugin.
<bundle-instructions>
Declare plugin dependencies and shorten your export package lists by specifying OSGi bundle instructions directly
in the plugin XML (OSGi plugins only).
These nested elements are described in more detail below.
description
element
The body of this element is a description of your plugin. Its parent element is
.
<plugin-info>
version
element
The body of this element is the current version of your plugin. Its parent element is
.
<plugin-info>
Plugin versions are sometimes compared within an application to determine the newer version, particularly when performing automated
upgrades. Versions are compared by splitting the version number into components and comparing them numerically first and alphabetically
second.
Following are some sample version numbers in ascending order: 0.99, 1.0, 1.0.1-alpha, 1.0.1-beta, 1.0.1-beta2, 1.0.1, 1.0.1.0, 1.1, 1.2, 1.10,
2.0.
application-version
element
Deprecated since Atlassian Plugin Framework 2.2
Describe which versions of the host application are compatible with this plugin. Enforcement of this property varies between applications:
some applications strictly enforce compatibility, while others ignore the value.
Its parent element is
.
<plugin-info>
Attribute name
Description
min
This is the lowest version of the application which your plugin is compatible with.
max
This is the highest version of the application which your plugin is compatible with.
vendor
element
The vendor of the plugin. Provides a link in the plugin administration screens.
Its parent element is
.
<plugin-info>
Attribute name
Description
name
Supply your name or the name of the company you work for.
url
Supply a web site address.
param
element
Arbitrary parameters for a plugin. These can be nested in many other elements. Attribute 'name' gives the name of the parameter. The body
of the element is its value.
Attribute
Description
name
The name of the parameter.
(body)
The value of the parameter.
One commonly used parameter is the URL for your plugin's configuration screen. Its parent element is
. Below is an
<plugin-info>
example.
bundle-instructions
element
This element allows you to declare plugin dependencies and shorten your export package lists by specifying OSGi bundle instructions
directly in the plugin XML. The element's parent element is
.
<plugin-info>
As seen in the above example, the
element allows child elements, including:
bundle-instructions
<Export-Package>
<Import-Package>
The Atlassian Plugin Framework uses the
tool to generate OSGi bundles. This tool is available as the
.
bnd
Bundle Plugin for Maven
For details of the bnd directives, please refer to the
.
bnd documentation
Elements Describing Plugin Modules
In the rest of the descriptor XML file, you will define any modules that make up your plugin. Please refer to the list of module types for more
information.
RELATED TOPICS
Marking Packages as Optional Imports
Creating your Plugin Descriptor
Plugin Module Types
Component Import Plugin Module
Component Plugin Module
Module Type Plugin Module
Servlet Context Listener Plugin Module
Servlet Context Parameter Plugin Module
Servlet Filter Plugin Module
Servlet Plugin Module
Template Context Item Plugin Module
Web Item Plugin Module
Web Panel Plugin Module
Web Panel Renderer Plugin Module
Web Resource Plugin Module
Web Resource Transformer Plugin Module
Web Section Plugin Module
Adding Plugin and Module Resources
Supporting Minification of JavaScript and CSS Resources
Adding a Configuration UI for your Plugin
Ensuring Standard Page Decoration in your Plugin UI
Using Packages and Components Exposed by an Application
Creating Plugin Module Instances
Plugin Developer's Cookbook
Consuming a Service in my Plugin
Declaring a Dependency on Another Plugin
Declaring a Dependency on a Third-Party Package
Defining an Extension Point in my Plugin
Exposing a Service in my Plugin
OSGi, Spring and the Plugin Framework
Behind the Scenes in the Plugin Framework
Going from Plugin to OSGi Bundle
Lifecycle of a Bundle
Dynamic Module Types
Automatic Generation of Spring Configuration
Converting a Plugin to Plugin Framework 2
OSGi and Spring Reference Documents
Plugin Module Types
An Atlassian plugin can specify one or more plugin modules to affect the underlying Atlassian application. You will define your plugin
modules in your plugin descriptor. There is a general overview of the plugin descriptor in
. Below is detailed
Creating your Plugin Descriptor
information of each plugin module type.
Plugin Module Types in the Atlassian Platform
Plugin module types, as defined in this guide, are generally available in all Atlassian applications. But in some cases, an application may
exclude support for a specific module type  the plugin module descriptor is not loaded into the application and the module type is therefore
not available. Please refer to the application's plugin guide for more information about which module types are supported.
Component Import Plugin Module
Component Plugin Module
Module Type Plugin Module
Servlet Context Listener Plugin Module
Servlet Context Parameter Plugin Module
Servlet Filter Plugin Module
Servlet Plugin Module
Template Context Item Plugin Module
Web Item Plugin Module
Web Panel Plugin Module
Web Panel Renderer Plugin Module
Web Resource Plugin Module
Web Resource Transformer Plugin Module
Web Section Plugin Module
REST plugin module type
Gadget plugin module type
Product-specific plugin modules
 Product-specific plugin types are not documented here as they are usually unique to an
Atlassian application. See the application's developer documentation for more information.
Component Import Plugin Module
Available:
Atlassian Plugin Framework 2.0 and later.
: The Component Import plugin module described below is available only for OSGi-based plugins using
Note
version 2 of the Atlassian Plugin Framework.
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Notes
Purpose of this Module Type
Component Import plugin modules allow you to access Java components shared by other plugins, even if the component is upgraded at
runtime.
Configuration
The root element for the Component Import plugin module is
. It allows the following attributes and child elements for
component-import
configuration:
Attributes
Name
Required
Description
Default
interface
The Java interface of the component to import. This attribute is only required if the
elements
interface
are not used.
N/A
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
complete
. A module with key
in a plugin with key
will have a complete
module key
fred
com.example.modules
key of
. I.e. The identifier of the component to import.
com.example.modules:fred
N/A
filter
 
The LDAP filter to use to match public components (OSGi services). Note: The format of the filter must be
a valid LDAP filter. (Plugin Framework 2.3 and later.)
 
Elements
Name
Required
Description
Default
interface
The Java interface under which the component to retrieve is registered. This element can appear zero or
more times, but is required if the
attribute is not used.
interface
N/A
Example
Here is an example
file containing a single component import:
atlassian-plugin.xml
It consumes a component made available via a different plugin:
Here is an example of matching via an LDAP filter. Since a component import is really just matching an OSGi service, you can optionally
specify an LDAP filter to match the specific service. Here is an example that matches a dictionary service that provides a
attribute
language
that equals
:
English
Notes
Some information to be aware of when developing or configuring a Component Import plugin module:
Component imports, at installation time, are used to generate the
Spring Framework
atlassian-plugins-spring.xml
configuration file, transforming Component Import plugin modules into OSGi service references using Spring Dynamic Modules.
The imported component will have its bean name set to the component import key, which may be important if using 'by name'
dependency injection.
If you wish to have more control over how imported services are discovered and made available to your plugin, you can create your
own Spring configuration file containing Spring Dynamic Modules elements, stored in
in your plugin jar. This is
META-INF/spring
recommended if you are needing to import multiple services that implement an interface, for example.
You can use component imports to customise the bean name of host components, particularly useful if you plan to use 'by name'
dependency injection.
RELATED TOPICS
Plugin Module Types
Component Plugin Module
Available:
Atlassian Plugin Framework 2.0 and later.
: The Component plugin module described below is available only for OSGi-based plugins using version 2
Note
of the Plugin Framework.
In version 1 plugins, this plugin module will differ significantly from the information on this page. In version 1
dynamic plugins or those deployed in
, this plugin module will be interpreted differently based on
WEB-INF/lib
the application to which the plugin is deployed because it installs the component in the application's object
container. For example, JIRA uses Pico and Confluence uses Spring. So the object's lifecycle and dependency
injection process will vary.
For version 2 plugins, as described below, the internal Spring framework is used regardless of the host
application. Creation, dependency injection and sharing between plugins are consistent.
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Notes
Purpose of this Module Type
Component plugin modules enable you to share Java components between other modules in your plugin and optionally with other plugins in
the application.
Configuration
The root element for the Component plugin module is
. It allows the following attributes and child elements for configuration:
component
Attributes
Name
Required
Description
Default
alias
 
The alias to use for the component when registering it in the internal bean factory.
The
plugin
key
class
 
The class which implements this plugin module. The class you need to provide depends on the
module type. For example, Confluence theme, layout and colour-scheme modules can use classes
already provided in Confluence. So you can write a theme-plugin without any Java code. But for
macro and listener modules you need to write your own implementing class and include it in your
plugin. See the plugin framework guide to
. The Java class of the
creating plugin module instances
component. This does not need to extend or implement any class or interface.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
. A module with key
in a plugin with key
will
complete module key
fred
com.example.modules
have a complete key of
. I.e. the identifier of the component.
com.example.modules:fred
N/A
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
name
 
The human-readable name of the plugin module. I.e. the human-readable name of the component.
The
plugin
key.
public
 
Indicates whether this component should be made available to other plugins via the
Component
or not.
Import Plugin Module
false
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not (value='false').
Only available for non-OSGi plugins.
false
Elements
Name
Required
Description
Default
interface
 
The Java interface under which this component should be registered. This element can appear
zero or more times.
N/A
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a
localisation key for the value instead of text in the element body.
 
service-properties
 
Map of simple properties to associate with a public component (Plugin Framework 2.3 and
later). Child elements are named
and have
and
attributes.
entry
key
value
 
Example
Here is an example
file containing a single public component:
atlassian-plugin.xml
Here is an example public component with several service properties:
Notes
Some information to be aware of when developing or configuring a Component plugin module:
Components, at installation time, are used to generate the
Spring Framework configuration
atlassian-plugins-spring.xml
file, transforming Component plugin modules into Spring bean definitions. The generated file is stored in a temporary plugin jar and
installed into the framework. The plugin author should very rarely need to override this file.
The injection model for components first looks at the constructor with the largest number of arguments and tries to call it, looking up
parameters by type in the plugin's bean factory. If only a no-arg constructor is found, it is called then Spring tries to autowire the
bean by looking at the types used by setter methods. If you wish to have more control over how your components are created and
configured, you can create your own Spring configuration file, stored in
in your plugin jar.
META-INF/spring
If the
attribute is set to 'true', the component will be turned into an OSGi service under the covers, using Spring Dynamic
public
Modules to manage its lifecycle.
This module type in non-OSGi (version 1) plugins supported the StateAware interface in some products to allow a component to
react to when it is enabled or disabled. To achieve the same effect, you can use the two Spring lifecycle interfaces:
InitializingBean
and
. The init() and destroy() methods on these interfaces will be called when the module is enabled or disabled,
DisposableBean
exactly like StateAware. Making this change to a component in an existing plugin will be backwards compatible in all but JIRA. That
is, a component module in a legacy plugin which implements InitializingBean will have its init() method called when it is enabled,
exactly the same as such a component in an OSGi plugin.
Components for non-OSGi (version 1) plugins behave very differently to components for OSGi plugins. For version 1 plugins,
components are loaded into the application's object container, be it PicoContainer for JIRA or Spring for all other products that
support components. For OSGi plugins, components are turned into beans for the Spring bean factory for that specific plugin. This
provides more separation for plugins, but means you cannot do things like override JIRA components in OSGi plugins, as you can
for static plugins.
RELATED TOPICS
Plugin Module Types
Module Type Plugin Module
Available:
and later.
Atlassian Plugin Framework 2.1
: The Module Type plugin module described below is available only for OSGi-based plugins using version
Note
2.1 or later of the Plugin Framework.
Changed:
In
and later, the preferred constructor for AbstractModuleDescriptor takes a
Atlassian Plugin Framework 2.5
ModuleFactory parameter.
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Notes
Purpose of this Module Type
Module Type plugin modules allow you to dynamically add new plugin module types to the plugin framework, generally building on other
plugin modules. For example, a plugin developer could create a
plugin module that is used to feed a dictionary service used
<dictionary>
by still other plugins.
Configuration
The root element for the Module Type plugin module is
. It allows the following attributes and child elements for configuration:
module-type
Attributes
Name
Required
Description
Default
class
 
The ModuleDescriptor class to instantiate when a new plugin module of this type is found. See the
plugin framework guide to
.
creating plugin module instances
 
disabled
 
Indicate whether the plugin module should be disabled by default (value='true') or enabled by
default (value='false').
false
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
. A module with key
in a plugin with key
will
complete module key
fred
com.example.modules
have a complete key of
. I.e. the identifier of the module type. This
com.example.modules:fred
value will be used as the XML element name to match.
N/A
name
 
The human-readable name of the plugin module.
 
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not (value='false').
Only available for non-OSGi plugins.
false
Elements
Name
Required
Description
Default
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a localisation key
for the value instead of text in the element body.
 
Example
Here is an example
file containing a plugin module type:
atlassian-plugin.xml
Our dictionary module descriptor allows plugins to provide dictionaries that get definitions of technical terms and phrases in various
languages. We have a
interface that looks like this:
Dictionary
The Java code for
could look like this:
DictionaryModuleDescriptor
This will add the new module type 'dictionary' to the plugin framework, allowing other plugins to use the new module type. Here is a plugin
that uses the new 'dictionary' module type:
Accessing modules of your dynamic module type can be done using
.
com.atlassian.plugin.PluginAccessor
Note that it is not advisable to cache the results of calls to
's methods, since the return values
com.atlassian.plugin.PluginAccessor
can change at any time as a result of plugins being installed, uninstalled, enabled, or disabled.
Notes
Some information to be aware of when developing or configuring a Module Type plugin module:
Not all dynamic module types will need to use the
attribute on the modules that implement them. For example, if the above
class
dictionary example just used a resource file to translate terms, and not an interface that plugins had to implement, plugins using the
dictionary module type might look like this:
The plugin that defines a new module type cannot use the module type in the Plugin Framework 2.1, but can in 2.2 or later.
If you want to have control over the construction of the ModuleDescriptor, you can skip the 'module-type' module and make public a
component registered against the ModuleDescriptorFactory interface:
Ensure your
implements
ModuleDescriptorFactory
.
com.atlassian.plugin.osgi.external.ListableModuleDescriptorFactory
By specifying the
attribute in your module type element, you can ensure that a plugin only uses that module type
application
when it is running in a specific application. For example, with the following snippet, the dictionary module type is only used when the
plugin is loaded in JIRA:
The supported values for
are the
listed in the
.
application
Product Keys
Atlassian Plugin SDK documentation
RELATED TOPICS
Plugin Module Types
Servlet Context Listener Plugin Module
Available:
and later.
Atlassian Plugin Framework 2.1
: The Servlet Context Listener plugin module described below is available only for OSGi-based plugins
Note
using version 2.1 or later of the Plugin Framework.
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Notes
Purpose of this Module Type
Servlet Context Listener plugin modules allow you to deploy Java Servlet context listeners as a part of your plugin. This helps you to
integrate easily with frameworks that use context listeners for initialisation.
Configuration
The root element for the Servlet Context Listener plugin module is
. It allows the following attributes and
servlet-context-listener
child elements for configuration:
Attributes
Name
Required
Description
Default
class
 
The class which implements this plugin module. The class you need to provide depends on the
module type. For example, Confluence theme, layout and colour-scheme modules can use classes
already provided in Confluence. So you can write a theme-plugin without any Java code. But for
macro and listener modules you need to write your own implementing class and include it in your
plugin. See the plugin framework guide to
. The servlet context
creating plugin module instances
listener Java class. Must implement
.
javax.servlet.ServletContextListener
 
disabled
 
Indicate whether the plugin module should be disabled by default (value='true') or enabled by
default (value='false').
false
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
. A module with key
in a plugin with key
will
complete module key
fred
com.example.modules
have a complete key of
. I.e. the identifier of the context listener.
com.example.modules:fred
N/A
name
 
The human-readable name of the plugin module. I.e. the human-readable name of the listener.
The
plugin
key
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not (value='false').
Only available for non-OSGi plugins.
false
Elements
Name
Required
Description
Default
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a localisation key
for the value instead of text in the element body. I.e. the description of the listener.
 
Example
1.
2.
3.
4.
Here is an example
file containing a single servlet context listener:
atlassian-plugin.xml
Notes
Some information to be aware of when developing or configuring a Servlet Context Listener plugin module:
The servlet context you listen for will not be created on web application startup. Instead, it will be created the first time a servlet or
filter in your plugin is accessed after each time it is enabled, triggering a new instance of your listener followed by the calling of the
listener's
method. This means that if you disable a plugin containing a listener and re-enable it again, the
contextCreated()
following will happen:
The
method will be called on your listener after the plugin was disabled.
contextDestroyed()
A new servlet context will be created after the plugin was re-enabled.
Your listener will be instantiated.
The method
on your listener will be called.
contextCreated()
RELATED TOPICS
Plugin Module Types
Servlet Context Parameter Plugin Module
Available:
and later.
Atlassian Plugin Framework 2.1
: The Servlet Context Parameter plugin module described below is available only for OSGi-based plugins
Note
using version 2.1 or later of the Plugin Framework.
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Notes
Purpose of this Module Type
Servlet Context Parameter plugin modules allow you to set parameters in the Java Servlet context shared by your plugin's servlets, filters,
and listeners.
Configuration
The root element for the Servlet Context Parameter plugin module is
. It allows the following attributes and child
servlet-context-param
elements for configuration:
Attributes
Name
Required
Description
Default
class
 
The class which implements this plugin module. The class you need to provide depends on the
module type. For example, Confluence theme, layout and colour-scheme modules can use classes
already provided in Confluence. So you can write a theme-plugin without any Java code. But for
macro and listener modules you need to write your own implementing class and include it in your
plugin. See the plugin framework guide to
.
creating plugin module instances
 
disabled
 
Indicate whether the plugin module should be disabled by default (value='true') or enabled by
default (value='false').
false
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
. A module with key
in a plugin with key
will
complete module key
fred
com.example.modules
have a complete key of
. I.e. The identifier of the context
com.example.modules:fred
parameter.
N/A
name
 
The human-readable name of the plugin module. I.e. The human-readable name of the context
parameter.
The
plugin
key
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not (value='false').
Only available for non-OSGi plugins.
false
Elements
Name
Required
Description
Default
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a localisation key
for the value instead of text in the element body. I.e. the description of the listener.
 
param-name
The servlet context parameter name.
N/A
param-value
The servlet context parameter value.
N/A
Example
Here is an example
file containing a single servlet context parameter:
atlassian-plugin.xml
Notes
Some information to be aware of when developing or configuring a Servlet Context Parameter plugin module:
This parameter will only be available to servlets, filters, and context listeners within your plugin.
RELATED TOPICS
Plugin Module Types
Servlet Filter Plugin Module
Available:
and later.
Atlassian Plugin Framework 2.1
: The Servlet Filter plugin module described below is available only for OSGi-based plugins using version
Note
2.1 or later of the Plugin Framework.
Changed:
The
element was added in
.
dispatcher
Plugin Framework 2.5
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Accessing your Servlet Filter
Notes
Purpose of this Module Type
Servlet Filter plugin modules allow you to deploy Java Servlet filters as a part of your plugin, specifying the location and ordering of your filter.
This allows you to build filters that can tackle tasks like profiling and monitoring as well as content generation.
Configuration
The root element for the Servlet Filter plugin module is
. It allows the following attributes and child elements for
servlet-filter
configuration:
Attributes
Name
Required
Description
Default
class
 
The class which implements this plugin module. The class you need to provide depends on
the module type. For example, Confluence theme, layout and colour-scheme modules can
use classes already provided in Confluence. So you can write a theme-plugin without any
Java code. But for macro and listener modules you need to write your own implementing
class and include it in your plugin. See the plugin framework guide to
creating plugin
. The servlet filter Java class must implement
.
module instances
javax.servlet.Filter
 
disabled
 
Indicate whether the plugin module should be disabled by default (value='true') or enabled
by default (value='false').
false
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is
defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with
the
. A module with key
in a plugin with key
complete module key
fred
will have a complete key of
. I.e.
com.example.modules
com.example.modules:fred
the identifier of the servlet filter.
N/A
location
 
The position of the filter in the application's filter chain. If two plugins provide filters at the
same position, the 'weight' attribute (see below) is evaluated.
after-encoding
- Near the very top of the filter chain in the application, but after
any filters which ensure the integrity of the request.
before-login
- Before the filter that logs in the user with any authentication
information included in the request.
before-decoration
- Before the filter which does decoration of the response,
typically with Sitemesh.
before-dispatch
- At the end of the filter chain, before any servlet or filter which
handles the request by default.
before-dispatch
name
 
The human-readable name of the plugin module. I.e. the human-readable name of the
filter.
The plugin key
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not
(value='false'). Only available for non-OSGi plugins.
false
weight
 
The weight of the filter, used to decide which order to place the filter in the chain for filters
which have specified the same 'location' attribute (see above). The higher weight, the lower
the filter's position.
100
Elements
Name
Required
Description
Default
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a
localisation key for the value instead of text in the element body. I.e. the description of the
filter.
 
init-param
 
Initialisation parameters for the filter, specified using
and
param-name
param-value
sub-elements, just as in
. This element and its child elements may be repeated.
web.xml
N/A
resource
 
A resource for this plugin module. This element may be repeated. A 'resource' is a
non-Java file that a plugin may need in order to operate. Refer to
Adding Plugin and
for details on defining a resource.
Module Resources
N/A
url-pattern
The pattern of the URL to match. This element may be repeated.
The URL pattern format is used in Atlassian plugin types to map them to URLs. On the
whole, the pattern rules are consistent with those defined in the Servlet 2.3 API. The
following wildcards are supported:
* matches zero or many characters, including directory slashes
? matches zero or one character
Examples
/mydir/*
matches
/mydir/myfile.xml
/*/admin/*.??ml
matches
/mydir/otherdir/admin/myfile.html
N/A
dispatcher
 
Determines when the filter is triggered. You can include multiple
elements.
dispatcher
If this element is present, its content must be one of the following, corresponding to the
filter dispatcher options defined in the Java Servlet 2.4 specification:
REQUEST
: the filter applies to requests that came directly from the client
INCLUDE
: the filter applies to server-side includes done via
RequestDispatcher.include()
FORWARD
: the filter applies to requests that are forwarded via
RequestDispatcher.forward()
ERROR
: the filter applies to requests that are handled by an error page
Note: This element is only available in
and later.
Plugin Framework 2.5
If this element is not present, the default is
. (This is also the behaviour
REQUEST
for Plugin Framework releases earlier than 2.5.)
Filter will be
triggered only for
requests from the
client
Example
Here is an example
file containing a single servlet filter:
atlassian-plugin.xml
Accessing your Servlet Filter
Your servlet will be accessible within the Atlassian web application via each
you specify, but unlike the
,
url-pattern
Servlet Plugin Module
the
is relative to the root of the web application.
url-pattern
For example, if you specify a
of
as above, and your Atlassian application was deployed at
url-pattern
/helloworld
http://yourserver/jira
 then your servlet filter would be accessed at
.
http://yourserver/jira/helloworld
Notes
Some information to be aware of when developing or configuring a Servlet Filter plugin module:
Your servlet filter's
method will not be called on web application startup, as for a normal filter. Instead, this method will be
init()
called the first time your filter is accessed after each time it is enabled. This means that if you disable a plugin containing a filter or a
single servlet filter module, and re-enable it again, the filter will be re-created and its
method will be called again.
init()
Because servlet filters are deployed beneath root, be careful when choosing each
under which your filter is deployed.
url-pattern
If you plan to handle the request in the filter, it is recommended to use a value that will always be unique to the world!
Some application servers, like WebSphere 6.1, won't call servlet filters if there is no underlying servlet to match the URL. On these
systems, you will only be able to create a filter to handle normal application URLs.
RELATED TOPICS
Servlet Plugin Module
Plugin Module Types
Servlet Plugin Module
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Example
Accessing your Servlet
Notes
Purpose of this Module Type
Servlet plugin modules enable you to deploy Java servlets as a part of your plugins.
Configuration
The root element for the Servlet plugin module is
. It allows the following attributes and child elements for configuration:
servlet
Attributes
Name
Required
Description
Default
class
The servlet Java class. Must be a subclass of
. See the
javax.servlet.http.HttpServlet
plugin framework guide to
.
creating plugin module instances
 
disabled
 
Indicate whether the plugin module should be disabled by default (value='true') or enabled by
default (value='false').
false
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
. A module with key
in a plugin with key
will
complete module key
fred
com.example.modules
have a complete key of
. I.e. the identifier of the servlet.
com.example.modules:fred
N/A
name
 
The human-readable name of the plugin module. I.e. the human-readable name of the servlet.
The
plugin
key.
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not (value='false').
Only available for non-OSGi plugins.
false
Elements
Name
Required
Description
Default
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a localisation key
for the value instead of text in the element body. I.e. the description of the servlet.
 
init-param
 
Initialisation parameters for the servlet, specified using
and
sub-elements,
param-name
param-value
just as in
. This element and its child elements may be repeated.
web.xml
N/A
resource
 
A resource for this plugin module. This element may be repeated. A 'resource' is a non-Java file that a
plugin may need in order to operate. Refer to
for details on
Adding Plugin and Module Resources
defining a resource.
N/A
url-pattern
The pattern of the URL to match. This element may be repeated.
The URL pattern format is used in Atlassian plugin types to map them to URLs. On the whole, the
pattern rules are consistent with those defined in the Servlet 2.3 API. The following wildcards are
supported:
* matches zero or many characters, including directory slashes
? matches zero or one character
Examples
/mydir/*
matches
/mydir/myfile.xml
/*/admin/*.??ml
matches
/mydir/otherdir/admin/myfile.html
N/A
Example
Here is an example
file containing a single servlet:
atlassian-plugin.xml
Accessing your Servlet
Your servlet will be accessible within the Atlassian web application via each
you specify, beneath the
url-pattern
/plugins/servlet
parent path.
For example, if you specify a
of
as above, and your Atlassian application was deployed at
url-pattern
/helloworld
http://yourserver/jira
 then your servlet would be accessed at
.
http://yourserver/jira/plugins/servlet/helloworld
Notes
Some information to be aware of when developing or configuring a Servlet plugin module:
Your servlet's
method will not be called on web application startup, as for a normal servlet. Instead, this method will be
init()
called the first time your servlet is accessed after each time it is enabled. This means that if you disable a plugin containing a servlet,
or a single servlet module, and re-enable it again, the servlet is re-instantiated and its
method will be called again.
init()
Because all servlet modules are deployed beneath a common
root, be careful when choosing each
/plugins/servlet
under which your servlet is deployed. It is recommended to use a value that will always be unique to the world!
url-pattern
RELATED TOPICS
Plugin Module Types
Template Context Item Plugin Module
On this page:
Purpose of this Module Type
Configuration
Attributes
Example
Notes
Rendering templates for other plugins
When you have a reference to the plugin's
object
Plugin
When you expose a service that is imported by the plugin
Using a
ServiceTracker
Purpose of this Module Type
This module type allows you to put arbitrary context items into the context of any
. This is useful to ensure
Atlassian Template Renderer
plugin developers don't have to repeatedly create the same context each time they need to render content.
This module type is similar to the Confluence velocity-context-item module type. However, it is more powerful in the following ways:
It can be used with any template rendering technology, not just velocity
It allows items to be scoped in the context of the plugin that declares it, or to be in the global context of all plugins
It allows referencing of arbitrary components, not just classes. This means you don't need to create wrapper classes if you want to
put a general component (such as the SAL I18nResolver) in your context. It also means you can use Spring prototype beans if you
want to use some per context stateful bean
Configuration
The root element for the Template Context Items plugin module is
. It allows the following attributes for
template-context-item
configuration:
Attributes
Name
Required
Description
Default
context-key
The key with which the context item is referenced from templates, e.g.
in the
$i18n
example below.
 
component-ref
Either this or
, but not
class
both, is required
A reference to a component in the plugin's application context. To reference OSGi services
or host components, import the component using
. The component
component-import
will be looked up on each use, so prototype spring beans will be newly instantiated each
time.
 
class
Either this or
,
component-ref
but not both, is
required
The class that should be instantiated and put into the context. This will be a singleton
 
global
 
True if the context item should be available to contexts for all plugins.
false
Example
Notes
Rendering templates for other plugins
When rendering templates for other plugins, you need to ensure your plugin gets the template renderer for the other plugins bundle. There
are many ways to do this, and all involve getting a hold of the plugins
. With the bundle context, you can lookup the
BundleContext
service, however, in most cases you won't want to do this directly, as you may encounter problems if the template
TemplateRenderer
renderer has not been enabled yet, or is restarted. It will usually be more appropriate to use a
, and access the template
ServiceTracker
renderer through that.
The following are the two best ways of getting a hold of the plugins
, which will apply depending on your situation:
BundleContext
When you have a reference to the plugin's
object
Plugin
This will be the case if you have defined a dynamic module type, from which you can access the plugins
object. In this case, you can
Plugin
access the
like so:
BundleContext
When you expose a service that is imported by the plugin
In this case, you should expose an OSGi
for your service. These work in the same way to Springs
's.
ServiceFactory
FactoryBean
Here's an example:
Using a
ServiceTracker
Once you have a
, you need to create
that tracks the
service in the plugins
BundleContext
ServiceTracker
TemplateRenderer
:
BundleContext
Now you can use the service using the
. The important thing that you need to worry about is handling if the service isn't
getService()
available. Sometimes it may be appropriate to do no action, at other times, you may want to throw an exception:
Finally, it's important that you close the
once you're finished using it. There are a number of reasons why this might
ServiceTracker
happen:
Your plugin might be brought down
The plugin using you might be brought down
The plugin using you might decide to unimport your service
Closing the service tracker should be done in your plugin module type descriptors disable method, or your
's unget
ServiceFactory
method. For example:
In
you would then have a corresponding method that would call the
method on the service tracker.
MyService
close()
RELATED TOPICS
Plugin Module Types
Web Item Plugin Module
On this page:
Purpose of this Module Type
Configuration
Attributes
Elements
Label Elements
Tooltip Elements
Link Elements
Icon Elements
Param Elements
Context-provider Element
Condition and Conditions Elements
Example
Purpose of this Module Type
Web Item plugin modules allow plugins to define new links in application menus.
Configuration
The root element for the Web Item plugin module is
. It allows the following attributes and child elements for configuration:
web-item
Attributes
Name
Required
Description
Default
class
 
The class which implements this plugin module. The class you need to provide depends on the
module type. For example, Confluence theme, layout and colour-scheme modules can use classes
already provided in Confluence. So you can write a theme-plugin without any Java code. But for
macro and listener modules you need to write your own implementing class and include it in your
plugin. See the plugin framework guide to
.
creating plugin module instances
 
disabled
 
Indicate whether the plugin module should be disabled by default (value='true') or enabled by
default (value='false').
false
i18n-name-key
 
The localisation key for the human-readable name of the plugin module.
 
key
The identifier of the plugin module. This key must be unique within the plugin where it is defined.
Sometimes, in other contexts, you may need to uniquely identify a module. Do this with the
. A module with key
in a plugin with key
will
complete module key
fred
com.example.modules
have a complete key of
.
com.example.modules:fred
N/A
name
 
The human-readable name of the plugin module. Used only in the plugin's administrative user
interface.
 
section
Location into which this web item should be placed. For non-sectioned locations, this is just the
location key. For sectioned locations it is the location key, followed by a slash ('/'), and the name of
the web section in which it should appear.
N/A
system
 
Indicates whether this plugin module is a system plugin module (value='true') or not (value='false').
Only available for non-OSGi plugins.
false
weight
 
Determines the order in which web items appear. Items are displayed top to bottom or left to right in
order of ascending weight. The 'lightest' weight is displayed first, the 'heaviest' weights sink to the
bottom. The weights for most applications' system sections start from 100, and the weights for the
links generally start from 10. The weight is incremented by 10 for each in sequence so that there is
ample space to insert your own sections and links.
1000
Elements
The table summarises the elements. The sections below contain further information.
Name
Required
Description
Default
condition
 
Defines a condition that must be satisfied for the web item to be displayed. If you want to 'invert' a
condition, add an attribute 'invert="true"' to it. The web item will then be displayed if the condition
returns false (not true).
N/A
conditions
 
Defines the logical operator type to evaluate its condition elements. By default 'AND' will be used.
AND
context-provider
 
Allows dynamic addition to the velocity context available for various web item elements (in XML
descriptors only). Currently only one context-provider can be specified per web item and section.
 
description
 
The description of the plugin module. The 'key' attribute can be specified to declare a localisation
key for the value instead of text in the element body. I.e. the description of the web item.
 
icon
 
Defines an icon to display with or as the link.
In some cases the icon element is required.
Note:
Try adding it if your web section is not displaying properly.
N/A
label
Is the i18n key that will be used to look up the textual representation of the link.
N/A
link
Defines where the web item should link to. The contents of the link element will be rendered using
Velocity, allowing you to put dynamic content in links. For more complex examples of links, see
.
below
N/A
param
 
Parameters for the plugin module. Use the 'key' attribute to declare the parameter key, then
specify the value in either the 'value' attribute or the element body. This element may be repeated.
An example is the configuration link described in
. This is
Adding a Configuration UI for your Plugin
handy if you want to use additional custom values from the UI.
N/A
resource
 
A resource for this plugin module. This element may be repeated. A 'resource' is a non-Java file
that a plugin may need in order to operate. Refer to
for
Adding Plugin and Module Resources
details on defining a resource.
N/A
tooltip
 
Is the i18n key that will be used to look up the textual mouse-over text of the link.
N/A
Label Elements
Label elements may contain optional parameters, as shown below:
The parameters allow you to insert values into the label using Java's
syntax.
MessageFormat
Parameter names must start with
and will be mapped in
to the substitutions in the format string. I.e.
param
alphabetical order
param0 is {0}, param1 is {1}, param2 is {2}, etc.
Parameter values are rendered using Velocity, allowing you to include dynamic content.
Tooltip Elements
Tooltip elements have the same attributes and parameters as the label elements. See
.
above
Link Elements
Link elements may contain additional information:
The
is
, and provides an XML id for the link being generated.
linkId
optional
The
is
and defaults to false unless the link starts with