Beispiel #1
0
        protected override Expression VisitBinary(BinaryExpression node)
        {
            // Change equality comparisons on Version to normalized comparisons on NormalizedVersion
            if (node.NodeType == ExpressionType.Equal)
            {
                // Figure out which side is the target
                ConstantExpression constSide = (node.Left as ConstantExpression) ?? (node.Right as ConstantExpression);
                if (constSide != null && constSide.Type == typeof(string))
                {
                    MemberExpression memberSide = (node.Right as MemberExpression) ?? (node.Left as MemberExpression);
                    if (memberSide != null && memberSide.Member == _versionMember)
                    {
                        // We have a "Package.Version == <constant>" expression!

                        // Transform the constant version into a normalized version
                        string newVersion = NuGetVersionFormatter.Normalize((string)constSide.Value);

                        // Create a new expression that checks the new constant against NormalizedVersion instead
                        return(Expression.MakeBinary(
                                   ExpressionType.Equal,
                                   left: Expression.Constant(newVersion),
                                   right: Expression.MakeMemberAccess(memberSide.Expression, _normalizedVersionMember)));
                    }
                }
            }
            return(node);
        }
        private static Tuple <Target, string> ExtractComparison(BinaryExpression binExpr)
        {
            // p => <constant> == p.<property>
            if (binExpr.NodeType != ExpressionType.Equal)
            {
                return(null);
            }

            // Get the two sides, we don't care which side is left and which is right.
            ConstantExpression constSide = (binExpr.Left as ConstantExpression) ?? (binExpr.Right as ConstantExpression);

            if (constSide == null || constSide.Type != typeof(string))
            {
                return(null);
            }

            MemberExpression memberSide = (binExpr.Right as MemberExpression) ?? (binExpr.Left as MemberExpression);

            if (memberSide == null)
            {
                // That did not work... This may be Web API OData wrapping our expression
                UnaryExpression temp = binExpr.Left as UnaryExpression;
                if (temp != null)
                {
                    memberSide = temp.Operand as MemberExpression;
                }

                // Not found - for real.
                if (memberSide == null)
                {
                    return(null);
                }
            }

            // Check if it's a known member comparison
            if (memberSide.Member == NormalizedVersionMember)
            {
                return(Tuple.Create(Target.Version, (string)constSide.Value));
            }
            else if (memberSide.Member == VersionMember)
            {
                return(Tuple.Create(Target.Version, NuGetVersionFormatter.Normalize((string)constSide.Value)));
            }
            else if (memberSide.Member == IdMember)
            {
                return(Tuple.Create(Target.Id, (string)constSide.Value));
            }

            return(null);
        }
        public override void Annotate(HttpRequestMessage request, ODataEntry entry, object entityInstance)
        {
            var feedPackage = entityInstance as V2FeedPackage;

            if (feedPackage == null)
            {
                return;
            }

            // Patch links to use normalized versions
            var normalizedVersion = NuGetVersionFormatter.Normalize(feedPackage.Version);

            NormalizeNavigationLinks(entry, request, feedPackage, normalizedVersion);

            // Set Atom entry metadata
            var atomEntryMetadata = new AtomEntryMetadata();

            atomEntryMetadata.Title = feedPackage.Title;

            if (!string.IsNullOrEmpty(feedPackage.Authors))
            {
                atomEntryMetadata.Authors = new[] { new AtomPersonMetadata {
                                                        Name = feedPackage.Authors
                                                    } };
            }

            if (feedPackage.LastUpdated > DateTime.MinValue)
            {
                atomEntryMetadata.Updated = feedPackage.LastUpdated;
            }

            if (!string.IsNullOrEmpty(feedPackage.Summary))
            {
                atomEntryMetadata.Summary = feedPackage.Summary;
            }

            entry.SetAnnotation(atomEntryMetadata);

            // Add package download link
            entry.MediaResource = new ODataStreamReferenceValue
            {
                ContentType = ContentType,
                ReadLink    = BuildLinkForStreamProperty("v2", feedPackage.Id, normalizedVersion, request)
            };
        }
 public override string GetPath()
 {
     return($"{Id}/{NuGetVersionFormatter.Normalize(Version)}"
            .ToLowerInvariant());
 }