Wiki source code of Extension Manager
Last modified by Vincent Massol on 2022/03/02 15:10
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{warning}} | ||
| 2 | This application is experimental, use it at your own risk. | ||
| 3 | {{/warning}} | ||
| 4 | |||
| 5 | {{velocity output="false"}} | ||
| 6 | #set($extensionManager = $services.extension) | ||
| 7 | #set($versionManager = $extensionManager.versionManager) | ||
| 8 | #if ($request.extensionwiki && $request.extensionwiki.trim() != '') | ||
| 9 | #set($extensionwiki = $request.extensionwiki) | ||
| 10 | #end | ||
| 11 | {{/velocity}} | ||
| 12 | |||
| 13 | {{velocity}} | ||
| 14 | {{html}} | ||
| 15 | <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post" class="xform half"> | ||
| 16 | <dl> | ||
| 17 | <dt> | ||
| 18 | <label for="extensionsearchpattern">Search pattern <span class="xRequired">(Required)</span></label> | ||
| 19 | <span class="xHint">The string to search in repositories</span> | ||
| 20 | </dt> | ||
| 21 | <dd> | ||
| 22 | <input id="extensionsearchpattern" name="extensionsearchpattern" type="text" class="" #if($request.extensionsearchpattern)value="${escapetool.xml($request.extensionsearchpattern)}"#end /> | ||
| 23 | </dd> | ||
| 24 | </dl> | ||
| 25 | <p> | ||
| 26 | <span class="buttonwrapper"><input type="submit" value="Search" name="actionsearch" class="button"/></span> | ||
| 27 | </p> | ||
| 28 | </form> | ||
| 29 | {{/html}} | ||
| 30 | {{/velocity}} | ||
| 31 | |||
| 32 | {{velocity}} | ||
| 33 | #if ($request.actionsearch) | ||
| 34 | #set($extensions = $extensionManager.search($request.extensionsearchpattern, 0, -1)) | ||
| 35 | #foreach($extension in $extensions) | ||
| 36 | * [[$extension.id>>?actionsearch&extensionid=${escapetool.url($extension.id.id)}&extensionversion=${escapetool.url($extension.id.version)}&extensionsearchpattern=${escapetool.url($request.extensionsearchpattern)}]] | ||
| 37 | #end | ||
| 38 | #end | ||
| 39 | {{/velocity}} | ||
| 40 | |||
| 41 | {{velocity}} | ||
| 42 | {{html}} | ||
| 43 | <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post" class="xform half"> | ||
| 44 | <dl> | ||
| 45 | <dt> | ||
| 46 | <label for="extensionid">Extension identifier <span class="xRequired">(Required)</span></label> | ||
| 47 | <span class="xHint"><groupid>:<artefactid> for a maven extension</span> | ||
| 48 | </dt> | ||
| 49 | <dd> | ||
| 50 | <input id="extensionid" name="extensionid" type="text" class="" #if($request.extensionid)value="${escapetool.xml($request.extensionid)}"#end /> | ||
| 51 | </dd> | ||
| 52 | </dl> | ||
| 53 | <dl> | ||
| 54 | <dt> | ||
| 55 | <label for="extensionversion">Extension version <span class="xRequired">(Required)</span></label> | ||
| 56 | </dt> | ||
| 57 | <dd> | ||
| 58 | <input id="extensionversion" name="extensionversion" type="text" #if($request.extensionversion)value="${escapetool.xml($request.extensionversion)}"#end /> | ||
| 59 | </dd> | ||
| 60 | </dl> | ||
| 61 | #if ($xwiki.isVirtualMode()) | ||
| 62 | <dl> | ||
| 63 | <dt> | ||
| 64 | <label for="extensionwiki">Extension wiki</label> | ||
| 65 | <span class="xHint">Leave empty to install on all wikis</span> | ||
| 66 | </dt> | ||
| 67 | <dd> | ||
| 68 | <input id="extensionwiki" name="extensionwiki" type="text" title="Extension wiki" #if($extensionwiki)value="${escapetool.xml($extensionwiki)}"#end /> | ||
| 69 | </dd> | ||
| 70 | </dl> | ||
| 71 | #end | ||
| 72 | <p> | ||
| 73 | <span class="buttonwrapper"><input type="submit" value="Resolve" name="actionresolve" class="button"/></span> | ||
| 74 | #if ($hasProgramming) | ||
| 75 | <span class="buttonwrapper"><input type="submit" value="Install" name="actioninstall" class="button"/></span> | ||
| 76 | #end | ||
| 77 | </p> | ||
| 78 | </form> | ||
| 79 | {{/html}} | ||
| 80 | {{/velocity}} | ||
| 81 | |||
| 82 | {{velocity}} | ||
| 83 | #if ($request.actionresolve) | ||
| 84 | = Resolve | ||
| 85 | |||
| 86 | #if (!$request.extensionid || !$request.extensionversion) | ||
| 87 | {{error}}You have to provide both extension id and version.{{/error}} | ||
| 88 | #else | ||
| 89 | #macro(resolveExtension $extensionid $extensionversion $extensionlevel) | ||
| 90 | #set($extension = $extensionManager.resolve($extensionid, $extensionversion, $extensionwiki)) | ||
| 91 | #if (!$extension) | ||
| 92 | #set($lasterror = $extensionManager.lastError) | ||
| 93 | {{error}}Failed to resolve extension with id $extensionid and version $extensionversion: $lasterror.message{{/error}} | ||
| 94 | #else | ||
| 95 | #set($extensionclass = "${extension.class}") | ||
| 96 | #foreach($index in [1..$extensionlevel])*#end #if($extensionclass.endsWith('CoreExtension'))**C**#elseif($extensionclass.endsWith('LocalExtension'))**I**#else**R**#end $extension.id.id ($extension.type) ($extension.id.version#if($extensionversion != $extension.id.version) was $extensionversion#end) | ||
| 97 | #resolveExtensionDependencies($extension) | ||
| 98 | #end | ||
| 99 | #end | ||
| 100 | #macro(resolveExtensionDependencies $extension $extensionlevel) | ||
| 101 | #set($extensionlevel = $extensionlevel + 1) | ||
| 102 | #foreach ($dependency in $extension.dependencies) | ||
| 103 | #resolveExtension($dependency.id, $dependency.version, $extensionlevel) | ||
| 104 | #end | ||
| 105 | #set($extensionlevel = $extensionlevel - 1) | ||
| 106 | #end | ||
| 107 | #resolveExtension($request.extensionid, $request.extensionversion, 1) | ||
| 108 | |||
| 109 | **C**: core extension | ||
| 110 | **I**: installed extension | ||
| 111 | **R**: remote extension | ||
| 112 | #end | ||
| 113 | #elseif($request.actioninstall) | ||
| 114 | = Install | ||
| 115 | |||
| 116 | #if (!$request.extensionid || !$request.extensionversion) | ||
| 117 | {{error}}You have to provide both extension id and version.{{/error}} | ||
| 118 | #elseif ($request.confirm) | ||
| 119 | #set($extension = $extensionManager.install($request.extensionid, $request.extensionversion, $extensionwiki)) | ||
| 120 | #set($lasterror = $extensionManager.lastError) | ||
| 121 | #if ($lasterror) | ||
| 122 | {{error}}Failed to install extension with id $request.extensionid and version $request.extensionversion#if($extensionwiki) on wiki $extensionwiki#end: $lasterror.message{{/error}} | ||
| 123 | #elseif ($extension.exceptions) | ||
| 124 | {{error}}Failed to install extension with id $request.extensionid and version $request.extensionversion#if($extensionwiki) on wiki $extensionwiki#end: $extension.exceptions[0].message{{/error}} | ||
| 125 | #else | ||
| 126 | {{info}}Extension with id $request.extensionid and version $request.extensionversion has been installed#if($extensionwiki) on wiki $extensionwiki#end.{{/info}} | ||
| 127 | #end | ||
| 128 | #else | ||
| 129 | #macro(prepareInstall $extensionid $extensionversion $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts) | ||
| 130 | #set($extension = $extensionManager.resolve($extensionid, $extensionversion, $extensionwiki)) | ||
| 131 | #set($extensionclass = "${extension.class}") | ||
| 132 | #if (!$extensionclass.endsWith('CoreExtension') && !$extensionclass.endsWith('LocalExtension')) | ||
| 133 | #if ($extensionManager.getInstalledExtension($extensionid, $extensionwiki)) | ||
| 134 | #set($extensionsToUpgrade[$extension.id] = $extension) | ||
| 135 | #else | ||
| 136 | #set($extensionsToInstall[$extension.id] = $extension) | ||
| 137 | #end | ||
| 138 | #elseif ($extensionclass.endsWith('CoreExtension') && $versionManager.compareVersions($extensionversion, $extension.id.version) > 0) | ||
| 139 | #set($coreExtensionsConflicts[$extension.id] = [$extension, $extensionversion]) | ||
| 140 | #end | ||
| 141 | #prepareInstallDependencies($extension, $extensionsToInstall, $extensionsToUpgrade, $extensionsSuggested) | ||
| 142 | #end | ||
| 143 | #macro(prepareInstallDependencies $extension $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts) | ||
| 144 | #foreach ($dependency in $extension.dependencies) | ||
| 145 | #prepareInstall($dependency.id, $dependency.version, $extensionsToInstall, $extensionsToUpgrade, $extensionsSuggested) | ||
| 146 | #end | ||
| 147 | #end | ||
| 148 | #set($extensionsToInstall = {}) | ||
| 149 | #set($extensionsToUpgrade = {}) | ||
| 150 | #set($extensionsSuggested = {}) | ||
| 151 | #set($coreExtensionsConflicts = {}) | ||
| 152 | #prepareInstall($request.extensionid $request.extensionversion $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts) | ||
| 153 | #set($lasterror = $extensionManager.lastError) | ||
| 154 | #if ($lasterror) | ||
| 155 | {{error}}Can't resolve extension with id $request.extensionid and version $request.extensionversion: $lasterror.message{{/error}} | ||
| 156 | #elseif ($extensionsToInstall.isEmpty() && $extensionsToUpgrade.isEmpty()) | ||
| 157 | Already installed | ||
| 158 | #else | ||
| 159 | #if (!$extensionsToInstall.isEmpty()) | ||
| 160 | The following new extensions will be installed: | ||
| 161 | #foreach ($extension in $extensionsToInstall.values()) | ||
| 162 | * $extension.id.id ($extension.id.version) | ||
| 163 | #end | ||
| 164 | |||
| 165 | #end | ||
| 166 | #if (!$extensionsToUpgrade.isEmpty()) | ||
| 167 | The following extensions will be upgraded: | ||
| 168 | #foreach ($extension in $extensionsToUpgrade.values()) | ||
| 169 | * $extension.id.id ($extension.id.version) | ||
| 170 | #end | ||
| 171 | |||
| 172 | #end | ||
| 173 | #if (!$extensionsSuggested.isEmpty()) | ||
| 174 | Suggested: | ||
| 175 | #foreach ($extension in $extensionsSuggested.values()) | ||
| 176 | * $extension.id.id ($extension.id.version) | ||
| 177 | #end | ||
| 178 | |||
| 179 | #end | ||
| 180 | #if (!$coreExtensionsConflicts.isEmpty()) | ||
| 181 | {{warning}} | ||
| 182 | Conflict with core extensions: | ||
| 183 | #foreach ($conflict in $coreExtensionsConflicts.values()) | ||
| 184 | * extension **$conflict.get(0).id.id** is needed in version **$conflict.get(1)** but core extension has version **$conflict.get(0).id.version** | ||
| 185 | #end | ||
| 186 | |||
| 187 | Are you sure you want to install ? | ||
| 188 | {{/warning}} | ||
| 189 | |||
| 190 | #end | ||
| 191 | {{html}} | ||
| 192 | <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post" class="xform"> | ||
| 193 | <div> | ||
| 194 | <input name="extensionid" value="${escapetool.xml($request.extensionid)}" type="hidden" /> | ||
| 195 | <input name="extensionversion" value="${escapetool.xml($request.extensionversion)}" type="hidden" /> | ||
| 196 | #if ($extensionwiki) | ||
| 197 | <input name="extensionwiki" value="$extensionwiki" type="hidden" /> | ||
| 198 | #end | ||
| 199 | <input name="actioninstall" type="hidden" /> | ||
| 200 | <p> | ||
| 201 | <span class="buttonwrapper"><input type="submit" value="Apply" name="confirm" class="button"/></span> | ||
| 202 | </p> | ||
| 203 | </div> | ||
| 204 | </form> | ||
| 205 | {{/html}} | ||
| 206 | #end | ||
| 207 | #end | ||
| 208 | #elseif($request.actionuninstall) | ||
| 209 | = Uninstall | ||
| 210 | |||
| 211 | #if (!$request.extensionid || !$request.extensionversion) | ||
| 212 | {{error}}You have to provide both extension id and version.{{/error}} | ||
| 213 | #elseif($request.confirm) | ||
| 214 | #set($extension = $extensionManager.uninstall($request.extensionid, $request.extensionversion)) | ||
| 215 | #set($lasterror = $extensionManager.lastError) | ||
| 216 | #if ($lasterror) | ||
| 217 | {{error}}Failed to uninstall extension with id $request.extensionid and version $request.extensionversion: $lasterror.message{{/error}} | ||
| 218 | #elseif ($extension.exceptions) | ||
| 219 | {{error}}Failed to uninstall extension with id $request.extensionid and version $request.extensionversion: $extension.exceptions[0].message{{/error}} | ||
| 220 | #else | ||
| 221 | {{info}}Extension with id $request.extensionid and version $request.extensionversion has been uninstalled.{{/info}} | ||
| 222 | #end | ||
| 223 | #else | ||
| 224 | #macro(prepareUninstall $extensionid $extensionversion $extensionsToUninstall) | ||
| 225 | #set($void = $extensionsToUninstall.add("${extensionid}-${extensionversion}")) | ||
| 226 | #set($backwardDependencies = $extensionManager.getBackwardDependencies($extensionid, $extensionversion)) | ||
| 227 | #prepareUninstallBackwardDependencies($backwardDependencies, $extensionsToUninstall) | ||
| 228 | #end | ||
| 229 | #macro(prepareUninstallBackwardDependencies $backwardDependencies $extensionsToUninstall) | ||
| 230 | #foreach ($backwardDependencyMap in $backwardDependencies.values()) | ||
| 231 | #foreach ($backwardDependency in $backwardDependencyMap) | ||
| 232 | #prepareUninstall($backwardDependency.id.id, $backwardDependency.id.version, $extensionsToUninstall) | ||
| 233 | #end | ||
| 234 | #end | ||
| 235 | #end | ||
| 236 | #set($extensionsToUninstall = []) | ||
| 237 | #prepareUninstall($request.extensionid $request.extensionversion $extensionsToUninstall) | ||
| 238 | #set($lasterror = $extensionManager.lastError) | ||
| 239 | #if ($lasterror) | ||
| 240 | {{error}}Failed to prepare uninstalling extension with id $request.extensionid and version $request.extensionversion: $lasterror.message{{/error}} | ||
| 241 | #elseif ($extensionsToUninstall.empty) | ||
| 242 | Extension does not exists | ||
| 243 | #else | ||
| 244 | The following extensions will be removed: | ||
| 245 | #foreach ($extensionid in $extensionsToUninstall) | ||
| 246 | * $extensionid | ||
| 247 | #end | ||
| 248 | |||
| 249 | {{html}} | ||
| 250 | <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post" class="xform"> | ||
| 251 | <div> | ||
| 252 | <input name="extensionid" value="${escapetool.xml($request.extensionid)}" type="hidden" /> | ||
| 253 | <input name="extensionversion" value="${escapetool.xml($request.extensionversion)}" type="hidden" /> | ||
| 254 | <input name="actionuninstall" type="hidden" /> | ||
| 255 | <p> | ||
| 256 | <span class="buttonwrapper"><input type="submit" value="Apply" name="confirm" class="button"/></span> | ||
| 257 | </p> | ||
| 258 | </div> | ||
| 259 | </form> | ||
| 260 | {{/html}} | ||
| 261 | #end | ||
| 262 | #end | ||
| 263 | #end | ||
| 264 | {{/velocity}} | ||
| 265 | |||
| 266 | {{velocity}} | ||
| 267 | = Installed extensions | ||
| 268 | |||
| 269 | #set($extensions = $extensionManager.getInstalledExtensions()) | ||
| 270 | #if ($extensions.isEmpty()) | ||
| 271 | {{info}}No extension installed.{{/info}}## | ||
| 272 | #else | ||
| 273 | |=Id|=Version|=Type#if($xwiki.isVirtualMode())|=Wikis#end#if ($hasProgramming)|=Actions#end | ||
| 274 | |||
| 275 | #foreach($extension in $extensions) | ||
| 276 | |$extension.id.id|$extension.id.version|$extension.type#if ($xwiki.isVirtualMode()) | ||
| 277 | |#if($extension.namespaces) | ||
| 278 | $extension.namespaces## | ||
| 279 | #else | ||
| 280 | All wikis## | ||
| 281 | #end | ||
| 282 | #end | ||
| 283 | #if ($hasProgramming) | ||
| 284 | |{{html clean="false"}} | ||
| 285 | <form action="$xwiki.requestURL" enctype="multipart/form-data" method="post"> | ||
| 286 | <fieldset> | ||
| 287 | <input name="extensionid" value="${escapetool.xml($extension.id.id)}" type="hidden" /> | ||
| 288 | <input name="extensionversion" value="${escapetool.xml($extension.id.version)}" type="hidden" /> | ||
| 289 | <span class="buttonwrapper"><input type="submit" value="Uninstall" name="actionuninstall" class="button"/></span> | ||
| 290 | </fieldset> | ||
| 291 | </form> | ||
| 292 | {{/html}}## | ||
| 293 | #end | ||
| 294 | |||
| 295 | #end | ||
| 296 | #end | ||
| 297 | {{/velocity}} | ||
| 298 | |||
| 299 | {{velocity}} | ||
| 300 | = Core extensions | ||
| 301 | |||
| 302 | #set($extensions = $extensionManager.coreExtensions) | ||
| 303 | |||
| 304 | == XWiki extensions | ||
| 305 | |||
| 306 | |=Id|=Version|=Type | ||
| 307 | #foreach($extension in $extensions) | ||
| 308 | #if ($extension.id.id.startsWith("org.xwiki") || $extension.id.id.startsWith("com.xpn")) | ||
| 309 | |(%title="$extension.getURL()"%)$extension.id.id|$extension.id.version|$extension.type | ||
| 310 | #end | ||
| 311 | #end | ||
| 312 | |||
| 313 | == Third party core extensions | ||
| 314 | |||
| 315 | |=Id|=Version|=Type | ||
| 316 | #foreach($extension in $extensions) | ||
| 317 | #if (!$extension.guessed && !$extension.id.id.startsWith("org.xwiki") && !$extension.id.id.startsWith("com.xpn")) | ||
| 318 | |(%title="$extension.getURL()"%)$extension.id.id|$extension.id.version|$extension.type | ||
| 319 | #end | ||
| 320 | #end | ||
| 321 | |||
| 322 | == Guessed third party core extensions | ||
| 323 | |||
| 324 | |=Id|=Version|=Type | ||
| 325 | #foreach($extension in $extensions) | ||
| 326 | #if ($extension.guessed) | ||
| 327 | |(%title="$extension.getURL()"%)$extension.id.id|$extension.id.version|$extension.type | ||
| 328 | #end | ||
| 329 | #end | ||
| 330 | {{/velocity}} |