2012-09-03 14 views
12

¿Cómo sé programáticamente qué modo de ejecución se está ejecutando la instancia? Creé una etiqueta personalizada que proporciona la configuración en función del modo de ejecución de la instancia, pero no puedo determinar el modo de ejecución actual.
He encontrado un método que devuelve una lista de ejemplo run-mods:Determine el modo de ejecución en Adobe CQ

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

pero no puedo conseguir los objetos o SlingSettings BundleContext. ¿Cómo puedo obtener estos objetos o tal vez hay otra forma de obtener el modo de ejecución actual?

Respuesta

13

SlingSetttings es la manera correcta - Si es de Java, la forma más sencilla de obtenerlo es con una anotación SCR @Reference en una clase que es un SCR @Component, le ahorra tener que pasar por BundleContext.

Si se trata de un script de Sling, puede usar sling.getService (....) para obtener SlingSettings.

Tenga en cuenta que los casos en los que necesita leer los modos de ejecución son raros, por lo general prefiere configurar sus configuraciones OSGi para que dependan de los modos de ejecución y hacer que los componentes OSGi modifiquen su comportamiento en función de eso.

+0

Trataré de seguir su consejo, ¡gracias! –

-2

Se puede conseguir el objeto de la solicitud:

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

Este es el modo WCM (es decir, editar/vista previa/deshabilitado), y no el modo de ejecución del servidor (autor/publicación). – antonyh

10

Finalmente decidí usar global.jsp, cancelaciones en los modos de ejecución en el contexto de la página y conseguir que en mi clase:

<% 
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString()); 
%> 
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
@Reference 
RunMode runmode; 

o

sling.getService(RunMode.class) 

y llame

getCurrentRunModes(); //returns String[] 
1

Si utilizas agradable a la vista y trabajar con una clase que se extiende WCMUsePojo

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

Estaba tratando de averiguar cómo obtener un SlingSettingsService. Clavado – javaNoober

1

Como Bertrand Delacretaz dijo que es el camino correcto para comprobar si la instancia es Autor o publicar en JSP o java se puede comprobar como

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

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

Otra forma es utilizar

if (mode == WCMMode.EDIT) 
{ 
} 

Pero este enfoque se producirá un error en el caso del modo de vista previa y no iba a funcionar.

+0

Cualquiera podría ayudar con el error "SlingSettings no se puede resolver el error". –

+0

Si está utilizando WCMMode como verificación, como alternativa, considere si desea verificar 'mode! = WCMMode.DISABLED' en lugar de' mode == WCMMode.EDIT', lo que debería ayudar con el problema de Vista previa que resaltó (Cuál usar será caso por caso, ya que probablemente sea función dependiente) – anotherdave

Cuestiones relacionadas