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 }