summaryrefslogtreecommitdiff
path: root/ksm-model/doc
diff options
context:
space:
mode:
authoryvesf <yvesf-git@xapek.org>2011-05-09 23:37:38 +0200
committeryvesf <yvesf-git@xapek.org>2011-05-10 20:56:04 +0200
commitd99fac83ac0b02c2e8d1e93c18a25a3c92539726 (patch)
tree5c5fb9fe75073f0556a81201ef5d6de249d07a15 /ksm-model/doc
downloadksm-rcp-d99fac83ac0b02c2e8d1e93c18a25a3c92539726.tar.gz
ksm-rcp-d99fac83ac0b02c2e8d1e93c18a25a3c92539726.zip
Vor-Ergebnisse Studienarbeit
Diffstat (limited to 'ksm-model/doc')
-rw-r--r--ksm-model/doc/Altes Format.txt257
-rw-r--r--ksm-model/doc/KSM-Datamodel.asciidoc289
-rw-r--r--ksm-model/doc/KSM-Datamodel.html1165
-rw-r--r--ksm-model/doc/KSM-Datamodel.pdfbin0 -> 486938 bytes
-rw-r--r--ksm-model/doc/asciidoc-dblatex.sty10
-rwxr-xr-xksm-model/doc/make.sh3
6 files changed, 1724 insertions, 0 deletions
diff --git a/ksm-model/doc/Altes Format.txt b/ksm-model/doc/Altes Format.txt
new file mode 100644
index 0000000..e585a4a
--- /dev/null
+++ b/ksm-model/doc/Altes Format.txt
@@ -0,0 +1,257 @@
+KSM RCP (SA-1) Format:
+======================
+
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<diagram>
+ <connections>
+ <connection>
+ <source>1c862df6-80e5-445b-a41c-ed677973abfb</source>
+ <target>e36a0368-d8f6-40a2-bd29-375352045da8</target>
+ </connection>
+ </connections>
+ <nodes name="Node 01">
+ <id>1c862df6-80e5-445b-a41c-ed677973abfb</id>
+ <location>
+ <x>128</x>
+ <y>90</y>
+ </location>
+ <nodeProperties/>
+ </nodes>
+ <nodes name="Node 11">
+ <id>e36a0368-d8f6-40a2-bd29-375352045da8</id>
+ <location>
+ <x>531</x>
+ <y>104</y>
+ </location>
+ <nodeProperties/>
+ </nodes>
+</diagram>
+
+
+KSM/Swing Format:
+=================
+
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<KyberneticSystemModel>
+ <nodes>
+ <node>
+ <node_ID>0</node_ID>
+ <x_pos>469</x_pos>
+ <y_pos>423</y_pos>
+ <name>new_Node_0</name>
+ <comment />
+ <allowModeration>false</allowModeration>
+ <moderationsteps>1</moderationsteps>
+ <Moderation>1.0</Moderation>
+ <adaptionRate>0.2</adaptionRate>
+ <Reaction>1.0</Reaction>
+ <moderationMethod>linear</moderationMethod>
+ <color>White</color>
+ <std_height>50</std_height>
+ <std_width>220</std_width>
+ <bShowProgressBar>true</bShowProgressBar>
+ <bCustomizeNodeTransparent>false</bCustomizeNodeTransparent>
+ <bCustomizeNodeBorder>true</bCustomizeNodeBorder>
+ <iTextVerticalFactor>33</iTextVerticalFactor>
+ <sIconPath />
+ <scaleFct>
+ </scaleFct>
+ <belongsToHierarchy>0</belongsToHierarchy>
+ <hierarchyDepth>0</hierarchyDepth>
+ <useScaleFct>false</useScaleFct>
+ <inWeightEdges>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ <inWeightEdge>
+ <tupel_value>1.0</tupel_value>
+ </inWeightEdge>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ </inWeightEdges>
+ <UserValue>
+ <tupel_value>3.0</tupel_value>
+ </UserValue>
+ <MinValue>
+ <tupel_value>0.0</tupel_value>
+ </MinValue>
+ <MaxValue>
+ <tupel_value>5.0</tupel_value>
+ </MaxValue>
+ <extern>
+ <tupel_value>0.0</tupel_value>
+ </extern>
+ <scaleCoeffizient>1.0</scaleCoeffizient>
+ </node>
+ <node>
+ <node_ID>1</node_ID>
+ <x_pos>299</x_pos>
+ <y_pos>216</y_pos>
+ <name>new_Node_1</name>
+ <comment />
+ <allowModeration>false</allowModeration>
+ <moderationsteps>1</moderationsteps>
+ <Moderation>1.0</Moderation>
+ <adaptionRate>0.2</adaptionRate>
+ <Reaction>1.0</Reaction>
+ <moderationMethod>linear</moderationMethod>
+ <color>White</color>
+ <std_height>50</std_height>
+ <std_width>220</std_width>
+ <bShowProgressBar>true</bShowProgressBar>
+ <bCustomizeNodeTransparent>false</bCustomizeNodeTransparent>
+ <bCustomizeNodeBorder>true</bCustomizeNodeBorder>
+ <iTextVerticalFactor>33</iTextVerticalFactor>
+ <sIconPath />
+ <scaleFct>
+ </scaleFct>
+ <belongsToHierarchy>0</belongsToHierarchy>
+ <hierarchyDepth>0</hierarchyDepth>
+ <useScaleFct>false</useScaleFct>
+ <inWeightEdges>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ </inWeightEdges>
+ <UserValue>
+ <tupel_value>3.0</tupel_value>
+ </UserValue>
+ <MinValue>
+ <tupel_value>0.0</tupel_value>
+ </MinValue>
+ <MaxValue>
+ <tupel_value>5.0</tupel_value>
+ </MaxValue>
+ <extern>
+ <tupel_value>0.0</tupel_value>
+ </extern>
+ <scaleCoeffizient>1.0</scaleCoeffizient>
+ </node>
+ <node>
+ <node_ID>2</node_ID>
+ <x_pos>650</x_pos>
+ <y_pos>257</y_pos>
+ <name>new_Node_2</name>
+ <comment />
+ <allowModeration>false</allowModeration>
+ <moderationsteps>1</moderationsteps>
+ <Moderation>1.0</Moderation>
+ <adaptionRate>0.2</adaptionRate>
+ <Reaction>1.0</Reaction>
+ <moderationMethod>linear</moderationMethod>
+ <color>White</color>
+ <std_height>50</std_height>
+ <std_width>220</std_width>
+ <bShowProgressBar>true</bShowProgressBar>
+ <bCustomizeNodeTransparent>false</bCustomizeNodeTransparent>
+ <bCustomizeNodeBorder>true</bCustomizeNodeBorder>
+ <iTextVerticalFactor>33</iTextVerticalFactor>
+ <sIconPath />
+ <scaleFct>
+ </scaleFct>
+ <belongsToHierarchy>0</belongsToHierarchy>
+ <hierarchyDepth>0</hierarchyDepth>
+ <useScaleFct>false</useScaleFct>
+ <inWeightEdges>
+ <inWeightEdge>
+ <tupel_value>1.0</tupel_value>
+ </inWeightEdge>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ <inWeightEdge>
+ <tupel_value>0.0</tupel_value>
+ </inWeightEdge>
+ </inWeightEdges>
+ <UserValue>
+ <tupel_value>3.0</tupel_value>
+ </UserValue>
+ <MinValue>
+ <tupel_value>0.0</tupel_value>
+ </MinValue>
+ <MaxValue>
+ <tupel_value>5.0</tupel_value>
+ </MaxValue>
+ <extern>
+ <tupel_value>0.0</tupel_value>
+ </extern>
+ <scaleCoeffizient>1.0</scaleCoeffizient>
+ </node>
+ </nodes>
+ <arrows>
+ <arrow>
+ <start_node>1</start_node>
+ <end_node>0</end_node>
+ <start_pos>6</start_pos>
+ <end_pos>1</end_pos>
+ <bend_xpos>497</bend_xpos>
+ <bend_ypos>313</bend_ypos>
+ <saved>true</saved>
+ <funcType>gui.functions.FuncStraightLine</funcType>
+ <arrowfunction>
+ <m>1.0</m>
+ <b>0.0</b>
+ <position>0</position>
+ <FuncDraggingPoints>
+ <FuncDraggingPoint>
+ <moveHorz>false</moveHorz>
+ <moveVert>true</moveVert>
+ <first>true</first>
+ <last>false</last>
+ <funcPx>0.0</funcPx>
+ <funcPy>0.0</funcPy>
+ </FuncDraggingPoint>
+ <FuncDraggingPoint>
+ <moveHorz>false</moveHorz>
+ <moveVert>true</moveVert>
+ <first>false</first>
+ <last>true</last>
+ <funcPx>1.0</funcPx>
+ <funcPy>1.0</funcPy>
+ </FuncDraggingPoint>
+ </FuncDraggingPoints>
+ </arrowfunction>
+ </arrow>
+ <arrow>
+ <start_node>0</start_node>
+ <end_node>2</end_node>
+ <start_pos>3</start_pos>
+ <end_pos>8</end_pos>
+ <bend_xpos>674</bend_xpos>
+ <bend_ypos>388</bend_ypos>
+ <saved>true</saved>
+ <funcType>gui.functions.FuncStraightLine</funcType>
+ <arrowfunction>
+ <m>1.0</m>
+ <b>0.0</b>
+ <position>0</position>
+ <FuncDraggingPoints>
+ <FuncDraggingPoint>
+ <moveHorz>false</moveHorz>
+ <moveVert>true</moveVert>
+ <first>true</first>
+ <last>false</last>
+ <funcPx>0.0</funcPx>
+ <funcPy>0.0</funcPy>
+ </FuncDraggingPoint>
+ <FuncDraggingPoint>
+ <moveHorz>false</moveHorz>
+ <moveVert>true</moveVert>
+ <first>false</first>
+ <last>true</last>
+ <funcPx>1.0</funcPx>
+ <funcPy>1.0</funcPy>
+ </FuncDraggingPoint>
+ </FuncDraggingPoints>
+ </arrowfunction>
+ </arrow>
+ </arrows>
+ <hierarchies />
+</KyberneticSystemModel>
diff --git a/ksm-model/doc/KSM-Datamodel.asciidoc b/ksm-model/doc/KSM-Datamodel.asciidoc
new file mode 100644
index 0000000..1bc1634
--- /dev/null
+++ b/ksm-model/doc/KSM-Datamodel.asciidoc
@@ -0,0 +1,289 @@
+KSM Datenmodell
+===============
+Yves Fischer <i08005@ba-horb.de>
+
+:lang: de
+:doctype: book
+:toc:
+:toc-title: Inhaltsbla
+:encoding: utf-8
+:data-uri:
+
+
+Einleitung
+----------
+Mit der Entwicklung einer KSM Anwendung auf Eclipse-RCP Basis war es
+nötig ein Datenmodell zu entwerfen welches zum MVC-ähnlichen Muster
+des Eclipse Graphical Editor Framework (GEF) kompatibel ist.
+
+Grundsätzlich lassen sich alle Datenmodelle mit GEF abbilden, jedoch existierte
+in KSM/Swing nur ein stark mit der GUI und Logik verflochtenes und fehlerhaftes
+Datenmodell, dessen Serialisierung mit einer XML-Bibliothek erfolgte die nicht
+mehr weiter verwendet werden soll.
+
+Da es nicht beabsichtigt ist die KSM/Swing Anwendung auf kurze Zeit abzulösen
+liegt es nahe, dass das Datenmodell universell einsetzbar sein sollte.
+Mit der Umstellung von KSM/Swing auf ein neues Datenmodell ist einerseits
+die Daten-Kompatibiltät zwischen KSM/Swing und KSM/RCP gegeben und das
+Ziel die XML-Serialisierung in KSM/Swing zu überarbeiten kann einfacher erreicht
+werden.
+
+Dieses Dokument beschreibt die Implementation einer API zum Zugriff auf
+das in XML-Schema beschriebene Datenformat.
+
+Dieses Datenformat erlaubt es darüberhinaus freie Felder zu definieren welche
+ebenfalls in diesem Dokument spezifiert werden.
+
+Das XML-Schema
+--------------
+Die Namespace URL für das XML-Schema lautet:
+
+ http://www.ba-horb.de/~ksm/xml/ksm-1
+
+die Schemadatei ist abrufbar unter:
+
+ http://www.ba-horb.de/~ksm/xml/ksm-1.xsd
+
+Das XML-Schema ist angereichert um JAXB-Annotationen die den XML-Schema-Java-Compiler
+bei der Klassenerzeugung steuert.
+
+Typen des Datenmodell
+---------------------
+Die Bibltiohekt besteht aus einem Package in dem Interfaces die API-Beschreiben
+und einem Package mit Implementationen dieser Interfaces die jedoch für den Benutzer
+unsichtbar und daher austauschbar sind.
+
+Das folgende Diagram zeigt das Interface das dem Benutzer zur Verfügung steht:
+
+ de.dhbw.horb.ksm. xmlschema.api
+ +----------------------------------------------------------+
+ | +-------------+ +---------------+ +------------+ |
+ | |_____KSM_____| *|___NodeGroup___| *|____Node____| |
+ | |getNodeGroup +---+getNodeGroups()+---+getC.tions()| |
+ | |getVersion() | |getNodes() | | | |
+ | | | | | | | |
+ | +---^---------+ +---------------+ +--+---+-----+ |
+ | | \ | ________________/ | |
+ | | \1 |1 /1 |* |
+ | | +-+-----+-+--+ +---+--------+ |
+ | | |_Properties_|1 |_Connection_| |
+ | | |getString() +----------------+getTo() | |
+ | | |getInteger()| | | |
+ | | |...... | | | |
+ | | +------------+ +------------+ |
+ | | |
+ +----------------------------------------------------------+
+ |
+ de.dhbw.horb.ksm. xmlschema.impl
+ +-------------------------------+
+ | | |
+ | +------------------+ |
+ | |____KSMFactory____| |
+ | |createEmptyKSM() | |
+ | |saveKSM() | |
+ | |loadKSM() | |
+ | +------------------+ |
+ +-------------------------------+
+
+
+Ein Diagramm wird erstellt indem ein neues ('createEmptyKSM()') erstellt wird oder eines
+geladen wird ('loadKSM()'). Die weitere Navigation erfolgt durch Absteigen in dem
+Objekt-Baum der durch NodeGroup- und schliesslich Node-Objekte gebildet wird.
+
+Datentypen der Eigenschaften
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Im Modell gibt es die Datentypen KSM, NodeGroup, Node und Connection (siehe Klassen-Diagramm).
+Zusätzlich gibt es die Klasse Properties mit der an die Datentypen zusätzliche Eigenschaften
+mit einem Text-Bezeichner angehängt werden können.
+
+Für die Eigenschaften stehen folgende Typen zur Verfügung: ''string'', ''integer'', ''boolean'',
+''integerList'', ''decimalList'', ''stringList''. Der Datentyp erschliesst sich aus dem Namen.
+
+Prinzipiell kann jeder Bezeichner für jeden Datentyp einmal verwendet werden, ein Bezeichner sollte
+jedoch wegen der Übersichtlichkeit nur einmal verwendet werden.
+
+Verwendung der ChangeListener
+-----------------------------
+Die Klassen __NodeGroup__, __Node__ und __Properties__ implementieren Change-Listener
+auf die sich Listener-Klassen registrieren können um über Änderungen am Datenmodell
+informiert zu werden.
+
+Dies wird beispielsweise benötigt, wenn zwei Programmteile wie ein Eigenschaften-Editor
+in Tabellenform und ein grafischer Editor voneinander unabhängig auf das Datenmodell
+zugreifen und beispielsweise die Farbe eines Knoten ändern.
+
+Die Spalte 'Index' zeigt an ob das Event eine Index-Eigenschaft hat die andeutet
+welches Element in einer Liste geändert wurde.
+
+Die Spalte 'Version' zeigt an, ab welcher Version des Datenformat (=Version dieses
+Dokumentes, Version Attribut in <ksm> Element) dieser Event unterstützt wird.
+
+.__NodeGroup__-Events
+[width="80%",cols="3,2,2,10",options="header"]
+|=========================================================
+|Property-Name | Version | Index? |Beschreibung
+|nodes | 1+ | ✓ | Eine __Node__ wurde dieser __NodeGroup__
+ hinzugefügt oder entfernt
+|=========================================================
+
+.__Node__-Events
+[width="80%",cols="3,2,2,10",options="header"]
+|=========================================================
+|Property-Name | Version | Index? |Beschreibung
+|connections | 1+ | ✓ | Eine __Connection__ wurde erstellt oder gelöscht
+|=========================================================
+
+.__Properties__-Events
+[width="80%",cols="3,2,2,10",options="header"]
+|=========================================================
+|Property-Name | Version | Index? |Beschreibung
+|string: 'X' | 1+ | ✗ | Eine Zeichenketten Eigenschaft mit Name 'X' wurde geändert
+|decimal: 'X' | 1+ | ✗ | Eine Fliesskommazahl Eigenschaft mit Name 'X' wurde geändert
+|integer: 'X' | 1+ | ✗ | Eine ganzzahlige Eigenschaft mit Name 'X' wurde geändert
+|boolean: 'X' | 1+ | ✗ | Eine boolsche Eigenschaft mit Name 'X' wurde geändert
+|integerList: 'X' | 1+ | ✓ | Eine Ganzzahl Liste mit Name 'X' wurde manipuliert
+|decimalList: 'X' | 1+ | ✓ | Eine Fliesskommazahl Liste mit Name 'X' wurde manipuliert
+|stringList: 'X' | 1+ | ✓ | Eine Zeichenketten Liste mit Name 'X' wurde manipuliert
+|=========================================================
+
+Eigenschaften (Properties)
+--------------------------
+Allen Elementen im Datenmodell lassen sich dynamische, dass heist nicht in einem
+Schema festgelegte, Eigenschaften zuwiesen.
+Dies hat zur Folge, dass eine Anwendung sowohl den Fall handhaben muss, dass eine
+erwartete Eigenschaft nicht vorhanden ist als auch, dass Eigenschaften vorhanden sind
+die unbekannt sind und ignoriert werden müssen.
+Dazu steht der Anwendung jedoch das Attribut 'Version' im Schema (siehe KSM#getVersion())
+zur Verfügung, welches auf eine Version von diesem Dokument zeigt.
+
+Dieser Ansatz wurde gewählt, da sich gezeigt hat, dass die Studienarbeiten im KSM-Projekt
+einen begrenzten Fokus haben und es daher für einen einzelnen Studenten schwer möglich ist,
+alle benötigten Datenfelder zu definieren.
+Das bisherige KSM-Datenformat handhabt dies, indem das XML-Schema beliebig verändert
+wurde und damit sinnlos wurde.
+Da dies unvermeidbar ist wird es mit diesem Ansatz aktiv unterstützt.
+
+Eine alternative Herangehensweise wäre die Verwendung von verschiedenen XML-Schemas gewesen
+wobei mit jeder Erweiterung ein zusätzlicher Namensraum eingeführt wird. Dies
+schien jedoch sehr viel umständlicher und unnötig kompliziert.
+
+Eigenschaften von Modellen (KSM)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Die Spalte 'Typ' zeigt den Datentyp der Eigenschaft an. Die Spalte 'Schlüssel'
+den Bezeichner welcher in Kombination mit dem Typ eindeutig ist.
+
+Die Spalte 'Version' zeigt an, ab welcher Version des Datenformat (=Version dieses
+Dokumentes, Version Attribut in <ksm> Element) dieser Event unterstützt wird.
+
+.KSM Properties
+[width="80%",cols="3,4,2,10",options="header"]
+|=========================================================
+|Typ | Schlüssel | Version | Beschreibung
+|nichts | ist | definiert | -
+|=========================================================
+
+Eigenschaften von Knoten (Node)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.Node Properties
+[width="80%",cols="3,4,1,10",options="header"]
+|=========================================================
+|Typ | Schlüssel | Ver. | Beschreibung
+| string | visual.caption | 1+ | Titel der Node im Editor.
+| string | visual.color | 1+ | Farbliches Merkmal der Node
+ Hexadezimal im 8-Bit RGB Format
+ wie folgt: +#RRGGBB+.
+| integer | visual.location.x | 1+ | X-Position relativ zur übergeordneten NodeGroup
+| integer | visual.location.y | 1+ | Y-Position relativ zur übergeordneten NodeGroup
+| decimal | data.user_value | 1+ | User Value (?)
+| decimal | data.min_value | 1+ | Minimal Value (?)
+| decimal | data.max_value | 1+ | Maximal Value (?)
+| decimal | data.extern | 1+ | Extern Value (?)
+|=========================================================
+
+Als Erbe aus dem KSM/Swing Projekt kann ''visual.color'' die folgenden Werte
+annehmen, diese sollen auf den folgenden RGB-Wert übertragen werden:
+
+ * +White+ -> +#ffffff+
+ * +Light Yellow+ -> +#faffa2+
+ * +Medium Yellow+ -> +#f4ff4b+
+ * +Yellow+ -> +#edfc00+
+ * +Light Blue+ -> +#d4d5e9+
+ * +Medium Blue+ -> +#7678ff+
+ * +Blue+ -> +#0002f8+
+ * +Light Green+ -> +#c8f8c9+
+ * +Medium Green+ -> +#7afa7e+
+ * +Green+ -> +#1af520+
+ * +Light Red+ -> +#fdcccc+
+ * +Medium Red+ -> +#f95959+
+ * +Red+ -> +#f62020+
+
+Eigenschaften von Verbindungen (Connection)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.Connection Properties
+[width="80%",cols="3,4,1,10",options="header"]
+|=========================================================
+|Typ | Schlüssel | Ver. | Beschreibung
+| string | visual.caption | 1+ | Titel der Connection im Editor.
+| string | visual.color | 1+ | Farbliches Merkmal der Connection
+| string | data.functionType | 1+ | Ein Funktionstyp von:
+ 'straight-line', 'individual',
+ 'parable', 'parabolic-sections'.
+| decimalList | data.function | 1+ | KSM-Simulator Funktionsparameter dieses Knoten
+|=========================================================
+''data.function'' enthält eine Liste von Argumenten für die verwendete, durch ''data.functionType''
+festgelegte Funktion.
+
+Eigenschaften von Gruppen (NodeGroup)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.NodeGroup Properties
+[width="80%",cols="3,4,1,10",options="header"]
+|=============================================================
+| Typ | Schlüssel | Ver. | Beschreibung
+| string | visual.caption | 1+ | Titel der Group im Editor.
+| string | visual.color | 1+ | Farbliches Merkmal der Group
+| integer | visual.location.x | 1+ | X-Position relativ zu übergeordneten NodeGroup
+| integer | visual.location.y | 1+ | Y-Position relativ zu übergeordneten NodeGroup
+|=============================================================
+
+
+Dokumentation der Implementierung
+---------------------------------
+Das am Anfang vorgestellte Objektmodell wird durch Interfaces im Package
+'de.dhbw.horb.ksm. xmlschema.api' umgesetzt.
+
+Eine Implementierung dieser Interfaces findet sich im Package
+'de.dhbw.horb.ksm. xmlschema.impl'. Von dieser Implementierung ist für
+äusseren Zugriff nur die Klasse 'KSMFactory' vorgesehen, welche Methoden
+zum Laden und Speichern von KSM-Modellen zur Verfügung stellt.
+
+Die Implementierung benutzt vom XML-Schema-Compiler (xjc) von JAXB generierte
+Klassen die im Package 'de.dhbw.horb.ksm. xmlschema.generated' liegen.
+Das generieren wird vom Ant-Task 'compile-xjc' und Annotationen im Schema gesteuert.
+
+Der Zugriff auf das geladene Modell erfolgt auschliesslich über die in den Interfaces
+vorgesehen Methoden, ein direkter Zugriff ist nicht möglich.
+
+Neben dem Quellcode in src/ gibt es im Projektverzeichniss noch das Verzeichnis test/
+welches JUnit-4 Tests enthält die die Implementierung nahezu 100% abdecken. Die
+Tests sind dabei zum Teil im Stil des Behavior Driven Development (BDD) geschrieben unter
+Zuhilfename der Bibliothek mockito.
+
+Vorgehensweise bei Änderungen
+-----------------------------
+1. Eintragung der Änderung in diesem Dokument
+2. Erhöhen der Versionszahl
+3. Erstellen eines Eintrags in der Revisions Historie in diesem Dokument
+4. Anpassen der Versionszahl in build.xml 'project.version'
+5. Erstellen einer HTML- und PDF Version von diesem Dokument (asciidoc/a2x).
+
+Revisions Historie
+------------------
+.Revisions
+[width="80%",cols="1,3,4,10",options="header"]
+|=========================================================
+| Ver. | Datum | Person | Änderung
+| 1 | 2011-03-24 | Yves Fischer | Beginn der Historie, KSM Version 1
+| 1 | 2011-04-26 | Fischer, Dreher | Erläuterung Datentypen.
+ Festlegung Funktionsname/Parameter von
+ Connection's.
+|========================================================= \ No newline at end of file
diff --git a/ksm-model/doc/KSM-Datamodel.html b/ksm-model/doc/KSM-Datamodel.html
new file mode 100644
index 0000000..de607e2
--- /dev/null
+++ b/ksm-model/doc/KSM-Datamodel.html
@@ -0,0 +1,1165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 8.5.2" />
+<title>KSM Datenmodell</title>
+<style type="text/css">
+/* Debug borders */
+p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
+/*
+ border: 1px solid red;
+*/
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+tt {
+ color: navy;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ font-family: sans-serif;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+
+div.sectionbody {
+ font-family: serif;
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+
+pre {
+ padding: 0;
+ margin: 0;
+}
+
+span#author {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+span#email {
+}
+span#revnumber, span#revdate, span#revremark {
+ font-family: sans-serif;
+}
+
+div#footer {
+ font-family: sans-serif;
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+div#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+div#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+div#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #dddddd;
+ color: #777777;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > div.content {
+ white-space: pre;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-family: sans-serif;
+ font-weight: bold;
+}
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overriden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+
+@media print {
+ div#footer-badges { display: none; }
+}
+
+div#toc {
+ margin-bottom: 2.5em;
+}
+
+div#toctitle {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+/* Workarounds for IE6's broken and incomplete CSS2. */
+
+div.sidebar-content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+div.sidebar-title, div.image-title {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 0.0em;
+ margin-bottom: 0.5em;
+}
+
+div.listingblock div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock-attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock-content {
+ white-space: pre;
+}
+div.verseblock-attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+
+div.exampleblock-content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+/* IE6 sets dynamically generated links as visited. */
+div#toc a:visited { color: blue; }
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+window.onload = function(){asciidoc.footnotes();}
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ var cont = document.getElementById("content");
+ var noteholder = document.getElementById("footnotes");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+}
+
+}
+/*]]>*/
+</script>
+</head>
+<body>
+<div id="header">
+<h1>KSM Datenmodell</h1>
+<span id="author">Yves Fischer</span><br />
+<span id="email"><tt>&lt;<a href="mailto:i08005@ba-horb.de">i08005@ba-horb.de</a>&gt;</tt></span><br />
+</div>
+<div id="content">
+<h2 id="_einleitung">Einleitung</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Mit der Entwicklung einer KSM Anwendung auf Eclipse-RCP Basis war es
+nötig ein Datenmodell zu entwerfen welches zum MVC-ähnlichen Muster
+des Eclipse Graphical Editor Framework (GEF) kompatibel ist.</p></div>
+<div class="paragraph"><p>Grundsätzlich lassen sich alle Datenmodelle mit GEF abbilden, jedoch existierte
+in KSM/Swing nur ein stark mit der GUI und Logik verflochtenes und fehlerhaftes
+Datenmodell, dessen Serialisierung mit einer XML-Bibliothek erfolgte die nicht
+mehr weiter verwendet werden soll.</p></div>
+<div class="paragraph"><p>Da es nicht beabsichtigt ist die KSM/Swing Anwendung auf kurze Zeit abzulösen
+liegt es nahe, dass das Datenmodell universell einsetzbar sein sollte.
+Mit der Umstellung von KSM/Swing auf ein neues Datenmodell ist einerseits
+die Daten-Kompatibiltät zwischen KSM/Swing und KSM/RCP gegeben und das
+Ziel die XML-Serialisierung in KSM/Swing zu überarbeiten kann einfacher erreicht
+werden.</p></div>
+<div class="paragraph"><p>Dieses Dokument beschreibt die Implementation einer API zum Zugriff auf
+das in XML-Schema beschriebene Datenformat.</p></div>
+<div class="paragraph"><p>Dieses Datenformat erlaubt es darüberhinaus freie Felder zu definieren welche
+ebenfalls in diesem Dokument spezifiert werden.</p></div>
+</div>
+<h2 id="_das_xml_schema">Das XML-Schema</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Die Namespace URL für das XML-Schema lautet:</p></div>
+<div class="literalblock">
+<div class="content">
+<pre><tt>http://www.ba-horb.de/~ksm/xml/ksm-1</tt></pre>
+</div></div>
+<div class="paragraph"><p>die Schemadatei ist abrufbar unter:</p></div>
+<div class="literalblock">
+<div class="content">
+<pre><tt>http://www.ba-horb.de/~ksm/xml/ksm-1.xsd</tt></pre>
+</div></div>
+<div class="paragraph"><p>Das XML-Schema ist angereichert um JAXB-Annotationen die den XML-Schema-Java-Compiler
+bei der Klassenerzeugung steuert.</p></div>
+</div>
+<h2 id="_typen_des_datenmodell">Typen des Datenmodell</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Die Bibltiohekt besteht aus einem Package in dem Interfaces die API-Beschreiben
+und einem Package mit Implementationen dieser Interfaces die jedoch für den Benutzer
+unsichtbar und daher austauschbar sind.</p></div>
+<div class="paragraph"><p>Das folgende Diagram zeigt das Interface das dem Benutzer zur Verfügung steht:</p></div>
+<div class="literalblock">
+<div class="content">
+<pre><tt>de.dhbw.horb.ksm. xmlschema.api
++----------------------------------------------------------+
+| +-------------+ +---------------+ +------------+ |
+| |_____KSM_____| *|___NodeGroup___| *|____Node____| |
+| |getNodeGroup +---+getNodeGroups()+---+getC.tions()| |
+| |getVersion() | |getNodes() | | | |
+| | | | | | | |
+| +---^---------+ +---------------+ +--+---+-----+ |
+| | \ | ________________/ | |
+| | \1 |1 /1 |* |
+| | +-+-----+-+--+ +---+--------+ |
+| | |_Properties_|1 |_Connection_| |
+| | |getString() +----------------+getTo() | |
+| | |getInteger()| | | |
+| | |...... | | | |
+| | +------------+ +------------+ |
+| | |
++----------------------------------------------------------+
+ |
+de.dhbw.horb.ksm. xmlschema.impl
++-------------------------------+
+| | |
+| +------------------+ |
+| |____KSMFactory____| |
+| |createEmptyKSM() | |
+| |saveKSM() | |
+| |loadKSM() | |
+| +------------------+ |
++-------------------------------+</tt></pre>
+</div></div>
+<div class="paragraph"><p>Ein Diagramm wird erstellt indem ein neues (<em>createEmptyKSM()</em>) erstellt wird oder eines
+geladen wird (<em>loadKSM()</em>). Die weitere Navigation erfolgt durch Absteigen in dem
+Objekt-Baum der durch NodeGroup- und schliesslich Node-Objekte gebildet wird.</p></div>
+<h3 id="_datentypen_der_eigenschaften">Datentypen der Eigenschaften</h3><div style="clear:left"></div>
+<div class="paragraph"><p>Im Modell gibt es die Datentypen KSM, NodeGroup, Node und Connection (siehe Klassen-Diagramm).
+Zusätzlich gibt es die Klasse Properties mit der an die Datentypen zusätzliche Eigenschaften
+mit einem Text-Bezeichner angehängt werden können.</p></div>
+<div class="paragraph"><p>Für die Eigenschaften stehen folgende Typen zur Verfügung: <em>'string</em>', <em>'integer</em>', <em>'boolean</em>',
+<em>'integerList</em>', <em>'decimalList</em>', <em>'stringList</em>'. Der Datentyp erschliesst sich aus dem Namen.</p></div>
+<div class="paragraph"><p>Prinzipiell kann jeder Bezeichner für jeden Datentyp einmal verwendet werden, ein Bezeichner sollte
+jedoch wegen der Übersichtlichkeit nur einmal verwendet werden.</p></div>
+</div>
+<h2 id="_verwendung_der_changelistener">Verwendung der ChangeListener</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Die Klassen <em>NodeGroup</em>, <em>Node</em> und <em>Properties</em> implementieren Change-Listener
+auf die sich Listener-Klassen registrieren können um über Änderungen am Datenmodell
+informiert zu werden.</p></div>
+<div class="paragraph"><p>Dies wird beispielsweise benötigt, wenn zwei Programmteile wie ein Eigenschaften-Editor
+in Tabellenform und ein grafischer Editor voneinander unabhängig auf das Datenmodell
+zugreifen und beispielsweise die Farbe eines Knoten ändern.</p></div>
+<div class="paragraph"><p>Die Spalte <em>Index</em> zeigt an ob das Event eine Index-Eigenschaft hat die andeutet
+welches Element in einer Liste geändert wurde.</p></div>
+<div class="paragraph"><p>Die Spalte <em>Version</em> zeigt an, ab welcher Version des Datenformat (=Version dieses
+Dokumentes, Version Attribut in &lt;ksm&gt; Element) dieser Event unterstützt wird.</p></div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 1. <em>NodeGroup</em>-Events</caption>
+<col width="17%" />
+<col width="11%" />
+<col width="11%" />
+<col width="58%" />
+<thead>
+<tr>
+<th align="left" valign="top">Property-Name </th>
+<th align="left" valign="top"> Version </th>
+<th align="left" valign="top"> Index? </th>
+<th align="left" valign="top">Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">nodes</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✓</p></td>
+<td align="left" valign="top"><p class="table">Eine <em>Node</em> wurde dieser <em>NodeGroup</em>
+ hinzugefügt oder entfernt</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 2. <em>Node</em>-Events</caption>
+<col width="17%" />
+<col width="11%" />
+<col width="11%" />
+<col width="58%" />
+<thead>
+<tr>
+<th align="left" valign="top">Property-Name </th>
+<th align="left" valign="top"> Version </th>
+<th align="left" valign="top"> Index? </th>
+<th align="left" valign="top">Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">connections</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✓</p></td>
+<td align="left" valign="top"><p class="table">Eine <em>Connection</em> wurde erstellt oder gelöscht</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 3. <em>Properties</em>-Events</caption>
+<col width="17%" />
+<col width="11%" />
+<col width="11%" />
+<col width="58%" />
+<thead>
+<tr>
+<th align="left" valign="top">Property-Name </th>
+<th align="left" valign="top"> Version </th>
+<th align="left" valign="top"> Index? </th>
+<th align="left" valign="top">Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">string: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✗</p></td>
+<td align="left" valign="top"><p class="table">Eine Zeichenketten Eigenschaft mit Name <em>X</em> wurde geändert</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimal: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✗</p></td>
+<td align="left" valign="top"><p class="table">Eine Fliesskommazahl Eigenschaft mit Name <em>X</em> wurde geändert</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">integer: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✗</p></td>
+<td align="left" valign="top"><p class="table">Eine ganzzahlige Eigenschaft mit Name <em>X</em> wurde geändert</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">boolean: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✗</p></td>
+<td align="left" valign="top"><p class="table">Eine boolsche Eigenschaft mit Name <em>X</em> wurde geändert</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">integerList: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✓</p></td>
+<td align="left" valign="top"><p class="table">Eine Ganzzahl Liste mit Name <em>X</em> wurde manipuliert</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimalList: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✓</p></td>
+<td align="left" valign="top"><p class="table">Eine Fliesskommazahl Liste mit Name <em>X</em> wurde manipuliert</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">stringList: <em>X</em></p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">✓</p></td>
+<td align="left" valign="top"><p class="table">Eine Zeichenketten Liste mit Name <em>X</em> wurde manipuliert</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<h2 id="_eigenschaften_properties">Eigenschaften (Properties)</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Allen Elementen im Datenmodell lassen sich dynamische, dass heist nicht in einem
+Schema festgelegte, Eigenschaften zuwiesen.
+Dies hat zur Folge, dass eine Anwendung sowohl den Fall handhaben muss, dass eine
+erwartete Eigenschaft nicht vorhanden ist als auch, dass Eigenschaften vorhanden sind
+die unbekannt sind und ignoriert werden müssen.
+Dazu steht der Anwendung jedoch das Attribut <em>Version</em> im Schema (siehe KSM#getVersion())
+zur Verfügung, welches auf eine Version von diesem Dokument zeigt.</p></div>
+<div class="paragraph"><p>Dieser Ansatz wurde gewählt, da sich gezeigt hat, dass die Studienarbeiten im KSM-Projekt
+einen begrenzten Fokus haben und es daher für einen einzelnen Studenten schwer möglich ist,
+alle benötigten Datenfelder zu definieren.
+Das bisherige KSM-Datenformat handhabt dies, indem das XML-Schema beliebig verändert
+wurde und damit sinnlos wurde.
+Da dies unvermeidbar ist wird es mit diesem Ansatz aktiv unterstützt.</p></div>
+<div class="paragraph"><p>Eine alternative Herangehensweise wäre die Verwendung von verschiedenen XML-Schemas gewesen
+wobei mit jeder Erweiterung ein zusätzlicher Namensraum eingeführt wird. Dies
+schien jedoch sehr viel umständlicher und unnötig kompliziert.</p></div>
+<h3 id="_eigenschaften_von_modellen_ksm">Eigenschaften von Modellen (KSM)</h3><div style="clear:left"></div>
+<div class="paragraph"><p>Die Spalte <em>Typ</em> zeigt den Datentyp der Eigenschaft an. Die Spalte <em>Schlüssel</em>
+den Bezeichner welcher in Kombination mit dem Typ eindeutig ist.</p></div>
+<div class="paragraph"><p>Die Spalte <em>Version</em> zeigt an, ab welcher Version des Datenformat (=Version dieses
+Dokumentes, Version Attribut in &lt;ksm&gt; Element) dieser Event unterstützt wird.</p></div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 4. KSM Properties</caption>
+<col width="15%" />
+<col width="21%" />
+<col width="10%" />
+<col width="52%" />
+<thead>
+<tr>
+<th align="left" valign="top">Typ </th>
+<th align="left" valign="top"> Schlüssel </th>
+<th align="left" valign="top"> Version </th>
+<th align="left" valign="top"> Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">nichts</p></td>
+<td align="left" valign="top"><p class="table">ist</p></td>
+<td align="left" valign="top"><p class="table">definiert</p></td>
+<td align="left" valign="top"><p class="table">-</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<h3 id="_eigenschaften_von_knoten_node">Eigenschaften von Knoten (Node)</h3><div style="clear:left"></div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 5. Node Properties</caption>
+<col width="16%" />
+<col width="22%" />
+<col width="5%" />
+<col width="55%" />
+<thead>
+<tr>
+<th align="left" valign="top">Typ </th>
+<th align="left" valign="top"> Schlüssel </th>
+<th align="left" valign="top"> Ver. </th>
+<th align="left" valign="top"> Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">visual.caption</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Titel der Node im Editor.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">visual.color</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Farbliches Merkmal der Node
+ Hexadezimal im 8-Bit RGB Format
+ wie folgt: <tt>#RRGGBB</tt>.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">integer</p></td>
+<td align="left" valign="top"><p class="table">visual.location.x</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">X-Position relativ zur übergeordneten NodeGroup</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">integer</p></td>
+<td align="left" valign="top"><p class="table">visual.location.y</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Y-Position relativ zur übergeordneten NodeGroup</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimal</p></td>
+<td align="left" valign="top"><p class="table">data.user_value</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">User Value (?)</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimal</p></td>
+<td align="left" valign="top"><p class="table">data.min_value</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Minimal Value (?)</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimal</p></td>
+<td align="left" valign="top"><p class="table">data.max_value</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Maximal Value (?)</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimal</p></td>
+<td align="left" valign="top"><p class="table">data.extern</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Extern Value (?)</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="paragraph"><p>Als Erbe aus dem KSM/Swing Projekt kann <em>'visual.color</em>' die folgenden Werte
+annehmen, diese sollen auf den folgenden RGB-Wert übertragen werden:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<tt>White</tt> &#8594; <tt>#ffffff</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Light Yellow</tt> &#8594; <tt>#faffa2</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Medium Yellow</tt> &#8594; <tt>#f4ff4b</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Yellow</tt> &#8594; <tt>#edfc00</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Light Blue</tt> &#8594; <tt>#d4d5e9</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Medium Blue</tt> &#8594; <tt>#7678ff</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Blue</tt> &#8594; <tt>#0002f8</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Light Green</tt> &#8594; <tt>#c8f8c9</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Medium Green</tt> &#8594; <tt>#7afa7e</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Green</tt> &#8594; <tt>#1af520</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Light Red</tt> &#8594; <tt>#fdcccc</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Medium Red</tt> &#8594; <tt>#f95959</tt>
+</p>
+</li>
+<li>
+<p>
+<tt>Red</tt> &#8594; <tt>#f62020</tt>
+</p>
+</li>
+</ul></div>
+<h3 id="_eigenschaften_von_verbindungen_connection">Eigenschaften von Verbindungen (Connection)</h3><div style="clear:left"></div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 6. Connection Properties</caption>
+<col width="16%" />
+<col width="22%" />
+<col width="5%" />
+<col width="55%" />
+<thead>
+<tr>
+<th align="left" valign="top">Typ </th>
+<th align="left" valign="top"> Schlüssel </th>
+<th align="left" valign="top"> Ver. </th>
+<th align="left" valign="top"> Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">visual.caption</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Titel der Connection im Editor.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">visual.color</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Farbliches Merkmal der Connection</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">data.functionType</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Ein Funktionstyp von:
+ <em>straight-line</em>, <em>individual</em>,
+ <em>parable</em>, <em>parabolic-sections</em>.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">decimalList</p></td>
+<td align="left" valign="top"><p class="table">data.function</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">KSM-Simulator Funktionsparameter dieses Knoten</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="paragraph"><p><em>'data.function</em>' enthält eine Liste von Argumenten für die verwendete, durch <em>'data.functionType</em>'
+festgelegte Funktion.</p></div>
+<h3 id="_eigenschaften_von_gruppen_nodegroup">Eigenschaften von Gruppen (NodeGroup)</h3><div style="clear:left"></div>
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 7. NodeGroup Properties</caption>
+<col width="16%" />
+<col width="22%" />
+<col width="5%" />
+<col width="55%" />
+<thead>
+<tr>
+<th align="left" valign="top"> Typ </th>
+<th align="left" valign="top"> Schlüssel </th>
+<th align="left" valign="top"> Ver. </th>
+<th align="left" valign="top"> Beschreibung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">visual.caption</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Titel der Group im Editor.</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">string</p></td>
+<td align="left" valign="top"><p class="table">visual.color</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Farbliches Merkmal der Group</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">integer</p></td>
+<td align="left" valign="top"><p class="table">visual.location.x</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">X-Position relativ zu übergeordneten NodeGroup</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">integer</p></td>
+<td align="left" valign="top"><p class="table">visual.location.y</p></td>
+<td align="left" valign="top"><p class="table">1+</p></td>
+<td align="left" valign="top"><p class="table">Y-Position relativ zu übergeordneten NodeGroup</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<h2 id="_dokumentation_der_implementierung">Dokumentation der Implementierung</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Das am Anfang vorgestellte Objektmodell wird durch Interfaces im Package
+<em>de.dhbw.horb.ksm. xmlschema.api</em> umgesetzt.</p></div>
+<div class="paragraph"><p>Eine Implementierung dieser Interfaces findet sich im Package
+<em>de.dhbw.horb.ksm. xmlschema.impl</em>. Von dieser Implementierung ist für
+äusseren Zugriff nur die Klasse <em>KSMFactory</em> vorgesehen, welche Methoden
+zum Laden und Speichern von KSM-Modellen zur Verfügung stellt.</p></div>
+<div class="paragraph"><p>Die Implementierung benutzt vom XML-Schema-Compiler (xjc) von JAXB generierte
+Klassen die im Package <em>de.dhbw.horb.ksm. xmlschema.generated</em> liegen.
+Das generieren wird vom Ant-Task <em>compile-xjc</em> und Annotationen im Schema gesteuert.</p></div>
+<div class="paragraph"><p>Der Zugriff auf das geladene Modell erfolgt auschliesslich über die in den Interfaces
+vorgesehen Methoden, ein direkter Zugriff ist nicht möglich.</p></div>
+<div class="paragraph"><p>Neben dem Quellcode in src/ gibt es im Projektverzeichniss noch das Verzeichnis test/
+welches JUnit-4 Tests enthält die die Implementierung nahezu 100% abdecken. Die
+Tests sind dabei zum Teil im Stil des Behavior Driven Development (BDD) geschrieben unter
+Zuhilfename der Bibliothek mockito.</p></div>
+</div>
+<h2 id="_vorgehensweise_bei_nderungen">Vorgehensweise bei Änderungen</h2>
+<div class="sectionbody">
+<div class="olist arabic"><ol class="arabic">
+<li>
+<p>
+Eintragung der Änderung in diesem Dokument
+</p>
+</li>
+<li>
+<p>
+Erhöhen der Versionszahl
+</p>
+</li>
+<li>
+<p>
+Erstellen eines Eintrags in der Revisions Historie in diesem Dokument
+</p>
+</li>
+<li>
+<p>
+Anpassen der Versionszahl in build.xml <em>project.version</em>
+</p>
+</li>
+<li>
+<p>
+Erstellen einer HTML- und PDF Version von diesem Dokument (asciidoc/a2x).
+</p>
+</li>
+</ol></div>
+</div>
+<h2 id="_revisions_historie">Revisions Historie</h2>
+<div class="sectionbody">
+<div class="tableblock">
+<table rules="all"
+width="80%"
+frame="border"
+cellspacing="0" cellpadding="4">
+<caption class="title">Tabelle 8. Revisions</caption>
+<col width="5%" />
+<col width="16%" />
+<col width="22%" />
+<col width="55%" />
+<thead>
+<tr>
+<th align="left" valign="top"> Ver. </th>
+<th align="left" valign="top"> Datum </th>
+<th align="left" valign="top"> Person </th>
+<th align="left" valign="top"> Änderung</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td align="left" valign="top"><p class="table">1</p></td>
+<td align="left" valign="top"><p class="table">2011-03-24</p></td>
+<td align="left" valign="top"><p class="table">Yves Fischer</p></td>
+<td align="left" valign="top"><p class="table">Beginn der Historie, KSM Version 1</p></td>
+</tr>
+<tr>
+<td align="left" valign="top"><p class="table">1</p></td>
+<td align="left" valign="top"><p class="table">2011-04-26</p></td>
+<td align="left" valign="top"><p class="table">Fischer, Dreher</p></td>
+<td align="left" valign="top"><p class="table">Erläuterung Datentypen.
+ Festlegung Funktionsname/Parameter von
+ Connection&#8217;s.</p></td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2011-04-27 22:54:43 CEST
+</div>
+</div>
+</body>
+</html>
diff --git a/ksm-model/doc/KSM-Datamodel.pdf b/ksm-model/doc/KSM-Datamodel.pdf
new file mode 100644
index 0000000..9d14a46
--- /dev/null
+++ b/ksm-model/doc/KSM-Datamodel.pdf
Binary files differ
diff --git a/ksm-model/doc/asciidoc-dblatex.sty b/ksm-model/doc/asciidoc-dblatex.sty
new file mode 100644
index 0000000..5f8f8a0
--- /dev/null
+++ b/ksm-model/doc/asciidoc-dblatex.sty
@@ -0,0 +1,10 @@
+%%
+%% This style is derived from the docbook one.
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{asciidoc}[2008/06/05 AsciiDoc DocBook Style]
+%% Just use the original package and pass the options.
+\RequirePackageWithOptions{docbook}
+
+\usepackage{libertine}
+\usepackage{microtype}
diff --git a/ksm-model/doc/make.sh b/ksm-model/doc/make.sh
new file mode 100755
index 0000000..f815b30
--- /dev/null
+++ b/ksm-model/doc/make.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+asciidoc -v "KSM-Datamodel.asciidoc" &&
+ a2x -v "KSM-Datamodel.asciidoc" --dblatex-opts "-P latex.output.revhistory=0 -P latex.class.options=14pt -P latex.class.article=scrartcl -s asciidoc-dblatex.sty"