2012-09-03 13 views
12

Jak programowo wiedzieć, w którym trybie uruchamiania działa instancja? Stworzyłem niestandardowy znacznik, który zapewnia konfigurację w zależności od trybu uruchamiania instancji, ale nie mogę określić bieżącego trybu uruchamiania.
znalazłem metodę, która zwraca listę instancji run-mods:Określanie trybu run w Adobe CQ

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

Ale nie mogę uzyskać SlingSettings obiektów lub BundleContext. Jak mogę uzyskać te obiekty, czy może istnieje inny sposób na uzyskanie bieżącego trybu uruchamiania?

Odpowiedz

13

SlingSetttings to właściwa metoda - jeśli pochodzi z Javy, najprostszym sposobem uzyskania tego jest przypisanie SCR @Reference w klasie SCR @Component, dzięki czemu nie trzeba przechodzić przez BundleContext.

Jeśli pochodzi ze skryptu Sling, możesz użyć sling.getService (....), aby pobrać SlingSettings.

Należy zauważyć, że przypadki, w których należy odczytywać tryby uruchamiania, są rzadkie, zwykle należy raczej skonfigurować konfiguracje OSGi, aby zależały od trybów uruchamiania i mają komponenty OSGi modyfikujące swoje zachowanie w oparciu o to.

+0

Postaram się przyjąć twoją radę, dziękuję! –

-2

Można go pobrać z obiektu żądania:

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

To jest tryb WCM (tzn. Edycja/podgląd/wyłączony), a nie tryb uruchamiania serwera (autor/publikowanie). – antonyh

10

Wreszcie postanowiłem wykorzystać global.jsp, pisać Run-tryby w kontekście widoku i dostać go w mojej klasie:

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

lub

sling.getService(RunMode.class) 

i nazywają

getCurrentRunModes(); //returns String[] 
1

Jeśli używasz pokaźny i pracy z klasą, która rozciąga WCMUsePojo

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

Próbowałem dowiedzieć się, jak uzyskać usługę SlingSettingsService. Nailed it – javaNoober

1

Jak Bertrand Delacretaz powiedział, że to dobry sposób, żeby sprawdzić, czy instancja jest Autor lub Opublikuj. JSP lub java można sprawdzić jak

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

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

Innym sposobem jest użycie

if (mode == WCMMode.EDIT) 
{ 
} 

Ale takie podejście nie w przypadku trybu podglądu i nie będzie działać.

+0

Każda może pomóc w błędzie "SlingSettings nie może być rozwiązany błąd". –

+0

Jeśli korzystasz z WCMMode jako czeku - możesz rozważyć, jeśli chcesz sprawdzić 'mode! = WCMMode.DISABLED' zamiast' mode == WCMMode.EDIT', co powinno pomóc w rozwiązaniu problemu z podglądem (Który z nich będzie używany, zależy to od konkretnego przypadku, ponieważ prawdopodobnie będzie zależał od funkcji) – anotherdave