From 55d6df4e25db3fce7031585aff715a13f0a79d1b Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Tue, 30 Aug 2022 17:51:36 -0400 Subject: [PATCH] client parameter stats changes --- .../ClientParameterHandler.swift | 57 ++++++++++--------- .../MVMCore/OtherHandlers/MVMCoreEvent.swift | 10 +--- 2 files changed, 32 insertions(+), 35 deletions(-) diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift index 8ead4e1..e64c756 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift @@ -7,16 +7,15 @@ // @objcMembers open class ClientParameterHandler: NSObject { - - var parameterHandlerList: [ClientParameterProtocol] = [] - let parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter") - let group = DispatchGroup() + + static let DefaultTimeout = 30.0 open func createParametersHandler(_ clientParameterModel: ClientParameterModelProtocol) -> ClientParameterProtocol? { do { let parameterType = try ModelRegistry.getHandler(clientParameterModel) as! ClientParameterProtocol.Type return parameterType.init(clientParameterModel) } catch { + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterNotFound(name: clientParameterModel.type)) if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) { MVMCoreLoggingHandler.addError(toLog: errorObject) } @@ -52,29 +51,29 @@ } open func getParameters(with model: ClientParameterModel, requestParameters: [String: Any], completionHandler:@escaping ([String: Any]?) -> ()) throws { - - let timeout = model.timeout ?? 30.0 - + + let parametersWorkQueue = DispatchQueue(label: "com.mva.clientparameter") + let group = DispatchGroup() + let timeout = model.timeout ?? Self.DefaultTimeout + + let parameterHandlerList = model.list.compactMap { createParametersHandler($0) } + let requestUUID = [0.. [String: AnyHashable] in + guard let parameter = element else { + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterTimeout(name: model.list[index].type, uuid: requestUUID[index])) + return parameterHandlerList[index].valueOnTimeout() + } + return parameter + }.reduce(into: [String: AnyHashable]()) { partialResult, next in + partialResult.merge(next) { first, last in first } } - return parametersList } // Setup completion handlers. Barriered to ensure one happens after the other. @@ -92,28 +91,30 @@ } // Setup timeout. - self.parametersWorkQueue.asyncAfter(deadline: .now() + .seconds(Int(timeout)), execute: timeoutWorkItem) + parametersWorkQueue.asyncAfter(deadline: .now() + .seconds(Int(timeout)), execute: timeoutWorkItem) // Setup the parameter execution. - for (index, parameterHandler) in self.parameterHandlerList.enumerated() { + for (index, parameterHandler) in parameterHandlerList.enumerated() { let parameterType = parameterHandler.clientParameterModel.type - self.group.enter() + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetching(name: parameterType, uuid: requestUUID[index])) + group.enter() parameterHandler.fetchClientParameters(requestParameters: requestParameters, timingOutIn: timeout) { (receivedParameter) in // Queue the results for merge. - self.parametersWorkQueue.async { + parametersWorkQueue.async { if (returnedList[index] != nil) { MVMCoreLoggingHandler.addError(toLog: MVMCoreErrorObject(title: nil, message: "Client parameter \(parameterType) has already executed. The completion handler should only be called once!", code: ErrorCode.default.rawValue, domain: ErrorDomainNative, location: String(describing: ClientParameterHandler.self))!) } else { + MVMCoreLoggingHandler.shared()?.logCoreEvent(.clientParameterFetchComplete(name: parameterType, uuid: requestUUID[index])) returnedList[index] = receivedParameter - self.group.leave() // Leaving is only done after setup (barriered). + group.leave() // Leaving is only done after setup (barriered). } } } } // Callback when all parameters have been merged. - self.group.notify(queue: self.parametersWorkQueue, work: completionWorkItem); + group.notify(queue: parametersWorkQueue, work: completionWorkItem); } } } diff --git a/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift b/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift index 7db315c..3d41ea5 100644 --- a/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift +++ b/MVMCore/MVMCore/OtherHandlers/MVMCoreEvent.swift @@ -56,28 +56,24 @@ public enum MVMCoreEvent { /// Could not find the client parameter specified. case clientParameterNotFound( - name: String, - pageType: String + name: String ) /// The client perameter handler was invoked and is in progress. case clientParameterFetching( name: String, - pageType: String, uuid: String ) /// The client perameter handler timed out and is returning a default value. case clientParameterTimeout( name: String, - pageType: String, uuid: String ) /// The client paramter fetch completed. - case clientParameterComplete( + case clientParameterFetchComplete( name: String, - pageType: String, uuid: String ) @@ -100,7 +96,7 @@ public enum MVMCoreEvent { case .clientParameterNotFound: return .clientParameter case .clientParameterFetching: return .clientParameter case .clientParameterTimeout: return .clientParameter - case .clientParameterComplete: return .clientParameter + case .clientParameterFetchComplete: return .clientParameter } }