确定Adobe CQ中的运行模式

Gle*_*iko 12 adobe osgi sling day-cq aem

如何以编程方式知道实例正在运行的运行模式?我创建了一个自定义标记,根据实例运行模式提供配置,但我无法确定当前的运行模式.
我找到了一个返回run-mods实例列表的方法:

SlingSettings settings = ...get from BundleContext...
Set<String> currentRunModes = settings.getRunModes();
Run Code Online (Sandbox Code Playgroud)

但我无法获取SlingSettings或BundleContext对象.如何获取这些对象,或者可能有另一种方法来获取当前的运行模式?

Ber*_*taz 15

SlingSetttings是正确的方法 - 如果它来自Java,最简单的方法就是在一个SCR @Component的类中使用SCR @Reference注释,这样就不必经过BundleContext.

如果它来自Sling脚本,您可以使用sling.getService(....)来获取SlingSettings.

请注意,您需要阅读运行模式的情况很少见,通常您宁愿设置OSGi配置以依赖于运行模式,并让OSGi组件根据它修改其行为.


Gle*_*iko 10

最后我决定使用global.jsp,在页面上下文中编写运行模式并在我的类中获取它:

<%
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString());
%>
Run Code Online (Sandbox Code Playgroud)


小智 6

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();
    }
}
Run Code Online (Sandbox Code Playgroud)