Подтвердить что ты не робот

Определить runmode в Adobe CQ

Как программно узнать, какой режим запуска работает? Я создал специальный тег, который предоставляет конфигурацию в зависимости от режима запуска экземпляра, но я не могу определить текущий режим выполнения.
Я нашел метод, который возвращает список экземпляров run-mods:

SlingSettings settings = ...get from BundleContext...
Set<String> currentRunModes = settings.getRunModes();

Но я не могу получить объекты SlingSettings или BundleContext. Как я могу получить эти объекты или, возможно, есть другой способ получить текущий режим выполнения?

4b9b3361

Ответ 1

SlingSetttings - правильный путь. Если это из Java, самый простой способ получить его с помощью аннотации SCR @Reference в классе, который содержит SCR @Component, избавляет вас от необходимости проходить через BundleContext.

Если это из Sling script, вы можете использовать sling.getService(....), чтобы получить SlingSettings.

Обратите внимание, что случаи, когда вам нужно читать режимы запуска, редки, обычно вам лучше настроить конфигурации OSGi, чтобы они зависели от режимов запуска, и на основе этого OSGi-компоненты изменяют свое поведение.

Ответ 2

Наконец, я решил использовать global.jsp, написать run-modes в контексте страницы и получить его в своем классе:

<%
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString());
%>

Ответ 3

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();
    }
}

Ответ 4

@Reference
RunMode runmode;

или

sling.getService( RunMode.class )

и вызовите

getCurrentRunModes(); //returns String[]

Ответ 5

Если вы используете Sightly и работаете с классом, который расширяет WCMUsePojo

slingSettings =this.getSlingScriptHelper().getService(SlingSettingsService.class);
    Set<String> runmodes = slingSettings.getRunModes();

Ответ 6

Как сказал Бертран Делакретэз, это правильный способ проверить, является ли экземпляр 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) 
{
}

Но этот подход не будет работать в случае предварительного просмотра и не будет работать.

Ответ 7

Вы также можете попробовать следующее:

RunModeService runModeService = getSlingScriptHelper().getService(RunModeService.class);
author = runModeService.isActive("author");

Ответ 8

Вы можете получить его из объекта запроса:

import com.day.cq.wcm.api.WCMMode;
WCMMode mode = WCMMode.fromRequest(request);