Was soll denn dieses Buch?

Dieses Buch sammelt verschieden Ideen, Aspekte und Themen resultierend aus meiner täglichen Arbeit im Büro und Gedanken von zu Hause. Dieses Buch enthält natürlich keine konkreten Interna meines Arbeitgebers oder identifizierbare Anekdoten.

Fokussiert wird sich hier auf das Systems Engineering, die Modellierung von Elemeenten, Schnittstellen und Eigenschaften komplexer Systeme. Zerlegung ist die Kunst. Hierbei betrachten wir auch die großen Standards wie UML, SysML and MOF. Weiterhin gibt es hier Anforderungen, Architektur, Aufgaben, Projektmanagement und anderer bekloppeter Dinger.

Das komplette Buch ist zur besseren Verständlichkeit in deutsch geschrieben. Erreiche ich nicht das weltweite Publikum besser? Darüber habe ich lange nachgedacht, aber mich aus folgenden Gründen doch für die deutsche Sprache entschieden:

  • Ich schreibe eleganter und effizienter

  • Die Erläuterungen sind plastischer und besser verständlich

  • Es gibt ausreichend gute Übersetzungsmaschinen

Die Quelle des Buchs ist verfügbar unter The source of the book is available in Github und Pull Requests sind immer willkommen.

Aber nun…​ lass uns einfach starten!

Gute Tools

Asciidoctor

https://asciidoctor.org/

Ein Konvertierungstool um aus .adoc-Dateien ein Html zu erzeugen. Auch das Geschriebene, welches du gerade liest, ist ein .adoc-Dokument. In Kombination mit Jenkins ein einfach gutes Tool.

Jenkins

https://www.jenkins.io/

Mittlerweile das Standard-Tool der automatisierten Ausführung von Skripten, wie zum Beispiel Build-Skripte, Test-Ausführungs-Skripte oder Konvertierungs-Skripte.

Visual Studio Code

https://code.visualstudio.com/

Ein sehr populärer Editor zum Bearbeiten von Code-, Markup und Daten-Dateien welcher unter allen großen Betriebssystemen läuft. Nutze ich täglich, wenn ich nicht Rider oder Visual Studio für C# nutze.

Visual Studio

https://visualstudio.microsoft.com/de/

Das Tool für Windows-Entwicklung, allerdings für C# nutze ich persönlich den Rider.

JetBrains Rider

https://www.jetbrains.com/de-de/rider/

Ein platform-übergreifendes Tool zur C#/.Net Entwicklung unter Windows und Linux. Mein persönliches Entwicklungstool.

Kostet ein wenig Geld, aber ist in meinen Augen das Abo wert.

DotNet Benchmark

https://github.com/dotnet/BenchmarkDotNet

Gehört mit NUnit zu einer der Standard-Tools für die Bestimmung der Laufzeit von Methoden. Das Tool kümmert sich automatisch um die Analyse des Overheads und der notwendigen Wiederholraten um eine gewisse Konfidenz zu erreichen. Bevor man mit "StopWatch" sein eigenes Benchmarking aufbaut, empfehle ich eine Prüfung dieser Bibliothek.

SmartGit

https://www.syntevo.com/smartgit/

Aktuell mein Lieblings-Git-Tool. Sieht nicht hypig aus, funktioniert sehr zuverlässig und besitzt eine gute grafische Darstellung der Revisions-Logs. Insgesamt auch, wie Git halt so ist, sehr schnell.

System Engineering

Objekte

Lass uns mit den Objekten starten. In diesen Kapitel lernen wir etwas über die Schwierigkeite Dinge zu Objekten zu machen und zwar in einer Art und Weise, dass die beabsichtigte Aussage über das Objekt auch deutlich kommunizierbar ist.

Fragt man 10 verschiedene Persoenen über die Definition eines konkreten Objektes, kann man, vereinfacht gesagt, 10 verschiedene Antworten erhalten, die sich teilweise überlappen, aber auch teilweise völlig widersprechen.

Wir werden hier auch eine angemessene Definition des Terminus "Objekt" reden. Aber bevor wir das tun sollten wir darüber nachdenken, ob es überhaupt Sinn ergibt, eine Definition für das "Objekt" suchen. Wäre das Leben nicht schön, wenn wir einfach die Nicht-Definition akzeptieren und jeden mit seine eigenen Mindset denken, reden und handeln lassen.

Ja, das Leben ist schön…​ je unkonkreter, des besser…​ allerdings fangen die Schwierigkeiten an, wenn wir mit Menschen zusammenarbeiten. Für eine gute Zusammenarbeit ist es wichtig ein Objekt beschreiben zu können und man versteht, warum man ein Objekt in einer Art und Weise so beschreibt, wie man es tut und wie man es am Besten beschreiben soll und warum es für eine sachliche Diskusssion wichtig ist, ein Objekt sauber zu beschreiben und abzugrenzen.

Einige Dinge sind einfach…​ Wie ein Fahrzeug, aber selbst ein Fahrzeug kann in völlig unterschiedlichen Formen auftreten. Ist ein Auto ein Fahrzeug? Ist ein Fahrrad ein Fahrzeug oder ist ein Inline-Skater ein Fahrzeug? Oder reden wir über ein 'Eis'. Ist eine Eis zum Schlecken oder Gletscher-Eis genannt?

Was werden wir in unserem fachlichen Leben alles beschreiben wollen? Gibt es überhaupt eine Unschärfe zum privaten Leben? Während man im privaten Leben gerne mit der Ungenauigkeit auskommt und dies auch den Reiz des Zwischenmenschlichen ausmachen kann, führen Ungenauigkeiten spätestens bei der Auslieferung zu Konflikten…​ Dann ist es nämlich nicht süß, dass der andere komplett daneben lag, sondern für ein Projekt und damit dem schnöden Mammon gegebenenfalls fatal!

Zurück…​ was wollen wir eigentlich beschreiben?

  • Dinge und Sachen…​ klar!

  • Menschen, Tiere, Pflanzen…​ Würde schon sagen. Wenn man sagt, dass eine Sache einem Menschen gehört, muss klar sein, was ein Mensch ist und welche Eigenschaften er gegebenenfalls hat, da das Alter darlegt, ob dieser Mensch dies überhaupt besitzen darf.

  • Geometrische Figuren, Flächen, Volumen…​ Hört sich erstmal abstrakt an, aber das Volumen ist auch etwas, was man beschreiben muss. Oder ist es mehr eine Eigenschaft? Dazu später, aber spätestens wenn man ein Grundstück definiert, kommt man um die flächige Eigenschaft nicht drum herum.

  • Emotionen, Liebe und Gefühle…​ Wäre schön…​ Aber zu welchem Zweck im fachlichen Leben? In der Entertainmentbranche wäre es wahrscheinlich sinnig, wenn man die Wirkung eines Films messen und erfassen können

  • Handlungen, Taten…​ Nun wird es wirklich abstrakt, aber in meinen Augen ganz wichtig. Einer handelnden Person im Auftrag ist es je nach Arbeitsmodell sehr wichtig, was zu handeln ist.

  • Wetter, Schneefall, Sonnenstand…​ Ok, an Beispielen kommen wir nicht wirklich weiter.

  • …​ Es gibt hier noch ganz viele Dinge.

Wikipedia: Objekt

Nutzen wir mal Wikipedia…​ Objekt hilft eigentlich gar nicht. Hier fangen wir maximal die ersten zwei Punkte der obigen Liste, die wir beschreiben wollen.

Das Ding an sich

Hier haben wir eine Definition: Ding an sich - OK, die Definition ist so "hübsch", dass sie anstrengend ist…​ gehen wir mal weiter.

Res

Suchen wir was Anderes: Res. Gefällt mir irgendwie, holen wir das für uns Relevante heraus:

  • Eine Sache kann körperlich oder unkörperlich sein

  • Eine Sache kann beschrieben werden

  • Der Name einer Sache ist zweitrangig zu der Sache selbst

Damit kann man schon ein wenig anfangen, aber reicht mir noch nicht.

Die Sache im rechtlichen Sinne

Man denkt immer, dass im Recht viele Dinge sauber definiert sind…​ Aber das BGB ist in meinen Augen eine Besonderheit, da man hier in vielen Dingen vom gesunden Menschenverstand ausgehent. Wie ist die Sache hier definiert:

§90 BGB sagt: "Sachen im Sinne des Gesetzen sind nur körperliche Gegenstände"

Macht mich nicht glücklich, denn ich möchte ja auch Personen, nichtkörperliche Dinge, Grundstücke, Flächen, aber auch Tiere bezeichnen (§90a BGB: Tiere sind keine Sachen, sie werden nur so behandelt, wenn es kein besonderes Recht gibt).

Ach ja, das Recht…​

Die Entität - Axiom

Drehen wir den Spieß mal um. Was ergibt denn überhaupt Sinn zu beschreiben, damit man in der fachlichen Welt damit umgehen kann?

  • Das Objekt muss beschreibbar sein…​ Bekloppte Forderung, aber wichtig. Nichtbeschreibbare Phantasie-Wesen, wie Gott [Sorry], sind nicht beschreibbar und an ihnen lässt sich nur schwer arbeiten.

  • Das Objekt muss abgrenzbar sein. Das heißt, dass ganz klar ersichtlich ist, was dem Objekt zugeteilt wird und was nicht. Nur so wissen wir, ob jedes Teilelement beschrieben, übergeben oder erfasst worden ist.

Daraus entwicklen wir mal folgendes Axiom zur Objekt-Definition und nennen sie Entität. (Ich war nicht der Erste!)

Important

Eine Entität ist von außen durch seine Beschreibung abgrenzbar.

BÄNG!

Der DatenMeister

Inhalte

Dieses Dokument gibt dir einen kurzen, ungeordneten Überblick über verschiedene Aspekte des DatenMeisters.

Jedes Feature wird in einem Kapitel des Dokumentes behandelt und ist in jeweils drei Unterbereiche unterteilt:

  1. Eine Beschreibung für den Endnutzer

  2. Eine Beschreibung für den Modellierer des Datenmodells

  3. Eine Beschreibung des internen Verhaltens des DatenMeisters für Entwickler

  4. Eine Beschreibung der Software-Architektur und des Sourcecodes

Jedes Feature wird in Bezug auf diese vier Aspekte durchgegangen. Im Abschluss wird nochmals insgesamt über die SW-Architektur diskutiert.

Extents

Ein Extent ist eine Sammlung von Objekten in einem abgeschlossenen Container. Innerhalb des DatenMeister ist dies eine Datei, eine Datenbank oder eine dynamische Objektsammlung, die jeweilig über eine Konfiguration (LoaderConfig) eingeladen worden ist.

Das Auflösen (Resolving) von Objekten

Jeder UriExtent besitzt eine oder mehrere Adressen über das er gefunden werden kann.

Elemente können über eine ID abgerufen werden kann.

Das UriExtent unterstützt folgende Abfrageschema:

Typ Beschreibung

Abfrage per ID

Der Uri des Extents wird über ein '#' die Objekt-ID angehängt. Der Text hinter diesem identifiziert das Object per ID

  • dm:///datenbank/#objectid

Abfrage per Name

Der Uri des Extents wird über ein '?fn=' der volle Name des Objekts angehängt

  • dm:///datenbank/?fn=team_Frankfurt::player_1

Abfrage einer Eigenschaft

Nachdem das Element über einer der obigen Verfahren identifiziert worden ist, kann über den QueryString-Parameter 'prop' eine Eigenschaft des Objektes selektiert werden. Der Inhalt der Eigenschaft wird zurückgegeben.

  • dm:///datenbank/?fn=team_Frankfurt::player_1&prop=age

  • dm:///datenbank/?prop=age#objectid

Abfrage einer Datenansicht

Nachdem eine reflektive Auflistung (reflectiveCollection) über eines der obigen Schemas selektiert worden ist, kann dieses über eine Datenansicht modifiziert werden. Die Auflistung wird dieser Datenansicht als 'input'-Knoten übergeben.

Hinweis: Die Url der Datenansicht muss Urlcodiert übergeben werden.

  • dm:///datenbank/?fn=team_Frankfurt::player_1&prop=children&dataview=dm:///views/%23childrenView

Composites

Durch Angabe des Parameter &composites= kann angegeben werden, ob die beinhaltenden Elemente mit zurückgegeben werden sollen.

Hier gibt es verschiedene Werte:

  • includingSelf: Neben den Composite-Elementen werden die selektierten Werte werden ebenfalls zurückgegeben

  • onlyComposites: Nur die Composite-Elemente werden zurückgegeben.

  • allReferenced: Alle referenzierten Elemente werden zurückgegeben, unabhängig davon, ob diese Composite sind oder nicht.

  • allReferencedIncludingSelf: Alle referenzierten Elemente, aber auch die selektierten Elemente, werden zurückgegeben, unabhängig davon, ob diese Composite sind oder nicht.

Beispiel: dm:///datenbank/&composites=onlyComposites

Filtern nach Metaklasse

Hier kann nach einer Metaklasse gefiltert werden.

  • dm:///datenbank/?metaclass={dm:///_internal/types/#DatenMeister.Package}

  • dm:///datenbank/?metaclass=dm%3A%2F%2F%2F_internal%2Ftypes%2F%23DatenMeister.Package

Hinweis: Der Parameter in geschweiften Klammern muss url-encoded sein und ist hier nur zur klaren Darstellung nicht encodiert.

Aktionen und Aktionssammlungen

Über die Aktionen kann der Nutzer des Datenmeister eine Sequenz von Aktivitäten definieren, die im DatenMeister-Kontext ausführbar sind.

Hierzu gibt es die beiden Basisklassen: . Action . ActionSet

Jede Aktion hat folgende Eigenschaften:

Name Beschreibung

name

Name der Aktion

isDisabled

Flag, ob die Aktion deaktiviert ist und damit in der Aktionssammlung übersprungen wird.

ActionSet

Ein ActionSet (Aktionssammlung) sammelt verschiedene Aktionen.

Name Beschreibung

name

Name der Aktionssammlung

Action

Die Basisklasse Action repräsentiert eine Aktion. Allerdings muss diese Klasse abgeleitet werden, damit die Aktion konkretisiert wird.

Name Beschreibung

name

Name der Aktion

LoggingWriterAction

Schreibt einen fixen Text in das konfigurierte Logging.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

message

Nachricht, die in das Log geschrieben werden soll.

CommandExecutionAction

Führt einen Prozess aus und wartet bis der Prozess abgeschlossen worden ist.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

command

Prozess, der gestartet wird. Der Prozess wird über System.Diagnostics.Process gestartet und sollte eine ausführbare Datei bezeichnen

arguments

Argumente, die dem Prozess mitgegeben werden

workingDirectory

Das Arbeitsverzeichnis zu dem der Prozess wechseln soll. Dieser wird um die Umgebungsvariablen erweitert.

DocumentOpenAction

Öffnet das Standardprogramm, welches hinter einem bestimmmten Programm steht.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

filePath

Datei, die geöffnet werden soll.

PowershellExecutionAction

Schreibt eine Skript-Datei und führt diese dann mit Hilfe von Microsoft Powershell aus. Hierbei wird die Powershell-Instanz genutzt, welche über die normale Pfad-Variablen aufrufbar sind.

Name Beschreibung

script

Das Skript, welches ausgeführt wird.

workingDirectory

Das Arbeitsverzeichnis zu dem der Prozess wechseln soll. Dieser wird um die Umgebungsvariablen erweitert.

LoadExtentAction

Führt einen Prozess aus und wartet bis der Prozess abgeschlossen worden ist.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

configuration

Die Extent-Konfiguration, die zum Laden genutzt wird.

DropExtentAction

Löscht einen Extent aus der Datenbank.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

workspace

Workspace aus dem der Extent gelöscht werden soll.

extentUri

Uri des Extents welches gelöscht werden soll.

CreateWorkspaceAction

Erstellt einen neuen Workspace.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

workspace

Name des Workspaces welcher erzeugt werden soll.

annotation

Beschreibung des Workspaces

DropWorkspaceAction

Löscht einen Arbeitsbereich aus der Datenbank.

Neben der Eigenschaften der Klasse Action werden folgende Eigenschaften unterstützt

Name Beschreibung

workspace

Workspace aus der Datenbank gelöscht werden soll.

ClearCollectionAction

Löscht alle Elemente einer Sammlung. Dies kann ein komplettes Extent sein oder auch die Eigenschaft eines Objektes welches die Sammlung enthält.

Name Beschreibung

workspace

Der Arbeitsbereich in dem das Objekt gefunden wird. Standard ist 'Data'

path

Der Pfad, der auf eine Sammlung verweist. Dies kann ein Extent oder eine Eigenschaft eines Objektes sein

CopyElementsAction

Kopiert alle Unterelemente von einem Objekt oder Extent zu einem anderen Extent.

Abgeleitet von Action

Name Beschreibung

sourceWorkspace

Der Arbeitsbereich in dem die Quell-Elemente gefunden werden

targetWorkspace

Der Arbeitsbereich zu dem die Ziel-Elemente kopiert werden

sourcePath

Der Pfad in dem Quell-Arbeitsbereich aus dem die Elemente geholt werden.

targetPath

Der Pfad in dem die Elemente kopiert werden.

Regeln für Quell-Elemente
  • Wenn der Pfad zum Quell-Element eine ReflectiveCollection ist, werden alle Elemente dieser kopiert oder verschoben.

  • Wenn der Pfad zum Quell-Element ein Extent ist, werden alle Elemente des Extents kopiert oder verschoben.

  • Wenn der Pfad zum Quell-Element ein Objekt selbst ist, wird nur dieses kopiert oder verschoben.

Regeln für Ziel-Elemente
  • Wenn der Pfad zum Ziel-Element eine ReflectiveCollection ist, werden alle Elemente in diese kopiert oder verschoben.

  • Wenn der Pfad zum Ziel-Element ein Extent ist, werden alle Elemente in diese kopiert oder verschoben.

  • Wenn der Pfad zum Ziel-Element ein Objekt selbst ist, werden die Elemente in die Standard-Eigenschaft (meist 'packagedElement') des Elements geschoben.

ExportToXmiAction

Nimmt eine Sammlung von Objekten, kopiert diese in einen Xmi-Extent und exportiert die dahinterliegende Xml-Datei als Xml.

Name Beschreibung

sourceWorkspaceId

Definiert den Quell-Arbeitsbereich aus dem die Daten für den Export vorbereitet werden.

sourcePath

Definiert den Quell-Pfad der zum Auffinden der Daten genutzt wird.

filePath

Pfad in dem das Xmi exportiert wird.

ItemTransformationAction

Nimmt jedes einzelne Objekt des gewählten Extents und übergibt es dem Transformationsobjekt welche die Schnittstelle IItemTransformation implementiert.

Das gewählte Objekt und all seine Unterelemente (rekursiv) werden übergeben.

Name Beschreibung

metaClass

Ein optionaler Filter auf die Meta-Klassen auf die gefiltert werden kann. Nur Elemente dieser Metaklassen werden der Transformation übergeben.

runtimeClass

Der volle Name der .Net Klasse, die instanziiert wird um die gewählten Objekten dieser zu übergeben. Diese Klassen kann dann die Transformation vornehmen.

workspace

Arbeitsbereich in dem der Pfad ausgeführt wird.

path

Uri, die das Extent oder die Objekte selektiert

excludeDescendents

True, falls nur die selektierten Objekte gewählt werden sollen und nicht die darunterliegenden Unterobjekte.

Schnittstelle IItemTransformation

Diese Schnittstelle kann von den Implementierungen umgesetzt werden, die die ItemTransformation gemäß obiger Darstellung durchführen soll.

Diese besitzt folgende Methode

void TransformItem(IElement element, IElement actionConfiguration);
  • element: Beschreibt das Objekt welches transformiert wird. Dieses wird direkt bearbeitet

  • actionConfiguration: Erweiterte Konfiguration, die der Action-Instanz selbst entspricht.

SimpleReportAction

Erzeugt einen einfachen Bericht.

Name Beschreibung

workspaceId

Id des Arbeitsbereiches

path

Pfad der die Elemente identifiziert über die der Report erzeugt wird.

configuration

Konfiguration es einfachen Berichtes vom Typ SimpleReportConfiguration.

filePath

Dateipfad in dem der Report abgelegt wird. Ist kein Pfad angegeben, so wird eine temporäre Datei auf dem Desktop erzeugt.

Plugins

Phasen

BeforeBootstrapping

Bevor der MOF und UML-Extent eingeladen wird und die Workspaces for MOF und UML zur Verfügung stehen

AfterBootstrapping

Nachdem die Workspaces for MOF und UML zur Verfügung stehen

AfterInitialization

Nachdem die internen Datentypen und der Extent Manager initialisiert worden sind.

AfterLoadingOfExtents

Nachdem der ExtentManager alle aktiven Extents eingeladen hat.

Import von Excel-Dokumenten

Hierarchischer Excel Import

Über die Import-Konfiguration 'HierarchicalExcelImportSettings' unterstützt der DatenMeister den Import von Exceldokumenten, die nach folgendem Schema aufgebaut worden sind.

hierarchical excel import

Diese Tabelle wird in eine Baumstruktur mit drei Ebenen umgewandelt:

Liga
> Team
> > Spieler

Dazu dient folgende Konfiguration

ExcelLoaderConfig
Name Bedeutung

filePath

Dateiname über den importiert wird

extentUri

Uri des entstehenden Extents

workspaceId

Id des Arbeitsbereiches in dem der entstehende Extent eingefügt wird

sheetName

Name des Excel-Sheets aus dem importiert wird

hasHeader

Flag, ob die erste Spalte des Excelsheets Überschriften bezeichnet

idColumnName

Name der Spalte, die gegebenenfalls die Id beinhaltet

countRows

Anzahl der Zeilen, die einzulesen sind. Wenn 0 oder negativ wird versucht automatisch zu ermitteln wieviel Zeilen abzuarbeiten sind

countColumns

Anzahl der Spalten, die einzulesen sind. Wenn 0 oder negativ wird versucht automatisch zu ermitteln wieviel Spalten abzuarbeiten sind

offsetRow

Anzahl der Zeilen, die zuerst übersprungen werden um das Excel einzulesen. Damit muss das Excel nicht zwingend bei A1 beginnen.

offsetColumn

Anzahl der Spalten, die zuerst übersprungen werden um das Excel einzulesen. Damit muss das Excel nicht zwingend bei A1 beginnen.

ExcelHierarchicalLoaderConfig

Abgeleitet von ExcelLoaderConfig

Name Bedeutung

hierarchicalcolumns

Spalten-Definitionen, die die verschiedenen Hierarchie-Stufen beschreiben. Diese Liste von Elementen beschreibt in der Reihenfolge der Spaltentiefe welche Inhalte beschrieben werden.

ExcelHierarchicalColumnDefinition
Name Bedeutung

name

Name der Spalte. Dies ist üblicherweise die Überschrift

metaClass

MetaClass, die diese Spalte beinhaltet

property

Eigenschaft in dem die Kinder des Elements gespeichert werden. Für die letzte Spalte hat diese Eigenschaft keine Bedeutung mehr.

Öffentliche Einstellungen

Die öffentlichen Einstellungen (PublicSettings) wird über die Datei 'DatenMeister.Settings.xmi' konfiguriert, die im Verzeichnis der ausführbaren Datei (.exe) liegen muss.

Diese Datei ist eine Xmi-Datei mit einem settings-Knoten und sieht beispielhaft folgendermaßen aus:

<xmi>
    <settings
		windowTitle = "The IssueMeister"
        databasePath="%LOCALAPPDATA%/IssueMeister">
        <environmentVariable key="import_path" value="c:\import-folder" />
    </settings>
</xmi>

Folgende Eigenschaften werden unterstützt:

Name Eigenschaft

windowTitle

Name des Hauptfensters. Standardmäßig 'DatenMeister'

databasePath

Pfad in dem die Hauptkonfiguration gespeichert wird. Dies sind üblicherweise die benutzerdefinierten Typen und Formulare, aber auch die Registrierung von Workspaces und Arbeitsbereichen

isReadOnly

Flag, ob der DatenMeister im Read-Only Modus gestartet werden soll

logLocation

Definiert an welcher Stelle das Logging durchgeführt werden soll.

  • Application: Im Applikationsverzeichnis (Standard)

  • LocalAppData: Im Unterverzeichnis 'DatenMeister' der LocalAppData

  • Desktop: Direkt auf dem Desktop

  • None: Es findet kein Logging in einer Datei statt.

environmentVariable

Weitere Umgebungsvariablen können hier eingefügt werden. Diese werden ohne Präfix direkt in die Umgebungsvariablen des Prozesses eingefügt.

Es können mehrer Umgebungsvariablen angegeben werden, die folgende Eigenschaften haben können:

  • key: Name der Variable

  • value: Wert der Variablen

Umgebungsvariablen

Beim Einladen der öffentlichen Einstellungen wird der Datenbankpfad in die Umgebungsvariable "dm_databasepath" übertragen und ist damit für das Einladen der Extents verfügbar.

Weiterhin werden die Umgebungsvariablen gemäß der Eigenschaften der 'environmentVariable' übertragen.

Standard-Umgebungsvariablen

Folgende Umgebungsvariablen werden standardmäßig gesetzt unterstützt:

Name Zweck Standard

dm_ImportPath

Vorgeschlagener Import-Pfad

{Desktop}/import

dm_ReportPath

Vorgeschlagener Report-Pfad

{Desktop}/report

dm_ExportPath

Vorgeschlagener Export-Pfad

{Desktop}/export

dm_ApplicationPath

Pfad in der die Applikation ausgeführt worden ist.

---

dm_DatabasePath

Der Pfad in dem die Datenbank liegt

Gemäß der Konfiguration 'databasePath'.

Web Einstellungen

Die Einstellungen für den Webserver werden ebenfalls in der obigen Datei 'DatenMeister.Settings.xmi' definiert.

Hierzu fügt man einen Xml-Knote 'web' hinzu in dem folgende Einstellungen definiert werden:

<xmi>
    <settings>
        <!-- All the other stuff -->
        <web backgroundColor="#999999" />
    </settings>
</xmi>
Es werden folgende Konfigurationen unterstützen:
* backgroundColor: Hintergrundfarbe des Webclients

Extents

Das Laden von Extents

Konfigurationen
ExtentLoaderConfig
ExtentFileLoaderConfig

Abgeleitet

ExtentLoaderConfig

Registriert über

Abstrakte Konfiguration

ExcelExtentLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

Abstrakte Konfiguration

ExcelImportExtentLoaderConfig

Abgeleitet

ExcelExtentLoaderConfig

Registriert über

DatenMeister.Excel.Integration.ExcelPlugin

ExcelReferenceExtentLoaderConfig

Abgeleitet

ExcelExtentLoaderConfig

Registriert über

DatenMeister.Excel.Integration.ExcelPlugin

InMemoryLoaderConfig

Abgeleitet

ExtentLoaderConfig

Registriert über

DatenMeister.Integration.Integrator

XmiStorageLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

DatenMeister.Provider.XMI.XmiPlugin

XmlReferenceLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

DatenMeister.Integration.Integrator

CsvExtentLoaderConfig

Abgeleitet

ExtentFileLoaderConfig

Registriert über

DatenMeister.Provider.CSV.CsvPlugin

Datenansichten (DataViews)

Über Datenansichten erhält der Modellierer und Nutzer Zugriff auf Sammlungen von Objekten oder Instanzen von Objekten.

Die Datenansichten sind im Namespace DatenMeister.Models.Namespace definiert.

Eine Datenansicht referenziert einen Ansichtsknoten (ViewNode), der eines oder mehrere Objekte zurückgibt. Dieser Knoten können miteinander verkettet werden, damit auch komplexe Datenaggregationen möglich sind.

Wenn ein Datenknoten nur ein spezifisches Objekt repräsentiert, so ist es alleinig in der Datensammlung vorhanden.

Evaluierte Texte

Der DatenMeister bietet neben der statischen Zuordnung von Inhalten von Objekteigenschaften zu Texten auch eine Möglichkeit diese Eigenschaften mit Hilfe des Scriban Frame-Works zu evaluieren und so dynamischer die Inhalte der Objekte darstellen.

Das Scriban-Objekt {{i}} enthält das aktuelle Element, welche bearbeitet wird. Ist das aktuelle Objekt eine Person, so erhält man über "{{i.name}}"" den Namen der Person zurück. Über "Hallo {{i.prename}} {{i.name}}" begrüßt man ihn.

Das Präfix <% ist reserviert, um zukünftige Alternativen Evaluierer zu unterstützen.

Typischerweise kann die Evaluierung eines Texts über die Eigenschaft 'eval{Property}' gesteuert werden, wobei Property der Name der Eigenschaft ist, die üblicherweise die statische Zuordnung zwischen anzuzeigenden Inhalt und Objekt-Eigenschaft festlegt.

Item Name Description

i

Das Element, welches im Parser genutzt wird. Je nach Kontext kann dies ein Extent, eine Sammlung oder ein Element selbst sein.

v

Befindet sich der Parser gerade im Kontext eines Ansichtsobjektes, so enthält die Variable 'v' die Instanz des Ansicht. Dies kann zum Beispiel der Absatz sein, die Tabellen- oder Zellenbeschreibung.

Viewmode (Ansichtsmodus)

Über den Ansichtsmodus kann der Mutzer einstellen aus welcher Perspektive das aktuelle Formular (Form) identifiziert und erzeugt werden soll.

Es werden folgende Standard-Viewmodes erzeugt:

  • Default (ViewMode.Default): Dieses ist der Standard-Viewnode und kann von den Erweiterungen überschrieben werden, so dass spezielle Ansichten für spezielle Objekte oder Extents dargestellt werden können.

  • Auto Generation (ViewMode.AutoGenerate): Über diese Ansicht wird die automatische Generierung des Formulars auf der gesetzten Eigenschaften und Objekttypen erzwungen. Die Suche nach best-passenden Formularen wird nicht durchgeführt.

  • Data Manipulation (ViewMode.DataManipulation): Im Gegensatz zum Default-Viewmode werden hier keine visuellen Darstellungen des Objektes angezeigt. Über diese Ansicht soll der Nutzer die Möglichkeit erhalten das Objekt selbst zu manipulieren.

  • Switch to Automatic: Diese Option wird nur in der grafischen Darstellung angezeigt und ist kein tatsächlicher Viewmode. Durch die Selektion dieses Items versucht das System auf Grund des Extenttyps den besten Viewmode zu selektieren.

Formulare

Anforderungen

GUI-Applikation

In der Applikation gibt es folgende Darstellungsformen:

Das Hauptfenster:

  • Im Hauptfenster wählt der Nutzer ein Extent und hierbei sollen alle Items in einer Liste angezeigt werden. Hierbei können allerdings schonnach verschiedenen Sichten gefiltert werden (zum Beispiel nach bestimmten Objekttypen oder spezielle Darstellungen). Hier ist der Eingang der Ansicht eine Sammlung von Objekten.

  • Im Hauptfenster wählt der Nutzer ein Element aus und dieses soll dargestellt werden. Im ersten Tab können die Detaileigenschaften oder auch die Unterelemente dargestellt werden. Auch hier können in weiteren Unterfenstern eine Filterung von Elementen oder besondere Darstellungen erfolgen. Hier ist der Eingang der Ansicht ein einzelnes Objekt.

Das Detailfenster:

  • Klickt der Nutzer per Doppelklick auf ein Item, so wird ein Unterfenster geöffnet. Hier können auch mehrere Tabs dargestellt werden. Dieses kann unterschiedlich zum vorherigen Usecase sein. Hier ist der Eingang der Ansicht ein einzelnes Objekt.

Die Steuerelemente:

  • Wird eine Eigenschaft angezeigt, die mehrere zugeordnete Objekte haben kann, so wird eine Tabelle angezeigt. Diese Tabelle ist nicht unterteilt und besteht nicht aus Untertabellen. Hier ist der Eingang der Ansicht ein Element und eine Eigenschaft.

Ein Formular wird zu folgenden Elementen benötigt:

  • Die Elemente eines Extents =⇒ Auflistung von Elementen. Hierbei können nur Listen von Elementen angezeigt werden, da es nicht das einzelne Objekt gibt von welchem die Werte der Eigenschaften abgefragt werden können.

  • Das Objekt selbst =⇒ Die Eigenschaften des Objektes werden angezeigt.

  • Die Elemente einer Objekteigenschaft =⇒ Hierbei wird ein Objekt und die Eigenschaft übergeben. Über eine Listenansicht werden die einzelnen Elemente angezeigt.

Mit diesen Anforderungen wird für folgendes Design entschieden:

Design

Es gibt drei Arten von Hauptformularen:

  • Object Form: Dieses Formular besitzt mehrere Unterformulare und ist zur Darstellung eines einzelnen Items ausgelegt.

    • Dieses kann über ein Objekt oder eine Metaklasse abgefragt werden.

  • Collection Form: Dieses Formular bestitzt mehrere Unterformulare und ist zur Darstellung einer Sammlung von Elementen ausgelegt.

    • Dieses kann über eine Sammlung von Elementen oder ein Extent abgefragt werden.

  • Row Form: Hier werden jedes Feld in einer eigenen Zeile dargestellt.

    • Dieses kann über eine Metaklasse abgefragt werden.

  • Table Form: Hier werden viele Elemente in einer Tabelle angezeigt. Diese Elemente werden im Kontext des darzustellenden Objektes definiert.

    • Dieses kann über eine Sammlung von Objekten, eine Metaklasse oder einer Eigenschaft eines Objektes abgefragt werden.

Über den ViewMode wird festgelegt in welchem Kontext das Objekt angezeigt wird.

Form

Das Formular im Allgemeinen unterstützt folgende Eigenschaften. Alle Ableitungen haben auch diese Eigenschaften zu unterstützen.

Name Bedeutung

name

Name des Formulars

title

Titel, wie er angezeigt wird

isReadOnly

Flag, ob das Formular im schreibgeschützten Modus angezeigt wird

hideMetaInformation

Wahr, wenn im Formular nicht automatisch die Meta-Informationen eines Objektes angezeigt werden soll.

originalUri

Da das Formular bei der Anzeige geklont wird, enthält diese Eigenschaft die Url vor dem Klonvorgang.

isAutoGenerated

Wert, ob dieses Formular automatisch aus Objekt-Eigenschaften generiert worden ist.

creationProtocol

Eine Debugging-Hilfe, die darlegt, wie das Formular erstellt worden ist.

ObjectForm

Ein Objekt-Form besteht aus mehreren Unterformularen und dient zur Anzeige eines einzelnen Elements. Es ist von Form abgeleitet.

Weitere Eigenschaften:

Name Bedeutung

tab

Eine Auflistung der Unterformulare

autoTabs

Wert, ob Unterformulare automatisch generiert werden sollen

ExtentForm

Ein Extent Form ist enthält einen Satz von Formularen um ein konkretes Objekt anzuzeigen.

Das Extent Form wird prinzipiell im Hauptfenster bei der Ansicht der Elemente eines Extents genutzt oder auch wenn der Nutzer im Hauptfenster ein konkretes Objekt ausgewählt hat.

Extent Form für Package

Ein besonderes Formular ist die Listenansicht der Package-Objekte. Hier kann der Nutzer über die 'Eigenschaft' der preferredTypes festlegen, welche Klasseninstanzen bevorzugt in diesem Package angelegt werden können.

Implementierung

Die Evaluierung erfolg im FormsPlugin per FormsModificationPlugin, welcher hier ein besonderes Regelwerk enthält.

Es können sich hier verschiedene Plugins registrieren, die nachträglich nochmals ein Formular verändern dürfen.

ListForm

Das Listenformular beschreibt eine Tabelle bzw. reine Auflistung einer Sammlung von Objekten:

Name Bedeutung

property

k.A.

metaClass

k.A.

includeDescendents

k.A.

noItemsWithMetaClass

k.A.

inhibitNewItems

k.A.

inhibitDeleteItems

k.A.

defaultTypesForNewElements

k.A.

fastViewFilters

k.A.

duplicatePerType

Wert, ob das Listenitem für jeden Typ in der Liste dupliziert werden soll. Diese Eigenschaft wird für die ExtentForms genutzt, damit man die Listen pro Typ anzeigen kann.

field

Diese Auflistung enthält die Felder, die in der Liste angezeigt werden sollen. Üblicherweise sind dies die Spalten der Tabelle

sortingOrder

Die Reihenfolge in der die Items angezeigt werden sollen.

viewNode

In diesem Formular kann nochmals konkreter über eine Datenansicht gefiltert oder verändert werden. Die eigentliche Liste wird als dynamische Datensammlung input übergeben.

FormModificationPlugins

Folgende FormModificationPlugins gibt es:

PackageFormModificationPlugin

Hier werden dem UML-Type 'Package' in der Detailansicht folgende Elemente hinzugefügt: - DefaultTypeForNewElement zur Erstellung der Buttons für die Erzeugung neuer Elemente

BasicNavigationForFormsAndItemsPlugin

Hierüber werden als IDatenMeisterPlugin folgende ActionButtons den Formularen hinzugefügt:

Code Name Bedeutung

Extent.NavigateTo

View Extent

Metaclass: Management.Extent

Item.Delete

Delete Item

FormType: TreeItemDetail

Item.New

New Item

FormType: TreeItemExtent, MetaClass: Management.Extent

ExtentsList.ViewItem

View Item

FormType: TreeItemExtent

ExtentsList.DeleteItem

Delete Item

FormType: TreeItemExtent

Feldelement

Die DatenMeister Formulare unterstützen unterschiedliche Typen von Feldformularen. Dieses Kapitel enthält eine Beschreibung Dieser

FieldData

Diese Basis-Klasse stellt die generischen Eigenschaften zur Verfügung, die von jedem Feld unterstützt werden sollten.

Name Bedeutung

name

Name des Feldes und der dahinterliegenden Eigenschaft des Objektes

title

Titel, der im Formular angezeigt wird

isEnumeration

Flag, ob die Inhalte hinter der Eigenschafte eine Aufzählung sind oder ein einzelnes Element. Diese Eigenschaft wird von manchen Feldtypen zur automatischen Gestatung genutzt.

defaultValue

Falls der Wert nicht gesetzt ist, kann hier der Wert der Standard-Eigenschaft definiert werden.

isReadOnly

Flag, ob das Feld nicht beschreibbar ist.

TextFieldData

Dieses Feld drückt ein Text-Eingabefeld aus in dem der Nutzer einen freien Text eintragen kann.

Neben der Eigenschaften der FieldData werden noch folgende Eigenschaften unterstützt:

Name Bedeutung

lineHeight

Anzahl der Zeilen, die angezeigt standardmäßig angezeigt werden sollen

width

Breite in logischen Pixeln, die das Feld standardmäßig haben soll.

EvalTextFieldData

Diese Erweiterung des Textfelds unterstützt die dynamische Auswertung von Inhalten. Dies ist im besonderen relevant bei der Report-Erstellung, da hier das Format und andere Eigenschaften dynamisch ausgewertet werden können.

Neben der Eigenschaften der TextFieldData werden folgende Eigenschaften unterstützt:

Name Bedeutung

evalCellProperties

Das Skript, das zur Erstellung der Zelle ausgewertet wird.

  • Die Variable 'i' beschreibt das aktuell betrachtete Element

  • Die Variable 'c' die aktuelle Zelle. Die Eigenschaften des Zelle sind abhängig von verwendeten Report.

  • Die Variable 'r' der Zustand der aktuellen Zeile, wie sie im ListForm in der Eigenschaft 'evalRowProperties' definiert werden kann.

AnyDataFieldData
CheckboxFieldData
ActionFieldData
DateTimeFieldData
DropDownFieldData
MetaClassElementFieldData
ReferenceFieldData
SubElementFieldData

Über dieses Feld-Element kann der Nutzer einer Eigenschaft mehrere Unterelemente zuordnen. Dieses Feld drücke eine 1:n Beziehung zwischen der Eigenschaft und dessen Unterelementen aus.

Neben der Eigenschaften der FieldData werden folgende Eigenschaften unterstützt:

Name Bedeutung

isEnumeration

Wird nicht ausgewertet

isReadOnly

Flag, ob das Feld nicht beschreibbar ist.

form

Ein Listform, welches genutzt wird um das SubForm aufzubauen. Ist dieses leer, so wird die Metaklasse genutzt um das Formular aufzubauen. Ist auch die Metaklasse leer, so wird das Formular abhängig von den enthaltenen Eigenschaften erstellt.

defaultTypesForNewElements

Enthält eine Liste von Metaklassen, die genutzt wird um ein einfaches Erstellen von Items zu ermöglichen

allowOnlyExistingElements

Wahr, wenn nur Referenzen auf bestehenden Elementen erzeugt werden können sollen.

FileSelectionFieldData
FileNameFieldData
CheckboxListTaggingFieldData
NumberFieldData

Formulare finden

Wie im vorherigen Kapital beschrieben sind die Formulare von den eigentlichen Daten entkoppelt. Um das Formular, gegebenenfalls bestehend aus Unterformularen, auswählen zu können, gibt es die FormAssociation, die einen Regelsatz festlegt über den das Formular einer Liste, einem Objekt oder einen Extent zugeordnet wird.

Die Modelle

FormAssociation

In dieser Instanz der Formular-Zuordnung wird das Regelwerk festgelegt

Name Bedeutung

name

Name der Formular-Zuordnung

formType

Typ des Formulars welches zugeordnet werden kann. Die möglichen Typen finden sich in der Tabelle unten wieder

metaClass

Wenn das selektierte Objekt oder die Liste dahinter von diesem Objekttyp ist, kann diese Zurodnung ausgewählt werden

extentType

Wenn das Extent von diesem Typ ist, kann dise Zuordnung ausgewählt werden.

viewModeId

Wenn der Nutzer in dieser Ansicht ist, kann diese Zuordnung ausgewählt werden

parentMetaClass

Wenn die Elemente einer Liste ausgewählt werden und das besitzende Objekt von diesem Typ ist, kann dieses ausgewählt erden.

parentProperty

Wenn die Elemente einer Liste ausgewählt werden und sich diese Liste in dieser Eigenschaft des besitzenden Objektes befindet, kann dieses ausgewählt ewrden.

form

Dies beschreibt das Formular welches ausgewählt werden kann, wenn die Eigenschaften oben zustimmen, soweit sie gewählt sind.

Die Formulartypen
Name Bedeutung Formular

Detail

Das Formular wird für die Detail-Ansicht eines Items angezeigt.

DetailForm, ExtentForm

TreeItemExtent

Das Formular wird angezeigt wenn der Nutzer ein bestimmtes Extent ausgewählt hat und alle Elemente des Extents angezeigt werden sollen.

ExtentForm

TreeItemDetail

Das Formular wird angezeigt wenn der Nutzer ein bestimmtes Element ausgewählt hat und nun in der Baumansicht dieses Element angezeigt werden soll. Dieser typ unterscheidet sich vom Detail, dass das Fenster nicht dediziert für das Element angelegt worden ist.

ExtentForm

ObjectList

Das Formular wird angezeigt, wenn alle Elemente einer bestimmten Eigenschaft in einer Subliste (SubElementField) angezeigt werden sollen.

ListForm

TreeItemExtentExtension

Dieses Formular wird dem ExtentForm hinzugefügt, wenn die Beschreibung der Formular-Zuordnung zu dem angezeigtne Formular passt.

Listform, DetailForm

TreeItemDetailExtension

Dieses Formular wird dem ExtentForm hinzugefügt, wenn die Beschreibung der Formular-Zuordnung zu dem angezeigten Formular passt.

Listform, DetailForm

Beschreibung des Verfahren

Detailansicht

In der Detailansicht wird die Formular-Zuordnung nach folgenden Eigenschaften gesucht:

datenmeister detailform
Name Bedeutung

formType

DetailForm

metaClass

Die Meta-Klasse des Objektes welches ausgewählt worden ist.

extentType

Typen (Getrennt durch Leerzeichen) des Extents in dem sich das angezeigte Objekt befindet

Extentansicht

In der Extentansicht kann der Nutzer entweder das Extent selbst markiert haben oder ein Element im Extent.

Diese Formulartypen werden TreeItemExtent und TreeItemDetail genannt.

Für die Darstellung des gesamten Extents werden folgende Eigenschaften in der Formular-Zuordnung definiert:

Extent Basis-Formular für die Baumansicht
Name Bedeutung

formType

TreeItemExtent

extentType

Typen des anzuzeigenden Extents

viewModeId

Die vom Nuutzer ausgewählte Ansicht

Extent Listen-Formular für die Baumansicht

Das Extentform besteht aus mehreren Reitern (Tabs). Wird nun ein Reiter automatisch erzeugt, kann eine Metaklasse angegeben werden, die dann die Inhalte beinhaltet.

Name Bedeutung

formType

TreeItemExtent

extentType

Typen des anzuzeigenden Extents

metaClass

Meta-Klasse der anzuzeigenden Objekte

Extent Objekt-Formular für die Baumansicht

Selektiert der Nutzer ein Element in der Baumansicht, so wird die Formular-Zuordnung nach folgendem Schema gesucht (FormsPlugin.GetItemTreeFormForObject):

Name Bedeutung

formType

TreeItemDetail

extentType

Typen des anzuzeigenden Extents

metaClass

Meta-Klasse des anzuzeigenden Objektes

viewModeId

Die vom Nutzer ausgewählte Ansicht. Ist im Package ein ViewMode als Eigenschaft angegeben, so

Extent Objektlisten-Formular für die Baumansicht

Werden automatisch Formulare für eine Objektansicht, wird je nach Konfiguration (ConfigurationFormCreatorSeparateProperties) entweder ein ListForm für jeden Typ und jede Eigenschaft erzeugt oder ein ListForm für jede Eigenschaft, die aber dann alle Objekt-Typen enthält.

Hier zu werden folgende Eigenschaften genutzt:

Name Bedeutung

formType

TreeItemDetail

extentType

Typen des anzuzeigenden Extents

parentMetaClass

Die Meta-Klasse der Objekte die selektiert sind.

parentProperty

Der Name der Eigenschaft der Objekte.

Automatische Erweiterung der Formulare

Nachdem das Formular gefunden, gewählt und erzeugt worden ist, wird in einer weiteren Abfrage-Runde definiert ob weitere Formularehinzugefügt werden sollen.

Hierzu werden die gleichen Formular-Zurordnungen genutzt, wie oben dargestellt, allerdings mit der Änderung des Form-Types:

  1. TreeItemExtent ⇒ TreeItemExtentExtension

  2. TreeItemDetail ⇒ TreeItemDetailExtension

Hierbei soll ein ListForm zurückgegeben werden.

Formular-Generatoren

Es gibt folgende Formular-Generatoren:

  1. Für ein einzelnes Element: GetExtentFormForItem

  2. Für ein einzelnes Element als DetailForm: GetDetailFormForItem

  3. Für ein noch nicht-existentes Objekt einer bestimmten Meta-Klasse: GetExtentFormForItemsMetaClass

  4. Für eine Liste von Items: GetListFormForCollection

  5. Für eine Liste von Wurzelelementen: GetExtentFormForExtent

  6. Für eine Liste von Elemente einer Eigenschaft: GetListFormForPropertyValues

Die Typen der Formular-Generatoren

Es gibt den

  1. FormFinder: Sucht aus den vorhandenen Definitionen das beste Formular über die FormAssociation heraus

  2. FormCreator: Erzeugt aus den verfügbaren Daten das beste Formular

  3. FormFactory: Ruft zuerst den FormFinder auf, danach den FormCreator, falls das dazugehörige Formular nicht gefunden worden ist.

Zusätzlich gibt es noch die FormModifications, welche ein schon erzeugtes Formular nochmals nachträglich verändern

Reports

Prinzipiell gibt es zwei verschiedene Arten von Reports für den Nutzer:

  1. Die einfachen Reports (SimpleReports)

  2. Der vollständige Html Report (HtmlReportCreator)

Einfacher Bericht

Von jedem beliebigen Extent kann über das Auswählen des Menüs 'Create Report' ein einfacher Report über die aktuelle Ansicht generiert werden.

TODO: BILD

Alternativ kann der Nutzer eine Instanz des Elements 'SimpleRpeortConfiguration' anlegen. In der Detailansicht des Elements wird ein Knopf 'Create Report' angelegt. Über diesen kann der Nutzer dann den Extent oder das Element auswählen über den der Report erzeugt werden soll.

TODO: Bild

Es wird eine zufällige Datei auf der Festplatte erzeugt, die dann über den Standardbrowser angezeigt wird.

Konfiguration

Der einfache Bericht wird über die Konfiguration SimpleReportConfiguration eingestellt:

Name Beschreibung

name

Name der Konfiguration

rootElement

Das Wurzelelement, dessen Eigenschaften angezeigt werden sollen.

showDecendents

true, falls auch dessen Kinder angezeigt werden sollen

showRootElements

true, wenn die Wurzelelemente angezeigt werden sollen

showMetaClasses

true, falls eine Spalte automatisch eingefügt werden soll, die die Meta-Klasse der Objekte anzeigt

showFullName

true, falls eine Spalte eingefügt werden soll, die den Pfad (voller Name) zum Objekt anzeugt

form

Falls kein automatisches Formular erzeugt werden soll, kann hier ein Formular angegeben werden. Dieser muss vom Type ListForm sein.

descendentMode

None, Inline, PerPackage

typeMode

PerType, AllModes

Der DescendentMode legt fest, ob pro Package eine neue Tabelle im Bericht angelegt werden soll.

Der TypeMode legt fest, ob pro Typ eine neue Tabelle im Bericht angelegt werden soll.

Der Html Report

Ein Report wird über zwei Konfiguration definiert:

  1. Über einer ReportDefinition kann der Nutzer das Format und die Elemente des Reports definieren. Dieses ist noch nicht mit den Datenquellen gekoppelt.

  2. Über die ReportInstance wird dann der eigentliche Report instanziiert. Hier werden die Datenquellen mit der Report Definition verknüpft.

reports classes.uxf
Report Definition
Report Instance

Die Report Instance besteht aus einer Referenz zur ReportDefinition und den Quellen der Daten. Diese verbinden den Namen der Quelle zu einer Url über die der DatenMeister die Daten einliest.

Das Auflösen der Url in der Quelle erfolgt mit Hilfe des WorkspaceResolvers des dazugehörigen Arbeitsbereiches.

Definition ReportInstance:

name

Name der Reportinstanz

reportDefinition

Referenz auf die Definition des Reports

sources

Sammlung von ReportInstanceSources, die dem Nutzer pro Report erlauben unterschiedliche Quellen anzugeben.

HtmlReportInstance

Abgeleitet aus der ReportInstance und ermöglicht den Export eines Html-Dokuments aus der ReporttDefinition.

AdocReportInstance

Abgeleitet aus der ReportInstance und ermöglicht den Export eines ADoc-Dokuments aus der ReportDefinition.

ReportInstanceSource

name

Name der Quelle

url

Url um das Extent, die Sammlung oder das Objekt zu referenzieren.

ReportParagraph:

Drückt einen Absatz im Report aus. Dieser kann einen statischen Text beinhalten oder auch dynamisch über evalParagraph oder evalProperties erzeugt werden.

name Name des Elements

paragraph

Standardtext, der angezeigt wird

viewNode

Falls eine Evaluierung stattfindet, beschreibt die ViewNode-Abfrage welches Objekt selektiert wurde. Das selektierte Objekt ist über die Instanz 'i' in den Parsern verfügbar.

cssClass

CSS-Klasse der Tabelle

evalParagraph

Wird gesetzt, wenn der Absatztext dynamisch erzeugt wird.

evalProperties

Wird gesetzt, wenn über den TemplateParser die Eigenschaften der Ansicht geändert werden soll. Die Definition des Absatz selbst ist über 'v' erreichbar.

ReportTable

Beschreibt eine Tabelle, die die Elemente eines ViewNodes ausdrückt. Über eine Formulardefinition werden die Spalten der Tabelle definiert.

name Name des Elements

viewNode

Beschreibt die dynamische Abfrage, die die Elemente selektiert, die in der Tabelle angezeigt werden sollen

form

Definiert das Formular. Dieses Formular soll vom Type ListForm instanziiert sein.

cssClass

CSS-Klasse der Tabelle

evalProperties

Führt eine Evaluierung aus. Die Elemente selbst sind über 'items' abrufbar.

Tabellenzelle des EvalTextFieldData

Eine Tabellenzelle unterstützt folgende Eigenschaften:

name Name des Elements

text

Textinhalt der Zelle

cssClass

Im Falle des Html-Reports, die CSS-Klasse der Zelle

SW-API

DatenMeister.dll

Module Runtime.ExtentStorage

Prinzipiell ist der DatenMeister in der Lage mit entkoppelten Extents zu arbeiten. Dies bedeutet, dass man Extents laden kann, die ohne zentralisierte Registrierung genutzt, bearbeitet und wieder gespeichert werden können.

Der DatenMeister unterstützt aber parallel eine zentrale Registrierung über den ExtentManager, welcher das Laden, das Sperren und das abgesicherte Abspeichern bei Beendigung der Applikation unterstützt.

Es gibt damit insgesamt zwei Datenbanken in den die Extents gespeichert werden.

  1. Innerhalb der Workspaces (WorkspaceLogic.GetWorkspaces()) sind die Extents eingefügt. Hierüber können Extents im normalen Datenbankprinzip gefunden werden. Hier ist aber nicht bekannt über welchen ProviderLoader das Extent von welcher Quelle geladen worden ist.

  2. Über die Registrierung des ExtentManager (ExtentStorageData) werden geladene Extents zum Zwecke der Nachverfolgung bein Locking und Speichern gespeichert. Der ExtentManager weist auch die genutzter ProviderLoader Config dem Extent zu.

Folgende Methoden werden bei der Verwendung von Extents genutzt:

  • Beim Einladen über LoadExtent wird das Extent eingeladen und registriert. Beim Einladen wird das Extent über seinen Provider auch gesperrt.

  • Beim Entladen über DetachExtent wird das Extent deregistriert, aber nicht gespeichert. Das Extent wird über seinen Provider auch wieder entsperrt.

  • Über LoadAllExtents findet das Einladen der ExtentLoaderConfig statt, die von der vorherigen Instanz speichert, welche Extents beim Hochfahren einzuladen sind. Das Einladen erfolgt dann auch über LoadExtent und führt damit zu einer Sperrung der Extents.

  • Über StoreAllExtents findet ein Write Trigger über alle geladenen und registrierten Events statt.

  • Über DeleteExtent wird das Extent nicht nur aus der Registrierung entfernt, sondern auch aus dem Workspace genommen.

  • Über UnloadManager werden die Extents entladen und der Zugriff auf die Registrierungs-Datei komplett aufgehoben. Die Extents selbst sind noch in den Workspaces, werden aber nicht mehr über den ExtentManager nachverfolgt.

Module.Reports

Die Generierung von Reports wird von zwei Report Generatoren unterstützt:

  • SimpleReport

  • TextReport

Simple Report

Implementiert in den Klassen SimpleReportConfiguration und SimpleReportCreator

Text Report

Übersetzungen

Folgende Übersetzungen gelten zwischen dem Deutschen und dem Englischen

Deutsch Englisch

Arbeitsbereich

Workspace

Datenansicht

Dataview

Formular-Zuordnung

FormAssociation

Öffentliche Einstellung

Public Setting

Reiter

Tab

Dynamische Laufzeit Provider

Ein dynamischer Laufzeit Extent (Dynamic Runtime Provider) ist ein programmierbarer Provider, dessen Inhalte über eine Klasse erzeugt werden und nicht über eine Datenbank.

Die Klasse selbst muss über die bestehende Plugin-Infrastruktur dem DatenMeister eingeladen sein,d as s

Konfiguration

Die Konfiguration des Providers erfolgt über DynamicRuntimeLoaderConfig und enthält folgende Eigenschaften:

Name Beschreibung

name

Name des Providers

extentUri

Uri des einzuladenen Extents

workspaceId

Id des Arbeitsbereiches in dem das zugehörige Extent eingeladen wird

runtimeClass

Voller Pfad (FullName) zur Klasse, die die Elemente enthält

configuration

Konfiguration, die dann dieser Klasse übergeben wird. Der Typ dieser Konfiguration ist nicht speziell definiert.

Implementierung

Der Laufzeitprovider wird über folgende eine Schnittstelle IDynamicRuntimeProvider zur Verfügung gestellt. Diese enthält folgende Methode:

IEnumerable<IProviderObject> Get(IElement configuration)

Hierbei enthält der Parameter configuration den Konfigurationsparameter, der in der LoaderConfig über configuration festgelegt wurde. Dieser Wert kann auch null sein.

Der Laufzeitprovider gibt auf Aufruf eine Liste von Provider-Elementen zurück. Dieses können vereinfacht vom Typ InMemoryProviderObject sein.

Beispiel-Implementierungen

Modules.DynamicRuntimeProvider.NumberProvider

Nimmt eine Instanz von NumberProviderSettings auf und gibt eine Auflistung von Zahlen in Binär (binary), Oktal (octal), Dezimal (decimal) und Hexadezimal (hexadecimal) zurück.

Die Eigenschaften der Settings:

Name Beschreibung

start

Erster Wert der Auflistung. Standardwert ist 0

end

Letzter Wert der Auflistung. Standardwert ist 100

Die Web-Schnittstelle

datenmeister.web.navigation.uxf

Der Nutzer hat folgende Hauptnavigationspunkte:

  • Dashboard

  • Arbeitsbereiche

  • Daten-Arbeitsbereich

  • Einstellungen

Web-Formulare

Über das Web werden folgende zwei Formulare angefragt:

ItemsOverview.cshtml -→ DetailFormCreator
  • Hier wird die Funktion des DetailFormCreator aufgerufen.

  • Dieser ruft die Web-API forms/default_for_item auf

  • Diese ruft CreateExtentFormForItem mit dem Parameter: TreeItemDetail auf

Items.cshtml
  • Hier wird die Funktion des CollectionFormCreator aufgerufen.

  • Dieser ruft die Web-API forms/default_for_extent auf

  • Diese ruft CreateExtentFormForExtent mit dem Parameter: TreeItemExtent auf.

Web-Oberfläche

Das Hauptfenster soll folgende Bereiche beinhalten:

DatenMeister Web-API

Der DatenMeister-Web-Client kommuniziert neben den server-generierten Webseiten auch mit der Server-API, die im folgenden Absatz dokumentiert ist.

Jedes Kapitel beschreibt die API einer Datei.

Hilfsklassen

Hilfsklasse ItemWithNameAndId

Die Hilfsklasse ItemWithNameAndId (C#-Namespace DatenMeister.Json) fungiert als Transferobjeot von Web-Server zu Web-Client um ein Item ohne seine Properties als Proxy zu übergeben. Um unnötige Roundtrips zwischen Webserver und Webclient zu vermeiden, besteht das Objekt aus folgenden Eigenschaften.

  • name: Name des Objektes, wie von NamedElementMethods.GetName zurückgeliefert

  • extentUri: Uri des Extents in dem sich das Objekt befindet

  • fullName: Der volle Namen, wie von NamedElementMethods.GetFullName zurückgeliefert

  • id: Die Id des Objektes

Das Objekte ist über $"{extentUri}#{id}" vom Webserver abrufbar.

Hilfsklasse MofJsonObject

Die Hilfsklasse MofJsonObject (Über C#-Klasse MofJsonConverter generiert) fungiert als Transferobject von Web-Client zu Web-Server oder vom Web-Server zum Web-Client um ein Item mit all seinen Properties, notwendigen Meta-Informationen zu übergeben.

Dieses Objekt ist ein Json-Objekt und wird auf Client-Seite von der Methode Mof.ts::createObjectFromJson verarbeitet.

  • r: Falls das Objekt vom Server in dem jeweiligen Kontext nicht aufgelöst worden ist, so enthält diese Eigenschaft die Url des Objektes. Entspricht dem MofObjectShadow-Konzept.

  • v: Enthält ein assoziatives Array von Eigenschaftsnamen zu Wert. Ist der Wert wieder ein MofObjekt, so wird wieder ein MofJsonObject gebildet.

  • m: ItemWithNameAndId-Instanz der Metaclass des Objektes

  • u: Url des Objektes

ElementsController

Dieser Webcontroller unterscheidet sich vom Controllert 'ItemsController' darin, dass dieser Controller erweiterte Methoden beinhaltet, während der ItemsController die typischen CRUD-Methoden (Create, Read, Update, Delete) beinhaltet.

Get Name of element
  • Node: api/elements/get_name/{workspace}/{extenturi}/{itemid}

    • workspace: Arbeitsbereich des gesuchten Elements

    • extentUri: Extent des gesuchten Elements

    • itemid: Id des gesuchten Elements

  • Method: GET

  • Body: keiner

  • Return:

    • name: Name des Elements

Beschreibung:

Gibt den Namen des gewählten Elements zurück. Der Name wird über NamedElementMethods.GetName ausgewählt.

Get Name of Element (per Uri)
  • Node: api/elements/get_name/{uri}/{workspace?}

    • uri: Uri des gesuchten Elements

    • workspace: (Optional) Arbeitsbereich des gesuchten Elements

  • Method: GET

  • Body: keiner

  • Return:

    • name: Name des Elements

Beschreibung:

Gibt den Namen des gewählten Elements zurück. Der Name wird über NamedElementMethods.GetName ausgewählt. Ist kein Arbeitsbereich angegeben, so wird über die gesamte Datenbank gesucht.

Get Composites
  • Node api/elements/get_composites/{workspaceId?}/{itemUrl?}

  • Method: GET

    • workspaceId: (Optional) Name des selektierten Arbeitsbereich

    • itemUrl: (Optional) Url des selektierten Elemente

  • Body: keiner

  • Return:

    • Array von ItemWithNameAndId-Elementen. Diese enthalten Namen und Url der Elemente.

Beschreibung:

Gibt die Unterelemente des selektierten Arbeitsbereiches, bzw. des selektierten Items zurück.

Falls kein Arbeitsbereich angegeben wurde, werden die Arbeitsbereiche zurückgegeben. Falls ein Arbeitsbereich angegeben wurde, aber keine ItemUrl, so werden alle Wurzelelemente zurückgegeben, ansonsten werden die Unterelemente zurückgegeben.

ExtentController

Create new Xmi Extent
  • Node: api/extent/create_xmi/{workspace}

    • workspace: (Optional) Arbeitsbereich des gesuchten Elements

  • Method: POST

  • Body:

    • filePath: Pfad in dem das Xmi erzeugt werden soll

    • extentUri: Name des Extents welches erzeugt werden soll

  • Return:

    • success: true, falls das Extent erfolgreich erzeugt werden konnte.

Beschreibung:

Erzeugt ein neues Extent an dem angegebenen Dateipfad {filePath} unter der Extent-URL {extentUri}. Dieses Extent ist ein Standard-XMI-Extent.

Warnung: Dieses Extent wird mit den Rechten des Webservers erzeugt und daher kann man per filePath an nahezu jeder beliebigen Stelle im Dateisystem des Servers dieses Extent erzeugen.

Delete Extent
  • Node: api/extent/delete

  • Method: DELETE

  • Body:

    • workspace: Arbeitsbereich des zu löschenden Extents

    • extentUri: Name des Extents welches gelöscht werden soll

  • Return:

    • success: true, falls das Extent erfolgreich gelöscht werden konnte.

Beschreibung:

Löscht das angegebene Extent. Die dahinterliegenden Daten werden ebenfalls gelöscht.

FormsController

Get Default Form for Item
  • Node: api/forms/default_for_item/{workspaceId}/{itemUrl}/{viewMode?}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • itemUrl: Url des Items

    • viewMode: (Optional) ViewMode für den das Formular geholt werden soll

  • Method: GET

  • Body: keiner

  • Return:

    • item: Das Item als MofJson-Object.

    • metaClass: Die MetaClass des Forms als ItemWithNameAndId.

Beschreibung:

Holt das Formular zu dem selektierten Item. Ist der ViewMode ebenfalls angegeben, so wird dieser von der Formsuche betrachtet. Die Formsuche selbst läuft über die C#-Klasse FormFinder. Siehe Kapitel "Formulare finden"

Get Default Form for Extent
  • Node: api/forms/default_for_extent/{workspaceId}/{extentUrl}/{viewMode?}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • extentUrl: Url des Extents

    • viewMode: (Optional) ViewMode für den das Formular geholt werden soll

  • Method: GET

  • Body: keiner

  • Return:

    • item: Das Item als MofJson-Object.

    • metaClass: Die MetaClass des Forms als ItemWithNameAndId.

Beschreibung:

Holt das Formular zu dem selektierten Extent. Ist der ViewMode ebenfalls angegeben, so wird dieser von der Formsuche betrachtet. Die Formsuche selbst läuft über die C#-Klasse FormFinder. Siehe Kapitel "Formulare finden"

ItemsController

Create Item in Extent
  • Node: api/items/create_in_extent/{workspaceId}/{extentUri}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • extentUri: Url des Extents

  • Method: POST

  • Body:

    • metaClass: Uri der MetaClass

  • Return:

    • success: true, wenn erfolgreich

    • itemId: Id des neu erstellten Objektes

Beschreibung:

Erstellt ein neues Objekt als Wurzelobjekt im Extent. Über die MetaClass kann die Metaklasse des neu erstellten Objektes angegeben werden.

Create Item as Child
  • Node: api/items/create_child/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • itemUri: Url des Items in dem das neue Objekt als Kind erstellt wird

  • Method: POST

  • Body:

    • property: Eigenschaft in dem das Kindobjekt erstellt wird.

    • asList: true, falls das Objekte als Listeneintrag hinzugefügt werden soll. Ansonsten wird das Element als direkte Referenz hinzugefügt.

    • metaClass: Uri der MetaClass

    • properties: MofObjectAsJson welche die Eigenschaften enthält, die gesetzt werden sollen

  • Return:

    • success: true, wenn erfolgreich

    • itemId: Id des neu erstellten Objektes

Beschreibung:

Erstellt ein neues Objekt als Kind eines schon bestehendes Objektes. Über die property wird die Eigenschaft angegeben in der das Objekt gespeichert werden soll. Soll das Objekt direkt als Eigenschaft als alleiniges Eigenschaftsobjekt zugeordnet werden, kann asList als False gesetzt werden. Soll das Objekt als Listeneintrag hinzugefügt werden, dann ist asList als True zu setzen.

Über die MetaClass kann die Metaklasse des neu erstellten Objektes angegeben werden.

Delete Item
  • Node: api/items/delete_from_extent/{workspaceId}/{extentUri}/{itemId}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • extentUri: Uri des Extents

    • itemId: Id des Items in dem das neue Objekt als Kind erstellt wird

  • Method: DELETE

  • Body: keiner

  • Return:

    • success: true, wenn erfolgreich

Beschreibung:

Löscht das Objekt aus der Wurzel des Extents.

Get Root Elements
  • Node: api/items/get_root_elements/{workspaceId}/{extentUri}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • extentUri: Uri des Extents

  • Method: GET

  • Body: keiner

  • Return:

    • item: Array von MofJsonObject der Wurzelelemente

Beschreibung:

Listet alle Wurzel-Elemente des gewählten Extents aus.

Get Object
  • Node: api/items/get/{workspaceId}/{extentUri}/{item}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • extentUri: Uri des Extents

    • itemId: Id des Items in dem das neue Objekt als Kind erstellt wird

  • Method: GET

  • Body: keiner

  • Return:

    • item: MofJsonObject des gefundenen Objektes

Beschreibung:

Holt die Eigenschaften des gewählten Objektes.

Get Parents
  • Node api/items/get_container/{workspaceId}/{itemUrl}

  • Method: GET

    • workspaceId: Name des selektierten Arbeitsbereich

    • itemUrl: Url des selektierten Elemente

  • Body: keiner

  • Return:

    • Array von ItemWithNameAndId-Elementen. Das erste Element beinhaltet den direkten Container, während die weiteren Elemente jeweils dessen Container rekursiv beinhaltet.

Beschreibung:

Gibt das Container Element des selektierten Elements und dessen Container rekursiv zurück. Diese Methode endet bei dem eigentlichen Extent.

Set Property
  • Node: api/items/set_property/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • itemUri: Uri des Items in dem das neue Objekt als Kind erstellt wird

  • Method: PUT

  • Body:

    • key: Schlüssel der Eigenschaft

    • value: Wert der Eigenschaft

  • Return:

    • success: true, falls erfolgreich

Beschreibung:

Setzt eine Eigenschaft des gewählten Objektes.

Set Properties
  • Node: api/items/set_properties/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • itemUri: Uri des Items in dem das neue Objekt als Kind erstellt wird

  • Method: PUT

  • Body:

    • Array von Elementen mit folgenden Eigenschaften:

      • key: Schlüssel der Eigenschaft

      • value: Wert der Eigenschaft

  • Return:

    • success: true, falls erfolgreich

Beschreibung:

Setzt mehrere Eigenschaften des gewählten Objektes.

Set Object
  • Node: api/items/set/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem sich das Objekt befindet

    • itemUri: Uri des Items in dem das neue Objekt als Kind erstellt wird

  • Method: POST

  • Body:

    • MofJsonObject mit den Eigenschaften, die zu setzen sind.

  • Return:

    • success: true, falls erfolgreich

Get Property of Object
  • Node: api/items/get_property/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem das Objekt gefunden wird.

    • itemUri: Uri des Items wessen Eigenschaft geladen werden soll

  • Method: GET

    • property: Name der Eigenschaft, die geladen werden soll.

  • Return:

    • v: Wert der geladenen Eigenschaft als MofJsonObject. Dies kann auch ein Array von Eigenschaften sein.

Beschreibung:

Holt eine Eigenschaft eines Objektes ab.

Add Reference To List
  • Node: api/items/add_ref_to_collection/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem das Objekt gefunden wird.

    • itemUri: Uri des Items zu wessen Eigenschaft eine neue Referenz hinzugefügt werden soll.

  • Method: POST

  • Body:

    • property: Eigenschaft deren ein Objekt hinzugefügt werden soll:

    • workspaceId: Optional, der Arbeitsbereich in dem die Referenz zu finden ist.

    • referenceUri: Uri der Referenz, die hinzugefügt werden soll

  • return:

    • success: true, falls erfolgreich

Fügt eine neue Referenz zu einer Eigenschaft eines Objekts hinzu. Hierzu wird die Eigenschaft als Collection eingeladen und dann das gefundene Objekt hinzugefügt.

Remove Reference from list
  • Node: api/items/remove_ref_to_collection/{workspaceId}/{itemUri}

    • workspaceId: Name des Arbeitsbereiches in dem das Objekt gefunden wird.

    • itemUri: Uri des Items zu wessen Eigenschaft eine neue Referenz hinzugefügt werden soll.

  • Method: POST

  • Body:

    • property: Eigenschaft deren ein Objekt hinzugefügt werden soll:

    • workspaceId: Optional, der Arbeitsbereich in dem die Referenz zu finden ist.

    • referenceUri: Uri der Referenz, die entfernt werden soll

  • return:

    • success: true, falls erfolgreich

SetMetaClass
  • Node api/items/set_metaclass/{workspaceId}/{itemUrl}

  • Method: POST

    • workspaceId: Name des selektierten Arbeitsbereich

    • itemUrl: Url des selektierten Elemente

  • Body:

    • metaClassUri: Ein Link auf die neue Metaclasse

  • Return:

    • success: true, falls erfolgreich

Beschreibung:

Gibt das Container Element des selektierten Elements und dessen Container rekursiv zurück. Diese Methode endet bei dem eigentlichen Extent.

TypesController

Get all types
  • Node: api/types/all

  • Method: GET

  • Body: keiner

  • Return:

    • Array[] aller Typen. Jeder Typ ist in der Struktur ItemWithNameAndId dargestellt

Beschreibung:

Gibt eine Liste aller bekannten und selektierten Typen zurück. Hierzu wird die Methode LocalTypeSupport.GetAllTypes() genutzt.

WorkspaceController

Delete Workspaces
  • Node: api/workspace/delete

  • Method: DELETE

  • Body:

    • Workspace: Selektierter Arbeitsbereich

  • Return:

    • success: true

Beschreibung:

Löscht den selektierten Arbeitsbereich. Diese Methode löscht auch alle darin befindlichen Extents.

ZipController

Create Zip Example
  • Node: api/zip/create

  • Method: POST

  • Body:

    • Workspace: Selektierter Arbeitsbereich

  • Return:

    • success: true

    • extentUri: URI des erzeugten Beispiels

Beschreibung:

Generiert ein neues Zip-Beispiel in dem selektierten Arbeitsbereich

Der StundenplanMeister

Terminology

PeriodicEvent: An event which occurs periodically on a certain weekday.

Use Case

datenmeister.stundenmeister.usecase

The user wants to define or update periodic events to store them into a database. The task of the system is to maintain this data persistently.

The user wants to receive a report about the planned events in a 'hourplanning' like format.

DataStructure

WeeklyPeriodicEvent

Name

Name of the periodic event

Text

TimeStart

Time at which the event starts (Format is HH:MM)

Text in Format HH:MM

HoursDuration

Duration of the event in hours

Float

WeekInterval

Determines how many weeks are between two event. 1 means every week

Integer

WeekOffset

Determines how many weeks must pass before first event happens.

Integer

OnMonday

Indication, if event is on Monday

OnTuesday

Indication, if event is on Tuesday

OnWednesday

Indication, if event is on Wednesday

OnThursday

Indication, if event is on Thursday

OnFriday

Indication, if event is on Friday

OnSaturday

Indication, if event is on Saturday

Activities

datenmeister.stundenmeister.activities
Define or Update Periodic Events

The user can define a package and adds the periodic events into the database.

The extent in which the StundenPlan can be created contain the ExtentType 'StundenPlan'.

Request StundenPlan

The user can select a package and request the creation of a full StundenPlan for all items and its descendents within the package.

The report can be created by selecting a certain viewmode and by viewing the properties of a package or of an extent.

The report contains a week-overview with the hours as columns and the weekdays as rows.

Technical implementation

Create a new Assembly called 'DatenMeister.StundenPlan'. The assembly shall contain a DatenMeisterPlugin which creates a type and a form definition. This form definition is automatically loaded.

The plugin has to register a new ExtentType called 'StundenPlan'.

The plugin has to register a special viewmode which is neither a TableForm nor a RowForm.

  • The DatenMeister.WebServer itself has to be capable to handle a plugin-concept for Form Types (besides RowForm and TableForm).

  • The DatenMeister.WebServer itself has to be capable to handle additional JavaScript Files

Trainings and Cheatsheets

MS Build

  • Standard Pfad:

    C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin

Typischer Aufbau

<Project" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup></PropertyGroup>
 <ItemGroup></ItemGroup>
 <Target>
   <Message Text="Hallo" Importance="high" />
 </Target>
</Project>

Message ist eine Action, die einem 'Echo' ähnelt.

Sonderzeichen

  • %: Metadaten

  • $: Eigenschaften

  • @: Elemente

  • ': Bedingungen

  • ;: Listentrennungen

Escaping:

<Compile Include="MyFile.cs;MyClass.cs"/>  --> <Compile Include="MyFile.cs%3BMyClass.cs"/>
<Compile Include="$([MSBuild]::Escape('MyFile.cs;MyClass.cs'))" />

Typische Eigenschaften (Property)

  • Eigenschaften unterscheiden keine Groß-/Kleinschreibung

Setzen
  • Setzen über Property Group:

    <PropertyGroup>
       <BuildDir>Build</BuildDir>
    </PropertyGroup>
  • Setzen über msbuild.exe

    msbuild.exe MyProj.proj -p:BuildDir=Build
    msbuild file.proj -p:Flavor=Debug;Platform=x86
  • Property Groups können auch innerhalb des Targets definiert werden.

  • Eine Eigenschaft kann auch ein Xml-Knoten sein.

  • Priorität:

    1. PropertyGroup mit Attribut 'TreatAsLocalProperty'

    2. MSBuild-Parameter

    3. Umgebungsvariablen

    4. PropertyGroup

Lesen
  • Lesen über '$(Property)'

  • Registrierung: $(registry:Hive\MyKey\MySubKey@Value))

  • Eigenschaftenfunktionen: $([System.DateTime]::Now.ToString("yyyy.MM.dd")) - Link

Relevante Eigenschaftfunktionen:
  • Pfad-Zusammenführung: $([System.IO.Path]::Combine($(MSBuildProjectDirectory), `BuildInfo.txt`))

  • Anhängen des trailing Slashes: $([MSBuild]::EnsureTrailingSlash($(path)))

Transformieren

Basierend auf den Meta-Informationen

@(RESXFile->'%(filename).resources') -> a.resx --> a.resources
Bedingte Auswertung
  • Setzen von Standard-Werten:

    <BuildDir Condition="'$(BuildDir)' == ''">c:\tools</ToolsPath>
Vordefinierte Eigenschaften:
  • $(MSBuildProjectDirectory): Pfad der Projektdatei ohne Datei selbst

  • $(MSBuildProjectFullPath): Pfad der Projektdatei inkl. Datei

  • $(MSBuildProjectName): Name der MSBuild-Datei ohne Erweiterung.

  • $(OutputPath): Ausgabepfad von Visual Studio

Typische Elemente (Items)

Setzen

Setzen von Elementen:

<ItemGroup>
   <Compile Include = "file1.cs"/>
   <Compile Include = "file2.cs"/>
</ItemGroup>

Alternative:

<ItemGroup><Compile Include = "file1.cs;file2.cs"/></ItemGroup>

Platzhalter:

<VBFile Include="D:/**/*.vb"/>
<VBFile Include="D:/**/*.vb" Exclude="Settings.vb"/>

Mit Metadaten:

<ItemGroup>
   <CSFile Include="one.cs;two.cs">
       <Culture>Fr</Culture>
   </CSFile>
</ItemGroup>
Lesen

Lesen von Elementen

@(Compile) ==> file1.cs;file2.cs

Auswerten von Meta-Daten: Standard-Metadaten

<Target Name="Batching">
      <Message Text="@(CSFile)" Condition=" '%(Culture)' == 'Fr' "/>
</Target>

Umwandlung mit Hilfe von Meta-Daten:

@(CppFiles -> '%(Filename).obj')

Entfernen von Element (nur innerhalb eines Targets erlaubt):

<Target>
   <ItemGroup><Compile Remove="*.config"/></ItemGroup>
</Target>
Elementfunktionen:
@(Compile->IndexOf('.')) ==> 3;5 (je nach Position)

Relevante Funktionen:

  1. →Count()

  2. →IndexOf()

  3. →Replace('a', 'b')

Ziele

<Target Name="Construct">
   <Csc Sources="@(Compile)" />
</Target>
  • Ein Ziel wird maximal einmal ausgeführt

Definition und Reihenfolge von Zielen
  • Erstes Ziel: Wenn nichts angegeben wird, wird das erste Ziel ausgeführt.

  • InitialTargets: Als Attribut ins Project. Wird immer ausgeführt.

    <Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  • DefaultTargets: Wenn nichts über msbuild.exe angegeben ist, wird dies hier ausgeführt.

    <Project DefaultTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  • BeforeTargets, AfterTargets: Hierüber kann eine Reihenfolge definiert werden.

  • DependsOnTargets: Gibt die Ziele an, die davor ausgeführt werden müssen.

Standard-Ziele
  • BeforeBuild: Vor dem Bauen

  • Build: Der Standard

  • AfterBuild: Nach dem Bauen

Aufgaben

  • Schnittstelle ITask in Microsoft.Build.Framework

  • Vorimplementierung Task in Microsoft.Build.Utilities.dll

  • Importieren von neuen Tasks:

    <UsingTask TaskName="Microsoft.Build.Tasks.ResolveNativeReference" AssemblyName="Microsoft.Build.Tasks.Core" />
    <UsingTask TaskName="SimpleTask3.SimpleTask3" AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>
  • Inlineaufgaben-Definition

  • Ignorieren von Fehlern:

    <Delete Files="@(Files)" ContinueOnError="WarnAndContinue"/>
Typische Aufgaben

Nachricht an die Konsole:

<Target><Message Text="$(BuildDir)" Importance="high"/></Target>

Erzeugen eines Ordners:

<MakeDir Directories = "$(BuildDir)" Condition = "!Exists('$(BuildDir)')" />

Entfernen eines Ordners:

<RemoveDir Directories="$(BuildDir)" />

Sonstiges

  • Importieren von Elementen

    <Import Project="Other.targets" />