// Copyright 2011, 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.utils.logging;
import com.google.api.ads.common.lib.soap.RequestInfo;
import com.google.api.ads.common.lib.soap.ResponseInfo;
import com.google.api.ads.common.lib.soap.SoapCallReturn;
import com.google.inject.name.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
/**
* The class {@code AdsServiceLogger} allows logging of outgoing and
* incoming SOAP XML messages as API calls are executed.
*/
public class AdsServiceLoggers {
/** The client library logger. */
public static final Logger ADS_API_LIB_LOG =
LoggerFactory.getLogger(AdsServiceLoggers.class.getName() + ".ads_api_lib");
private final PrettyPrinterInterface prettyPrinter;
private final Logger soapXmlLogger;
private final Logger requestInfoLogger;
/**
* Constructor.
*
* @param prettyPrinter an object capable of pretty printing XML messages
* @param soapXmlLogger the SOAP XML logger
* @param requestInfoLogger the request info logger
*/
@Inject
protected AdsServiceLoggers(PrettyPrinterInterface prettyPrinter,
@Named("soapXmlLogger") Logger soapXmlLogger,
@Named("requestInfoLogger") Logger requestInfoLogger) {
this.prettyPrinter = prettyPrinter;
this.soapXmlLogger = soapXmlLogger;
this.requestInfoLogger = requestInfoLogger;
}
/**
* Gets the client library info logger.
*
* @return the request info logger
*/
public Logger getLibLogger() {
return ADS_API_LIB_LOG;
}
/**
* Logs the XML messages from a given SOAP interaction.
*
* @param soapCallReturn information on the SOAP call to be logged
*/
public void logSoapXml(SoapCallReturn soapCallReturn) {
RequestInfo request = soapCallReturn.getRequestInfo();
ResponseInfo response = soapCallReturn.getResponseInfo();
if (soapXmlLogger.isInfoEnabled() ||
(soapXmlLogger.isWarnEnabled() && soapCallReturn.getException() != null)) {
String prettyRequest = "SOAP Request:\n" +
prettyPrinter.prettyPrint(request.getSoapRequestXml());
String prettyResponse = "SOAP Response:\n" +
prettyPrinter.prettyPrint(response.getSoapResponseXml());
if (soapCallReturn.getException() == null) {
soapXmlLogger.info(prettyRequest);
soapXmlLogger.info(prettyResponse);
} else {
soapXmlLogger.warn(prettyRequest);
soapXmlLogger.warn(prettyResponse);
}
}
}
/**
* Logs basic information on a SOAP request.
*
* @param soapCallReturn information on the SOAP call to be logged
*/
public void logRequest(SoapCallReturn soapCallReturn) {
RequestInfo request = soapCallReturn.getRequestInfo();
ResponseInfo response = soapCallReturn.getResponseInfo();
Object[] logArgs = new Object[4];
if (request != null) {
logArgs[0] = request.getServiceName();
logArgs[1] = request.getMethodName();
logArgs[2] = request.getUrl();
}
if (response != null) {
logArgs[3] = response.getRequestId();
}
requestInfoLogger.info(
"Request made: Service: \"{}\" Method: \"{}\" URL: \"{}\" Request ID: \"{}\"",
logArgs);
}
}