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 }