elexis/elexis-3-base

TessinerCode Diagnose kann Konsultation nicht angefügt werden

Closed this issue · 5 comments

Eine Instanz von TessinerCode kann über die Methode Konsultation#addDiagnose(IDiagnose) nicht hinzugefügt werden.
Beispielcode:

Konsultation kons = someFall.neueKonsultation();
kons.addDiagnose(TessinerCode.getFromCode("R9"));

Der Code produziert folgende Exception:

java.lang.ClassCastException: ch.elexis.base.ch.ticode.TessinerCode cannot be cast to ch.elexis.data.PersistentObject
	at ch.elexis.data.Person.countItem(Person.java:239) ~[ch.elexis.core.data/:na]
	at ch.elexis.data.Konsultation.addDiagnose(Konsultation.java:666) ~[ch.elexis.core.data/:na]
	at ch.itmed.radcentre.importer.ConsultationImp.addDiagnose(ConsultationImp.java:233) ~[ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.importer.ConsultationImp.updateExistingConsultation(ConsultationImp.java:88) ~[ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.importer.ConsultationImp.checkExistingConsultation(ConsultationImp.java:64) ~[ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.importer.ConsultationImp.addConsultation(ConsultationImp.java:42) ~[ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.importer.DataImporter.startImport(DataImporter.java:22) ~[ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.xml.XmlParser.run(XmlParser.java:20) ~[ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.job.DirectoryWatcherRunnable.processFile(DirectoryWatcherRunnable.java:151) [ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.job.DirectoryWatcherRunnable.lambda$4(DirectoryWatcherRunnable.java:82) [ch.itmed.radcentre/:na]
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) ~[na:1.8.0_172]
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source) ~[na:1.8.0_172]
	at java.util.stream.ReferencePipeline.forEach(Unknown Source) ~[na:1.8.0_172]
	at ch.itmed.radcentre.job.DirectoryWatcherRunnable.processExistingFiles(DirectoryWatcherRunnable.java:82) [ch.itmed.radcentre/:na]
	at ch.itmed.radcentre.job.DirectoryWatcherRunnable.run(DirectoryWatcherRunnable.java:51) [ch.itmed.radcentre/:na]
	at java.lang.Thread.run(Unknown Source) ~[na:1.8.0_172]
-----------End Exception handler-----

Wenn bei einer bestehenden Konsultation ein TessinerCode hinzugefügt wird, erscheint keine Exception, sondern lediglich eine Warnung.
Beispielcode:

Konsultation kons = someFall.getLetzteBehandlung();
kons.addDiagnose(TessinerCode.getFromCode("R9"));

Produzierte Warnung:

WARN  c.e.data.PersistentObjectFactory - Could not createFromString [ch.elexis.base.ch.ticode.TessinerCode::R9]

In beiden Fällen ist es jedoch so, dass der TessinerCode der Konsultation nicht angefügt wird.

Das Problem muss über den core gefixed werden

elexis/elexis-3-core@c41db4e

@d-roesch ich habe einen patch eingebracht, momentan läuft der master build, kannst du diesen dann bitte auf dem aktuellen master testen? danke

@col-panic besten Dank für die schnelle Reaktion.

Die Exception kann ich nun nicht mehr reproduzieren.
Jedoch ist es so, dass Instanzen von TessinerCode immer noch nicht zur Konsultation hinzugefügt werden. Es erscheint folgende Meldung:

WARN  c.e.data.PersistentObjectFactory - Could not createFromString [ch.elexis.base.ch.ticode.TessinerCode::U9]

Soweit ich den Fehler interpretiere, versucht die PersistentObjectFactory über PersistentObjectFactory .createFromString eine Instanz von TessinerCode zu erzeugen.
Zu diesem Zweck nutzt die PersistentObjectFactory die DiagnoseCodeFactory:

PersistentObject ret = (PersistentObject) (load.invoke(null, new Object[] {
ci[1]
}));

Dies ist jedoch nicht möglich, weil die Klasse TessinerCode nicht von PersistentObject erbt. Gerade dies scheint das Feature dieser Klasse zu sein:

* Copy of the ch.elexis.data.TICode class, but without PersistentObject dependencies.

Ist es überhaupt vorgesehen, dass Instanzen von TessinerCode als Diagnose zu einer Konsultation hinzugefügt werden können?

hmm ok, bitte bleib einfach momentan dabei die Klasse TessinerCode zu verwenden. Wir arbeiten momentan an einer neuen Persistenz die vmtl. mit 3.8 Einzug halten wird. Dort werden wir die Dinge dann ohnehin anders lösen :)

Timeout