diff --git a/.gitignore b/.gitignore
index f1e3d20..b2edd60 100644
--- a/.gitignore
+++ b/.gitignore
@@ -152,6 +152,7 @@ PublishScripts/
# NuGet Packages
*.nupkg
+!**/ReleaseArtifact/*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
diff --git a/AuthorizeNET/AuthorizeNET.Tests/AuthorizeNET.Tests.csproj b/AuthorizeNET/AuthorizeNET.Tests/AuthorizeNET.Tests.csproj
new file mode 100644
index 0000000..2f18892
--- /dev/null
+++ b/AuthorizeNET/AuthorizeNET.Tests/AuthorizeNET.Tests.csproj
@@ -0,0 +1,19 @@
+
+
+
+ netcoreapp3.1
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AuthorizeNET/AuthorizeNET.Tests/TransactionControllerTests.cs b/AuthorizeNET/AuthorizeNET.Tests/TransactionControllerTests.cs
new file mode 100644
index 0000000..f798397
--- /dev/null
+++ b/AuthorizeNET/AuthorizeNET.Tests/TransactionControllerTests.cs
@@ -0,0 +1,113 @@
+using AuthorizeNet.Api.Contracts.V1;
+using AuthorizeNet.Api.Controllers;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System.Threading.Tasks;
+
+namespace AuthorizeNET.Tests
+{
+ [TestClass]
+ public class TransactionControllerTests
+ {
+ merchantAuthenticationType MerchantAuthentication => new merchantAuthenticationType()
+ {
+ name = "5KP3u95bQpv",
+ ItemElementName = ItemChoiceType.transactionKey,
+ Item = "346HZ32z3fP4hTG2",
+ };
+
+
+ [TestMethod]
+ public async Task ChargeAsync()
+ {
+ var transaction = new transactionRequestType
+ {
+ amount = 123.45m,
+ transactionType = transactionTypeEnum.authCaptureTransaction.ToString(),
+ payment = new paymentType
+ {
+ Item = new creditCardType
+ {
+ cardNumber = "4111111111111111",
+ expirationDate = "0349",
+ cardCode = "123"
+ }
+ },
+
+ billTo = new customerAddressType
+ {
+ firstName = "TestName",
+ lastName = "McTesterson",
+ address = "123 Here st.",
+ city = "Springville",
+ state = "WA",
+ zip = "00000"
+ }
+ };
+
+ var fullRequest = new createTransactionRequest
+ {
+ merchantAuthentication = MerchantAuthentication,
+ transactionRequest = transaction,
+ };
+
+ // Send the request.
+ var controller = new createTransactionController(fullRequest);
+ var response = await controller.ExecuteWithApiResponseAsync(AuthorizeNet.Environment.SANDBOX);
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public void ChargeSync()
+ {
+ var transaction = new transactionRequestType
+ {
+ amount = 123.45m,
+ transactionType = transactionTypeEnum.authCaptureTransaction.ToString(),
+ payment = new paymentType
+ {
+ Item = new creditCardType
+ {
+ cardNumber = "4111111111111111",
+ expirationDate = "0349",
+ cardCode = "123"
+ }
+ },
+
+ billTo = new customerAddressType
+ {
+ firstName = "TestName",
+ lastName = "McTesterson",
+ address = "123 Here st.",
+ city = "Springville",
+ state = "WA",
+ zip = "00000"
+ }
+ };
+
+ var fullRequest = new createTransactionRequest
+ {
+ merchantAuthentication = MerchantAuthentication,
+ transactionRequest = transaction,
+ };
+
+ // Send the request.
+ var controller = new createTransactionController(fullRequest);
+ var response = controller.ExecuteWithApiResponse(AuthorizeNet.Environment.SANDBOX);
+
+ Assert.IsNotNull(response);
+ }
+
+ [TestMethod]
+ public async Task GetMerchangeDetails()
+ {
+ var controller = new getMerchantDetailsController(new getMerchantDetailsRequest
+ {
+ merchantAuthentication = MerchantAuthentication,
+ });
+
+ var response = await controller.ExecuteWithApiResponseAsync(AuthorizeNet.Environment.SANDBOX);
+ Assert.IsNotNull(response);
+ }
+ }
+}
diff --git a/AuthorizeNET/AuthorizeNET/Api/Contracts/V1/AnetApiSchema.generated.cs b/AuthorizeNET/AuthorizeNET/Api/Contracts/V1/AnetApiSchema.generated.cs
index 22f6d2a..1c2d370 100644
--- a/AuthorizeNET/AuthorizeNET/Api/Contracts/V1/AnetApiSchema.generated.cs
+++ b/AuthorizeNET/AuthorizeNET/Api/Contracts/V1/AnetApiSchema.generated.cs
@@ -6450,6 +6450,9 @@ public enum paymentMethodsTypeEnum {
///
AndroidPay,
+
+ ///
+ GooglePay,
}
///
diff --git a/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/ApiOperationBase.cs b/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/ApiOperationBase.cs
index 26c2c67..7a348df 100644
--- a/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/ApiOperationBase.cs
+++ b/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/ApiOperationBase.cs
@@ -6,6 +6,8 @@ namespace AuthorizeNet.Api.Controllers.Bases
using Contracts.V1;
using Utilities;
using Microsoft.Extensions.Logging;
+ using System.Threading.Tasks;
+ using AuthorizeNET.Utilities;
public abstract class ApiOperationBase : IApiOperation
where TQ : ANetApiRequest
@@ -29,7 +31,7 @@ protected ApiOperationBase(TQ apiRequest)
if (null == apiRequest)
{
Logger.LogError("null apiRequest");
- throw new ArgumentNullException("apiRequest", "Input request cannot be null");
+ throw new ArgumentNullException(nameof(apiRequest), "Input request cannot be null");
}
if (null != GetApiResponse())
{
@@ -81,16 +83,22 @@ public TS ExecuteWithApiResponse(AuthorizeNet.Environment environment = null)
return GetApiResponse();
}
+ public async Task ExecuteWithApiResponseAsync(AuthorizeNet.Environment environment = null)
+ {
+ await ExecuteAsync(environment).ConfigureAwait(false);
+ return GetApiResponse();
+ }
+
const String NullEnvironmentErrorMessage = "Environment not set. Set environment using setter or use overloaded method to pass appropriate environment";
- public void Execute(AuthorizeNet.Environment environment = null)
+ public async Task ExecuteAsync(AuthorizeNet.Environment environment = null)
{
BeforeExecute();
if (null == environment) { environment = ApiOperationBase.RunEnvironment; }
if (null == environment) throw new ArgumentException(NullEnvironmentErrorMessage);
- var httpApiResponse = HttpUtility.PostData(environment, GetApiRequest());
+ var httpApiResponse = await HttpUtility.PostDataAsync(environment, GetApiRequest()).ConfigureAwait(false);
if (null != httpApiResponse)
{
@@ -122,6 +130,11 @@ public void Execute(AuthorizeNet.Environment environment = null)
AfterExecute();
}
+ public void Execute(AuthorizeNet.Environment environment = null)
+ {
+ AsyncUtil.RunSync(() => ExecuteAsync(environment));
+ }
+
public messageTypeEnum GetResultCode()
{
return ResultCode;
@@ -171,6 +184,7 @@ private messagesType GetResultMessage()
protected messageTypeEnum ResultCode = messageTypeEnum.Ok;
protected virtual void BeforeExecute() { }
+
protected virtual void AfterExecute() { }
protected abstract void ValidateRequest();
@@ -181,7 +195,7 @@ private void Validate()
ValidateAndSetMerchantAuthentication();
//set the client Id
- SetClientId();
+ SetClientId();
ValidateRequest();
}
diff --git a/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/IApiOperation.cs b/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/IApiOperation.cs
index e3ffcf3..5dff17c 100644
--- a/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/IApiOperation.cs
+++ b/AuthorizeNET/AuthorizeNET/Api/Controllers/Bases/IApiOperation.cs
@@ -1,6 +1,7 @@
namespace AuthorizeNet.Api.Controllers.Bases
{
using System.Collections.Generic;
+ using System.Threading.Tasks;
/**
* @author ramittal
@@ -12,10 +13,19 @@ public interface IApiOperation
where TS : AuthorizeNet.Api.Contracts.V1.ANetApiResponse
{
TS GetApiResponse();
+
AuthorizeNet.Api.Contracts.V1.ANetApiResponse GetErrorResponse();
+
TS ExecuteWithApiResponse(AuthorizeNet.Environment environment = null);
+
+ Task ExecuteWithApiResponseAsync(AuthorizeNet.Environment environment = null);
+
void Execute(AuthorizeNet.Environment environment = null);
+
+ Task ExecuteAsync(AuthorizeNet.Environment environment = null);
+
AuthorizeNet.Api.Contracts.V1.messageTypeEnum GetResultCode();
+
List GetResults();
}
#pragma warning restore 1591
diff --git a/AuthorizeNET/AuthorizeNET/AuthorizeNET.csproj b/AuthorizeNET/AuthorizeNET/AuthorizeNET.csproj
index 8075368..5adaaf4 100644
--- a/AuthorizeNET/AuthorizeNET/AuthorizeNET.csproj
+++ b/AuthorizeNET/AuthorizeNET/AuthorizeNET.csproj
@@ -1,21 +1,24 @@
- netcoreapp2.0
- 1.0.0.0
+ netstandard2.0
+ 0.1.3-beta
+ AuthorizeNet.DotNetCore
+ https://github.com/AuthorizeNet/dotnet-core-sdk-beta
+ Payments API Authorize.Net
+ Authorize.Net
+ Authorize.Net
+ true
+ MIT
+ Use this SDK to integrate with the Authorize.Net APIs for Payment Transactions, Recurring Billing and Customer Payment Profiles.
+ Authorize.Net
- bin\Release\netcoreapp2.0\AuthorizeNET.xml
+ bin\Release\netstandard2.0\AuthorizeNET.xml
-
-
-
-
-
-
@@ -23,7 +26,6 @@
-
diff --git a/AuthorizeNET/AuthorizeNET/Utilities/AsyncHelpers.cs b/AuthorizeNET/AuthorizeNET/Utilities/AsyncHelpers.cs
new file mode 100644
index 0000000..a0012e1
--- /dev/null
+++ b/AuthorizeNET/AuthorizeNET/Utilities/AsyncHelpers.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Globalization;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace AuthorizeNET.Utilities
+{
+ internal static class AsyncUtil
+ {
+ private static readonly TaskFactory taskFactory = new
+ TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);
+
+ public static void RunSync(Func func)
+ {
+ var cultureUi = CultureInfo.CurrentUICulture;
+ var culture = CultureInfo.CurrentCulture;
+ taskFactory.StartNew(() =>
+ {
+ Thread.CurrentThread.CurrentCulture = culture;
+ Thread.CurrentThread.CurrentUICulture = cultureUi;
+ return func();
+ }).Unwrap().GetAwaiter().GetResult();
+ }
+ }
+}
diff --git a/AuthorizeNET/AuthorizeNET/Utilities/HttpUtility.cs b/AuthorizeNET/AuthorizeNET/Utilities/HttpUtility.cs
index 858475a..32cfbfe 100644
--- a/AuthorizeNET/AuthorizeNET/Utilities/HttpUtility.cs
+++ b/AuthorizeNET/AuthorizeNET/Utilities/HttpUtility.cs
@@ -1,14 +1,15 @@
namespace AuthorizeNet.Utilities
{
- using Api.Contracts.V1;
- using Api.Controllers.Bases;
- using Microsoft.Extensions.Logging;
- using System;
- using System.Net.Http;
- using System.Text;
- using System.Net;
+ using Api.Contracts.V1;
+ using Api.Controllers.Bases;
+ using Microsoft.Extensions.Logging;
+ using System;
+ using System.Net;
+ using System.Net.Http;
+ using System.Text;
+ using System.Threading.Tasks;
- public static class HttpUtility
+ public static class HttpUtility
{
private static readonly ILogger Logger = LogFactory.getLog(typeof(HttpUtility));
@@ -22,7 +23,7 @@ private static Uri GetPostUrl(AuthorizeNet.Environment env)
return postUrl;
}
- public static ANetApiResponse PostData(AuthorizeNet.Environment env, TQ request)
+ public static async Task PostDataAsync(AuthorizeNet.Environment env, TQ request)
where TQ : ANetApiRequest
where TS : ANetApiResponse
{
@@ -45,12 +46,12 @@ public static ANetApiResponse PostData(AuthorizeNet.Environment env, TQ
var httpConnectionTimeout = AuthorizeNet.Environment.getIntProperty(Constants.HttpConnectionTimeout);
client.Timeout = TimeSpan.FromMilliseconds(httpConnectionTimeout != 0 ? httpConnectionTimeout : Constants.HttpConnectionDefaultTimeout);
var content = new StringContent(XmlUtility.Serialize(request), Encoding.UTF8, "text/xml");
- var webResponse = client.PostAsync(postUrl, content).Result;
+ var webResponse = await client.PostAsync(postUrl, content).ConfigureAwait(false);
Logger.LogDebug("Retrieving Response from Url: '{0}'", postUrl);
// Get the response
Logger.LogDebug("Received Response: '{0}'", webResponse);
- responseAsString = webResponse.Content.ReadAsStringAsync().Result;
+ responseAsString = await webResponse.Content.ReadAsStringAsync().ConfigureAwait(false);
Logger.LogDebug("Response from Stream: '{0}'", responseAsString);
}
diff --git a/AuthorizeNET/AuthorizeNET/Utilities/LogFactory.cs b/AuthorizeNET/AuthorizeNET/Utilities/LogFactory.cs
index 8f0ad06..5ca6549 100644
--- a/AuthorizeNET/AuthorizeNET/Utilities/LogFactory.cs
+++ b/AuthorizeNET/AuthorizeNET/Utilities/LogFactory.cs
@@ -3,13 +3,32 @@
using System;
using Microsoft.Extensions.Logging;
+ ///
+ /// Configures
+ ///
public static class LogFactory
{
- private static ILoggerFactory LoggerFactory => new LoggerFactory().AddDebug(LogLevel.Debug);
+ private static ILoggerFactory _factory => new LoggerFactory();
+ ///
+ /// The logger factory instance used to create logger instances for the XML serializer,
+ /// API operations, and HTTP utilities. Use this property to add providers to such as
+ /// the debugger factory:
+ ///
+ ///
+ /// LogFactory.Factory.AddDebug(LogLevel.Debug);
+ ///
+ ///
+ public static ILoggerFactory Factory => _factory;
+
+ ///
+ /// Get a logger instance for the given class type.
+ ///
+ ///
+ ///
public static ILogger getLog(Type classType)
{
- return LoggerFactory.CreateLogger(classType.FullName);
+ return _factory.CreateLogger(classType.FullName);
}
}
}
\ No newline at end of file
diff --git a/AuthorizeNET/AuthorizeNet.Core.sln b/AuthorizeNET/AuthorizeNet.Core.sln
index 8edb9bb..3b76d35 100644
--- a/AuthorizeNET/AuthorizeNet.Core.sln
+++ b/AuthorizeNET/AuthorizeNet.Core.sln
@@ -1,10 +1,12 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27703.2018
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28803.352
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthorizeNET", "AuthorizeNET\AuthorizeNET.csproj", "{3F665C7E-A2E2-47E5-A032-E7D2F67AE165}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AuthorizeNET.Tests", "AuthorizeNET.Tests\AuthorizeNET.Tests.csproj", "{3B62287D-0B5F-4085-8D98-49E8CAE1F30A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -15,6 +17,10 @@ Global
{3F665C7E-A2E2-47E5-A032-E7D2F67AE165}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F665C7E-A2E2-47E5-A032-E7D2F67AE165}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F665C7E-A2E2-47E5-A032-E7D2F67AE165}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3B62287D-0B5F-4085-8D98-49E8CAE1F30A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3B62287D-0B5F-4085-8D98-49E8CAE1F30A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3B62287D-0B5F-4085-8D98-49E8CAE1F30A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3B62287D-0B5F-4085-8D98-49E8CAE1F30A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/AuthorizeNetDotNetCore.nuspec b/AuthorizeNetDotNetCore.nuspec
index 69b85b9..fea80d8 100644
--- a/AuthorizeNetDotNetCore.nuspec
+++ b/AuthorizeNetDotNetCore.nuspec
@@ -1,21 +1,21 @@
-
- AuthorizeNet.DotnetCore
- 1.0.0
- AuthorizeNet.DotnetCore
- Authorize.Net
- AuthorizeNet
- https://github.com/AuthorizeNet/dotnet-core-sdk-beta/blob/master/LICENSE
- https://github.com/AuthorizeNet/dotnet-core-sdk-beta
- http://developer.authorize.net/resources/images/favicon.ico
- false
- Use this SDK to integrate with the Authorize.Net APIs for Payment Transactions, Recurring Billing and Customer Payment Profiles.
- Authorize.Net SDK for .Net Core
- Payments API Authorize.Net
-
-
-
-
-
+
+ AuthorizeNet.DotNetCore
+ 1.0.0-beta
+ AuthorizeNet.DotNetCore
+ Authorize.Net
+ AuthorizeNet
+ https://github.com/AuthorizeNet/dotnet-core-sdk-beta/blob/master/LICENSE
+ https://github.com/AuthorizeNet/dotnet-core-sdk-beta
+ http://developer.authorize.net/resources/images/favicon.ico
+ false
+ Use this SDK to integrate with the Authorize.Net APIs for Payment Transactions, Recurring Billing and Customer Payment Profiles.
+ Authorize.Net SDK for .Net Core
+ Payments API Authorize.Net
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 1ed2459..00dd595 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
## Requirements
-* .NET Core 1.1.0 or later
+* .NET Standard 2.0 or later (.Net Framework 4.6.1)
* Microsoft® Visual Studio 2017 or later
* An Authorize.Net account (see _Registration & Configuration_ section below)
diff --git a/ReleaseArtifact/AuthorizeNET.dll b/ReleaseArtifact/AuthorizeNET.dll
deleted file mode 100644
index 4cf8670..0000000
Binary files a/ReleaseArtifact/AuthorizeNET.dll and /dev/null differ
diff --git a/ReleaseArtifact/AuthorizeNET.xml b/ReleaseArtifact/AuthorizeNET.xml
deleted file mode 100644
index 346f3fd..0000000
--- a/ReleaseArtifact/AuthorizeNET.xml
+++ /dev/null
@@ -1,3967 +0,0 @@
-
-
-
- AuthorizeNET
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Special case handlers
-
- validated on ????/??/?? for objects listed at the end
- should be validated after each update of AnetApiSchema.cs
- for fields/properties that are minOccurs="0" since xsd.exe
- generates "specified" property for such fields and requires
- special handling to set them seamlessly
- Make sure to update the respective controllers to call the respective request hand
-
-
-
-
- Since JAXB does not generate the class for this element, custom coding it
- @author ramittal
-
-
-
- @author ramittal
-
-
-
-
- Gets the base url
-
-
-
-
- Gets the xml base url
-
-
-
-
- Gets the card present url
-
-
-
-
- Create a custom environment with the specified base url
-
- Base url
- Xml base url
- The custom environment
-
-
-
- Create a custom environment with the specified base url
-
- Base url
- Xml base url
- Card present url
- The custom environment
-
-
-
- Reads an integer value from the environment
-
- Name of the int property to read
- Integer property value
-
-
-
- Reads a boolean value from the environment
-
- Name of the boolean property to read
- Boolean property value
-
-
-
- Reads the value from the environment
-
- Name of the property to read
- String property value
-
-
-
- Source Code from MSDN article http://msdn.microsoft.com/en-us/magazine/cc163367.aspx
-
-
-
-