Uploaded image for project: 'Jira Data Center'
  1. Jira Data Center
  2. JRASERVER-68022

java.util.NoSuchElementException when a Validator throws an InvalidInputException for the "comment" field

    XMLWordPrintable

Details

    Description

      Summary

      For a non JSD project, when user created validator for comment (such as JMWE's Comment Required Validator) that throws an InvalidInputException for the "comment" field (to display an error message below the Comment field), an error log is displayed:

      Stack Trace
      2018-10-01 13:06:12,646 http-nio-2990-exec-8 ERROR admin 786x31906x1 1zl5ea 0:0:0:0:0:0:0:1 /secure/CommentAssignIssue.jspa [webwork.util.ValueStack] query="/tabsWithErrors" {[id="null" type="5" values=""]} {[id="tabsWithErrors" type="8" values=""]}
      java.lang.reflect.InvocationTargetException
      	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 webwork.util.InjectionUtils$DefaultInjectionImpl.invoke(InjectionUtils.java:70)
      	at webwork.util.InjectionUtils.invoke(InjectionUtils.java:56)
      	at webwork.util.ValueStack.findValue(ValueStack.java:417)
      	at webwork.util.ValueStack.findValue(ValueStack.java:216)
      	at webwork.view.taglib.WebWorkBodyTagSupport.findValue(WebWorkBodyTagSupport.java:62)
      	at webwork.view.taglib.ParamTag.doEndTag(ParamTag.java:59)
      	at jsp.secure.views.issue.commentassignissue_jsp._jspx_meth_ww_005fparam_005f3(commentassignissue_jsp.java:1876)
      	at jsp.secure.views.issue.commentassignissue_jsp._jspx_meth_ww_005fcomponent_005f0(commentassignissue_jsp.java:1772)
      	at jsp.secure.views.issue.commentassignissue_jsp._jspx_meth_page_005fapplyDecorator_005f0(commentassignissue_jsp.java:609)
      	at jsp.secure.views.issue.commentassignissue_jsp._jspx_meth_ww_005fif_005f1(commentassignissue_jsp.java:528)
      	at jsp.secure.views.issue.commentassignissue_jsp._jspService(commentassignissue_jsp.java:171)
      	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
      	... 48 filtered
      	at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:56)
      	... 4 filtered
      	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
      	... 45 filtered
      	at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66)
      	... 1 filtered
      	at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64)
      	... 20 filtered
      	at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
      	... 5 filtered
      	at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:116)
      	... 11 filtered
      	at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
      	... 11 filtered
      	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
      	... 48 filtered
      	at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:56)
      	... 4 filtered
      	at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:62)
      	... 12 filtered
      	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
      	... 24 filtered
      	at com.atlassian.labs.httpservice.resource.ResourceFilter.doFilter(ResourceFilter.java:59)
      	... 37 filtered
      	at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66)
      	... 1 filtered
      	at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64)
      	... 39 filtered
      	at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
      	... 5 filtered
      	at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:181)
      	at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.rteInvoke(ReentrantThreadLocalBasedCodeContext.java:137)
      	at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.runOutOfContext(ReentrantThreadLocalBasedCodeContext.java:90)
      	at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.runOutOfCustomerContext(CustomerContextServiceImpl.java:47)
      	at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:174)
      	at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:130)
      	at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:121)
      	... 4 filtered
      	at com.atlassian.fastdev.AutoReloadFilter.doFilter(AutoReloadFilter.java:63)
      	... 3 filtered
      	at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:32)
      	... 8 filtered
      	at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
      	... 4 filtered
      	at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36)
      	... 26 filtered
      	at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
      	... 22 filtered
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      	at java.lang.Thread.run(Thread.java:748)
      Caused by: java.util.NoSuchElementException
      	at java.util.TreeMap.key(TreeMap.java:1327)
      	at java.util.TreeMap.firstKey(TreeMap.java:290)
      	at java.util.TreeSet.first(TreeSet.java:394)
      	at com.atlassian.jira.web.action.issue.util.ScreenTabErrorHelper.initialiseTabsWithErrors(ScreenTabErrorHelper.java:60)
      	at com.atlassian.jira.web.action.issue.CommentAssignIssue.initTabsWithErrors(CommentAssignIssue.java:125)
      	... 430 more
      

      Steps to replicate

      1. Create a non JSD project
      2. Add a comment validator (one of JMWE's Comment Required Validator) with an associate screen
      3. Create and issue and transition that issue where you added the validator above and don't input a comment
      4. Notice the server log or tail -f the logs

      Root Cause

      Error is caused by no first() element object for:

      com.atlassian.jira.web.action.issue.util.ScreenTabErrorHelper.initialiseTabsWithErrors line 60
      /**
       * Populates the set of field screen tabs with the tabs which contain errors. This is based on the error collection
       * supplied, which is a mapping from field names to error messages. Will return the index of the tab to be selected,
       * which is either the first tab with an error, or simply the first tab.
       *
       * @param tabsWithErrors      the set of tabs to populate
       * @param errors              the error collection
       * @param fieldScreenRenderer the field screen renderer to resolve {@link FieldScreenRenderTab} from field ids.
       * @param webParameters       the Webwork parameters
       * @return the (1-based) index of the tab to be selected.
       */
      public int initialiseTabsWithErrors(final SortedSet<FieldScreenRenderTab> tabsWithErrors, final Map<String, ?> errors, final FieldScreenRenderer fieldScreenRenderer, final Map webParameters) {
          if (errors != null && !errors.isEmpty()) {
              // Record the tabs which have fields with errors on them
              for (String fieldId : errors.keySet()) {
                  // some code here
              }
      
              // Add 1 as the status' counts in WW iterators start at 1 (not 0)
              return tabsWithErrors.first().getPosition() + 1; //line 60
          } else {
              return 1;
          }
      }
      

      Attachments

        Issue Links

          Activity

            People

              d180ec5d6467 Ross Jenkins (Inactive)
              acalantog Anne Calantog
              Votes:
              54 Vote for this issue
              Watchers:
              59 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: