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

com.google.api.ads.common.lib.soap.RequestInfoXPathSet Maven / Gradle / Ivy

// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.api.ads.common.lib.soap;

import com.google.api.ads.common.lib.client.RequestInfo;
import com.google.api.ads.common.lib.conf.AdsApiConfiguration;
import com.google.api.ads.common.lib.utils.IterableXPath;
import com.google.api.ads.common.lib.utils.NodeExtractor;
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamResult;
import org.slf4j.Logger;

/** XPaths to capture from SOAP requests. */
public class RequestInfoXPathSet {

  private final IterableXPath contextXPath;
  private final String contextName;
  private final NodeExtractor nodeExtractor;
  private final Supplier transformerSupplier;
  private final Logger libLogger;

  @Inject
  public RequestInfoXPathSet(
      AdsApiConfiguration apiConfig,
      NodeExtractor nodeExtractor,
      Supplier transformerSupplier,
      @Named("libLogger") Logger libLogger) {
    Preconditions.checkNotNull(apiConfig);
    this.contextXPath = new IterableXPath(apiConfig.getRequestContextXPath());
    this.contextName =
        Iterables.isEmpty(this.contextXPath) ? null : Iterables.getLast(this.contextXPath);
    this.nodeExtractor = Preconditions.checkNotNull(nodeExtractor);
    this.transformerSupplier = Preconditions.checkNotNull(transformerSupplier);
    this.libLogger = Preconditions.checkNotNull(libLogger);
  }

  public IterableXPath getContextXPath() {
    return contextXPath;
  }

  public String getContextName() {
    return contextName;
  }

  @Override
  public String toString() {
    return MoreObjects.toStringHelper(this)
        .add("contextName", contextName)
        .add("contextXPath", contextXPath)
        .toString();
  }

  public RequestInfo.Builder parseMessage(RequestInfo.Builder builder, SOAPMessage soapMessage) {
    Preconditions.checkNotNull(builder, "Null builder");
    Transformer transformer = transformerSupplier.get();
    if (soapMessage == null || soapMessage.getSOAPPart() == null || transformer == null) {
      return builder;
    }
    try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
      // Some SOAP frameworks don't include SOAP headers when calling SOAPMessage.writeTo.
      // Use an XML transformer to write the XML content instead.
      transformer.transform(soapMessage.getSOAPPart().getContent(), new StreamResult(outputStream));
      builder.withPayload(outputStream.toString(StandardCharsets.UTF_8.name()));
    } catch (TransformerException | SOAPException | IOException e) {
      builder.withPayload("Unable to read request content due to exception: " + e);
      libLogger.warn("Unable to read request content due to exception.", e);
    }

    try {
      SOAPHeader soapHeader = soapMessage.getSOAPHeader();
      builder.withContext(contextName, nodeExtractor.extractNodeValue(soapHeader, contextXPath));
    } catch (SOAPException e) {
      builder.withContext(
          contextName, "Unable to extract " + contextName + " from request due to exception: " + e);
    }
    return builder;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy