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 }