New and Improved 3.13 Beta. Highlights: Shareable filters and dashboards and lots of other goodies. Any feedback can be raised as JIRA issues in the JIRA project.
Issue Details (XML | Word | Printable)

Key: JRA-10276
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Critical Critical
Assignee: Sam Chang [Atlassian]
Reporter: Anton Mazkovoi [Atlassian]
Votes: 2
Watchers: 6
Operations

If you were logged in you would be able to see more operations.
JIRA

Custom field is displayed during Bulk Edit and Bulk Transition when it does not have a context for some of the issues.

Created: 25/May/06 11:41 PM   Updated: 04/Sep/06 12:41 PM
Component/s: Bulk Operations, Custom Fields
Affects Version/s: 3.6
Fix Version/s: 3.6.3

Time Tracking:
Not Specified

Issue Links:
Duplicate
 
Reference
 

Participants: =Neal Applebaum, Anton Mazkovoi [Atlassian] and Sam Chang [Atlassian]
Since last comment: 1 year, 51 weeks, 1 day ago
Resolution Date: 10/Jul/06 12:57 AM
Labels:


 Description  « Hide
The actual HTML for editing the field is not displayed as the following exception is thrown:

2006-05-25 17:48:21,813 ERROR [webwork.util.ServletValueStack] METHOD: "fieldHtml", exception:
java.lang.IllegalArgumentException
at com.atlassian.jira.plugin.customfield.CustomFieldTypeModuleDescriptor.getEditHtml(CustomFieldTypeModuleDescriptor.java:93)
at com.atlassian.jira.issue.fields.CustomFieldImpl.getEditHtml(CustomFieldImpl.java:645)
at com.atlassian.jira.issue.fields.CustomFieldImpl.getBulkEditHtml(CustomFieldImpl.java:675)
at com.atlassian.jira.web.action.issue.bulkedit.BulkWorkflowTransition.getFieldHtml(BulkWorkflowTransition.java:655)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at webwork.util.InjectionUtils$DefaultInjectionImpl.invoke(InjectionUtils.java:61)
at webwork.util.InjectionUtils.invoke(InjectionUtils.java:52)
at webwork.util.ValueStack.findValue(ValueStack.java:426)
at webwork.util.ValueStack.findValue(ValueStack.java:175)
at webwork.view.taglib.WebWorkBodyTagSupport.findValue(WebWorkBodyTagSupport.java:61)
at webwork.view.taglib.BasicPropertyTag.doStartTag(BasicPropertyTag.java:54)
at org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp._jspx_meth_webwork_property_31(org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp:2305)
at org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp._jspx_meth_webwork_if_8(org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp:2005)
at org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp._jspx_meth_webwork_iterator_3(org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp:1945)
at org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp._jspx_meth_webwork_iterator_2(org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp:1806)
at org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp._jspx_meth_webwork_else_1(org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp:1257)
at org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp._jspService(org.apache.jsp.secure.views.bulkedit.bulkworkflowtransition_005feditfields_jsp:434)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.atlassian.jira.web.dispatcher.JiraServletDispatcher.service(JiraServletDispatcher.java:253)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.jira.web.filters.AccessLogFilter.doFilter(AccessLogFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55)
at com.atlassian.jira.web.filters.SitemeshExcludePathFilter.doFilter(SitemeshExcludePathFilter.java:38)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:182)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.seraph.filter.LoginFilter.doFilter(LoginFilter.java:177)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:132)
at com.atlassian.jira.web.filters.ProfilingAndErrorFilter.doFilter(ProfilingAndErrorFilter.java:25)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.jira.web.filters.ActionCleanupDelayFilter.doFilter(ActionCleanupDelayFilter.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.johnson.filters.JohnsonFilter.doFilter(JohnsonFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.jira.web.filters.gzip.GzipFilter.doFilter(GzipFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.atlassian.core.filters.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:552)

To reproduce this, create a custom field for project A, create a custom field for project B, create 2 issues, one in each project. Stick the custom field onto the Resolve issue screen. Try to Bulk Resolve both issues. Or try to Bulk Edit them.

The actual code that determines whether a custom field is avaialble for Bulk Edit uses searching code (i.e. the same code that is used to find out whether to display the custom field in issue navigator for searching). There is a bug in it which actually also causes JRA-10237

As far as I can tell the bug is in getReleventConfig(SearchContext searchContext) method in CustomFieldImpl. As the method loops over custom field and retrieves relevantConfig for each search context, if relevantConfig is not null for the first searchContext in the loop, but is null for any of the following search contexts, the custom field is shown anyway. I believe that iif the custom field is not applicable for at least one searchContext then it should not be avaialble.

There are several problem there:

1. I do not think we should rely on searching code when doing bulk operations. Feels wrong to me. Need to decide if we need to completely create a new method for this.
2. Even if the searching code is used, the code loops through all the unique project id, issue type id combinations. This is not great, as if you have 2 issues, bug from project A, and task from project B, the code will loop through 4 cobninations, but really needs to check only 2.

For Bulk Workflow the problem is similar. See the availableForBulkEdit(BulkEditBean bulkEditBean) method on CustomFieldImpl, it also loops over configs and if relevantConfig for an issue is null, the field is shown anyway.

Hopefully this expalanation will make more sense once you have a look at the code.



 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Sam Chang [Atlassian] added a comment - 10/Jul/06 12:57 AM
Only custom fields with the same field configuration (i.e. all null config OR all same config) will be returned when performing a bulk operation and for the issue navigator.

Previously, the behaviour did not differentiate between a null config and a non-null config in specific cases (i.e. if the first configuration encountered was null).


=Neal Applebaum added a comment - 04/Sep/06 12:41 PM
According to linked issue, this is still a problem in 3.6.3