Skip to content

Commit 2ce2fd9

Browse files
authored
Merge pull request OfficeDev#3 from surevine/add-tracer
Add service request listener for better tracing
2 parents ea8614d + 62d32b5 commit 2ce2fd9

3 files changed

Lines changed: 86 additions & 87 deletions

File tree

src/main/java/microsoft/exchange/webservices/data/core/ExchangeServiceBase.java

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -23,55 +23,31 @@
2323

2424
package microsoft.exchange.webservices.data.core;
2525

26-
import java.io.ByteArrayOutputStream;
27-
import java.io.Closeable;
28-
import java.io.File;
29-
import java.io.IOException;
30-
import java.net.MalformedURLException;
31-
import java.net.URI;
32-
import java.net.URISyntaxException;
33-
import java.security.GeneralSecurityException;
34-
import java.text.DateFormat;
35-
import java.text.SimpleDateFormat;
36-
import java.util.Date;
37-
import java.util.EnumSet;
38-
import java.util.HashMap;
39-
import java.util.List;
40-
import java.util.Map;
41-
import java.util.Random;
42-
import java.util.TimeZone;
43-
44-
import javax.xml.stream.XMLStreamException;
45-
import javax.xml.stream.XMLStreamWriter;
46-
47-
import microsoft.exchange.webservices.data.EWSConstants;
48-
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
49-
import microsoft.exchange.webservices.data.core.enumeration.misc.TraceFlags;
50-
import microsoft.exchange.webservices.data.core.exception.http.EWSHttpException;
51-
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
52-
import microsoft.exchange.webservices.data.core.exception.service.remote.AccountIsLockedException;
53-
import microsoft.exchange.webservices.data.core.request.HttpClientWebRequest;
54-
import microsoft.exchange.webservices.data.core.request.HttpWebRequest;
55-
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
56-
import microsoft.exchange.webservices.data.misc.EwsTraceListener;
57-
import microsoft.exchange.webservices.data.misc.ITraceListener;
58-
59-
import org.apache.commons.io.IOUtils;
60-
import org.apache.commons.logging.Log;
61-
import org.apache.commons.logging.LogFactory;
62-
import org.apache.http.client.AuthenticationStrategy;
26+
import microsoft.exchange.webservices.data.*;
27+
import microsoft.exchange.webservices.data.core.enumeration.misc.*;
28+
import microsoft.exchange.webservices.data.core.exception.http.*;
29+
import microsoft.exchange.webservices.data.core.exception.service.local.*;
30+
import microsoft.exchange.webservices.data.core.exception.service.remote.*;
31+
import microsoft.exchange.webservices.data.core.request.*;
32+
import microsoft.exchange.webservices.data.credential.*;
33+
import microsoft.exchange.webservices.data.misc.*;
34+
import org.apache.commons.io.*;
35+
import org.apache.commons.logging.*;
6336
import org.apache.http.client.CookieStore;
64-
import org.apache.http.client.protocol.HttpClientContext;
65-
import org.apache.http.config.Registry;
66-
import org.apache.http.config.RegistryBuilder;
67-
import org.apache.http.conn.HttpClientConnectionManager;
68-
import org.apache.http.conn.socket.ConnectionSocketFactory;
69-
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
70-
import org.apache.http.impl.client.BasicCookieStore;
71-
import org.apache.http.impl.client.CloseableHttpClient;
72-
import org.apache.http.impl.client.HttpClients;
73-
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
74-
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
37+
import org.apache.http.client.*;
38+
import org.apache.http.client.protocol.*;
39+
import org.apache.http.config.*;
40+
import org.apache.http.conn.*;
41+
import org.apache.http.conn.socket.*;
42+
import org.apache.http.impl.client.*;
43+
import org.apache.http.impl.conn.*;
44+
45+
import javax.xml.stream.*;
46+
import java.io.*;
47+
import java.net.*;
48+
import java.security.*;
49+
import java.text.*;
50+
import java.util.*;
7551

7652
/**
7753
* Represents an abstract binding to an Exchange Service.
@@ -168,6 +144,8 @@ public abstract class ExchangeServiceBase implements Closeable {
168144
*/
169145
private static String defaultUserAgent = "ExchangeServicesClient/" + EwsUtilities.getBuildVersion();
170146

147+
private ServiceRequestTraceListener serviceRequestTraceListener;
148+
171149
/**
172150
* Initializes a new instance.
173151
*
@@ -650,6 +628,10 @@ public void setTraceListener(ITraceListener traceListener) {
650628
this.traceEnabled = (traceListener != null);
651629
}
652630

631+
public void setServiceRequestTracer(ServiceRequestTraceListener serviceRequestTraceListener) {
632+
this.serviceRequestTraceListener = serviceRequestTraceListener;
633+
}
634+
653635
/**
654636
* Gets the credential used to authenticate with the Exchange Web Services.
655637
*
@@ -929,4 +911,25 @@ public static byte[] getSessionKey() {
929911
public int getMaximumPoolingConnections() {
930912
return maximumPoolingConnections;
931913
}
914+
915+
public <T> void traceServiceRequestStart(ServiceRequestBase<T> serviceRequest, HttpWebRequest request) {
916+
if (serviceRequestTraceListener == null) {
917+
return;
918+
}
919+
serviceRequestTraceListener.requestStart(serviceRequest, request);
920+
}
921+
922+
public <T> void traceServiceRequestError(ServiceRequestBase<T> serviceRequest, HttpWebRequest request, Exception e) {
923+
if (serviceRequestTraceListener == null) {
924+
return;
925+
}
926+
serviceRequestTraceListener.requestError(serviceRequest, request, e);
927+
}
928+
929+
public <T> void traceServiceRequestSuccess(ServiceRequestBase<T> serviceRequest, HttpWebRequest request) {
930+
if (serviceRequestTraceListener == null) {
931+
return;
932+
}
933+
serviceRequestTraceListener.requestFinish(serviceRequest, request);
934+
}
932935
}

src/main/java/microsoft/exchange/webservices/data/core/request/ServiceRequestBase.java

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,42 +23,22 @@
2323

2424
package microsoft.exchange.webservices.data.core.request;
2525

26-
import microsoft.exchange.webservices.data.core.EwsServiceXmlReader;
27-
import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter;
28-
import microsoft.exchange.webservices.data.core.EwsUtilities;
29-
import microsoft.exchange.webservices.data.core.ExchangeServerInfo;
30-
import microsoft.exchange.webservices.data.core.ExchangeService;
31-
import microsoft.exchange.webservices.data.core.XmlAttributeNames;
32-
import microsoft.exchange.webservices.data.core.XmlElementNames;
33-
import microsoft.exchange.webservices.data.core.response.ServiceResponse;
34-
import microsoft.exchange.webservices.data.core.enumeration.misc.DateTimePrecision;
35-
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
36-
import microsoft.exchange.webservices.data.core.enumeration.misc.TraceFlags;
37-
import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace;
38-
import microsoft.exchange.webservices.data.core.exception.http.EWSHttpException;
39-
import microsoft.exchange.webservices.data.core.exception.http.HttpErrorException;
40-
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
41-
import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException;
42-
import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceResponseException;
43-
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceVersionException;
44-
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlDeserializationException;
45-
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException;
46-
import microsoft.exchange.webservices.data.core.exception.xml.XmlException;
47-
import microsoft.exchange.webservices.data.misc.SoapFaultDetails;
48-
import microsoft.exchange.webservices.data.security.XmlNodeType;
49-
import org.apache.commons.io.IOUtils;
50-
import org.apache.commons.logging.Log;
51-
import org.apache.commons.logging.LogFactory;
52-
53-
import javax.xml.stream.XMLStreamException;
54-
import javax.xml.ws.http.HTTPException;
55-
56-
import java.io.ByteArrayInputStream;
57-
import java.io.ByteArrayOutputStream;
58-
import java.io.IOException;
59-
import java.io.InputStream;
60-
import java.util.zip.GZIPInputStream;
61-
import java.util.zip.InflaterInputStream;
26+
import microsoft.exchange.webservices.data.core.*;
27+
import microsoft.exchange.webservices.data.core.enumeration.misc.*;
28+
import microsoft.exchange.webservices.data.core.exception.http.*;
29+
import microsoft.exchange.webservices.data.core.exception.service.local.*;
30+
import microsoft.exchange.webservices.data.core.exception.service.remote.*;
31+
import microsoft.exchange.webservices.data.core.exception.xml.*;
32+
import microsoft.exchange.webservices.data.core.response.*;
33+
import microsoft.exchange.webservices.data.misc.*;
34+
import microsoft.exchange.webservices.data.security.*;
35+
import org.apache.commons.io.*;
36+
import org.apache.commons.logging.*;
37+
38+
import javax.xml.stream.*;
39+
import javax.xml.ws.http.*;
40+
import java.io.*;
41+
import java.util.zip.*;
6242

6343
/**
6444
* Represents an abstract service request.
@@ -719,18 +699,23 @@ private HttpWebRequest buildEwsHttpWebRequest(HttpWebRequest request) throws Exc
719699
*/
720700
protected HttpWebRequest getEwsHttpWebResponse(HttpWebRequest request) throws Exception {
721701
try {
702+
service.traceServiceRequestStart(this, request);
722703
request.executeRequest();
723704

724705
if (request.getResponseCode() >= 400) {
725-
throw new HttpErrorException(
726-
"The remote server returned an error: (" + request.getResponseCode() + ")" +
727-
request.getResponseText(), request.getResponseCode());
706+
HttpErrorException e = new HttpErrorException(
707+
"The remote server returned an error: (" + request.getResponseCode() + ")" +
708+
request.getResponseText(), request.getResponseCode());
709+
service.traceServiceRequestError(this, request, e);
710+
throw e;
728711
}
729712
} catch (IOException e) {
730713
// Wrap exception.
714+
service.traceServiceRequestError(this, request, e);
731715
throw new ServiceRequestException(String.format("The request failed. %s", e.getMessage()), e);
732716
}
733717

718+
service.traceServiceRequestSuccess(this, request);
734719
return request;
735720
}
736721

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package microsoft.exchange.webservices.data.misc;
2+
3+
import microsoft.exchange.webservices.data.core.request.*;
4+
5+
public interface ServiceRequestTraceListener {
6+
void requestStart(ServiceRequestBase<?> serviceRequest, HttpWebRequest request);
7+
8+
void requestError(ServiceRequestBase<?> serviceRequest, HttpWebRequest request, Exception e);
9+
10+
void requestFinish(ServiceRequestBase<?> serviceRequest, HttpWebRequest request);
11+
}

0 commit comments

Comments
 (0)