But here we're not in edit issue usecase at all, it's the edit-configuration instead. Need validations concerning statuses, severities, resolutions, field options when defining custom field configuration, not entering custom field on issue (different task!)
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
This issue is for validation of custom field form and not validations concerning statuses,
severities, resolutions. Since the edit issue (issue) is not commited yet, I have supplied patch for this problem.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
applied and committed changes to SVN trunk. There seems to be some issues now when resetting configuration caches after updating the field. Validation is currently disabled for the edit customfield action.
please updated from trunk and analyze/fix if possible.
15:43:33,817 WARN org.itracker.core.resources.ITrackerResources -
org.itracker.persistence.dao.NoSuchEntityException: No language item for itracker.customfield.3.label en
at org.itracker.persistence.dao.LanguageDAOImpl.findByKeyAndLocale(LanguageDAOImpl.java:40)
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:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:203)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:162)
at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:104)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy539.findByKeyAndLocale(Unknown Source)
at org.itracker.services.implementations.ConfigurationServiceImpl.getLanguageItemByKey(ConfigurationServiceImpl.java:851)
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:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:203)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:162)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy542.getLanguageItemByKey(Unknown Source)
at org.itracker.core.resources.ITrackerResources.getString(ITrackerResources.java:298)
at org.itracker.services.util.CustomFieldUtilities.getCustomFieldName(CustomFieldUtilities.java:120)
at org.itracker.model.CustomField$NameComparator.compare(CustomField.java:476)
at org.itracker.model.CustomField$NameComparator.compare(CustomField.java:460)
at java.util.Arrays.mergeSort(Arrays.java:1284)
at java.util.Arrays.sort(Arrays.java:1223)
at java.util.Collections.sort(Collections.java:159)
at org.itracker.services.implementations.ConfigurationServiceImpl.getCustomFields(ConfigurationServiceImpl.java:592)
at org.itracker.services.implementations.ConfigurationServiceImpl.resetConfigurationCache(ConfigurationServiceImpl.java:451)
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:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:203)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:162)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy542.resetConfigurationCache(Unknown Source)
at org.itracker.web.actions.admin.configuration.EditCustomFieldAction.execute(EditCustomFieldAction.java:128)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.itracker.web.filters.ExecuteAlwaysFilter.doFilter(ExecuteAlwaysFilter.java:201)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.itracker.web.filters.SetRequestCharacterEncoding.doFilter(SetRequestCharacterEncoding.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:613)
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Cannot use this fix patch1.txt.
There is way too much things undocumented. We currently don't allow
- additional (unused?) service interface extending
- validation of required fields in form (defined in xml already)
- customfields don't take localized values, never
- code must be readable especially changed stuff must be described documented or no chance to get merged to trunk.
According to the stacktrace, the problem is isolated in the org.itracker.model.CustomField$NameComparator.compare
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
The comparator have to be supplied with the correct locale information. Extending service interface is the way to provide that. Customfields don't take localized values? Describe please, I don't understand that.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Should we add a check on translation collection to insure that it has at least the language root text entered?
yes, probably root translation would be separated, to easy validation rule.
Marco, please look into this too.
Yes, language root should be validated when updating/creating translations, configurations (also statuses, severities, resolutions, field options)
I think the validation could be added when edit issue is commited.
Please do not forget create issue as well, I guess you can enter custom fields there as well.
But here we're not in edit issue usecase at all, it's the edit-configuration instead. Need validations concerning statuses, severities, resolutions, field options when defining custom field configuration, not entering custom field on issue (different task!)
patches
This issue is for validation of custom field form and not validations concerning statuses,
severities, resolutions. Since the edit issue (issue) is not commited yet, I have supplied patch for this problem.
Thanks, patch will be integrated
applied and committed changes to SVN trunk. There seems to be some issues now when resetting configuration caches after updating the field. Validation is currently disabled for the edit customfield action.
please updated from trunk and analyze/fix if possible.
15:43:33,817 WARN org.itracker.core.resources.ITrackerResources -
org.itracker.persistence.dao.NoSuchEntityException: No language item for itracker.customfield.3.label en
at org.itracker.persistence.dao.LanguageDAOImpl.findByKeyAndLocale(LanguageDAOImpl.java:40)
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:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:203)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:162)
at org.springframework.orm.hibernate3.HibernateInterceptor.invoke(HibernateInterceptor.java:104)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy539.findByKeyAndLocale(Unknown Source)
at org.itracker.services.implementations.ConfigurationServiceImpl.getLanguageItemByKey(ConfigurationServiceImpl.java:851)
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:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:203)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:162)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy542.getLanguageItemByKey(Unknown Source)
at org.itracker.core.resources.ITrackerResources.getString(ITrackerResources.java:298)
at org.itracker.services.util.CustomFieldUtilities.getCustomFieldName(CustomFieldUtilities.java:120)
at org.itracker.model.CustomField$NameComparator.compare(CustomField.java:476)
at org.itracker.model.CustomField$NameComparator.compare(CustomField.java:460)
at java.util.Arrays.mergeSort(Arrays.java:1284)
at java.util.Arrays.sort(Arrays.java:1223)
at java.util.Collections.sort(Collections.java:159)
at org.itracker.services.implementations.ConfigurationServiceImpl.getCustomFields(ConfigurationServiceImpl.java:592)
at org.itracker.services.implementations.ConfigurationServiceImpl.resetConfigurationCache(ConfigurationServiceImpl.java:451)
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:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:203)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:162)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy542.resetConfigurationCache(Unknown Source)
at org.itracker.web.actions.admin.configuration.EditCustomFieldAction.execute(EditCustomFieldAction.java:128)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.itracker.web.filters.ExecuteAlwaysFilter.doFilter(ExecuteAlwaysFilter.java:201)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.itracker.web.filters.SetRequestCharacterEncoding.doFilter(SetRequestCharacterEncoding.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:613)
fixes
fixes added
Cannot use this fix patch1.txt.
There is way too much things undocumented. We currently don't allow
- additional (unused?) service interface extending
- validation of required fields in form (defined in xml already)
- customfields don't take localized values, never
- code must be readable especially changed stuff must be described documented or no chance to get merged to trunk.
According to the stacktrace, the problem is isolated in the org.itracker.model.CustomField$NameComparator.compare
The comparator have to be supplied with the correct locale information. Extending service interface is the way to provide that. Customfields don't take localized values? Describe please, I don't understand that.