/// <summary>
        ///     A data processor has access to source data cookers, composite data cookers, as well as other
        ///     data processors.
        /// </summary>
        /// <param name="dataProcessorId">
        ///     Identifies the data processor.
        /// </param>
        /// <returns>
        ///     A set of data uniquely tailored to this data processor.
        /// </returns>
        public IDataExtensionRetrieval CreateDataRetrievalForDataProcessor(
            DataProcessorId dataProcessorId)
        {
            var filteredData = this.dataRetrievalCache.GetDataProcessorFilteredData(dataProcessorId);

            if (filteredData != null)
            {
                return(filteredData);
            }

            var dataProcessorReference = this.DataExtensionRepository.GetDataProcessorReference(dataProcessorId);

            if (dataProcessorReference == null)
            {
                throw new ArgumentException("Data retrieval requested for data processor not found in repository.");
            }

            if (dataProcessorReference.Availability != DataExtensionAvailability.Available)
            {
                throw new ArgumentException("Data retrieval requested for data processor that is not available.");
            }

            filteredData = new FilteredDataRetrieval(this, dataProcessorReference.DependencyReferences);

            this.dataRetrievalCache.AddDataProcessorFilteredData(dataProcessorId, filteredData);

            return(filteredData);
        }
        /// <inheritdoc/>
        public object QueryDataProcessor(DataProcessorId dataProcessorId)
        {
            Guard.NotNull(dataProcessorId, nameof(dataProcessorId));

            if (!this.extensionDependencies.RequiredDataProcessorIds.Contains(dataProcessorId))
            {
                throw new ArgumentException(
                          $"The requested data processor is not available: {dataProcessorId}. " +
                          "Consider adding it to the requirements for this data extension.",
                          nameof(dataProcessorId));
            }

            var processorReference = this.dataRetrievalFactory.DataExtensionRepository.GetDataProcessorReference(dataProcessorId);

            if (processorReference == null)
            {
                throw new InvalidOperationException(
                          $"Failed to retrieve a reference to data processor: {dataProcessorId}.");
            }

            var processorDataRetrieval =
                this.dataRetrievalFactory.CreateDataRetrievalForDataProcessor(dataProcessorId);

            return(processorReference.GetOrCreateInstance(processorDataRetrieval));
        }
        internal void AddDataProcessorFilteredData(DataProcessorId dataProcessorId, IDataExtensionRetrieval data)
        {
            Debug.Assert(data != null, nameof(data));

            lock (this.processorCacheLock)
            {
                this.dataProcessorCache[dataProcessorId] = new System.WeakReference <IDataExtensionRetrieval>(data);
            }
        }
        public IDataProcessorReference GetDataProcessorReference(DataProcessorId dataProcessorId)
        {
            if (this.dataProcessorsById.TryGetValue(dataProcessorId, out var processorReference))
            {
                return(processorReference);
            }

            return(this.getDataProcessor?.Invoke(dataProcessorId));
        }
        internal IDataExtensionRetrieval GetDataProcessorFilteredData(DataProcessorId dataProcessorId)
        {
            lock (this.processorCacheLock)
            {
                if (this.dataProcessorCache.TryGetValue(dataProcessorId, out var filteredDataReference))
                {
                    if (filteredDataReference.TryGetTarget(out var filteredData))
                    {
                        return(filteredData);
                    }
                }
            }

            return(null);
        }
Esempio n. 6
0
 /// <summary>
 ///     Specifies the given
 ///     data processor as required for this extension.
 /// </summary>
 /// <param name="cookerPath">
 ///     The cooker path.
 /// </param>
 protected void AddRequiredDataProcessor(DataProcessorId processorId)
 {
     this.requiredDataProcessors.Add(processorId);
 }
Esempio n. 7
0
 public void AddRequiredDataProcessorId(DataProcessorId dataProcessorId)
 {
     this.requiredDataProcessorIds.Add(dataProcessorId);
 }
 public IDataProcessorReference GetDataProcessorReference(DataProcessorId dataProcessorId)
 {
     return(this.dataProcessors.FirstOrDefault(reference =>
                                               StringComparer.Ordinal.Equals(reference.Id, dataProcessorId)));
 }