All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mule.service.soap.metadata.HeadersMetadataResolver Maven / Gradle / Ivy

/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.service.soap.metadata;

import org.mule.metadata.api.TypeLoader;
import org.mule.metadata.api.builder.ObjectFieldTypeBuilder;
import org.mule.metadata.api.builder.ObjectTypeBuilder;
import org.mule.metadata.api.model.MetadataType;
import org.mule.runtime.api.metadata.MetadataResolvingException;
import org.mule.wsdl.parser.model.PortModel;
import org.mule.wsdl.parser.model.WsdlModel;
import org.mule.wsdl.parser.model.operation.OperationModel;
import org.mule.wsdl.parser.model.operation.SoapHeader;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;

import javax.wsdl.Message;
import javax.wsdl.Part;

/**
 * Handles the dynamic {@link MetadataType} resolution for the SOAP Headers of a web service operation.
 *
 * @since 1.0
 */
abstract class HeadersMetadataResolver extends NodeMetadataResolver {

  private final WsdlModel wsdl;
  private final Function messageRetriever;
  private final Function> headersRetriever;

  HeadersMetadataResolver(WsdlModel wsdl,
                          PortModel port,
                          TypeLoader loader,
                          Function messageRetriever,
                          Function> headersRetriever) {
    super(port, loader, o -> Optional.empty());
    this.wsdl = wsdl;
    this.messageRetriever = messageRetriever;
    this.headersRetriever = headersRetriever;
  }

  @Override
  public MetadataType getMetadata(String operationName) throws MetadataResolvingException {
    OperationModel operation = port.getOperation(operationName);
    List headers = headersRetriever.apply(operation);
    if (!headers.isEmpty()) {
      return buildHeaderType(headers, messageRetriever.apply(operation));
    }
    return nullType;
  }

  private MetadataType buildHeaderType(List headers, Message message)
      throws MetadataResolvingException {
    ObjectTypeBuilder objectType = typeBuilder.objectType();
    for (SoapHeader header : headers) {
      ObjectFieldTypeBuilder field = objectType.addField();
      String headerPart = header.getPartName();
      Part part = message.getPart(headerPart);
      if (part != null) {
        field.key(headerPart).value(buildPartMetadataType(part));
      } else {
        Message headerMessage = wsdl.getMessage(header.getQName());
        field.key(headerPart).value(buildPartMetadataType(headerMessage.getPart(headerPart)));
      }
    }
    return objectType.build();
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy