View Javadoc

1   package org.codehaus.xfire.aegis.operation;
2   
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   import java.util.List;
6   import java.util.Map;
7   
8   import org.codehaus.xfire.XFireRuntimeException;
9   import org.codehaus.xfire.aegis.AegisService;
10  import org.codehaus.xfire.aegis.mapping.TypeRegistry;
11  import org.codehaus.xfire.aegis.type.Type;
12  import org.codehaus.xfire.fault.XFireFault;
13  import org.codehaus.xfire.handler.dom.Message;
14  import org.dom4j.Element;
15  import org.dom4j.QName;
16  
17  /***
18   * WrappedOperation
19   * 
20   * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
21   */
22  public class WrappedOperation
23  {
24      private List request;
25      private List response;
26      private List requestHeader;
27      private List responseHeader;
28      private QName qName;
29      private String documentation;
30      
31      public WrappedOperation()
32      {
33      	request = new ArrayList();
34          response = new ArrayList();
35          requestHeader = new ArrayList();
36          responseHeader = new ArrayList();
37      }
38      
39      public void write( Message message, Map vars )
40          throws XFireFault
41      {
42          for ( Iterator itr = responseHeader.iterator(); itr.hasNext(); )
43          {
44              Type type = (Type) itr.next();
45              type.write(message.getHeader(), vars);
46          }
47          
48          QName responseQ = QName.get( getQName().getName() + "Response", getQName().getNamespace() );
49          
50          Element responseEl = message.getBody().addElement(responseQ);
51          
52          for ( Iterator itr = response.iterator(); itr.hasNext(); )
53          {
54              Type type = (Type) itr.next();
55              type.write(responseEl, vars);
56          }
57      }
58  
59      public void read( Message message, Map vars )
60          throws XFireFault
61      {
62          for ( Iterator itr = requestHeader.iterator(); itr.hasNext(); )
63          {
64              Type type = (Type) itr.next();
65              type.read(message.getHeader(), vars);
66          }
67          
68          Element payload = (Element) message.getBody().elements().get(0);
69          
70          for ( Iterator itr = request.iterator(); itr.hasNext(); )
71          {
72              Type type = (Type) itr.next();
73              type.read(payload, vars);
74          }
75      }
76  
77      public void configure( Element config, AegisService service, TypeRegistry reg )
78      {
79          setQName( QName.get(config.attributeValue("name"), service.getDefaultNamespace()) );
80          setDocumentation( config.getTextTrim() );
81  
82          configureTypes( service, response, reg, config.element("response") );
83          configureTypes( service, request, reg, config.element("request") );
84          configureTypes( service, responseHeader, reg, config.element("responseHeader") );
85          configureTypes( service, requestHeader, reg, config.element("requestHeader") );
86      }
87      
88  
89  	private void configureTypes(AegisService service, List types, TypeRegistry reg, Element resEl)
90  	{
91          if ( resEl == null )
92              return;
93          
94  		List resElements = resEl.elements();
95          for ( Iterator itr = resElements.iterator(); itr.hasNext(); )
96          {
97              Element paramEl = (Element) itr.next();
98              Type type = createType(service, reg, paramEl);
99              
100             types.add(type);
101         }
102 	}
103 
104 	/***
105 	 * @param service
106 	 * @param reg
107 	 * @param paramEl
108 	 * @return
109 	 */
110 	private Type createType(AegisService service, TypeRegistry reg, Element paramEl)
111 	{
112 		QName typeQ = QName.get( paramEl.getName(), service.getSoapVersion() );
113 		
114 		Type type = reg.createType(typeQ);
115         
116         if ( type == null )
117             throw new XFireRuntimeException( "No such type exists: " + typeQ );
118         
119 		type.configure(paramEl, service, reg);
120 		return type;
121 	}
122 
123 	public List getRequest()
124 	{
125 		return request;
126 	}
127     
128 	public void setRequest(List request)
129 	{
130 		this.request = request;
131 	}
132     
133 	public List getResponse()
134 	{
135 		return response;
136 	}
137     
138 	public void setResponse(List response)
139 	{
140 		this.response = response;
141 	}
142 
143 	public QName getQName()
144 	{
145 		return qName;
146 	}
147     
148     public void setQName(QName name)
149     {
150         qName = name;
151     }
152     
153 	public String getDocumentation()
154 	{
155 		return documentation;
156 	}
157     
158 	public void setDocumentation(String documentation)
159 	{
160 		this.documentation = documentation;
161 	}
162 }