2012-09-03 18 views
12

Come faccio a sapere a livello di programmazione quale modalità di esecuzione è in esecuzione l'istanza? Ho creato un tag personalizzato che fornisce la configurazione in base alla modalità di esecuzione dell'istanza, ma non riesco a determinare la modalità di esecuzione corrente.
Ho trovato un metodo che restituisce un elenco di un'istanza run-mods:Determina la modalità di esecuzione in Adobe CQ

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

ma non riesco a ottenere i SlingSettings oggetti o BundleContext. Come posso ottenere questi oggetti o forse c'è un altro modo per ottenere la modalità corrente?

risposta

13

SlingSetttings è il modo giusto: se è da Java il modo più semplice per ottenerlo è con un'annotazione SCR @Reference in una classe che è un SCR @Component, ti evita di dover passare attraverso BundleContext.

Se proviene da uno script Sling, è possibile utilizzare sling.getService (....) per ottenere SlingSettings.

Si noti che i casi in cui è necessario leggere le modalità di esecuzione sono rari, in genere si preferisce configurare le configurazioni OSGi in base alle modalità di esecuzione e fare in modo che i componenti di OSGi modifichino il proprio comportamento in base a ciò.

+0

Proverò a seguire il tuo consiglio, grazie! –

-2

È possibile ottenere dall'oggetto richiesta:

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

Questa è la modalità WCM (cioè modifica/anteprima/disattivata) e non la modalità di esecuzione del server (autore/pubblicazione). – antonyh

10

Alla fine ho deciso di utilizzare global.jsp, scrivere run-modalità nel contesto di pagina e farlo nella mia classe:

<% 
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

0.123.
sling.getService(RunMode.class) 

e chiamare

getCurrentRunModes(); //returns String[] 
1

Se stai usando Sightly e lavorare con una classe che estende WCMUsePojo

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

Stavo cercando di scoprire come ottenere un SlingSettingsService. Inchiodato – javaNoober

1

Come Bertrand Delacretaz ha detto che è il modo giusto per verificare se istanza è Autore o pubblica. in JSP o Java si potrebbe verificare come

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

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

Un altro modo è usare

if (mode == WCMMode.EDIT) 
{ 
} 

Ma questo approccio non riuscirà nel caso di modalità di anteprima e non avrebbe funzionato.

+0

Qualcuno potrebbe aiutare con l'errore "SlingSettings non può essere risolto errore". –

+0

Se si utilizza WCMMode come controllo, in alternativa, si consideri se si desidera controllare 'mode! = WCMMode.DISABLED' piuttosto che' mode == WCMMode.EDIT', che dovrebbe essere d'aiuto con il problema di anteprima che si è verificato (Quale da usare sarà caso per caso, in quanto probabilmente dipenderà dalle caratteristiche) – anotherdave