Как можно генерировать URL-адреса в обновлении Hippo groovy для документов, имеющих запись карты сайта?

Некоторый контекст вопроса

В настоящее время я разрабатываю некоторую логику перенаправления на веб-сайте с поддержкой HippoCMS, чтобы создать 301 переадресацию для URL-адресов старого сайта на соответствующие им страницы на новом сайте.

Для старого веб-сайта у меня есть доступ только к индексу на основе заголовка. Дальнейший доступ невозможен. Документы Бегемота на новом веб-сайте создаются с тем же названием, что и старый веб-сайт. Так что совпадение должно быть теоретически возможным.

Причиной такого подхода к разработке является тот факт, что существует более 7000 страниц, которые необходимо перенаправить. Выполнение этого вручную (с плагином UrlRewriter) будет означать более 40 часов безумной работы.

Текущее развитие

Я создал скрипт обновления Groovy, который СЛЕДУЕТ;

  1. Пройдите через все узлы
  2. Для узлов содержимого сопоставьте заголовок документа со старым индексом
    • При наличии совпадения получить старый URL
  3. Проблемы лежат здесь: Получить новый URL
    • Документ имеет разрешаемый путь в карте сайта
  4. Сохранить как новый узел в разделе хранилища плагинов 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. Это должен быть идентификатор документа.

НТН

Другие вопросы по тегам