View Issue Details

IDProjectCategoryView StatusLast Update
0000337GORM[Adventure PHP Framework] Bugpublic2018-08-25 14:42
ReporterGeneral CrimeAssigned ToChristianAchatz 
PriorityimmediateSeveritycrashReproducibilityalways
Status resolvedResolutionfixed 
Product Version[Adventure PHP Framework] 3.4 
Target Version[Adventure PHP Framework] 4.0Fixed in Version[Adventure PHP Framework] 4.0 
Summary0000337: Beziehungen mit Zeitstempel funktionieren nicht mehr.
DescriptionIch hatte es gar nicht mitbekommen das die Properties der Domain Objekte nun wieder geprüft werden.

Dadurch wird der Zeitstempel der den Namen **UniqueID***_CreationTimestamp trägt beim Mappen mit setProperty leider abgelehnt da er nicht in der Liste der erlaubten Properties steht und auch nie so stehen wird.
Steps To ReproduceEinfach einer Beziehung den Wert Timestamps = "TRUE" geben.
Additional InformationIdee zum Fix: Ich kann dieses Feld vorher bekannt machen. ->addAllowedProperty().
Zudem gibt es eine extreme redundanz was Funktionen rund um die Properties angeht. Da jedes Base Objekt sein setProperty etc besitz.
TagsNo tags attached.
Codereferenz: ([Datei]:[Zeile])

Activities

ChristianAchatz

2018-07-06 17:54

administrator   ~0000822

Hallo GeneralCrime,

magst du mir kurz ein Beispiel schicken, wie du das GenericDomainObject nutzt?

Generell gilt: der "CreationTimestamp" ist eine systemische Property und wird beim Erstellen des Objekts automatisch gesetzt.

Magst du mir noch kurz beschreiben, wo du die Redundanz in den Methoden siehst? Meinst du bei den generierten DTOs? Bei diesen wird sein einiger Zeit jeweils eine explizite Methode für jede Property generiert um das automatische Füllen und Auslesen von GORM-Models im Rahmen von Formularen zu ermöglichen (siehe https://adventure-php-framework.org/Seite/114-Verwendung-von-Formularen#Chapter-10-Fuellen-von-DTOs-und-Models).

General Crime

2018-07-06 19:19

developer   ~0000823

Domainobjects.ini

[Base]
Class = "GWGAME\biz\base\model\GwBase"

[Player]
Class = "GWGAME\biz\base\model\GwPlayer"

Realtions.ini
[Player2Base]
Type = "ASSOCIATION"
SourceObject = "Player"
TargetObject = "Base"
Timestamps = "TRUE"

dann halt mittels Player die Base Objekte laden.

Es geht hier nicht um den normalen CreationTimestamp sondern den aus der Relation.
Wenn ich aus der GwPlayer herraus die Realtion laden will erstellt er natürlich GwBase Objekte und nutzt dann dessen setProperty() funktion die in der GwBaseBase generiert wurde. Diese Prüft aber ob der property überhaupt erlaubt ist. Jedoch übergibt das Script den Relation CreationTimestamp mit dem Namen *Hash*_CreationTimestamp. Diesen gibt es logischerweise nicht.

Leider konnte ich den Eintrag nicht editieren sonst hätte ich noch die Datei und die Zeile angegeben.

APF\modules\genericormapper\data\GenericORRelationMapper:699
APF\modules\genericormapper\data\GenericORRelationMapper:714 => Hier nimmt er natürlich mein Object GwBase was von GenericDomainObject logischerweise erbt.
APF\modules\genericormapper\data\GenericDomainObject:562
****\GwBaseBase->setProperty() => hier keine Eintragung des Property weils nicht erlaubt ist.
****\GwBaseBase->getProperty() und die ausgaben von allen könnten auch betroffen sein.

Die Redundanz besteht meiner Meinung nach in den getPropert(y|ies) und setPropert(y|ies) diese sind in dem eigenem generierten Objekt vorhanden aber auch in dem GenericDomainObject der einzige unterschied ist das sie in der dem eigenen Objekt die Prüfung der erlaubten Werte besitzen.

Hoffe ich konnte das nun verständlich rüber bringen.

ChristianAchatz

2018-07-08 22:44

administrator   ~0000824

Hi,

danke für deine Beschreibung, war sehr hilfreich!

Ich muss gestehen, ich habe erst nach dem dritten Mal Lesen das Problem wirklich verstanden. :) Ich fürchte die Funktionalität ist in der Tat kaputt. Nach meiner lokalen History müsste das durch den Change ID#322 verursacht sein - die Einführung der Verwendung mit fillForm() und fillModel().

Ich habe leider auch keinen UnitTest dazu gefunden, insofern gehe ich davon aus, dass er bei der Implementierung damals auch nicht aufgefallen ist.

Da hilft nur eins: fixen und UnitTests schreiben, damit das zukünftig bei Änderungen abgedeckt ist.

----

Die von dir angesprochenen Redundanzen sind tatsächlich notwendig um HtmlFormTag::fillModel() und HtmlFormTag::fillForm() in Verbindung mit GORM DTOs nutzen zu können. Das geht nur, wenn du explizite Properties in den Klassen und entsprechende Methoden dazu hast (siehe mein Link oben). Insofern ist das aus Code-Style-Gesichtspunkten schon sinnvoll, sollte natürlich aber kein Feature kaputt machen.

Ich kümmere mich nach meinem Urlaub (23.07.) um die Behebung. Solltest du in der Zwischenzeit Zeit für einen Vorschlag für einen Fix haben, freue ich mich natürlich über einen Pull-Request.

Idee: vielleicht kannst du in der Zwischenzeit die Methoden getProperty(), setProperty() und deleteProperty() in deinem GwPlayer einfach aus GwPlayerBase nochmals überschreiben - diesmal nur ohne Check. Dann sollte es meiner Analyse nach wieder funktionieren.

ChristianAchatz

2018-07-08 22:45

administrator   ~0000825

Accepted as defect.

ChristianAchatz

2018-08-20 09:14

administrator   ~0000828

Started creating a set up unit tests to cover described functionality. Due to high complexity of feature, test creation will take some time.

ChristianAchatz

2018-08-24 19:57

administrator   ~0000829

@GeneralCrime:
Ich habe den Fehler nun gefunden und (lokal) eine Lösung implementiert, die sowohl die Verwendung des GenericDomainObject als auch von eigenen Domänen-Objekten unterstützt. Allerdings gefällt mir die Lösung Design-technisch nicht.

Warum?

1) Der Zeitstempel der Relation wird nur dann im Domänen-Objekt ausgelesen und befüllt wenn du die Methode(n) loadRelatedObject(s) nutzt.
2) Wenn ein Objekt mehrer in Beziehung stehende Objekte besitzt, ist die Property GenericDomainObject::relationCreationTimestamp nicht eindeutig, da sie nicht mit den Namen der Beziehung "typisiert" ist.

Ich würde daher gerne eine bessere Lösung erarbeiten und z.B. versuchen eine Repräsentation einer Relation einzuführen um diese explizit laden zu können - z.B. ein GenericRelationObject o.ä.

Magst du mir ein paar Sätze zu deinem konkreten Anwendungsfall erklären? Wozu nutzt du den Timestamp in deiner Applikation?

Danke dir!

General Crime

2018-08-25 10:47

developer   ~0000830

Ich nutze dies eigentlich nur um Festzuhalten wann ein Spieler einer Allianz beigetreten ist oder wann ein Spieler einen Stützpunkt erobert hat.
Ansonsten ist mir halt kein wirkliches nutzen bekannt aber für sowas halt Ideal.

ChristianAchatz

2018-08-25 11:43

administrator   ~0000831

Implementation completed. See changes and test under https://github.com/AdventurePHP/code/commit/eb1745d2437ea1a4c9f6880b91ad26e5262be88e.

IMPORTANT NOTE:
In order to correctly use this feature, re-generate your custom domain objects as the GenericORMapperDomainObjectGenerator has been adapted to allow relation timestamp mapping for custom domain objects!

ChristianAchatz

2018-08-25 11:48

administrator   ~0000832

Vielen Dank für dein Feedback! Für deinen Anwendungsfall reicht natürlich die aktuelle Funktionalität aus. Alternativ könntest du am "GwPlayer" natürlich noch entsprechende Attribute definieren, was aber natürlich aufwändiger ist.

Mit dem Fix ist die Funktionalität auf jeden Fall wieder sicher gestellt und wird in Zukunft nicht wieder vergessen! :)

Nachdem du das nur für einen konkreten Anwendungsfall ohne weitere Komplexität hinsichtlich Mehrfach-Beziehungen nutzt, lassen wir das erstmal so. Solltest du in Zukunft auf Probleme stoßen, lass uns nochmal über die konkreten Anwendungsfälle sprechen.

Related Changesets

Import 2018-08-25 14:21:19: master eb1745d2

2018-08-25 11:41:13

Christian Achatz

Details Diff
ID#337: fixed relation timestamp mapping for generic and custom domain objects. Affected Issues
0000337
mod - modules/genericormapper/data/GenericDomainObject.php Diff File
mod - modules/genericormapper/data/GenericORRelationMapper.php Diff File
mod - modules/genericormapper/data/tools/GenericORMapperDomainObjectGenerator.php Diff File
add - tests/suites/modules/genericormapper/GenericORRelationMapperTest.php Diff File

Issue History

Date Modified Username Field Change
2018-07-05 22:26 General Crime New Issue
2018-07-06 17:54 ChristianAchatz Note Added: 0000822
2018-07-06 19:19 General Crime Note Added: 0000823
2018-07-08 22:44 ChristianAchatz Note Added: 0000824
2018-07-08 22:45 ChristianAchatz Assigned To => ChristianAchatz
2018-07-08 22:45 ChristianAchatz Status new => acknowledged
2018-07-08 22:45 ChristianAchatz Note Added: 0000825
2018-08-20 09:14 ChristianAchatz Note Added: 0000828
2018-08-24 19:57 ChristianAchatz Note Added: 0000829
2018-08-25 10:47 General Crime Note Added: 0000830
2018-08-25 11:43 ChristianAchatz Note Added: 0000831
2018-08-25 11:48 ChristianAchatz Note Added: 0000832
2018-08-25 11:49 ChristianAchatz Status acknowledged => resolved
2018-08-25 11:49 ChristianAchatz Resolution open => fixed
2018-08-25 11:49 ChristianAchatz Fixed in Version => 4.0
2018-08-25 11:50 ChristianAchatz Target Version => 4.0
2018-08-25 14:42 ChristianAchatz Changeset attached => Import 2018-08-25 14:21:19 master eb1745d2