예제 #1
0
        internal OcLayerRestrictedCrudFactory(OcLayerType layerType, OcLayerConfiguration <TRequest> serviceLocator)
        {
            if (layerType == OcLayerType.Unknown || layerType == OcLayerType.Other)
            {
                throw new ArgumentOutOfRangeException(nameof(layerType));
            }
            if (serviceLocator == null)
            {
                throw new ArgumentNullException(nameof(serviceLocator));
            }

            LayerType       = layerType;
            LayerTypeName   = LayerType.ToString();
            _serviceLocator = serviceLocator;
        }
        private OcLayerBase([NotNull] IOcLayerConfiguration <TRequest> configuration, OcLayerType layerType, string layerTypeName, string resourceName, [NotNull] TRequest request)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }
            if (layerType == OcLayerType.Unknown)
            {
                throw new ArgumentOutOfRangeException(nameof(layerType), layerType, $"{nameof(layerType)} can not be {nameof(OcLayerType.Unknown)}");
            }
            if (layerType == OcLayerType.Other && string.IsNullOrWhiteSpace(layerTypeName))
            {
                throw new ArgumentOutOfRangeException(nameof(layerType), layerType, $"{nameof(layerTypeName)} must be specified for {nameof(OcLayerType.Other)}");
            }
            if (layerType != OcLayerType.Other && layerTypeName != null)
            {
                throw new ArgumentOutOfRangeException(nameof(layerType), layerType, $"{nameof(layerTypeName)} must be null unless {nameof(layerType)} is {nameof(OcLayerType.Other)}");
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (!configuration.IsAllowed(layerType, layerTypeName))
            {
                throw new ArgumentOutOfRangeException(nameof(layerType), $"Layers of LayerType [{layerType}] and LayerTypeName [{layerTypeName}] are not allowed in this systems");
            }

            InstanceId = Interlocked.Increment(ref _globalInstanceCounter);

            LayerType     = layerType;
            LayerTypeName = LayerType == OcLayerType.Other ? LayerType.ToString() : layerTypeName?.Trim();
            Debug.Assert(!string.IsNullOrWhiteSpace(LayerTypeName));

            ResourceName = DetermineResourceName(resourceName, LayerTypeName, GetType());

            Request = request;

            Factory = configuration.RestrictedFactoryCrud(LayerType, LayerTypeName);
            Debug.Assert(Factory != null);

            Log?.WriteLine($"LAYER CREATE - InstanceID [{InstanceId}] Type [{GetType().FriendlyName()}] Resource [{ResourceName}] LayerTypeName [{LayerTypeName}]");
        }
        /// <summary>
        /// Returns true if the From Layer Type is allowed to access the To Layer Type.
        /// Note that if no layer interaction restrictions have been configured then any valid layer is allowed to interact with any other valid layer.
        /// </summary>
        public bool IsAllowed(OcLayerType fromLayerType, string fromLayerTypeName, OcLayerType toLayerType, string toLayerTypeName)
        {
            if (fromLayerType == OcLayerType.Unknown || toLayerType == OcLayerType.Unknown)
            {
                return(false);
            }

            if (fromLayerType == OcLayerType.Other && string.IsNullOrWhiteSpace(fromLayerTypeName))
            {
                throw new ArgumentNullException(nameof(fromLayerTypeName));
            }
            if (toLayerType == OcLayerType.Other && string.IsNullOrWhiteSpace(toLayerTypeName))
            {
                throw new ArgumentNullException(nameof(toLayerTypeName));
            }

            if (fromLayerType != OcLayerType.Other)
            {
                fromLayerTypeName = fromLayerType.ToString();
            }
            if (toLayerType != OcLayerType.Other)
            {
                toLayerTypeName = toLayerType.ToString();
            }


            using (var readLock = _layerNameInteractions.ReadLock())
            {
                readLock.Lock();

                // If restrictions have been configured use them to answer the question
                if (_layerNameInteractions.TryGetValue(fromLayerTypeName, out var allowed))
                {
                    return(allowed?.Contains(toLayerTypeName) ?? false);
                }

                // If restrictions are not configured, assume any type of interaction is allowed (assuming the from layer type is allowed by the system).
                return(IsAllowed(fromLayerType, fromLayerTypeName) && IsAllowed(toLayerType, toLayerTypeName));
            }
        }