Project

General

Profile

Actions

feature request #10096

closed

Add new TaxonNode status and make notes field more general

Added by Andreas Müller 11 months ago. Updated 9 months ago.

Status:
Closed
Priority:
Priority14
Category:
cdmlib
Target version:
Start date:
Due date:
% Done:

70%

Estimated time:
Severity:
critical

Description

Add taxon node status

  • Excluded geo., øg (geographically out of scope); specification of excluded status
  • Excluded tax., øt (taxonomically out of scope); specification of excluded status
  • Excluded nom., øn (excluded for nomenclatural reasons); specification of excluded status
  • Uncertain application, øa/↑ (name of verified uncertain application); specification of excluded status; the second symbol is math symbol for undefined, we may also think about https://unicode-table.com/en/2BD1/ (uncertainty sign)
  • Unresolved, u (names that could not be clarified with the sources used and need further investigation)

The notes field should be available for all status including NONE (or included). So it should become a general placement note, not only a status note. The according model change (change of field name in TaxonNode) is handled in #10100


Files


Related issues

Related to EDIT - feature request #9010: Display taxon node status excluded, unplaced, placement doubtful on taxon page and taxon tree and show taxon node status note and taxon node source on taxon pageClosedAndreas Kohlbecker

Actions
Related to EDIT - feature request #9002: Find suitable symbols for excluded, unplaced, placement doubtfulNewKatja Luther

Actions
Related to EDIT - feature request #9005: Make the TaxonNode flags alternatives and change excluded notes to status notesClosedAndreas Müller

Actions
Related to EDIT - feature request #8281: Doubtful flag for TaxonNodeClosedAndreas Müller

Actions
Related to EDIT - bug #10120: After status change symbol not shown in navigator In ProgressKatja Luther

Actions
Related to EDIT - bug #10121: ConstraintViolationException when editing placement notesWorksformeKatja Luther

Actions
Copied to EDIT - task #10100: Rename statusNote into placementNote in TaxonNodeNewAndreas Müller

Actions
Copied to EDIT - feature request #10103: Add "Included" as default status to taxon node statusNewAndreas Müller

Actions
Actions #1

Updated by Andreas Müller 11 months ago

  • Status changed from New to Discussed
  • Severity changed from normal to critical
Actions #2

Updated by Andreas Müller 11 months ago

  • % Done changed from 0 to 10
Actions #4

Updated by Andreas Müller 10 months ago

WGB:

ich habe eine Diskussion aus dem Mai 2020 wieder aufgegriffen, da ich dringend eine Erweiterung des Placement-Vokabulars brauche – bzw. die Möglichkeit, dort referenzierte Notes abzulegen. Seht Ihr Euch das anhängende mal an? Vor allem, ob die Statusangaben auf der 2. Seite so akzeptabel sind? Dann kann das Andreas hoffentlich noch im neuen Release unterbringen.
Das sollte vollständig rückwärtskompatibel sein, da die bisherigen Termini und Symbole beibehalten werden.
Der nächste Schritt wäre dann, dies vernünftig in den Print- und vor allem den Portal-Output zu integrieren, da gibt’s noch Diskussionsbedarf.
Nadja hatte sich das schon angesehen und ergänzt.

==

Norbert und Eckhard sind wohl nicht dazu gekommen, dies zu kommentieren, ich glaube aber, dass mit dem Abdecken von Nadjas Kommentaren die Sache in sich schlüssig ist. Außerdem kann ja (durch die Kompatibilität mit der bisherigen Lösung im Eingabebereich) auch kein Schaden angerichtet werden, wenn wir das jetzt schon so im Taxonomic Editor implementieren. Das (in Kombination mit der Ausgabe der Status note und der sub-Namen bei den sec.-Refs in CDM-light) wird es mir dann ermöglichen, die Achyranthoid-Clade-Checklist für die Publikation direkt aus der Datenbank zu generieren.

NoK:

ich habe keine Einwände, aber noch eine Nachfrage zur gegenwärtigen Implementierung:
Ich habe gelegentlich den Fall, dass ich ein taxon node provisorisch und informell nur mit einem lineage/clade Namen bezeichnen möchte (z.B. "Melanoseris lineage"), weil noch nicht entscheiden ist, ob dieses Monophylum tatsächlich als separate Gattung akzeptiert werden sollte, weshalb sich darunter auch Arten mit anderen Gattungsnamen befinden. Die gegenwärtige Implementierung versieht im Taxon Editor diese nodes automatisch mit dem unplaced ("??") Symbol (was inhaltlich falsch ist, da die Platzierung im nächsthöheren Taxon gar nicht in Frage steht), ohne dass ich das editieren könnte. Da das im Portal nicht ausgeben wird, stört es mich auch nicht sonderlich., wenn aber an einer Ausgabe gearbeitet wird, muss dieser Automatismus geändert werden oder zumindest der Status editierbar gemacht werden. Einen eigene Status dafür finde ich nicht nötig, da die informelle Benennung für sich spricht.

AM:

vielen Dank für die Antwort. Inhaltlich würde ich Kommentare hierzu den anderen Taxonomen überlassen, insbesondere auch die Frage, ob dieser Fall bereits von einem der anderen Status irgendwie abgedeckt ist.

Aber eine formale Anmerkung: du sagst „Einen eigene Status dafür finde ich nicht nötig, da die informelle Benennung für sich spricht.“ Das stimmt sicherlich für den menschlichen Leser, die Frage ist aber, ob nicht auch Maschinen diesen Status interpretieren können sollten. Das fängt mit der Frage an, ob bei der Sortierung (die ja von Maschinen gemacht wird) abgewichen werden soll vom Standard, insbesondere auch, wenn dem Pseudonamen eigentlich kein Rang zugewiesen ist. Zudem wäre es hilfreich, bei Validierungsfragen (derzeit leider noch kaum sichtlich implementiert) anhand eines Status zu erkennen, um was es sich hier handelt. Z.B. kann dann erkannt werden, dass der Gattungsname der Kinder nicht falsch ist, obwohl er nicht mit dem Eltern-Namen übereinstimmt. Auch wäre die Frage nach einem speziellen Symbol oder einer speziellen Formatierung zu stellen und vielleicht noch andere Dinge.

Vieles davon gilt vermutlich für alle „Pseudotaxa“, weshalb ich eigentlich auch nochmal eine Diskussion über das wann, wo und weshalb werden Pseudotaxa benutzt und wie können sie vom Modell am besten unterstützt werden, führen würde.
Allerdings muss das nicht jetzt sein, um nicht die von Walter dringend benötigten neuen Taxonknoten Status zu verzögern.

NoK:

Du hast natürlich recht. Ich hatte das mit dem eigenen Status auch eher pragmatisch im unmittelbaren Kontext gemeint. Abgedeckt scheint mir dieser Status durch Walters Erweiterungen tatsächlich noch nicht.

AM:

würde es dann Sinn machen, für solche „Lineage“ Taxa/Knoten einen eigenen Status hinzuzufügen. Wie würden wir ihn dann benennen? „Lineage“? „Clade“? Was würde da alles drunter fallen?
Und ist er richtig angesiedelt bei TaxonNode oder ist es eher eine reine Taxon Info? Ich würde persönlich ersteres erwarten, da das „Taxon“ ja primär zur Einsortierung der Kindtaxa gedacht ist, als eine Positionsbezogene Information.

WGB:

ich bin mir nicht sicher, ob wir dies irgendwie (maschinenlesbar) abbilden müssen, die einzige Nutzung die mir einfällt, ist ein Filter bei der Ausgabe reiner Namenslisten. Wir haben hier auch andere nicht-Code „Node-Typen“, die über Rangstufen abgebildet werden, wie z.B. Aggregate, Species groups, informelle höhere Taxa („Gymnospermes“), etc.

Actions #5

Updated by Andreas Müller 10 months ago

  • Related to feature request #9010: Display taxon node status excluded, unplaced, placement doubtful on taxon page and taxon tree and show taxon node status note and taxon node source on taxon page added
Actions #6

Updated by Andreas Müller 10 months ago

  • Related to feature request #9002: Find suitable symbols for excluded, unplaced, placement doubtful added
Actions #7

Updated by Andreas Müller 10 months ago

  • Related to feature request #9005: Make the TaxonNode flags alternatives and change excluded notes to status notes added
Actions #8

Updated by Andreas Müller 10 months ago

  • Description updated (diff)
Actions #9

Updated by Andreas Müller 10 months ago

  • Description updated (diff)
Actions #10

Updated by Andreas Müller 10 months ago

Actions #11

Updated by Andreas Müller 10 months ago

  • Status changed from Discussed to In Progress
  • % Done changed from 10 to 60

Status added and cdmlight adapted. Still need to test in taxeditor and dataportal.

Actions #12

Updated by Andreas Müller 10 months ago

  • Subject changed from Add new TaxonNode status to Add new TaxonNode status and make notes field more general
Actions #13

Updated by Andreas Müller 10 months ago

  • Description updated (diff)
Actions #14

Updated by Andreas Müller 10 months ago

  • Copied to task #10100: Rename statusNote into placementNote in TaxonNode added
Actions #15

Updated by Andreas Müller 10 months ago

  • Description updated (diff)
Actions #16

Updated by Andreas Müller 10 months ago

  • Status changed from In Progress to Resolved
  • Assignee changed from Andreas Müller to Katja Luther
  • % Done changed from 60 to 70

This should be fixed now. Katja, can you please review when back.

Please also have a look to the changes in TaxEditor code (commit:75f1593acb707) and fully remove the commented code there if my implementation is correct. Maybe the code can be cleaned up further.

Actions #17

Updated by Andreas Müller 10 months ago

@Katja: can you please also have a look why there are 3 messages.properties that seem to hold the same values (in taxeditor.local, taxeditor.store and taxeditor.workbench). Is this really necessary or can we deduplicate them. It looks like only the one in t.store is used in the current example.
These 3 messages.properties are very cofusing (and time consuming) if you are not used to it.
Can you please deduplicate them if possible?

Actions #18

Updated by Andreas Müller 10 months ago

  • Priority changed from Highest to Priority14
Actions #19

Updated by Andreas Müller 10 months ago

AM:

ich habe das jetzt mal implementiert. Es sollte im nächsten Release (vermutlich noch diese Woche) drin sein.
Ich habe dabei die Status geo excluded, tax excluded, nom excluded und uncertain application alle als Unterstatus (spezifischere Status) von exluded implementiert. D.h. wenn nur auf exluded getestet wird, wird bei diesen Status ebenfalls true zurückgegeben. Bei „uncertain application“ bin ich mir da aber nicht 100% ig sicher, ob das stimmt. Das vorgeschlagene Symbol øa lässt es mich aber vermuten.
Zumindest in cdmlight bekommt man aber alles genau aufgedröselt, also auch, ob der Status exact excluded ist und nicht „nur“ ein Unterstatus. Zudem habe ich eine Textrepräsentation des Status in cdmlight integriert für den Fall der Fälle.

Da die Status jetzt hierarchisch sind, frage ich mich zudem, ob es nicht auch bei unplaced and unresolved eine Hierarchie gibt. Ist evtl. unresolved ein spezifischer Fall von unplaced? Also der Fall, dass alle vorliegenden Quellen durchgegangen wurden und eine genauere Zuordnung nicht möglich war, während unplaced evtl. auch den Fall umfasst, dass die Zuordnung nur vorläufig ist da noch nicht unbedingt alle Quellen befragt wurden. Wenn das nicht so ist, könntet ihr nochmal kurz beschreiben, wie der Unterschied zwischen unresolved und unplaced am besten zu beschreiben ist. Dann kann ich das in die Code Dokumentation mit aufnehmen.

Eine andere Frage wäre, wie die Standardsortierung aussehen sollte. Also welcher Status zuerst (nach „included“), und welcher weiter unten.

WGB:

zwei Nachfragen zum Interface:
“als Unterstatus implementiert” – bedeutet das, dass man erst eine 2. Liste aufmachen muss? Bei der doch recht kurzen Auswahl (9 Zeilen) fände ich das nicht schön.
Und nur „excluded“ ohne Spezifikation bleibt auch erhalten, nicht?

Zur den Labeln würde ich vorschlagen, die etwas länger und dafür ein bisschen mehr selbsterklärend zu machen:
Taxon included in parent taxon (default)
Taxon included in parent taxon with doubts
Taxon unplaced
Name or taxon excluded (unspecific)
Taxon excluded (geographically out of scope)
Taxon or name excluded (taxonomically out of scope)
Name excluded (for nomenclatural reasons)
Name of verified uncertain application
Unresolved name – to be further revised

AM:

nein, keine 2. Liste. Es ist lediglich semantisch klar, dass die Status substatus sind, eventuell könnte man das mal durch Einrücken auch optisch anzeigen. Bislang aber noch nicht der Fall.

Das mit den langen Labeln schau ich mir an, ob das nicht den Dialog etwas sprengt.

WGB:

bei den Labels könnte man noch etwas abkürzen:

Taxon included in parent taxon (default)
Taxon incl. in parent taxon with doubts
Taxon unplaced
Name/taxon excluded (unspecific)
Taxon excl. (geographically out of scope)
Taxon/name excl. (taxonomically out of sc.)
Name excl. (for nomenclatural reasons)
Name of verified uncertain application
Unresolved name – to be further revised

AM:

ich habe das mal implementiert:

Da ist mehr Platz als ich dachte. Man könnte also auch die noch längere Form verwenden? Vielleicht Anzeige mit Symbol vorne dran, das erhöht den Wiedererkennunseffekt.
(Das Sonderzeichen (En-Dash) korrigiere ich noch).

Ich würde gerne aber nochmal auf meine Frage nach der Sortierung zurückkommen. Gibt es da weitere Vorgaben.

Außerdem wäre das Verhältnis von unplaced und unresolved für die interne Dokumentation interessant.

Beide Fragen siehe meine Mail unten.

Actions #20

Updated by Andreas Müller 10 months ago

Actions #21

Updated by Katja Luther 10 months ago

When adding taxonnode status and status note, but this seems to be a problem with the note.

last remote method : https://test.e-taxonomy.eu:443/cdmserver/rem_conf_am/remoting/taxonnode.service
last remote request client time : 2022-08-22T14:54:08.644
last remote request response header time : Mon, 22 Aug 2022 12:54:08 GMT
client error time : 2022-08-22T14:54:08.959
login : admin
editor version : 5.33.0.202208221219
server : test.e-taxonomy.eu (edit-test) / rem_conf_am
schema version : 5.32.0.0.20220807
os : Windows Server 2012 R2 6.3 amd64
java : 1.8.0_131
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:241)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:755)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:594)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:765)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:734)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:522)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:293)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy826.merge(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:78)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy1229.merge(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:212)
    at eu.etaxonomy.cdm.api.remoting.DebuggingRemoteInvocationExecutor.invoke(DebuggingRemoteInvocationExecutor.java:52)
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78)
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:114)
    at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:80)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder$NotAsyncServlet.service(ServletHolder.java:1395)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:215)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
    at eu.etaxonomy.cdm.servlet.DateHeaderFilter.doFilter(DateHeaderFilter.java:56)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1596)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:590)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at eu.etaxonomy.cdm.server.logging.InstanceLogWrapper.handle(InstanceLogWrapper.java:48)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle(Server.java:500)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
    at java.lang.Thread.run(Thread.java:748)
    at org.springframework.remoting.support.RemoteInvocationUtils.fillInClientStackTraceIfPossible(RemoteInvocationUtils.java:45)
    at org.springframework.remoting.support.RemoteInvocationResult.recreate(RemoteInvocationResult.java:149)
    at org.springframework.remoting.support.RemoteInvocationBasedAccessor.recreateRemoteInvocationResult(RemoteInvocationBasedAccessor.java:85)
    at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:158)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy87.merge(Unknown Source)
    at eu.etaxonomy.taxeditor.ui.section.classification.EditTaxonNodeWizard.saveEntity(EditTaxonNodeWizard.java:57)
    at eu.etaxonomy.taxeditor.ui.section.classification.AbstractEditWizard.performFinish(AbstractEditWizard.java:66)
    at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:790)
    at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:423)
    at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:618)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4236)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3824)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:818)
    at org.eclipse.jface.window.Window.open(Window.java:794)
    at eu.etaxonomy.taxeditor.handler.defaultHandler.e4.DefaultOpenTaxonNodeWizardHandlerE4.open(DefaultOpenTaxonNodeWizardHandlerE4.java:61)
    at eu.etaxonomy.taxeditor.handler.defaultHandler.e4.DefaultOpenTaxonNodeWizardHandlerE4.open(DefaultOpenTaxonNodeWizardHandlerE4.java:1)
    at eu.etaxonomy.taxeditor.handler.defaultHandler.e4.DefaultOpenHandlerBaseE4.handleUuidList(DefaultOpenHandlerBaseE4.java:60)
    at eu.etaxonomy.taxeditor.handler.defaultHandler.e4.DefaultOpenHandlerBaseE4.execute(DefaultOpenHandlerBaseE4.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:288)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:264)
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
    at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152)
    at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494)
    at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:488)
    at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210)
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:433)
    at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.handleWidgetSelection(AbstractContributionItem.java:454)
    at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem$3.handleEvent(AbstractContributionItem.java:482)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4236)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3824)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
    at eu.etaxonomy.taxeditor.Application.start(Application.java:20)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46)
    at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1593)
    at org.hibernate.action.internal.CollectionUpdateAction.execute(CollectionUpdateAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:99)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:448)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:582)
    ... 174 more
Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'statusNote_KEY' cannot be null
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1320)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:994)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:384)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
    ... 194 more
Actions #22

Updated by Katja Luther 10 months ago

Newly set status are not shown in the navigator (tested for 'taxon included in parent taxon with doubts' and 'unplaced')

update: after reconnect the status is shown

Actions #23

Updated by Katja Luther 9 months ago

Katja Luther wrote in #note-22:

Newly set status are not shown in the navigator (tested for 'taxon included in parent taxon with doubts' and 'unplaced')

update: after reconnect the status is shown

moved to new ticket #10120

Actions #24

Updated by Katja Luther 9 months ago

  • Related to bug #10120: After status change symbol not shown in navigator added
Actions #25

Updated by Katja Luther 9 months ago

Katja Luther wrote in #note-21:

When adding taxonnode status and status note, but this seems to be a problem with the note.

last remote method : https://test.e-taxonomy.eu:443/cdmserver/rem_conf_am/remoting/taxonnode.service
last remote request client time : 2022-08-22T14:54:08.644
last remote request response header time : Mon, 22 Aug 2022 12:54:08 GMT
client error time : 2022-08-22T14:54:08.959
login : admin
editor version : 5.33.0.202208221219
server : test.e-taxonomy.eu (edit-test) / rem_conf_am
schema version : 5.32.0.0.20220807
os : Windows Server 2012 R2 6.3 amd64
java : 1.8.0_131
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
  at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:241)

create new ticket for KL (#10121)

Actions #26

Updated by Katja Luther 9 months ago

  • Related to bug #10121: ConstraintViolationException when editing placement notes added
Actions #27

Updated by Katja Luther 9 months ago

  • Status changed from Resolved to Closed
  • Assignee changed from Katja Luther to Andreas Müller
Actions

Also available in: Atom PDF