From 2310a9bc7cdaa77b4f082c613d9393991264fc0c Mon Sep 17 00:00:00 2001 From: Yiyang Li Date: Thu, 11 Aug 2016 11:19:17 -0700 Subject: [PATCH] Implement getAppManifests, getAppMarketplaceUrl and installApp operations - Add some strings to XmlElementNames, add some enum to ExchangeVersion - Implementation the corresponding *Request and *Response - Add ComplexProperty ClientApp and ClientAppMetadata --- .../data/core/ExchangeService.java | 69 +++++++-- .../data/core/XmlElementNames.java | 100 ++++++++++++ .../enumeration/misc/ExchangeVersion.java | 31 ++++ .../core/request/GetAppManifestsRequest.java | 144 +++++++++++++++++ .../request/GetAppMarketplaceUrlRequest.java | 143 +++++++++++++++++ .../data/core/request/InstallAppRequest.java | 124 +++++++++++++++ .../response/GetAppManifestsResponse.java | 145 ++++++++++++++++++ .../GetAppMarketplaceUrlResponse.java | 27 ++++ .../core/response/InstallAppResponse.java | 40 +++++ .../data/property/complex/ClientApp.java | 70 +++++++++ .../property/complex/ClientAppMetadata.java | 61 ++++++++ 11 files changed, 938 insertions(+), 16 deletions(-) create mode 100644 src/main/java/microsoft/exchange/webservices/data/core/request/GetAppManifestsRequest.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/core/request/GetAppMarketplaceUrlRequest.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/core/request/InstallAppRequest.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/core/response/GetAppManifestsResponse.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/core/response/GetAppMarketplaceUrlResponse.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/core/response/InstallAppResponse.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/property/complex/ClientApp.java create mode 100644 src/main/java/microsoft/exchange/webservices/data/property/complex/ClientAppMetadata.java 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..98fae2411 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/ExchangeService.java @@ -23,21 +23,6 @@ package microsoft.exchange.webservices.data.core; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.EnumSet; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - import microsoft.exchange.webservices.data.autodiscover.AutodiscoverService; import microsoft.exchange.webservices.data.autodiscover.IAutodiscoverRedirectionUrl; import microsoft.exchange.webservices.data.autodiscover.enumeration.UserSettingName; @@ -90,6 +75,8 @@ 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.GetAppManifestsRequest; +import microsoft.exchange.webservices.data.core.request.GetAppMarketplaceUrlRequest; import microsoft.exchange.webservices.data.core.request.GetAttachmentRequest; import microsoft.exchange.webservices.data.core.request.GetDelegateRequest; import microsoft.exchange.webservices.data.core.request.GetEventsRequest; @@ -106,6 +93,7 @@ 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.InstallAppRequest; import microsoft.exchange.webservices.data.core.request.MoveFolderRequest; import microsoft.exchange.webservices.data.core.request.MoveItemRequest; import microsoft.exchange.webservices.data.core.request.RemoveDelegateRequest; @@ -136,6 +124,7 @@ 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.InstallAppResponse; import microsoft.exchange.webservices.data.core.response.MoveCopyFolderResponse; import microsoft.exchange.webservices.data.core.response.MoveCopyItemResponse; import microsoft.exchange.webservices.data.core.response.ServiceResponse; @@ -168,6 +157,7 @@ import microsoft.exchange.webservices.data.notification.PushSubscription; import microsoft.exchange.webservices.data.notification.StreamingSubscription; import microsoft.exchange.webservices.data.property.complex.Attachment; +import microsoft.exchange.webservices.data.property.complex.ClientApp; import microsoft.exchange.webservices.data.property.complex.ConversationId; import microsoft.exchange.webservices.data.property.complex.DelegateUser; import microsoft.exchange.webservices.data.property.complex.EmailAddress; @@ -195,12 +185,25 @@ import microsoft.exchange.webservices.data.sync.ChangeCollection; import microsoft.exchange.webservices.data.sync.FolderChange; import microsoft.exchange.webservices.data.sync.ItemChange; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; + /** * Represents a binding to the Exchange Web Services. */ @@ -3993,4 +3996,38 @@ public boolean autodiscoverRedirectionUrlValidationCallback( } + public List getAppManifests() throws Exception { + GetAppManifestsRequest request = new GetAppManifestsRequest(this); + return request.execute().getManifests(); + } + + public List getAppManifests(String apiVersionSupported, String schemaVersionSupported) throws Exception { + GetAppManifestsRequest request = new GetAppManifestsRequest(this); + request.setSchemaVersionSupported(schemaVersionSupported); + request.setApiVersionSupported(apiVersionSupported); + return request.execute().getApps(); + } + + public String getAppMarketplaceUrl(String apiVersionSupported, String schemaVersionSupported) throws Exception { + GetAppMarketplaceUrlRequest request = new GetAppMarketplaceUrlRequest(this); + request.setApiVersionSupported(apiVersionSupported); + request.setSchemaVersionSupported(schemaVersionSupported); + return request.execute().getAppMarketplaceUrl(); + } + + public String getAppMarketplaceUrl() throws Exception { + return getAppMarketplaceUrl(null, null); + } + + public void installApp(InputStream manifest) throws Exception { + EwsUtilities.validateParam(manifest, "manifestStream"); + this.internalInstallApp(manifest, null, null, false); + } + + private boolean internalInstallApp(InputStream manifestStream, String marketplaceAssetId, String marketplaceContentMarket, boolean sendWelcomeEmail) throws Exception { + EwsUtilities.validateParam(manifestStream, "manifestStream"); + InstallAppRequest request = new InstallAppRequest(this, manifestStream, marketplaceAssetId, marketplaceContentMarket, false); + InstallAppResponse response = request.execute(); + return response.isWasFirstInstall(); + } } 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..2d5a4979d 100644 --- a/src/main/java/microsoft/exchange/webservices/data/core/XmlElementNames.java +++ b/src/main/java/microsoft/exchange/webservices/data/core/XmlElementNames.java @@ -4785,4 +4785,104 @@ public class XmlElementNames { // by // UM + /** + * The Constant ActionUrl. + */ + public static final String ActionUrl = "ActionUrl"; + + /** + * The Constant AppStatus. + */ + public static final String AppStatus = "AppStatus"; + + /** + * The Constant EndNodeUrl. + */ + public static final String EndNodeUrl = "EndNodeUrl"; + + /** + * The Constant GetAppManifestsRequest. + */ + public static final String GetAppManifestsRequest = "GetAppManifests"; + + /** + * The Constant ApiVersionSupported. + */ + public static final String ApiVersionSupported = "ApiVersionSupported"; + + /** + * The Constant SchemaVersionSupported. + */ + public static final String SchemaVersionSupported = "SchemaVersionSupported"; + + /** + * The Constant Manifests. + */ + public static final String Manifests = "Manifests"; + + /** + * The Constant Manifest. + */ + public static final String Manifest = "Manifest"; + + /** + * The Constant Apps. + */ + public static final String Apps = "Apps"; + + /** + * The Constant App. + */ + public static final String App = "App"; + + /** + * The Constant GetAppManifestsResponse. + */ + public static final String GetAppManifestsResponse = "GetAppManifestsResponse"; + + /** + * The Constant GetAppMarketplaceUrlRequest. + */ + public static final String GetAppMarketplaceUrlRequest = "GetAppMarketplaceUrl"; + + /** + * The Constant GetAppMarketplaceUrlResponse. + */ + public static final String GetAppMarketplaceUrlResponse = "GetAppMarketplaceUrlResponse"; + + /** + * The Constant AppMarketplaceUrl. + */ + public static final String AppMarketplaceUrl= "AppMarketplaceUrl"; + + /** + * The Constant InstallAppRequest. + */ + public static final String InstallAppRequest = "InstallApp"; + + /** + * The Constant MarketplaceAssetId. + */ + public static final String MarketplaceAssetId = "MarketplaceAssetId"; + + /** + * The Constant MarketplaceContentMarket. + */ + public static final String MarketplaceContentMarket = "MarketplaceContentMarket"; + + /** + * The Constant SendWelcomeEmail. + */ + public static final String SendWelcomeEmail = "SendWelcomeEmail"; + + /** + * The Constant InstallAppResponse. + */ + public static final String InstallAppResponse = "InstallAppResponse"; + + /** + * The Constant WasFirstInstall. + */ + public static final String WasFirstInstall = "WasFirstInstall"; + } 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..882855c9a 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,35 @@ public enum ExchangeVersion { * Exchange2010_SP2. */ Exchange2010_SP2, + + // Microsoft Exchange 2013 + /** + * Exchange2013 + */ + Exchange2013, + + // Microsoft Exchange 2013, Service Pack 1 + /** + * Exchange2013_SP1 + */ + Exchange2013_SP1, + + // Microsoft Exchange 2015 (aka Exchange 2016) + /** + * Exchange2013_SP1 + */ + Exchange2015, + + // Microsoft Exchange 2016 + /** + * Exchange2013_SP1 + */ + Exchange2016, + + // Functionality starting 10/05/2015 + /** + * V2015_10_05 + */ + V2015_10_05 + } diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/GetAppManifestsRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/GetAppManifestsRequest.java new file mode 100644 index 000000000..194e282d8 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/GetAppManifestsRequest.java @@ -0,0 +1,144 @@ +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.ExchangeService; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.core.response.GetAppManifestsResponse; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by yiyangli on 8/9/16. + */ +public class GetAppManifestsRequest extends SimpleServiceRequestBase { + + private String apiVersionSupported; + private String schemaVersionSupported; + + /** + * Initializes a new instance of the GetAppManifestsRequest class. + * + * @param service the service + * @throws Exception + */ + public GetAppManifestsRequest(ExchangeService service) throws Exception { + super(service); + } + + /** + * Gets the api version supported by the client. + * + * @return the proxy + */ + public String getApiVersionSupported() { + return apiVersionSupported; + } + + + /** + * Sets the api version supported by the client. + * + * @param apiVersionSupported The Api Version supported by the client. + */ + public void setApiVersionSupported(String apiVersionSupported) { + this.apiVersionSupported = apiVersionSupported; + } + + /** + * Gets the Schema version supported by the client. + * + * @return the proxy + */ + public String getSchemaVersionSupported() { + return schemaVersionSupported; + } + + /** + * Sets the schema version supported by the client. + * + * @param schemaVersionSupported The Schema Version supported by the client. + */ + public void setSchemaVersionSupported(String schemaVersionSupported) { + this.schemaVersionSupported = schemaVersionSupported; + } + + /** + * Validate request. + */ + @Override + public void validate() throws Exception { + super.validate(); + EwsUtilities.validateNonBlankStringParamAllowNull(this.apiVersionSupported, "apiVersionSupported"); + EwsUtilities.validateNonBlankStringParamAllowNull(this.schemaVersionSupported, "schemaVersionSupported"); + } + + /** + * Gets the name of the XML element. + * + * @return XML element name. + */ + @Override + public String getXmlElementName() { + return XmlElementNames.GetAppManifestsRequest; + } + + /** + * Writes XML elements. + * + * @param writer the writer + * @throws Exception the exception + */ + @Override + public void writeElementsToXml(EwsServiceXmlWriter writer) throws Exception { + if (!StringUtils.isEmpty(this.apiVersionSupported)) { + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.ApiVersionSupported, this.apiVersionSupported); + } + + if (!StringUtils.isEmpty(this.schemaVersionSupported)) { + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.SchemaVersionSupported, this.schemaVersionSupported); + } + } + + /** + * Gets the name of the response XML element. + * + * @return XML element name. + */ + @Override + public String getResponseXmlElementName() { + return XmlElementNames.GetAppManifestsResponse; + } + + @Override + public GetAppManifestsResponse parseResponse(EwsServiceXmlReader reader) throws Exception { + GetAppManifestsResponse response = new GetAppManifestsResponse(); + response.loadFromXml(reader, XmlElementNames.GetAppManifestsResponse); + return response; + } + + /** + * Gets the request version. + * + * @return Earliest Exchange version in which this request is supported. + */ + @Override + public ExchangeVersion getMinimumRequiredServerVersion() { + return ExchangeVersion.Exchange2013; + } + + /** + * Executes this request. + * + * @return Service response. + * @throws Exception the exception + */ + public GetAppManifestsResponse execute() throws Exception{ + GetAppManifestsResponse serviceResponse = this.internalExecute(); + serviceResponse.throwIfNecessary(); + return serviceResponse; + } + +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/GetAppMarketplaceUrlRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/GetAppMarketplaceUrlRequest.java new file mode 100644 index 000000000..2fb9397d9 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/GetAppMarketplaceUrlRequest.java @@ -0,0 +1,143 @@ +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.ExchangeService; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.core.response.GetAppMarketplaceUrlResponse; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by yiyangli on 8/9/16. + */ +public class GetAppMarketplaceUrlRequest extends SimpleServiceRequestBase { + + private String apiVersionSupported; + private String schemaVersionSupported; + + /** + * Initializes a new instance of the GetAppManifestsRequest class. + * + * @param service the service + * @throws Exception + */ + public GetAppMarketplaceUrlRequest(ExchangeService service) throws Exception { + super(service); + } + + /** + * Gets the api version supported by the client. + * + * @return the proxy + */ + public String getApiVersionSupported() { + return apiVersionSupported; + } + + + /** + * Sets the api version supported by the client. + * + * @param apiVersionSupported The Api Version supported by the client. + */ + public void setApiVersionSupported(String apiVersionSupported) { + this.apiVersionSupported = apiVersionSupported; + } + + /** + * Gets the Schema version supported by the client. + * + * @return the proxy + */ + public String getSchemaVersionSupported() { + return schemaVersionSupported; + } + + /** + * Sets the schema version supported by the client. + * + * @param schemaVersionSupported The Schema Version supported by the client. + */ + public void setSchemaVersionSupported(String schemaVersionSupported) { + this.schemaVersionSupported = schemaVersionSupported; + } + + /** + * Validate request. + */ + @Override + public void validate() throws Exception { + super.validate(); + EwsUtilities.validateNonBlankStringParamAllowNull(this.apiVersionSupported, "apiVersionSupported"); + EwsUtilities.validateNonBlankStringParamAllowNull(this.schemaVersionSupported, "schemaVersionSupported"); + } + + /** + * Gets the name of the XML element. + * + * @return XML element name. + */ + @Override + public String getXmlElementName() { + return XmlElementNames.GetAppMarketplaceUrlRequest; + } + + /** + * Writes XML elements. + * + * @param writer the writer + * @throws Exception the exception + */ + @Override + public void writeElementsToXml(EwsServiceXmlWriter writer) throws Exception { + if (!StringUtils.isEmpty(this.apiVersionSupported)) { + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.ApiVersionSupported, this.apiVersionSupported); + } + + if (!StringUtils.isEmpty(this.schemaVersionSupported)) { + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.SchemaVersionSupported, this.schemaVersionSupported); + } + } + + /** + * Gets the name of the response XML element. + * + * @return XML element name. + */ + @Override + public String getResponseXmlElementName() { + return XmlElementNames.GetAppMarketplaceUrlResponse; + } + + @Override + public GetAppMarketplaceUrlResponse parseResponse(EwsServiceXmlReader reader) throws Exception { + GetAppMarketplaceUrlResponse response = new GetAppMarketplaceUrlResponse(); + response.loadFromXml(reader, XmlElementNames.GetAppMarketplaceUrlResponse); + return response; + } + + /** + * Gets the request version. + * + * @return Earliest Exchange version in which this request is supported. + */ + @Override + public ExchangeVersion getMinimumRequiredServerVersion() { + return ExchangeVersion.Exchange2013; + } + + /** + * Executes this request. + * + * @return Service response. + * @throws Exception the exception + */ + public GetAppMarketplaceUrlResponse execute() throws Exception{ + GetAppMarketplaceUrlResponse serviceResponse = this.internalExecute(); + serviceResponse.throwIfNecessary(); + return serviceResponse; + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/request/InstallAppRequest.java b/src/main/java/microsoft/exchange/webservices/data/core/request/InstallAppRequest.java new file mode 100644 index 000000000..a2b5feb45 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/request/InstallAppRequest.java @@ -0,0 +1,124 @@ +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.ExchangeService; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.core.response.InstallAppResponse; +import org.apache.commons.lang3.StringUtils; + +import java.io.InputStream; + +/** + * Created by yiyangli on 8/9/16. + */ +public final class InstallAppRequest extends SimpleServiceRequestBase { + + private InputStream manifestStream; + private String marketplaceAssetId; + private String marketplaceContentMarket; + private boolean sendWelcomeEmail; + + /** + * Initializes a new instance of the InstallAppRequest class. + * + * @param service the service. + * @param manifestStream The manifest's plain text XML stream. + * @param marketplaceAssetId The asset id of the addin in marketpalce + * @param marketplaceContentMarket The target market for the content + * @param sendWelcomeEmail Whether to send email on installation + * @throws Exception the exception + */ + public InstallAppRequest(ExchangeService service, InputStream manifestStream, String marketplaceAssetId, String marketplaceContentMarket, boolean sendWelcomeEmail) throws Exception{ + super(service); + this.manifestStream = manifestStream; + this.marketplaceAssetId = marketplaceAssetId; + this.marketplaceContentMarket = marketplaceContentMarket; + this.sendWelcomeEmail = sendWelcomeEmail; + } + + /** + * Gets the name of the XML element. + * + * @return XML element name. + */ + @Override + public String getXmlElementName() { + return XmlElementNames.InstallAppRequest; + } + + + + /** + * Writes XML elements. + * + * @param writer the writer + * @throws Exception the exception + */ + @Override + public void writeElementsToXml(EwsServiceXmlWriter writer) throws Exception { + + writer.writeStartElement(XmlNamespace.Messages, XmlElementNames.Manifest); + + writer.writeBase64ElementValue(manifestStream); + + writer.writeEndElement(); + + if (!StringUtils.isEmpty(this.marketplaceAssetId)) + { + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.MarketplaceAssetId, this.marketplaceAssetId); + + if (!StringUtils.isEmpty(this.marketplaceContentMarket)) + { + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.MarketplaceContentMarket, this.marketplaceContentMarket); + } + + writer.writeElementValue(XmlNamespace.Messages, XmlElementNames.SendWelcomeEmail, this.sendWelcomeEmail); + } + + } + + /** + * Gets the name of the response XML element. + * + * @return XML element name. + */ + @Override + public String getResponseXmlElementName() { + return XmlElementNames.InstallAppResponse; + } + + + @Override + public InstallAppResponse parseResponse(EwsServiceXmlReader reader) throws Exception { + InstallAppResponse response = new InstallAppResponse(); + response.loadFromXml(reader, XmlElementNames.InstallAppResponse); + return response; + } + + /** + * Gets the request version. + * + * @return Earliest Exchange version in which this request is supported. + */ + @Override + public ExchangeVersion getMinimumRequiredServerVersion() { + return ExchangeVersion.Exchange2013; + } + + /** + * Executes this request. + * + * @return Service response. + * @throws Exception the exception + */ + public InstallAppResponse execute() throws Exception{ + InstallAppResponse serviceResponse = this.internalExecute(); + serviceResponse.throwIfNecessary(); + return serviceResponse; + } + +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/response/GetAppManifestsResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/response/GetAppManifestsResponse.java new file mode 100644 index 000000000..11eaa1f58 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/response/GetAppManifestsResponse.java @@ -0,0 +1,145 @@ +package microsoft.exchange.webservices.data.core.response; + +import static microsoft.exchange.webservices.data.core.XmlElementNames.Apps; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.EwsUtilities; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; +import microsoft.exchange.webservices.data.core.exception.service.local.ServiceXmlDeserializationException; +import microsoft.exchange.webservices.data.property.complex.ClientApp; +import microsoft.exchange.webservices.data.security.XmlNodeType; + +import java.io.InputStream; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by yiyangli on 8/9/16. + */ +public class GetAppManifestsResponse extends ServiceResponse { + + public static final String UnexpectedElement = "An element node '{0}:{1}' of the type {2} was expected, but node '{3}' of type {4} was found."; + + private List manifests = new ArrayList(); + + private List apps = new ArrayList(); + + /* + * Initializes a new instance of the GetAppManifestsResponse class. + * */ + public GetAppManifestsResponse() { + super(); + } + + public List getManifests() { + return manifests; + } + + public List getApps() { + return apps; + } + + /** + * Reads response elements from XML. + * + * @param reader the reader + * @throws Exception the exception + */ + @Override + public void readElementsFromXml(EwsServiceXmlReader reader) throws Exception { + this.manifests.clear(); + super.readElementsFromXml(reader); + + reader.read(); + + // We can have a response from Exchange 2013 (first time this API was introduced) + // or the newer response, starting in Exchange 2013 SP1, (X-EWS-TargetVersion: 2.5 or above) + boolean exchange2013Response; + if (reader.getLocalName().equals(XmlElementNames.Manifests)) { + exchange2013Response = true; + } else if (reader.getLocalName().equals(Apps)) { + exchange2013Response = false; + } else { + throw new ServiceXmlDeserializationException( + MessageFormat.format( + UnexpectedElement, + EwsUtilities.getNamespacePrefix(XmlNamespace.Messages), + XmlElementNames.Manifests, + XmlNodeType.START_ELEMENT, + reader.getLocalName(), + reader.getNodeType())); + } + + if (!reader.isEmptyElement()) + { + // Because we don't have an element for count of returned object, + // we have to test the element to determine if it is StartElement of return object or EndElement + reader.read(); + + if (exchange2013Response) + { + this.readFromExchange2013(reader); + } + else + { + this.readFromExchange2013Sp1(reader); + } + } + } + + /* + * Read the response from Exchange 2013. + * This method assumes that the reader is currently at the Manifests element. + * @param reader The reader + * */ + private void readFromExchange2013(EwsServiceXmlReader reader) throws Exception { + //// + ////NoError + //// + ////[base 64 encoded manifest] <--- reader should be at this node at the beginning of loop + ////[base 64 encoded manifest] + //// .... + //// <--- reader should be at this node at the end of the loop + while (reader.isStartElement(XmlNamespace.Messages, XmlElementNames.Manifest)) + { + InputStream manifest = ClientApp.readToXmlDocument(reader); + this.manifests.add(manifest); + ClientApp clientApp = new ClientApp(); + clientApp.setManifest(manifest); + this.apps.add(clientApp); + } + } + + /* + * Read the response from Exchange 2013 sp1. + * This method assumes that the reader is currently at the Manifests element. + * @param reader The reader + * */ + private void readFromExchange2013Sp1(EwsServiceXmlReader reader) throws Exception { + //// + //// NoError + //// + //// <--- reader should be at this node at the beginning of the loop + //// + //// http://o15.officeredir.microsoft.com/r/rlidMktplcExchRedirect?app=outlook.exe&ver=15&clid=1033&p1=15d0d766d0&p2=4&p3=0&p4=WA&p5=en-US\WA102996382&Scope=2&CallBackURL=https%3a%2f%2fexhv-4880%2fecp%2fExtension%2finstallFromURL.slab%3fexsvurl%3d1&DeployId=EXHV-4680dom.extest.microsoft.com + //// 2.3 + //// http://o15.officeredir.microsoft.com/r/rlidMktplcExchRedirect?app=outlook.exe&ver=15&clid=1033&p1=15d0d766d0&p2=4&p3=0&p4=WA&p5=en-US\WA102996382&Scope=2&CallBackURL=https%3a%2f%2fexhv-4880%2fecp%2fExtension%2finstallFromURL.slab%3fexsvurl%3d1&DeployId=EXHV-4680dom.extest.microsoft.com + //// + //// [base 64 encoded manifest] + //// + //// + //// .... + //// <----- reader should be at this node at the end of the loop + while (reader.isStartElement(XmlNamespace.Types, XmlElementNames.App)) + { + ClientApp clientApp = new ClientApp(); + clientApp.loadFromXml(reader, XmlElementNames.App); + this.apps.add(clientApp); + this.manifests.add(clientApp.getManifest()); + reader.ensureCurrentNodeIsEndElement(XmlNamespace.Types, XmlElementNames.App); + reader.read(); + } + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/response/GetAppMarketplaceUrlResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/response/GetAppMarketplaceUrlResponse.java new file mode 100644 index 000000000..c12e15d78 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/response/GetAppMarketplaceUrlResponse.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; + +/** + * Created by yiyangli on 8/9/16. + */ +public class GetAppMarketplaceUrlResponse extends ServiceResponse { + + private String appMarketplaceUrl; + + public String getAppMarketplaceUrl() { + return appMarketplaceUrl; + } + + public GetAppMarketplaceUrlResponse() { + super(); + } + + @Override + public void readElementsFromXml(EwsServiceXmlReader reader) throws Exception { + super.readElementsFromXml(reader); + this.appMarketplaceUrl = reader.readElementValue(String.class, XmlNamespace.NotSpecified, XmlElementNames.AppMarketplaceUrl); + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/core/response/InstallAppResponse.java b/src/main/java/microsoft/exchange/webservices/data/core/response/InstallAppResponse.java new file mode 100644 index 000000000..d5fab5856 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/core/response/InstallAppResponse.java @@ -0,0 +1,40 @@ +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.core.enumeration.misc.error.ServiceError; + +/** + * Created by yiyangli on 8/9/16. + */ +public class InstallAppResponse extends ServiceResponse { + + private boolean wasFirstInstall; + + /* + * Initializes a new instance of the InstallAppResponse class. + * */ + public InstallAppResponse() { + super(); + } + + /** + * Reads response elements from XML. + * + * @param reader the reader + * @throws Exception the exception + */ + @Override + public void readElementsFromXml(EwsServiceXmlReader reader) throws Exception { + super.readElementsFromXml(reader); + + if (this.getErrorCode().equals(ServiceError.NoError) && reader.isStartElement(XmlNamespace.NotSpecified, XmlElementNames.WasFirstInstall)) { + this.wasFirstInstall = reader.readElementValue(boolean.class, XmlNamespace.NotSpecified, XmlElementNames.WasFirstInstall); + } + } + + public boolean isWasFirstInstall() { + return this.wasFirstInstall; + } +} \ No newline at end of file diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ClientApp.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ClientApp.java new file mode 100644 index 000000000..01f0edcf3 --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ClientApp.java @@ -0,0 +1,70 @@ +package microsoft.exchange.webservices.data.property.complex; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +/** + * Created by yiyangli on 8/9/16. + */ +public class ClientApp extends ComplexProperty { + public static final String Manifest = "Manifest"; + public static final String Metadata = "Metadata"; + + /** + * Initializes a new instance of the ClientApp class. + */ + public ClientApp() { + super(); + this.setNamespace(XmlNamespace.Types); + } + + private InputStream manifest; + + private ClientAppMetadata metaData; + + public InputStream getManifest() { + return manifest; + } + + public void setManifest(InputStream manifest) { + this.manifest = manifest; + } + + public ClientAppMetadata getMetaData() { + return metaData; + } + + public void setMetaData(ClientAppMetadata metaData) { + this.metaData = metaData; + } + + /* + * Helper to convert to xml dcouemnt from the current value. + * @param reader The reader. + * @return The xml document. + * */ + public static InputStream readToXmlDocument(EwsServiceXmlReader reader) throws Exception { + ByteArrayOutputStream memoryStream = new ByteArrayOutputStream(); + reader.readBase64ElementValue(memoryStream); + + return new ByteArrayInputStream(memoryStream.toByteArray()); + } + + @Override + public boolean tryReadElementFromXml(EwsServiceXmlReader reader) throws Exception { + if (reader.getLocalName().equals(Manifest)) { + this.setManifest(ClientApp.readToXmlDocument(reader)); + return true; + } + if (reader.getLocalName().equals(Metadata)) { + this.setMetaData(new ClientAppMetadata()); + this.metaData.loadFromXml(reader, XmlNamespace.Types, Metadata); + return true; + } + return false; + } +} diff --git a/src/main/java/microsoft/exchange/webservices/data/property/complex/ClientAppMetadata.java b/src/main/java/microsoft/exchange/webservices/data/property/complex/ClientAppMetadata.java new file mode 100644 index 000000000..d7058085f --- /dev/null +++ b/src/main/java/microsoft/exchange/webservices/data/property/complex/ClientAppMetadata.java @@ -0,0 +1,61 @@ +package microsoft.exchange.webservices.data.property.complex; + +import microsoft.exchange.webservices.data.core.EwsServiceXmlReader; +import microsoft.exchange.webservices.data.core.XmlElementNames; +import microsoft.exchange.webservices.data.core.enumeration.misc.XmlNamespace; + +/** + * Created by yiyangli on 8/9/16. + */ +public class ClientAppMetadata extends ComplexProperty { + + private String endNodeUrl; + private String actionUrl; + private String appStatus; + + public ClientAppMetadata() { + this.setNamespace(XmlNamespace.Types); + } + + public String getEndNodeUrl() { + return endNodeUrl; + } + + public void setEndNodeUrl(String endNodeUrl) { + this.endNodeUrl = endNodeUrl; + } + + public String getActionUrl() { + return actionUrl; + } + + public void setActionUrl(String actionUrl) { + this.actionUrl = actionUrl; + } + + public String getAppStatus() { + return appStatus; + } + + public void setAppStatus(String appStatus) { + this.appStatus = appStatus; + } + + @Override + public boolean tryReadElementFromXml(EwsServiceXmlReader reader) throws Exception { + String localName = reader.getLocalName(); + if (localName.equals(XmlElementNames.EndNodeUrl)) { + this.setEndNodeUrl(reader.readElementValue(String.class)); + return true; + } + if (localName.equals(XmlElementNames.ActionUrl)) { + this.setActionUrl(reader.readElementValue(String.class)); + return true; + } + if (localName.equals(XmlElementNames.AppStatus)) { + this.setActionUrl(reader.readElementValue(String.class)); + return true; + } + return false; + } +}