Определить режим запуска в Adobe CQ
Как программно узнать, в каком режиме запуска работает экземпляр? Я создал пользовательский тег, который предоставляет конфигурацию в зависимости от режима запуска экземпляра, но я не могу определить текущий режим запуска.
Я нашел метод, который возвращает список экземпляров run-mods:
SlingSettings settings = ...get from BundleContext...
Set<String> currentRunModes = settings.getRunModes();
Но я не могу получить объекты SlingSettings или BundleContext. Как я могу получить эти объекты или, возможно, есть другой способ получить текущий режим запуска?
8 ответов
SlingSetttings - правильный путь. Если это из Java, то самый простой способ получить это с помощью аннотации SCR @Reference в классе, который является SCR @Component, избавляет вас от необходимости проходить через BundleContext.
Если это из скрипта Sling, вы можете использовать sling.getService(....) для получения SlingSettings.
Обратите внимание, что случаи, когда вам нужно прочитать режимы работы, редки, обычно вы предпочитаете настраивать свои конфигурации OSGi в зависимости от режимов работы, и компоненты OSGi изменяют свое поведение на основе этого.
Наконец, я решил использовать global.jsp, написать режимы выполнения в контексте страницы и получить его в своем классе:
<%
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString());
%>
import java.util.Set;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.apache.sling.settings.SlingSettingsService;
public class myClass {
public static Set<String> getRunModes() {
BundleContext bundleContext = FrameworkUtil.getBundle(myClass.class).getBundleContext();
ServiceReference serviceReference = bundleContext.getServiceReference(SlingSettingsService.class.getName( ));
SlingSettingsService slingSettingsService = (SlingSettingsService)bundleContext.getService(serviceReference);
return slingSettingsService.getRunModes();
}
}
@Reference
RunMode runmode;
или же
sling.getService( RunMode.class )
и позвонить
getCurrentRunModes(); //returns String[]
Как сказал Бертран Делакретаз, это правильный способ проверить, является ли экземпляр Author или Publish. В JSP или Java вы можете проверить, как
import org.apache.sling.settings.SlingSettingsService
Set<String> runModes = sling.getService(SlingSettingsService.class).getRunModes();
if (runModes.contains("author")) {
}
Другой способ использования
if (mode == WCMMode.EDIT)
{
}
Но этот подход потерпит неудачу в режиме предварительного просмотра и не будет работать.
Если вы используете Sightly и работаете с классом, который расширяет WCMUsePojo
slingSettings =this.getSlingScriptHelper().getService(SlingSettingsService.class);
Set<String> runmodes = slingSettings.getRunModes();
Вы также можете попробовать это:
RunModeService runModeService = getSlingScriptHelper().getService(RunModeService.class);
author = runModeService.isActive("author");
Вы можете получить его из объекта запроса:
import com.day.cq.wcm.api.WCMMode;
WCMMode mode = WCMMode.fromRequest(request);