在 XWiki 的子维基中注册基于 java 的监听​​器

Register java based listeners in subwiki's for XWiki

我们正在为各种客户开发一个包含各种类似子维基的维基农场。我真正面临的挑战是,我希望为每个子维基注册不同的(java 基础)听众。此类侦听器的一个示例是侦听保存事件以更改 Wikipage 的标题。为此,我使用存储在 objects 中的模型数据,每个子维基可能不同。为了防止每次触发事件时都必须重新加载这些模型,我希望模型加载一次并 re-use 它。但是,我在过去几天进行了搜索,以找到在 per-wiki 基础上定义/注册等侦听器组件的方法,但我找不到我要找的东西。

有人可以通过(例如)指导我举个例子来帮助我理解如何以这种方式构建这些监听器吗?

非常感谢任何帮助:-)

根据您的需要,您可能至少有 2 个主要解决方案:

  1. 使用在整个服务器场上安装的单个侦听器(或者 使用 Extension Manager 或仅通过 将 jar 转储到 "lib" 文件夹中)并保留模型的缓存, 使用当前的 wikiID 作为键。这样,当拦截一个 事件,你的监听器会得到当前的 wiki ID(或者来自 上下文或受影响文档的参考)并将其用于 查找内存模型,因此不再需要初始化 每个事件的模型。缓存可以是简单的任何东西 映射到更可配置和可扩展的解决方案,例如使用 XWiki 的缓存模块。
  2. 使用Wiki组件管理器,实际注册N个实例 您的听众,每个 wiki 一个。为此,您可以:
    1. Deploy and use the Extension Manager UI to install 您的组件在每个单独的 wiki 上(小心,不是整个农场!)。你 可以通过使您的组件成为 UI/flavor 你在子wiki上安装,这样它就会 当您安装 UI 时自动安装在子维基上 那个子维基。这样,您组件的代码应该只关心 当前的 wiki(它安装在上面)并且只关心 缓存当前wiki的模型。
    2. 或者,一种编程方法将意味着遍历每个现有的 wiki,并为每个将上下文 wiki 设置为 当前迭代 wiki,动态获取 "wiki" ComponentManager(在 "Component Module" 的文档中查找 "Namespaced Component Manager"),创建一个新的侦听器实例并 将其注册到该 wiki 组件管理器。此代码将 运行 一次,当 XWiki 实例启动时。然而,你会 必须使这些组件实例保持同步,并且无论何时 新的 wiki 被创建,你必须注册一个新的监听器 也是它的例子。没有声明性的方式 ATM 会 简化这个过程。

我真的不推荐方法 2.2,因为即使可行,它也不必要地复杂。

方法 2.1 编写起来最简单,但需要做一些部署工作(即您的工件需要在配置的 maven 仓库或 XWiki 存储库中可用(也可以查找 "XWiki Repository Application" ) 以便 Extension Manager 可以安装它)。

方法 1 易于实施和部署,因此如果适合您的用例,我推荐它。

编辑:如评论中所述,当前不支持选项 2。有关详细信息,请参阅 XCOMMONS-213