2012-09-03 6 views
12

Wie programmiere ich programmgesteuert, in welchem ​​Ausführungsmodus die Instanz ausgeführt wird? Ich habe ein benutzerdefiniertes Tag erstellt, das die Konfiguration abhängig vom Ausführungsmodus der Instanz bereitstellt, aber ich kann den aktuellen Ausführungsmodus nicht ermitteln.
fand ich eine Methode, die eine Liste von Lauf Mods Instanz zurückgibt:Ermitteln des runmode in Adobe CQ

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

Aber ich kann die Objekte SlingSettings oder Bundlecontext nicht bekommen. Wie bekomme ich diese Objekte oder gibt es eine andere Möglichkeit, den aktuellen Run-Modus zu bekommen?

Antwort

13

SlingSetttings ist der richtige Weg - Wenn es aus Java stammt, ist es am einfachsten, es mit einer SCR @Reference Annotation in einer Klasse zu erhalten, die eine SCR @Component ist. Dadurch müssen Sie BundleContext nicht durchlaufen.

Wenn es von einem Sling-Skript stammt, können Sie sling.getService (....) verwenden, um die SlingSettings zu erhalten.

Beachten Sie, dass die Fälle, in denen Sie die Ausführungsmodi lesen müssen, selten sind. In der Regel sollten Sie Ihre OSGi-Konfigurationen auf die Ausführungsmodi einstellen und die OSGi-Komponenten darauf basierend ihr Verhalten ändern lassen.

+0

Ich werde versuchen, Ihren Rat zu nehmen, danke! –

-2

Sie können es aus dem Request-Objekt erhalten:

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

Dies ist der WCM-Modus (d. H. Bearbeiten/Vorschau/Deaktiviert) und nicht der Ausführungsmodus des Servers (Autor/Veröffentlichen). – antonyh

10

Schließlich entschied ich mich global.jsp zu verwenden, schreiben Lauf Modi im Seitenkontext und es in meiner Klasse erhalten:

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

oder

sling.getService(RunMode.class) 

und

getCurrentRunModes(); //returns String[] 
1

rufen Wenn Sie Sightly verwenden und die Arbeit mit einer Klasse, die WCMUsePojo

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

Ich habe versucht herauszufinden, wie man einen SlingSettingsService bekommt. Nailed it – javaNoober

1

Als Bertrand Delacretaz erstreckt sagte es der richtige Weg ist zu prüfen, ob Instanz Autor oder veröffentlichen In jsp oder Java können Sie überprüfen, wie

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

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

Ein anderer Weg

unter Verwendung
if (mode == WCMMode.EDIT) 
{ 
} 

Aber dieser Ansatz wird im Falle einer Vorschaumodus fehlschlagen und nicht funktionieren würde.

+0

Jeder könnte mit Fehler helfen "SlingSettings kann nicht aufgelöst werden Fehler". –

+0

Wenn Sie WCMMode als eine Überprüfung verwenden - als Alternative, überlegen Sie, ob Sie 'mode! = WCMMode.DISABLED' und nicht' mode == WCMMode.EDIT' überprüfen möchten, was Ihnen bei dem von Ihnen hervorgehobenen Vorschau-Problem helfen könnte (Welcher zu verwenden ist, wird von Fall zu Fall sein, da es wahrscheinlich merkmalsabhängig sein wird) – anotherdave