}
private static Binding<?> createWsdl2HttpBinding(Endpoint wsdlEndpoint) {
Wsdl2HttpBindingImpl binding = new Wsdl2HttpBindingImpl();
binding.setLocation(wsdlEndpoint.getAddress().toString());
Interface wsdlInterface = wsdlEndpoint.getBinding().getInterface();
InterfaceOperation[] wsdlOperations = wsdlInterface.getInterfaceOperations();
for (int i = 0; i < wsdlOperations.length; i++) {
// Retrieve binding and extension
InterfaceOperation wsdlOperation = wsdlOperations[i];
BindingOperation wsdlBindingOperation = findBindingOperation(wsdlEndpoint.getBinding(), wsdlOperation);
HTTPBindingOperationExtensions opExt = wsdlBindingOperation != null ? (HTTPBindingOperationExtensions) wsdlBindingOperation.getComponentExtensionsForNamespace(ComponentExtensions.URI_NS_HTTP) : null;
// Create operation
Wsdl2HttpOperationImpl operation = new Wsdl2HttpOperationImpl();
// Standard WSDL2 attributes
operation.setName(wsdlOperation.getName());
operation.setMep(wsdlOperation.getMessageExchangePattern());
operation.setStyle(new HashSet<URI>(Arrays.asList(wsdlOperation.getStyle())));
// HTTP extensions
if (opExt != null) {
operation.setHttpInputSerialization(opExt.getHttpInputSerialization());
operation.setHttpOutputSerialization(opExt.getHttpOutputSerialization());
operation.setHttpFaultSerialization(opExt.getHttpFaultSerialization());
operation.setHttpLocation(extractLocation(wsdlBindingOperation));
operation.setHttpMethod(opExt.getHttpMethod());
operation.setHttpTransferCodingDefault(opExt.getHttpTransferCodingDefault());
operation.setHttpLocationIgnoreUncited(opExt.isHttpLocationIgnoreUncited());
}
// Messages
InterfaceMessageReference[] iMsgRefs = wsdlOperation.getInterfaceMessageReferences();
for (int j = 0; j < iMsgRefs.length; j++) {
// Retrieve binding and extension
InterfaceMessageReference iMsgRef = iMsgRefs[j];
BindingMessageReference bMsgRef = findBindingMessage(wsdlBindingOperation, iMsgRef);
HTTPBindingMessageReferenceExtensions msgExt = bMsgRef != null ? (HTTPBindingMessageReferenceExtensions) bMsgRef.getComponentExtensionsForNamespace(ComponentExtensions.URI_NS_HTTP) : null;
// Create message
Wsdl2HttpMessageImpl message = new Wsdl2HttpMessageImpl();
// Standard WSDL2 attributes
message.setContentModel(ContentModel.parse(iMsgRef.getMessageContentModel()));
message.setElementName(iMsgRef.getElementDeclaration().getName());
if (!XSD_2001_SYSTEM.equals(iMsgRef.getElementDeclaration().getSystem())) {
throw new IllegalStateException("Unsupported type system: " + iMsgRef.getElementDeclaration().getSystem());
}
if (Constants.API_APACHE_WS_XS.equals(iMsgRef.getElementDeclaration().getContentModel())) {
XmlSchemaElement xsEl = (XmlSchemaElement) iMsgRef.getElementDeclaration().getContent();
message.setElementDeclaration(xsEl);
}
// HTTP extensions
if (msgExt != null) {
message.setHttpTransferCoding(msgExt.getHttpTransferCoding());
HTTPHeader[] headers = msgExt.getHttpHeaders();
for (int k = 0; k < headers.length; k++) {
Wsdl2HttpHeaderImpl h = new Wsdl2HttpHeaderImpl();
h.setName(headers[k].getName());
h.setRequired(headers[k].isRequired() ? headers[k].isRequired().booleanValue() : false);
if (!XSD_2001_SYSTEM.equals(headers[k].getTypeDefinition().getSystem())) {
throw new IllegalStateException("Unsupported type system: " + headers[k].getTypeDefinition().getSystem());
}
h.setType(headers[k].getTypeDefinition().getName());
message.addHttpHeader(h);
}
}
// Add the message
if (iMsgRef.getDirection() == Direction.IN) {
operation.setInput(message);
} else if (iMsgRef.getDirection() == Direction.OUT) {
operation.setOutput(message);
} else {
throw new IllegalStateException("Unsupported message direction: " + iMsgRef.getDirection());
}
}
// Faults
InterfaceFaultReference[] faults = wsdlOperation.getInterfaceFaultReferences();
for (int j = 0; j < faults.length; j++) {
// TODO: handle interface faults references
}
// Add the operation
binding.addOperation(operation);
}
// Faults
InterfaceFault[] faults = wsdlInterface.getInterfaceFaults();
for (int i = 0; i < faults.length; i++) {
// TODO: handle interface faults
}
// Return the complete binding
return binding;