1 package org.codehaus.xfire.xmlbeans;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import javax.xml.namespace.QName;
7 import javax.xml.stream.XMLStreamException;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.apache.xmlbeans.SchemaProperty;
12 import org.apache.xmlbeans.SchemaType;
13 import org.apache.xmlbeans.XmlBeans;
14 import org.apache.xmlbeans.XmlCursor;
15 import org.apache.xmlbeans.XmlException;
16 import org.apache.xmlbeans.XmlObject;
17 import org.codehaus.xfire.MessageContext;
18 import org.codehaus.xfire.XFireRuntimeException;
19 import org.codehaus.xfire.aegis.MessageReader;
20 import org.codehaus.xfire.aegis.MessageWriter;
21 import org.codehaus.xfire.aegis.stax.ElementReader;
22 import org.codehaus.xfire.aegis.stax.ElementWriter;
23 import org.codehaus.xfire.aegis.type.Type;
24 import org.codehaus.xfire.fault.XFireFault;
25 import org.codehaus.xfire.util.STAXUtils;
26 import org.codehaus.yom.Element;
27
28 /***
29 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
30 * @since Nov 13, 2004
31 */
32 public class XmlBeansType
33 extends Type
34 {
35 private SchemaType schemaType;
36
37 private final static Log logger = LogFactory.getLog(XmlBeansType.class);
38
39 public XmlBeansType()
40 {
41 }
42
43 public XmlBeansType(SchemaType schemaType)
44 {
45 this.schemaType = schemaType;
46 setTypeClass(schemaType.getJavaClass());
47 }
48
49 public XmlBeansType(Class clazz)
50 {
51 this.schemaType = XmlBeans.typeForClass(clazz);
52 setTypeClass(clazz);
53 }
54
55 public void writeSchema(Element root)
56 {
57 }
58
59 public boolean isComplex()
60 {
61 return !schemaType.isPrimitiveType();
62 }
63
64 public boolean isAbstract()
65 {
66 return schemaType.isAbstract();
67 }
68
69 public Set getDependencies()
70 {
71 SchemaProperty[] properties = schemaType.getProperties();
72 HashSet deps = new HashSet();
73 for (int i = 0; i < properties.length; i++)
74 {
75 SchemaType etype = properties[i].getType();
76 SchemaProperty[] iprops = etype.getElementProperties();
77 for (int j = 0; j < iprops.length; j++)
78 {
79 SchemaType itype = iprops[j].getType();
80
81 if (!itype.isPrimitiveType() && itype.getSourceName() != null)
82 {
83 deps.add(new XmlBeansType(itype));
84 }
85 }
86 }
87 return deps;
88 }
89
90 public QName getSchemaType()
91 {
92 if (schemaType.isDocumentType())
93 return schemaType.getDocumentElementName();
94 else if (schemaType.getName() != null)
95 return schemaType.getName();
96 else
97 {
98
99 SchemaType outer = schemaType.getOuterType();
100 while (outer != null)
101 {
102 if (outer.isDocumentType())
103 return outer.getDocumentElementName();
104 else if (outer.getName() != null)
105 return outer.getName();
106 else
107 outer = outer.getOuterType();
108 }
109
110
111 throw new XFireRuntimeException("No type name is defined for <" + schemaType + "> " +
112 "and no outer type containing the inline type -- this " +
113 "should not be possible to be a legally defined schema");
114 }
115 }
116
117 public Object readObject(MessageReader reader, MessageContext context)
118 throws XFireFault
119 {
120 try
121 {
122 return XmlObject.Factory.parse(((ElementReader)reader).getXMLStreamReader());
123 }
124 catch( XmlException e )
125 {
126 throw new XFireFault("Could not read request.", e, XFireFault.SENDER);
127 }
128 }
129
130 public void writeObject(Object value, MessageWriter writer, MessageContext context)
131 throws XFireFault
132 {
133 try
134 {
135 XmlObject obj = (XmlObject) value;
136
137 XmlCursor cursor = obj.newCursor();
138 if (cursor.toFirstChild() && cursor.toFirstChild())
139 {
140 do
141 {
142 STAXUtils.copy(cursor.newXMLStreamReader(),
143 ((ElementWriter) writer).getXMLStreamWriter());
144 }
145 while(cursor.toNextSibling());
146 }
147 }
148 catch (XMLStreamException e)
149 {
150 throw new XFireFault("Could not write response.", e, XFireFault.SENDER);
151 }
152 }
153 }