cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Kulp (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CXF-7502) Invalid or wrong dates returned
Date Thu, 14 Sep 2017 13:36:00 GMT

    [ https://issues.apache.org/jira/browse/CXF-7502?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16166314#comment-16166314
] 

Daniel Kulp commented on CXF-7502:
----------------------------------

I believe this issue is entirely caused by the java date handling stuff.  The java.util.Date
object you are using for the webservice is likely a Julian date representation of what is
passed in.    Internally to JAXB, it creates an javax.xml.datatype.XMLGregorianCalendar and
then has to use that to create the Date object.  I'm not sure if it adjusts that Date object
to Julian or not.   When writing out the Date, it does the reverse to create the XMLGregorianCalendar
object that is written out.   At that point, I don't believe JAXB would have any idea if the
incoming Date is Julian or Gregorian and thus likely assumes it's Julian based on the "age".
 

The best option to avoid the confusion is to change the web service to use javax.xml.datatype.XMLGregorianCalendar
instead of java.util.Date.   By keeping it in Gregorian, the strange conversions should be
avoided.    Note: when generating code from wsdl, the tools map xsd:date to XMLGregorianCalendar.
  In any case, I'd avoid using java.util.Date.   

> Invalid or wrong dates returned
> -------------------------------
>
>                 Key: CXF-7502
>                 URL: https://issues.apache.org/jira/browse/CXF-7502
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 3.1.12
>         Environment: Server on Linux/Ubuntu 16.04 with Tomcat 8.5.12 and CXF 3.1.12
> Client on Windows 7 64bit with Python3.4 and Zeep 2.2.0
>            Reporter: Noxx
>
> I believe that the following is a CXF bug but as I am not really into the framework any
help to isolate it or to report it to the correct tracker is really appreciated.
> I am using the Python package "zeep" to generate a SOAP request, send it to my server
and parse the response.
> While handling dates within my application I came across the following issue and tried
to reproduce it on an example:
> Generate request on client side (you need to replace `<soap_client>` with your
instance):
> {code:none}
> import datetime
> data = datetime.date(1500, 3, 9)
> end = datetime.date(1500, 3, 12)
> with open("dateplotter.txt", "w") as file:
>     while data <= end:
>         returned = <soap_client>.date(data)
>         if returned:
>             returned = returned.date()
>             file.write("{} results in {}, diff: {}\n".format(data, returned, (returned-data).days))
>         else:
>             file.write("{} results in {}, diff: {}\n".format(data, returned, "--ERROR--"))
>         file.flush()
>         data = data + date
> {code}
> On the server side the incoming date object is returned without modification:
> {code:java}
> @WebMethod(action = "date")
> public Date date(@WebParam(name="date") Date date) { return date; }
> {code}
> The content of the created file:
> {code}
> 1500-03-09 results in 1500-02-28, diff: -9
> 1500-03-10 results in None, diff: --ERROR--
> 1500-03-11 results in 1500-03-01, diff: -10
> 1500-03-12 results in 1500-03-02, diff: -10
> {code}
> The request/response for the first roundtrip:
> {code}
> ==>
> http_headers: {'SOAPAction': '"date"', 'Content-Type': 'text/xml; charset=utf-8'}
> operation: date(date: xsd:dateTime) -> return: xsd:dateTime
> binding_options: {'address': 'https://mio/StepServer/service'}
> <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
>   <soap-env:Body>
>     <ns0:date xmlns:ns0="http://step">
>       <date>1500-03-10T00:00:00</date>
>     </ns0:date>
>   </soap-env:Body>
> </soap-env:Envelope>
> ==>
> <==
> http_headers: {'Keep-Alive': 'timeout=5, max=89', 'Content-Encoding': 'gzip', 'Connection':
'Keep-Alive', 'Content-Type': 'text/xml;charset=UTF-8', 'Server': 'Apache/2.4.18 (Ubuntu)',
'Date': 'Wed, 13 Sep 2017 08:52:55 GMT', 'Content-Length': '159', 'Vary': 'Accept-Encoding'}
> operation: date(date: xsd:dateTime) -> return: xsd:dateTime
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
>   <soap:Body>
>     <ns1:dateResponse xmlns:ns1="http://step">
>       <return xmlns:ns2="http://step">1500-02-28T00:00:00+01:00</return>
>     </ns1:dateResponse>
>   </soap:Body>
> </soap:Envelope>
> <==
> {code}
> The request/response for the second roundtrip which results in an hard error on the client
side:
> {code}
> ==>
> http_headers: {'SOAPAction': '"date"', 'Content-Type': 'text/xml; charset=utf-8'}
> binding_options: {'address': 'https://mio/StepServer/service'}
> <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
>   <soap-env:Body>
>     <ns0:date xmlns:ns0="http://step">
>       <date>1500-03-11T00:00:00</date>
>     </ns0:date>
>   </soap-env:Body>
> </soap-env:Envelope>
> ==>
> <==
> http_headers: {'Keep-Alive': 'timeout=5, max=88', 'Content-Encoding': 'gzip', 'Connection':
'Keep-Alive', 'Content-Type': 'text/xml;charset=UTF-8', 'Server': 'Apache/2.4.18 (Ubuntu)',
'Date': 'Wed, 13 Sep 2017 08:52:55 GMT', 'Content-Length': '159', 'Vary': 'Accept-Encoding'}
> operation: date(date: xsd:dateTime) -> return: xsd:dateTime
> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
>   <soap:Body>
>     <ns1:dateResponse xmlns:ns1="http://step">
>       <return xmlns:ns2="http://step">1500-02-29T00:00:00+01:00</return>
>     </ns1:dateResponse>
>   </soap:Body>
> </soap:Envelope>
> <==
> [2017-09-13 10:52:55,425][  ERROR][zeep.xsd.types.simple] Error during xml -> python
translation
> Traceback (most recent call last):
>   File "C:\Python34\lib\site-packages\zeep\xsd\types\simple.py", line 61, in parse_xmlelement
> operation: date(date: xsd:dateTime) -> return: xsd:dateTime
>     return self.pythonvalue(xmlelement.text)
>   File "C:\Python34\lib\site-packages\zeep\xsd\types\builtins.py", line 136, in pythonvalue
>     return isodate.parse_datetime(value)
>   File "C:\Python34\lib\site-packages\isodate\isodatetime.py", line 55, in parse_datetime
>     tmpdate = parse_date(datestring)
>   File "C:\Python34\lib\site-packages\isodate\isodates.py", line 193, in parse_date
>     int(groups['month']) or 1, day)
> ValueError: day is out of range for month
> {code}
> Remarks are:
> * (!) The date is already changed when accessing it on the server side within the method
so sth. happens already when parsing the incoming stream.
> * The difference between the date sent to the server and the date which the client gets
back is changing dependent of the date sent.
> * -A hard error occurs for a (non-existent) leap day.- (see first comment)
> * Within further tests I can reproduce:
> ** 1900-2100 the differences are 0 and no error occurs
> ** Dates near year 1 have a difference of 2 days (like 01.12.0001)
> It seems there are two issues involved here:
> * -Handling leap years seems to be incorrect as 1500 is not a leap year and 29.02.1500
does not exist but is returned as a date.- (see first comment)
> * As no conversation or other handling of the incoming date is performed on the server
side - why it has been changed? In the example above I would expect to get the same date back
as I sent to the server independent of the value (except for invalid dates like the not-existing
leap-day)



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message