Last modified by Thomas Mortagne on 2023/10/13

Show last authors
1 {{box cssClass="floatinginfobox" title="**Contents**"}}
2 {{toc/}}
3 {{/box}}
4
5 This is the second and last milestone of the XWiki Enterprise 4.0 version ([[Roadmap>>Main.Roadmap]]). This version mainly introduces various ways of customizing users directory and profiles and it also bring all comments features to annotation (answer, threaded annotation, etc.) by merging the two concepts in one comment with optional precise location.
6
7 = New and Noteworthy (since XWiki Enterprise 4.0 Milestone 1 version) =
8
9 == Extension Manager improvements ==
10
11 We improved the way the list of dependencies of an extension is displayed. You can now see the status of each dependency. In the following image you can see for instance that the Commons IO dependency is in conflict with the version of Commons IO bundled with XWiki Enterprise.
12
13 {{image reference="EM-dependencies.png"/}}
14
15 The extension status is also displayed when you view the extension separately. For instance, if you click on the Commons IO dependency link to get more details, you'll see the incompatibility message displayed as below:
16
17 {{image reference="EM-status.png"/}}
18
19 We also improved the search bar to allow users to search in different types of extensions. See below the result for searching "html" in core extensions, i.e. extensions bundled with XWiki Enterprise.
20
21 {{image reference="EM-search.png"/}}
22
23 == Annotations merged with Comments by default ==
24
25 Starting with version 4.0M2, annotations have been merged by default with comments. More specifically, this means:
26
27 * You can now reply to an Annotation (threaded annotations)
28 * The Annotations tab has been removed and annotations are now located in the Comments tab where you can see both annotations and comments
29 * The default annotation class is now ##XWiki.XWikiComments## instead of AnnotationCode.AnnotationClass. It also means we've modified the ##XWiki.XWikiComments## class by adding new fields to support annotations (See [[Migration Notes>>||anchor="HAnnotationsApplication"]] below).
30
31 {{image reference="annotations-merged-with-comments-screenshot.png"/}}
32
33 == App Within Minutes improvements ==
34
35 The actions pane on the application home page now provides a link to edit and delete the application. Of course you need to have the proper rights to be able to see the links.
36
37 {{image reference="AWM-appActions.png"/}}
38
39 We also added an Actions column to the applications live table to be able to manage applications directly from the App Within Minutes home page. Again, you need to have the proper rights to be able to see the actions.
40
41 {{image reference="AWM-appsLiveTable-actionsColumn.png"/}}
42
43 == User profile customization ==
44
45 An admin can now configure which information is displayed in the user profile (the "Profile" tab of a user's profile page). A new section has been added in the Administration where an admin can configure which fields of the ##XWiki.XWikiUsers## class to display. The admin still has to add the new fields to the class the old way, using the class editor for the page ##XWiki.XWikiUsers##, but he no longer needs to write any code.
46
47 {{image reference="userProfileCustomizer-screenshot.png"/}}
48
49 == User directory improvements and user customized view ==
50
51 The User Directory can now display, as columns, filterable and sortable properties of users, as opposed to the previous version where you just had a fixed column that displayed a composed name in the form "first_name last_name (profilePageID)".
52
53 In addition, each user can now customize his view over the User Directory by adding or removing columns, or resetting it to the default columns.
54
55 The default displayed columns are "first_name" and "last_name", and the unmodifiable columns (that will always be displayed as first columns) are "_avatar" and "doc.fullName".
56
57 {{image reference="customizableUserDirectory-customize.png"/}}
58
59 {{info}}
60 In the near future, we're planning to allow Admins to customize globally the User Directory for all users too.
61 {{/info}}
62
63 == ColorThemes gradients customizable from ColorTheme Wizard ==
64
65 In version [[3.4>>xwiki:ReleaseNotes.ReleaseNotesXWikiEnterprise34]] we deprecated the old default bundled ColorThemes (because of incompatible variable mix). In version 4.0 this is no longer the case, old default bundled ColorThemes (like [[Bordo>>extensions:Extension.Bordo ColorTheme]], [[Nature>>extensions:Extension.Nature ColorTheme]], etc.) are now being compatible with the 3.4 Colibri Skin changes. We fixed this by adding new gradient ColorThemes variables. All these gradient ColorTheme variables are now changeble from the ColorTheme Wizard.
66
67 {{image reference="ColorThemeWizard.png"/}}
68
69 == LDAP administration UI ==
70
71 An LDAP administration interface is now provided to make it easy to configure LDAP directly from the wiki (you had to edit the XWiki Configuration files before). See [[the module documentation>>extensions:Extension.LDAP Application]] for more information on this topic.
72
73 {{image reference="admin-ldap-ui.png"/}}
74
75 == New IRC Bot Application ==
76
77 The IRC Bot Application has been completely rewritten from the grounds up for better maintainability, improved speed and more features as described in the [[Documentation for the new IRC Bot Application>>extensions:Extension.IRC Bot Application]].
78
79 {{image reference="ircbotapplication.png"/}}
80
81 == Miscellaneous ==
82
83 * There's now a link to the [[Getting Started Guide>>Documentation.UserGuide.GettingStarted]] on the XWiki Enterprise home page.
84
85 = For Developers =
86
87 == New Velocity tool to serialize Java objects to JSON format ==
88
89 We introduced a new Velocity tool to be able to serialize Java objects to the JSON format. Checkout the [[documentation>>doc:extensions:Extension.Velocity Module||anchor="HJSONTool"]]. Here's an example that shows how to serialize a Map object:
90
91 {{code}}
92 {{velocity}}
93 #set($map = {'name': 'xwiki', 'values': [1, 2, 3], 'enabled': true})
94 $jsontool.serialize($map)
95 {{/velocity}}
96 {{/code}}
97
98 The result is:
99
100 {{code language="none"}}
101 {"name":"xwiki","values":[1,2,3],"enabled":true}
102 {{/code}}
103
104 We also refactored ##XWiki.LiveTableResultsMacros## page to generate the live table JSON in memory using a Map, which is serialized in the end using the new JSON tool. This makes it easier to customize the live table JSON. For example this is how the JSON for the AppWithinMinutes applications live table is generated:
105
106 {{code}}
107 {{include document="XWiki.LiveTableResultsMacros" /}}
108
109 {{velocity}}
110 #if($xcontext.action == 'get' && "$!{request.outputSyntax}" == 'plain')
111 $response.setContentType('application/json')
112 #set($map = {})
113 #gridresult_buildJSON("$!request.classname" $request.collist.split(',') $map)
114 ## Change the URL and permission for the edit and delete actions:
115 ## * edit action must trigger the AppWithinMinutes wizard.
116 ## * delete action must delete the application space.
117 #foreach($row in $map.get('rows'))
118 #set($editQueryString = "appName=$escapetool.url($row.get('doc_space'))")
119 #set($discard = $row.put('doc_edit_url', $xwiki.getURL('AppWithinMinutes.CreateApplication', 'view', $editQueryString)))
120 #if($row.get('doc_hasdelete'))
121 ## Deleting an application requires space administration rights.
122 #set($discard = $row.put('doc_hasdelete', $xwiki.hasAccessLevel('admin', $xcontext.user, "${row.get('doc_space')}.WebPreferences")))
123 #end
124 #set($rowDocRef = $services.model.createDocumentReference($row.get('doc_wiki'), $row.get('doc_space'), $row.get('doc_name')))
125 #set($discard = $row.put('doc_delete_url', $xwiki.getURL($rowDocRef, 'deletespace', '')))
126 #end
127 $jsontool.serialize($map)
128 #end
129 {{/velocity}}
130 {{/code}}
131
132 == Class reference always local ==
133
134 The class reference is now stored as a local reference in the BaseObject/BaseCollection which means that like in the storage you can't assign a class coming from another wiki to an xobject which was causing some issue when copying wikis. You can still provide absolute reference but the wiki reference will be automatically removed.
135
136 == New Rights Implementation (Experimental) ==
137
138 A new experimental security authorization module is now available and is aimed to replace the old right service API during the 4.x cycle. This new module provide its public API from the ##org.xwiki.security.authorization.AuthorizationManager## component. The whole authorization API has been rewritten from scratch with the following goals in mind:
139
140 * better performance by providing a ##SecurityCache## to cache both security rules and security access decisions.
141 * allow extending the list of ##Right## by registering new rights with a declarative description.
142 * allow customising the way the authorization decision are made, by providing a custom ##AuthorizationSettler## component.
143 * stay independent from ##oldcore## and use proper interfaces to made the authorization process as much as possible independent from the rest.
144
145 A bridge between this new security authorization module and the old implementation is also provided in ##org.xwiki.security.authorization.internal.XWikiCachingRightService## which could be used in xwiki.cfg to enable this new authorization manager as the default one. The new module could also be used side by side with the old implementation.
146
147 The default implementation of the right settler, being written based on a fully restructured way to evaluate rights declaratively, has some subtle differences in the way security rules (right Xobjects) are interpreted and authorization decisions are made. Apart from improved consistency and yet to be discovered issues, the major differences still needing improvements are:
148
149 * on an empty database, the guest user does not receive admin rights, and you need to enable and use superadmin to install an initial XAR.
150 * in a multiwiki setup, user groups evaluated during decision are limited to those coming from the user wiki and those of the wiki of the targeted entity are not taken into account.
151
152 The full documentation of this new module, in particular the way it now evaluate rights declaratively and allow augmenting and customising authorization decision is yet to be written. The new module provide a large Javadoc as a reference in the meantime. For the big picture, the new right service is now named ##AuthorizationManager##. Internally, it manipulates ##SecurityReference## (as well as ##UserSecurityReference## and ##GroupSecurityReference##, to represent entities, user and group), ##SecurityRule## (representing a right object) and ##SecurityAccess## (representing an access level in the old nomenclature), which are stored in a ##SecurityCache## using ##SecurityRuleEntry## (a set of rules) and ##SecurityAccessEntry## (the access of a given user). The ##AuthorizationManager## delegate cache management to a ##SecurityCacheLoader## which loads rules using a ##SecurityRuleLoader##; and delegate itself the access decision for a given user and a set of rules to an ##AuthorizationSettler##. This last one could be overridden to provide specific decision that could not be done in declarative mode.
153
154 == Miscellaneous ==
155
156 * A new event ##ApplicationReadyEvent## is sent when the Application is ready to service requests. Event Listeners can now listen to this event.
157 * We've added a new [[Commons Text Module>>extensions:Extension.Text Module]] to contain XWiki-specific APIs related to text.
158
159 == Upgrades ==
160
161 The following dependencies have been upgraded:
162
163 * Json-lib 2.4
164
165 = Bug fixes and improvements =
166
167 See the full list of [[JIRA issues>>https://jira.xwiki.org/sr/jira.issueviews:searchrequest-printable/temp/SearchRequest.html?jqlQuery=project+in+%28XCOMMONS%2C+XRENDERING%2C+XWIKI%2C+XE%2C+XEM%29+and+status+%3D+Closed+and+resolution+%3D+Fixed+and+fixVersion+%3D+%224.0-milestone-2%22&tempMax=1000]] fixed in this release.
168
169 = Tested Browsers =
170
171 Here's the list of browsers tested with this version (i.e. browsers that we've tested as working - Check the list of [[supported browsers>>dev:Community.BrowserSupportStrategy]]):
172
173 {{browser name="firefox" version="11.0"/}}
174
175 {{browser name="chrome" version="18"/}}
176
177 = Tested Databases =
178
179 {{database name="hsqldb" version="2.2.8"/}}
180
181 = Known issues =
182
183 * [[Bugs we know about>>https://jira.xwiki.org/secure/IssueNavigator.jspa?reset=true&jqlQuery=category+%3D+%22Top+Level+Projects%22+AND+issuetype+%3D+Bug+AND+resolution+%3D+Unresolved+ORDER+BY+updated+DESC]]
184
185 = Test Report =
186
187 You can check the [[manual test report>>TestReports.ManualTestReportXE40M2]] to learn about what was tested and the results on various browsers.
188
189 = Backward Compatibility and Migration Notes =
190
191 {{warning}}
192 As usual, before upgrading to this version, be sure to have a working backup of your database(s).
193 {{/warning}}
194
195 == General Notes ==
196
197 {{info}}
198 If you're running in a multiwiki setup you'll also need to define the property //xwiki.store.migration.databases// in your //xwiki.cfg// file if you want to explicitly name some databases to be migrated as the default is now to migrate all databases. Database that are not migrated could not be accessed.
199 {{/info}}
200
201 You may also want to [[import the default wiki XAR>>Main.Download]] in order to benefit from all the improvements listed above.
202
203 {{warning}}
204 Always make sure you compare your ##xwiki.cfg## and ##xwiki.properties## files with the newest version since some configuration parameters were added. Note that you should add ##xwiki.store.migration=1## so that XWiki will attempt to automatically migrate your current database to the new schema. Make sure you backup your Database before doing anything.
205 {{/warning}}
206
207 == Annotations Application ==
208
209 After an upgrade, in order to switch to the new ##annotations-merged-with-comments## mode, you will have to update your settings. To do this, go to wiki Administration and:
210
211 * change the annotation class in ##Applications > Annotations > Annotation type settings > XWiki class defining annotations structure## from the old default ##AnnotationCode.AnnotationClass## to the new default ##XWiki.XWikiComments##
212 * disable the Annotations tab by setting ##Look and Feel > Page elements > Document metadata visibility > Show document annotations## to ##No##
213
214 If you were/are using a custom annotations class, other than the previously default AnnotationsCode.AnnotationsClass, in the annotations configuration then the ##annotations-merged-with-comments## feature will not be available to you. What you can do is to enable back the Annotations tab by going to the Administration > Look and Feel > Page Elements and changing the value of "Show document annotations " from "No" to "Yes". Now you will still be able to use your custom annotations without being affected by the changes.
215
216 Also, a migration script will automatically convert all your existing default annotations (that are using the default AnnotationCode.AnnotationClass) to the new default class (XWiki.XWikiComments). After the migration, the new database version will be 40001.
217
218 == User profile customization ==
219
220 If you have a customized user profile tab (you have edited the "XWiki.XWikiUserProfileSheet" page), pay attention when importing the default XAR. If you want keep your customization and don't use the new User Profile Customization UI, just skip the "XWiki.XWikiUserProfileSheet" page. Also, if you do so, the new "User Profile" section in Administration will be useless.
221
222 == API Breakages ==
223
224 The following APIs were modified since version 3.5:
225
226 {{code language="none"}}
227 ERROR: 7012: org.xwiki.component.descriptor.ComponentRole: Method 'public java.lang.reflect.Type getRoleType()' has been added to an interface
228 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public org.xwiki.component.descriptor.ComponentDescriptor getComponentDescriptor(java.lang.reflect.Type, java.lang.String)' has been added to an interface
229 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public java.util.List getComponentDescriptorList(java.lang.reflect.Type)' has been added to an interface
230 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public boolean hasComponent(java.lang.reflect.Type)' has been added to an interface
231 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public boolean hasComponent(java.lang.reflect.Type, java.lang.String)' has been added to an interface
232 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public java.lang.Object lookupComponent(java.lang.reflect.Type)' has been added to an interface
233 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public java.lang.Object lookupComponent(java.lang.reflect.Type, java.lang.String)' has been added to an interface
234 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public java.util.List lookupList(java.lang.reflect.Type)' has been added to an interface
235 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public java.util.Map lookupMap(java.lang.reflect.Type)' has been added to an interface
236 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public void unregisterComponent(java.lang.reflect.Type, java.lang.String)' has been added to an interface
237 ERROR: 7012: org.xwiki.component.manager.ComponentManager: Method 'public void unregisterComponent(org.xwiki.component.descriptor.ComponentDescriptor)' has been added to an interface
238 ERROR: 7002: org.xwiki.component.annotation.DefaultComponentDependencyFactory: Method 'protected java.lang.Class getFieldRole(java.lang.reflect.Field)' has been removed
239 ERROR: 8001: org.xwiki.bridge.AttachmentName: Class org.xwiki.bridge.AttachmentName removed
240 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public java.io.InputStream getAttachmentContent(org.xwiki.bridge.AttachmentName)' has been removed
241 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public java.lang.String getAttachmentURL(org.xwiki.bridge.AttachmentName, boolean)' has been removed
242 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public java.util.List getAttachmentURLs(org.xwiki.bridge.DocumentName, boolean)' has been removed
243 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public java.util.List getAttachments(org.xwiki.bridge.DocumentName)' has been removed
244 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public org.xwiki.bridge.DocumentName getCurrentDocumentName()' has been removed
245 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public org.xwiki.bridge.DocumentModelBridge getDocument(org.xwiki.bridge.DocumentName)' has been removed
246 ERROR: 7002: org.xwiki.bridge.DocumentAccessBridge: Method 'public org.xwiki.bridge.DocumentName getDocumentName(java.lang.String)' has been removed
247 ERROR: 7002: org.xwiki.bridge.DocumentModelBridge: Method 'public org.xwiki.bridge.DocumentName getDocumentName()' has been removed
248 ERROR: 8001: org.xwiki.bridge.DocumentName: Class org.xwiki.bridge.DocumentName removed
249 ERROR: 4001: org.xwiki.gwt.user.client.ui.ListBox: Removed com.google.gwt.event.dom.client.KeyDownHandler from the set of implemented interfaces
250 ERROR: 4001: org.xwiki.gwt.user.client.ui.ListBox: Removed com.google.gwt.event.dom.client.KeyPressHandler from the set of implemented interfaces
251 ERROR: 4001: org.xwiki.gwt.user.client.ui.ListBox: Removed com.google.gwt.event.dom.client.KeyUpHandler from the set of implemented interfaces
252 ERROR: 7002: org.xwiki.gwt.user.client.ui.ListBox: Method 'public void onKeyDown(com.google.gwt.event.dom.client.KeyDownEvent)' has been removed
253 ERROR: 7002: org.xwiki.gwt.user.client.ui.ListBox: Method 'public void onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)' has been removed
254 ERROR: 7002: org.xwiki.gwt.user.client.ui.ListBox: Method 'public void onKeyUp(com.google.gwt.event.dom.client.KeyUpEvent)' has been removed
255 ERROR: 7006: org.xwiki.test.ui.browser.IgnoreBrowser: Return type of method 'public java.lang.String[] value()' has been changed to java.lang.String
256 ERROR: 7012: org.xwiki.test.ui.browser.IgnoreBrowser: Method 'public java.lang.String version()' has been added to an interface
257 ERROR: 7002: org.xwiki.test.ui.po.CommentsTab: Method 'public void clickAddComment()' has been removed
258 ERROR: 7002: org.xwiki.test.ui.po.CommentsTab: Method 'public void clickSaveComment()' has been removed
259 ERROR: 7002: org.xwiki.test.ui.po.CommentsTab: Method 'public void setCommentContent(java.lang.String)' has been removed
260 ERROR: 8001: org.xwiki.test.ui.po.DeleteConfirmationPage: Class org.xwiki.test.ui.po.DeleteConfirmationPage removed
261 ERROR: 8001: org.xwiki.test.ui.po.DeletePage: Class org.xwiki.test.ui.po.DeletePage removed
262 ERROR: 7006: org.xwiki.test.ui.po.ViewPage: Return type of method 'public org.xwiki.test.ui.po.DeletePage delete()' has been changed to org.xwiki.test.ui.po.ConfirmationPage
263 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.IELinePlugin: Removed com.google.gwt.event.dom.client.KeyDownHandler from the set of implemented interfaces
264 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.IELinePlugin: Removed com.google.gwt.event.dom.client.KeyPressHandler from the set of implemented interfaces
265 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.IELinePlugin: Removed com.google.gwt.event.dom.client.KeyUpHandler from the set of implemented interfaces
266 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.IELinePlugin: Removed com.google.gwt.event.shared.EventHandler from the set of implemented interfaces
267 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Removed com.google.gwt.event.dom.client.KeyDownHandler from the set of implemented interfaces
268 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Removed com.google.gwt.event.dom.client.KeyPressHandler from the set of implemented interfaces
269 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Removed com.google.gwt.event.dom.client.KeyUpHandler from the set of implemented interfaces
270 ERROR: 4001: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Removed com.google.gwt.event.shared.EventHandler from the set of implemented interfaces
271 ERROR: 7002: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Method 'public void onKeyDown(com.google.gwt.event.dom.client.KeyDownEvent)' has been removed
272 ERROR: 7002: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Method 'public void onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)' has been removed
273 ERROR: 7002: org.xwiki.gwt.wysiwyg.client.plugin.line.LinePlugin: Method 'public void onKeyUp(com.google.gwt.event.dom.client.KeyUpEvent)' has been removed
274 ERROR: 7004: org.xwiki.gwt.wysiwyg.client.plugin.list.ListBehaviorAdjuster: In method 'public ListBehaviorAdjuster()' the number of arguments has changed
275 ERROR: 7002: org.xwiki.gwt.wysiwyg.client.plugin.list.ListBehaviorAdjuster: Method 'protected void dispatchKey(com.google.gwt.user.client.ui.Widget, int, org.xwiki.gwt.dom.client.Event)' has been removed
276 ERROR: 7002: org.xwiki.gwt.wysiwyg.client.plugin.list.ListBehaviorAdjuster: Method 'public org.xwiki.gwt.user.client.ui.rta.RichTextArea getTextArea()' has been removed
277 ERROR: 7002: org.xwiki.gwt.wysiwyg.client.plugin.list.ListBehaviorAdjuster: Method 'public void setTextArea(org.xwiki.gwt.user.client.ui.rta.RichTextArea)' has been removed
278 ERROR: 7004: org.xwiki.gwt.wysiwyg.client.plugin.macro.exec.InsertExecutable: In method 'public InsertExecutable(org.xwiki.gwt.wysiwyg.client.plugin.macro.MacroSelector)' the number of arguments has changed
279 ERROR: 7012: org.xwiki.wysiwyg.server.WysiwygEditorConfiguration: Method 'public java.lang.Integer getHistorySize()' has been added to an interface
280 {{/code}}

Get Connected