Hi guys

After a little more exploration I figured out that this problem is only
occurring when I define custom field handlers for the date fields. For
fields with other attribute types I am able to marshal and unmarshal
successfully. 

Has any body noticed this behaviour before. I found reference to this
email post http://hypermail.linklord.com/castor-dev/2003/Oct/1614.html ,
not sure if the patch has made its way into version 0.9.5.2. Any ideas

anand

-----Original Message-----
From: Anand Raman [mailto:[EMAIL PROTECTED] 
Sent: Monday, November 10, 2003 2:18 PM
To: [EMAIL PROTECTED]
Subject: [castor-dev] unmarshalling doesnt invoke custom field handler

hi guys

I have written a custom field handler to convert a java.util.Date
attribute to the format ('yyyyMMdd') I require. 

The custom handler works fine with the marshalling framework. However
during unmarshalling it throws a IllegalStateException. It is evident
from the stack tarce that my custom field handler is not being invoked
while unmarshalling the field. I am not using the static methods defined
on the UnMarshaller.

Questions
(1) Can you please shed light on what I am doing wrong.

CUSTOM HANDLER
import org.exolab.castor.mapping.AbstractFieldHandler;

public class MyNewDateHandler extends AbstractFieldHandler {

        private DateFormat formatter = null;
        
        public MyNewDateHandler() {
                super();
                formatter = new SimpleDateFormat("yyyyMMdd");
        }

        public Object getValue(Object object) throws
IllegalStateException {
                SimpleVO vo = null;
                String formattedDate = null;
                vo = (SimpleVO) object;         
                formattedDate = formatter.format(vo.getOrderDate());
                return formattedDate;
        }

    .....
    .....
    .....
        public void setValue(Object arg0, Object arg1)
                throws IllegalStateException, IllegalArgumentException {
                Date d = null;
        (SimpleVO)arg0).setDate(formatter.parse((String)arg1))
        }

}

public class SimpleVO {

        private Date orderDate = null;
        private int quantity = 0;
        private float amount = 0.0f;
        
        public Date getOrderDate() {
                return this.orderDate;
        }
        
        public void setOrderDate(Date orderDate) {
                this.orderDate = orderDate;
        }
        
        public int getQuantity() {
                return this.quantity;
        }
        
        public void setQuantity(int quantity) {
                this.quantity = quantity;
        }
        
        public void setAmount(float amount) {
                this.amount = amount;
        }
        
        public float getAmount() {
                return this.amount;
        }
        
        public SimpleVO() {
                Random r = new Random();
                this.orderDate = Calendar.getInstance().getTime();
                this.quantity = r.nextInt();
                this.amount = r.nextFloat() * quantity;
        }
}

This is the stack trace which I encounter while unmarshalling the xml
org.xml.sax.SAXException: unable to add 'order-date' to <Order> due to
the following exception: 

>>>--- Begin Exception ---<<< 
java.lang.IllegalStateException: Invalid dateTime format: 20031110
        at
org.exolab.castor.xml.handlers.DateFieldHandler.setValue(DateFieldHandle
r.java:202)
        at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:
852)
        at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:
918)
        at
org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
        at
org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown
Source)
        at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDis
patcher.dispatch(Unknown Source)
        at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unkno
wn Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
        at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown
Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown
Source)
        at
org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:583)
        at JDOTester.testUnMarshalling(JDOTester.java:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at junit.framework.TestCase.runTest(TestCase.java:166)
        at junit.framework.TestCase.runBare(TestCase.java:140)
        at junit.framework.TestResult$1.protect(TestResult.java:106)
        at junit.framework.TestResult.runProtected(TestResult.java:124)
        at junit.framework.TestResult.run(TestResult.java:109)
        at junit.framework.TestCase.run(TestCase.java:131)
        at junit.framework.TestSuite.runTest(TestSuite.java:173)
        at junit.framework.TestSuite.run(TestSuite.java:168)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:392)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun
ner.java:276)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu
nner.java:167)
>>>---- End Exception ----<<< 

        at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:
885)
        at
org.exolab.castor.xml.UnmarshalHandler.endElement(UnmarshalHandler.java:
918)
        at
org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
        at
org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown
Source)
        at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDis
patcher.dispatch(Unknown Source)
        at
org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unkno
wn Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown
Source)
        at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown
Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown
Source)
        at
org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:583)
        at JDOTester.testUnMarshalling(JDOTester.java:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at junit.framework.TestCase.runTest(TestCase.java:166)
        at junit.framework.TestCase.runBare(TestCase.java:140)
        at junit.framework.TestResult$1.protect(TestResult.java:106)
        at junit.framework.TestResult.runProtected(TestResult.java:124)
        at junit.framework.TestResult.run(TestResult.java:109)
        at junit.framework.TestCase.run(TestCase.java:131)
        at junit.framework.TestSuite.runTest(TestSuite.java:173)
        at junit.framework.TestSuite.run(TestSuite.java:168)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTe
stRunner.java:392)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRun
ner.java:276)
        at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRu
nner.java:167)

MAPPING
<mapping>
    <description>mapping for simple vo</description>
    <class  name="SimpleVO">
        <map-to xml="Order"/>
        <field  name="quantity"
                type="int">
            <bind-xml name="quantity" node="element"/>
        </field>

        <field name="amount"
               type="float">
               <bind-xml name="net-amount" node="element"/>
        </field>

        <field name="orderDate" type="date" handler="MyNewDateHandler">
                <bind-xml name="order-date" node="element"/>
        </field>
    </class>
</mapping>

CODE SNIPPET
Mapping mapping = new Mapping();
mapping.loadMapping("d:/work/test/m1");
                
Unmarshaller unmarshaller = new Unmarshaller(SimpleVO.class);
unmarshaller.setLogWriter(new PrintWriter(new
FileWriter("d:/work/test/U.log")));
unmarshaller.setMapping(mapping);

InputSource is = new InputSource(new
FileReader("d:/work/test/simplevo.xml"));
SimpleVO vo = (SimpleVO)unmarshaller.unmarshal(is);

Thanks for your time
anand

----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-dev

----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-dev

Reply via email to