/// <summary> /// Returns true if this registration matches the application /// model provided. /// </summary> /// <param name="registration"></param> /// <param name="model"></param> /// <returns></returns> public static bool Matches(this ApplicationRegistration registration, ApplicationInfoModel model) { if (registration == null) { return(model == null); } return(model != null && registration.ApplicationId == model.ApplicationId && registration.ApplicationType == model.ApplicationType && registration.ApplicationUri == model.ApplicationUri && registration.HostAddresses.DecodeAsList().SequenceEqualsSafe( model.HostAddresses) && registration.CreateAuthorityId == model.Created?.AuthorityId && registration.UpdateAuthorityId == model.Updated?.AuthorityId && registration.CreateTime == model.Created?.Time && registration.UpdateTime == model.Updated?.Time && registration.DiscoveryProfileUri == model.DiscoveryProfileUri && registration.GatewayServerUri == model.GatewayServerUri && registration.NotSeenSince == model.NotSeenSince && registration.DiscovererId == model.DiscovererId && registration.SiteId == model.SiteId && registration.Capabilities.DecodeAsSet().SetEqualsSafe( model.Capabilities?.Select(x => JTokenEx.SanitizePropertyName(x).ToUpperInvariant())) && registration.DiscoveryUrls.DecodeAsList().SequenceEqualsSafe( model.DiscoveryUrls) && registration.Certificate.DecodeAsByteArray().SequenceEqualsSafe( model.Certificate)); }
/// <summary> /// Deep clone /// </summary> /// <param name="model"></param> /// <returns></returns> public static ApplicationInfoModel Clone(this ApplicationInfoModel model) { if (model == null) { return(null); } return(new ApplicationInfoModel { ApplicationId = model.ApplicationId, ApplicationName = model.ApplicationName, Locale = model.Locale, LocalizedNames = model.LocalizedNames? .ToDictionary(k => k.Key, v => v.Value), ApplicationType = model.ApplicationType, ApplicationUri = model.ApplicationUri, Capabilities = model.Capabilities .ToHashSetSafe(), DiscoveryProfileUri = model.DiscoveryProfileUri, HostAddresses = model.HostAddresses .ToHashSetSafe(), DiscoveryUrls = model.DiscoveryUrls .ToHashSetSafe(), NotSeenSince = model.NotSeenSince, ProductUri = model.ProductUri, SiteId = model.SiteId, GatewayServerUri = model.GatewayServerUri, Created = model.Created.Clone(), Updated = model.Updated.Clone(), DiscovererId = model.DiscovererId }); }
/// <summary> /// Decode tags and property into registration object /// </summary> /// <param name="model"></param> /// <param name="disabled"></param> /// <param name="etag"></param> /// <param name="recordId"></param> /// <returns></returns> public static ApplicationRegistration ToApplicationRegistration( this ApplicationInfoModel model, bool?disabled = null, string etag = null, uint?recordId = null) { if (model == null) { throw new ArgumentNullException(nameof(model)); } return(new ApplicationRegistration { IsDisabled = disabled, DiscovererId = model.DiscovererId, Etag = etag, RecordId = recordId, SiteId = model.SiteId, ApplicationName = model.ApplicationName, Locale = model.Locale, LocalizedNames = model.LocalizedNames, HostAddresses = model.HostAddresses?.ToList().EncodeAsDictionary(), ApplicationType = model.ApplicationType, ApplicationUri = model.ApplicationUri, ProductUri = model.ProductUri, NotSeenSince = model.NotSeenSince, DiscoveryProfileUri = model.DiscoveryProfileUri, GatewayServerUri = model.GatewayServerUri, Capabilities = model.Capabilities.EncodeAsDictionary(true), Certificate = model.Certificate.EncodeAsDictionary(), Thumbprint = model.Certificate.ToSha1Hash(), DiscoveryUrls = model.DiscoveryUrls?.ToList().EncodeAsDictionary(), CreateAuthorityId = model.Created?.AuthorityId, CreateTime = model.Created?.Time, UpdateAuthorityId = model.Updated?.AuthorityId, UpdateTime = model.Updated?.Time, Connected = false }); }
/// <summary> /// Convert to document model /// </summary> /// <returns></returns> public static ApplicationDocument ToDocumentModel( this ApplicationInfoModel model, string etag = null) { var document = new ApplicationDocument { ID = 0, ApplicationState = model.State, ApplicationId = model.ApplicationId, ApplicationUri = model.ApplicationUri, ApplicationName = model.ApplicationName ?? model.LocalizedNames.FirstOrDefault().Value, ApplicationType = model.ApplicationType, SiteId = model.SiteId, ApplicationNames = GetLocalizedText(model.LocalizedNames), ProductUri = model.ProductUri, DiscoveryUrls = model.DiscoveryUrls?.ToArray(), ServerCapabilities = GetServerCapabilitiesAsString(model.Capabilities), GatewayServerUri = model.GatewayServerUri, DiscoveryProfileUri = model.DiscoveryProfileUri, UpdateTime = model.Updated?.Time, NotSeenSince = model.NotSeenSince, CreateTime = model.Created?.Time, ApproveTime = model.Approved?.Time, UpdateAuthorityId = model.Updated?.AuthorityId, CreateAuthorityId = model.Created?.AuthorityId, ApproveAuthorityId = model.Approved?.AuthorityId, ETag = etag }; document.Validate(); return(document); }
/// <summary> /// Returns the site or supervisor id /// </summary> /// <param name="model"></param> /// <returns></returns> public static string GetSiteOrGatewayId(this ApplicationInfoModel model) { if (string.IsNullOrEmpty(model.SiteId)) { return(model.DiscovererId); } return(model.SiteId); }
/// <summary> /// Returns the site or supervisor id /// </summary> /// <param name="model"></param> /// <returns></returns> public static string GetSiteOrSupervisorId(this ApplicationInfoModel model) { if (string.IsNullOrEmpty(model.SiteId)) { return(model.SupervisorId); } return(model.SiteId); }
/// <summary> /// Returns an application name from either application name field or /// localized text dictionary /// </summary> /// <param name="model">The application model.</param> public static string GetApplicationName(this ApplicationInfoModel model) { if (!string.IsNullOrWhiteSpace(model.ApplicationName)) { return(model.ApplicationName); } return(model.LocalizedNames? .FirstOrDefault(n => !string.IsNullOrWhiteSpace(n.Value)).Value); }
/// <summary> /// Patch application /// </summary> /// <param name="application"></param> /// <param name="request"></param> public static ApplicationInfoModel Patch(this ApplicationInfoModel application, ApplicationRegistrationUpdateModel request) { // Update from update request if (request.ApplicationName != null) { application.ApplicationName = string.IsNullOrEmpty(request.ApplicationName) ? null : request.ApplicationName; } if (request.LocalizedNames != null) { application.LocalizedNames = request.LocalizedNames; } if (request.ProductUri != null) { application.ProductUri = string.IsNullOrEmpty(request.ProductUri) ? null : request.ProductUri; } if (request.GatewayServerUri != null) { application.GatewayServerUri = string.IsNullOrEmpty(request.GatewayServerUri) ? null : request.GatewayServerUri; } if (request.Certificate != null) { application.Certificate = request.Certificate.Length == 0 ? null : request.Certificate; } if (request.Capabilities != null) { application.Capabilities = request.Capabilities.Count == 0 ? null : request.Capabilities; } if (request.DiscoveryUrls != null) { application.DiscoveryUrls = request.DiscoveryUrls.Count == 0 ? null : request.DiscoveryUrls; } if (request.Locale != null) { application.Locale = string.IsNullOrEmpty(request.Locale) ? null : request.Locale; } if (request.DiscoveryProfileUri != null) { application.DiscoveryProfileUri = string.IsNullOrEmpty(request.DiscoveryProfileUri) ? null : request.DiscoveryProfileUri; } return(application); }
/// <summary> /// Equality comparison /// </summary> /// <param name="model"></param> /// <param name="that"></param> /// <returns></returns> public static bool IsSameAs(this ApplicationInfoModel model, ApplicationInfoModel that) { if (model == that) { return(true); } if (model == null || that == null) { return(false); } return (that.ApplicationUri == model.ApplicationUri && that.ApplicationType == model.ApplicationType); }
/// <summary> /// Create unique application id /// </summary> /// <param name="model"></param> /// <returns></returns> public static string CreateApplicationId(ApplicationInfoModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var siteOrGatewayId = model.SiteId; if (siteOrGatewayId == null && model.DiscovererId != null) { siteOrGatewayId = DiscovererModelEx.ParseDeviceId(model.DiscovererId, out _); } return(CreateApplicationId(siteOrGatewayId, model.ApplicationUri, model.ApplicationType)); }
/// <summary> /// Convert to Update model /// </summary> /// <param name="model"></param> /// <param name="context"></param> /// <returns></returns> public static ApplicationRegistrationUpdateModel ToUpdateRequest( this ApplicationInfoModel model, RegistryOperationContextModel context = null) { return(new ApplicationRegistrationUpdateModel { ApplicationName = model.ApplicationName, Capabilities = model.Capabilities, DiscoveryProfileUri = model.DiscoveryProfileUri, DiscoveryUrls = model.DiscoveryUrls, GatewayServerUri = model.GatewayServerUri, LocalizedNames = model.LocalizedNames, ProductUri = model.ProductUri, Locale = model.Locale, Context = context }); }
/// <summary> /// Convert to registration request /// </summary> /// <param name="model"></param> /// <param name="context"></param> /// <returns></returns> public static ApplicationRegistrationRequestModel ToRegistrationRequest( this ApplicationInfoModel model, RegistryOperationContextModel context = null) { return(new ApplicationRegistrationRequestModel { ApplicationName = model.ApplicationName, ApplicationType = model.ApplicationType, Capabilities = model.Capabilities, ApplicationUri = model.ApplicationUri, Certificate = model.Certificate, DiscoveryProfileUri = model.DiscoveryProfileUri, DiscoveryUrls = model.DiscoveryUrls, GatewayServerUri = model.GatewayServerUri, LocalizedNames = model.LocalizedNames, ProductUri = model.ProductUri, SiteId = model.SiteId, Context = context }); }
/// <summary> /// Patch application /// </summary> /// <param name="application"></param> /// <param name="model"></param> public static ApplicationInfoModel Patch(this ApplicationInfoModel application, ApplicationInfoModel model) { application.ApplicationId = model.ApplicationId; application.ApplicationName = model.ApplicationName; application.LocalizedNames = model.LocalizedNames; application.ApplicationType = model.ApplicationType; application.ApplicationUri = model.ApplicationUri; application.Capabilities = model.Capabilities; application.DiscoveryProfileUri = model.DiscoveryProfileUri; application.HostAddresses = model.HostAddresses; application.DiscoveryUrls = model.DiscoveryUrls; application.NotSeenSince = model.NotSeenSince; application.ProductUri = model.ProductUri; application.SiteId = model.SiteId; application.DiscovererId = model.DiscovererId; application.GatewayServerUri = model.GatewayServerUri; application.Created = model.Created; application.Updated = model.Updated; application.Locale = model.Locale; return(application); }
/// <summary> /// Deep clone /// </summary> /// <param name="model"></param> /// <returns></returns> public static ApplicationInfoModel Clone(this ApplicationInfoModel model) { if (model == null) { return(null); } return(new ApplicationInfoModel { ApplicationId = model.ApplicationId, ApplicationName = model.ApplicationName, Locale = model.Locale, ApplicationType = model.ApplicationType, ApplicationUri = model.ApplicationUri, Capabilities = model.Capabilities.ToHashSetSafe(), Certificate = model.Certificate, DiscoveryProfileUri = model.DiscoveryProfileUri, HostAddresses = model.HostAddresses.ToHashSetSafe(), DiscoveryUrls = model.DiscoveryUrls.ToHashSetSafe(), NotSeenSince = model.NotSeenSince, ProductUri = model.ProductUri, SiteId = model.SiteId, SupervisorId = model.SupervisorId }); }
/// <summary> /// Create unique application id /// </summary> /// <param name="model"></param> /// <returns></returns> public static string CreateApplicationId(ApplicationInfoModel model) => CreateApplicationId(model.SiteId ?? model.SupervisorId, model.ApplicationUri, model.ApplicationType);