1 package org.codehaus.xfire.jaxb;
2
3 import com.sun.xml.bind.RIElement;
4 import org.codehaus.xfire.XFireRuntimeException;
5
6 import javax.xml.bind.JAXBContext;
7 import javax.xml.namespace.QName;
8 import java.lang.reflect.Method;
9
10 public class JaxbIntrospector
11 {
12 private JAXBContext jaxbContext;
13
14 public JaxbIntrospector(JAXBContext jaxbContext)
15 {
16 this.jaxbContext = jaxbContext;
17 }
18
19 public QName introspect(Class clazz)
20 {
21 String typeName = clazz.getName();
22 typeName = typeName.substring(typeName.lastIndexOf('.') + 1);
23
24 Method creator;
25
26 RIElement instance;
27 try
28 {
29
30 creator = jaxbContext.getClass().getMethod("create" + typeName, null);
31 instance = (RIElement) creator.invoke(jaxbContext, null);
32
33 } catch (Exception e)
34 {
35 throw new XFireRuntimeException("error getting qname of jaxb type", e);
36 }
37 return new QName(instance.____jaxb_ri____getNamespaceURI(), instance.____jaxb_ri____getLocalName());
38
39 }
40 }