Faktor-IPS Produktdaten in der Datenbank

Auslesen der Produktdaten

Zum Auslesen der Produktdaten zur Laufzeit wird ein DbProductDataProvider zur Verfügung gestellt. Der DbProductDataProvider ist eine Implementierung von org.faktorips.runtime.productdataprovider.IProductDataProvider und bietet Zugriff auf die Produktdaten. Zusätzlich ermöglicht sie Produktdaten auf Aktualität zu prüfen und ggf. neu zu laden, wenn inzwischen neuere Daten zur Verfügung stehen.

ProductDatabase

Der Zugriff auf die Datenbank ist über die Stateless EJB ProductDatabaseBean gekapselt. Sie erhält einen EntityManager für die Persistence Unit faktorips-productdataservice-jpa per Konstruktor(-Injection). Das Business Interface ProductDatabase enthält die Methode getActiveTocVersion, die aus der Datenbank die mit dem Status ACTIVE markierte Version abruft.

Der Server muss ein Data Source mit dem JNDI Namen ips-product-data zur Verfügung stellen.

DbProductDataProviderFactory

Ein DbProductDataProvider wird über eine DbProductDataProviderFactory erstellt. Dieser benötigt neben der ProductDatabase zusätzlich den Namen und die Modell-Version (siehe Versionierung) des gewünschten Produktdaten-Projekts.

Verwendung mit DetachedContentRuntimeRepository

Sollen Produktdaten aus der Datenbank in einer Anwendung verwendet werden, wird ein DetachedContentRuntimeRepository benötigt. Dieses wiederum wird von einem DetachedContentRuntimeRepositoryManager erzeugt. Dieser kümmert sich außerdem darum, die Aktualität der Produktdaten bei jedem Abruf zu überprüfen und ggf. ein neues DetachedContentRuntimeRepository mit neuem DbProductDataProvider zur nun aktiven Produktdaten-Version zu erzeugen. Dem Builder des DetachedContentRuntimeRepositoryManager wird dazu die DbProductDataProviderFactory übergeben.

emForRepo = emFactory.createEntityManager(); (1)

DbProductDataProviderFactory productDataProviderFactory = new DbProductDataProviderFactory(tocName, "1.2.3",
        new ProductDatabaseBean(emForRepo)); (2)

IRuntimeRepositoryManager runtimeRepositoryManager = new DetachedContentRuntimeRepositoryManager.Builder(
        productDataProviderFactory).build();
IRuntimeRepository runtimeRepository = runtimeRepositoryManager.getCurrentRuntimeRepository();

testDeployedData(runtimeRepository);
1 Der EntityManager kann in einer JEE (6+) Umgebung auch per Injection gesetzt werden
2 Die Modellversion kann in der Anwendung konfiguriert werden oder zur Laufzeit aus dem Modell-TOC gelesen werden