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()); }