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

Daniel Grönberg edited comment on XMLBEANS-473 at 8/23/12 1:37 AM:
-------------------------------------------------------------------

Here is a possible workaround until it is fixed. For you, who like me, can't 
wait for this to be solved and are stuck on xmlbeans 2.2:

Lets say that getValue is the method of the XMLObject that is supposed to give 
you a Calendar but throws XmlValueOutOfRangeException instead. What I found is 
that xgetValue successfully returns an XmlDateTime. Trying to do getCalendar 
will throw the same exception but toString will successfully give you a String 
representation which looks something like this:  <xml-fragment>2012-11-01 
00:00:00.0</xml-fragment>

See my example below how to solev this:

Calendar cal;

try {
    cal = xmlObj.getValue();
 } catch (org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException ex) {
                                    /**
                                     * Due to a bug in xmlbeans this exception 
is thrown when trying to get a date. 
                                     * See 
https://issues.apache.org/jira/browse/XMLBEANS-473 This workaround reads the 
xml representation
                                     * instead and parses out the date.
                                     */
                                    Date dateFromXmlString = 
convertFaultyXMLDateStringToDate(xmlObject.xgetValue());
                                    cal= Calendar.getInstance();
                                    cal.setTime(dateFromXmlString);
                                }

private Date convertFaultyXMLDateStringToDate(String xmlString) throws 
ParseException  {
        Pattern datePattern = Pattern.compile("[0-9]*-[0-9]*-[0-9]* 
[0-9]*:[0-9]*:[0-9]*.[0-9]*");
        Matcher dateMatcher;
       
        dateMatcher = datePattern.matcher(xmlString);
        if (dateMatcher.find()) {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss.S");
             return sdf.parse(dateMatcher.group(0));
            
        } else {
           //Handle no match
        }
    }

Something to use until it's fixed.
                
      was (Author: danielgronberg):
    Here is a possible workaround until it is fixed. For you, who like me, 
can't wait for this to be solved and are stuck on xmlbeans 2.2:

Lets say that getValue is the method of the XMLObject that is supposed to give 
you a Calendar but throws XmlValueOutOfRangeException instead. What I found is 
that xgetValue successfully returns an XmlDateTime. Trying to do getCalendar 
will throw the same exception but toString will successfully give you a String 
representation which looks something like this:  <xml-fragment>2012-11-01 
00:00:00.0</xml-fragment>

Use this method will parse out the date from that String and return a Date:

private Date convertFaultyXMLDateStringToDate(String xmlString) throws 
ParseException  {
        Pattern datePattern = Pattern.compile("[0-9]*-[0-9]*-[0-9]* 
[0-9]*:[0-9]*:[0-9]*.[0-9]*");
        Matcher dateMatcher;
       
        dateMatcher = datePattern.matcher(xmlString);
        if (dateMatcher.find()) {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss.S");
             return sdf.parse(dateMatcher.group(0));
            
        } else {
           //Handle no match
        }
    }

Something to use until it's fixed.
                  
> XML "dateTime" type issue with JDBC Control
> -------------------------------------------
>
>                 Key: XMLBEANS-473
>                 URL: https://issues.apache.org/jira/browse/XMLBEANS-473
>             Project: XMLBeans
>          Issue Type: Bug
>          Components: XmlObject
>    Affects Versions: Version 2.2
>            Reporter: Sunil Polineni
>              Labels: features
>         Attachments: jdbcTestWorkspace.rar
>
>
> This issue happens when you define a database control method which SELECTs 
> data and returns an XML Bean document. If one of the selected columns in your 
> XML schema is of type "dateTime", then the XML text that is returned is 
> missing the required "T" time separator character. Therefore, any subsequent 
> attempts to call the getters on the resulting XML Bean document object (which 
> normally should return java.util.Calendar objects) results in exceptions. 
> @JdbcControl.SQL(statement="SELECT THE_ID as \"theId\", THE_DATE as 
> \"theDate\" FROM JDBC_TEST WHERE THE_ID = {id}") 
> XJdbcTestDocument runJdbcTest(String id) throws SQLException;
> XJdbcTestDocument is generated from the below xml file
> =========================================
> <schema 
>       xmlns="http://www.w3.org/2001/XMLSchema"; 
>       targetNamespace="java:///JdbcTestXMLSchema" 
>       xmlns:tns="http://www.example.org/JdbcTestXMLSchema"; 
>       elementFormDefault="qualified">
>     <element name="XJdbcTest">
>         <complexType>
>           <choice maxOccurs="unbounded">
>             <element name="XJdbcTestRow">
>               <complexType>
>                 <sequence>
>                   <element name="theId" type="string" minOccurs="0"/>
>                   <element name="theDate" type="dateTime" minOccurs="0" 
> nillable="true"/>
>                 </sequence>
>               </complexType>
>             </element>
>           </choice>
>         </complexType>
>     </element>
> </schema>
> =============================================
> The <xml-fragment>1998-05-31 00:00:00.0</xml-fragment> is missing "T" it 
> should be <xml-fragment>1998-05-31T00:00:00.0</xml-fragment> when this is 
> being returned by a JDB Control and getting below exception
> javax.el.ELException: 
> org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException: Invalid date 
> value: 1998-05-31 00:00:00.0
> at javax.el.BeanELResolver.getValue(BeanELResolver.java:266)
> at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:143)
> at com.sun.el.parser.AstValue.getValue(AstValue.java:118)
> at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:192)
> at weblogic.servlet.jsp.ELHelper.evaluate(ELHelper.java:32)
> at jsp_servlet.__jdbcresults._jspService(__jdbcresults.java:205)
> I think When JDBC Control maps result set to XML, it by default uses SQL 
> object's toString() method to convert from SQL object to String.
> To override/customize this behavior we can use ResultSetMapper 
> http://beehive.apache.org/docs/1.0.1/system-controls/jdbc/apidocs/javadoc/org/apache/beehive/controls/system/jdbc/ResultSetMapper.html
> but this requires some good amount change in the code.
> Can you please advise whether if there is any other alternative?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@xmlbeans.apache.org
For additional commands, e-mail: dev-h...@xmlbeans.apache.org

Reply via email to