Project

General

Profile

Actions

bug #8785

open

Move functionality of buttons to context menu of the character matrix

Added by Andreas Müller almost 4 years ago. Updated over 3 years ago.

Status:
Resolved
Priority:
Highest
Category:
taxeditor
Target version:
Start date:
Due date:
% Done:

40%

Estimated time:
Severity:
blocker
Found in Version:
Tags:

Description

The issue is described in #8784 but I created a new ticket as it is as deleting a specimen description (which is handled in #8784) and removing it from the dataset (but not deleting it from the specimen) are 2 different issues.

Another issue we should handle in this ticket is to keep the changes until the user saves the character matrix.
Therefore we need following adaptions:

  • SpecimenRowWrapperDTO should be a real Dto without complete cdm entities (at the moment fieldunit and specimen are real cdm entities) this is implemented now
  • create the specimenRowWrapperDto on editor side and save when the user clicks save. this is implemented as well
  • move functionality of "aggregate" and "create polytomous key" to the context menu and remove the buttons

Files

picture647-1.png (9.13 KB) picture647-1.png Andreas Müller, 06/19/2020 08:58 AM
picture265-1.png (6.06 KB) picture265-1.png Andreas Müller, 06/19/2020 09:02 AM
picture052-1.png (5.46 KB) picture052-1.png Andreas Müller, 06/19/2020 09:25 AM

Related issues

Related to EDIT - bug #8784: Deleting a specimen description not possibleClosedKatja Luther

Actions
Related to EDIT - bug #8782: Delete a description included in a CdmSource should not be possibleClosedKatja Luther

Actions
Related to EDIT - bug #8783: Massive Heap consumption in server instance opening the Description-Matrix editorClosedKatja Luther

Actions
Copied to EDIT - feature request #9084: Make it configurable if a Description is deleted only from the Descriptive Data Set or from it's Specimen/TaxonResolvedAndreas Müller

Actions
Actions #1

Updated by Andreas Müller almost 4 years ago

Also this one I put to current milestone for same reason as #8784

Actions #2

Updated by Andreas Müller almost 4 years ago

  • Related to bug #8784: Deleting a specimen description not possible added
Actions #3

Updated by Andreas Müller almost 4 years ago

  • Related to bug #8782: Delete a description included in a CdmSource should not be possible added
Actions #4

Updated by Katja Luther almost 4 years ago

  • Status changed from New to In Progress

this should be possible in character matrix. I have to test this.

Actions #5

Updated by Andreas Müller almost 4 years ago

Katja Luther wrote:

this should be possible in character matrix. I have to test this.

yes, it should be handled via context menu

Actions #6

Updated by Katja Luther almost 4 years ago

  • Target version changed from Release 5.12 to Release 5.13
Actions #7

Updated by Katja Luther almost 4 years ago

  • Status changed from In Progress to Feedback
  • Assignee changed from Katja Luther to Andreas Müller

removing of a specimen description from a descriptive dataset works in character matrix by selecting the whole row of the specimen and click on the delete button.

Should we implement a menu item for deletion of a description or is a button ok?

Actions #8

Updated by Andreas Müller over 3 years ago

  • Status changed from Feedback to New
  • Assignee changed from Andreas Müller to Katja Luther
  • Target version changed from Release 5.13 to Release 5.14

Katja Luther wrote:

removing of a specimen description from a descriptive dataset works in character matrix by selecting the whole row of the specimen and click on the delete button.

Should we implement a menu item for deletion of a description or is a button ok?

It is true it works as described above.

Yes we should implement a menu item for deletion as this is how the TaxEditor usually handles deletes (except for forms where the delete button is immediately beside the field/record which should be delete).

We may also add an "add"-item to the menu which then does the same as the "add"-button below the table.

Actions #9

Updated by Andreas Müller over 3 years ago

  • Subject changed from Removing a specimen description from a descriptive data set not possible to Improve add+delete for specimen (descriptions) in the descriptive data matrix
Actions #10

Updated by Katja Luther over 3 years ago

  • Target version changed from Release 5.14 to Release 5.15
Actions #11

Updated by Katja Luther over 3 years ago

mail to AM and NK:

Hallo ihr beiden,

ich bin gerade dabei die Character Matrix Tickets ab zu arbeiten. Ein Punkt ist, dass es einen Menüpunkt zum Entfernen von Descriptions aus dem DescriptiveDataSet geben soll. Dafür habe ich mir den Code zu dem Button angeschaut. Das Entfernen wird dort nur durchgeführt, wenn die gesamte Zeile ausgewählt ist, sonst passiert nichts.
War das so gewollt, soll ich das für das Menü auch so implementieren oder reicht es, wenn die erste Zelle der Zeile ausgewählt ist?

Viele Grüße,
Katja


Hallo Katja,

ich glaube, ich hatte das auch schon mal mit Patrick (oder dir?) diskutiert, weil mir das nicht intuitiv war. Ich würde sagen es reicht eine Zelle der Zeile.

Viele Grüße,
Andreas M


Ehrlich gesagt, würde ich die Button ja ganz löschen. Das entspricht nicht unserem üblichen Vorgehen, welches immer über Kontextmenü geht in ähnlichen Fällen wie z.B. im Bulk oder Nameeditor oder Navigator.
Das würde dann auch für die anderen Button gelten, also insbesondere den „Add“ Button. Aber ich denke wir können auch das Aggregieren und den Schlüssel darüber laufen lassen. Das wäre sogar hilfreich, wenn man nur partiell aggregieren/Schlüssel erzeugen will und nicht und für alle Taxa. Da könnte die Auswahl des höchsten Taxons dann durch das Kontextmenü erfolgen. Und dann kann man im Konfigurator, ähnlich wie bei Exporten dann noch auswählen, ob doch für das ganze Dataset aggregiert/generiert werden soll.

Norbert, siehst du das auch so, oder würdest du bei den Button bleiben?


Fände ich auch schöner, zumal ich bei den Buttons erstmal nicht so recht wusste, was da eigentlich passieren soll und im Menü sind die Namen aussagekräftiger.

Habe es dann auch gleich so umgeschrieben, dass das Entfernen nicht gleich gespeichert wird.

Actions #12

Updated by Katja Luther over 3 years ago

  • Status changed from New to In Progress
Actions #13

Updated by Katja Luther over 3 years ago

  • Description updated (diff)
Actions #14

Updated by Katja Luther over 3 years ago

  • Description updated (diff)
Actions #15

Updated by Katja Luther over 3 years ago

  • Status changed from In Progress to Resolved
  • Assignee changed from Katja Luther to Andreas Müller

Now the buttons are removed and add and delete is moved to the context menu. If a taxon node is selected the specimen of the taxon and the child taxa are shown in the selection dialog. if no taxon is selected all specimen are shown in the selection dialog. clicking on the refresh button of the dialoag also updates the view with all included specimens.

Actions #16

Updated by Katja Luther over 3 years ago

  • Status changed from Resolved to In Progress
  • Assignee changed from Andreas Müller to Katja Luther
Actions #17

Updated by Katja Luther over 3 years ago

There is still big one open issue: adding the first specimen does not work by context menu because the context menu is not shown without any rows.

Actions #18

Updated by Katja Luther over 3 years ago

  • Status changed from In Progress to Resolved
  • Assignee changed from Katja Luther to Andreas Müller

Katja Luther wrote:

There is still big one open issue: adding the first specimen does not work by context menu because the context menu is not shown without any rows.

This issue is fixed now, please review.

Actions #19

Updated by Andreas Müller over 3 years ago

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

"Add description" is still missing a translation. Also I think we should call it "Add specimen description" because it only handles specimen descriptions not taxon descriotions ("literatur").

Actions #20

Updated by Andreas Müller over 3 years ago

An important open issue is that it is currently not possible to add a "literature"- or a "default"-description for a taxon which has not yet a specimen description attached. Especially for "literature" descriptions this is problematic as they may be alterantives for missing specimen descriptions.

Actions #21

Updated by Andreas Müller over 3 years ago

Also the buttons "Aggregation" and "Generate Polytomous Key" should be handled in the menu, not as separate buttons. Especially for the aggregation the taxon selection might be input (taxon node filter) for the aggregation. Later this may become a parameter for the key generation as well.

Actions #22

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

An important open issue is that it is currently not possible to add a "literature"- or a "default"-description for a taxon which has not yet a specimen description attached. Especially for "literature" descriptions this is problematic as they may be alterantives for missing specimen descriptions.

I think this is an extra ticket because therefore the structure of the character matrix needs to be changed, because at the moment everything is based on the specimen and only taxa with selected specimen are shown in the matrix.

Actions #23

Updated by Katja Luther over 3 years ago

  • Subject changed from Improve add+delete for specimen (descriptions) in the descriptive data matrix to Move functionality of buttons to context menu of the character matrix
Actions #24

Updated by Katja Luther over 3 years ago

  • Description updated (diff)
Actions #25

Updated by Katja Luther over 3 years ago

  • Status changed from Feedback to In Progress
Actions #26

Updated by Katja Luther over 3 years ago

  • % Done changed from 0 to 30
Actions #27

Updated by Andreas Müller over 3 years ago

Katja Luther wrote:

Andreas Müller wrote:

An important open issue is that it is currently not possible to add a "literature"- or a "default"-description for a taxon which has not yet a specimen description attached. Especially for "literature" descriptions this is problematic as they may be alterantives for missing specimen descriptions.

I think this is an extra ticket because therefore the structure of the character matrix needs to be changed, because at the moment everything is based on the specimen and only taxa with selected specimen are shown in the matrix.

I agree that this is new functionality and therefore we may move it to a new ticket: #9054

Actions #28

Updated by Andreas Müller over 3 years ago

  • Description updated (diff)
Actions #29

Updated by Katja Luther over 3 years ago

the key generation is also moved to the context menu and the buttons are removed now. The funtionality of key generation is only moved not adapted, so the taxon selection is still by taxon selection dialog.

Actions #30

Updated by Andreas Müller over 3 years ago

Is this ticket ready for review or are there open issues (beside the known PK-Generation issues which we should move to a new ticket)?

Actions #31

Updated by Katja Luther over 3 years ago

  • Description updated (diff)
Actions #32

Updated by Katja Luther over 3 years ago

  • Status changed from In Progress to Resolved
  • Assignee changed from Katja Luther to Andreas Müller

Andreas Müller wrote:

Is this ticket ready for review or are there open issues (beside the known PK-Generation issues which we should move to a new ticket)?

This should be ready for review now-

Actions #33

Updated by Andreas Müller over 3 years ago

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

Generally this works.

There is 1 open issue which is a bit critical: it is only possible to a specimen for a taxon which is not yet shown in the matrix if the focus is not set to any record. But this is difficult to achieve once a record got the focus. It is possible by collapsing all records and then choose "Add specimen description". But this is something the user needs to know.

A possible solution could be to do it the same way as for the aggregations and let the search dialog have a filter for "Selected Taxon", "Selected Subtree" and "Full recordset".
Maybe there are even better solutions.

If this is difficult to implement feel free to move to 5.16 but we should implement it soon.

Actions #34

Updated by Andreas Müller over 3 years ago

When changing a value (1 out of 3 exact values) I got an exception during save:

last remote method : http://test.e-taxonomy.eu:80/cdmserver/rem_conf_am/remoting/description.service
last remote request client time : 2020-06-16T15:50:15.415
last remote request response header time : Tue, 16 Jun 2020 15:50:15 GMT
client error time : 2020-06-16T15:50:15.524
login : admin
editor version : 5.15.0.202006160814
server : test.e-taxonomy.eu (edit-test) / rem_conf_am
schema version : 5.15.2.0.20200611
os : Windows Server 2012 R2 6.3 amd64
java : 1.8.0_121
org.eclipse.e4.core.di.InjectionException: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:247)
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:90)
    at org.eclipse.e4.ui.internal.workbench.PartServiceSaveHandler.save(PartServiceSaveHandler.java:57)
    at org.eclipse.ui.internal.WorkbenchWindow$7.save(WorkbenchWindow.java:594)
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.savePart(PartServiceImpl.java:1390)
    at eu.etaxonomy.taxeditor.workbench.SaveHandler.execute(SaveHandler.java:38)
    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.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.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:147)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:741)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:589)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
    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:208)
    at com.sun.proxy.$Proxy656.mergeDescriptions(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:302)
    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:208)
    at com.sun.proxy.$Proxy1060.mergeDescriptions(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:74)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
    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:316)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:213)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
    at eu.etaxonomy.cdm.servlet.DateHeaderFilter.doFilter(DateHeaderFilter.java:55)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    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:47)
    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:150)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
    at com.sun.proxy.$Proxy359.mergeDescriptions(Unknown Source)
    at eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix.CharacterMatrixPart.save(CharacterMatrixPart.java:205)
    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)
    ... 48 more
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2886)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3386)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
    at org.hibernate.envers.internal.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:156)
    at org.hibernate.envers.internal.synchronization.AuditProcessManager$1.doBeforeTransactionCompletion(AuditProcessManager.java:46)
    at org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:899)
    at org.hibernate.engine.spi.ActionQueue.beforeTransactionCompletion(ActionQueue.java:481)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2340)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:581)
    ... 169 more
Caused by: java.sql.SQLException: No value specified for parameter 6
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1132)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1057)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1377)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1042)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:384)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    ... 189 more
Actions #35

Updated by Andreas Müller over 3 years ago

... however, the value was stored in the DB, so maybe the error occurred during save for AUD data.

Actions #36

Updated by Andreas Kohlbecker over 3 years ago

"Das Label im Kontextmenü "Add Specimen Descriptions" ist zwar inhaltlich richtig aber "Add Specimens" wäre intuitiver und kürzer"

2x +1 by votes in Riot

==> please can you change the contex menu item label to "Add Specimens"

Actions #37

Updated by Katja Luther over 3 years ago

Andreas Kohlbecker wrote:

"Das Label im Kontextmenü "Add Specimen Descriptions" ist zwar inhaltlich richtig aber "Add Specimens" wäre intuitiver und kürzer"

2x +1 by votes in Riot

==> please can you change the contex menu item label to "Add Specimens"

done

Actions #38

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

... however, the value was stored in the DB, so maybe the error occurred during save for AUD data.

this problem is caused by

insert into StatisticalMeasurementValue_AUD (REVTYPE, created, uuid, updated, value, value_scale, createdBy_id, updatedBy_id, quantitativeData_id, type_id, id, REV) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Actions #39

Updated by Katja Luther over 3 years ago

Katja Luther wrote:

Andreas Müller wrote:

... however, the value was stored in the DB, so maybe the error occurred during save for AUD data.

this problem is caused by

insert into StatisticalMeasurementValue_AUD (REVTYPE, created, uuid, updated, value, value_scale, createdBy_id, updatedBy_id, quantitativeData_id, type_id, id, REV) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

this issue is fixed.

Actions #40

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

Generally this works.

There is 1 open issue which is a bit critical: it is only possible to a specimen for a taxon which is not yet shown in the matrix if the focus is not set to any record. But this is difficult to achieve once a record got the focus. It is possible by collapsing all records and then choose "Add specimen description". But this is something the user needs to know.

A possible solution could be to do it the same way as for the aggregations and let the search dialog have a filter for "Selected Taxon", "Selected Subtree" and "Full recordset".
Maybe there are even better solutions.

If this is difficult to implement feel free to move to 5.16 but we should implement it soon.

Maybe we should add a second button to remove the taxon filter.

Actions #41

Updated by Andreas Müller over 3 years ago

Katja Luther wrote:

Katja Luther wrote:

Andreas Müller wrote:

... however, the value was stored in the DB, so maybe the error occurred during save for AUD data.

this problem is caused by

insert into StatisticalMeasurementValue_AUD (REVTYPE, created, uuid, updated, value, value_scale, createdBy_id, updatedBy_id, quantitativeData_id, type_id, id, REV) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

this issue is fixed.

Great! Yes this was obviously the problem, but it was not found before because null values are seldom saved

Actions #42

Updated by Andreas Müller over 3 years ago

Katja Luther wrote:

Andreas Müller wrote:

Generally this works.

There is 1 open issue which is a bit critical: it is only possible to a specimen for a taxon which is not yet shown in the matrix if the focus is not set to any record. But this is difficult to achieve once a record got the focus. It is possible by collapsing all records and then choose "Add specimen description". But this is something the user needs to know.

A possible solution could be to do it the same way as for the aggregations and let the search dialog have a filter for "Selected Taxon", "Selected Subtree" and "Full recordset".
Maybe there are even better solutions.

If this is difficult to implement feel free to move to 5.16 but we should implement it soon.

Maybe we should add a second button to remove the taxon filter.

You mean in the dialog? So this is more or less the solution I also suggested but without alternative "Selected Taxon". But this alternative is maybe not really important as the result can also be sorted by taxon. So I agree to do it this way.
By the way, if the dialog is filtered by a subtree this filter should be named somewhere in the dialog so users know that these are not all specimen available in the dataset. The button to remove and enable the filter agaiin could be placed beside this label.

Actions #43

Updated by Katja Luther over 3 years ago

  • Related to bug #8783: Massive Heap consumption in server instance opening the Description-Matrix editor added
Actions #44

Updated by Katja Luther over 3 years ago

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

Andreas Müller wrote:

Katja Luther wrote:

Andreas Müller wrote:

Generally this works.

There is 1 open issue which is a bit critical: it is only possible to a specimen for a taxon which is not yet shown in the matrix if the focus is not set to any record. But this is difficult to achieve once a record got the focus. It is possible by collapsing all records and then choose "Add specimen description". But this is something the user needs to know.

A possible solution could be to do it the same way as for the aggregations and let the search dialog have a filter for "Selected Taxon", "Selected Subtree" and "Full recordset".
Maybe there are even better solutions.

If this is difficult to implement feel free to move to 5.16 but we should implement it soon.

Maybe we should add a second button to remove the taxon filter.

You mean in the dialog? So this is more or less the solution I also suggested but without alternative "Selected Taxon". But this alternative is maybe not really important as the result can also be sorted by taxon. So I agree to do it this way.
By the way, if the dialog is filtered by a subtree this filter should be named somewhere in the dialog so users know that these are not all specimen available in the dataset. The button to remove and enable the filter agaiin could be placed beside this label.

Now the nameCaches of the selected taxa are shown on top of the dialog, and a button for removing the filter is added. If you want to filter again, you can enter the name of the taxon in the text field.

Actions #45

Updated by Andreas Müller over 3 years ago

  • File picture647-1.png picture647-1.png added
  • Status changed from Resolved to Feedback
  • Assignee changed from Andreas Müller to Katja Luther
  • % Done changed from 30 to 40

Katja Luther wrote:

Now the nameCaches of the selected taxa are shown on top of the dialog, and a button for removing the filter is added. If you want to filter again, you can enter the name of the taxon in the text field.

Now, if the filter is empty no specimen is shown at all, but all specimen should be shown.
Also the button is behind the "Specimen Filter" but removes the "Taxon filter" this is not intuitive

Actions #46

Updated by Andreas Müller over 3 years ago

The layout the legend was corrupted by adding the new filter:

Actions #47

Updated by Andreas Müller over 3 years ago

The new filter should be called "Taxonomic Group" filter or "Taxonomic Subtree" filter as it filters not only on 1 taxon but on all it's children as well.

Note: Currently we often use "Subtree" in the UI, maybe "Group" is the better label. But this is a general discussion so we should stay at "Subtree" here I suggest.

Actions #48

Updated by Andreas Müller over 3 years ago

Now, when entering a value at "Specimen Filter" you sometimes get more values then when entering no value. This behavior is not related to the new filter but it is a general issue with the "Specimen filter". If no taxon filter is defined and the specimen filter field is empty no entry appears in the list, which to me seems not correct.

By the way: Do you know what the refresh button is for. At the moment I do not really see a functionality and the tool-tip also does not say much. I somehow remember that maybe the specimen list was not updated each time the dialog opens (as computing specimen takes time). Is the refresh button for showing newly added specimen? Is this behavior still valid with the new filter in place? Is the filter working on cached data or the result recomputed now each time the dialog is opened?

Actions #49

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

Now, when entering a value at "Specimen Filter" you sometimes get more values then when entering no value. This behavior is not related to the new filter but it is a general issue with the "Specimen filter". If no taxon filter is defined and the specimen filter field is empty no entry appears in the list, which to me seems not correct.

that's right, that should be fixed.

By the way: Do you know what the refresh button is for. At the moment I do not really see a functionality and the tool-tip also does not say much. I somehow remember that maybe the specimen list was not updated each time the dialog opens (as computing specimen takes time). Is the refresh button for showing newly added specimen? Is this behavior still valid with the new filter in place? Is the filter working on cached data or the result recomputed now each time the dialog is opened?

The specimen list is loaded only the first time the dialog is opened and added to a cache, the following times the cache is used, clicking on the refresh button loads the specimen list again, this is for changes in the descriptive dataset.

Actions #50

Updated by Andreas Müller over 3 years ago

Generally the layout should be improved. The "Taxon filter" and the "Specimen filter" look very different at the moment.

Also a tooltip should be added to the "Specimen filter" which explains that this is a filter on "Taxon label AND Specimen label". Or the label for the filter itself should be changed to "Taxon Name and Specimen Filter. (This is long but there is enough space)

Actions #51

Updated by Andreas Müller over 3 years ago

Katja Luther wrote:

The specimen list is loaded only the first time the dialog is opened and added to a cache, the following times the cache is used, clicking on the refresh button loads the specimen list again, this is for changes in the descriptive dataset.

OK, so I remembered this correctly. And I understand it correctly that the new subtree filter also works on these precomputed data?
Can we add an according tool-tip to the refresh button that explains this behavior, e.g. "Refresh to show/not show recently added/removed specimen records", so ordinary users maybe understand this behvior a bit better.

Actions #52

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

The layout the legend was corrupted by adding the new filter:

this is fixed.

Actions #53

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

Generally the layout should be improved. The "Taxon filter" and the "Specimen filter" look very different at the moment.

Also a tooltip should be added to the "Specimen filter" which explains that this is a filter on "Taxon label AND Specimen label". Or the label for the filter itself should be changed to "Taxon Name and Specimen Filter. (This is long but there is enough space)

this is fixed.

Actions #54

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

Katja Luther wrote:

The specimen list is loaded only the first time the dialog is opened and added to a cache, the following times the cache is used, clicking on the refresh button loads the specimen list again, this is for changes in the descriptive dataset.

OK, so I remembered this correctly. And I understand it correctly that the new subtree filter also works on these precomputed data?
Can we add an according tool-tip to the refresh button that explains this behavior, e.g. "Refresh to show/not show recently added/removed specimen records", so ordinary users maybe understand this behvior a bit better.

tooltip added

Actions #55

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

Now, when entering a value at "Specimen Filter" you sometimes get more values then when entering no value. This behavior is not related to the new filter but it is a general issue with the "Specimen filter". If no taxon filter is defined and the specimen filter field is empty no entry appears in the list, which to me seems not correct.

this is fixed

Actions #56

Updated by Katja Luther over 3 years ago

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

I think all issues are fixed, please review.

Actions #57

Updated by Katja Luther over 3 years ago

  • Description updated (diff)
  • Status changed from Resolved to In Progress
Actions #58

Updated by Katja Luther over 3 years ago

  • Assignee changed from Andreas Müller to Katja Luther
Actions #59

Updated by Andreas Müller over 3 years ago

  • Description updated (diff)
  • Status changed from In Progress to Resolved
  • Assignee changed from Katja Luther to Andreas Müller

Maybe we also need a configurator here for the removal of specimens(descriptions) from the matrix. Same issue as at #8754#note-20 (and other notes in #8754).
A configurator is needed if the Specimen(orTaxon)Description should be completely deleted from the object it belongs too or if it should be only removed from the matrix/DDS.

I create a new ticket for this: #9084

Actions #60

Updated by Andreas Müller over 3 years ago

Upps sorry, I have overridden your changes accidentely. But maybe it is better to handle this in another ticket. What do you think?

Actions #61

Updated by Andreas Müller over 3 years ago

Copied from #8754#note-22

There is also another strange behavior. When I do "reattache" the specimen to the matrix the old record seems to be reattached (which might be a good idea but needs to be discussed for details). But the problem seems to be that if in the meanwhile the record has been changed this seem not be reflected in the UI or in the record itself. It looks like the old version is somewhere cached and attached as it was instead of reloading it from the DB.

... hmm, I tested now for a relatively long time with Matrix Editor open and deleting and reattaching Specimen Descriptions and at the same time the Specimen Tree Editor was open and sometimes I edited data there sometimes I only used it for checking referencing objects and ids. I sometimes only closed these editor sometimes closed the TaxEditor application and restartet. I was working on rem_conf_am / Am test dataset with specimen attached to Nepenthes morganiana.

However the behavior to me seems mostly unpredictable. Sometimes specimen descriptions are removed from the matrix which I did never remove. Sometimes other descriptions reappear after restart though I had deleted them. Sometimes measurement values that were deleted in Specimen Tree Editor reappear after reattaching a specimen to the matrix, ... I am a bit confused how to describe this because nothing is really reproducable but very often does not work as expected.

The main issue I originally wanted to test was how the deleting and adding of specimens in the matrix reacts if a possible SpecimenDescription candidate already exists. Is this reused or there always a new record created, or something else. But I couldn't really find.
However, for such a case we probably need some warning saying: there is a specimen description available already, do you want to use it? Also for imports this might be needed.

But first of all, could you please test if you can reproduce the above strange behvior (with my data or with other data)?

Actions #62

Updated by Katja Luther over 3 years ago

Andreas Müller wrote:

Copied from #8754#note-22

There is also another strange behavior. When I do "reattache" the specimen to the matrix the old record seems to be reattached (which might be a good idea but needs to be discussed for details). But the problem seems to be that if in the meanwhile the record has been changed this seem not be reflected in the UI or in the record itself. It looks like the old version is somewhere cached and attached as it was instead of reloading it from the DB.

... hmm, I tested now for a relatively long time with Matrix Editor open and deleting and reattaching Specimen Descriptions and at the same time the Specimen Tree Editor was open and sometimes I edited data there sometimes I only used it for checking referencing objects and ids. I sometimes only closed these editor sometimes closed the TaxEditor application and restartet. I was working on rem_conf_am / Am test dataset with specimen attached to Nepenthes morganiana.

However the behavior to me seems mostly unpredictable. Sometimes specimen descriptions are removed from the matrix which I did never remove. Sometimes other descriptions reappear after restart though I had deleted them. Sometimes measurement values that were deleted in Specimen Tree Editor reappear after reattaching a specimen to the matrix, ... I am a bit confused how to describe this because nothing is really reproducable but very often does not work as expected.

The main issue I originally wanted to test was how the deleting and adding of specimens in the matrix reacts if a possible SpecimenDescription candidate already exists. Is this reused or there always a new record created, or something else. But I couldn't really find.
However, for such a case we probably need some warning saying: there is a specimen description available already, do you want to use it? Also for imports this might be needed.

But first of all, could you please test if you can reproduce the above strange behvior (with my data or with other data)?

Did you save before you "reattache"?

Actions #63

Updated by Andreas Müller over 3 years ago

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

Katja Luther wrote:

Did you save before you "reattache"?

Yes, sometimes I even did restart the TaxEditor. Almost always I reopened the according Editors to be on the save side but this did not change much.

But there is another issue I watched just know. I added a new specimen description via the matrix, then opened the according specimen in the Specimen Tree Editor and opened the facts view and saw the new empty specimen description. Now I entered data into the description via the matrix and saved it. I re-searched and re-opened the Specimen Tree Editor but the description was still empty . Only after TaxEditor restart it did show the new quantitative data.
This reminds me very much to the caching problem described in #9059.

Actions #64

Updated by Katja Luther over 3 years ago

  • Assignee changed from Katja Luther to Andreas Müller

Andreas Müller wrote:

The main issue I originally wanted to test was how the deleting and adding of specimens in the matrix reacts if a possible SpecimenDescription candidate already exists. Is this reused or there always a new record created, or something else. But I couldn't really find.
However, for such a case we probably need some warning saying: there is a specimen description available already, do you want to use it? Also for imports this might be needed.

The description is only reused if it is already added to the dataset. The new description gets clones of descriptionelements of an existing description having descriptionelements of features belonging to the dataset. For example if a description of type CLONE_FOR_SOURCE exist, the values of the descriptionelements of this description are added to the new description.

Is that wanted behaviour?

Actions #65

Updated by Katja Luther over 3 years ago

Now add and delete should work. But if a specimen contains more than one description that could be used for cloning, the creation of the clones of the descriptionelements are not predictable. But for this issue, it is difficult for me to decide how to handle this because I don't know why it was implemented this way.

Actions #66

Updated by Andreas Müller over 3 years ago

  • Status changed from Feedback to Resolved

Hmm, this behavior definitely needs further discussion. I do not remember that we had decided to implement it this way in additivity but maybe I forgot. We have to check the wiki.

However, this is a difficult issue as there is not the one correct handling of this situation. Probably we need some way to get user feedback here to decide for the correct decision. Simply creating clones without warning giving feedback to the user does not seem to always be the correct way.

Actions #67

Updated by Andreas Müller about 2 years ago

  • Copied to feature request #9084: Make it configurable if a Description is deleted only from the Descriptive Data Set or from it's Specimen/Taxon added
Actions

Also available in: Atom PDF