====== Services ====== ===== Datenstrukturen ===== ==== DexData ==== String key String name String type String tag String data Boolean dataRead Long cts_ts Long val_ts DexUser target static belongsTo = [ owner : DexUser ] static mapping = { data type:'text' name type:'text' tag type:'text' } ==== DexUser ==== static final Long DEFAULT_VALID_TIME_MS=604800000l // one week String username Long val_time_ms static hasMany = [ whiteList : DexWhiteListEntry, forwardRules : DexForwardRule, dexData : DexData ] static mappedBy = [ dexData :'owner' ] static constraints = { whiteList nullable:true forwardRules nullable:true dexData nullable:true username nullable:false, unique:true val_time_ms nullable:true } static mapping = { forwardRules sort:'precedence', order:'asc' whiteList sort:'allowedUser', order:'asc' dexData sort:'cts_ts', order:'desc' } ==== DexWhiteListEntry ==== String allowedUser static belongsTo = [ owner : DexUser ] ==== DexForwardRule ==== String keyRule String name Boolean active Long precedence Long val_ts Boolean exit static hasMany = [ dataSources : DexForwardSource, dataTypes : DexForwardType, dataTags : DexForwardTag, dataTargets : DexForwardTarget ] static belongsTo = [ owner : DexUser ] === DexForwardSource === String value static belongsTo = [ owner : DexForwardRule ] === DexForwardTag === String value static belongsTo = [ owner : DexForwardRule ] === DexForwardType === String value static belongsTo = [ owner : DexForwardRule ] === DexForwardTarget === String value static belongsTo = [ owner : DexForwardRule ] ===== Akzessor-Methoden ===== ====DexData ==== === CreateDexDataService === == Signatur == Boolean performCall ( String itentis, String itoris, String key, String name, String target, String type, String tag, String data, Long val_ts) { Erzeugt ein //DexData//-Objekt. Der versendende User, dessen Name durch den Sitzungsschlüssel automatisch ermittelt wird, wird gesucht, oder erstmals angelegt. == Ablauf == Die Methode schlägt nur an, falls entweder //kein// TargetUser angegeben wurde, oder der Absender beim angegebenen TargetUser auf dessen //WhiteList// steht. Die Methode sucht, falls ein existierender Target-User angegeben wurde, ob dessen //Whitelist// eine Einstellung der //DexData// erlaubt. Ist kein //TargetUser// angegeben, handelt es sich um ein privates //DexData// und wird somit nur mit dem //owner// erzeugt. Ist der //TargetUser// angegeben und der Absender befindet sich auf dessen //WhiteList//, wird nach einer //ForwardRule// gesucht. Falls //keine// ForewardRule existiert, wird ein //DexData// erzeugt und dem //TargetUser// zugeordnet. Existiert eine //ForewardRule//, wird für jeden gültigen Eintrag ein //DexData// erstellt und der //owner// durch den **Eigentümer der ForwardRule** ersetzt. Falls keine einzige Regel greift, wird ein einzelnes //DexData// dem //TargetUser// zugeordnet. Falls wenigstes eine Regel gegriffen hat, erhält der //TargetUser// selbst möglicherweise keine Kopie des weitergeleiteten //DexData//. === RetrieveCountDexDataService === Long performCall ( String itentis, String itoris, String typ, String tag) { Ermittelt die Anzahl der //DexData//-Elemente, die für diesen User existieren. Die Ermittlung der anzahl kann durch den //tag// oder den //type//-Parameter eingeschränkt werden (oder durch beide). Die Angabe dieser Parameter ist jedoch optional. === ListDexDataService === List performCall ( String itentis, String itoris, Boolean isTarget, Boolean isSource, Long offsetItems, Long maxItems) { Listet alle //DexData// auf und und gibt eine Liste der Namens/Schlüssel-Paare zurück. Dabei muss die maximale Länge der Liste durch den //maxItems//-Parameter und der Beginn der Liste im absoluten Ergebnis durch den //offsetItems//-Parameter spezifiziert werden. Weiterhin ist die List einschränkbar auf die Einträge, die dem User von anderen Usern bereitgestellt wurden, falls //isTarget// gesetzt ist. Oder auf die Einträge, die von dem aufrufenden User an andere User gesendet wurden. Dh. alle Einträge, deren //TargetUser// nicht null sind und vom User abweichend lauten. Die ermittelte Liste ist in jedem Falle unsortiert. === SearchDexDataService === List performCall ( String itentis, String itoris, String type, String tag, Boolean sortByTime, Long offsetItems, Long maxItems) { Diese Methode ermöglicht eine erweiterte Suche. Der Parameter **tag** ist dabei verpflichtend. Ohne angegebenen Tag ergibt die Suche stets die leere Menge. Zusätzlich kann optional der Parameter //type// angegeben werden, nach dem dann zusätzlich gesucht wird. Auch die Angaben zu //offsetItems// und //maxItems// ist optional. Die ermittelte Teilmenge wird nach dem Erstellungszeitstempel ''cts_ts'' absteigend sortiert, falls //sortByTime// gesetzt ist, sonst alphabetisch nach //name// absteigend. === ReadDexDataService === String performCall ( String itentis, String itoris, String key) { Ist der Schlüssel eines //DexData// bekannt, kann dessen Inhalt ermittelt werden, falls der anfragende user entweder mit //owner// oder //target// identisch ist. In letzterem Falle, wird das //dataRead//-Attribute auf ''true'' gesetzt. === DeleteDexDataService === Boolean performCall ( String itentis, String itoris, String key) { Diese Methode löscht ein //DexData//. Die Löschung ist möglich, falls der anfordernde User entweder mit //owner// oder dem //target// identisch ist. ==== ForewardRules ==== === CreateOrUpdateDexForwardRuleService === Boolean performCall ( String itentis, String itoris, String key, String name, Boolean active, Long precedence, Long val_ts, Boolean exit, List owners, List targets, List types, List tags) { == Werte == Mit dieser Methode kann einer Weiterleitungsregel //ForwardRule// angelegt oder modifiziert werden. Neu angelegt wird die Regel dann, wenn der eindeitige Schlüssel //key// nicht zu einer existierenden Regel in der Datenbank passt, oder //null// ist. Der Name //name// kann frei gewähltt werden und für den User zur Gedächtnisstütze dienen. == Gültigkeit == Das Flag //active// muss gesetzt sein, falls die Regel angewendet werden soll. Somit kann man eine Regel, die man ausser Kraft setzen möchte stillegen, ohne Sie löschen zu müssen. Der Zeitstempel //val_ts// kann angegeben werden. In diesem Fall zeigt er den absoluten Unix-Zeitpunkt in ms an, ab dem die Regel nicht mehr gültig ist. Wird er nicht spezifiziert gilt die Regel permanent. == Anwendungssequenzen == Die beiden Parameter //precedence// und //exit// sind von Bedeutung, falls mehrere Regeln definiert wurden. Alle gültigen Regeln werden in der Reihenfolge aufsteigender Präzendenz interpretiert, solange noch weitere Regeln vorhanden sind und keine vorhergehende Regel zur erzeugung eines //DexData// geführt hat. Wurde bereits ein //DexData// erzeugt, wird mit den regel höherer Präzendez nur solange fortgefahren, bis eine Regel erreicht und durch diese ein //DexData// angelegt wird, deren //exit// Flag gesetzt ist. == Matching == Falls Werte für //owners//, //targets// und //types// spezifizert sind, kann die entsprechende Regel nur angewendet werden, falls //owner//, //taget// und //type// in den Listen vorkommt (//und//-Verknüpfung). == Weiterleitungsziele == Eine Weiterleitung ist nur sinnvoll, falls mindestens ein //target// durch dessen Nutzernamen spezifiziert wurde. Werden mehrere Nutzernamen (//targets//) angegeben, wird für jeden ein eigenes //DexData// angelegt. Möchte der Eigentümer dieser weiterleitingsregel selbst eine kopie erhalten, muss er ebenso seinen eigenen Nutzernamen in //targets// eintragen, andernfalls würde er keine Benachrichtigung über die weitergeleiteten //DexData//-Objekte erhalten. Dies ist in einigen Fällen durchaus wünschenswert. === ListDexForwardRulesService === List performCall ( String itentis, String itoris) { Liefert eine vollständige Liste der Weiterleitungsregeln des Users zurück, bestehend aus Name-Schlüssel-Paaren. === RetrieveDexForwardRuleService === DexForwardRule performCall ( String itentis, String itoris, String key) { Liefert den Inhalt einer Weiterleitungsregel zurück, die durch den Schlüssel angegeben wurde. == Rückgabeobjekt == DexForwardRule { String key String name Boolean active Long precedence Boolean exit Long val_ts List sources List targets List tags List types } === DeleteDexForwardRuleService === Boolean performCall ( String itentis, String itoris, String key) { Löscht eine Weiterleitungsregel permanent. Dazu muss der eindeutige Key angegeben werden. Durch den Sitzungsschlüssel wird der eigentümer ermittelt und die löschung erfolgt nur, wenn der Eigentümer bei //DexData// mit dem Attribut //owner// oder dem Attribut //target// identisch sind. ==== WhiteLists ==== === FetchDexWhitelistService === List performCall ( String itentis, String itoris) { === PutDexWhitelistService === Boolean performCall ( String itentis, String itoris, List owners) { ==== DexUsers ==== === DeleteDexUserService === Boolean performCall ( String itentis, String itoris) {