Wiki source code of Release Note Structure

Last modified by Vincent Massol on 2026/08/28 22:09

Show last authors
1 A release note is a small tree of ordinary wiki pages carrying xobjects. Understanding that tree is what lets you query it from the [[getChanges macro>>doc:documentation.extensions.dev.release-notes.getchanges-macro.WebHome]] or render it from a displayer of your own.
2
3 {{plantuml}}
4 @startuml
5 !theme bluegray
6 skinparam shadowing false
7
8 object "**<ShortVersion>.WebHome**\nthe release note" as rn {
9 ReleaseNoteClass
10 product, version, date, released
11 }
12
13 object "**Entry001.WebHome**\na change" as entry {
14 EntryClass (type = Change)
15 Change.ChangeClass
16 title, summary, description
17 audience, importance, category, screenshots
18 }
19
20 object "**Contributors.WebHome**\nthe credits" as contrib {
21 EntryClass (type = Contributors)
22 ContributorsClass
23 contributors
24 }
25
26 rn *-- entry
27 rn *-- contrib
28 @enduml
29 {{/plantuml}}
30
31 == Page hierarchy ==
32
33 Every page of the application sits below one top-level space, ##ReleaseNotes## by default:
34
35 {{code language="none"}}
36 ReleaseNotes.WebHome the application home page
37 ReleaseNotes.Data.WebHome the data root
38 ReleaseNotes.Data.<Product>.<ShortVersion>.WebHome the release note
39 ReleaseNotes.Data.<Product>.<ShortVersion>.Entry001.WebHome a change
40 ReleaseNotes.Data.<Product>.<ShortVersion>.Contributors.WebHome the credits
41 {{/code}}
42
43 The short version is the page name and is parsed as the version, so the naming carries meaning rather than being cosmetic.
44
45 == Two xobjects per entry ==
46
47 An entry page always carries two xobjects. ##EntryClass## is the envelope: it says which ##product## and ##version## the entry belongs to and whether its ##type## is ##Change## or ##Contributors##, and it is what every query matches on. The second object carries the payload, either ##Change.ChangeClass## or ##ContributorsClass##. An entry that is missing its ##EntryClass## object is invisible to the whole application even though the page renders.
48
49 == Never hardcode the top-level space ==
50
51 Each page resolves the space it was installed in at runtime rather than naming it:
52
53 {{code language="velocity"}}
54 #set ($topSpace = $doc.documentReference.extractFirstReference('SPACE').getName())
55 #set ($object = $doc.getObject("${topSpace}.Code.EntryClass"))
56 {{/code}}
57
58 That is what lets an administrator copy or rename the whole application to another top-level space, so any page you add must follow the same pattern.
59
60 == Version aggregation ==
61
62 A release note derives the versions it queries from its own page name. ##8.3M1## queries ##8.3-milestone-1## and ##8.3RC1## queries ##8.3-rc-1##, while a plain ##8.3## queries ##8.3## together with every milestone and release candidate of that version. This is why a final release note lists the changes of its milestones without them being copied.

Get Connected