如何在 Hippo groovy 更新程序中为具有站点地图条目的文档生成 URL?
How can generate URLs, within the Hippo groovy updater, for documents which have a sitemap entry?
一些问题背景
目前,我正在 HippoCMS 支持的网站中开发一些重定向逻辑,为 旧网站 上的 URL 创建 301 重定向到它们在新网站.
对于旧网站,我只能访问基于 "title to URL" 的索引。无法进一步访问。新网站中的 Hippo 文档使用与旧网站完全相同的标题创建。所以理论上应该可以匹配。
开发方法的原因是有超过 7000 个页面需要重定向。手动执行此操作(使用 UrlRewriter 插件)将意味着 40 多个小时的头脑麻木工作。
目前的发展
我创建了一个 Groovy 更新程序脚本,应该 ;
- 遍历所有节点
- 对于内容节点,文档标题与旧索引相匹配
- 存在匹配项时,检索旧的 URL
- 问题出在这里: 取回新的URL
- 文档在站点地图中有一个可解析的路径
- 作为新节点存储在 urlrewriter plugin 存储库部分
密码
import org.hippoecm.hst.configuration.hosting.Mount;
import org.hippoecm.hst.container.RequestContextProvider;
import org.hippoecm.hst.core.linking.HstLink;
import org.hippoecm.hst.core.linking.HstLinkCreator;
import org.hippoecm.hst.core.request.HstRequestContext;
class UpdaterTemplate extends BaseNodeUpdateVisitor {
boolean doUpdate(Node node) {
def HstRequestContext = RequestContextProvider.get();
def mount = HstRequestContext.getMount();
def linkCreator= temp.getHstLinkCreator();
def link = linkCreator.create(node.path, mount);
def url = link.toUrlForm(HstRequestContext);
// Output the url
log.debug(url);
}
}
代码基于河马example page about rewriting links
问题
我似乎无法检索新网站的 URL。所有其他步骤都工作正常,我在新站点上有文档 JCR 节点。我只能生成 URL.
我得到的第一个错误表明 CMS 无法解析某些 HST 类。
ERROR Cannot run updater: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
updater: 8: unable to resolve class org.hippoecm.hst.container.RequestContextProvider
@ line 8, column 1.
import org.hippoecm.hst.container.RequestContextProvider
^
1 error
更新我的 pom.xml 即可轻松解决此问题。 仅限开发期间。之后会重置。
那么问题来了,HstRequestContext为null。
ERROR Updating /content/documents/XYZXYZ failed - java.lang.NullPointerException: Cannot invoke method getMount() on null object
当然这是有道理的,因为我们没有真实的上下文。但是仍然...如果没有完整站点地图逻辑的副本,我还应该如何生成 URLs。
我走的是一条完全虚假的道路吗?或者我错过了什么?请帮帮我。
HST libraries/context 在 CMS 部分中不可用(这两个是单独的应用程序,具有不同的 context/lifecycle)。我认为最简单的方法是创建一个 HST 组件而不是 groovy 脚本(您可以使用 getPersistableSession(request) 将数据写入存储库),或者创建一个 HST REST 服务,您可以调用它来解析链接。此类服务已经存在,但您需要对其进行身份验证:http://127.0.0.1:8080/site/_cmsrest/documents/DOCUMENT_UUID/url/live
private static final String CMSREST_CREDENTIALS_HEADER = "X-CMSREST-CREDENTIALS";
private static final String CMSREST_CMSHOST_HEADER = "X-CMSREST-CMSHOST";
private static final String CREDENTIAL_CIPHER_KEY = "ENC_DEC_KEY";
public String getUrl(final String url) throws IOException {
final CredentialCipher credentialCipher = CredentialCipher.getInstance();
final String encryptedCredentials = credentialCipher.getEncryptedString(CREDENTIAL_CIPHER_KEY, new SimpleCredentials(user, password.toCharArray()));
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
final HttpGet httpget = new HttpGet(url);
httpget.setHeader(CMSREST_CREDENTIALS_HEADER, encryptedCredentials);
httpget.setHeader(CMSREST_CMSHOST_HEADER, encryptedCredentials);
log.info("Executing request {}", httpget.getRequestLine());
final ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
public String handleResponse(final HttpResponse response) throws IOException {
final int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
final HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
log.error("Invalid status: {}", status);
return null;
}
}
};
return httpclient.execute(httpget, responseHandler);
}
}
注意:只需将 DOCUMENT_UUID 替换为您自己的 uuid。这必须是文档句柄的 uuid。
HTH
一些问题背景
目前,我正在 HippoCMS 支持的网站中开发一些重定向逻辑,为 旧网站 上的 URL 创建 301 重定向到它们在新网站.
对于旧网站,我只能访问基于 "title to URL" 的索引。无法进一步访问。新网站中的 Hippo 文档使用与旧网站完全相同的标题创建。所以理论上应该可以匹配。
开发方法的原因是有超过 7000 个页面需要重定向。手动执行此操作(使用 UrlRewriter 插件)将意味着 40 多个小时的头脑麻木工作。
目前的发展
我创建了一个 Groovy 更新程序脚本,应该 ;
- 遍历所有节点
- 对于内容节点,文档标题与旧索引相匹配
- 存在匹配项时,检索旧的 URL
- 问题出在这里: 取回新的URL
- 文档在站点地图中有一个可解析的路径
- 作为新节点存储在 urlrewriter plugin 存储库部分
密码
import org.hippoecm.hst.configuration.hosting.Mount;
import org.hippoecm.hst.container.RequestContextProvider;
import org.hippoecm.hst.core.linking.HstLink;
import org.hippoecm.hst.core.linking.HstLinkCreator;
import org.hippoecm.hst.core.request.HstRequestContext;
class UpdaterTemplate extends BaseNodeUpdateVisitor {
boolean doUpdate(Node node) {
def HstRequestContext = RequestContextProvider.get();
def mount = HstRequestContext.getMount();
def linkCreator= temp.getHstLinkCreator();
def link = linkCreator.create(node.path, mount);
def url = link.toUrlForm(HstRequestContext);
// Output the url
log.debug(url);
}
}
代码基于河马example page about rewriting links
问题
我似乎无法检索新网站的 URL。所有其他步骤都工作正常,我在新站点上有文档 JCR 节点。我只能生成 URL.
我得到的第一个错误表明 CMS 无法解析某些 HST 类。
ERROR Cannot run updater: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
updater: 8: unable to resolve class org.hippoecm.hst.container.RequestContextProvider
@ line 8, column 1.
import org.hippoecm.hst.container.RequestContextProvider
^
1 error
更新我的 pom.xml 即可轻松解决此问题。 仅限开发期间。之后会重置。
那么问题来了,HstRequestContext为null。
ERROR Updating /content/documents/XYZXYZ failed - java.lang.NullPointerException: Cannot invoke method getMount() on null object
当然这是有道理的,因为我们没有真实的上下文。但是仍然...如果没有完整站点地图逻辑的副本,我还应该如何生成 URLs。
我走的是一条完全虚假的道路吗?或者我错过了什么?请帮帮我。
HST libraries/context 在 CMS 部分中不可用(这两个是单独的应用程序,具有不同的 context/lifecycle)。我认为最简单的方法是创建一个 HST 组件而不是 groovy 脚本(您可以使用 getPersistableSession(request) 将数据写入存储库),或者创建一个 HST REST 服务,您可以调用它来解析链接。此类服务已经存在,但您需要对其进行身份验证:http://127.0.0.1:8080/site/_cmsrest/documents/DOCUMENT_UUID/url/live
private static final String CMSREST_CREDENTIALS_HEADER = "X-CMSREST-CREDENTIALS";
private static final String CMSREST_CMSHOST_HEADER = "X-CMSREST-CMSHOST";
private static final String CREDENTIAL_CIPHER_KEY = "ENC_DEC_KEY";
public String getUrl(final String url) throws IOException {
final CredentialCipher credentialCipher = CredentialCipher.getInstance();
final String encryptedCredentials = credentialCipher.getEncryptedString(CREDENTIAL_CIPHER_KEY, new SimpleCredentials(user, password.toCharArray()));
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
final HttpGet httpget = new HttpGet(url);
httpget.setHeader(CMSREST_CREDENTIALS_HEADER, encryptedCredentials);
httpget.setHeader(CMSREST_CMSHOST_HEADER, encryptedCredentials);
log.info("Executing request {}", httpget.getRequestLine());
final ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
public String handleResponse(final HttpResponse response) throws IOException {
final int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
final HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
log.error("Invalid status: {}", status);
return null;
}
}
};
return httpclient.execute(httpget, responseHandler);
}
}
注意:只需将 DOCUMENT_UUID 替换为您自己的 uuid。这必须是文档句柄的 uuid。
HTH