1   package org.codehaus.xfire.type.basic;
2   
3   import java.io.ByteArrayOutputStream;
4   import java.io.StringReader;
5   
6   import javax.xml.namespace.QName;
7   import javax.xml.stream.XMLInputFactory;
8   import javax.xml.stream.XMLOutputFactory;
9   import javax.xml.stream.XMLStreamReader;
10  import javax.xml.stream.XMLStreamWriter;
11  
12  import org.codehaus.xfire.message.LiteralReader;
13  import org.codehaus.xfire.message.LiteralWriter;
14  import org.codehaus.xfire.services.SimpleBean;
15  import org.codehaus.xfire.test.AbstractXFireTypeTest;
16  import org.codehaus.xfire.type.TypeMappingRegistry;
17  import org.codehaus.xfire.type.basic.ArrayType;
18  import org.codehaus.xfire.type.basic.BeanType;
19  import org.dom4j.Document;
20  import org.dom4j.DocumentHelper;
21  import org.dom4j.Element;
22  
23  /***
24   * TypeTest
25   * 
26   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
27   */
28  public class TypeTest
29      extends AbstractXFireTypeTest
30  {
31      public void testBeanType() throws Exception
32      {
33          XMLOutputFactory ofactory = XMLOutputFactory.newInstance();
34          ByteArrayOutputStream bos = new ByteArrayOutputStream();
35          XMLStreamWriter writer = ofactory.createXMLStreamWriter(bos);
36  
37          TypeMappingRegistry tmr = getRegistry();
38          
39          SimpleBean bean = new SimpleBean();
40          bean.setBleh("bleh");
41          bean.setHowdy("howdy");
42          
43          registerSimpleBeanType(tmr);
44          
45          BeanType bt = (BeanType) tmr.getDefaultTypeMapping().getType( SimpleBean.class );
46  
47          LiteralWriter lwriter = new LiteralWriter(writer, "SimpleBean", "urn:Bean");
48          bt.writeObject( bean, lwriter, null );
49          lwriter.close();
50          
51          writer.close();
52          
53          System.out.println(bos.toString());
54          XMLInputFactory factory = XMLInputFactory.newInstance();
55          XMLStreamReader reader = factory.createXMLStreamReader( new StringReader(bos.toString()) );
56          while ( reader.getEventType() != XMLStreamReader.START_ELEMENT )
57              reader.next();
58                  
59          SimpleBean readBean = (SimpleBean) bt.readObject( new LiteralReader(reader), null );
60          assertNotNull( readBean );
61          assertEquals( "bleh", readBean.getBleh() );
62          assertEquals( "howdy", readBean.getHowdy() );
63  
64          Document doc = DocumentHelper.createDocument();
65          Element root = doc.addElement("root");
66          
67          bt.writeSchema( root );
68   
69          // TODO: run XPath tests on Schema
70      }
71      
72      /***
73       * @param tmr
74       * @return
75       */
76      private void registerSimpleBeanType(TypeMappingRegistry tmr)
77      {
78          tmr.getDefaultTypeMapping().register( SimpleBean.class, 
79                                                new QName("urn:SimpleBean","SimpleBean"),
80                                                new BeanType() );
81      }
82  
83      private void registerArrayType(TypeMappingRegistry tmr)
84      {
85          tmr.getDefaultTypeMapping().register( SimpleBean[].class, 
86                                                new QName("urn:SomeBean" , "ArrayOfSimpleBean"),
87                                                new ArrayType() );
88      }
89      
90      public void testArrayType() throws Exception
91      {
92          XMLOutputFactory ofactory = XMLOutputFactory.newInstance();
93          ByteArrayOutputStream bos = new ByteArrayOutputStream();
94          XMLStreamWriter writer = ofactory.createXMLStreamWriter(bos);
95  
96          TypeMappingRegistry tmr = getRegistry();
97          
98          registerSimpleBeanType(tmr);
99          registerArrayType( tmr );
100         
101         SimpleBean bean = new SimpleBean();
102         bean.setBleh("bleh");
103         bean.setHowdy("howdy");
104        
105         SimpleBean[] beanArray = new SimpleBean[] { bean, bean };
106 
107         ArrayType at = (ArrayType) tmr.getDefaultTypeMapping().getType( SimpleBean[].class );
108 
109         at.writeObject( beanArray, new LiteralWriter( writer, "SimpleBean", "urn:Bean" ), null );
110         writer.close();
111         
112         /* TODO: figure out why this doesn't work. It works when you're
113          * actually reading/writing documents. I think it has something
114          * to do with the reader.next() in the END_ELEMENT case in LiteralReader.
115 
116         XMLInputFactory factory = XMLInputFactory.newInstance();
117         XMLStreamReader reader = factory.createXMLStreamReader( new StringReader(bos.toString()) );
118         while ( reader.getEventType() != XMLStreamReader.START_ELEMENT )
119             reader.next();
120 
121         Object out1 = at.readObject( new LiteralReader( reader ) );
122         
123         SimpleBean[] beans = (SimpleBean[]) out1;
124         assertNotNull( beans );
125         assertEquals( "bleh", beans[0].getBleh() );
126         assertEquals( "howdy", beans[0].getHowdy() );
127 
128         Document doc = DocumentHelper.createDocument();
129         Element root = doc.addElement("root");
130         
131         at.writeSchema( root );
132         */
133         // TODO: run XPath tests on Schema
134     }
135 }