CQ5 aka AEM - программный поиск источника скопированной страницы
В настоящее время я изучаю AEM, и мне было интересно, можно ли определить "источник" страницы. Чтобы уточнить, что я имею в виду именно:
Если вы копируете страницу с помощью параметров "Копировать" и "Вставить" в CQ5 WCM (не в реальном времени, а в обычном экземпляре страницы), можно программно определить, на какой странице основана ваша новая страница, т.е. страницу, которую вы скопировали, чтобы создать новую страницу?
2 ответа
Вы можете искать страницы с тем же именем (startWith(...)) и тем же ResourceType. Но, насколько я знаю, как только страница вставлена - нет никакой связи с "исходной" страницей. Кроме того, вы можете сравнить имена дочерних элементов ресурса содержимого страниц (узел jcr:content)
Я бы подошел скорее с другой точки зрения. Когда вы копируете страницу, между ними нет никакой связи или ссылки. Однако вы можете подготовить такой механизм самостоятельно. Это может работать следующим образом:
Во-первых, вам нужно реализовать фильтр, который будет перехватывать каждый запрос.
Форма запроса, которая отвечает за создание новой страницы в WCM, выглядит так:
cmd:copyPage
_charset_:utf-8
srcPath:/content/src
destParentPath:/content/dest
before:
Тогда Filter
, который будет перехватывать запросы на копирование, должен выглядеть следующим образом:
@Component(immediate = true)
@Service
@Properties({ @Property(name = "filter.scope", value = "REQUEST") })
public class CopyPageFilter implements Filter {
private static final String WCM_COMMAND_SERVLET = "/bin/wcmcommand";
private static final String CMD = "cmd";
private static final String COPY_PAGE = "copyPage";
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (isValid((SlingHttpServletRequest) request)) {
// store the src-dst for a while
} else {
chain.doFilter(request, response);
}
}
private boolean isValid(SlingHttpServletRequest request) {
return WCM_COMMAND_SERVLET.equals(request.getPathInfo())
&& COPY_PAGE.equals(request.getParameter(CMD));
}
@Override
public void init(FilterConfig config) throws ServletException {
// nothing to initialize
}
@Override
public void destroy() {
// nothing to destroy
}
}
Это позволит вам временно сохранить связь между источником и местом назначения. Следующим шагом будет внедрение SlingPostProcessor
это будет хранить информацию об источнике на вновь созданной странице.
@Component(immediate = true)
@Service
public class BootstrapGridPostProcessorService implements SlingPostProcessor {
@Reference
private CopyPageFilter copyPageFilter;
@Override
public void process(SlingHttpServletRequest request, List<Modification> modifications)
throws RepositoryException {
// 1. Check if this modification is a page creation
// 2. Check if in CopyPageFilter we have info about source for our destination
// 3. To the newly created page add a weak reference (uuid) or path to the source
}
}
Вот и все. Мы добавили связь между копируемыми страницами, которую мы можем использовать в дальнейшем.
Важно! Я уверен, что в Touch UI есть еще один сервлет, отвечающий за создание страницы. Поэтому ваш Filter
следует принять это во внимание.