Inicjalizacja danych w zależności od trybu uruchomienia aplikacji Grails

Pisząc aplikacje w Grails niejednokrotnie stajecie przed koniecznością wykonania pewnej logiki podczas startu aplikacji, logika taka to np. dodanie użytkownika do bazy danych, zapisanie podstawowych i zarazem koniecznych do działania aplikacji danych w bazie.
Logika taka powinna zostać zawarta w klasie BootStrap znajdującej się w katalogu conf Waszej aplikacji. Początkowa postać tej klasy to:

class BootStrap {

     def init = { servletContext ->
     }
     def destroy = {
     }
}

W bloku init możecie umieścić kod, który zostanie wywołany podczas uruchomienia aplikacji, blok destroy powinien zawierać operacje, które mają zostać wykonane podczas zakończenia aplikacji - zakończenie takie musi odbyć się w sposób standardowy, zakończenie wykonania aplikacji spowodowane sytuacją nadzwyczajną nie spowoduje wykonania instrukcji zawartych w bloku destroy.

Dodajmy do powyższej klasy kod, który zostanie wykonany podczas startu naszej aplikacji:

class BootStrap {

     def init = { servletContext ->
          new User(username: ‘admin’, password: ‘admin’).save()
     }
     def destroy = {
     }
}

W ten sposób zapisujemy użytkownika o loginie admin i haśle admin, oczywiście musimy mieć utworzoną klasę domenową User z odpowiednimi polami ;)

Teraz podczas startu naszej aplikacji nasz przykładowy użytkownik będzie zawsze dodawany do bazy,
pytanie co zrobić gdy chcemy wykonać logikę w zależności od środowiska w którym uruchamiamy aplikację, jak wiadomo standardowo mamy trzy środowiska: development, test, production. Uruchomienie aplikacji w konfiguracji odpowiadającej określonemu środowisku odbywa się poprzez wykonanie komendy grails run-app z odpowiednim parametrem, np.:

grails prod run-app

Powyższa komenda uruchomi aplikację w trybie produkcyjnym.
Dobra, pojawia się teraz pytanie jak w klasie BootStrap sprawdzić w jakim trybie została uruchomiona nasza aplikacja?
Odpowiedź jest bardzo prosta, użyjemy do tego celu takiego oto fragmentu kodu:

def env = GrailsUtil.environment

Jest to wywołanie statycznej metody getEnvironment, znajdującej się w klasie GrailsUtil (dla niewtajemniczonych wywołania getterów w Groovy wyglądają jak odwołania do pól klasy). Teraz zmienna env będzie zawierała wartość dzięki której będziemy w stanie zidentyfikować rodzaj trybu w jakim uruchomiona została aplikacja, będą to odpowiednio: test, development, production dla trybów: testowego, developerskiego, produkcyjnego.

Teraz nie pozostaje nam nic innego jak uzależnić od zwróconej wartości wykonanie odpowiedniego kodu, można tu standardowo zastosować instrukcję if-else, można też to zrobić sprytniej i wykorzystać dobrodziejstwa jakie daje nam Groovy:

class BootStrap {

     def init = { servletContext ->
        def env = GrailsUtil.environment
        InitializeData.“$env”()
     }
     def destroy = {
     }
}

Co oznacza powyższy blok kodu, a w szczególności tajemnicza konstrukcja InitializeData.”$env”()?
A więc dzięki niej w bardzo ciekawy sposób rozdzieliliśmy wykonanie kodu zależnego od trybu w którym została uruchomiona aplikacja, umieszczając go w klasie InitializeData w jej statycznych metodach:

class InitializeData {

       static void development() {
           //kod wykonywany dla środowiska developerskiego
       }

       static void test() {
           //kod wykonywany dla środowiska testowego
       }

       static void production() {
           //kod wykonywany dla środowiska produkcyjnego
       }
       
}

Zastosowana konstrukcja InitializeData.”$env”() służy do wywołania statycznej bezparametrowej metody o nazwie odpowiadającej wartości zmiennej env, która została zdefiniowana w klasie InitializeData

  • Digg
  • del.icio.us
  • Google
  • description
  • Technorati
  • Wykop
December 14, 2008 | |

COMMENTS

 

Trackback URI | Comments RSS

3 Responses to “Inicjalizacja danych w zależności od trybu uruchomienia aplikacji Grails”

  1. WooKasZ on December 18th, 2008 11:33 am

    Przez Twoje artykuły chyba zainteresuję się groovym :P

  2. radoslaw.holewa on December 23rd, 2008 10:21 pm

    Hej,

    naprawdę warto. Na początek szczególnie polecam książkę “Programming Groovy: Dynamic Productivity for the Java Developer”, której recenzję pewnie widziałeś już wcześniej w jednym z moich wpisów.
    Co do samego Groovy’ego to mogę Ci powiedzieć, że nie myślałem, iż istnieje język który tak bardzo by mi odpowiadał :)

  3. lukasz on December 28th, 2009 6:09 pm

    Można jeszcze dodać metodę methodMissing do klasy InitializeData, aby w przypadku nieznanego środowiska nie leciał wyjątek groovy.lang.MissingMethodExceptio

Leave a Reply