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 }