View Javadoc

1   package org.codehaus.xfire.java.message;
2   
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   import java.util.List;
6   
7   import org.codehaus.xfire.MessageContext;
8   import org.codehaus.xfire.handler.dom.Message;
9   import org.codehaus.xfire.java.JavaService;
10  import org.codehaus.xfire.java.Operation;
11  import org.codehaus.xfire.java.type.Type;
12  import org.codehaus.xfire.util.NamespaceHelper;
13  import org.dom4j.Element;
14  import org.dom4j.Namespace;
15  import org.dom4j.QName;
16  
17  /***
18   * Bridges Document/Literal style messages.
19   * 
20   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
21   * @since Apr 7, 2004
22   */
23  public class DocumentBridge
24      extends AbstractMessageBridge
25  {
26  	public DocumentBridge( JavaService service, 
27              MessageContext context,
28              Message request,
29              Message response )
30      {
31  		super( service, context, request, response );
32          
33          setNamespace( getService().getDefaultNamespace() );
34          findOperation();
35  	}
36  
37      private void findOperation()
38      {
39          Namespace ns = NamespaceHelper.getNamespace( getRequest(),
40                                                       getNamespace() );
41          boolean found = false;
42          
43          for( Iterator itr = getService().getOperations().iterator(); itr.hasNext(); )
44          {
45              Operation op = (Operation) itr.next();
46              
47              if ( op.getParameters().size() == getRequest().elements().size() )
48              {
49                  found = true;
50                  
51                  for ( Iterator pitr = op.getParameters().iterator(); pitr.hasNext(); )
52                  {
53                      String param = (String) pitr.next();
54                      
55                      Element element = getRequest().element( new QName(param, ns) );
56                      
57                      if ( element == null )
58                      {
59                          found = false;
60                          break;
61                      }
62                  }
63              
64                  if ( found )
65                  {
66                      setOperation( op );
67                      found = false;
68                  }
69              }
70          }
71      }
72  
73      public List read()
74      {
75          List parameters = new ArrayList();
76          
77          for ( Iterator itr = getRequest().elementIterator(); itr.hasNext(); )
78          {
79              Element element = (Element) itr.next();
80              
81              Class clazz = getOperation().getParameterClass( element.getName() );
82  
83              // TODO: support complex type mappings...
84              Type type = getTypeMapping().getType( clazz );
85  
86              parameters.add( type.readObject( new LiteralReader( element ) ) );
87          }
88          
89          return parameters;
90      }
91  
92      public void write(Object value)
93      {
94          Type type = getTypeMapping().getType( value.getClass() );
95  
96          Namespace ns = null;
97          
98          if ( type.isComplex() )
99          {
100             ns = type.getSchemaType().getNamespace();
101         }
102         else
103         {
104         	ns = NamespaceHelper.getNamespace( getResponse(), getNamespace() );
105         }
106         
107         QName outQ = new QName( getOperation().getOutParameterName(), ns );
108         Element out = getResponse().addElement( outQ );
109 
110         type.writeObject( value, new LiteralWriter( out ) );
111     }
112 }