diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..436b16399 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,39 @@ +version: 2 +jobs: + build: + docker: + # specify the version you desire here + - image: circleci/openjdk:11-jdk + + working_directory: ~/repo + + environment: + # Customize the JVM maximum heap limit + MAVEN_OPTS: -Xmx3200m + + steps: + - checkout + + # Download and cache dependencies + - restore_cache: + keys: + - v1-dependencies-{{ checksum "pom.xml" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + - run: mvn dependency:go-offline + + - save_cache: + paths: + - ~/.m2 + key: v1-dependencies-{{ checksum "pom.xml" }} + + # deploy + - run: > + if [ "${CIRCLE_BRANCH}" = 'master' ] ; then + echo "${MAVEN_CENTRAL_GPG_KEY}" | base64 --decode | gpg --import --no-tty --batch --yes + mvn deploy -s .circleci/settings.xml -Dgpg.passphrase="${MAVEN_CENTRAL_GPG_PASSPHRASE}" + else + mvn package + fi + diff --git a/.circleci/settings.xml b/.circleci/settings.xml new file mode 100644 index 000000000..d6ee1cc5b --- /dev/null +++ b/.circleci/settings.xml @@ -0,0 +1,14 @@ + + + + ossrh-snapshot + surevine + ${env.MAVEN_CENTRAL_PASSWORD} + + + ossrh + surevine + ${env.MAVEN_CENTRAL_PASSWORD} + + + diff --git a/.java-version b/.java-version new file mode 100644 index 000000000..625934097 --- /dev/null +++ b/.java-version @@ -0,0 +1 @@ +1.8 diff --git a/pom.xml b/pom.xml index e303359bc..54bedbac2 100644 --- a/pom.xml +++ b/pom.xml @@ -28,10 +28,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.microsoft.ews-java-api + com.surevine ews-java-api - 2.1-SNAPSHOT + 2.16-SNAPSHOT Exchange Web Services Java API Exchange Web Services (EWS) Java API @@ -49,8 +49,8 @@ - Microsoft - http://www.microsoft.com/ + Surevine + https://www.surevine.com/ @@ -76,32 +76,33 @@ UTF-8 - 1.6 + 1.8 - 2.16 + 3.0.0 1.6 - 2.10.3 - 3.3 - 1.6.5 - 2.4 - 1.14 + 3.0.1 + 3.8.0 + 1.6.8 + 3.0.1 + 1.17 1.1 - 3.4 - 2.8 - 2.2 - 2.5 - 2.18.1 - 0.7.5.201505241946 + 3.7.1 + 3.0.0 + 2.7 + 3.0.0 + 2.22.1 + 0.8.2 - 4.4.1 - 4.4.1 + 4.5.6 + 4.4.10 1.2 - 2.8 - 3.4 - 2.4 + 2.10.1 + 3.8.1 + 2.5 + 2.3.1 4.12 1.3 @@ -171,6 +172,12 @@ + + + --pinentry-mode + loopback + + @@ -249,6 +256,12 @@ ${joda-time.version} + + javax.xml.ws + jaxws-api + ${jaxws-api.version} + + junit junit @@ -323,6 +336,7 @@ maven-javadoc-plugin ${maven-javadoc-plugin.version} + 8 true ${javadoc.doclint.param} @@ -348,7 +362,7 @@ - + org.jacoco @@ -433,7 +447,7 @@ - + diff --git a/readme.md b/readme.md index 6101807c8..0acdadaf7 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ [![Gitter](https://badges.gitter.im/JoinChat.svg)](https://gitter.im/OfficeDev/ews-java-api?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Build Status](https://travis-ci.org/OfficeDev/ews-java-api.svg)](https://travis-ci.org/OfficeDev/ews-java-api) [![codecov.io](https://codecov.io/github/OfficeDev/ews-java-api/coverage.svg?branch=master)](https://codecov.io/github/OfficeDev/ews-java-api?branch=master) +![CircleCI branch](https://img.shields.io/circleci/project/github/surevine/ews-java-api/master.svg) ![Maven Central](https://img.shields.io/maven-central/v/com.surevine/ews-java-api.svg) [![codecov.io](https://codecov.io/github/surevine/ews-java-api/coverage.svg?branch=master)](https://codecov.io/github/surevine/ews-java-api?branch=master) The Exchange Web Services (EWS) Java API provides a managed interface for developing Java applications that use EWS. By using the EWS Java API, you can access almost all the information stored in an Office 365, Exchange Online, or Exchange Server mailbox. However, this API is in sustaining mode, the recommended access pattern for Office 365 and Exchange online data is [Microsoft Graph](https://graph.microsoft.com) diff --git a/src/main/java/microsoft/exchange/webservices/data/autodiscover/AlternateMailbox.java b/src/main/java/microsoft/exchange/webservices/data/autodiscover/AlternateMailbox.java index d85adf965..36911d77a 100644 --- a/src/main/java/microsoft/exchange/webservices/data/autodiscover/AlternateMailbox.java +++ b/src/main/java/microsoft/exchange/webservices/data/autodiscover/AlternateMailbox.java @@ -213,7 +213,7 @@ public String getOwnerSmtpAddress() { /** * Sets the owner SMTP address. * - * @param ownerSmtpAdress the new owner SMTP address + * @param ownerSmtpAddress the new owner SMTP address */ protected void setOwnerSmtpAddress(final String ownerSmtpAddress) { this.ownerSmtpAddress = ownerSmtpAddress; diff --git a/src/main/java/microsoft/exchange/webservices/data/core/EwsSSLProtocolSocketFactory.java b/src/main/java/microsoft/exchange/webservices/data/core/EwsSSLProtocolSocketFactory.java index d4d2fefec..341276f45 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/EwsSSLProtocolSocketFactory.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/EwsSSLProtocolSocketFactory.java @@ -44,7 +44,9 @@ * you are perfectly aware of security implications of accepting * self-signed certificates *

+ *

* Example of using custom protocol socket factory for a specific host: + *

*
  *     Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
  *
@@ -55,10 +57,10 @@
  *     hc.setHost(uri.getHost(), uri.getPort(), easyhttps);
  *     HttpClient client = new HttpClient();
  *     client.executeMethod(hc, httpget);
- *     
- *

+ * *

* Example of using custom protocol socket factory per default instead of the standard one: + *

*
  *     Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
  *     Protocol.registerProtocol("https", easyhttps);
@@ -66,8 +68,7 @@
  *     HttpClient client = new HttpClient();
  *     GetMethod httpget = new GetMethod("https://localhost/");
  *     client.executeMethod(httpget);
- *     
- *

+ * * *

* DISCLAIMER: HttpClient developers DO NOT actively support this component. diff --git a/src/main/java/microsoft/exchange/webservices/data/core/EwsXmlReader.java b/src/main/java/microsoft/exchange/webservices/data/core/EwsXmlReader.java index ba1b1cc9d..5b692d503 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/EwsXmlReader.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/EwsXmlReader.java @@ -561,16 +561,7 @@ public byte[] readBase64ElementValue() throws ServiceXmlDeserializationException, XMLStreamException, IOException { this.ensureCurrentNodeIsStartElement(); - - byte[] buffer = null; - - ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); - - buffer = Base64.decodeBase64(this.xmlReader.getElementText().toString()); - byteArrayStream.write(buffer); - - return byteArrayStream.toByteArray(); - + return Base64.decodeBase64(this.xmlReader.getElementText()); } /** @@ -583,8 +574,7 @@ public void readBase64ElementValue(OutputStream outputStream) throws Exception { this.ensureCurrentNodeIsStartElement(); - byte[] buffer = null; - buffer = Base64.decodeBase64(this.xmlReader.getElementText().toString()); + byte[] buffer = Base64.decodeBase64(this.xmlReader.getElementText()); outputStream.write(buffer); outputStream.flush(); } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java b/src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java index 529637769..d30cc5598 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java @@ -71,81 +71,11 @@ import microsoft.exchange.webservices.data.core.exception.service.remote.AccountIsLockedException; import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRemoteException; import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceResponseException; -import microsoft.exchange.webservices.data.core.request.AddDelegateRequest; -import microsoft.exchange.webservices.data.core.request.ConvertIdRequest; -import microsoft.exchange.webservices.data.core.request.CopyFolderRequest; -import microsoft.exchange.webservices.data.core.request.CopyItemRequest; -import microsoft.exchange.webservices.data.core.request.CreateAttachmentRequest; -import microsoft.exchange.webservices.data.core.request.CreateFolderRequest; -import microsoft.exchange.webservices.data.core.request.CreateItemRequest; -import microsoft.exchange.webservices.data.core.request.CreateResponseObjectRequest; -import microsoft.exchange.webservices.data.core.request.CreateUserConfigurationRequest; -import microsoft.exchange.webservices.data.core.request.DeleteAttachmentRequest; -import microsoft.exchange.webservices.data.core.request.DeleteFolderRequest; -import microsoft.exchange.webservices.data.core.request.DeleteItemRequest; -import microsoft.exchange.webservices.data.core.request.DeleteUserConfigurationRequest; -import microsoft.exchange.webservices.data.core.request.EmptyFolderRequest; -import microsoft.exchange.webservices.data.core.request.ExecuteDiagnosticMethodRequest; -import microsoft.exchange.webservices.data.core.request.ExpandGroupRequest; -import microsoft.exchange.webservices.data.core.request.FindConversationRequest; -import microsoft.exchange.webservices.data.core.request.FindFolderRequest; -import microsoft.exchange.webservices.data.core.request.FindItemRequest; -import microsoft.exchange.webservices.data.core.request.GetAttachmentRequest; -import microsoft.exchange.webservices.data.core.request.GetDelegateRequest; -import microsoft.exchange.webservices.data.core.request.GetEventsRequest; -import microsoft.exchange.webservices.data.core.request.GetFolderRequest; -import microsoft.exchange.webservices.data.core.request.GetFolderRequestForLoad; -import microsoft.exchange.webservices.data.core.request.GetInboxRulesRequest; -import microsoft.exchange.webservices.data.core.request.GetItemRequest; -import microsoft.exchange.webservices.data.core.request.GetItemRequestForLoad; -import microsoft.exchange.webservices.data.core.request.GetPasswordExpirationDateRequest; -import microsoft.exchange.webservices.data.core.request.GetRoomListsRequest; -import microsoft.exchange.webservices.data.core.request.GetRoomsRequest; -import microsoft.exchange.webservices.data.core.request.GetServerTimeZonesRequest; -import microsoft.exchange.webservices.data.core.request.GetUserAvailabilityRequest; -import microsoft.exchange.webservices.data.core.request.GetUserConfigurationRequest; -import microsoft.exchange.webservices.data.core.request.GetUserOofSettingsRequest; -import microsoft.exchange.webservices.data.core.request.HttpWebRequest; -import microsoft.exchange.webservices.data.core.request.MoveFolderRequest; -import microsoft.exchange.webservices.data.core.request.MoveItemRequest; -import microsoft.exchange.webservices.data.core.request.RemoveDelegateRequest; -import microsoft.exchange.webservices.data.core.request.ResolveNamesRequest; -import microsoft.exchange.webservices.data.core.request.SendItemRequest; -import microsoft.exchange.webservices.data.core.request.SetUserOofSettingsRequest; -import microsoft.exchange.webservices.data.core.request.SubscribeToPullNotificationsRequest; -import microsoft.exchange.webservices.data.core.request.SubscribeToPushNotificationsRequest; -import microsoft.exchange.webservices.data.core.request.SubscribeToStreamingNotificationsRequest; -import microsoft.exchange.webservices.data.core.request.SyncFolderHierarchyRequest; -import microsoft.exchange.webservices.data.core.request.SyncFolderItemsRequest; -import microsoft.exchange.webservices.data.core.request.UnsubscribeRequest; -import microsoft.exchange.webservices.data.core.request.UpdateDelegateRequest; -import microsoft.exchange.webservices.data.core.request.UpdateFolderRequest; -import microsoft.exchange.webservices.data.core.request.UpdateInboxRulesRequest; -import microsoft.exchange.webservices.data.core.request.UpdateItemRequest; -import microsoft.exchange.webservices.data.core.request.UpdateUserConfigurationRequest; -import microsoft.exchange.webservices.data.core.response.ConvertIdResponse; -import microsoft.exchange.webservices.data.core.response.CreateAttachmentResponse; -import microsoft.exchange.webservices.data.core.response.CreateResponseObjectResponse; -import microsoft.exchange.webservices.data.core.response.DelegateManagementResponse; -import microsoft.exchange.webservices.data.core.response.DelegateUserResponse; -import microsoft.exchange.webservices.data.core.response.DeleteAttachmentResponse; -import microsoft.exchange.webservices.data.core.response.FindFolderResponse; -import microsoft.exchange.webservices.data.core.response.FindItemResponse; -import microsoft.exchange.webservices.data.core.response.GetAttachmentResponse; -import microsoft.exchange.webservices.data.core.response.GetDelegateResponse; -import microsoft.exchange.webservices.data.core.response.GetFolderResponse; -import microsoft.exchange.webservices.data.core.response.GetItemResponse; -import microsoft.exchange.webservices.data.core.response.GetServerTimeZonesResponse; -import microsoft.exchange.webservices.data.core.response.MoveCopyFolderResponse; -import microsoft.exchange.webservices.data.core.response.MoveCopyItemResponse; -import microsoft.exchange.webservices.data.core.response.ServiceResponse; -import microsoft.exchange.webservices.data.core.response.ServiceResponseCollection; -import microsoft.exchange.webservices.data.core.response.UpdateItemResponse; +import microsoft.exchange.webservices.data.core.request.*; +import microsoft.exchange.webservices.data.core.response.*; import microsoft.exchange.webservices.data.core.service.ServiceObject; import microsoft.exchange.webservices.data.core.service.folder.Folder; -import microsoft.exchange.webservices.data.core.service.item.Appointment; -import microsoft.exchange.webservices.data.core.service.item.Conversation; -import microsoft.exchange.webservices.data.core.service.item.Item; +import microsoft.exchange.webservices.data.core.service.item.*; import microsoft.exchange.webservices.data.messaging.UnifiedMessaging; import microsoft.exchange.webservices.data.misc.AsyncCallback; import microsoft.exchange.webservices.data.misc.AsyncRequestResult; @@ -198,6 +128,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.impl.client.CloseableHttpClient; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -3055,7 +2986,7 @@ public ServiceResponseCollection deleteItemsInConversations( * deleted). conversation was last synced (Items received after * that dateTime will not be copied). * @param contextFolderId The Id of the folder that contains the conversation. - * @param isRead if set to true, conversation item are marked as read; + * @param isRead if set to true, conversation item are marked as read; * otherwise they are marked as unread. * @throws Exception */ @@ -3068,6 +2999,50 @@ public ServiceResponseCollection setReadStateForItemsInConversa ServiceErrorHandling.ReturnErrors); } + private ServiceResponseCollection internalExportItems( + Iterable itemIds, ServiceErrorHandling errorHandling) throws Exception { + ExportItemsRequest request = new ExportItemsRequest(this, errorHandling); + request.getItemIds().addRange(itemIds); + return request.execute(); + } + + public ExportItemsResponse exportItem(ItemId itemId) throws Exception { + EwsUtilities.validateParam(itemId, "itemId"); + ServiceResponseCollection responses = internalExportItems(Arrays.asList(itemId), + ServiceErrorHandling.ThrowOnError); + ExportItemsResponse response = responses.getResponseAtIndex(0); + response.throwIfNecessary(); + return response; + } + + public ServiceResponseCollection exportItems( + Iterable itemIds) throws Exception { + EwsUtilities.validateParamCollection(itemIds.iterator(), "itemIds"); + return this.internalExportItems(itemIds, + ServiceErrorHandling.ReturnErrors); + } + + private ServiceResponseCollection internalUploadItems( + List items, ServiceErrorHandling errorHandling) throws Exception { + UploadItemsRequest request = new UploadItemsRequest(this, errorHandling); + request.setItems(items); + return request.execute(); + } + + public UploadItemsResponse uploadItem(UploadItem item) throws Exception { + EwsUtilities.validateParam(item, "item"); + ServiceResponseCollection responses = internalUploadItems(Arrays.asList(item), + ServiceErrorHandling.ThrowOnError); + UploadItemsResponse response = responses.getResponseAtIndex(0); + response.throwIfNecessary(); + return response; + } + + public ServiceResponseCollection uploadItems( + List items) throws Exception { + return this.internalUploadItems(items, + ServiceErrorHandling.ReturnErrors); + } // Id conversion operations /** @@ -3711,7 +3686,7 @@ protected Document executeDiagnosticMethod(String verb, Node parameter) // region Constructors /** - * Initializes a new instance of the class, + * Initializes a new instance of the {@link ExchangeService} class, * targeting the specified version of EWS and scoped to the to the system's * current time zone. */ @@ -3720,7 +3695,7 @@ public ExchangeService() { } /** - * Initializes a new instance of the class, + * Initializes a new instance of the {@link ExchangeService} class, * targeting the specified version of EWS and scoped to the system's current * time zone. * @@ -3730,6 +3705,24 @@ public ExchangeService(ExchangeVersion requestedServerVersion) { super(requestedServerVersion); } + /** + * Initializes a new instance of the {@link ExchangeService} class, + * targeting the specified version of EWS and scoped to the system's current + * time zone. + * + * Additionally specifies an external HttpClient to use, e.g. one wired up + * with a thread-safe pooling http connection factory. It is perfectly + * acceptable for both arguments to use the same HttpClient. + * + * @param requestedServerVersion the requested server version + * @param httpClient external HttpClient instance to use + * @param httpPoolingClient external HttpClient instance to use for pooling + */ + public ExchangeService(ExchangeVersion requestedServerVersion, CloseableHttpClient httpClient, + CloseableHttpClient httpPoolingClient) { + super(requestedServerVersion, httpClient, httpPoolingClient); + } + // Utilities /** @@ -3922,11 +3915,11 @@ public boolean getExchange2007CompatibilityMode() { /** * Set the flag indicating if the Exchange2007 compatibility mode is enabled. * - * + *

* In order to support E12 servers, the exchange2007CompatibilityMode property, * set to true, can be used to indicate that we should use "Exchange2007" as the server version String * rather than Exchange2007_SP1. - * + *

* * @param value true if the Exchange2007 compatibility mode is enabled. */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/ExchangeServiceBase.java b/src/main/java/microsoft/exchange/webservices/data/core/ExchangeServiceBase.java index 9e383c582..2daf26ec2 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/ExchangeServiceBase.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/ExchangeServiceBase.java @@ -23,55 +23,31 @@ package microsoft.exchange.webservices.data.core; -import java.io.ByteArrayOutputStream; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.GeneralSecurityException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.TimeZone; - -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; - -import microsoft.exchange.webservices.data.EWSConstants; -import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; -import microsoft.exchange.webservices.data.core.enumeration.misc.TraceFlags; -import microsoft.exchange.webservices.data.core.exception.http.EWSHttpException; -import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; -import microsoft.exchange.webservices.data.core.exception.service.remote.AccountIsLockedException; -import microsoft.exchange.webservices.data.core.request.HttpClientWebRequest; -import microsoft.exchange.webservices.data.core.request.HttpWebRequest; -import microsoft.exchange.webservices.data.credential.ExchangeCredentials; -import microsoft.exchange.webservices.data.misc.EwsTraceListener; -import microsoft.exchange.webservices.data.misc.ITraceListener; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.http.client.AuthenticationStrategy; +import microsoft.exchange.webservices.data.*; +import microsoft.exchange.webservices.data.core.enumeration.misc.*; +import microsoft.exchange.webservices.data.core.exception.http.*; +import microsoft.exchange.webservices.data.core.exception.service.local.*; +import microsoft.exchange.webservices.data.core.exception.service.remote.*; +import microsoft.exchange.webservices.data.core.request.*; +import microsoft.exchange.webservices.data.credential.*; +import microsoft.exchange.webservices.data.misc.*; +import org.apache.commons.io.*; +import org.apache.commons.logging.*; import org.apache.http.client.CookieStore; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.HttpClientConnectionManager; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.BasicHttpClientConnectionManager; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.client.*; +import org.apache.http.client.protocol.*; +import org.apache.http.config.*; +import org.apache.http.conn.*; +import org.apache.http.conn.socket.*; +import org.apache.http.impl.client.*; +import org.apache.http.impl.conn.*; + +import javax.xml.stream.*; +import java.io.*; +import java.net.*; +import java.security.*; +import java.text.*; +import java.util.*; /** * Represents an abstract binding to an Exchange Service. @@ -148,12 +124,17 @@ public abstract class ExchangeServiceBase implements Closeable { protected CloseableHttpClient httpClient; + protected boolean externalHttpClient = false; + protected HttpClientContext httpContext; protected CloseableHttpClient httpPoolingClient; + + protected boolean externalHttpPoolingClient = false; private int maximumPoolingConnections = 10; + private boolean useGlobalCookieStore = false; // protected HttpClientWebRequest request = null; @@ -164,6 +145,8 @@ public abstract class ExchangeServiceBase implements Closeable { */ private static String defaultUserAgent = "ExchangeServicesClient/" + EwsUtilities.getBuildVersion(); + private ServiceRequestTraceListener serviceRequestTraceListener; + /** * Initializes a new instance. * @@ -171,9 +154,21 @@ public abstract class ExchangeServiceBase implements Closeable { * every other constructor. */ protected ExchangeServiceBase() { + this((CloseableHttpClient) null, null); + } + + protected ExchangeServiceBase(CloseableHttpClient httpClient, CloseableHttpClient httpPoolingClient) { setUseDefaultCredentials(true); - initializeHttpClient(); - initializeHttpContext(); + if (httpClient != null) { + externalHttpClient = true; + this.httpClient = httpClient; + } else { + initializeHttpClient(); + } + if (httpPoolingClient != null) { + externalHttpPoolingClient = true; + this.httpPoolingClient = httpPoolingClient; + } } protected ExchangeServiceBase(ExchangeVersion requestedServerVersion) { @@ -181,8 +176,16 @@ protected ExchangeServiceBase(ExchangeVersion requestedServerVersion) { this.requestedServerVersion = requestedServerVersion; } + protected ExchangeServiceBase(ExchangeVersion requestedServerVersion, CloseableHttpClient httpClient, + CloseableHttpClient httpPoolingClient) { + this(httpClient, httpPoolingClient); + this.requestedServerVersion = requestedServerVersion; + } + protected ExchangeServiceBase(ExchangeServiceBase service, ExchangeVersion requestedServerVersion) { - this(requestedServerVersion); + this(requestedServerVersion, service.httpClient, service.httpPoolingClient); + this.externalHttpClient = service.externalHttpClient; + this.externalHttpPoolingClient = service.externalHttpPoolingClient; this.useDefaultCredentials = service.getUseDefaultCredentials(); this.credentials = service.getCredentials(); this.traceEnabled = service.isTraceEnabled(); @@ -195,7 +198,7 @@ protected ExchangeServiceBase(ExchangeServiceBase service, ExchangeVersion reque this.httpHeaders = service.getHttpHeaders(); } - private void initializeHttpClient() { + protected void initializeHttpClient() { Registry registry = createConnectionSocketFactoryRegistry(); HttpClientConnectionManager httpConnectionManager = new BasicHttpClientConnectionManager(registry); AuthenticationStrategy authStrategy = new CookieProcessingTargetAuthenticationStrategy(); @@ -206,7 +209,7 @@ private void initializeHttpClient() { .build(); } - private void initializeHttpPoolingClient() { + protected void initializeHttpPoolingClient() { Registry registry = createConnectionSocketFactoryRegistry(); PoolingHttpClientConnectionManager httpConnectionManager = new PoolingHttpClientConnectionManager(registry); httpConnectionManager.setMaxTotal(maximumPoolingConnections); @@ -258,15 +261,21 @@ protected Registry createConnectionSocketFactoryRegistr * cookie store, instead of the httpClient's global store, so cookies get reset on reinitialization */ private void initializeHttpContext() { - CookieStore cookieStore = new BasicCookieStore(); httpContext = HttpClientContext.create(); - httpContext.setCookieStore(cookieStore); + if (!useGlobalCookieStore) { + CookieStore cookieStore = new BasicCookieStore(); + httpContext.setCookieStore(cookieStore); + } } @Override public void close() { - IOUtils.closeQuietly(httpClient); - IOUtils.closeQuietly(httpPoolingClient); + if (!externalHttpClient) { + IOUtils.closeQuietly(httpClient); + } + if (!externalHttpPoolingClient) { + IOUtils.closeQuietly(httpPoolingClient); + } } // Event handlers @@ -312,6 +321,10 @@ protected HttpWebRequest prepareHttpWebRequestForUrl(URI url, boolean acceptGzip throw new ServiceLocalException(strErr); } + if (httpContext == null) { + initializeHttpContext(); + } + HttpClientWebRequest request = new HttpClientWebRequest(httpClient, httpContext); prepareHttpWebRequestForUrl(url, acceptGzipEncoding, allowAutoRedirect, request); @@ -346,6 +359,10 @@ protected HttpWebRequest prepareHttpPoolingWebRequestForUrl(URI url, boolean acc initializeHttpPoolingClient(); } + if (httpContext == null) { + initializeHttpContext(); + } + HttpClientWebRequest request = new HttpClientWebRequest(httpPoolingClient, httpContext); prepareHttpWebRequestForUrl(url, acceptGzipEncoding, allowAutoRedirect, request); @@ -614,6 +631,10 @@ public void setTraceListener(ITraceListener traceListener) { this.traceEnabled = (traceListener != null); } + public void setServiceRequestTracer(ServiceRequestTraceListener serviceRequestTraceListener) { + this.serviceRequestTraceListener = serviceRequestTraceListener; + } + /** * Gets the credential used to authenticate with the Exchange Web Services. * @@ -635,7 +656,7 @@ public void setCredentials(ExchangeCredentials credentials) { this.useDefaultCredentials = false; // Reset the httpContext, to remove any existing authentication cookies from subsequent request - initializeHttpContext(); + httpContext = null; } /** @@ -664,7 +685,7 @@ public void setUseDefaultCredentials(boolean value) { } // Reset the httpContext, to remove any existing authentication cookies from subsequent request - initializeHttpContext(); + httpContext = null; } /** @@ -801,6 +822,14 @@ public void setWebProxy(WebProxy value) { this.webProxy = value; } + public boolean isUseGlobalCookieStore() { + return useGlobalCookieStore; + } + + public void setUseGlobalCookieStore(boolean useGlobalCookieStore) { + this.useGlobalCookieStore = useGlobalCookieStore; + } + /** * Gets a collection of HTTP headers that will be sent with each request to * EWS. @@ -893,4 +922,25 @@ public static byte[] getSessionKey() { public int getMaximumPoolingConnections() { return maximumPoolingConnections; } + + public void traceServiceRequestStart(ServiceRequestBase serviceRequest, HttpWebRequest request) { + if (serviceRequestTraceListener == null) { + return; + } + serviceRequestTraceListener.requestStart(serviceRequest, request); + } + + public void traceServiceRequestError(ServiceRequestBase serviceRequest, HttpWebRequest request, Exception e) { + if (serviceRequestTraceListener == null) { + return; + } + serviceRequestTraceListener.requestError(serviceRequest, request, e); + } + + public void traceServiceRequestSuccess(ServiceRequestBase serviceRequest, HttpWebRequest request) { + if (serviceRequestTraceListener == null) { + return; + } + serviceRequestTraceListener.requestFinish(serviceRequest, request); + } } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/PropertyBag.java b/src/main/java/microsoft/exchange/webservices/data/core/PropertyBag.java index f65aea5bb..5f24c7fa7 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/PropertyBag.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/PropertyBag.java @@ -878,4 +878,8 @@ public void setObjectFromPropertyDefinition(PropertyDefinition propertyDefinitio public void complexPropertyChanged(ComplexProperty complexProperty) { this.propertyChanged(complexProperty); } + + public void setLoading(boolean loading) { + this.loading = loading; + } } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/SimplePropertyBag.java b/src/main/java/microsoft/exchange/webservices/data/core/SimplePropertyBag.java index b6f4d2f2a..1da2269de 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/SimplePropertyBag.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/SimplePropertyBag.java @@ -98,7 +98,7 @@ private void internalRemoveItem(TKey key) { /** - * Gets the added item. The added item. + * Gets the added item. * * @return the added item */ @@ -107,7 +107,7 @@ public Iterable getAddedItems() { } /** - * Gets the removed item. The removed item. + * Gets the removed item. * * @return the removed item */ @@ -116,7 +116,7 @@ public Iterable getRemovedItems() { } /** - * Gets the modified item. The modified item. + * Gets the modified item. * * @return the modified item */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/XmlAttributeNames.java b/src/main/java/microsoft/exchange/webservices/data/core/XmlAttributeNames.java index c1d97c3e0..1f4adbb07 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/XmlAttributeNames.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/XmlAttributeNames.java @@ -156,6 +156,8 @@ public class XmlAttributeNames { */ public static final String ConflictResolution = "ConflictResolution"; + public static final String CreateAction = "CreateAction"; + /** * The Constant SendMeetingInvitationsOrCancellations. */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/XmlElementNames.java b/src/main/java/microsoft/exchange/webservices/data/core/XmlElementNames.java index 8fca4f048..ff6131ee4 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/XmlElementNames.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/XmlElementNames.java @@ -626,6 +626,16 @@ public class XmlElementNames { */ public static final String End = "End"; + /** + * The Constant ProposedStart. + */ + public static final String ProposedStart = "ProposedStart"; + + /** + * The Constant End. + */ + public static final String ProposedEnd = "ProposedEnd"; + /** * The Constant OriginalStart. */ @@ -666,6 +676,11 @@ public class XmlElementNames { */ public static final String IsRecurring = "IsRecurring"; + /** + * The Constant IsRecurring. + */ + public static final String IsOrganizer = "IsOrganizer"; + /** * The Constant MeetingRequestWasSent. */ @@ -877,6 +892,8 @@ public class XmlElementNames { */ public static final String DailyRegeneration = "DailyRegeneration"; + public static final String Data = "Data"; + /** * The Constant WeeklyRegeneration. */ @@ -3981,6 +3998,22 @@ public class XmlElementNames { public static final String DeleteItemResponseMessage = "DeleteItemResponseMessage"; + // ExportItems + public static final String ExportItems = "ExportItems"; + + public static final String ExportItemsResponse = "ExportItemsResponse"; + + public static final String ExportItemsResponseMessage = + "ExportItemsResponseMessage"; + + // ExportItems + public static final String UploadItems = "UploadItems"; + + public static final String UploadItemsResponse = "UploadItemsResponse"; + + public static final String UploadItemsResponseMessage = + "UploadItemsResponseMessage"; + // UpdateItem /** * The Constant UpdateItem. diff --git a/src/main/java/microsoft/exchange/webservices/data/core/enumeration/misc/ExchangeVersion.java b/src/main/java/microsoft/exchange/webservices/data/core/enumeration/misc/ExchangeVersion.java index d58db3dda..e3e50d66a 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/enumeration/misc/ExchangeVersion.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/enumeration/misc/ExchangeVersion.java @@ -50,4 +50,10 @@ public enum ExchangeVersion { * Exchange2010_SP2. */ Exchange2010_SP2, + + // Microsoft Exchange 2013 + /** + * Exchange2013. + */ + Exchange2013, } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/enumeration/property/WellKnownFolderName.java b/src/main/java/microsoft/exchange/webservices/data/core/enumeration/property/WellKnownFolderName.java index dbd7fc862..5e0d0b91a 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/enumeration/property/WellKnownFolderName.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/enumeration/property/WellKnownFolderName.java @@ -42,6 +42,12 @@ public enum WellKnownFolderName { */ Contacts, + // The ExternalContacts folder. + /** + * The External Contacts. + */ + ExternalContacts, + // The Deleted Items folder /** * The Deleted item. diff --git a/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentException.java b/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentException.java index f2b278c31..7d9b329e0 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentException.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentException.java @@ -69,14 +69,14 @@ public ArgumentException(String s, String paramName) { /** * Constructs a new exception with the specified detail message and cause. - *

+ * *

Note that the detail message associated with cause is not automatically * incorporated in this exception's detail message. * * @param message the detail message (which is saved for later retrieval by the {@link * Throwable#getMessage()} method). * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). - * (A null value is permitted, and indicates that the cause is nonexistent or + * (A null value is permitted, and indicates that the cause is nonexistent or * unknown.) * @since 1.5 */ @@ -85,13 +85,13 @@ public ArgumentException(String message, Throwable cause) { } /** - * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : - * cause.toString()) (which typically contains the class and detail message of cause). This + * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : + * cause.toString()) (which typically contains the class and detail message of cause). This * constructor is useful for exceptions that are little more than wrappers for other throwables (for * example, {@link PrivilegedActionException}). * * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). - * (A null value is permitted, and indicates that the cause is nonexistent or + * (A null value is permitted, and indicates that the cause is nonexistent or * unknown.) * @since 1.5 */ @@ -100,13 +100,13 @@ public ArgumentException(Throwable cause) { } /** - * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : - * cause.toString()) (which typically contains the class and detail message of cause). This + * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : + * cause.toString()) (which typically contains the class and detail message of cause). This * constructor is useful for exceptions that are little more than wrappers for other throwables (for * example, {@link PrivilegedActionException}). * * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} - * method). (A null value is permitted, and indicates that the cause is + * method). (A null value is permitted, and indicates that the cause is * nonexistent or unknown.) * @param paramName the Name of the Param that causes the exception */ @@ -121,7 +121,7 @@ public ArgumentException(Throwable cause, String paramName) { * * @param message The error message that explains the reason for the exception. * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} - * method). (A null value is permitted, and indicates that the cause is + * method). (A null value is permitted, and indicates that the cause is * nonexistent or unknown.) * @param paramName the Name of the Param that causes the exception */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentNullException.java b/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentNullException.java index 1bc9c18bd..629477d29 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentNullException.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/exception/misc/ArgumentNullException.java @@ -46,14 +46,14 @@ public ArgumentNullException(String s, String paramName) { /** * Constructs a new exception with the specified detail message and cause. - *

+ * *

Note that the detail message associated with cause is not automatically * incorporated in this exception's detail message. * * @param message the detail message (which is saved for later retrieval by the {@link * Throwable#getMessage()} method). * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). - * (A null value is permitted, and indicates that the cause is nonexistent or + * (A null value is permitted, and indicates that the cause is nonexistent or * unknown.) * @since 1.5 */ @@ -62,13 +62,13 @@ public ArgumentNullException(String message, Throwable cause) { } /** - * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : - * cause.toString()) (which typically contains the class and detail message of cause). This + * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : + * cause.toString()) (which typically contains the class and detail message of cause). This * constructor is useful for exceptions that are little more than wrappers for other throwables (for * example, {@link java.security.PrivilegedActionException}). * * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} method). - * (A null value is permitted, and indicates that the cause is nonexistent or + * (A null value is permitted, and indicates that the cause is nonexistent or * unknown.) * @since 1.5 */ @@ -77,13 +77,13 @@ public ArgumentNullException(Throwable cause) { } /** - * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : - * cause.toString()) (which typically contains the class and detail message of cause). This + * Constructs a new exception with the specified cause and a detail message of (cause==null ? null : + * cause.toString()) (which typically contains the class and detail message of cause). This * constructor is useful for exceptions that are little more than wrappers for other throwables (for * example, {@link java.security.PrivilegedActionException}). * * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} - * method). (A null value is permitted, and indicates that the cause is + * method). (A null value is permitted, and indicates that the cause is * nonexistent or unknown.) * @param paramName the Name of the Param that causes the exception */ @@ -97,7 +97,7 @@ public ArgumentNullException(Throwable cause, String paramName) { * * @param message The error message that explains the reason for the exception. * @param cause the cause (which is saved for later retrieval by the {@link Throwable#getCause()} - * method). (A null value is permitted, and indicates that the cause is + * method). (A null value is permitted, and indicates that the cause is * nonexistent or unknown.) * @param paramName the Name of the Param that causes the exception */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/exception/service/local/InvalidOrUnsupportedTimeZoneDefinitionException.java b/src/main/java/microsoft/exchange/webservices/data/core/exception/service/local/InvalidOrUnsupportedTimeZoneDefinitionException.java index f750b443d..d51122397 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/exception/service/local/InvalidOrUnsupportedTimeZoneDefinitionException.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/exception/service/local/InvalidOrUnsupportedTimeZoneDefinitionException.java @@ -62,7 +62,7 @@ public InvalidOrUnsupportedTimeZoneDefinitionException(String message) { * @param message the detail message (which is saved for later retrieval by the {@link * Throwable#getMessage()} method). * @param innerException the cause (which is saved for later retrieval by the {@link Throwable#getCause()} - * method). (A null value is permitted, and indicates that the cause is nonexistent + * method). (A null value is permitted, and indicates that the cause is nonexistent * or unknown.) */ public InvalidOrUnsupportedTimeZoneDefinitionException(String message, Exception innerException) { diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/AddDelegateRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/AddDelegateRequest.java index fac5d8f3f..fb0f73cec 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/AddDelegateRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/AddDelegateRequest.java @@ -150,8 +150,7 @@ protected ExchangeVersion getMinimumRequiredServerVersion() { } /** - * Gets the meeting request delivery scope. The meeting - * request delivery scope. + * Gets the meeting request delivery scope. * * @return the meeting request delivery scope */ @@ -170,7 +169,7 @@ public void setMeetingRequestsDeliveryScope( } /** - * Gets the delegate users. The delegate users. + * Gets the delegate users. * * @return the delegate users */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/CreateRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/CreateRequest.java index a3601f1f3..bc5447a96 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/CreateRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/CreateRequest.java @@ -145,7 +145,7 @@ protected Iterable getObjects() { /** * Sets the service objects. * - * @param value Iterator + * @param value */ protected void setObjects(Collection value) { this.objects = value; diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/CreateUserConfigurationRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/CreateUserConfigurationRequest.java index 7db2fcfaa..214cd70d0 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/CreateUserConfigurationRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/CreateUserConfigurationRequest.java @@ -132,8 +132,8 @@ protected void writeElementsToXml(EwsServiceXmlWriter writer) } /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link CreateUserConfigurationRequest} + * class. * * @param service The service. * @throws Exception diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/DelegateManagementRequestBase.java b/src/main/java/microsoft/exchange/webservices/data/core/request/DelegateManagementRequestBase.java index 257493fa4..802aade69 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/DelegateManagementRequestBase.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/DelegateManagementRequestBase.java @@ -113,7 +113,7 @@ public TResponse execute() throws Exception { } /** - * Gets the mailbox. The mailbox. + * Gets the mailbox. * * @return the mailbox */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/EmptyFolderRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/EmptyFolderRequest.java index 064107ea2..b64110bf9 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/EmptyFolderRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/EmptyFolderRequest.java @@ -171,7 +171,7 @@ public FolderIdWrapperList getFolderIds() { /** * Gets a value indicating whether empty folder should also delete sub folder. * - * @value true if empty folder should also delete sub folder, otherwise false. + * @return true if empty folder should also delete sub folder, otherwise false. */ protected boolean getDeleteSubFolders() { return deleteSubFolders; @@ -179,8 +179,6 @@ protected boolean getDeleteSubFolders() { /** * Sets a value indicating whether empty folder should also delete sub folder. - * - * @value true if empty folder should also delete sub folder, otherwise false. */ public void setDeleteSubFolders(boolean value) { this.deleteSubFolders = value; diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/ExportItemsRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/ExportItemsRequest.java new file mode 100644 index 000000000..64478e9f8 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/ExportItemsRequest.java @@ -0,0 +1,145 @@ +/* + * The MIT License + * Copyright (c) 2012 Microsoft Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package microsoft.exchange.webservices.data.core.request; + +import microsoft.exchange.webservices.data.core.*; +import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.core.enumeration.service.error.ServiceErrorHandling; +import microsoft.exchange.webservices.data.core.response.ExportItemsResponse; +import microsoft.exchange.webservices.data.misc.ItemIdWrapperList; + +/** + * Represents a DeleteItem request. + */ +public final class ExportItemsRequest extends MultiResponseServiceRequest { + + /** + * The item ids. + */ + private ItemIdWrapperList itemIds = new ItemIdWrapperList(); + + /** + * Initializes a new instance of the class. + * + * @param service the service + * @param errorHandlingMode the error handling mode + * @throws Exception + */ + public ExportItemsRequest(ExchangeService service, ServiceErrorHandling errorHandlingMode) + throws Exception { + super(service, errorHandlingMode); + } + + @Override + protected void validate() throws Exception { + EwsUtilities.validateParamCollection(itemIds.iterator(), "itemIds"); + } + + /** + * Gets the expected response message count. + * + * @return Number of expected response messages + */ + @Override + protected int getExpectedResponseMessageCount() { + return itemIds.getCount(); + } + + /** + * Creates the service response. + * + * @param service the service + * @param responseIndex the response index + * @return Service response. + */ + @Override + protected ExportItemsResponse createServiceResponse(ExchangeService service, + int responseIndex) { + return new ExportItemsResponse(); + } + + /** + * Gets the name of the XML element. + * + * @return XML element name + */ + @Override public String getXmlElementName() { + return XmlElementNames.ExportItems; + } + + /** + * Gets the name of the response XML element. + * + * @return XML element name + */ + @Override + protected String getResponseXmlElementName() { + return XmlElementNames.ExportItemsResponse; + } + + /** + * Gets the name of the response message XML element. + * + * @return XML element name + */ + @Override + protected String getResponseMessageXmlElementName() { + return XmlElementNames.ExportItemsResponseMessage; + } + + /** + * Writes XML elements. + * + * @param writer the writer + * @throws Exception the exception + */ + @Override + protected void writeElementsToXml(EwsServiceXmlWriter writer) + throws Exception { + itemIds.writeToXml(writer, XmlNamespace.Messages, + XmlElementNames.ItemIds); + } + + /** + * Gets the request version. + * + * @return Earliest Exchange version in which this request is supported. + */ + @Override + protected ExchangeVersion getMinimumRequiredServerVersion() { + return ExchangeVersion.Exchange2010_SP1; + } + + /** + * Gets the item ids. + * + * @return the item ids + */ + public ItemIdWrapperList getItemIds() { + return itemIds; + } + + +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/GetDelegateRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/GetDelegateRequest.java index 8d1079147..cd0ce26e4 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/GetDelegateRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/GetDelegateRequest.java @@ -140,7 +140,7 @@ protected ExchangeVersion getMinimumRequiredServerVersion() { } /** - * Gets the user ids. The user ids. + * Gets the user ids. * * @return the user ids */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/GetUserConfigurationRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/GetUserConfigurationRequest.java index cc983b332..a810a693c 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/GetUserConfigurationRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/GetUserConfigurationRequest.java @@ -186,7 +186,7 @@ public GetUserConfigurationRequest(ExchangeService service) } /** - * Gets the name. The name. + * Gets the name. * * @return the name */ @@ -204,7 +204,7 @@ public void setName(String name) { } /** - * Gets the parent folder Id. The parent folder Id. + * Gets the parent folder Id. * * @return the parent folder id */ @@ -222,8 +222,7 @@ public void setParentFolderId(FolderId parentFolderId) { } /** - * Gets the user configuration. The user - * configuration. + * Gets the user configuration. * * @return the user configuration */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/HttpClientWebRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/HttpClientWebRequest.java index 8cd6ccb8f..618ef4126 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/HttpClientWebRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/HttpClientWebRequest.java @@ -128,31 +128,33 @@ public void prepareConnection() { .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.BASIC)) .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.BASIC)); - CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - - // Add proxy credential if necessary. - WebProxy proxy = getProxy(); - if (proxy != null) { - HttpHost proxyHost = new HttpHost(proxy.getHost(), proxy.getPort()); - requestConfigBuilder.setProxy(proxyHost); - - if (proxy.hasCredentials()) { - NTCredentials - proxyCredentials = - new NTCredentials(proxy.getCredentials().getUsername(), proxy.getCredentials().getPassword(), "", - proxy.getCredentials().getDomain()); + if (httpContext.getCredentialsProvider() == null) { + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + // Add proxy credential if necessary. + WebProxy proxy = getProxy(); + if (proxy != null) { + HttpHost proxyHost = new HttpHost(proxy.getHost(), proxy.getPort()); + requestConfigBuilder.setProxy(proxyHost); + + if (proxy.hasCredentials()) { + NTCredentials + proxyCredentials = + new NTCredentials(proxy.getCredentials().getUsername(), proxy.getCredentials().getPassword(), "", + proxy.getCredentials().getDomain()); + + credentialsProvider.setCredentials(new AuthScope(proxyHost), proxyCredentials); + } + } - credentialsProvider.setCredentials(new AuthScope(proxyHost), proxyCredentials); + // Add web service credential if necessary. + if (isAllowAuthentication() && getUsername() != null) { + NTCredentials webServiceCredentials = new NTCredentials(getUsername(), getPassword(), "", getDomain()); + credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY), webServiceCredentials); } - } - // Add web service credential if necessary. - if (isAllowAuthentication() && getUsername() != null) { - NTCredentials webServiceCredentials = new NTCredentials(getUsername(), getPassword(), "", getDomain()); - credentialsProvider.setCredentials(new AuthScope(AuthScope.ANY), webServiceCredentials); + httpContext.setCredentialsProvider(credentialsProvider); } - httpContext.setCredentialsProvider(credentialsProvider); httpPost.setConfig(requestConfigBuilder.build()); } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/ResolveNamesRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/ResolveNamesRequest.java index 7b1fd1060..4b2f035fe 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/ResolveNamesRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/ResolveNamesRequest.java @@ -311,7 +311,7 @@ public FolderIdWrapperList getParentFolderIds() { /** * Gets or sets the PropertySet for Contact Data - *

+ * * The PropertySet */ public void setContactDataPropertySet(PropertySet propertySet) { diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/SendItemRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/SendItemRequest.java index 7a7291efa..848910b15 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/SendItemRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/SendItemRequest.java @@ -184,7 +184,7 @@ public SendItemRequest(ExchangeService service, ServiceErrorHandling errorHandli } /** - * Gets the item. The item. + * Gets the item. * * @return the item */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/ServiceRequestBase.java b/src/main/java/microsoft/exchange/webservices/data/core/request/ServiceRequestBase.java index aafd48cf6..0477904e3 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/ServiceRequestBase.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/ServiceRequestBase.java @@ -23,42 +23,22 @@ package microsoft.exchange.webservices.data.core.request; -import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; -import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter; -import microsoft.exchange.webservices.data.core.EwsUtilities; -import microsoft.exchange.webservices.data.core.ExchangeServerInfo; -import microsoft.exchange.webservices.data.core.ExchangeService; -import microsoft.exchange.webservices.data.core.XmlAttributeNames; -import microsoft.exchange.webservices.data.core.XmlElementNames; -import microsoft.exchange.webservices.data.core.response.ServiceResponse; -import microsoft.exchange.webservices.data.core.enumeration.misc.DateTimePrecision; -import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; -import microsoft.exchange.webservices.data.core.enumeration.misc.TraceFlags; -import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; -import microsoft.exchange.webservices.data.core.exception.http.EWSHttpException; -import microsoft.exchange.webservices.data.core.exception.http.HttpErrorException; -import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; -import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceRequestException; -import microsoft.exchange.webservices.data.core.exception.service.remote.ServiceResponseException; -import microsoft.exchange.webservices.data.core.exception.service.local.ServiceVersionException; -import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlDeserializationException; -import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlSerializationException; -import microsoft.exchange.webservices.data.core.exception.xml.XmlException; -import microsoft.exchange.webservices.data.misc.SoapFaultDetails; -import microsoft.exchange.webservices.data.security.XmlNodeType; -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.xml.stream.XMLStreamException; -import javax.xml.ws.http.HTTPException; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.InflaterInputStream; +import microsoft.exchange.webservices.data.core.*; +import microsoft.exchange.webservices.data.core.enumeration.misc.*; +import microsoft.exchange.webservices.data.core.exception.http.*; +import microsoft.exchange.webservices.data.core.exception.service.local.*; +import microsoft.exchange.webservices.data.core.exception.service.remote.*; +import microsoft.exchange.webservices.data.core.exception.xml.*; +import microsoft.exchange.webservices.data.core.response.*; +import microsoft.exchange.webservices.data.misc.*; +import microsoft.exchange.webservices.data.security.*; +import org.apache.commons.io.*; +import org.apache.commons.logging.*; + +import javax.xml.stream.*; +import javax.xml.ws.http.*; +import java.io.*; +import java.util.zip.*; /** * Represents an abstract service request. @@ -719,18 +699,23 @@ private HttpWebRequest buildEwsHttpWebRequest(HttpWebRequest request) throws Exc */ protected HttpWebRequest getEwsHttpWebResponse(HttpWebRequest request) throws Exception { try { + service.traceServiceRequestStart(this, request); request.executeRequest(); if (request.getResponseCode() >= 400) { - throw new HttpErrorException( - "The remote server returned an error: (" + request.getResponseCode() + ")" + - request.getResponseText(), request.getResponseCode()); + HttpErrorException e = new HttpErrorException( + "The remote server returned an error: (" + request.getResponseCode() + ")" + + request.getResponseText(), request.getResponseCode()); + service.traceServiceRequestError(this, request, e); + throw e; } } catch (IOException e) { // Wrap exception. + service.traceServiceRequestError(this, request, e); throw new ServiceRequestException(String.format("The request failed. %s", e.getMessage()), e); } + service.traceServiceRequestSuccess(this, request); return request; } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderHierarchyRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderHierarchyRequest.java index dbd5e6ebf..a4e5494a1 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderHierarchyRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderHierarchyRequest.java @@ -170,7 +170,7 @@ protected ExchangeVersion getMinimumRequiredServerVersion() { } /** - * Gets or sets the property set. The property set. + * Gets or sets the property set. * * @return the property set */ @@ -188,7 +188,7 @@ public void setPropertySet(PropertySet value) { } /** - * Gets or sets the property set. The property set. + * Gets or sets the property set. * * @return the sync folder id */ @@ -206,8 +206,7 @@ public void setSyncFolderId(FolderId value) { } /** - * Gets or sets the state of the sync. The state of the - * sync. + * Gets or sets the state of the sync. * * @return the sync state */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderItemsRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderItemsRequest.java index 42814b384..88b8c697c 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderItemsRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/SyncFolderItemsRequest.java @@ -211,7 +211,7 @@ protected ExchangeVersion getMinimumRequiredServerVersion() { } /** - * Gets or sets the property set. The property set. + * Gets or sets the property set. * * @return the property set */ @@ -229,7 +229,7 @@ public void setPropertySet(PropertySet propertySet) { } /** - * Gets the sync folder id. The sync folder id. + * Gets the sync folder id. * * @return the sync folder id */ @@ -247,8 +247,7 @@ public void setSyncFolderId(FolderId syncFolderId) { } /** - * Gets the scope of the sync. The scope of the - * sync. + * Gets the scope of the sync. * * @return the sync scope */ @@ -266,8 +265,7 @@ public void setSyncScope(SyncFolderItemsScope syncScope) { } /** - * Gets the state of the sync. The state of the - * sync. + * Gets the state of the sync. * * @return the sync state */ @@ -285,7 +283,7 @@ public void setSyncState(String syncState) { } /** - * Gets the list of ignored item ids. The ignored item ids. + * Gets the list of ignored item ids. * * @return the ignored item ids */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/UpdateInboxRulesRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/UpdateInboxRulesRequest.java index bba576eb2..91c234077 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/request/UpdateInboxRulesRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/UpdateInboxRulesRequest.java @@ -56,7 +56,7 @@ public final class UpdateInboxRulesRequest extends SimpleServiceRequestBase class. + * {@link UpdateInboxRulesRequest} class. * * @param service The service. */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/UploadItemsRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/UploadItemsRequest.java new file mode 100644 index 000000000..9d21ad324 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/UploadItemsRequest.java @@ -0,0 +1,131 @@ +package microsoft.exchange.webservices.data.core.request; + +import microsoft.exchange.webservices.data.core.*; +import microsoft.exchange.webservices.data.core.enumeration.misc.*; +import microsoft.exchange.webservices.data.core.enumeration.service.error.*; +import microsoft.exchange.webservices.data.core.response.*; +import microsoft.exchange.webservices.data.core.service.item.*; + +import java.util.*; + +public class UploadItemsRequest extends MultiResponseServiceRequest { + + private List items; + + /** + * The item ids. + */ + + /** + * Initializes a new instance of the class. + * + * @param service the service + * @param errorHandlingMode the error handling mode + * @throws Exception + */ + public UploadItemsRequest(ExchangeService service, ServiceErrorHandling errorHandlingMode) + throws Exception { + super(service, errorHandlingMode); + } + + /** + * Validate request. + * + * @throws Exception the exception + */ + @Override + protected void validate() throws Exception { + super.validate(); + EwsUtilities.validateParam(items, "items"); + for (UploadItem i : items) { + i.validate(); + } + } + + /** + * Gets the expected response message count. + * + * @return Number of expected response messages + */ + @Override + protected int getExpectedResponseMessageCount() { + return items.size(); + } + + /** + * Creates the service response. + * + * @param service the service + * @param responseIndex the response index + * @return Service response. + */ + @Override + protected UploadItemsResponse createServiceResponse(ExchangeService service, + int responseIndex) { + return new UploadItemsResponse(); + } + + /** + * Gets the name of the XML element. + * + * @return XML element name + */ + @Override + public String getXmlElementName() { + return XmlElementNames.UploadItems; + } + + /** + * Gets the name of the response XML element. + * + * @return XML element name + */ + @Override + protected String getResponseXmlElementName() { + return XmlElementNames.UploadItemsResponse; + } + + /** + * Gets the name of the response message XML element. + * + * @return XML element name + */ + @Override + protected String getResponseMessageXmlElementName() { + return XmlElementNames.UploadItemsResponseMessage; + } + + /** + * Writes XML elements. + * + * @param writer the writer + * @throws Exception the exception + */ + @Override + protected void writeElementsToXml(EwsServiceXmlWriter writer) + throws Exception { + if (!items.isEmpty()) { + writer.writeStartElement(XmlNamespace.Messages, XmlElementNames.Items); + items.stream().forEach(item -> item.writeToXml(writer)); + writer.writeEndElement(); + } + } + + /** + * Gets the request version. + * + * @return Earliest Exchange version in which this request is supported. + */ + @Override + protected ExchangeVersion getMinimumRequiredServerVersion() { + return ExchangeVersion.Exchange2010_SP1; + } + + public void setItems(List items) { + this.items = items; + } + + public List getItems() { + return items; + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/response/ExecuteDiagnosticMethodResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/response/ExecuteDiagnosticMethodResponse.java index f67322ab0..8d4136fa5 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/response/ExecuteDiagnosticMethodResponse.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/response/ExecuteDiagnosticMethodResponse.java @@ -23,15 +23,7 @@ package microsoft.exchange.webservices.data.core.response; -import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; -import microsoft.exchange.webservices.data.core.EwsUtilities; -import microsoft.exchange.webservices.data.core.ExchangeService; -import microsoft.exchange.webservices.data.core.XmlElementNames; -import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; -import microsoft.exchange.webservices.data.security.XmlNodeType; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; +import java.util.Iterator; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -42,7 +34,16 @@ import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; -import java.util.Iterator; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.EwsUtilities; +import microsoft.exchange.webservices.data.core.ExchangeService; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.security.XmlNodeType; /** @@ -116,18 +117,15 @@ public Document retriveDocument(XMLEventReader xmlEventReader) element = document.createElementNS(ele.getName() .getNamespaceURI(), ele.getName().getLocalPart()); - Iterator ite = ele.getAttributes(); - - while (ite.hasNext()) { + for (Iterator ite = ele.getAttributes(); ite.hasNext();) { Attribute attr = ite.next(); element.setAttribute(attr.getName().getLocalPart(), attr.getValue()); } String xmlns = EwsUtilities.WSTrustFebruary2005Namespace;//"http://schemas.xmlsoap.org/wsdl/"; - ite = ele.getNamespaces(); - while (ite.hasNext()) { - Namespace ns = (Namespace) ite.next(); + for (Iterator ite = ele.getNamespaces(); ite.hasNext();) { + Namespace ns = ite.next(); String name = ns.getPrefix(); if (!name.isEmpty()) { element.setAttributeNS(xmlns, name, diff --git a/src/main/java/microsoft/exchange/webservices/data/core/response/ExportItemsResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/response/ExportItemsResponse.java new file mode 100644 index 000000000..c2acf48be --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/response/ExportItemsResponse.java @@ -0,0 +1,59 @@ +/* + * The MIT License + * Copyright (c) 2012 Microsoft Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package microsoft.exchange.webservices.data.core.response; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.property.complex.ItemId; + +public final class ExportItemsResponse extends ServiceResponse { + + private ItemId itemId; + + private byte[] data; + + @Override + protected void readElementsFromXml(EwsServiceXmlReader reader) throws Exception { + super.readElementsFromXml(reader); + + reader.read(); + + itemId = new ItemId(); + itemId.setNamespace(XmlNamespace.Messages); + itemId.loadFromXml(reader, XmlElementNames.ItemId); + itemId.setNamespace(XmlNamespace.Types); + + reader.readStartElement(XmlNamespace.Messages, XmlElementNames.Data); + data = reader.readBase64ElementValue(); + } + + public ItemId getItemId() { + return this.itemId; + } + + public byte[] getData() { + return data; + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/response/UploadItemsResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/response/UploadItemsResponse.java new file mode 100644 index 000000000..e2ccf79ee --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/response/UploadItemsResponse.java @@ -0,0 +1,27 @@ +package microsoft.exchange.webservices.data.core.response; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.property.complex.ItemId; + +public class UploadItemsResponse extends ServiceResponse { + + private ItemId itemId; + + @Override + protected void readElementsFromXml(EwsServiceXmlReader reader) throws Exception { + super.readElementsFromXml(reader); + + reader.read(); + + itemId = new ItemId(); + itemId.setNamespace(XmlNamespace.Messages); + itemId.loadFromXml(reader, XmlElementNames.ItemId); + itemId.setNamespace(XmlNamespace.Types); + } + + public ItemId getItemId() { + return this.itemId; + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/ServiceObject.java b/src/main/java/microsoft/exchange/webservices/data/core/service/ServiceObject.java index 2c4d87ccc..97ec6dd1f 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/ServiceObject.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/ServiceObject.java @@ -232,6 +232,13 @@ protected ServiceObject(ExchangeService service) throws Exception { this.propertyBag = new PropertyBag(this); } + protected ServiceObject(ExchangeService service, ServiceId serviceId) throws Exception { + this(service); + propertyBag.setLoading(true); + propertyBag.setObjectFromPropertyDefinition(getIdPropertyDefinition(), serviceId); + propertyBag.setLoading(false); + } + /** * Gets the schema associated with this type of object. * diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/folder/Folder.java b/src/main/java/microsoft/exchange/webservices/data/core/service/folder/Folder.java index 77849c1f2..2cc33c40c 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/folder/Folder.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/folder/Folder.java @@ -62,6 +62,10 @@ import java.util.ArrayList; import java.util.EnumSet; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Represents a generic folder. @@ -70,6 +74,9 @@ public class Folder extends ServiceObject { private static final Log LOG = LogFactory.getLog(Folder.class); + + private static final Map WELL_KNOWN_FOLDER_MAP = Stream.of(WellKnownFolderName.values()) + .collect(Collectors.toMap(k -> k.toString().toLowerCase(), Function.identity())); /** * Initializes an unsaved local instance of {@link Folder}. @@ -668,6 +675,16 @@ public String getDisplayName() throws ServiceLocalException { FolderSchema.DisplayName); } + /** + * Gets the well known folder name. + * + * @return the WellKnownFolderName + * @throws ServiceLocalException the service local exception + */ + public WellKnownFolderName getWellKnownFolderName() throws ServiceLocalException { + return WELL_KNOWN_FOLDER_MAP.get(getPropertyBag().getObjectFromPropertyDefinition(FolderSchema.WellKnownFolderName)); + } + /** * Sets the display name of the folder. * diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Appointment.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Appointment.java index 74a40149b..cc717e01b 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Appointment.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Appointment.java @@ -774,6 +774,17 @@ public Boolean getIsRecurring() throws ServiceLocalException { AppointmentSchema.IsRecurring); } + /** + * Gets a value indicating whether the appointment is recurring. + * + * @return the checks if is recurring + * @throws ServiceLocalException the service local exception + */ + public Boolean getIsOrganizer() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + AppointmentSchema.IsOrganizer); + } + /** * Gets a value indicating whether the meeting request has already been * sent. @@ -820,6 +831,19 @@ public AppointmentType getAppointmentType() throws ServiceLocalException { AppointmentSchema.AppointmentType); } + /** + * Gets a value indicating what was the last response of the user that + * loaded this meeting. + * + * @param value the my response type + * @throws Exception + */ + public void setMyResponseType(MeetingResponseType value) + throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + AppointmentSchema.MyResponseType, value); + } + /** * Gets a value indicating what was the last response of the user that * loaded this meeting. diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Conversation.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Conversation.java index eb70e10f7..d3f30aa0f 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Conversation.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Conversation.java @@ -416,7 +416,7 @@ public void copyItemsInConversation( * belong to in order for their read state to * be set. If contextFolderId is null, the read states of * item across the entire mailbox are set. - * @param isRead if set to true, conversation item are marked as read; + * @param isRead if set to true, conversation item are marked as read; * otherwise they are marked as unread. * @throws Exception * @throws IndexOutOfBoundsException diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/EmailMessage.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/EmailMessage.java index 00ff93df0..733f7137d 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/EmailMessage.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/EmailMessage.java @@ -68,6 +68,10 @@ public EmailMessage(ExchangeService service) throws Exception { super(service); } + public EmailMessage(ExchangeService service, ItemId itemId) throws Exception { + super(service, itemId); + } + /** * Initializes a new instance of the "EmailMessage" class. * @@ -398,6 +402,7 @@ public void setFrom(EmailAddress value) throws Exception { * @return the checks if is associated * @throws ServiceLocalException the service local exception */ + @Override public boolean getIsAssociated() throws ServiceLocalException { return super.getIsAssociated(); } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Item.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Item.java index bf23473cf..3674da59b 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Item.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Item.java @@ -83,8 +83,8 @@ public class Item extends ServiceObject { private ItemAttachment parentAttachment; /** - * Initializes an unsaved local instance of . To bind to - * an existing item, use Item.Bind() instead. + * Initializes an unsaved local instance of {@link Item}. To bind to + * an existing item, use {@link Item#bind(ExchangeService, ItemId)} instead. * * @param service the service * @throws Exception the exception @@ -93,6 +93,10 @@ public Item(ExchangeService service) throws Exception { super(service); } + public Item(ExchangeService service, ItemId itemId) throws Exception { + super(service, itemId); + } + /** * Initializes a new instance of the item class. * @@ -173,6 +177,7 @@ protected void throwIfThisIsAttachment() throws InvalidOperationException { * * @return A PropertyDefinition instance. */ + @Override public PropertyDefinition getIdPropertyDefinition() { return ItemSchema.Id; } @@ -514,6 +519,7 @@ public boolean removeExtendedProperty( * @return true if a time zone SOAP header should be emitted; * otherwise,false */ + @Override public boolean getIsTimeZoneHeaderRequired(boolean isUpdateOperation) throws Exception { // Starting E14SP2, attachment will be sent along with CreateItem @@ -588,6 +594,7 @@ public boolean getIsNew() throws ServiceLocalException { * @return the id * @throws ServiceLocalException the service local exception */ + @Override public ItemId getId() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( getIdPropertyDefinition()); diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingMessage.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingMessage.java index 801922a3c..0549f4dd0 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingMessage.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingMessage.java @@ -155,6 +155,17 @@ public MeetingResponseType getResponseType() MeetingMessageSchema.ResponseType); } + /** + * Sets the response type. + * + * @param value the response type + * @throws Exception + */ + public void setResponseType(MeetingResponseType value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingMessageSchema.ResponseType, value); + } + /** * Gets the ICalendar Uid. * @@ -166,6 +177,17 @@ public String getICalUid() throws ServiceLocalException { MeetingMessageSchema.ICalUid); } + /** + * Sets the ICalendar Uid. + * + * @param value the i cal uid + * @throws Exception + */ + public void setICalUid(String value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingMessageSchema.ICalUid, value); + } + /** * Gets the ICalendar RecurrenceId. * diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingRequest.java index f8c8b5a82..22c1829f3 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingRequest.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingRequest.java @@ -273,7 +273,7 @@ public LegacyFreeBusyStatus getIntendedFreeBusyStatus() */ public Date getStart() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( - AppointmentSchema.Start); + MeetingRequestSchema.Start); } /** @@ -284,9 +284,32 @@ public Date getStart() throws ServiceLocalException { */ public Date getEnd() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( - AppointmentSchema.End); + MeetingRequestSchema.End); } + /** + * Sets the start. + * + * @param value the new start + * @throws Exception the exception + */ + public void setStart(Date value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingRequestSchema.Start, value); + } + + /** + * Sets the end. + * + * @param value the new end + * @throws Exception the exception + */ + public void setEnd(Date value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingRequestSchema.End, value); + } + + /** * Gets the original start time of the appointment. * @@ -306,7 +329,18 @@ public Date getOriginalStart() throws ServiceLocalException { */ public boolean getIsAllDayEvent() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( - AppointmentSchema.IsAllDayEvent) != null; + MeetingRequestSchema.IsAllDayEvent) != null; + } + + /** + * Sets the checks if is all day event. + * + * @param value the new checks if is all day event + * @throws Exception the exception + */ + public void setIsAllDayEvent(Boolean value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingRequestSchema.IsAllDayEvent, value); } /** @@ -330,7 +364,18 @@ public LegacyFreeBusyStatus legacyFreeBusyStatus() */ public String getLocation() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( - AppointmentSchema.Location); + MeetingRequestSchema.Location); + } + + /** + * Sets the location. + * + * @param value the new location + * @throws Exception the exception + */ + public void setLocation(String value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingRequestSchema.Location, value); } /** @@ -646,7 +691,7 @@ public DeletedOccurrenceInfoCollection getDeletedOccurrences() */ public TimeZoneDefinition getStartTimeZone() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( - AppointmentSchema.StartTimeZone); + MeetingRequestSchema.StartTimeZone); } /** @@ -657,7 +702,30 @@ public TimeZoneDefinition getStartTimeZone() throws ServiceLocalException { */ public TimeZoneDefinition getEndTimeZone() throws ServiceLocalException { return getPropertyBag().getObjectFromPropertyDefinition( - AppointmentSchema.EndTimeZone); + MeetingRequestSchema.EndTimeZone); + } + /** + * Sets the start time zone. + * + * @param value the new start time zone + * @throws Exception the exception + */ + public void setStartTimeZone(TimeZoneDefinition value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingRequestSchema.StartTimeZone, value); + + } + + /** + * Sets the start time zone. + * + * @param value the new end time zone + * @throws Exception the exception + */ + public void setEndTimeZone(TimeZoneDefinition value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingRequestSchema.EndTimeZone, value); + } /** diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponse.java index 72823478b..ba986dc9d 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponse.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponse.java @@ -23,15 +23,23 @@ package microsoft.exchange.webservices.data.core.service.item; +import java.util.Date; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import microsoft.exchange.webservices.data.attribute.ServiceObjectDefinition; import microsoft.exchange.webservices.data.core.ExchangeService; import microsoft.exchange.webservices.data.core.PropertySet; import microsoft.exchange.webservices.data.core.XmlElementNames; import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; +import microsoft.exchange.webservices.data.core.enumeration.service.calendar.AppointmentType; +import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; +import microsoft.exchange.webservices.data.core.service.schema.MeetingResponseSchema; +import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema; import microsoft.exchange.webservices.data.property.complex.ItemAttachment; import microsoft.exchange.webservices.data.property.complex.ItemId; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import microsoft.exchange.webservices.data.property.complex.recurrence.pattern.Recurrence; /** * Represents a response to a meeting request. Properties available on meeting @@ -97,6 +105,15 @@ public static MeetingResponse bind(ExchangeService service, ItemId id) { .getFirstClassProperties()); } + /** + * Internal method to return the schema associated with this type of object. + * + * @return The schema associated with this type of object. + */ + @Override public ServiceObjectSchema getSchema() { + return MeetingResponseSchema.Instance; + } + /** * Gets the minimum required server version. * @@ -106,4 +123,108 @@ public static MeetingResponse bind(ExchangeService service, ItemId id) { @Override public ExchangeVersion getMinimumRequiredServerVersion() { return ExchangeVersion.Exchange2007_SP1; } + + // Properties + + /** + * Gets the start time of the appointment. + * + * @return the start + * @throws ServiceLocalException the service local exception + */ + public Date getStart() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.Start); + } + + /** + * Gets or sets the end time of the appointment. + * + * @return the end + * @throws ServiceLocalException the service local exception + */ + public Date getEnd() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.End); + } + + /** + * Gets the location of this appointment. + * + * @return the location + * @throws ServiceLocalException the service local exception + */ + public String getLocation() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.Location); + } + + /** + * Gets the recurrence pattern for this appointment. Available + * recurrence pattern classes include Recurrence.DailyPattern, + * Recurrence.MonthlyPattern and Recurrence.YearlyPattern. + * + * @return the recurrence + * @throws ServiceLocalException the service local exception + */ + public Recurrence getRecurrence() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.Recurrence); + } + + /** + * Gets a value indicating the type of this appointment. + * + * @return the appointment type + * @throws ServiceLocalException the service local exception + */ + public AppointmentType getAppointmentType() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.AppointmentType); + } + + /** + * Gets the proposed start time. + * + * @return the start + * @throws ServiceLocalException the service local exception + */ + public Date getProposedStart() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedStart); + } + + /** + * Sets the proposed start. + * + * @param value the proposed start + * @throws Exception + */ + public void setProposedStart(Date value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedStart, value); + } + + /** + * Gets the proposed end time. + * + * @return the start + * @throws ServiceLocalException the service local exception + */ + public Date getProposedEnd() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedEnd); + } + + /** + * Sets the proposed end. + * + * @param value the proposed start + * @throws Exception + */ + public void setProposedEnd(Date value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedEnd, value); + } + } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Task.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Task.java index 9183ded03..9c0f4ab08 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/item/Task.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/Task.java @@ -582,8 +582,7 @@ public void setTotalWork(Integer value) throws Exception { /** * Gets the default setting for how to treat affected task occurrences on - * Delete. AffectedTaskOccurrence.AllOccurrences: All affected Task - * occurrences will be deleted. + * Delete. * * @return the default affected task occurrences */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/item/UploadItem.java b/src/main/java/microsoft/exchange/webservices/data/core/service/item/UploadItem.java new file mode 100644 index 000000000..763d216f1 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/item/UploadItem.java @@ -0,0 +1,83 @@ +package microsoft.exchange.webservices.data.core.service.item; + +import microsoft.exchange.webservices.data.core.*; +import microsoft.exchange.webservices.data.core.enumeration.misc.*; +import microsoft.exchange.webservices.data.property.complex.*; + +public class UploadItem { + + public enum CreateAction { + CreateNew, + Update + } + + private CreateAction createAction; + + private FolderId parentFolderId; + + private ItemId itemId; + + private byte[] data; + + public void writeToXml(EwsServiceXmlWriter writer) { + try { + writer.writeStartElement(XmlNamespace.Types, XmlElementNames.Item); + writer.writeAttributeValue(XmlAttributeNames.CreateAction, createAction); + parentFolderId.writeToXml(writer, XmlElementNames.ParentFolderId); + if (itemId != null) { + itemId.writeToXml(writer); + } + writer.writeStartElement(XmlNamespace.Types, XmlElementNames.Data); + writer.writeBase64ElementValue(data); + writer.writeEndElement(); + writer.writeEndElement(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void validate() throws Exception { + EwsUtilities.validateParam(createAction, "createAction"); + EwsUtilities.validateParam(parentFolderId, "parentFolderId"); + EwsUtilities.validateParam(data, "data"); + if (createAction == CreateAction.Update) { + EwsUtilities.validateParam(itemId, "itemId required for updates"); + } + } + + public CreateAction getCreateAction() { + return createAction; + } + + public UploadItem setCreateAction(CreateAction createAction) { + this.createAction = createAction; + return this; + } + + public FolderId getParentFolderId() { + return parentFolderId; + } + + public UploadItem setParentFolderId(FolderId parentFolderId) { + this.parentFolderId = parentFolderId; + return this; + } + + public ItemId getItemId() { + return itemId; + } + + public UploadItem setItemId(ItemId itemId) { + this.itemId = itemId; + return this; + } + + public byte[] getData() { + return data; + } + + public UploadItem setData(byte[] data) { + this.data = data; + return this; + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/response/CalendarResponseMessage.java b/src/main/java/microsoft/exchange/webservices/data/core/service/response/CalendarResponseMessage.java index 0645b2a0d..351037174 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/response/CalendarResponseMessage.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/response/CalendarResponseMessage.java @@ -23,15 +23,19 @@ package microsoft.exchange.webservices.data.core.service.response; +import java.util.Date; + import microsoft.exchange.webservices.data.attribute.EditorBrowsable; import microsoft.exchange.webservices.data.core.service.item.EmailMessage; import microsoft.exchange.webservices.data.core.service.item.Item; import microsoft.exchange.webservices.data.core.service.schema.CalendarResponseObjectSchema; import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema; import microsoft.exchange.webservices.data.core.service.schema.ItemSchema; +import microsoft.exchange.webservices.data.core.service.schema.MeetingResponseSchema; import microsoft.exchange.webservices.data.core.service.schema.ServiceObjectSchema; import microsoft.exchange.webservices.data.core.enumeration.attribute.EditorBrowsableState; import microsoft.exchange.webservices.data.core.enumeration.property.Sensitivity; +import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; import microsoft.exchange.webservices.data.property.complex.AttachmentCollection; import microsoft.exchange.webservices.data.property.complex.EmailAddress; import microsoft.exchange.webservices.data.property.complex.EmailAddressCollection; @@ -215,4 +219,50 @@ public void setSender(EmailAddress value) throws Exception { this.getPropertyBag().setObjectFromPropertyDefinition( EmailMessageSchema.Sender, value); } + + /** + * Gets the proposed start time. + * + * @return the start + * @throws ServiceLocalException the service local exception + */ + public Date getProposedStart() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedStart); + } + + /** + * Sets the proposed start time. + * + * @param value the new start time + * @throws Exception the exception + */ + public void setProposedStart(Date value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedStart, value); + } + + /** + * Gets the proposed end time. + * + * @return the start + * @throws ServiceLocalException the service local exception + */ + public Date getProposedEnd() throws ServiceLocalException { + return getPropertyBag().getObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedEnd); + } + + + /** + * Sets the proposed end time. + * + * @param value the new end time + * @throws Exception the exception + */ + public void setProposedEnd(Date value) throws Exception { + this.getPropertyBag().setObjectFromPropertyDefinition( + MeetingResponseSchema.ProposedEnd, value); + } + } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/AppointmentSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/AppointmentSchema.java index 36514a67c..20e9ef617 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/AppointmentSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/AppointmentSchema.java @@ -135,6 +135,11 @@ private static interface FieldUris { */ String MyResponseType = "calendar:MyResponseType"; + /** + * Are we the organiser + */ + String IsOrganizer = "calendar:IsOrganizer"; + /** * The Organizer. */ @@ -347,7 +352,8 @@ private static interface FieldUris { PropertyDefinitionFlags.CanSet, PropertyDefinitionFlags.CanUpdate, PropertyDefinitionFlags.CanFind), - ExchangeVersion.Exchange2007_SP1); + ExchangeVersion.Exchange2007_SP1, + true); // Defines the LegacyFreeBusyStatus property. /** @@ -418,6 +424,16 @@ private static interface FieldUris { .of(PropertyDefinitionFlags.CanFind), ExchangeVersion.Exchange2007_SP1); + // Defines the IsOrganizer property. + /** + * The Constant IsOrganizer. + */ + public static final PropertyDefinition IsOrganizer = + new BoolPropertyDefinition( + XmlElementNames.IsOrganizer, FieldUris.IsOrganizer, EnumSet + .of(PropertyDefinitionFlags.CanFind), + ExchangeVersion.Exchange2007_SP1); + // Defines the MeetingRequestWasSent property. /** * The Constant MeetingRequestWasSent. @@ -752,8 +768,9 @@ public DeletedOccurrenceInfoCollection createComplexProperty() { FieldUris.AllowNewTimeProposal, EnumSet.of( PropertyDefinitionFlags.CanSet, PropertyDefinitionFlags.CanUpdate, - PropertyDefinitionFlags.CanFind), - ExchangeVersion.Exchange2007_SP1); + PropertyDefinitionFlags.CanFind, + PropertyDefinitionFlags.CanDelete), + ExchangeVersion.Exchange2007_SP1, true); // Defines the IsOnlineMeeting property. /** @@ -800,7 +817,8 @@ public DeletedOccurrenceInfoCollection createComplexProperty() { public static final PropertyDefinition ICalUid = new StringPropertyDefinition( XmlElementNames.Uid, FieldUris.Uid, EnumSet - .of(PropertyDefinitionFlags.CanFind), + .of(PropertyDefinitionFlags.CanSet, + PropertyDefinitionFlags.CanFind), ExchangeVersion.Exchange2007_SP1); // Defines the iCalendar RecurrenceId property. @@ -883,6 +901,7 @@ protected void registerProperties() { this.registerProperty(ICalUid); this.registerProperty(ICalRecurrenceId); this.registerProperty(ICalDateTimeStamp); + this.registerProperty(IsOrganizer); } /** diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/CalendarResponseObjectSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/CalendarResponseObjectSchema.java index cf8951bc6..025fc5b9e 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/CalendarResponseObjectSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/CalendarResponseObjectSchema.java @@ -56,5 +56,8 @@ protected void registerProperties() { this.registerProperty(EmailMessageSchema.IsReadReceiptRequested); this.registerProperty(EmailMessageSchema.IsDeliveryReceiptRequested); this.registerProperty(ResponseObjectSchema.ReferenceItemId); + + this.registerProperty(MeetingResponseSchema.ProposedStart); + this.registerProperty(MeetingResponseSchema.ProposedEnd); } } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/ContactSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/ContactSchema.java index da6ba708d..be727592b 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/ContactSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/ContactSchema.java @@ -527,7 +527,7 @@ public PhoneNumberDictionary createComplexProperty() { /** * Defines the BusinessHomePage property. - *

+ * * Defined as anyURI in the EWS schema. String is fine here. */ public static final PropertyDefinition BusinessHomePage = @@ -1193,7 +1193,7 @@ public EmailAddressCollection createComplexProperty() /** * Registers property. - *

+ * * IMPORTANT NOTE: PROPERTIES MUST BE REGISTERED IN SCHEMA ORDER (i.e. the * same order as they are defined in types.xsd) */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/FolderSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/FolderSchema.java index 0388baad6..dfcd4438f 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/FolderSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/FolderSchema.java @@ -100,6 +100,11 @@ private static class FieldUris { * The Constant PermissionSet. */ public final static String PermissionSet = "folder:PermissionSet"; + + /** + * The Constant DistinguishedFolderId. + */ + public final static String DistinguishedFolderId = "folder:DistinguishedFolderId"; } @@ -119,6 +124,10 @@ public FolderId createComplexProperty() { } ); + + public static final PropertyDefinition WellKnownFolderName = new StringPropertyDefinition( + XmlElementNames.DistinguishedFolderId, FieldUris.DistinguishedFolderId, + EnumSet.of(PropertyDefinitionFlags.CanSet, PropertyDefinitionFlags.CanFind), ExchangeVersion.Exchange2013); /** * Defines the FolderClass property. @@ -247,5 +256,6 @@ protected void registerProperties() { this.registerProperty(EffectiveRights); this.registerProperty(Permissions); this.registerProperty(UnreadCount); + this.registerProperty(WellKnownFolderName); } } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingMessageSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingMessageSchema.java index 21b927459..7e6142c23 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingMessageSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingMessageSchema.java @@ -124,7 +124,8 @@ public ItemId createComplexProperty() { new GenericPropertyDefinition( MeetingResponseType.class, XmlElementNames.ResponseType, FieldUris.ResponseType, EnumSet - .of(PropertyDefinitionFlags.CanFind), + .of(PropertyDefinitionFlags.CanFind, + PropertyDefinitionFlags.CanSet), ExchangeVersion.Exchange2007_SP1); /** @@ -161,7 +162,7 @@ public static MeetingMessageSchema getInstance() { /** * Registers property. - *

+ * * IMPORTANT NOTE: PROPERTIES MUST BE REGISTERED IN SCHEMA ORDER (i.e. the * same order as they are defined in types.xsd) */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingRequestSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingRequestSchema.java index bca9b18b6..9052c8486 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingRequestSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingRequestSchema.java @@ -315,7 +315,7 @@ private static interface FieldUris { /** * Registers property. - *

+ * * IMPORTANT NOTE: PROPERTIES MUST BE REGISTERED IN SCHEMA ORDER (i.e. the * same order as they are defined in types.xsd) */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingResponseSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingResponseSchema.java new file mode 100644 index 000000000..c45adcfcf --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/MeetingResponseSchema.java @@ -0,0 +1,142 @@ +/* + * The MIT License + * Copyright (c) 2012 Microsoft Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package microsoft.exchange.webservices.data.core.service.schema; + +import java.util.EnumSet; + +import microsoft.exchange.webservices.data.attribute.Schema; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; +import microsoft.exchange.webservices.data.core.enumeration.property.PropertyDefinitionFlags; +import microsoft.exchange.webservices.data.property.definition.DateTimePropertyDefinition; +import microsoft.exchange.webservices.data.property.definition.PropertyDefinition; + +/** + * Represents the schema for meeting request. + */ +@Schema +public class MeetingResponseSchema extends MeetingMessageSchema { + + /** + * Field URIs for MeetingRequest. + */ + private static interface FieldUris { + + /** + * The Start. + */ + String ProposedStart = "meetingResponse:ProposedStart"; + + /** + * The End. + */ + String ProposedEnd = "meetingResponse:ProposedEnd"; + } + + /** + * Defines the Start property. + */ + public static final PropertyDefinition Start = AppointmentSchema.Start; + + /** + * Defines the End property. + */ + public static final PropertyDefinition End = AppointmentSchema.End; + + /** + * Defines the Location property. + */ + public static final PropertyDefinition Location = + AppointmentSchema.Location; + + /** + * Defines the Recurrence property. + */ + public static final PropertyDefinition Recurrence = + AppointmentSchema.Recurrence; + + /** + * Defines the AppointmentType property. + */ + public static final PropertyDefinition AppointmentType = + AppointmentSchema.AppointmentType; + + // Defines the Start property. + /** + * The Constant Start. + */ + public static final PropertyDefinition ProposedStart = + new DateTimePropertyDefinition( + XmlElementNames.ProposedStart, FieldUris.ProposedStart, EnumSet.of( + PropertyDefinitionFlags.CanSet, + PropertyDefinitionFlags.CanFind), + ExchangeVersion.Exchange2007_SP1, + true); + + // Defines the End property. + /** + * The Constant End. + */ + public static final PropertyDefinition ProposedEnd + = new DateTimePropertyDefinition( + XmlElementNames.ProposedEnd, FieldUris.ProposedEnd, EnumSet.of( + PropertyDefinitionFlags.CanSet, + PropertyDefinitionFlags.CanFind), + ExchangeVersion.Exchange2007_SP1, + true); + + /** + * This must be after the declaration of property definitions. + */ + public static final MeetingResponseSchema Instance = + new MeetingResponseSchema(); + + /** + * Registers property. + * + * IMPORTANT NOTE: PROPERTIES MUST BE REGISTERED IN SCHEMA ORDER (i.e. the + * same order as they are defined in types.xsd) + */ + @Override + protected void registerProperties() { + super.registerProperties(); + + this.registerProperty(Start); + this.registerProperty(End); + this.registerProperty(Location); + this.registerProperty(Recurrence); + this.registerProperty(AppointmentType); + + this.registerProperty(ProposedStart); + this.registerProperty(ProposedEnd); + + } + + /** + * Initializes a new instance of the class. + */ + protected MeetingResponseSchema() { + super(); + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostItemSchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostItemSchema.java index 4a31ac7e4..d157cd62c 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostItemSchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostItemSchema.java @@ -106,7 +106,7 @@ private static interface FieldUris { /** * Registers property. - *

+ * * IMPORTANT NOTE: PROPERTIES MUST BE REGISTERED IN SCHEMA ORDER (i.e. the * same order as they are defined in types.xsd) */ diff --git a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostReplySchema.java b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostReplySchema.java index 97c82498e..8e2bb6130 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostReplySchema.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/service/schema/PostReplySchema.java @@ -36,7 +36,7 @@ public final class PostReplySchema extends ServiceObjectSchema { /** * Registers property. - *

+ * * IMPORTANT NOTE: PROPERTIES MUST BE REGISTERED IN SCHEMA ORDER (i.e. the * same order as they are defined in types.xsd) */ diff --git a/src/main/java/microsoft/exchange/webservices/data/credential/ExchangeCredentials.java b/src/main/java/microsoft/exchange/webservices/data/credential/ExchangeCredentials.java index 8c052645c..60af44fef 100644 --- a/src/main/java/microsoft/exchange/webservices/data/credential/ExchangeCredentials.java +++ b/src/main/java/microsoft/exchange/webservices/data/credential/ExchangeCredentials.java @@ -39,9 +39,7 @@ public abstract class ExchangeCredentials { /** - * Performs an implicit conversion from to . This + * Performs an implicit conversion to {@link ExchangeCredentials}. This * allows a NetworkCredential object to be implictly converted to an * ExchangeCredential which is useful when setting credential on an * ExchangeService. diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/AbstractItemIdWrapper.java b/src/main/java/microsoft/exchange/webservices/data/misc/AbstractItemIdWrapper.java index 2acd24a41..52bfbbb3d 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/AbstractItemIdWrapper.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/AbstractItemIdWrapper.java @@ -29,7 +29,7 @@ /** * Represents the abstraction of an item Id. */ -abstract class AbstractItemIdWrapper { +public abstract class AbstractItemIdWrapper { /** * Initializes a new instance of the class. diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/CalendarActionResults.java b/src/main/java/microsoft/exchange/webservices/data/misc/CalendarActionResults.java index c1afe48a0..3b02f86a0 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/CalendarActionResults.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/CalendarActionResults.java @@ -74,7 +74,7 @@ public CalendarActionResults(Iterable items) { /** * Gets the meeting that was accepted, tentatively accepted or declined. - *

+ *

* When a meeting is accepted or tentatively accepted via an Appointment * object, EWS recreates the meeting, and Appointment represents that new * version. When a meeting is accepted or tentatively accepted via a @@ -87,6 +87,7 @@ public CalendarActionResults(Iterable items) { * Appointment represents that meeting. When a meeting is declined via * either an Appointment or a MeetingRequest object from the Deleted Items * folder, Appointment is null. + *

* * @return appointment */ diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapper.java b/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapper.java index 03e71f3c7..16304b9aa 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapper.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapper.java @@ -70,4 +70,16 @@ protected void validate(ExchangeVersion version) throws ServiceVersionException { this.folderId.validate(version); } + + public FolderId getFolderId() { + return folderId; + } + + @Override + public String toString() { + if (folderId.getFolderName() != null ){ + return folderId.getFolderName().toString(); + } + return folderId.getUniqueId(); + } } diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapperList.java b/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapperList.java index 5496fa522..d6f607be3 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapperList.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/FolderIdWrapperList.java @@ -123,8 +123,7 @@ public int getCount() { } /** - * Gets the at + * Gets the {@link AbstractFolderIdWrapper} at * the specified index. * * @param i the i @@ -157,4 +156,8 @@ public Iterator iterator() { return ids.iterator(); } + @Override + public String toString() { + return ids.toString(); + } } diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapper.java b/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapper.java index 1d704202d..78059aa78 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapper.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapper.java @@ -30,7 +30,7 @@ /** * Represents an item Id provided by a ItemId object. */ -class ItemIdWrapper extends AbstractItemIdWrapper { +public class ItemIdWrapper extends AbstractItemIdWrapper { /** * The ItemId object providing the Id. @@ -58,4 +58,12 @@ protected void writeToXml(EwsServiceXmlWriter writer) throws Exception { this.itemId.writeToXml(writer); } + public ItemId getItemId() { + return itemId; + } + + @Override + public String toString() { + return itemId.toString(); + } } diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapperList.java b/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapperList.java index 7a5f9ef02..6c03734bb 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapperList.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/ItemIdWrapperList.java @@ -24,9 +24,9 @@ package microsoft.exchange.webservices.data.misc; import microsoft.exchange.webservices.data.core.EwsServiceXmlWriter; -import microsoft.exchange.webservices.data.core.service.item.Item; import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException; +import microsoft.exchange.webservices.data.core.service.item.Item; import microsoft.exchange.webservices.data.property.complex.ItemId; import java.util.ArrayList; @@ -42,7 +42,7 @@ public class ItemIdWrapperList implements Iterable { * The item ids. */ private List itemIds = - new ArrayList(); + new ArrayList(); /** * Initializes a new instance of the class. @@ -68,7 +68,7 @@ protected void add(Item item) throws ServiceLocalException { * @throws ServiceLocalException the service local exception */ public void addRangeItem(Iterable items) - throws ServiceLocalException { + throws ServiceLocalException { for (Item item : items) { this.add(item); } @@ -144,4 +144,9 @@ public Iterator iterator() { return itemIds.iterator(); } + + @Override + public String toString() { + return itemIds.toString(); + } } diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/ItemWrapper.java b/src/main/java/microsoft/exchange/webservices/data/misc/ItemWrapper.java index 5b13cbe3a..c61964e03 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/ItemWrapper.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/ItemWrapper.java @@ -31,7 +31,7 @@ /** * Represents an item Id provided by a ItemBase object. */ -class ItemWrapper extends AbstractItemIdWrapper { +public class ItemWrapper extends AbstractItemIdWrapper { /** * The ItemBase object providing the Id. diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/MapiTypeConverterMapEntry.java b/src/main/java/microsoft/exchange/webservices/data/misc/MapiTypeConverterMapEntry.java index 6ca1f0228..ab6c32c82 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/MapiTypeConverterMapEntry.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/MapiTypeConverterMapEntry.java @@ -104,7 +104,7 @@ public Map, Object> createInstance() { * * @param type The type. y default, converting a type to string is done by * calling value.ToString. Instances can override this behavior. - *

+ * * By default, converting a string to the appropriate value type * is done by calling Convert.ChangeType Instances may override * this behavior. @@ -120,7 +120,7 @@ public MapiTypeConverterMapEntry(Class type) { /** * Change value to a value of compatible type. - *

+ * * The type of a simple value should match exactly or be convertible to the * appropriate type. An array value has to be a single dimension (rank), * contain at least one value and contain elements that exactly match the @@ -166,7 +166,7 @@ public Object changeType(Object value) throws Exception { /** * Converts a string to value consistent with type. - *

+ * * For array types, this method is called for each array element. * * @param stringValue String to convert to a value. diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/MobilePhone.java b/src/main/java/microsoft/exchange/webservices/data/misc/MobilePhone.java index 6ec0b2d6d..cb425b02a 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/MobilePhone.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/MobilePhone.java @@ -42,7 +42,7 @@ public final class MobilePhone implements ISelfValidate { private String phoneNumber; /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link MobilePhone} class. */ public MobilePhone() { } diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/NameResolutionCollection.java b/src/main/java/microsoft/exchange/webservices/data/misc/NameResolutionCollection.java index bc62daf3d..d9db598f6 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/NameResolutionCollection.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/NameResolutionCollection.java @@ -91,7 +91,7 @@ public void loadFromXml(EwsServiceXmlReader reader) throws Exception { } /** - * Gets the session. The session. + * Gets the session. * * @return the session */ diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/ServiceRequestTraceListener.java b/src/main/java/microsoft/exchange/webservices/data/misc/ServiceRequestTraceListener.java new file mode 100644 index 000000000..829fdbe9d --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/misc/ServiceRequestTraceListener.java @@ -0,0 +1,11 @@ +package microsoft.exchange.webservices.data.misc; + +import microsoft.exchange.webservices.data.core.request.*; + +public interface ServiceRequestTraceListener { + void requestStart(ServiceRequestBase serviceRequest, HttpWebRequest request); + + void requestError(ServiceRequestBase serviceRequest, HttpWebRequest request, Exception e); + + void requestFinish(ServiceRequestBase serviceRequest, HttpWebRequest request); +} diff --git a/src/main/java/microsoft/exchange/webservices/data/misc/UserConfiguration.java b/src/main/java/microsoft/exchange/webservices/data/misc/UserConfiguration.java index 24cc11512..b8c488ae0 100644 --- a/src/main/java/microsoft/exchange/webservices/data/misc/UserConfiguration.java +++ b/src/main/java/microsoft/exchange/webservices/data/misc/UserConfiguration.java @@ -132,7 +132,7 @@ public class UserConfiguration { private boolean isNew = false; /** - * Initializes a new instance of class. + * Initializes a new instance of {@link UserConfiguration} class. * * @param service The service to which the user configuration is bound. * @throws Exception the exception @@ -194,7 +194,7 @@ public static void writeUserConfigurationNameToXml(EwsServiceXmlWriter writer, X } /** - * Initializes a new instance of class. + * Initializes a new instance of {@link UserConfiguration} class. * * @param service The service to which the user configuration is bound. * @param requestedProperties The property requested for this user configuration. diff --git a/src/main/java/microsoft/exchange/webservices/data/notification/FolderEvent.java b/src/main/java/microsoft/exchange/webservices/data/notification/FolderEvent.java index 93ff8fe32..6eed6ae79 100644 --- a/src/main/java/microsoft/exchange/webservices/data/notification/FolderEvent.java +++ b/src/main/java/microsoft/exchange/webservices/data/notification/FolderEvent.java @@ -62,6 +62,19 @@ public class FolderEvent extends NotificationEvent { protected FolderEvent(EventType eventType, Date timestamp) { super(eventType, timestamp); } + + /** + * Initializes a new instance. + * + * @param eventType the event type + * @param folderId of the folder that this event refers to + * @param parentFolderId of the folder this event refers to + */ + public FolderEvent(EventType eventType, FolderId folderId, FolderId parentFolderId) { + super(eventType, null); + this.folderId = folderId; + setParentFolderId(parentFolderId); + } /** * Load from XML. @@ -91,8 +104,8 @@ protected void internalLoadFromXml(EwsServiceXmlReader reader) reader.read(); - setParentFolderId(new FolderId()); - getParentFolderId().loadFromXml(reader, reader.getLocalName()); + setOldParentFolderId(new FolderId()); + getOldParentFolderId().loadFromXml(reader, reader.getLocalName()); break; case Modified: diff --git a/src/main/java/microsoft/exchange/webservices/data/notification/GetEventsResults.java b/src/main/java/microsoft/exchange/webservices/data/notification/GetEventsResults.java index 7a1c8910c..aa706343f 100644 --- a/src/main/java/microsoft/exchange/webservices/data/notification/GetEventsResults.java +++ b/src/main/java/microsoft/exchange/webservices/data/notification/GetEventsResults.java @@ -187,7 +187,7 @@ private void loadNotificationEventFromXml(EwsServiceXmlReader reader, * * @return the subscription id */ - protected String getSubscriptionId() { + public String getSubscriptionId() { return subscriptionId; } @@ -196,7 +196,7 @@ protected String getSubscriptionId() { * * @return the previous watermark */ - protected String getPreviousWatermark() { + public String getPreviousWatermark() { return previousWatermark; } @@ -205,7 +205,7 @@ protected String getPreviousWatermark() { * * @return the new watermark */ - protected String getNewWatermark() { + public String getNewWatermark() { return newWatermark; } @@ -215,7 +215,7 @@ protected String getNewWatermark() { * * @return true, if is more events available */ - protected boolean isMoreEventsAvailable() { + public boolean isMoreEventsAvailable() { return moreEventsAvailable; } diff --git a/src/main/java/microsoft/exchange/webservices/data/notification/GetStreamingEventsResults.java b/src/main/java/microsoft/exchange/webservices/data/notification/GetStreamingEventsResults.java index 8cf433fb3..bafb82462 100644 --- a/src/main/java/microsoft/exchange/webservices/data/notification/GetStreamingEventsResults.java +++ b/src/main/java/microsoft/exchange/webservices/data/notification/GetStreamingEventsResults.java @@ -60,8 +60,8 @@ protected static class NotificationGroup { new ArrayList(); /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link GetStreamingEventsResults} + * class. */ public GetStreamingEventsResults() { } @@ -155,7 +155,7 @@ private void loadNotificationEventFromXml( /** * Gets the notification collection. * - * @value The notification collection. + * @return The notification collection. */ protected Collection getNotifications() { return this.events; diff --git a/src/main/java/microsoft/exchange/webservices/data/notification/ItemEvent.java b/src/main/java/microsoft/exchange/webservices/data/notification/ItemEvent.java index 02ff5b122..77c8e5a34 100644 --- a/src/main/java/microsoft/exchange/webservices/data/notification/ItemEvent.java +++ b/src/main/java/microsoft/exchange/webservices/data/notification/ItemEvent.java @@ -58,6 +58,19 @@ protected ItemEvent(EventType eventType, Date timestamp) { super(eventType, timestamp); } + /** + * Initializes a new instance. + * + * @param eventType the event type + * @param itemId of the item that this event refers to + * @param parentFolderId of the item this event refers to + */ + public ItemEvent(EventType eventType, ItemId itemId, FolderId parentFolderId) { + super(eventType, null); + this.itemId = itemId; + setParentFolderId(parentFolderId); + } + /** * Load from XML. * diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/Attachment.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/Attachment.java index 493b60b2b..1f234cb34 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/Attachment.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/Attachment.java @@ -112,7 +112,7 @@ protected void throwIfThisIsNotNew() { /** * Sets value of field. - *

+ * * We override the base implementation. Attachments cannot be modified so * any attempts the change a property on an existing attachment is an error. * diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/AttachmentCollection.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/AttachmentCollection.java index b39477312..7f3349284 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/AttachmentCollection.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/AttachmentCollection.java @@ -153,6 +153,19 @@ public FileAttachment addFileAttachment(String name, byte[] content) { return fileAttachment; } + /** + * Adds a file attachment to the collection. + * + * @param name the name + * @param content accepts byte byte arrays representing the content of the + * attachment. + * @return FileAttachment + */ + public Attachment addAttachment(Attachment attachment) { + this.internalAdd(attachment); + return attachment; + } + /** * Adds an item attachment to the collection. * diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/CreateRuleOperation.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/CreateRuleOperation.java index c47c9823a..f0dd0211f 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/CreateRuleOperation.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/CreateRuleOperation.java @@ -39,8 +39,8 @@ public final class CreateRuleOperation extends RuleOperation { private Rule rule; /** - * Initializes a new instance of the - * class. + * Initializes a new instance of the {@link CreateRuleOperation} + * class. */ public CreateRuleOperation() { super(); @@ -48,7 +48,7 @@ public CreateRuleOperation() { /** * Initializes a new instance of the - * class. + * {@link CreateRuleOperation} class. * * @param rule The inbox rule to create. */ diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/DelegateUser.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/DelegateUser.java index 1f283cde0..3679bab35 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/DelegateUser.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/DelegateUser.java @@ -56,7 +56,7 @@ public final class DelegateUser extends ComplexProperty { private boolean viewPrivateItems; /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link DelegateUser} class. */ public DelegateUser() { super(); @@ -65,7 +65,7 @@ public DelegateUser() { } /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link DelegateUser} class. * * @param primarySmtpAddress the primary smtp address */ @@ -75,7 +75,7 @@ public DelegateUser(String primarySmtpAddress) { } /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link DelegateUser} class. * * @param standardUser the standard user */ diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/DeleteRuleOperation.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/DeleteRuleOperation.java index 800c1427d..9fdce4192 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/DeleteRuleOperation.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/DeleteRuleOperation.java @@ -42,7 +42,7 @@ public final class DeleteRuleOperation extends RuleOperation { /** * Initializes a new instance of the - * class. + * {@link DeleteRuleOperation} class. */ public DeleteRuleOperation() { super(); @@ -50,7 +50,7 @@ public DeleteRuleOperation() { /** * Initializes a new instance of the - * class. + * {@link DeleteRuleOperation} class. * * @param ruleId The Id of the inbox rule to delete. */ diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/DictionaryEntryProperty.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/DictionaryEntryProperty.java index 008e5c334..49b8e6224 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/DictionaryEntryProperty.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/DictionaryEntryProperty.java @@ -35,7 +35,7 @@ /** * Represents an entry of a DictionaryProperty object. - *

+ * * All descendants of DictionaryEntryProperty must implement a parameterless * constructor. That constructor does not have to be public. That constructor * does not have to be public. diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/EmailAddressEntry.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/EmailAddressEntry.java index c91b581dd..ac1b3ba36 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/EmailAddressEntry.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/EmailAddressEntry.java @@ -48,7 +48,7 @@ public final class EmailAddressEntry extends DictionaryEntryProperty class. + * Initializes a new instance of the {@link EmailAddressEntry} class. */ protected EmailAddressEntry() { super(EmailAddressKey.class); @@ -57,7 +57,7 @@ protected EmailAddressEntry() { } /** - * Initializes a new instance of the "EmailAddressEntry" class. + * Initializes a new instance of the {@link EmailAddressEntry} class. * * @param key The key. * @param emailAddress The email address. diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ExtendedProperty.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ExtendedProperty.java index 14ec132a3..c3d181cd8 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/ExtendedProperty.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ExtendedProperty.java @@ -205,10 +205,9 @@ private String getStringValue() { } /** - * Determines whether the specified is equal - * to the current true if the specified is equal to the current + * Determines whether the specified {@link Object} is equal + * to the current {@link Object}. true if the specified + * {@link Object} is equal to the current {@link Object} * * @param obj the obj * @return boolean diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/FileAttachment.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/FileAttachment.java index de3567f36..eee1afcf6 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/FileAttachment.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/FileAttachment.java @@ -76,7 +76,7 @@ public final class FileAttachment extends Attachment { * * @param owner the owner */ - protected FileAttachment(Item owner) { + public FileAttachment(Item owner) { super(owner); } diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/FolderIdCollection.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/FolderIdCollection.java index f9fc4c0e3..fccfa771e 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/FolderIdCollection.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/FolderIdCollection.java @@ -35,7 +35,7 @@ public final class FolderIdCollection extends ComplexPropertyCollection { /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link FolderIdCollection} class. */ protected FolderIdCollection() { super(); diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemAttachment.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemAttachment.java index e8f0040ee..201f93c80 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemAttachment.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemAttachment.java @@ -137,7 +137,7 @@ public boolean tryReadElementFromXml(EwsServiceXmlReader reader) * For ItemAttachment, AttachmentId and Item should be patched. * * @param reader The reader. - *

+ * * True if element was read. */ public boolean tryReadElementFromXmlToPatch(EwsServiceXmlReader reader) throws Exception { diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemId.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemId.java index 15ab7a558..f5f0dd328 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemId.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemId.java @@ -58,6 +58,10 @@ public ItemId(String uniqueId) throws Exception { super(uniqueId); } + public ItemId(String uniqueId, String changeKey) throws Exception { + super(uniqueId, changeKey); + } + /** * Gets the name of the XML element. * diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemIdCollection.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemIdCollection.java index c23e5c04e..d123a68ea 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemIdCollection.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ItemIdCollection.java @@ -28,7 +28,7 @@ */ public final class ItemIdCollection extends ComplexPropertyCollection { /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link ItemIdCollection} class. */ public ItemIdCollection() { super(); diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/OccurrenceInfoCollection.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/OccurrenceInfoCollection.java index 03f417055..e436219ef 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/OccurrenceInfoCollection.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/OccurrenceInfoCollection.java @@ -34,7 +34,7 @@ public final class OccurrenceInfoCollection extends ComplexPropertyCollection { /** - * Initializes a new instance of the + * Initializes a new instance of the {@link OccurrenceInfoCollection} * class. */ public OccurrenceInfoCollection() { diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/PhoneNumberEntry.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/PhoneNumberEntry.java index ae4736684..2c30d2b43 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/PhoneNumberEntry.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/PhoneNumberEntry.java @@ -43,14 +43,14 @@ public final class PhoneNumberEntry extends DictionaryEntryProperty class. + * Initializes a new instance of the {@link PhoneNumberEntry} class. * * @param key The key. * @param phoneNumber The phone number. diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperation.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperation.java index c8ee0167a..030751b08 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperation.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperation.java @@ -30,7 +30,7 @@ public abstract class RuleOperation extends ComplexProperty { protected String xmlElementName; /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link RuleOperation} class. */ protected RuleOperation() { super(); diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperationErrorCollection.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperationErrorCollection.java index e7a04ece1..5b27694e7 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperationErrorCollection.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/RuleOperationErrorCollection.java @@ -32,7 +32,7 @@ public final class RuleOperationErrorCollection extends ComplexPropertyCollectio /** * Initializes a new instance of the - * class. + * {@link RuleOperationErrorCollection} class. */ public RuleOperationErrorCollection() { super(); diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ServiceId.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ServiceId.java index be673debf..d1e7221f2 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/ServiceId.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ServiceId.java @@ -64,6 +64,12 @@ public ServiceId(String uniqueId) throws Exception { this.uniqueId = uniqueId; } + public ServiceId(String uniqueId, String changeKey) throws Exception { + this(uniqueId); + EwsUtilities.validateParam(changeKey, "changeKey"); + this.changeKey = changeKey; + } + /** * Read attribute from XML. * diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/StringList.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/StringList.java index 6268d3fab..e208170ae 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/StringList.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/StringList.java @@ -52,13 +52,13 @@ public class StringList extends ComplexProperty implements Iterable { private String itemXmlElementName = XmlElementNames.String; /** - * Initializes a new instance of the "StringList" class. + * Initializes a new instance of the {@link StringList} class. */ public StringList() { } /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link StringList} class. * * @param strings The strings. */ @@ -199,17 +199,17 @@ public void clearList() { * this object. The result should be a concise but informative * representation that is easy for a person to read. It is recommended that * all subclasses override this method. - *

+ * * The toString method for class Object returns a * string consisting of the name of the class of which the object is an * instance, the at-sign character `@', and the unsigned * hexadecimal representation of the hash code of the object. In other * words, this method returns a string equal to the value of:

- *

+ * *

    * getClass().getName() + '@' + Integer.toHexString(hashCode())
    * 
- *

+ * *

* * @return a string representation of the object. @@ -274,7 +274,7 @@ public Iterator getIterator() { /** * Indicates whether some other object is "equal to" this one. - *

+ * * The equals method implements an equivalence relation on * non-null object references: *

    @@ -291,23 +291,23 @@ public Iterator getIterator() { * x.equals(z) should return true. *
  • It is consistent: for any non-null reference values * x and y, multiple invocations of - * x.equals(y) consistently return true or + * x.equals(y) consistently return true or * consistently return false, provided no information used in * equals comparisons on the objects is modified. *
  • For any non-null reference value x, * x.equals(null) should return false. *
- *

- * The equals method for class Object implements the + * + * The equals method for class Object implements the * most discriminating possible equivalence relation on objects; that is, * for any non-null reference values x and y, this * method returns true if and only if x and * y refer to the same object (x == y has the * value true). - *

- * Note that it is generally necessary to override the hashCode + * + * Note that it is generally necessary to override the hashCode * method whenever this method is overridden, so as to maintain the general - * contract for the hashCode method, which states that equal + * contract for the hashCode method, which states that equal * objects must have equal hash codes. * * @param obj the reference object with which to compare. diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/TimeChange.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/TimeChange.java index b1186cf73..9e3ab173b 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/TimeChange.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/TimeChange.java @@ -75,14 +75,14 @@ public final class TimeChange extends ComplexProperty { private TimeChangeRecurrence recurrence; /** - * Initializes a new instance of the "TimeChange" class. + * Initializes a new instance of the {@link TimeChange} class. */ public TimeChange() { super(); } /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link TimeChange} class. * * @param offset The offset since the beginning of the year when the change * occurs. diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/recurrence/pattern/Recurrence.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/recurrence/pattern/Recurrence.java index 0eec2d065..a7d8f9a0d 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/recurrence/pattern/Recurrence.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/recurrence/pattern/Recurrence.java @@ -638,8 +638,7 @@ public MonthlyRegenerationPattern(Date startDate, int interval) } /** - * Gets the name of the XML element. The name of the XML - * element. + * Gets the name of the XML element. * * @return the xml element name */ @@ -650,8 +649,8 @@ public String getXmlElementName() { /** * Gets a value indicating whether this instance is regeneration - * pattern. true if this instance is regeneration - * pattern; otherwise, false. + * pattern. true if this instance is regeneration + * pattern; otherwise, false. * * @return true, if is regeneration pattern */ @@ -860,8 +859,7 @@ public final static class RelativeYearlyPattern extends Recurrence { private Month month; /** - * Gets the name of the XML element. The name of the XML - * element. + * Gets the name of the XML element. * * @return the xml element name */ @@ -1111,8 +1109,7 @@ private void daysOfTheWeekChanged(ComplexProperty complexProperty) { } /** - * Gets the name of the XML element. The name of the XML - * element. + * Gets the name of the XML element. * * @return the xml element name */ @@ -1262,8 +1259,7 @@ public WeeklyRegenerationPattern(Date startDate, int interval) } /** - * Gets the name of the XML element. The name of the XML - * element. + * Gets the name of the XML element. * * @return the xml element name */ @@ -1274,8 +1270,8 @@ public String getXmlElementName() { /** * Gets a value indicating whether this instance is regeneration - * pattern. true if this instance is regeneration - * pattern; otherwise, false. + * pattern. true if this instance is regeneration + * pattern; otherwise, false. * * @return true, if is regeneration pattern */ @@ -1324,8 +1320,7 @@ public YearlyPattern(Date startDate, Month month, int dayOfMonth) { } /** - * Gets the name of the XML element. The name of the XML - * element. + * Gets the name of the XML element. * * @return the xml element name */ @@ -1468,8 +1463,7 @@ public final static class YearlyRegenerationPattern extends IntervalPattern { /** - * Gets the name of the XML element. The name of the XML - * element. + * Gets the name of the XML element. * * @return the xml element name */ diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/time/TimeZoneTransitionGroup.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/time/TimeZoneTransitionGroup.java index e918486cd..db2593ab1 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/complex/time/TimeZoneTransitionGroup.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/time/TimeZoneTransitionGroup.java @@ -282,8 +282,8 @@ protected void setDaylightDisplayName(String daylightDisplayName) { /** * Gets a value indicating whether the custom time zone should have a - * daylight period. true if the custom time zone should - * have a daylight period; otherwise, false. + * daylight period. true if the custom time zone should + * have a daylight period; otherwise, false. * * @return the checks for daylight period */ @@ -295,8 +295,8 @@ protected boolean getHasDaylightPeriod() { /** * Gets a value indicating whether this group contains a transition to the - * Daylight period. true if this group contains a transition - * to daylight; otherwise, false. + * Daylight period. true if this group contains a transition + * to daylight; otherwise, false. * * @return the supports daylight */ diff --git a/src/main/java/microsoft/exchange/webservices/data/property/definition/StartTimeZonePropertyDefinition.java b/src/main/java/microsoft/exchange/webservices/data/property/definition/StartTimeZonePropertyDefinition.java index ed0d37c85..5ce302402 100644 --- a/src/main/java/microsoft/exchange/webservices/data/property/definition/StartTimeZonePropertyDefinition.java +++ b/src/main/java/microsoft/exchange/webservices/data/property/definition/StartTimeZonePropertyDefinition.java @@ -117,8 +117,8 @@ public void writeToXml(EwsServiceXmlWriter writer) * * @param flag The flag. * @param version Requested version. - * @return true if the specified - * flag is set; otherwise, false. + * @return true if the specified + * flag is set; otherwise, false. */ @Override public boolean hasFlag(PropertyDefinitionFlags flag, ExchangeVersion version) { if (version != null && (version == ExchangeVersion.Exchange2007_SP1)) { diff --git a/src/main/java/microsoft/exchange/webservices/data/search/ConversationIndexedItemView.java b/src/main/java/microsoft/exchange/webservices/data/search/ConversationIndexedItemView.java index 1c14b8e7a..bf6319ff3 100644 --- a/src/main/java/microsoft/exchange/webservices/data/search/ConversationIndexedItemView.java +++ b/src/main/java/microsoft/exchange/webservices/data/search/ConversationIndexedItemView.java @@ -46,7 +46,7 @@ public final class ConversationIndexedItemView extends PagedView { /** * Gets the type of service object this view applies to. * - * @return A ServiceObjectType value. + * @return A {@link ServiceObjectType} value. */ @Override protected ServiceObjectType getServiceObjectType() { @@ -120,7 +120,7 @@ public void writeToXml(EwsServiceXmlWriter writer) throws Exception { } /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link ItemView} class. * * @param pageSize The maximum number of elements the search operation should return. */ @@ -129,7 +129,7 @@ public ConversationIndexedItemView(int pageSize) { } /** - * Initializes a new instance of the ItemView class. + * Initializes a new instance of the {@link ItemView} class. * * @param pageSize The maximum number of elements the search operation should return. * @param offset The offset of the view from the base point. @@ -140,7 +140,7 @@ public ConversationIndexedItemView(int pageSize, int offset) { } /** - * Initializes a new instance of the ItemView class. + * Initializes a new instance of the {@link ItemView} class. * * @param pageSize The maximum number of elements the search operation should return. * @param offset The offset of the view from the base point. diff --git a/src/main/java/microsoft/exchange/webservices/data/search/FindFoldersResults.java b/src/main/java/microsoft/exchange/webservices/data/search/FindFoldersResults.java index 463112713..0227a1cc3 100644 --- a/src/main/java/microsoft/exchange/webservices/data/search/FindFoldersResults.java +++ b/src/main/java/microsoft/exchange/webservices/data/search/FindFoldersResults.java @@ -54,7 +54,7 @@ public final class FindFoldersResults implements Iterable { private ArrayList folders = new ArrayList(); /** - * Initializes a new instance of the class. + * Initializes a new instance of the {@link FindFoldersResults} class. */ public FindFoldersResults() { diff --git a/src/main/java/microsoft/exchange/webservices/data/search/filter/SearchFilter.java b/src/main/java/microsoft/exchange/webservices/data/search/filter/SearchFilter.java index 2bd0d0f26..2ac813340 100644 --- a/src/main/java/microsoft/exchange/webservices/data/search/filter/SearchFilter.java +++ b/src/main/java/microsoft/exchange/webservices/data/search/filter/SearchFilter.java @@ -1363,10 +1363,10 @@ public void writeElementsToXml(EwsServiceXmlWriter writer) /** * Adds a search filter of any type to the collection. * - * @param searchFilter >The search filter to add. Available search filter classes - * include SearchFilter.IsEqualTo, - * SearchFilter.ContainsSubstring and - * SearchFilter.SearchFilterCollection. + * @param searchFilter The search filter to add. Available search filter classes + * include {@link IsEqualTo}, + * {@link ContainsSubstring} and + * {@link SearchFilterCollection} */ public void add(SearchFilter searchFilter) { if (searchFilter == null) { @@ -1381,9 +1381,9 @@ public void add(SearchFilter searchFilter) { * Adds multiple search filter to the collection. * * @param searchFilters The search filter to add. Available search filter classes - * include SearchFilter.IsEqualTo, - * SearchFilter.ContainsSubstring and - * SearchFilter.SearchFilterCollection + * include {@link IsEqualTo}, + * {@link ContainsSubstring} and + * {@link SearchFilterCollection} */ public void addRange(Iterable searchFilters) { if (searchFilters == null) { diff --git a/src/main/java/microsoft/exchange/webservices/data/security/XmlNameTable.java b/src/main/java/microsoft/exchange/webservices/data/security/XmlNameTable.java index f4ee0d988..10223c13c 100644 --- a/src/main/java/microsoft/exchange/webservices/data/security/XmlNameTable.java +++ b/src/main/java/microsoft/exchange/webservices/data/security/XmlNameTable.java @@ -56,10 +56,6 @@ protected XmlNameTable() { * @param length The number of characters in the name. * @return The new atomized String or the existing one if it already exists. * If length is zero, String.Empty is returned - * @throws ArgumentOutOfRangeException 0 > offset -or- offset >= array.Length -or- length > - * array.Length The above conditions do not cause an exception - * to be thrown if length =0. - * @throws ArgumentOutOfRangeException length < 0. */ public abstract String Add(char[] array, int offset, int length); @@ -85,10 +81,6 @@ protected XmlNameTable() { * @param length The number of characters in the name. * @return The atomized String or null if the String has not already been * atomized. If length is zero, String.Empty is returned - * @throws ArgumentOutOfRangeException 0 > offset -or- offset >= array.Length -or- length > - * array.Length The above conditions do not cause an exception - * to be thrown if length =0. - * @throws ArgumentOutOfRangeException length < 0. */ public abstract String Get(char[] array, int offset, int length); diff --git a/src/main/java/microsoft/exchange/webservices/data/security/XmlNodeType.java b/src/main/java/microsoft/exchange/webservices/data/security/XmlNodeType.java index 83b6179ee..bdaded1bc 100644 --- a/src/main/java/microsoft/exchange/webservices/data/security/XmlNodeType.java +++ b/src/main/java/microsoft/exchange/webservices/data/security/XmlNodeType.java @@ -50,17 +50,17 @@ public XmlNodeType(int nodeType) { * this object. The result should be a concise but informative * representation that is easy for a person to read. It is recommended that * all subclasses override this method. - *

+ * * The toString method for class Object returns a * string consisting of the name of the class of which the object is an * instance, the at-sign character `@', and the unsigned * hexadecimal representation of the hash code of the object. In other * words, this method returns a string equal to the value of:

- *

+ * *

    * getClass().getName() + '@' + Integer.toHexString(hashCode())
    * 
- *

+ * *

* * @return a string representation of the object. @@ -135,7 +135,7 @@ public static String getString(int nodeType) { /** * Indicates whether some other object is "equal to" this one. - *

+ * * The equals method implements an equivalence relation on * non-null object references: *

    @@ -152,23 +152,23 @@ public static String getString(int nodeType) { * x.equals(z) should return true. *
  • It is consistent: for any non-null reference values * x and y, multiple invocations of - * x.equals(y) consistently return true or + * x.equals(y) consistently return true or * consistently return false, provided no information used in * equals comparisons on the objects is modified. *
  • For any non-null reference value x, * x.equals(null) should return false. *
- *

- * The equals method for class Object implements the + * + * The equals method for class Object implements the * most discriminating possible equivalence relation on objects; that is, * for any non-null reference values x and y, this * method returns true if and only if x and * y refer to the same object (x == y has the * value true). - *

- * Note that it is generally necessary to override the hashCode + * + * Note that it is generally necessary to override the hashCode * method whenever this method is overridden, so as to maintain the general - * contract for the hashCode method, which states that equal + * contract for the hashCode method, which states that equal * objects must have equal hash codes. * * @param obj the reference object with which to compare. @@ -194,31 +194,31 @@ public boolean equals(Object obj) { * Returns a hash code value for the object. This method is supported for * the benefit of hashtables such as those provided by * java.util.Hashtable. - *

+ * * The general contract of hashCode is: *

    *
  • Whenever it is invoked on the same object more than once during an - * execution of a Java application, the hashCode method must + * execution of a Java application, the hashCode method must * consistently return the same integer, provided no information used in - * equals comparisons on the object is modified. This integer need + * equals comparisons on the object is modified. This integer need * not remain consistent from one execution of an application to another * execution of the same application. - *
  • If two objects are equal according to the equals(Object) + *
  • If two objects are equal according to the equals(Object) * method, then calling the hashCode method on each of the two * objects must produce the same integer result. *
  • It is not required that if two objects are unequal according * to the {@link Object#equals(Object)} method, then - * calling the hashCode method on each of the two objects must + * calling the hashCode method on each of the two objects must * produce distinct integer results. However, the programmer should be aware * that producing distinct integer results for unequal objects may improve * the performance of hashtables. *
- *

+ * * As much as is reasonably practical, the hashCode method defined by class - * Object does return distinct integers for distinct objects. (This + * Object does return distinct integers for distinct objects. (This * is typically implemented by converting the internal address of the object * into an integer, but this implementation technique is not required by the - * JavaTM programming language.) + * Java programming language.) * * @return a hash code value for this object. * @see Object#equals(Object) diff --git a/src/test/java/microsoft/exchange/webservices/data/core/request/ExportUploadItemsTest.java b/src/test/java/microsoft/exchange/webservices/data/core/request/ExportUploadItemsTest.java new file mode 100644 index 000000000..1800f2662 --- /dev/null +++ b/src/test/java/microsoft/exchange/webservices/data/core/request/ExportUploadItemsTest.java @@ -0,0 +1,159 @@ +package microsoft.exchange.webservices.data.core.request; + +import microsoft.exchange.webservices.data.core.*; +import microsoft.exchange.webservices.data.core.enumeration.misc.*; +import microsoft.exchange.webservices.data.core.enumeration.service.error.*; +import microsoft.exchange.webservices.data.core.exception.service.remote.*; +import microsoft.exchange.webservices.data.core.response.*; +import microsoft.exchange.webservices.data.core.service.item.*; +import microsoft.exchange.webservices.data.core.service.item.UploadItem.*; +import microsoft.exchange.webservices.data.property.complex.*; +import org.apache.commons.io.*; +import org.junit.*; +import org.junit.runner.*; +import org.junit.runners.*; +import org.mockito.*; + +import java.io.*; +import java.util.*; + +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.core.Is.is; +import static org.mockito.Mockito.*; + +@RunWith(JUnit4.class) +public class ExportUploadItemsTest { + + private static final String DATA = "DATA"; + + private static byte[] fixture(String folder, String name) { + try (InputStream in = fixtureStream(folder, name)) { + return IOUtils.toByteArray(in); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private static InputStream fixtureStream(String folder, String name) { + return ExportUploadItemsTest.class + .getResourceAsStream(String.format("/%s/%s.xml", folder, name)); + } + + private final ExchangeService exchangeService = Mockito.mock(ExchangeService.class); + + @Before + public void setUp() { + when(exchangeService.getRequestedServerVersion()).thenReturn(ExchangeVersion.Exchange2013); + when(exchangeService.getDateTimePrecision()).thenReturn(DateTimePrecision.Default); + } + + @Test + public void testExportRequest() throws Exception { + ExportItemsRequest request = new ExportItemsRequest(exchangeService, ServiceErrorHandling.ReturnErrors); + request.getItemIds().addRange(Arrays.asList(new ItemId("12345"), new ItemId("23456"))); + + try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { + EwsServiceXmlWriter writer = new EwsServiceXmlWriter(exchangeService, os); + request.writeToXml(writer); + assertThat(os.toByteArray(), is(equalTo(fixture("test-data", "ExportItemsRequest")))); + } + + try (InputStream in = fixtureStream("test-data", "ExportItemsResponse")) { + EwsServiceXmlReader reader = new EwsServiceXmlReader(in, exchangeService); + ServiceResponseCollection responses = request.readResponse(reader); + assertThat(responses.getCount(), is(equalTo(2))); + + ExportItemsResponse response1 = responses.getResponseAtIndex(0); + assertThat(response1.getItemId().getUniqueId(), is(equalTo("AAMkADNiMDU5YzBhLTgzYzgtNGMxZi1iYTZlLTgzOTkxMzBjYmVhZgBGAAAAAABPTDZfYrvVTr8HgEV+HADsBwCLjN8GwkCsQKoM14gF2rmPAAAAAAENAACLjN8GwkCsQKoM14gF2rmPAAAiEWxoAAA="))); + ExportItemsResponse response2 = responses.getResponseAtIndex(1); + assertThat(response2.getItemId().getUniqueId(), is(equalTo("AAMkADNiMDU5YzBhLTgzYzgtNGMxZi1iYTZlLTgzOTkxMzBjYmVhZgBGAAAAAABPTDZfYrvVTr8HgEV+HADsBwCLjN8GwkCsQKoM14gF2rmPAAAAAAENAACLjN8GwkCsQKoM14gF2rmPAAAiEWxoAAB="))); + } + } + + @Test(expected = ServiceResponseException.class) + public void testExportRequestFails() throws Exception { + ExportItemsRequest request = new ExportItemsRequest(exchangeService, ServiceErrorHandling.ThrowOnError); + request.getItemIds().addRange(Arrays.asList(new ItemId("12345"))); + + try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { + EwsServiceXmlWriter writer = new EwsServiceXmlWriter(exchangeService, os); + request.writeToXml(writer); + } + + try (InputStream in = fixtureStream("test-data", "ExportItemsResponseFail")) { + EwsServiceXmlReader reader = new EwsServiceXmlReader(in, exchangeService); + ServiceResponseCollection responses = request.readResponse(reader); + responses.getResponseAtIndex(0).throwIfNecessary(); + } + } + + @Test + public void testUploadRequest() throws Exception { + UploadItemsRequest request = new UploadItemsRequest(exchangeService, ServiceErrorHandling.ReturnErrors); + + UploadItem uploadItem1 = new UploadItem(); + uploadItem1.setCreateAction(CreateAction.CreateNew); + uploadItem1.setParentFolderId(new FolderId("1234")); + uploadItem1.setData(DATA.getBytes("UTF-8")); + + UploadItem uploadItem2 = new UploadItem(); + uploadItem2.setCreateAction(CreateAction.Update); + uploadItem2.setParentFolderId(new FolderId("2345")); + uploadItem2.setItemId(new ItemId("3456")); + uploadItem2.setData(DATA.getBytes("UTF-8")); + + request.setItems(Arrays.asList(uploadItem1, uploadItem2)); + + try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { + EwsServiceXmlWriter writer = new EwsServiceXmlWriter(exchangeService, os); + request.writeToXml(writer); + assertThat(os.toByteArray(), is(equalTo(fixture("test-data", "UploadItemsRequest")))); + } + + try (InputStream in = fixtureStream("test-data", "UploadItemsResponse")) { + EwsServiceXmlReader reader = new EwsServiceXmlReader(in, exchangeService); + ServiceResponseCollection responses = request.readResponse(reader); + assertThat(responses.getCount(), is(equalTo(2))); + + UploadItemsResponse response1 = responses.getResponseAtIndex(0); + assertThat(response1.getItemId().getUniqueId(), is(equalTo("AAMkADhhUFZ/AAA="))); + UploadItemsResponse response2 = responses.getResponseAtIndex(1); + assertThat(response2.getItemId().getUniqueId(), is(equalTo("AAMkADhhOGZ7AAA="))); + } + } + + @Test(expected = Exception.class) + public void testUploadRequestValidateEmpty() throws Exception { + UploadItem item = new UploadItem(); + item.validate(); + } + + @Test + public void testUploadRequestValidateFine() throws Exception { + UploadItem item = new UploadItem(); + item.setData(new byte[]{}); + item.setParentFolderId(new FolderId("1234")); + item.setCreateAction(CreateAction.CreateNew); + item.validate(); + } + + @Test(expected = Exception.class) + public void testUploadRequestValidateUpdateFails() throws Exception { + UploadItem item = new UploadItem(); + item.setData(new byte[]{}); + item.setParentFolderId(new FolderId("1234")); + item.setCreateAction(CreateAction.Update); + item.validate(); + } + + @Test + public void testUploadRequestValidateUpdateFine() throws Exception { + UploadItem item = new UploadItem(); + item.setData(new byte[]{}); + item.setParentFolderId(new FolderId("1234")); + item.setCreateAction(CreateAction.Update); + item.setItemId(new ItemId("1234")); + item.validate(); + } +} diff --git a/src/test/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponseTest.java b/src/test/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponseTest.java new file mode 100644 index 000000000..0130776c7 --- /dev/null +++ b/src/test/java/microsoft/exchange/webservices/data/core/service/item/MeetingResponseTest.java @@ -0,0 +1,84 @@ +package microsoft.exchange.webservices.data.core.service.item; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import java.io.InputStream; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.ExchangeService; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.core.enumeration.service.calendar.AppointmentType; +import microsoft.exchange.webservices.data.security.XmlNodeType; + +@RunWith(JUnit4.class) +public class MeetingResponseTest { + + private static MeetingResponse getInput(String folder, String name) throws Exception { + + try (InputStream inputStream = MeetingResponseTest.class + .getResourceAsStream(String.format("/%s/%s.xml", folder, name))) { + EwsServiceXmlReader reader = new EwsServiceXmlReader(inputStream, null); + + // read xml preamble + reader.read(new XmlNodeType(XmlNodeType.START_DOCUMENT)); + reader.readStartElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); + + // read soap header + reader.readStartElement(XmlNamespace.Soap, XmlElementNames.SOAPHeaderElementName); + do { + reader.read(); + + if (reader.isStartElement(XmlNamespace.Types, XmlElementNames.ServerVersionInfo)) { + reader.readAttributeValue("Version"); + } + + // Ignore anything else inside the SOAP header + } while (!reader.isEndElement(XmlNamespace.Soap, XmlElementNames.SOAPHeaderElementName)); + + // body + reader.readStartElement(XmlNamespace.Soap, XmlElementNames.SOAPBodyElementName); + + reader.readStartElement(XmlNamespace.Messages, XmlElementNames.GetItemResponse); + reader.readStartElement(XmlNamespace.Messages, XmlElementNames.ResponseMessages); + reader.readStartElement(XmlNamespace.Messages, XmlElementNames.GetItemResponseMessage); + reader.readElementValue(XmlNamespace.Messages, XmlElementNames.ResponseCode); + reader.readStartElement(XmlNamespace.Messages, XmlElementNames.Items); + + return readMeetingResponse(reader); + } + } + + private static MeetingResponse readMeetingResponse(EwsServiceXmlReader reader) throws Exception { + reader.readStartElement(XmlNamespace.Types, XmlElementNames.MeetingResponse); + ExchangeService exchangeService = new ExchangeService(); + MeetingResponse meetingResponse = new MeetingResponse(exchangeService); + meetingResponse.loadFromXml(reader, false); + + return meetingResponse; + } + + @Test + public void testLoadXml() throws Exception { + MeetingResponse meetingResponse = getInput("test-data", "GetMeetingResponse"); + assertThat(meetingResponse.getStart(), + is(equalTo(new DateTime(2019, 1, 31, 10, 30, 0, DateTimeZone.UTC).toDate()))); + assertThat(meetingResponse.getEnd(), + is(equalTo(new DateTime(2019, 1, 31, 11, 30, 0, DateTimeZone.UTC).toDate()))); + assertThat(meetingResponse.getProposedStart(), + is(equalTo(new DateTime(2019, 1, 31, 12, 0, 0, DateTimeZone.UTC).toDate()))); + assertThat(meetingResponse.getProposedEnd(), + is(equalTo(new DateTime(2019, 1, 31, 14, 30, 0, DateTimeZone.UTC).toDate()))); + assertThat(meetingResponse.getLocation(), is(equalTo("the location"))); + assertThat(meetingResponse.getAppointmentType(), is(equalTo(AppointmentType.Single))); + } + +} diff --git a/src/test/java/microsoft/exchange/webservices/data/property/complex/OlsonTimeZoneTest.java b/src/test/java/microsoft/exchange/webservices/data/property/complex/OlsonTimeZoneTest.java index 3278e4b7a..8e86cd0bc 100644 --- a/src/test/java/microsoft/exchange/webservices/data/property/complex/OlsonTimeZoneTest.java +++ b/src/test/java/microsoft/exchange/webservices/data/property/complex/OlsonTimeZoneTest.java @@ -23,19 +23,32 @@ package microsoft.exchange.webservices.data.property.complex; -import microsoft.exchange.webservices.data.property.complex.time.OlsonTimeZoneDefinition; -import microsoft.exchange.webservices.data.util.TimeZoneUtils; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TimeZone; + import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import java.util.Map; -import java.util.TimeZone; +import microsoft.exchange.webservices.data.property.complex.time.OlsonTimeZoneDefinition; +import microsoft.exchange.webservices.data.util.TimeZoneUtils; @RunWith(JUnit4.class) public class OlsonTimeZoneTest { + + private final static Set BROKEN_TZ = new HashSet<>(); + + static { + BROKEN_TZ.add("America/Punta_Arenas"); + BROKEN_TZ.add("Europe/Astrakhan"); + BROKEN_TZ.add("Europe/Kirov"); + BROKEN_TZ.add("Europe/Saratov"); + BROKEN_TZ.add("Europe/Ulyanovsk"); + } @Test public void testOlsonTimeZoneConversion() { @@ -46,8 +59,9 @@ public void testOlsonTimeZoneConversion() { final boolean america = timeZoneId.startsWith("America"); final boolean europe = timeZoneId.startsWith("Europe"); final boolean africa = timeZoneId.startsWith("Africa"); + final boolean knownBroken = BROKEN_TZ.contains(timeZoneId); - if (america || europe || africa) { + if ((america || europe || africa) && !knownBroken) { // There are a few timezones that are out of date or don't have direct microsoft mappings // according to the Unicode source we use so we will only test Americas, Europe and Africa. final TimeZone timeZone = TimeZone.getTimeZone(timeZoneId); diff --git a/src/test/resources/test-data/ExportItemsRequest.xml b/src/test/resources/test-data/ExportItemsRequest.xml new file mode 100644 index 000000000..2bdb58ac4 --- /dev/null +++ b/src/test/resources/test-data/ExportItemsRequest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/test/resources/test-data/ExportItemsResponse.xml b/src/test/resources/test-data/ExportItemsResponse.xml new file mode 100644 index 000000000..577ca6524 --- /dev/null +++ b/src/test/resources/test-data/ExportItemsResponse.xml @@ -0,0 +1,33 @@ + + + + + + + + + + NoError + + + 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 + + + + NoError + + + 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 + + + + + + diff --git a/src/test/resources/test-data/ExportItemsResponseFail.xml b/src/test/resources/test-data/ExportItemsResponseFail.xml new file mode 100644 index 000000000..43dfb64a7 --- /dev/null +++ b/src/test/resources/test-data/ExportItemsResponseFail.xml @@ -0,0 +1,23 @@ + + + + + + + + + + No mailbox with such guid. + ErrorNonExistentMailbox + 0 + + f3f6f699-2254-40ce-9994-388d9d98419e + + + + + + diff --git a/src/test/resources/test-data/GetMeetingResponse.xml b/src/test/resources/test-data/GetMeetingResponse.xml new file mode 100644 index 000000000..cceb333a1 --- /dev/null +++ b/src/test/resources/test-data/GetMeetingResponse.xml @@ -0,0 +1,156 @@ + + + + + + + + + + NoError + + + + + IPM.Schedule.Meeting.Resp.Tent + New Time Proposed: something 2 + Normal + <html> + <head> + <meta http-equiv="Content-Type" content="text/html; + charset=utf-8"> + <style type="text/css" style="display:none;"><!-- P + {margin-top:0;margin-bottom:0;} --></style> + </head> + <body dir="ltr"> + <div id="divtagdefaultwrapper" + style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" + dir="ltr"> + <p><br> + </p> + </div> + </body> + </html> + 2019-01-31T10:40:04Z + 5220 + Normal + false + false + false + false + false + 2019-01-31T10:40:04Z + 2019-01-31T10:40:04Z + + + + + + 2019-01-31T10:30:00Z + 2019-01-31T10:15:00Z + + test user 1 + false + en-GB + + false + false + false + true + true + true + true + + test user 2 + 2019-01-31T10:40:04Z + false + ?ItemID=AAMkAGI1NDk4ZGY3LWNkYjQtNGU1ZC05YjNlLWI5N2I5NzJlZDJiYQBGAAAAAADO3K8HRAPzQ7ckCuRCxxaLBwAPKhbVptluTr8d74Dnvry0AAAAAAEJAAAPKhbVptluTr8d74Dnvry0AAAQRE2OAAA%3D&exvsurl=1&viewmodel=ReadMessageItem + + + NotFlagged + + AQAAAAAAAQkBAAAAEERNjgAAAAA= + + + + test user 2 + testuser2@example.com + SMTP + Mailbox + + + + + test user 1 + testuser1@example.com + SMTP + Mailbox + + + false + AdS5T4l4kx2OQCX7TkObqqKOSqeVIgAAcoKp + something 2 + + + test user 2 + testuser2@example.com + SMTP + Mailbox + + + <26311bb61ca44b14a9a0cc6da3c20594@example.com> + true + + + test user 2 + testuser2@example.com + SMTP + Mailbox + + + + + test user 2 + testuser2@example.com + SMTP + Mailbox + + + + false + false + Tentative + 040000008200E00074C5B7101A82E00800000000275B68894FB9D4010000000000000000100000003C04B5365B02D34ABCD1016A0AABA716 + 2019-01-31T10:40:04Z + false + 2019-01-31T10:30:00Z + 2019-01-31T11:30:00Z + the location + Single + 2019-01-31T12:00:00Z + 2019-01-31T14:30:00Z + + + + + + + diff --git a/src/test/resources/test-data/UploadItemsRequest.xml b/src/test/resources/test-data/UploadItemsRequest.xml new file mode 100644 index 000000000..f6be74705 --- /dev/null +++ b/src/test/resources/test-data/UploadItemsRequest.xml @@ -0,0 +1 @@ +REFUQQ==REFUQQ== \ No newline at end of file diff --git a/src/test/resources/test-data/UploadItemsResponse.xml b/src/test/resources/test-data/UploadItemsResponse.xml new file mode 100644 index 000000000..a0f480817 --- /dev/null +++ b/src/test/resources/test-data/UploadItemsResponse.xml @@ -0,0 +1,30 @@ + + + + + + + + + + NoError + + + + NoError + + + + + + \ No newline at end of file