Как можно генерировать URL-адреса в обновлении Hippo groovy для документов, имеющих запись карты сайта?
Некоторый контекст вопроса
В настоящее время я разрабатываю некоторую логику перенаправления на веб-сайте с поддержкой HippoCMS, чтобы создать 301 переадресацию для URL-адресов старого сайта на соответствующие им страницы на новом сайте.
Для старого веб-сайта у меня есть доступ только к индексу на основе заголовка. Дальнейший доступ невозможен. Документы Бегемота на новом веб-сайте создаются с тем же названием, что и старый веб-сайт. Так что совпадение должно быть теоретически возможным.
Причиной такого подхода к разработке является тот факт, что существует более 7000 страниц, которые необходимо перенаправить. Выполнение этого вручную (с плагином UrlRewriter) будет означать более 40 часов безумной работы.
Текущее развитие
Я создал скрипт обновления Groovy, который СЛЕДУЕТ;
- Пройдите через все узлы
- Для узлов содержимого сопоставьте заголовок документа со старым индексом
- При наличии совпадения получить старый URL
- Проблемы лежат здесь: Получить новый URL
- Документ имеет разрешаемый путь в карте сайта
- Сохранить как новый узел в разделе хранилища плагинов urlrewriter
Код
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);
}
}
Код был основан на странице примера бегемота о переписывании ссылок
Эта проблема
Кажется, я не могу получить 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 является нулевым.
ERROR Updating /content/documents/XYZXYZ failed - java.lang.NullPointerException: Cannot invoke method getMount() on null object
Конечно, это имеет смысл, поскольку у нас нет реального контекста. Но все же... как еще я должен генерировать URL, без копии полной логики Sitemap.
Я нахожусь на полностью поддельном пути? Или я что-то упустил? Пожалуйста, помогите мне.
1 ответ
Библиотеки / контекст HST недоступны в части CMS (эти два являются отдельными приложениями с различным контекстом / жизненным циклом). Я думаю, что проще всего было бы создать 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. Это должен быть идентификатор документа.
НТН