private static void ValidateRequiredValue(PropertyInfo property, NewObjectParameters parameters, DependentPropertyAttribute attrib = null)
        {
            var val = property.GetValue(parameters);

            var dependentStr = attrib != null ? $" when property '{attrib.Property}' is value '{attrib.RequiredValue}'" : "";

            if (string.IsNullOrWhiteSpace(val?.ToString()))
            {
                throw new InvalidOperationException($"Property '{property.Name}' requires a value{dependentStr}, however the value was null, empty or whitespace.");
            }

            var list = val as IEnumerable;

            if (list != null && !(val is string))
            {
                var casted = list.Cast <object>().ToList();

                if (!casted.Any())
                {
                    throw new InvalidOperationException($"Property '{property.Name}' requires a value, however an empty collection was specified.");
                }

                if (casted.All(c => string.IsNullOrWhiteSpace(c?.ToString())))
                {
                    throw new InvalidOperationException($"Property '{property.Name}' requires a value, however a collection consisting of null, empty or whitespace values was specified.");
                }
            }
        }
Пример #2
0
        internal static SearchFilter[] GetFilters(int destinationId, NewObjectParameters parameters)
        {
            var filters = new List <SearchFilter>()
            {
                new SearchFilter(Property.ParentId, destinationId)
            };

            if (parameters is NewSensorParameters)
            {
                //When creating new sensors, PRTG may dynamically assign a name based on the sensor's parameters.
                //As such, we instead filter for sensors of the newly created type
                var sensorType = parameters[Parameter.SensorType];

                var str = sensorType is SensorType ? ((Enum)sensorType).EnumToXml() : sensorType?.ToString();

                if (!((NewSensorParameters)parameters).DynamicType)
                {
                    filters.Add(new SearchFilter(Property.Type, str?.ToLower() ?? string.Empty));
                }
            }
            else
            {
                filters.Add(new SearchFilter(Property.Name, parameters.Name));
            }

            return(filters.ToArray());
        }
Пример #3
0
        private void AddObjectInternal(int objectId, NewObjectParameters parameters)
        {
            var lengthLimit = RequestParser.ValidateObjectParameters(parameters);

            var internalParams = RequestParser.GetInternalNewObjectParameters(objectId, parameters);

            if (lengthLimit.Count > 0)
            {
                AddObjectWithExcessiveValue(lengthLimit, internalParams);
            }
            else
            {
                RequestEngine.ExecuteRequest(internalParams);
            }
        }
Пример #4
0
        private async Task AddObjectInternalAsync(int objectId, NewObjectParameters parameters)
        {
            var lengthLimit = RequestParser.ValidateObjectParameters(parameters);

            var internalParams = RequestParser.GetInternalNewObjectParameters(objectId, parameters);

            if (lengthLimit.Count > 0)
            {
                await AddObjectWithExcessiveValueAsync(lengthLimit, internalParams).ConfigureAwait(false);
            }
            else
            {
                await RequestEngine.ExecuteRequestAsync(internalParams).ConfigureAwait(false);
            }
        }
Пример #5
0
 internal List <T> AddAndResolveObject <T>(int destinationId, NewObjectParameters parameters,
                                           Func <SearchFilter[], List <T> > getObjects) where T : SensorOrDeviceOrGroupOrProbe
 {
     return(AddAndResolveRunner(
                () => client.AddObject(
                    destinationId,
                    parameters,
                    getObjects,
                    true,
                    DisplayResolutionError,
                    ShouldStop,
                    typeof(T) == typeof(Sensor)
                    )
                ));
 }
Пример #6
0
 internal List <T> AddAndResolveObject <T>(int destinationId, NewObjectParameters parameters,
                                           Func <SearchFilter[], List <T> > getObjects) where T : SensorOrDeviceOrGroupOrProbe
 {
     return(AddAndResolveRunner(
                () => client.AddObject(
                    new PrtgAPI.Either <IPrtgObject, int>(destinationId),
                    parameters,
                    (f, t) => getObjects(f),
                    true,
                    CancellationToken,
                    DisplayResolutionError,
                    ShouldStop,
                    typeof(T) == typeof(Sensor)
                    )
                ));
 }
Пример #7
0
        //######################################
        // AddObject
        //######################################

        internal List <T> AddObject <T>(int parentId, NewObjectParameters parameters,
                                        Func <SearchFilter[], List <T> > getObjects, bool resolve, Action <Type, int> errorCallback = null, Func <bool> shouldStop = null,
                                        bool allowMultiple = false) where T : SensorOrDeviceOrGroupOrProbe
        {
            if (resolve)
            {
                var filters = RequestParser.GetFilters(parentId, parameters);

                Action           addObjectInternal = () => AddObjectInternal(parentId, parameters);
                Func <List <T> > getObjs           = () => getObjects(filters);

                return((ResolveWithDiff(addObjectInternal, getObjs, ResponseParser.ExceptTableObject, errorCallback, shouldStop, allowMultiple)).OrderBy(o => o.Id).ToList());
            }
            else
            {
                AddObjectInternal(parentId, parameters);

                return(null);
            }
        }
Пример #8
0
        internal async Task <List <T> > AddObjectAsync <T>(int parentId, NewObjectParameters parameters,
                                                           Func <SearchFilter[], Task <List <T> > > getObjects, bool resolve, Action <Type, int> errorCallback = null, Func <bool> shouldStop = null,
                                                           bool allowMultiple = false) where T : SensorOrDeviceOrGroupOrProbe
        {
            if (resolve)
            {
                var filters = RequestParser.GetFilters(parentId, parameters);

                Func <Task> addObjectInternal = async() => await AddObjectInternalAsync(parentId, parameters).ConfigureAwait(false);

                Func <Task <List <T> > > getObjs = async() => await getObjects(filters).ConfigureAwait(false);

                return((await ResolveWithDiffAsync(addObjectInternal, getObjs, ResponseParser.ExceptTableObject, errorCallback, shouldStop, allowMultiple).ConfigureAwait(false)).OrderBy(o => o.Id).ToList());
            }
            else
            {
                await AddObjectInternalAsync(parentId, parameters).ConfigureAwait(false);

                return(null);
            }
        }
Пример #9
0
        private static void ValidateRequiredValue(PropertyInfo property, NewObjectParameters parameters, DependentPropertyAttribute attrib = null)
        {
            var val = property.GetValue(parameters);

            var dependentStr = attrib != null ? $" when property '{attrib.Name}' is value '{attrib.RequiredValue}'" : "";

            if (string.IsNullOrEmpty(val?.ToString()))
            {
                throw new InvalidOperationException($"Property '{property.Name}' requires a value{dependentStr}, however the value was null or empty.");
            }

            var list = val as IEnumerable;

            if (list != null)
            {
                var casted = list.Cast <object>();

                if (!casted.Any())
                {
                    throw new InvalidOperationException($"Property '{property.Name}' requires a value, however an empty list was specified.");
                }
            }
        }
Пример #10
0
        internal static ICommandParameters GetInternalNewObjectParameters(int deviceId, NewObjectParameters parameters)
        {
            var newParams = new CommandFunctionParameters(parameters.Function);

            foreach (var param in parameters.GetParameters())
            {
                newParams[param.Key] = param.Value;
            }

            newParams[Parameter.Id] = deviceId;

            return(newParams);
        }
Пример #11
0
        private static void ValidateDependentProperty(DependentPropertyAttribute attrib, PropertyInfo property, NewObjectParameters parameters)
        {
            var target = parameters.GetType().GetProperty(attrib.Property.ToString()).GetValue(parameters);

            if (target.ToString() == attrib.RequiredValue.ToString())
            {
                ValidateRequiredValue(property, parameters, attrib);
            }
        }
Пример #12
0
        internal static List <KeyValuePair <Parameter, object> > ValidateObjectParameters(NewObjectParameters parameters)
        {
            var propertyCaches = parameters.GetType().GetNormalProperties().ToList();

            foreach (var cache in propertyCaches)
            {
                var requireValue = cache.GetAttribute <RequireValueAttribute>();

                if (requireValue != null && requireValue.ValueRequired)
                {
                    ValidateRequiredValue(cache.Property, parameters);
                }

                var dependency = cache.GetAttribute <DependentPropertyAttribute>();

                if (dependency != null)
                {
                    ValidateDependentProperty(dependency, cache.Property, parameters);
                }
            }

            var lengthLimit = parameters.GetParameters().Where(p => p.Key.GetEnumAttribute <LengthLimitAttribute>() != null).ToList();

            return(lengthLimit);
        }
        internal static ICommandParameters GetInternalNewObjectParameters(Either <IPrtgObject, int> deviceOrId, NewObjectParameters parameters)
        {
            var newParams = new CommandFunctionParameters(parameters.Function);

            foreach (var param in parameters.GetParameters())
            {
                newParams[param.Key] = param.Value;
            }

            newParams[Parameter.Id] = deviceOrId.GetId();

            return(newParams);
        }