Anotačný procesor

Ciele

  1. Naučiť sa implementovať anotačný procesor.
  2. Naučiť sa používať mirrors API pre spracovanie anotácií.
  3. Naučiť sa generovať zdrojový kód počas kompilácie.

Postup

Krok 1: Príprava

Úloha 1.1

Vytvorte podprojekt orm-processor podľa špecifikácie zadania 2.

Poznámka

Nezabudnite pridať závislosť na projekt orm-processor do app-example.

Upozornenie

Pre Java 21 potrebujete pridať túto konfiguráciu v orm-processor/pom.xml:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <proc>none</proc>
        </configuration>
      </plugin>
    </plugins>
  </build>

Krok 2: Implementácia anotačného procesora

Úloha 2.1

Implementujte anotačný procesor, ktorý bude generovať SQL príkazy pre vytvorenie tabuliek pre všetky triedy označené anotáciou @Table.

Anotačný procesor musí implementovať rozhranie AbstractProcessor a byť označený anotáciou @SupportedAnnotationTypes("sk.tuke.meta.persistence.annotations.Table"). Plne kvalifikovaný názov triedy anotačného procesora musí byť uvedený v súbore META-INF/services/javax.annotation.processing.Processor v resources podprojektu processor.

Úloha 2.2

Implementujte v anotačnom procesore generovanie súboru s SQL príkazmi pre vytvorenie tabuliek pre každú triedu označenú anotáciou @Table. Generované súbory nech sú ukladané do adresára persistence v adresári s *.class súbormi spracovávaného projektu (napríklad example).

Správne vytvorenie súborov zabezpečíte pomocou metódy Filer.createResource(StandardLocation.CLASS_OUTPUT, ...).

Úloha 2.3

Implementujte generovanie Java triedy s zoznamom tried označených anotáciou @Table.

Vďaka tejto triede budete môcť načítať všetky SQL súbory pri volaní createTables() bez argumentov.

Krok 3: Načítanie SQL príkazov

Úloha 3.1

Upravte triedu ReflectivePersistenceManager tak, aby načítala SQL príkazy z generovaných súborov a vykonala v metóde createTables().

Pre načítavanie súborov z CLASSPATH môžete použiť metódu ClassLoader.getResourceAsStream().