Erster Fall: Die Rechnungen der Kunden werden nicht in der Nuclos-Datenbank gespeichert, sondern werden auf einem Drittsystem gepflegt. Dazu kann ein sogenanntes "ProxyBO" Rechnungen im Bo-Wizard erstellt werden. Damit wird ein Interface (hier: "org.nuclet.businessentity.RechnungProxy", wichtig ist das komplette Ausschreiben des Pfades, damit die Klasse aus Proxy-Implementation erkannt wird) zur Verfügung gestellt, dessen Implementation die Daten holt, bzw. schreibt:
package org.nuclet.businessentity; import java.util.*; import org.nuclos.api.exception.*; import org.nuclos.api.rule.*; public class RechnungProxyImpl implements org.nuclet.businessentity.RechnungProxy { private User user; public List<Rechnung> getByKunde(Long id) { List<Rechnung> rlist = new ArrayList<>(); // Get Rechnungen for Kunde with "id" from another source // ... // rlist.add(...) // return rlist; } public List<Rechnung> getAll() { // Get Data from another source } public List<Long> getAllIds() { // Get Data from another source } public Rechnung getById(Long id) { // Get Data from another source } public void insert(Rechnung rechnung) throws BusinessException { // Write Data to another source } public void update(Rechnung rechnung) throws BusinessException { // Write Data to another source } public void delete(Long id) throws BusinessException { // Delete Data within another source } public void commit() { } public void rollback() { } public void setUser(User user) { this.user = user; } } |
Zweiter Fall (ab Nuclos 4.16): Es soll eine Sammelbearbeitung geben, bei der die Rechnungen mehrerer Kunden auf einmal bearbeitet werden. Grundsätzlich ist das schon mit dem Standard-Proxy-Interface oben möglich. Um die Performance zu verbessern, gibt es die Option eines weiteren Interface: "org.nuclos.api.rule.CollectiveProcessingProxy" fordert die Implementierung einer zusätzlichen Methode "getForCollectiveProcessing", mit der die Rechnungen mehrerer Kunden auf einmal geholt werden können:
package org.nuclet.businessentity; import java.util.*; import org.nuclos.api.businessobject.attribute.*; import org.nuclos.api.exception.*; import org.nuclos.api.rule.*; import org.nuclos.api.*; public class RechnungProxyImpl implements org.nuclet.businessentity.RechnungProxy, CollectiveProcessingProxy { private User user; public <PK> List getForCollectiveProcessing(ForeignKeyAttribute<PK> attribute, Collection<PK> ids) { if (attribute == Rechnung.KundeId) { List ret = new ArrayList<>(); // Fetch Rechnungen für several Kunden (ids) at once // ret.add(...); // return ret; } return null; // When null is returned, the standard proxy methods (like getByKunde()) will be called } public List<Rechnung> getByKunde(Long id) { // Rest is the same as before // ... |
Bitte beachten, dass mit dem Interface "CollectiveProcessingProxy" beim Laden von abhängigen Daten immer zuerst "getForCollectiveProcessing" aufgerufen wird. Nur wenn diese Methode "null" zurück gibt, wird die Standard-Methode "getByKunde" aufgerufen (bei mehreren ids in einer Schleife). Die vollständige Bezeichnung der Methode mit Generics lautet:
<PK> List<? extends BusinessObject<PK>> getForCollectiveProcessing(ForeignKeyAttribute<PK> attribute, Collection<PK> ids); |
Schreib-ProxyBOs sind eine abgewandelte Form der ProxyBOs. Gelesen werden bei einem Schreib-ProxyBO die Daten, die in der Datenbank-View hinterlegt sind, geschrieben wird mit den Proxy-Funktionalitäten die über das Interface implementiert wurden. Ein typischer Anwendungsfall für ein Schreib-ProxyBO ist ein externes System, in dem man neue Datensätze über Webservices anlegt, die aber eine Datenbank-View zum Lesen der Datensätze bereitstellt.
package example.rest; public class ArtikelProxyImpl implements example.rest.ArtikelProxy{ private User user; public Object insert(Artikel artikel) throws org.nuclos.api.exception.BusinessException{ // Call Webservice WS myWS =... WSArtikel artikel=myWS.createArtikel(...); return artikel.getId(); } public void update(Artikel artikel) throws org.nuclos.api.exception.BusinessException{ // Call Webservice WS myWS =... myWS.updateArtikel(...); } public void commit() { } public void rollback() { } public void setUser(User user) { this.user = user; } public void delete(java.lang.Long id) throws org.nuclos.api.exception.BusinessException{} } |