Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.
Auszug
hidden

...

...

maxLevel2

Definition

Eine View mit Dokumenten erstellen. 

Wenn man eine View erstellen möchte, in der Dokumente angezeigt werden, reicht es nicht aus, ein virtuelles oder generisches Businessobjekt zu erstellen.

...

true

Nuclos View mit Dokumenten: Proxy-BO, data/documents, t_ud_documentfile, getByElternObjekt, getById, FileProvider, DatasourceProvider.

globe with meridians Sprache: Deutsch · English

graduation cap View mit Dokumenten erstellen

Dokumente aus dem Dateisystem in einer View anzeigen – per Proxy-BO, Datenquelle und serverseitiger Regel.

Status
colourBlue
titleTutorial
Status
colourBlue
titleAnwendungsentwickler
Status
colourGreen
titleStand: Jul 2026
Status
colourGrey
titlegilt fuer Nuclos 4.2026.x

Panel
bgColor#F4F5F7

Auf dieser Seite

Inhalt
maxLevel2
minLevel2

Warum ein Proxy-BO?

Für eine View, die Dokumente anzeigt, reicht ein virtuelles oder generisches Businessobjekt nicht: Die Dateien liegen nicht in der Datenbank, sondern im Serververzeichnis [nuclos-home]/data/documents

...

Sowohl virtuelle, als auch generische Businessobjekte können lediglich Daten aus der Datenbank anzeigen - hier sind aber nur die Namen und IDs der Dokumente hinterlegt.

...

. In der Datenbank stehen nur Name und ID.

Deshalb nutzen wir ein Proxy-BO

...

. Damit wird die View per Java-Code erzeugt, sodass wir die Dokumente aus dem Dateisystem laden können.

...

...

Hinweis
titleHinweis

Proxy-BOs lassen sich nur als Subform an ein

...

Eltern-Objekt hängen. Soll es eigenständig sein

...

,

...

braucht es ein Schreib-Proxy-BO

...

(Beispiele

...

).

Konfiguration

...

1. Proxy-BO anlegen

Erstelle über den BO-Wizard ein Proxy-BO mit

...

mindestens einem Feld für den Dokumentenanhang

...

und einer Referenz auf das

...

An dieses [eltern-objekt] wird unser Proxy-BO später als Subform angehängt.

...

Eltern-Objekt. Dabei wird automatisch ein Interface generiert,

...

das wir später implementieren

...

.

...

Image Modified

Legen Sie nun eine Datenquelle an, in der Sie die eigentliche View implementieren.

Sie können sich am Beispiel orientieren, entscheiden ist aber vor allem, dass die folgenden vier Felder vorhanden sind:

...

Proxy-BO im Wizard.

2. Datenquelle für die View

Lege eine Datenquelle an, die diese Felder liefert und per Parameter auf das Eltern-Objekt eingeschränkt werden kann:

  • elternid – Referenz auf das Eltern-Objekt
  • dokumentid – ID des Dokuments (

...

  • Tabelle t_ud_documentfile)
  • dokumentname

...

  • Name des Dokuments

...

  • (Tabelle t_ud_documentfile

...

Des Weiteren ist es wichtig, dass die Möglichkeit besteht, die Ergebnisdaten über einen Parameter auf das gegebene [eltern-objekt] einzuschränken.

...

Image Removed

Als nächstes muss nun eine Regel erstellt werden, in der das automatisch generierte Interface implementiert wird.

  • )
Image Added

Datenquelle der View.

3. Interface in einer Regel implementieren

Lege

...

über Regelwerke → Regeln (serverseitig) eine

...

Regel an

...

(am besten nach dem Interface

...

Hier müssen nun einige Methoden implementiert werden.

...

benannt). Für den Standardfall genügt getByElternObjekt(Long) – sie wird aufgerufen, wenn das Proxy-

...

BO über das Layout des

...

Eltern-Objekts angezeigt wird.

...

Alle

...

übrigen Methoden

...

dürfen null zurückgeben

...

.

Warnung
titleDownload aus dem Proxy-BO

Soll das Dokument direkt aus dem

...

Proxy-BO heruntergeladen

...

werden

...

,

...

muss

...

zusätzlich getById(..)

...

implementiert werden

...

– mit einer je Dokument eindeutigen ID.

Codeblock
languagejava

...

package org.nuclet.[nuclet];

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.nuclos.api.common.NuclosFile;
import org.nuclos.api.exception.BusinessException;
import org.nuclos.api.provider.DatasourceProvider;
import org.nuclos.api.provider.FileProvider;



public class BeispielObjektProxyImpl implements org.nuclet.[nuclet].BeispielObjektProxy{	
	/*
	 * Getter-Methode für das Eltern-Objekt.
	 * Wir nutzen den Parameter, um das Ergebnis der Datenquelle einzuschränken.
	 * Es muss immer ein neues Proxy-Objekt erstellt werden, welches mit den Daten
	 * aus der Datenquelle gefüttert wird.
	 * Alternativ können die Daten auch von einer anderen Stelle kommen (Remote-Verbindung, QueryProvider etc.).
	 * Für den Dokumentenanhang holen wir uns mit Hilfe von dokumentid und dokumentname
	 * über die Methode getDocument() die Datei aus dem Installationsverzeichnis.
	 * @param pAngebotId = Id des Eltern-Objekts.
	 * @return Alle Zeilen des Proxy-BOs, die im Eltern-Objekt angezeigt werden sollen.
	 */
	@Override
	public List<BeispielObjekt> getByElternObjekt(java.lang.Long pElternobjektId) {
		List<BeispielObjekt> result = new ArrayList<>();
		/*
		 * Setze das Verzeichnis, in dem die Datei zu finden ist.
		 */
	    File dir = new File(getHomeDir() + "/data/documents/");
	    try{
	    	/*
	    	 * Setze die Parameter für die Datenquelle und führe sie aus.
	    	 */
			Map<String, Object> params = new HashMap<>();
			params.put("elternid", pElternobjektId);
			for (Object[] row :  DatasourceProvider.run(BeispielDatenquelleDS.class, params).getRows()){
				/*
				 * Erstelle neues Proxy-BO und füttere es mit Daten.
				 */
				BeispielObjekt b = new BeispielObjekt();
				Long elternid = (Long) row[x];
				b.setElternId(elternid);
				String dokumentid = (String) row[y];
				String dokumentname = (String) row[z];
				b.setDokument(getDocument(dokumentid, dokumentname,  dir));
				/*
				 * Setze weitere Felder
				 */
				b.set...(..);
				
				result.add(b);
			}
	    } catch (BusinessException e) {
	        e.printStackTrace();
	    }
		return result;
	}
	
	/*
	 * Ermittelt das Nuclos-Installationsverzeichnis.
	 */
    private String getHomeDir() {
        String home = "";
        try {
	        Class<?> clz = Class.forName("org.nuclos.server.common.NuclosSystemParameters");
	        Method getNuclosHome = clz.getMethod("getNuclosHome");
			home = ((Path) getNuclosHome.invoke(null)).toString();
		} catch (IllegalAccessException | IllegalArgumentException
				| InvocationTargetException | ClassNotFoundException | NoSuchMethodException | SecurityException e) {
			e.printStackTrace();
		}
        return home;
    }
    
    /*
     * Suche das Dokument im gegebenen Verzeichnis, packe es in eine NuclosFile und gib
     * dieser den gegeben Namen (andernfalls würden die Dokumente in der View unter ihrer
     * ID angezeigt werden).
     * @param documentId = ID des Dokuments.
     * @param anzeigename = Gewünschter Anzeigename des Dokuments.
     * @param dir = Verzeichnis, in dem das Dokument gesucht wird.
     * @return Eine NuclosFile oder null, wenn kein passendes Dokument gefunden wurde.
     */
	private NuclosFile getDocument(String documentId, String anzeigename, File dir) throws BusinessException {
		FileFilter fileFilter = new WildcardFileFilter(documentId + ".*");
		File[] files = dir.listFiles(fileFilter);
		if (files.length == 1) {
			NuclosFile file = FileProvider.newFile(files[0]);
			file.setName(anzeigename);
			return file;
		}
		return null;
	}
	
	/*
	 * Alle anderen Methoden müssen nicht weiter implementiert werden.
	 */
	
	@Override
	public void setUser(org.nuclos.api.User user) {
	}
	@Override
	public List<BeispielObjekt> getAll() {
		return null;
	}
	@Override
	public List<java.lang.Long> getAllIds() {
		return null;
	}
	@Override
	public BeispielObjekt getById(java.lang.Long id) {
		return null;
	}
	@Override
	public List<BeispielObjekt> getByDokument(org.nuclos.api.UID pNuclosdocumentfileId) {
		return null;
	}
	@Override
	public void insert(BeispielObjekt pWeitereDokumente) throws org.nuclos.api.exception.BusinessException {
	}
	@Override
	public void update(BeispielObjekt pWeitereDokumente) throws org.nuclos.api.exception.BusinessException {
	}
	@Override
	public void delete(java.lang.Long id) throws org.nuclos.api.exception.BusinessException {
	}
	@Override
	public void commit() {
	}
	@Override
	public void rollback() {
	}
}

...

4. Ins Layout einbinden

Zuletzt das Proxy-BO

...

wie eine normale Subform ins Layout des Eltern-Objekts einfügen.

Verwandte Seiten

package Proxy Businessobjekt


Proxy-BO.

Öffnen →

gear Regeln (serverseitig)


Regeln.

Öffnen →

file cabinet Datenquellen


Datenquellen.

Öffnen →

[eltern-objekt] eingefügt werden. Das Vorgehen unterscheidet sich nicht von dem für eine "normale" Subform.