/// <summary>
        /// Modifies a given QueryCriteria to exclude inactive items
        /// </summary>
        /// <typeparam name="T">Type of object to return</typeparam>
        /// <param name="criteria">QueryCriteria to adjust</param>
        /// <returns></returns>
        private static QueryCriteria ExcludeInactiveItems <T>(QueryCriteria criteria) where T : TypeProjection
        {
            PropertyPathHelper pathHelper = new PropertyPathHelper();

            pathHelper.PropertyName = "ObjectStatus";
            pathHelper.ObjectClass  = ClassConstants.GetClassIdByType <T>();

            QueryCriteriaExpression activeItemsOnly = new QueryCriteriaExpression
            {
                PropertyName = pathHelper.ToString(),
                PropertyType = QueryCriteriaPropertyType.Property,
                Operator     = QueryCriteriaExpressionOperator.Equal,
                Value        = EnumerationConstants.ConfigItem.BuiltinValues.ObjectStatus.Active.ToString("D")
            };

            QueryCriteria newCriteria = criteria;

            if (newCriteria.Expressions.Count > 0)
            {
                newCriteria.GroupingOperator = QueryCriteriaGroupingOperator.And;
            }
            else
            {
                newCriteria.GroupingOperator = QueryCriteriaGroupingOperator.SimpleExpression;
            }

            newCriteria.Expressions.Add(activeItemsOnly);

            return(newCriteria);
        }
        /// <summary>
        /// Convenience method to retrieve an object derived from the TypeProjection class, using its FullName
        /// </summary>
        /// <typeparam name="T">TypeProjection derived type</typeparam>
        /// <param name="authToken">AuthorizationToken to use</param>
        /// <param name="name">FullName to find</param>
        /// <returns></returns>
        internal static async Task <T> GetByFullName <T>(AuthorizationToken authToken, string name) where T : TypeProjection
        {
            QueryCriteriaExpression expr = new QueryCriteriaExpression
            {
                PropertyName = "FullName",
                PropertyType = QueryCriteriaPropertyType.GenericProperty,
                Operator     = QueryCriteriaExpressionOperator.Equal,
                Value        = ClassConstants.GetClassNameByType <T>() + ":" + name
            };

            QueryCriteria criteria = new QueryCriteria(TypeProjectionConstants.GetProjectionIdByType <T>())
            {
                GroupingOperator = QueryCriteriaGroupingOperator.SimpleExpression
            };

            criteria.Expressions.Add(expr);

            List <T> retList = await GetByCriteria <T>(authToken, criteria);

            if (retList.Count == 0)
            {
                return(null);
            }
            else if (retList.Count == 1)
            {
                return(retList[0]);
            }
            else
            {
                throw new CiresonApiException("More than one item found with identical full name");
            }
        }
        /// <summary>
        /// Takes a QueryCriteriaExpression and serializes it as a SimpleExpression JSON object
        /// </summary>
        /// <param name="writer">Writer to use</param>
        /// <param name="expression">QueryCriteriaExpression object to serialize</param>
        internal static void WriteSimpleExpression(JsonWriter writer, QueryCriteriaExpression expression)
        {
            writer.WritePropertyName("SimpleExpression");
            writer.WriteStartObject();

            #region ValueExpressionLeft JSON object
            {
                writer.WritePropertyName("ValueExpressionLeft");
                writer.WriteStartObject();

                #region Property/GenericProperty Property
                {
                    writer.WritePropertyName(expression.PropertyType.ToString());
                    writer.WriteValue(expression.PropertyName);
                }
                #endregion Property/GenericProperty Property

                writer.WriteEndObject();
            }
            #endregion ValueExpressionLeft JSON object

            #region Operator Property
            {
                writer.WritePropertyName("Operator");
                writer.WriteValue(expression.Operator.ToString());
            }
            #endregion Operator Property

            #region ValueExpressionRight JSON object
            {
                writer.WritePropertyName("ValueExpressionRight");
                writer.WriteStartObject();

                #region Value property
                writer.WritePropertyName("Value");
                writer.WriteValue(expression.Value);
                #endregion Value property

                writer.WriteEndObject();
            }
            #endregion ValueExpressionRight JSON object

            writer.WriteEndObject();
        }
        /// <summary>
        /// Takes a QueryCriteriaExpression and serializes it as a SimpleExpression JSON object
        /// </summary>
        /// <param name="writer">Writer to use</param>
        /// <param name="expression">QueryCriteriaExpression object to serialize</param>
        internal static void WriteSimpleExpression(JsonWriter writer, QueryCriteriaExpression expression)
        {
            writer.WritePropertyName("SimpleExpression");
            writer.WriteStartObject();

            #region ValueExpressionLeft JSON object
            {
                writer.WritePropertyName("ValueExpressionLeft");
                writer.WriteStartObject();

                #region Property/GenericProperty Property
                {
                    writer.WritePropertyName(expression.PropertyType.ToString());
                    writer.WriteValue(expression.PropertyName);
                }
                #endregion Property/GenericProperty Property

                writer.WriteEndObject();
            }
            #endregion ValueExpressionLeft JSON object

            #region Operator Property
            {
                writer.WritePropertyName("Operator");
                writer.WriteValue(expression.Operator.ToString());
            }
            #endregion Operator Property

            #region ValueExpressionRight JSON object
            {
                writer.WritePropertyName("ValueExpressionRight");
                writer.WriteStartObject();

                #region Value property
                writer.WritePropertyName("Value");
                writer.WriteValue(expression.Value);
                #endregion Value property

                writer.WriteEndObject();
            }
            #endregion ValueExpressionRight JSON object

            writer.WriteEndObject();
        }