Version 0.28.02 - 2011-05-18
Copyright © 2001-2011 OAshi S.á r.l.
Inhaltsverzeichnis
MyTISM ist plattformunabhängiges, objektorientiertes, dezentrales, multiuserfähiges, individuell anpassbares und quelloffenes 3-Tier-Datenbank- und Anwendungs-Framework incl. GUI und Web-Application-Server, entwickelt und betreut von OAshi s.a r.l.
In diesem Handbuch finden Sie alle Informationen, die Sie für die Programmierung von und mit MyTISM benötigen.
| Anmerkung | |
|---|---|
| Beachten Sie bitte, dass sich dieses Dokument noch im Aufbaustadium befindet und noch grosse Lücken aufweist, die wir natürlich nach und nach füllen werden. | |
Dieser Teil der Dokumentation ist im Wesentlichen dem Entwickler bzw. dem (sehr) interessierten Anwender gewidmet, der Einblick in die Interna bzw. Aufbau des Systems gewinnen will. Das Vorwissen besteht mindestens aus guten bis sehr guten Kenntnissen in Java und NetRexx sowie Datenbank-Kenntnisse in relationalen oder objektorientierten Systemen. Eine mindestens halbwegs intensive Beschäftigung mit der Bedienung des Systems sollte der Lektüre vorangegangen sein...
Bei Fragen, Problemen oder Anregungen, sei es bzgl. MyTISM selber oder dieser Dokumentation, wenden Sie sich bitte an uns; Kontaktinfos finden Sie im WWW unter http://www.mytism.de/mytism/contact.
Das Schema definiert/spezifiziert, wie die Datenobjekte bzw. die "Datenbankstruktur" einer Applikation aussieht. Aus der Schema-Definition wird automatisch der Netrexx-Quellcode für die benötigten Klassen generiert, die Datenbanktabellen etc. werden angelegt und für Solstice werden passende Automatik-Formulare, -Schablonen und Lesezeichen generiert.
FIXME: Besteht aus Include, Entity und Generator
Einleitender Tag: <Schema BEFEHLE>
Schliessender Tag: </Schema>
Tabelle 1.1. Schema
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| version | Freitext, der den Platzhalter @BUILT@ enthalten sollte, welche beim Kompilieren durch eine Versionsnummer ersetzt wird; weitere Platzhalter sind: @ProjectName@ | <Schema version="@ProjectName@ Schema built @BUILT@"> |
| defaultPackage | "Basis"-Package, welches bei der Entität im extends-Befehl eigentlich eigentlich noch vorangestellt werden müsste (also statt extends="Artikel" müsste man dann überall schreiben extends="de.laeis.bo.Artikel"); gleiches gilt für das Attribut und den type-Befehl (natürlich nur bei Entitäten). Das defaultPackage erspart einem also diese lästige Mehrarbeit. Schön, nicht? | <Schema version="@ProjectName@ Schema built @BUILT@" defaultPackage="@BOPACK@"> |
| defaultFolder | Hier kann zwecks geordneter Erstellung der nachfolgend definierten Entitäten ein defaultFolder definiert werden. | <Schema version="@ProjectName@ Schema built @BUILT@" defaultPackage="@BOPACK@" "defaultFolder="Stammdaten/Konten"> |
FIXME: Einleitende, erklärende Worte
Tag: <Include BEFEHLE />
FIXME: Einleitende, erklärende Worte
Tag: <Folder BEFEHLE />
FIXME: Einleitende, erklärende Worte: Definition einer Entität und ihrer Attribute
Einleitender Tag: <Entity BEFEHLE>
Schliessender Tag: </Entity>
Tabelle 1.4. Entity
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| name | Name der Entität | <Entity name="Lieferant"> |
| plural | Plural-Bezeichnung der Entität | <Entity name="LIeferant" plural="Lieferanten"> |
| extends | Von welcher Klasse sich die Entität ableitet | <Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto"> |
| abstract | Ob die Entität abstrakt sein soll (es können keine BOs von dieser Entität angelegt werden, da keine Formulare generiert werden - macht nur Sinn, wenn sich von dieser Entität weitere Entitäten ableiten; Default: false | <Entity name="XBuchungsKonto" plural="XBuchungsKonten" extends="CBO" abstract="true"> |
| ignoreReverseRelations | FIXME; Default: false | <Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto" ignoreReverseRelations="true"> |
| discriminator | FIXME Irgendwas bzgl. BOT/Typ | <Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto" discriminator="FIXME"> |
| suid | FIXME SerialVersionUID (Klassenversionskennung) | <Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto" suid="FIXME"> |
| package | Hier kann ein zum defaultPackage (siehe obigen Abschnitt zum Schema) abweichendes Package angegeben werden. | package="de.laeis.bo" |
FIXME: Einleitende, erklärende Worte
Tabelle 1.5. Unter-Element "ui" von Entity
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| niceName | FIXME "Schönerer" Name für Entität für Anzeige | <ui niceName="FIXME"> |
| description | Beschreibung der Entität; definiert Ausgabe der describe()-Methode einer jeden Entität, Definition im CBOFormat (siehe dort "Wo kann man das CBOFormat nun überhaupt einsetzen?" | <ui description="Nachname(', 'Vorname)"> |
| loadImmediate | Ob eine Übersicht (Liste) der BOs der Entität; direkt in einem geöffneten Lesezeichen (FTable) angezeigt werden soll (aus Performance-Gründen nur sinvoll bei Entitäten mit einer überschaubaren Anzahl von BOs); Default: false | <ui loadImmediate="false"> |
| linkOnly | Ob Objekte nicht im Kontext dieses BO angelegt, sondern sie lediglich mit diesem BO verknüpft werden können sollen; Default: false | <ui linkOnly="false"> |
| tips | FIXME | <ui tips="FIXME"> |
| defaultSorting | Tabellen, die Objekte diesen Typs anzeigen, werden standardmäßig nach diesen Vorschriften sortiert, sofern keine explizite Sortierung in der Tabelle definiert worden ist. Subentities "erben" dabei das defaultSorting, falls sie selbst kein eigenes definiert haben. Format der Definition: Spaltenname:Sortierrichtung. Dabei impliziert die Reihenfolge der Einträge den sortLevel.
Die Mehrfachsortierung erfordert eine zusätzliche Lizenz. | <ui defaultSorting="Name:ASC Beschreibung:DESC Position.ASC Eigenschaft:ASC Eigenschaft.Name:ASC"> |
FIXME
Tabelle 1.6. Unter-Element "lookup" von Entity
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| defaultProperty | In welchem Attribut der BOs vom entsprechenden Typ bei Eingabe eines Suchstrings in einem Popup gesucht werden soll, damit nach Eingabe von Enter direkt das Objekt (falls nur eines gefunden wurde) an das BO angehängt bzw. eine Liste von BOs mit diesem Wert im angegebenen Attribut angezeigt werden kann. | <lookup defaultProperty="Name"> |
| defaultSubstring | Ob die Suche exakt sein soll oder ein Substring-Match in der defaultProperty schon ausreicht; Default: true | <lookup defaultSubstring="true"> |
| defaultCaseSensitive | Ob die Suche Groß-/Kleinschreibung beachten soll; Default: false | <lookup defaultCaseSensitive="true"> |
FIXME
Tabelle 1.7. Unter-Element "code" von Entity
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| package | Hier kann ein zum defaultPackage (siehe obigen Abschnitt zum Schema) abweichendes Package angegeben werden. | <code package="de.laeis.bo"> |
| generateAs | Unter welchem Namen die Basis-Klasse der Entität angelegt werden soll; es muss dann im "bo"-Verzeichnis von Hand eine Datei "Person.nrx" angelegt werden, welche die Klasse "Person" implementiert und sich von der generierten Klasse "PersonBase" ableitet | <code generateAs="PersonBase"> |
| custom | Ob die Basis-Klasse der Entität mit Suffix "Base" angelegt werden soll; es muss dann im "bo"-Verzeichnis von Hand eine Datei mit dem Entity-Namen und Suffix ".nrx" angelegt werden, welche die Klasse "Entity-Name" implementiert und sich von der generierten Klasse "Entity-NameBase" ableitet | <code custom="true"> |
| generate | Ob für die Entität Sourcecode generiert werden soll (eigentlich nur für "BO" mit "false" benutzt); Default: true | <code generate="false"> |
| dependents | Welche Klassen von dieser Entität abhängen und die daher bei Änderung der Klasse der Entität ebenfalls neu gebaut werden müssen (z.B. damit die serialVersionUID aktuell ist). | <code dependents="GeschaeftsVorfallSchemaAspects"> |
FIXME
Tabelle 1.8. Unter-Element "db" von Entity
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| persistent | Ob die BOs der Entität persistiert (gespeichert) werden sollen, Default: true | <db persistent="false"> |
| generateAs | Unter welchem Namen die Basis-Klasse der Entität angelegt werden soll; es muss dann im "bo"-Verzeichnis von Hand eine Datei "Person.nrx" angelegt werden, welche die Klasse "Person" implementiert und sich von der generierten Klasse "PersonBase" ableitet | <db generateAs="PersonBase"> |
| streamRessource | FIXME Ob an diesen Entitäten ein BLOB (BinaryLargeOBject) dranhängen kann; Default: false | <db streamRessource="true"> |
| forbidDirectChanges | Ob direkte Änderungen an BOs diesen Typs vorgenommen werden dürfen oder ob nur der Server diese Objekte modifizieren darf; Default: false | <db forbidDirectChanges="true"> |
FIXME
Tabelle 1.9. Unter-Element "report" von Entity
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| title | Titel für automatisch generierte Reports | <report title="Analyse"> |
| orientation | Orientierung für automatisch generierte Reports (Portrait oder Landscape) | <report orientation="Portrait"> |
| fontSizeNormal | Die Standard-Schriftgrüße für automatisch generierte Reports; Default: 9 | <report fontSizeNormal="10"> |
| fontSizeBig | Die große Schriftgrüße für automatisch generierte Reports; Default: 16 | <report fontSizeBig="14"> |
Beispiel:
<Entity name="Person" extends="CBO" plural="Personen" folder="Kontakte">
<code custom="true"/>
<ui description="Nachname(', 'Vorname)"/>
</Entity>
FIXME: Einleitende, erklärende Worte
Tag fur Attribute: <attr BEFEHLE />
Tag fur virtuelle Attribute: <vattr BEFEHLE />
Tag fur nicht-persistente Attribute: <npattr BEFEHLE />
Tabelle 1.10. Attribut
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| name | der Attribut-Name | name="Adressen" |
| backName | FIXME: Bei Relationen Name des Attributes "auf der anderen Seite". | backName="FIXME" |
| singular | FIXME: Wird kein singular angegeben wird der Singular auf den Wert von name gesetzt | singular="Adresse" |
| type | Typ des Attributs; mögliche Werte: FIXME | type="Kontakt" (eine Adresse ist eine bestimmte Art einer Kontakt-Möglichkeit |
| displayFormat | Standard-Display-Format des Attributs | displayFormat="Name" |
| relation | Relation des Attributs zu einer anderen Entität; mögliche Werte: "n-1", "1-n", "n-m" | relation="1-n" |
| dependent | Abhängigkeit: in unserem Beispiel werden beim Löschen der Person auch die zugehörigen Adressen gelöscht; ansonsten wie createInDetailView; Default: false | dependent="true" |
| itemProperty | FIXME | itemProperty="Position" |
| shared | Wird die Referenz innerhalb der Entität geshared; Default: false | shared="true" |
| default | Für diverse Attribut-Typen lässt sich ein Default-Wert vorgeben (z.B. für Datetime: new java.util.Date(); Boolean: Boolean.TRUE; Decimal: #,##0.00 | default="#,##0.00" |
| ignoreBackRelation | Es sollen keine Methoden für die Rückrelation generiert werden (z.B. n-1-Relation zu Core-Entität) | ignoreBackRelation="true" |
| readonly | Gibt an, ob das Attribut-Feld im Formular gesperrt ist für irgendwelche Eingaben; Default: false | readonly="true" |
| lazy | FIXME; Default: false | lazy="true" |
| omitOnCopy | Gibt an, ob dieses Attribut beim Kopieren eines Objekts diesen Typs übersprungen werden soll. | omitOnCopy="true" |
FIXME
Tabelle 1.11. Unter-Element "ui" von Attribute
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| editMode | Gibt an, wie das Attribut in der UI editierbar sein soll, Mögliche Werte: linkonly, viewonly, locked, writenew, all. | <ui editMode="linkonly"> |
| createInDetailView | Gibt an, ob im Formular der Entität automatisch Eingabefelder für die Many-Relation gebaut werden sollen (normalerweise wird auf dem Formular-Reiter der Many-Relation nur eine FTable gebaut); Default: false | <ui createInDetailView="true"> |
| mandatory | FIXME Definition als "Pflichtfeld". Z.Zt. nur partiell unterstützt, nicht z.B. von Solstice; Default: false | <ui mandatory="true"> |
| tips | FIXME: mögliche Werte: StyledText, Area, combobox:ATTRIBUTNAME, formRecursionDepth:INTEGER (Default: 3), createShared; werden mehrere Werte angegeben, so sind diese mit Leerzeichen zu trennen | <ui tips="FIXME"> |
| visible | Ob das Attribut im Formular gebaut werden soll; Default: true | <ui visible="false"> |
| expectedWidth | FIXME: Die erwartete Breite des Attributs im Formular | <ui expectedWidth="FIXME"> |
| selectionFilter | FIXME | <ui selectionFilter="FIXME"> |
FIXME
Tabelle 1.12. Unter-Element "lookup" von Attribute
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| property | In welchem Attribut der BOs vom entsprechenden Typ bei Eingabe eines Suchstrings in einem Popup gesucht werden soll, damit nach Eingabe von Enter direkt das Objekt (falls nur eines gefunden wurde) an das BO angehängt bzw. eine Liste von BOs mit diesem Wert im angegebenen Attribut angezeigt werden kann. | <lookup property="Name"> |
| substring | Ob die Suche exakt sein soll oder ein Substring-Match in der property schon ausreicht; Default: true | <lookup substring="true"> |
| caseSensitive | Ob die Suche Groß-/Kleinschreibung beachten soll; Default: false | <lookup caseSensitive="true"> |
FIXME
Tabelle 1.13. Unter-Element "report" von Attribute
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| visible | Ob das Attribut in den Automatik-Reports angedruckt werden soll; Default: true | <report visible="false"> |
| relativeWidth | Die relative Breite des Felds für das Attribut in den Automatik-Reports; Default: 1 | <report relativeWidth="2"> |
| position | Determiniert die Reihenfolge der Attribute in den Automatik-Reports. | <report position="100"> |
| sort | Sollen die BOs im Automatik-Report nach diesem Attribut sortiert werden? Mögliche Werte: asc, desc | <report sort="asc"> |
| manySort | Sollen die BOs im Automatik-Report nach diesen Attributen sortiert werden? Mögliche Werte: Komma-separierte Liste von Attribut-Namen der Entität mit Suffix :A oder :D. | <report manySort="Tid:A,Nummer:D"> |
| alias | Ob im Automatik-Report für eine many-Relation eine Gruppe mit angegebenem Alias erzeugt und die Daten der many-Relation im Automatik-Report gedruckt werden sollen. | <report alias="P"> |
FIXME
Tabelle 1.14. Unter-Element "virtual" von Attribute
| Befehl | Beschreibung | Beispiel |
|---|---|---|
| writeable | Ob das virtuelle Attribut schreibbar sein soll. | <virtual writeable="true"> |
| aggregate | Ob der Wert des virtuellen Attributs durch eine Aggregats-Funktion bestimmt werden soll. | <virtual aggregate="BO.Union:Gruppe.Benutzer"> |
| cacheMode | Ob das virtuelle Attribute versioniert sein soll. | <virtual cacheMode="VERSIONED"> |
FIXME
Tabelle 1.16. Restliche Unter-Elemente von Attribute
| Unter-Element | Beschreibung | Beispiel |
|---|---|---|
| backRelation | Explizite Übersteuerung der automatisch generierten Rückrelation, um z.B. einen anderen Namen zu benutzen oder die Rückrelation mittels Unter-Elementen zu konfigurieren. | <backRelation name="BezugnehmendePosten"/> |
| comment | Um einen Kommentar zu diesem Attribut im Schema zu hinterlegen. | <comment>Dient zur Speicherung von XXX</comment> |
Beispiel:
<attr name="Adressen" singular="Adresse" type="Kontakt" relation="1-n"
dependent="true" itemProperty="Position">
| Anmerkung | |
|---|---|
vgl. de/ipcon/schema/generators/CoreData.nrx und Klassen in de/ipcon/schema/generators/coredata | |
Füllt die Datenbank mit grundlegenden, benötigten Daten/Objekten:
Neben den automatisch erzeugten Strukturelementen können auch zusätzliche, vorgebaute Formulare, Schablonen und Lesezeichen automatisch in die Datenbank eingespielt werden. Diese müssen in Verzeichnis de/ipcon/db/core/resources abgelegt werden. Das Format und die Benamsung entspricht dem Format und der Benamsung der mittels Formularsynchronisation (siehe Nutzerdoku) exportierten Dateien, d.h. exportierte Dateien können direkt übernommen werden.
Beim Bauen von MyTISM-Kernel.jar werden die Dateien zusammengesucht und in eine Liste ("ResourceIndex") eingetragen und in das Jar aufgenommen. Beim Aufruf des Coredata-Generators wird diese Liste ausgelesen, die entsprechenden Dateien/Definitionen werden aus dem Jar geladen und die entsprechenden Objekte in der DB angelegt bzw. aktualisiert. Die Dateinamen sind übrigens frei wählbar, lediglich die Endung muss passend zum Typ der enthaltenen Daten sein (*.tpl.xml = Schablone, *.frm.xml = Formular, *.bkm.xml = Lesezeichen).
Folgende Angaben werden z.Zt. unterstützt:
<Formular Name="$R{_Benutzer} (Vorgebaut)" ElterPfad="Admins/MyTISM/Benutzerverwaltung">
<Beschreibung>Vorgebautes, aufgeräumteres Benutzer-Formular, mit Gruppierungen der Alarm-
und Benachrichtigungsinfos und einfacherer, halbautomatischer
Benachrichtigungskonfiguration.</Beschreibung>
<Parameter>
<TabbedView tabPlacement="TOP">
<!-- ... mehr Definition ... -->
</TabbedView>
</Parameter>
<BOTyp Name="Benutzer"/>
<Gruppen>
<Gruppe Name="Benutzer"/>
</Gruppen>
</Formular>
Für spezifische Projekte gibt es (ausser der manuellen Synchronisation) z.Zt. noch keinen entsprechenden Mechanismus, um projektspezifische Strukturelemente automatisch zu laden. Bei Bedarf ließe sich das aber entsprechend ergänzen.
| Anmerkung | |
|---|---|
Wenn ein vorgebautes Strukturelement geändert wurde oder neu hinzugekommen ist, muss vor dem Start des Servers die Datei .checked-initialdata gelöscht werden, damit die Änderungen wirksam werden (in Zukunft wird das wohl automatisch geschehen). | |
MyTISM bietet eine durchgehende Unterstützung für verschiedene Locales, sowohl für die Übersetzung von Texten und Namen als auch für Ein- und Ausgabe von Zahlen, Daten, etc.
Neben der direkten Benutzung in Programmcode mittels der Methoden L10n.msg() bzw. L10n.applyL10n() gibt es weitere Stellen an denen die Mehrsprachigkeit unterstützt wird.
Im GUI-Client Solstice, an vom Benutzer bearbeitbaren Stellen:
Im GUI-Client Solstice, interne Funktionalität:
In diesen "Texten" können Platzhalter $R{key} eingefügt werden. Diese werden dann automatisch vor der "Benutzung" durch zum aktuellen Locale passende Texte ersetzt.
L10nPackProviderI (z.Zt. de/ipcon/tools/L10n und de/ipcon/db/AbstractClient) halten benannte L10nPacks bereit, welche die diversen Textbausteine in unterschiedlichen Sprachen enthalten, gruppiert mittels entsprechender Schlüssel für jeden Textbaustein.
Beim Auflösen von $R{key}-Platzhaltern z.B. im Formularcode (und ebenso beim direkten Aufruf der L10n.msg()-Methoden) wird eine - je nach Aufrufart bzw. -ort unterschiedliche, und bei den im vorherigen Abschnitt aufgeführten Stellen, automatisch zusammengestellte - Liste der an dieser Stelle beteiligten bzw. relevanten Objekte übergeben (Z.B. für Formulare das Formular-Objekt selbst).
Mittels dieser übergebenen Objekte wird nun eine Liste von relevanten L10nPacks erstellt, in denen mittels des Schlüssels "key" nach den angeforderten Textbausteinen gesucht wird. Wird ein zum Schlüssel passender Textbaustein gefunden, wird seine zur gewünschten Sprache passende Version zurückgeliefert.
| Anmerkung | |
|---|---|
| Schlüsselnamen dürfen nur Buchstaben, Zahlen, '_', '-', '.', '~' und '/' enthalten. | |
Die Benamsung bzw. Hierarchie der L10nPacks folgt in der Regel der Klassen- bzw. Paketstruktur der Java-Klassen. In den meisten Fällen bestimmen die Java-Klassen der beteiligten Objekte und die Java-Pakete denen diese angehören die zu durchsuchenden L10nPacks.
| Anmerkung | |
|---|---|
| L10nPack-Namen dürfen nur Buchstaben, Zahlen, '_', '-' und '.' enthalten, wobei '.' das Trennzeichen zum Aufsplitten der Namen ist. | |
Dies ist unterschiedlich und hängt davon ab, wo und wie die L10n-Funktionalität genutzt wird, z.B.:
Im Normalfall wird die Liste der L10nPacks für eine Klasse einfach nach der im vorherigen Abschnitt beschriebenen Methode (Klassen + Pakete) erstellt. Ist für eine Klasse aber ein sog. L10nPathCompilerI beim L10n registriert, so bestimmt dieser, welche L10nPacks für die entsprechende Klasse in die Liste aufgenommen werden (siehe z.B. "FormularPathCompiler" in Formular.nrx).
Genauere Informationen finden sich bei den entsprechenden Aufrufen von L10n.applyL10n() bzw. L10n.msg() (bei letzterem nur selten, da dort fast nie ein expliziter "path" übergeben wird und fast immer die oben erwähnte Automatik benutzt wird) im Quellcode von MyTISM. L10n.compilePath() enthält weitere Informationen darüber, wie die Liste der zu durchsuchenden L10nPacks zusammengestellt wird.
Die Texte/Daten für die L10nPacks werden z.Zt. aus zwei Quellen gezogen. Die L10n-Klasse lädt ihre Daten aus Dateien .../resources/*.properties die in den Quellcode-Verzeichnissen liegen und beim Bauen ebenfalls in die JARs eingebunden werden. Daneben lädt der Server noch die in der Datenbank befindlichen L10nBundles in seinen L10nCache.
Die Texte der *.properties-Dateien werden alle "von Hand" angelegt und bearbeitet. Die L10nBundles, etc. werden teilweise automatisch generiert, können aber auch von Hand angelegt und bearbeitet werden (FIXME wobei dabei zu beachten ist, dass automatisch angelegte L10nEntries und L10nResources - aber nicht L10nBundles - teilweise auch automatisch gelöscht werden, wenn z.B. die entsprechenden Entities oder Attribute weggefallen sind).
Für jede im Schema definierte Entität, Beispiel "de.ipcon.db.core.Benannt", werden einige L10n-Daten automatisch angelegt. Diese sind im Beispiel zuerst das L10nBundle "de.ipcon.db.core" mit den L10nResourcen "_Benannt" sowie "_Benannt-s", L10nResources für die Ordner, also hier "Interna" (FIXME ggf. weitere) sowie L10nResources für jedes Attribut der Entität also hier "Name", "Beschreibung" usw.
Desweiteren wird für jede Entität noch ein eigenes Bundle, im Beispiel "de.ipcon.db.core.Benannt", angelegt und dort werden ebenfalls noch einmal wie oben für alle Attribute L10nResources angelegt.
Genauere Informationen finden sich in L10nBundle.initEnvironment() und den dort benutzten Methoden.
FIXME Stichworte
neues Bundle anlegen (de.venice) bzw. in einem bestehenden Bundle (de.venice.bo) was hinzufuegen => schauen, dass das Bundle auch Preloaded wird und auch die PfadPos setzen (0). Wenn trotzdem ein neuer Eintrag nicht direkt gefunden wird, dann kann es noetig sein den Server durchzustarten. Das kann der Fall sein, wenn das Bundle erstmalig auf Preload und/oder PfadPos gesetzt wird.
Einfaches Hochkomma muss "escaped" werden => doppelt schreiben
$R-Tags in Formularen, etc.: Suche nach title=", label=", text=".
Nachfolgende Dokumentation behandelt den Aufbau der eines sogenannten Formulars im de.ipcon.form Package des MyTISM Frameworks. Sie soll den Entwickler in die Lage versetzen, Wünsche des Anwenders an die grafische Oberfläche umzusetzen. Im Gegensatz zu Web-Oberflächen sind diese für den Anwender viel effektiver und schneller bedienbar als die etwas generischeren und graphisch meist viel ansprechenderen, aber dennoch umständlich zu bedienenden Web-Oberflächen. Allerdings ist das Abstraktionsniveau im grafischen Client etwas geringer, um schneller zum Ergebnis zu kommen - manchmal ist es besser, den ein oder anderen Wunsch eines Anwenders zugunsten einer saubereren oder aber auch für eingeschränkte Benutzer (sei es technisch (niedrige Farbe, langsamer Rechner) oder auch körperlich (Farbenblindheit, Kurzsichtigkeit)) bedienbaren Lösung abzulehnen.
Das Formularframework bzw. die Engine, die die Formulare aufbaut, hat zwei Ziele: Flexible Formulare und eine flexible Verwaltung dieser Formulare. Das HTML-Format bzw. dessen Vorgänger SGML bzw. XML haben mit ihrem Markup-Konzept einen entscheidenden Denkanstoß zur Entwicklung der jetzigen Implementation geliefert. Angereichert mit einer Meta-Ebene, die aus dem Datenbank-Backend MyTISM kommt und somit einen schnellen und effizienten Zugriff auf die Formulare gestattet sowie die Synchronisation der Formulare realisiert. Im folgenden werden die Objekte einzeln ausführlich vorgestellt, ihre Eigenschaften und ihre Verwendung dokumentiert. Alle Objekte außer den Lesezeichen haben die Eigenschaft, in bestimmten Kontexten als Auswahl zur Verfügung zu stehen, sei es, um ein neues Objekt zu erzeugen oder ein bestehendes anzuzeigen. Das Verfahren, diese Auswahl zu generieren, wird ebenfalls beschrieben.
Das Formular-Objekt hat die Aufgabe, eine Eingabemaske für ein Objekt einer bestimmten BO-Klasse zu beschreiben. Das de.ipcon.form Package enthält die notwendigen Methoden, um eine solche Eingabemaske bestehend aus Oberflächenelementen wie Textfelder, Popuplisten und ähnlichem zu erzeugen und verwalten. Es stellt eigentlich das wichtigste und gleichzeitig das komplizierteste Objekt des Formularframeworks dar.
Das Formular-Objekt hat im wesentlichen folgende Eigenschaften:
Name: Eine klar abgrenzende Bezeichnung, die auch im Kontextmenu des jeweiligen Objektes erscheint.
Beschreibung: Eine etwas ausführlichere Beschreibung, durchaus als Platz für Bemerkungen wie den Verweis auf spezielle Versionen oder Spezifika. Sie wird dem Benutzer nicht in der GUI präsentiert und ist ausschließlich den Entwicklern vorbehalten.
Elter: Ein Verweis auf die ID des Strukturelements (meist ein Ordner oder eine Gruppe), unter dessen Repräsentation im Menubaum dieses Element absortiert wird. Wird gesetzt beim Drag'n'Drop im NavigationTree in der GUI.
IstAutomatik: Ein Wahrheitswert, der anzeigt, ob das Formular direkt aus dem Formulargenerator stammt. Falls Sie ein Formular abändern, achten Sie bitte darauf, daß dieser Wert false ist, sonst wird beim nächsten Schema-Update das Formular neu erstellt; der NavigationTree setzt es beim 'Move' dieses Flag automatisch auf false, um eine Fehlbedienung zu vermeiden.
Parameter: Hier steckt der Source des eigentlichen Formulars. Im folgenden wird der Inhalt dieser Eigenschaft ausführlich beschrieben.
BOTyp: Ein Verweis auf den Typ des BO (selbst natürlich ebenfalls ein BO), welches mit diesem Formular angezeigt werden kann. [fixme: Polymorphie?]
Gruppen: Ein Mehrfach-Verweis auf die Gruppen, die dieses Formular benutzen sollen.
Schablonen: Ein Mehrfach-Verweis auf die Schablonen-Objekte, die direkten Gebrauch von diesem Formular machen.
Priorität: ein 32bit signed Integer, der die Priorität des Formulars im Falle einer mehrfachen Auswahl von Formularen für ein Objekt festlegt und damit die Präferenz in diesem Fall festlegt.
Die Auswahl eines Formulars wird aufgrund folgender Regeln getroffen:
Zunächst werden alle passenden (gleicher BOTyp [fixme: Polymorphie]) Formulare erfragt, deren Priorität gesetzt ist und einer der eigenen Gruppen zugeordnet ist. Beim Benutzer Admin werden als Ausnahme auch diejenigen Formulare mit einbezogen, die keine Priorität haben (diese Mechanismus wird in einer der nächsten Versionen ausgebaut und ist damit als obsolet deklariert!).
Diese passenden Formulare werden der Priorität nach absteigend geordnet und dem Benutzer ggfs. per Kontextmenu zur Verfügung gestellt. Ein Doppelklick oder adäquate Aktion öffnet das nach dieser Sortierung am höchsten priorisierte Element. Die momentane Implementation ersetzt Formulare gleicher Priorität ohne eine deterministische (oder vielmehr eine dokumentierte Deterministik) oder vorhersehbare Präferenz. Daher bitte ich unbedingt auf eine klare Priorisierung zu achten. Der Zahlenraum der Priorität bietet genügend Spielraum: ca. -2 bis 2 Milliarden.
Einige Fehler denen ich bei der MyTISM-Entwicklung schon begegnet sind und deren Ursachen bzw. Lösungsmöglichkeiten:
BOs brauchen einen Konstruktor (ohne Argumente); es wird nicht automatisch einer gebaut oder der der Superklasse benutzt. BO-Klassen duerfen nicht "abstract" sein
".checked*"-Dateien im Projektverzeichnis löschen.
Beispiel: "Zustellversuch" hängt an "Sendeauftrag". Neuer Zustellversuch wurde angelegt, in Transaction included und an Sendeauftrag angehängt. Dumm nur: Sendeauftrag war nicht in Transaction included! FIXME: Hmm ... das war aber wohl doch nicht das Problem :-(
BOMengen bieten, ähnlich wie BOMasken, eine Möglichkeit, BOs zu Gruppen bzw. Mengen zusammenzufassen.
Alle BOMengen haben bestimmte Eigenschaften gemeinsam:
Die Basisklasse und einfachste mögliche BOMenge; umfasst einfach alle BOs der angegebenen Entitaet ohne irgendwelche speziellen Kriterien zu berücksichtigen; Ist KomplementBilden aktiviert enthält die Menge keine BOs, d.h. entspricht der leeren Menge.
Eine BOMenge, der ein fester Satz von BOs "manuell" (was natürlich auch z.B. durch ein Programm erfolgt sein kann) zugeordnet wurde. Die Menge der umfassten BOs ändert sich bei diesem Typ nur durch direktes Hinzufügen oder Entfernen von BOs.
Diese BOMenge hat eine fest gesetzte OQL-Where-Clause, die angibt, welche BOs enthalten sind.
Diese BOMenge beinhaltet alle BOs, bei denen der Wert des angegebenen Attributes (def. durch Attributname) einen zur angegebenen Bedingung (definiert durch einen Operator und möglicherweise einen Vergleichswert) passt. Hierbei kann es sich um Bedingungen wie "beginnt mit A" oder ">= 5" oder "Flag ist gesetzt" handeln. Für die verschiedenen Datentypen existieren Unterklassen dieser Klasse.
Dieser "Meta-Typ" erlaubt es, die Elemente zweier vorhandener BOMengen zu kombinieren. Standardmässig gehört ein BO zur Menge, wenn es zu mindestens einer der beiden angegebenen Mengen gehört (d.h. mindestens die Kriterien einer Menge auf das BO zutreffen; "Vereinigung"). Ist MitUndVerknuepfen gesetzt, muss das BO in beiden Mengen enthalten sein (d.h. die Kriterien beider Mengen müssen zutreffen; "Schnitt") damit es aufgenommen wird.
Die Volltextsuche erlaubt die einfache und schnelle Suche nach gegebenen Suchbegriffen über alle in der MyTISM-Datenbank gespeicherten Objekte. Informationen zur allgemeinen Konfiguration und Bedienung finden sich in der MyTISM-Benutzerdokumentation. In diesem Kapitel befinden sich noch einige nur für Entwickler interessante Informationen, insb. zur Konfiguration der Suche im Schema und der Benutzung von Volltextsuche-Queries in Programm- oder Skriptcode.
Standardmässig werden, mit wenigen Aussnahmen, die BOs aller Entitäten für die Volltextsuche aufbereitet. Von diesen BOs werden standardmässig die Inhalte alle Attribute, wiederum mit einigen Aussnahmen, in den Suchindex aufgenommen.
| Anmerkung | |
|---|---|
vgl. de/ipcon/db/fulltext/compass/SchemaMappingBuilder.isEntityIgnored() | |
Explizit immer ausgeschlossen werden die BOs nicht persistenter Entitäten, sowie die BOs der Entiäten BT, BP und BX.
Durch explizite Angabe von indexed="no" im Schema ist es möglich, weitere Entitäten von der Indexierung auszunehmen.
<Entity name="InterneEntitaet" extends="BO" plural="InterneEntitaeten">
<fulltext indexed="no"/>
<attr name="KryptischerString"/>
</Entity>
FIXME Infos zum "Cascading", (Nicht-)Indexierung von Unterklassen
| Anmerkung | |
|---|---|
vgl. de/ipcon/db/fulltext/compass/SchemaMappingBuilder.isAttributeIgnored() | |
Standardmässig ausgeschlossen werden die Daten von
Durch explizite Angabe im Schema ist es jedoch möglich, entsprechende Attribute von bestimmten Entitäten doch in den Index aufzunehmen. Andererseits können auch normalerweise indexierte Attribute explizit von der Indexierung ausgenommen werden.
<Entity name="InterneEntitaet" extends="BO" plural="InterneEntitaeten">
<attr name="Name">
<attr name="InteressantesDatum" type="DateTime">
<fulltext indexed="yes"/>
</attr>
<attr name="KryptischerString">
<fulltext indexed="no"/>
</attr>
</Entity>
Wird für Relationen-Attribute (sowohl Single- als auch Many-Relationen) indexed="yes" angegeben, ist das Resultat, dass Objekte der "Elter"-Klasse (die, die das Relationen-Attribut enthält) auch als Suchtreffer gefunden werden, wenn ein Suchbegriff "nur" auf eines der "Kind"-Objekte (die in der Relation enthaltenen Objekte) zutrifft.
<Entity name="Elter" extends="BO" plural="Eltern">
<attr name="Name">
<attr name="Kinder" type="Kind" relation="1-n">
<fulltext indexed="yes"/>
</attr>
</Entity>
<Entity name="Kind" extends="BO" plural="Kinder">
<attr name="Name">
</Entity>
Es existiert ein Elter "Elter1" mit Kindern "Kind1" und "Kind2". Wird jetzt z.B. im "Eltern"-Lesezeichen nach "Kind1" gesucht, so wird das Objekt "Elter1" als Ergebnis geliefert, obwohl der Suchbegriff "Kind1" eigentlich nur in einem der "Kinder"-Objekte vorkommt.
| Anmerkung | |
|---|---|
vgl. de/ipcon/db/fulltext/compass/SchemaMappingBuilder.buildScalarConfig() sowie das entsprechende Kapitel in der Compass-Dokumentation | |
Für einzelne Attribute kann im Schema definiert werden, ob die entsprechenden Inhalte bei der Indexierung "analysiert" werden sollen oder nicht.
Ein Text wie "Dies ist ein Attributwert" wird normalerweise nicht in dieser Form im Index abgelegt, sondern in seine einzelnen Bestandteile (normalerweise "Wörter", d.h. durch Whitespace abgetrennte Tokens) aufgeteilt. Auch werden einige sehr häufig vorkommende Wörter (sog. "Stopwords") entfernt.
Durch diese Behandlung ist es möglich, dass bei der Suche nach z.B. "Dies" das Objekt mit dem obigen Attributwert gefunden wird.
Wäre der Wert nicht "analysiert" worden, so wäre nur die gesamte Zeichenkette genau in dieser Form im Index abgelegt und das Objekt würde nur bei Eingabe genau von "Dies ist ein Attributwert" (oder ggf. noch bei Benutzung von Platzhaltern oder Ähnlichkeitssuche) gefunden, nicht aber nur bei Eingabe von "Dies".
Standardmässig werden alle Attribute mit (Java-)Typ String "analysiert"; alle anderen Attribute (insb. z.B. Zahlen) nicht. Im Normalfall ist diese Einstellung wohl sinnig; in Einzelfällen (z.B. vielleicht wenn es sich um eine Bezeichnung handelt, die nur genau in der eingegebenen Form gefunden werden soll) kann das Verhalten aber durch eine explizite Angabe beim Attribut geändert werden.
<Entity name="InterneEntitaet" extends="BO" plural="InterneEntitaeten">
<attr name="Name">
<attr name="Typenbezeichnung">
<fulltext analyzed="no"/>
</attr>
</Entity>
Sowohl für Entitäten als auch für einzelne Attribute kann ein "Boost"-Wert im Schema angegeben werden. Dieser dient dazu, einen Treffer für die entsprechende Entität oder das entsprechende Attribut höher oder niedriger zu bewerten und damit im Ranking der Suchergebnisse weiter nach vorne oder hinten zu plazieren. Da jedoch z.Zt. in MyTISM kein Ranking von Suchergebnissen benutzt wird, ist die Angabe dieses Wertes z.Zt. weder erforderlich noch sinnvoll.