Java “可吊起手柄”;虚拟资源;?

Java “可吊起手柄”;虚拟资源;?,java,jcr,sling,Java,Jcr,Sling,背景:我的任务是为一个运行在Sling上的网站实现搜索引擎站点地图。该站点有多个特定于国家的站点,每个特定于国家的站点可以有多个本地化-例如,将是加拿大站点的法语本地化版本,并映射到/content/ca/fr。我无法更改此内容结构,不幸的是,国家/地区和本地化节点都具有相同的sling:resourceType。此外,管理类型希望每个国家/地区/本地化对都有一个sitemap.xml,而不是每个国家/地区站点都有一个sitemap.xml 生成站点地图是一项简单的任务,我的问题是每个国家/地区

背景:我的任务是为一个运行在Sling上的网站实现搜索引擎站点地图。该站点有多个特定于国家的站点,每个特定于国家的站点可以有多个本地化-例如,将是加拿大站点的法语本地化版本,并映射到/content/ca/fr。我无法更改此内容结构,不幸的是,国家/地区和本地化节点都具有相同的
sling:resourceType
。此外,管理类型希望每个国家/地区/本地化对都有一个sitemap.xml,而不是每个国家/地区站点都有一个sitemap.xml

生成站点地图是一项简单的任务,我的问题是每个国家/地区对都需要一个“站点地图”节点-由于国家和地区节点的添加方式(并且它们具有相同的资源类型),我目前无法想出一个好的自动添加站点地图节点的方法

如果我能以某种方式定义一个“虚拟资源”,将/{country}/{localization}/sitemap.xml的请求映射到一个处理脚本,那就太好了;我一直在四处浏览,遇到了
ResourceProvider
OptingServlet
,但他们似乎非常关注绝对路径——或者向现有资源添加选择器,这对我来说似乎不是一个选项

有什么好办法可以解决这个问题吗?添加新的国家/地区并非每天都会发生,但手动添加“站点地图”节点仍然不是最佳解决方案

我一直在考虑是否最好有一个每天更新站点地图X次的运行服务,并在JCR中将sitemap.xml节点生成为简单的文件资源,而不是使用Sling解析器。。。但在走这条路之前,我想得到一些反馈:)

编辑:
事实证明,需求发生了变化,他们现在希望站点地图可以根据本地化进行配置—这使我的工作更轻松,而且我不必使用Sling:)

Sling是一个基于资源的框架,因此您必须在JCR中拥有一个资源(节点),您的请求以该资源为目标

您有两个选择: 1) 创建一个站点地图模板,该模板包含显示站点地图的逻辑,或者包含站点地图组件。可以将站点地图逻辑提取到您认为合适的类或服务中。每个站点的站点地图将位于: -/content/us/en/sitemap.xml -/content/ca/fr/sitemap.xml

2) 创建一个使用2个选择器引用的站点地图资源(节点);国家/地区和语言代码-此方法允许缓存,但作为单个资源,您可能会遇到缓存清除问题

  • /content/sitemap.us.en.xml
  • /content/sitemap.ca.fr.xml
您可以查看:PathInfo以提取用于确定要渲染哪个站点地图的Sling选择器信息

如果我这样做,我将需要手动将站点地图添加到每个站点,并将资源保持在/content//下


您甚至可以考虑使用MSM创建Blueprint站点(如果您使用的是我认为您使用的平台),并使用它来推出新站点,从而可以创建站点模板。

Sling是一个基于资源的框架,因此您必须在JCR中拥有一个资源(节点),以满足您的请求

您有两个选择: 1) 创建一个站点地图模板,该模板包含显示站点地图的逻辑,或者包含站点地图组件。可以将站点地图逻辑提取到您认为合适的类或服务中。每个站点的站点地图将位于: -/content/us/en/sitemap.xml -/content/ca/fr/sitemap.xml

2) 创建一个使用2个选择器引用的站点地图资源(节点);国家/地区和语言代码-此方法允许缓存,但作为单个资源,您可能会遇到缓存清除问题

  • /content/sitemap.us.en.xml
  • /content/sitemap.ca.fr.xml
您可以查看:PathInfo以提取用于确定要渲染哪个站点地图的Sling选择器信息

如果我这样做,我将需要手动将站点地图添加到每个站点,并将资源保持在/content//下


您甚至可以考虑使用MSM创建Blueprint站点(如果您使用的是我认为您使用的平台),并使用可以创建站点模板的工具推出新站点。

如果您希望通过自定义代码处理GET to/{country}/{localization}/sitemap.xml,只需在该位置创建一个节点,并根据需要设置其sling:resourceType以调用自定义servlet或脚本

要自动创建那些sitemap.xml节点,可以使用JCR观察员在创建新的/{country}/{localization}树时收到通知,然后创建sitemap.xml节点

对于可配置的站点地图,您可以将属性添加到sitemap.xml节点,并让自定义servlet或脚本使用它们的值来塑造其输出


您可以使用servlet过滤器或自定义资源提供者在存储库中不使用sitemap.xml节点的情况下实现这一点,但拥有这些节点会使实现和理解变得更加容易。

如果您希望通过自定义代码处理GET to/{country}/{localization}/sitemap.xml,只需在该位置创建一个节点,并根据需要设置其sling:resourceType以调用自定义servlet或脚本

要自动创建那些sitemap.xml节点,可以使用JCR观察员在创建新的/{country}/{localization}树时收到通知,然后创建sitemap.xml节点

对于可配置的站点地图,您可以将属性添加到sitemap.xml节点,并让自定义servlet或脚本使用它们的值来塑造其输出

您可以在存储库中不使用sitemap.xml节点、使用servlet过滤器或自定义ResourceProvider来实现这一点,但拥有这些节点会使实现和理解变得更加容易。

注意,我是