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          Element header = message.getHeader();
63          if ( header != null )
64          {
65              for ( Iterator itr = requestHeader.iterator(); itr.hasNext(); )
66              {
67                  Type type = (Type) itr.next();
68                  type.read(message.getHeader(), vars);
69              }
70          }
71          
72          Element payload = (Element) message.getBody().elements().get(0);
73          
74          for ( Iterator itr = request.iterator(); itr.hasNext(); )
75          {
76              Type type = (Type) itr.next();
77              type.read(payload, vars);
78          }
79      }
80  
81      public void configure( Element config, AegisService service, TypeRegistry reg )
82      {
83          setQName( QName.get(config.attributeValue("name"), service.getDefaultNamespace()) );
84          setDocumentation( config.getTextTrim() );
85  
86          configureTypes( service, response, reg, config.element("response") );
87          configureTypes( service, request, reg, config.element("request") );
88          configureTypes( service, responseHeader, reg, config.element("responseHeader") );
89          configureTypes( service, requestHeader, reg, config.element("requestHeader") );
90      }
91      
92  
93  	private void configureTypes(AegisService service, List types, TypeRegistry reg, Element resEl)
94  	{
95          if ( resEl == null )
96              return;
97          
98  		List resElements = resEl.elements();
99          for ( Iterator itr = resElements.iterator(); itr.hasNext(); )
100         {
101             Element paramEl = (Element) itr.next();
102             Type type = createType(service, reg, paramEl);
103             
104             types.add(type);
105         }
106 	}
107 
108 	/***
109 	 * @param service
110 	 * @param reg
111 	 * @param paramEl
112 	 * @return
113 	 */
114 	private Type createType(AegisService service, TypeRegistry reg, Element paramEl)
115 	{
116 		QName typeQ = QName.get( paramEl.getName(), service.getSoapVersion() );
117 		
118 		Type type = reg.createType(typeQ);
119         
120         if ( type == null )
121             throw new XFireRuntimeException( "No such type exists: " + typeQ );
122         
123 		type.configure(paramEl, service, reg);
124 		return type;
125 	}
126 
127 	public List getRequest()
128 	{
129 		return request;
130 	}
131     
132 	public void setRequest(List request)
133 	{
134 		this.request = request;
135 	}
136     
137 	public List getResponse()
138 	{
139 		return response;
140 	}
141     
142 	public void setResponse(List response)
143 	{
144 		this.response = response;
145 	}
146 
147 	public QName getQName()
148 	{
149 		return qName;
150 	}
151     
152     public void setQName(QName name)
153     {
154         qName = name;
155     }
156     
157 	public String getDocumentation()
158 	{
159 		return documentation;
160 	}
161     
162 	public void setDocumentation(String documentation)
163 	{
164 		this.documentation = documentation;
165 	}
166 }