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
-
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
-
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.
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
Auf zum Nächsten: https://de.wikipedia.org/wiki/Sache_(Recht)
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
-
http://www.datenmeister.net [Website of DatenMeister]
-
http://github.com/mbrenn/datenmeister-new [Source of 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:
-
Eine Beschreibung für den Endnutzer
-
Eine Beschreibung für den Modellierer des Datenmodells
-
Eine Beschreibung des internen Verhaltens des DatenMeisters für Entwickler
-
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
|
Abfrage per Name |
Der Uri des Extents wird über ein '?fn=' der volle Name des Objekts angehängt
|
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.
|
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.
|
Composites |
Durch Angabe des Parameter &composites= kann angegeben werden, ob die beinhaltenden Elemente mit zurückgegeben werden sollen. Hier gibt es verschiedene Werte:
Beispiel: dm:///datenbank/&composites=onlyComposites |
Filtern nach Metaklasse |
Hier kann nach einer Metaklasse gefiltert werden.
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](images/hierarchical_excel_import.png)
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.
|
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:
|
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 |
Loads the excel file and uses the excel file directly for MOF operations. Here, no importing into a temporary extent will be performed.
ExcelImportExtentLoaderConfig
Abgeleitet |
ExcelExtentLoaderConfig |
Registriert über |
DatenMeister.Excel.Integration.ExcelPlugin |
Creates a parallel extent type and loads the specific Excelfile into the extent.
ExcelReferenceExtentLoaderConfig
Abgeleitet |
ExcelExtentLoaderConfig |
Registriert über |
DatenMeister.Excel.Integration.ExcelPlugin |
Loads the excel and copies all elements from the Excel file into a temporary Extent containing a Provider called 'InMemoryProvider'. This allows fast and easy access, but writings are discarded when the extent is unloaded.
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.
|
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](images/datenmeister_detailform.png)
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:
-
TreeItemExtent ⇒ TreeItemExtentExtension
-
TreeItemDetail ⇒ TreeItemDetailExtension
Hierbei soll ein ListForm zurückgegeben werden.
Formular-Generatoren
Es gibt folgende Formular-Generatoren:
-
Für ein einzelnes Element: GetExtentFormForItem
-
Für ein einzelnes Element als DetailForm: GetDetailFormForItem
-
Für ein noch nicht-existentes Objekt einer bestimmten Meta-Klasse: GetExtentFormForItemsMetaClass
-
Für eine Liste von Items: GetListFormForCollection
-
Für eine Liste von Wurzelelementen: GetExtentFormForExtent
-
Für eine Liste von Elemente einer Eigenschaft: GetListFormForPropertyValues
Die Typen der Formular-Generatoren
Es gibt den
-
FormFinder: Sucht aus den vorhandenen Definitionen das beste Formular über die FormAssociation heraus
-
FormCreator: Erzeugt aus den verfügbaren Daten das beste Formular
-
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:
-
Die einfachen Reports (SimpleReports)
-
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:
-
Über einer ReportDefinition kann der Nutzer das Format und die Elemente des Reports definieren. Dieses ist noch nicht mit den Datenquellen gekoppelt.
-
Über die ReportInstance wird dann der eigentliche Report instanziiert. Hier werden die Datenquellen mit der Report Definition verknüpft.
![reports classes.uxf](images/reports_classes.uxf.png)
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.
-
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.
-
Ü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](images/datenmeister.web.navigation.uxf.png)
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:
Loading of the DatenMeister
At start of the DatenMeister, the configuration file DatenMeister.Settings.xmi will be loaded. The loading will usually occur before initialization of the DatenMeister engine and the standard values are described in the section Public Settings.
The following additional configuration can be set:
<xmi> <settings> <web backgroundColor='#ffeedd' /> </settings> </xmi>
Key | Description |
---|---|
web.backgroundColor |
Override of the background color of the webpages to signal special server configurations. |
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](images/datenmeister.stundenmeister.usecase.png)
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](images/datenmeister.stundenmeister.activities.png)
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
The Massimporter
The massimporter allows the import of a textfile into an extent. The textfile shall be of a CSV format, but has semikolon as separator between the fields. The first line of the importtext is an enumeration of fieldnames which are used to import the data itself.
If the import contains a field with the name 'id', this field is used first to find whether an existing field element shall be overwritten. The search will only include the current package which is selected for the massimport.
Fields having an empty data content will not be overridden.
If a new item is to be created, the item does not have any type
Here, we have an example:
id,name,prename,age 1,Brenn,Martin,42 2,Ulrich,Megator,50 3,,Ramontisch,12 4,,,30 5,Swift
Let’s assume, we are having the following dataset within the extent:
id | name | prename | age | location |
---|---|---|---|---|
2 |
Herbert |
Der Große |
12 |
null |
5 |
null |
Taylor |
28 |
USA |
3 |
Rambo |
Ramon |
23 |
Hessen |
After performing the import, the following data will be available. New or changed data is marked as bold:
id | name | prename | age | location |
---|---|---|---|---|
2 |
Ulrich |
Megator |
50 |
null |
5 |
Swift |
Taylor |
28 |
USA |
3 |
Rambo |
Ramontisch |
12 |
Hessen |
1 |
Brenn |
Martin |
42 |
null |
4 |
null |
null |
30 |
null |
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:
-
PropertyGroup mit Attribut 'TreatAsLocalProperty'
-
MSBuild-Parameter
-
Umgebungsvariablen
-
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:
Volle Auflistung unter: https://docs.microsoft.com/de-de/visualstudio/msbuild/msbuild-reserved-and-well-known-properties?view=vs-2019
-
$(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:
-
→Count()
-
→IndexOf()
-
→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"/>
-
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" />