确定Adobe CQ中的运行模式

时间:2012-09-03 10:07:55

标签: adobe osgi cq5 sling day-cq

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

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

但我无法获取SlingSettings或BundleContext对象。我怎样才能获得这些对象,或者有另一种方法来获得当前的运行模式?

8 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分: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();
    }
}

答案 3 :(得分:3)

@Reference
RunMode runmode;

sling.getService( RunMode.class )

并致电

getCurrentRunModes(); //returns String[]

答案 4 :(得分:2)

如果您正在使用Sightly并使用扩展WCMUsePojo的类

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

答案 5 :(得分:2)

正如Bertrand Delacretaz所说,检查实例是作者还是发布是正确的方法。 在jsp或java中,您可以检查

import  org.apache.sling.settings.SlingSettingsService
Set<String> runModes = sling.getService(SlingSettingsService.class).getRunModes();

if (runModes.contains("author")) {
} 

另一种方法是使用

if (mode == WCMMode.EDIT) 
{
}

但是这种方法在预览模式下会失败并且不起作用。

答案 6 :(得分:1)

你也可以试试这个:

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

答案 7 :(得分:-2)

您可以从请求对象中获取它:

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