Nuclos generische Implementierung Tutorial: GenericBusinessObject, generisches BO, instanceof ersetzen, Regel, Nummernkreis, Summenberechnung, Mapping.

globe with meridians Sprache: Deutsch · English

graduation cap Tutorial Generische Implementierung

Praxis-Tutorial zur generischen Implementierung – ein abstraktes BO und eine Regel für viele konkrete BOs (Nummernkreise, Summenberechnung).

Auf dieser Seite

Lernziel: ein generisches Businessobjekt anlegen und eine generische Regel implementieren.
Voraussetzung: mindestens zwei Businessobjekte mit gleichartigen Feldern (z.​B. fortlaufende Nummer).

Die generische Implementierung ersetzt wiederholten, per instanceof verzweigten Regelcode durch ein abstraktes BO, das mehrere konkrete BOs gemeinsam bedient.

Beispiel 1: Nummernkreise

Mehrere BOs (Angebot, Auftrag, Lieferschein, Bestellung) erhalten bei Neuanlage eine automatische Nummer. Bisher per instanceof gelöst:

public void insert(InsertContext context) throws BusinessException {
        final Modifiable<?> businessObject = context.getBusinessObject(Modifiable.class);
        if (businessObject instanceof Angebot) {
            ((Angebot) businessObject).setAngebotsnr(NummernkreiseLogik.getNextValue(Angebot.class));
        } else if (businessObject instanceof Auftrag) {
            ((Auftrag) businessObject).setAuftragsnr(NummernkreiseLogik.getNextValue(Auftrag.class));
        } else if (businessObject instanceof Lieferschein) {
            ((Lieferschein) businessObject).setLieferscheinnr(NummernkreiseLogik.getNextValue(Lieferschein.class));
        } else if (businessObject instanceof Bestellung) {
            ((Bestellung) businessObject).setBestellnr(NummernkreiseLogik.getNextValue(Bestellung.class));
        } 
    }

1. Generisches BO anlegen

Ein neues generisches BO Nummerierbar im Businessobjekt-Wizard mit genau einem Attribut Nummer anlegen (ohne Layout/Berechtigungen) und einem Nuclet zuweisen.

Der Datentyp des generischen Attributs muss dem der Felder in den implementierenden BOs entsprechen.

2. Mapping konfigurieren

Für jedes implementierende BO einen Datensatz mit dem Attribut-Mapping (z.​B. Nummer → Auftragsnr) anlegen. Nuclos erzeugt daraus die Klasse Nummerierbar.java mit generischen Gettern/Settern:

import org.nuclos.businessentity.*; 
import org.nuclos.api.businessobject.Dependent; 
import org.nuclos.api.businessobject.Flag; 
import org.nuclos.api.UID; 
import org.nuclos.api.businessobject.GenericBusinessObject; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.HashSet; 
/**
 * BusinessObject: Nummerierbar
 *<br>
 *<br>Nuclet: org.nuclet.tulteclico
 *<br>DB-Name: [generic]
 *<br>Editable: true
 *<br>Localized: false
 *<br>Statemodel: false
**/
public class Nummerierbar implements GenericBusinessObject<Long> {
private org.nuclos.api.businessobject.BusinessObject<Long> businessObject;
public Nummerierbar(org.nuclet.tulteclico.Lieferschein businessObject) {
    this.businessObject = businessObject;
}
public Nummerierbar(org.nuclet.tulteclico.Bestellung businessObject) {
    this.businessObject = businessObject;
}
public Nummerierbar(org.nuclet.tulteclico.Auftrag businessObject) {
    this.businessObject = businessObject;
}
public Nummerierbar(org.nuclet.tulteclico.Angebot businessObject) {
    this.businessObject = businessObject;
}
public org.nuclos.api.UID getEntityUid() {
        return businessObject.getEntityUid();
}
public org.nuclos.api.businessobject.BusinessObject<Long> getBusinessObject() {
        return businessObject;
}
public java.lang.String getEntity() {
        return businessObject.getEntity();
}
public java.lang.Long getId() {
        return businessObject.getId();
}
public java.lang.Integer getVersion() {
        return businessObject.getVersion();
}
public boolean isInsert() {
        return businessObject.isInsert();
}
public boolean isUpdate() {
        return businessObject.isUpdate();
}
public boolean isDelete() {
        return businessObject.isDelete();
}
/**
 * Getter-Method for attribute: changedAt
 *<br>
 *<br>Entity: Nummerierbar
 *<br>DB-Name: DATCHANGED
 *<br>Data type: org.nuclos.common2.InternalTimestamp
 *<br>Localized: false
 *<br>Output format: null
 *<br>Scale: null
 *<br>Precision: null
**/
public java.util.Date getChangedAt() {
    // all implemented BOs:
    if (this.businessObject instanceof org.nuclet.tulteclico.Lieferschein) {
        return ((org.nuclet.tulteclico.Lieferschein) this.businessObject).getChangedAt();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Bestellung) {
        return ((org.nuclet.tulteclico.Bestellung) this.businessObject).getChangedAt();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Auftrag) {
        return ((org.nuclet.tulteclico.Auftrag) this.businessObject).getChangedAt();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Angebot) {
        return ((org.nuclet.tulteclico.Angebot) this.businessObject).getChangedAt();
    }
    // not implemented attribute:
    return null;
}
/**
 * Getter-Method for attribute: changedBy
 *<br>
 *<br>Entity: Nummerierbar
 *<br>DB-Name: STRCHANGED
 *<br>Data type: java.lang.String
 *<br>Localized: false
 *<br>Output format: null
 *<br>Scale: 255
 *<br>Precision: null
**/
public java.lang.String getChangedBy() {
    // all implemented BOs:
    if (this.businessObject instanceof org.nuclet.tulteclico.Lieferschein) {
        return ((org.nuclet.tulteclico.Lieferschein) this.businessObject).getChangedBy();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Bestellung) {
        return ((org.nuclet.tulteclico.Bestellung) this.businessObject).getChangedBy();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Auftrag) {
        return ((org.nuclet.tulteclico.Auftrag) this.businessObject).getChangedBy();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Angebot) {
        return ((org.nuclet.tulteclico.Angebot) this.businessObject).getChangedBy();
    }
    // not implemented attribute:
    return null;
}
/**
 * Getter-Method for attribute: createdAt
 *<br>
 *<br>Entity: Nummerierbar
 *<br>DB-Name: DATCREATED
 *<br>Data type: org.nuclos.common2.InternalTimestamp
 *<br>Localized: false
 *<br>Output format: null
 *<br>Scale: null
 *<br>Precision: null
**/
public java.util.Date getCreatedAt() {
    // all implemented BOs:
    if (this.businessObject instanceof org.nuclet.tulteclico.Lieferschein) {
        return ((org.nuclet.tulteclico.Lieferschein) this.businessObject).getCreatedAt();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Bestellung) {
        return ((org.nuclet.tulteclico.Bestellung) this.businessObject).getCreatedAt();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Auftrag) {
        return ((org.nuclet.tulteclico.Auftrag) this.businessObject).getCreatedAt();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Angebot) {
        return ((org.nuclet.tulteclico.Angebot) this.businessObject).getCreatedAt();
    }
    // not implemented attribute:
    return null;
}
/**
 * Getter-Method for attribute: createdBy
 *<br>
 *<br>Entity: Nummerierbar
 *<br>DB-Name: STRCREATED
 *<br>Data type: java.lang.String
 *<br>Localized: false
 *<br>Output format: null
 *<br>Scale: 255
 *<br>Precision: null
**/
public java.lang.String getCreatedBy() {
    // all implemented BOs:
    if (this.businessObject instanceof org.nuclet.tulteclico.Lieferschein) {
        return ((org.nuclet.tulteclico.Lieferschein) this.businessObject).getCreatedBy();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Bestellung) {
        return ((org.nuclet.tulteclico.Bestellung) this.businessObject).getCreatedBy();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Auftrag) {
        return ((org.nuclet.tulteclico.Auftrag) this.businessObject).getCreatedBy();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Angebot) {
        return ((org.nuclet.tulteclico.Angebot) this.businessObject).getCreatedBy();
    }
    // not implemented attribute:
    return null;
}
/**
 * Getter-Method for attribute: nummer
 *<br>
 *<br>Attribute Information:<br>
 *<br>
 *<br>Entity: Nummerierbar
 *<br>DB-Name: [generic]
 *<br>Data type: java.lang.String
 *<br>Localized: false
 *<br>Output format: null
 *<br>Scale: 255
 *<br>Precision: null
**/
public java.lang.String getNummer() {
    // all implemented BOs:
    if (this.businessObject instanceof org.nuclet.tulteclico.Lieferschein) {
        return ((org.nuclet.tulteclico.Lieferschein) this.businessObject).getLieferscheinnr();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Bestellung) {
        return ((org.nuclet.tulteclico.Bestellung) this.businessObject).getBestellnr();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Auftrag) {
        return ((org.nuclet.tulteclico.Auftrag) this.businessObject).getAuftragsnr();
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Angebot) {
        return ((org.nuclet.tulteclico.Angebot) this.businessObject).getAngebotsnr();
    }
    // not implemented attribute:
    return null;
}
/**
 * Setter-Method for attribute: nummer
 *<br>
 *<br>Attribute Information:<br>
 *<br>
 *<br>Entity: Nummerierbar
 *<br>DB-Name: [generic]
 *<br>Data type: java.lang.String
 *<br>Localized: false
 *<br>Output format: null
 *<br>Scale: 255
 *<br>Precision: null
**/
public void setNummer(java.lang.String pNummer) {
    // all implemented BOs:
    if (this.businessObject instanceof org.nuclet.tulteclico.Lieferschein) {
        ((org.nuclet.tulteclico.Lieferschein) this.businessObject).setLieferscheinnr(pNummer);
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Bestellung) {
        ((org.nuclet.tulteclico.Bestellung) this.businessObject).setBestellnr(pNummer);
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Auftrag) {
        ((org.nuclet.tulteclico.Auftrag) this.businessObject).setAuftragsnr(pNummer);
    }
    if (this.businessObject instanceof org.nuclet.tulteclico.Angebot) {
        ((org.nuclet.tulteclico.Angebot) this.businessObject).setAngebotsnr(pNummer);
    }
}
 }

3. Generische Regel

Im Server-Regelmanager eine Regel bei Neuanlage anlegen, allen implementierenden BOs zuweisen (Reihenfolge/Bedingungen wie gewohnt) und statt instanceof das generische BO aus dem Context holen:

public void insert(InsertContext context) throws BusinessException {
    Nummerierbar n = context.getBusinessObject(Nummerierbar.class);
    n.setNummer(NummernkreiseLogik.getNextValue(n.getEntityUid()));
}

Beispiel 2: Summenberechnung in Belegpositionen

Angebot, Auftrag und Rechnung haben je ein Unterformular mit Positionen und der Regel Gesamtpreis = Einzelpreis × Menge. Statt in jedem BO wird das generisch gelöst.

Zwei generische BOs

Nach dem Mapping erzeugt Nuclos die Klassen Beleg.java und Belegposition.java. Letztere mappt z.​B. getMenge() auf getPos() des jeweiligen konkreten BO und stellt getBelegposition() als Liste bereit.

Generische Regel

public void save(SaveContext context) throws BusinessException {
    Belegposition pos = context.getBusinessObject(Belegposition.class);
    BigDecimal einzel = pos.getEinzelpreis();
    Integer menge = pos.getMenge();
    if (einzel != null && menge != null) {
        pos.setGesamtpreis(einzel.multiply(new BigDecimal(menge)));
    }
}

Die Regel wird allen relevanten Positions-BOs zugewiesen – eine Implementierung genügt für alle Belegarten.

Verwandte Seiten

file cabinet Generische Implementierung


Konzept.

Öffnen →

gear Server Regelmanager


Regeln.

Öffnen →