Skip to content

Commit 738360b

Browse files
committed
First integration steps
1 parent 5d27a25 commit 738360b

File tree

3 files changed

+49
-17
lines changed

3 files changed

+49
-17
lines changed

src/StaticWebAssetsSdk/Tasks/Data/StaticWebAssetEndpoint.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public string AssetFile
6060
}
6161
}
6262

63-
private string SelectorsString
63+
internal string SelectorsString
6464
{
6565
get
6666
{
@@ -87,7 +87,7 @@ public StaticWebAssetEndpointSelector[] Selectors
8787
}
8888
}
8989

90-
private string ResponseHeadersString
90+
internal string ResponseHeadersString
9191
{
9292
get
9393
{
@@ -113,7 +113,7 @@ public StaticWebAssetEndpointResponseHeader[] ResponseHeaders
113113
}
114114
}
115115

116-
private string EndpointPropertiesString
116+
internal string EndpointPropertiesString
117117
{
118118
get
119119
{

src/StaticWebAssetsSdk/Tasks/FilterStaticWebAssetEndpoints.cs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,15 @@ public class FilterStaticWebAssetEndpoints : Task
2929

3030
[Output] public ITaskItem[] AssetsWithoutMatchingEndpoints { get; set; }
3131

32+
// Private fields for reusable collections and criteria
33+
private FilterCriteria[] _filterCriteria;
34+
private readonly List<StaticWebAssetEndpointProperty> _propertiesList = new();
35+
private readonly List<StaticWebAssetEndpointSelector> _selectorsList = new();
36+
private readonly List<StaticWebAssetEndpointResponseHeader> _headersList = new();
37+
3238
public override bool Execute()
3339
{
34-
var filterCriteria = (Filters ?? []).Select(FilterCriteria.FromTaskItem).ToArray();
40+
_filterCriteria = (Filters ?? []).Select(FilterCriteria.FromTaskItem).ToArray();
3541
var assetFiles = Assets != null ? StaticWebAsset.ToAssetDictionary(Assets) : [];
3642
var endpoints = StaticWebAssetEndpoint.FromItemGroup(Endpoints ?? []);
3743
var endpointFoundMatchingAsset = new Dictionary<string, StaticWebAsset>();
@@ -46,7 +52,7 @@ public override bool Execute()
4652
continue;
4753
}
4854

49-
if (MeetsAllCriteria(endpoint, asset, filterCriteria, out var failingCriteria))
55+
if (MeetsAllCriteria(endpoint, asset, out var failingCriteria))
5056
{
5157
if (asset != null && !endpointFoundMatchingAsset.ContainsKey(asset.Identity))
5258
{
@@ -73,18 +79,27 @@ public override bool Execute()
7379
return !Log.HasLoggedErrors;
7480
}
7581

76-
private static bool MeetsAllCriteria(StaticWebAssetEndpoint endpoint, StaticWebAsset asset, FilterCriteria[] filterCriteria, out FilterCriteria failingCriteria)
82+
private bool MeetsAllCriteria(
83+
StaticWebAssetEndpoint endpoint,
84+
StaticWebAsset asset,
85+
out FilterCriteria failingCriteria)
7786
{
78-
for (var i = 0; i < filterCriteria.Length; i++)
87+
for (var i = 0; i < _filterCriteria.Length; i++)
7988
{
80-
var criteria = filterCriteria[i];
89+
var criteria = _filterCriteria[i];
8190
switch (criteria.Type)
8291
{
8392
case "Property":
8493
var meetsPropertyCriteria = criteria.ExcludeOnMatch();
85-
for (var j = 0; j < endpoint.EndpointProperties.Length; j++)
94+
95+
// Parse properties from string to avoid accessing endpoint.EndpointProperties array
96+
_propertiesList.Clear();
97+
var propertiesString = endpoint.EndpointPropertiesString;
98+
StaticWebAssetEndpointProperty.PopulateFromMetadataValue(propertiesString, _propertiesList);
99+
100+
for (var j = 0; j < _propertiesList.Count; j++)
86101
{
87-
var property = endpoint.EndpointProperties[j];
102+
var property = _propertiesList[j];
88103
if (MeetsCriteria(criteria, property.Name, property.Value))
89104
{
90105
meetsPropertyCriteria = !criteria.ExcludeOnMatch();
@@ -99,9 +114,15 @@ private static bool MeetsAllCriteria(StaticWebAssetEndpoint endpoint, StaticWebA
99114
break;
100115
case "Selector":
101116
var meetsSelectorCriteria = criteria.ExcludeOnMatch();
102-
for (var j = 0; j < endpoint.Selectors.Length; j++)
117+
118+
// Parse selectors from string to avoid accessing endpoint.Selectors array
119+
_selectorsList.Clear();
120+
var selectorsString = endpoint.SelectorsString;
121+
StaticWebAssetEndpointSelector.PopulateFromMetadataValue(selectorsString, _selectorsList);
122+
123+
for (var j = 0; j < _selectorsList.Count; j++)
103124
{
104-
var selector = endpoint.Selectors[j];
125+
var selector = _selectorsList[j];
105126
if (MeetsCriteria(criteria, selector.Name, selector.Value))
106127
{
107128
meetsSelectorCriteria = !criteria.ExcludeOnMatch();
@@ -116,9 +137,15 @@ private static bool MeetsAllCriteria(StaticWebAssetEndpoint endpoint, StaticWebA
116137
break;
117138
case "Header":
118139
var meetsHeaderCriteria = criteria.ExcludeOnMatch();
119-
for (var j = 0; j < endpoint.ResponseHeaders.Length; j++)
140+
141+
// Parse headers from string to avoid accessing endpoint.ResponseHeaders array
142+
_headersList.Clear();
143+
var headersString = endpoint.ResponseHeadersString;
144+
StaticWebAssetEndpointResponseHeader.PopulateFromMetadataValue(headersString, _headersList);
145+
146+
for (var j = 0; j < _headersList.Count; j++)
120147
{
121-
var header = endpoint.ResponseHeaders[j];
148+
var header = _headersList[j];
122149
if (MeetsCriteria(criteria, header.Name, header.Value))
123150
{
124151
meetsHeaderCriteria = !criteria.ExcludeOnMatch();

src/StaticWebAssetsSdk/Tasks/GenerateStaticWebAssetEndpointsPropsFile.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Security.Cryptography;
77
using System.Xml;
88
using Microsoft.Build.Framework;
9+
using Microsoft.NET.Sdk.StaticWebAssets.Tasks.Utils;
910

1011
namespace Microsoft.AspNetCore.StaticWebAssets.Tasks;
1112

@@ -51,12 +52,16 @@ private bool ExecuteCore(StaticWebAssetEndpoint[] endpoints, Dictionary<string,
5152
var path = asset.ReplaceTokens(asset.RelativePath, StaticWebAssetTokenResolver.Instance);
5253
var fullPathExpression = $"""$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\{StaticWebAsset.Normalize(PackagePathPrefix)}\{StaticWebAsset.Normalize(path).Replace("/", "\\")}'))""";
5354

55+
// Use internal string properties directly to avoid allocations
56+
var selectorsXml = element.SelectorsString ?? "";
57+
var headersXml = element.ResponseHeadersString ?? "";
58+
var propertiesXml = element.EndpointPropertiesString ?? "";
5459
itemGroup.Add(new XElement(nameof(StaticWebAssetEndpoint),
5560
new XAttribute("Include", element.Route),
5661
new XElement(nameof(StaticWebAssetEndpoint.AssetFile), fullPathExpression),
57-
new XElement(nameof(StaticWebAssetEndpoint.Selectors), new XCData(StaticWebAssetEndpointSelector.ToMetadataValue(element.Selectors))),
58-
new XElement(nameof(StaticWebAssetEndpoint.EndpointProperties), new XCData(StaticWebAssetEndpointProperty.ToMetadataValue(element.EndpointProperties))),
59-
new XElement(nameof(StaticWebAssetEndpoint.ResponseHeaders), new XCData(StaticWebAssetEndpointResponseHeader.ToMetadataValue(element.ResponseHeaders)))));
62+
new XElement(nameof(StaticWebAssetEndpoint.Selectors), new XCData(selectorsXml)),
63+
new XElement(nameof(StaticWebAssetEndpoint.EndpointProperties), new XCData(propertiesXml)),
64+
new XElement(nameof(StaticWebAssetEndpoint.ResponseHeaders), new XCData(headersXml))));
6065
}
6166

6267
var document = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));

0 commit comments

Comments
 (0)