[MAGNOLIA-3454] Date control not working Created: 07/Dec/10  Updated: 22/Dec/10  Resolved: 08/Dec/10

Status: Closed
Project: Magnolia
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Richard Unger Assignee: Philipp Bärfuss
Resolution: Not an issue Votes: 0
Labels: datecontrol
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Java 1.6.21, Magnolia EE Bundle on Tomcat 5.5.27 or 5.5.30
Language of OS: German
Locale of Browser: German and English tested


Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:

 Description   

The Date control (DialogDate) is not working.

The control can be used, dialogs using the control can be opened when creating a new paragraph.
The paragraph can be saved, and the date can then be seen in the JCR browser (although the property type is shown as "String").
HOWEVER, the dialog can then NOT be re-opened (ie the newly created paragraph can never again be edited).

The problem is that JackRabbit throws an exception (related to the date format) when trying to read the date via Property.getDate() (called by NodeData.getDate()). See the attached stack trace below.

So it would appear that magnolia is somehow saving a value to JCR which can then not be read.

2010-12-03 12:59:12,061 ERROR lina].[localhost].[/at.bmlfuw.cmsauthor].[default]: Servlet.service() for servlet default threw exception
java.lang.RuntimeException: Can't read value of nodedata website:/jdw/aktuelles/veranstaltungen/event-name/veranstaltung/startdate[String]
	at info.magnolia.cms.core.DefaultNodeData.getDate(DefaultNodeData.java:164)
	at info.magnolia.cms.gui.dialog.DialogDate.doBeforeDrawHtml(DialogDate.java:98)
	at info.magnolia.cms.gui.dialog.DialogEditWithButton.drawHtml(DialogEditWithButton.java:89)
	at info.magnolia.cms.gui.dialog.DialogControlImpl.drawSubs(DialogControlImpl.java:321)
	at info.magnolia.cms.gui.dialog.DialogControlImpl.drawHtml(DialogControlImpl.java:165)
	at info.magnolia.cms.gui.dialog.DialogControlImpl.drawSubs(DialogControlImpl.java:321)
	at info.magnolia.cms.gui.dialog.DialogControlImpl.drawHtml(DialogControlImpl.java:165)
	at info.magnolia.module.admininterface.DialogMVCHandler.renderHtml(DialogMVCHandler.java:417)
	at info.magnolia.module.admininterface.dialogs.ParagraphEditDialog.renderHtml(ParagraphEditDialog.java:102)
	at info.magnolia.cms.servlets.MVCServlet.doPost(MVCServlet.java:124)
	at info.magnolia.cms.servlets.MVCServlet.doGet(MVCServlet.java:69)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at info.magnolia.cms.filters.ServletDispatchingFilter.doFilter(ServletDispatchingFilter.java:183)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:84)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:84)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:84)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:84)
	at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:64)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:133)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.module.cache.executor.Bypass.processCacheRequest(Bypass.java:57)
	at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:122)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:62)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:75)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.module.extendedtemplatingkit.filters.MultiSiteFilter.doFilter(MultiSiteFilter.java:94)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:83)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:62)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:84)
	at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:64)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:88)
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:62)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:77)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:51)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:84)
	at info.magnolia.cms.filters.CosMultipartRequestFilter.doFilter(CosMultipartRequestFilter.java:88)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:102)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:117)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:82)
	at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:64)
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:70)
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:96)
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:199)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Unknown Source)
Caused by: javax.jcr.ValueFormatException: not a valid date format
	at org.apache.jackrabbit.value.BaseValue.getDate(BaseValue.java:131)
	at org.apache.jackrabbit.core.PropertyImpl.getDate(PropertyImpl.java:510)
	at info.magnolia.cms.core.DefaultNodeData.getDate(DefaultNodeData.java:161)
	... 79 more


 Comments   
Comment by Richard Unger [ 07/Dec/10 ]

As an aside, it seems that JCR's getDate() cannot easily be configured to use different date formats.

Given the fact that DialogDate (date control) might be used in a variety of ways by your customers, I think it is dangerous/complicated to rely on JCR's underlying date datatype.

Instead I would prefer to see a solution where DialogDate always stores it's date as a String in JCR. The handling of formats and String<->Date conversions could then be done entirely withing magnolia in a JCR-independant and flexible way.

For example: DialogDate could add a new config-option "format" whích can hold a java-date-format string. If set, DialogDate would convert the String JCR value according to the supplied format.
In addition NodeDataUtil and MagnoliaTemplatingUtilities could provide a method like: getDateFromString(String propname,String format)
to help handle the date properties from within templates and model classes.

What do you think?

Comment by Philipp Bärfuss [ 08/Dec/10 ]

you have to set the type to Date and the value will be saved as a Date/Calendar

Comment by Richard Unger [ 21/Dec/10 ]

Hi - thanks for pointing that out - I feel a bit stupid. This hint solved our problem.

I still have 2 comments about this though:

1, It would be good to mention this in the documentation, under "http://documentation.magnolia-cms.com/reference/controls.html#date" - we actually checked the documentation there, but of course did not find the answer to our problem.

2. If it is possible to save a date value to a string property via DialogDate, then it should also be possible to read the value from a string property. The current situation is confusing - either throw an exception right away, on saving, or allow loading the value from a string (perhaps using a configurable format, as suggested in my comment above). But permitting the save and then failing on load is inconsistent.

Thanks again for pointing out our error though!

Regards from Vienna,

Richard Unger

Comment by Philipp Bärfuss [ 22/Dec/10 ]

Thanks,

I created the documentation change request: DOCU-106

In Magnolia 5.0 we will have a dialog editor and the so called configuration UI which will have some basic knowledge about such constraints. We know that one currently runs to easily into such situations and that it can be very time consuming (debugging) to find out why certain configurations don't work. Even if the solution finally seams to be quite obviously.

Generated at Mon Feb 12 03:46:38 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.