Skip to content

Commit 520737f

Browse files
committed
Binding refactor cleanup
1 parent b71378d commit 520737f

File tree

7 files changed

+138
-192
lines changed

7 files changed

+138
-192
lines changed

src/WebJobs.Script/Binding/ExtensionBinding.cs

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
using System.Reflection;
1010
using System.Reflection.Emit;
1111
using System.Threading.Tasks;
12-
using Microsoft.Azure.WebJobs.Host.Bindings.Path;
1312
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;
1413
using Microsoft.Azure.WebJobs.Script.Description;
1514
using Microsoft.Azure.WebJobs.Script.Extensibility;
@@ -54,11 +53,14 @@ public override async Task BindAsync(BindingContext context)
5453
RuntimeBindingContext runtimeContext = new RuntimeBindingContext(attribute, additionalAttributes);
5554

5655
// TEMP: We'll be doing away with this IBinder code
57-
// So for now we don't support binding parameters for Non C#
5856
if (_binding.DefaultType == typeof(IAsyncCollector<byte[]>))
5957
{
6058
await BindAsyncCollectorAsync<byte[]>(context, runtimeContext);
6159
}
60+
else if (_binding.DefaultType == typeof(IAsyncCollector<JObject>))
61+
{
62+
await BindAsyncCollectorAsync<JObject>(context, runtimeContext);
63+
}
6264
else if (_binding.DefaultType == typeof(Stream))
6365
{
6466
await BindStreamAsync(context, Access, runtimeContext);
@@ -71,10 +73,6 @@ public override async Task BindAsync(BindingContext context)
7173
context.Value = result;
7274
}
7375
}
74-
else if (_binding.DefaultType == typeof(IAsyncCollector<JObject>))
75-
{
76-
await BindAsyncCollectorAsync<JObject>(context, runtimeContext);
77-
}
7876
}
7977

8078
// TEMP - Since we're still using IBinder for non C#, we have to construct the Attributes
@@ -128,28 +126,6 @@ private Collection<Attribute> ResolveAttributes(Collection<Attribute> attributes
128126
return resolvedAttributes;
129127
}
130128

131-
// TEMP - This code will go away when the Invoker work is done
132-
private string ResolveAndBind(string value, IReadOnlyDictionary<string, string> bindingData)
133-
{
134-
BindingTemplate template = BindingTemplate.FromString(value);
135-
136-
string boundValue = value;
137-
if (bindingData != null)
138-
{
139-
if (template != null)
140-
{
141-
boundValue = template.Bind(bindingData);
142-
}
143-
}
144-
145-
if (!string.IsNullOrEmpty(value))
146-
{
147-
boundValue = Resolve(boundValue);
148-
}
149-
150-
return boundValue;
151-
}
152-
153129
internal class AttributeBuilderInfo
154130
{
155131
public ConstructorInfo Constructor { get; set; }

src/WebJobs.Script/Binding/FunctionBinding.cs

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@ internal static Collection<FunctionBinding> GetBindings(ScriptHostConfiguration
6464
break;
6565
default:
6666
FunctionBinding binding = null;
67-
if (bindingMetadata.Raw == null)
68-
{
69-
// TEMP: This conversion is only here to keep unit tests passing
70-
bindingMetadata.Raw = JObject.FromObject(bindingMetadata);
71-
}
7267
if (TryParseFunctionBinding(config, bindingMetadata.Raw, out binding))
7368
{
7469
bindings.Add(binding);
@@ -86,9 +81,6 @@ private static bool TryParseFunctionBinding(ScriptHostConfiguration config, Newt
8681
functionBinding = null;
8782

8883
ScriptBindingContext bindingContext = new ScriptBindingContext(metadata);
89-
string type = bindingContext.Type;
90-
string name = (string)metadata.GetValue("name", StringComparison.OrdinalIgnoreCase);
91-
string direction = (string)metadata.GetValue("direction", StringComparison.OrdinalIgnoreCase);
9284
ScriptBinding scriptBinding = null;
9385
foreach (var provider in config.BindingProviders)
9486
{
@@ -103,29 +95,20 @@ private static bool TryParseFunctionBinding(ScriptHostConfiguration config, Newt
10395
return false;
10496
}
10597

106-
// TEMP: remove the need for this
107-
BindingMetadata bindingMetadata = new BindingMetadata
108-
{
109-
Name = name,
110-
Type = type,
111-
Direction = (BindingDirection)Enum.Parse(typeof(BindingDirection), direction, true)
112-
};
113-
98+
BindingMetadata bindingMetadata = BindingMetadata.Create(metadata);
11499
functionBinding = new ExtensionBinding(config, scriptBinding, bindingMetadata);
115100

116101
return true;
117102
}
118103

119-
protected string ResolveBindingTemplate(string value, BindingTemplate bindingTemplate, IReadOnlyDictionary<string, string> bindingData)
104+
protected string ResolveAndBind(string value, IReadOnlyDictionary<string, string> bindingData)
120105
{
121-
string boundValue = value;
106+
BindingTemplate template = BindingTemplate.FromString(value);
122107

123-
if (bindingData != null)
108+
string boundValue = value;
109+
if (bindingData != null && template != null)
124110
{
125-
if (bindingTemplate != null)
126-
{
127-
boundValue = bindingTemplate.Bind(bindingData);
128-
}
111+
boundValue = template.Bind(bindingData);
129112
}
130113

131114
if (!string.IsNullOrEmpty(value))

src/WebJobs.Script/Description/Binding/BindingMetadata.cs

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Globalization;
6+
using System.Linq;
7+
using Microsoft.Azure.WebJobs.Host;
58
using Newtonsoft.Json;
69
using Newtonsoft.Json.Converters;
710
using Newtonsoft.Json.Linq;
@@ -13,6 +16,84 @@ namespace Microsoft.Azure.WebJobs.Script.Description
1316
/// </summary>
1417
public class BindingMetadata
1518
{
19+
/// <summary>
20+
/// Creates an instance from the specified raw metadata.
21+
/// </summary>
22+
/// <param name="raw">The raw binding metadata.</param>
23+
/// <param name="nameResolver">Optional name resolver to use on properties.</param>
24+
/// <returns>The new <see cref="BindingMetadata"/> instance.</returns>
25+
public static BindingMetadata Create(JObject raw, INameResolver nameResolver = null)
26+
{
27+
BindingMetadata bindingMetadata = null;
28+
string bindingDirectionValue = (string)raw["direction"];
29+
string connection = (string)raw["connection"];
30+
string bindingType = (string)raw["type"];
31+
BindingDirection bindingDirection = default(BindingDirection);
32+
33+
if (!string.IsNullOrEmpty(bindingDirectionValue) &&
34+
!Enum.TryParse<BindingDirection>(bindingDirectionValue, true, out bindingDirection))
35+
{
36+
throw new FormatException(string.Format(CultureInfo.InvariantCulture, "'{0}' is not a valid binding direction.", bindingDirectionValue));
37+
}
38+
39+
// TODO: Validate the binding type somehow?
40+
41+
if (!string.IsNullOrEmpty(connection) &&
42+
string.IsNullOrEmpty(Utility.GetAppSettingOrEnvironmentValue(connection)))
43+
{
44+
throw new FormatException("Invalid Connection value specified.");
45+
}
46+
47+
switch (bindingType.ToLowerInvariant())
48+
{
49+
case "httptrigger":
50+
bindingMetadata = raw.ToObject<HttpTriggerBindingMetadata>();
51+
break;
52+
case "http":
53+
bindingMetadata = raw.ToObject<HttpBindingMetadata>();
54+
break;
55+
case "table":
56+
bindingMetadata = raw.ToObject<TableBindingMetadata>();
57+
break;
58+
case "manualtrigger":
59+
bindingMetadata = raw.ToObject<BindingMetadata>();
60+
break;
61+
default:
62+
bindingMetadata = raw.ToObject<BindingMetadata>();
63+
break;
64+
}
65+
66+
bindingMetadata.Type = bindingType;
67+
bindingMetadata.Direction = bindingDirection;
68+
bindingMetadata.Connection = connection;
69+
70+
if (nameResolver != null)
71+
{
72+
nameResolver.ResolveAllProperties(bindingMetadata);
73+
74+
// We want to pass resolved metadata values into
75+
// binding extensions, so we resolve fully here
76+
JObject resolved = new JObject(raw);
77+
foreach (JProperty property in resolved.Properties().ToArray())
78+
{
79+
if (property.Value != null &&
80+
property.Value.Type == JTokenType.String)
81+
{
82+
string val = (string)property.Value;
83+
string newVal = nameResolver.ResolveWholeString(val);
84+
resolved[property.Name] = newVal;
85+
}
86+
}
87+
bindingMetadata.Raw = resolved;
88+
}
89+
else
90+
{
91+
bindingMetadata.Raw = raw;
92+
}
93+
94+
return bindingMetadata;
95+
}
96+
1697
/// <summary>
1798
/// Gets or sets the name of the binding.
1899
/// </summary>
@@ -51,7 +132,10 @@ public bool IsTrigger
51132
}
52133
}
53134

54-
// TEMP
135+
/// <summary>
136+
/// Gets the raw binding metadata (after name resolution has been applied
137+
/// to all values).
138+
/// </summary>
55139
public JObject Raw { get; set; }
56140
}
57141
}

src/WebJobs.Script/Description/FunctionDescriptorProvider.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,6 @@ protected virtual ParameterDescriptor CreateTriggerParameter(BindingMetadata tri
120120
triggerParameter = ParseManualTrigger(triggerMetadata, parameterType ?? typeof(string));
121121
break;
122122
default:
123-
if (triggerMetadata.Raw == null)
124-
{
125-
// TEMP: This conversion is only here to keep unit tests passing
126-
triggerMetadata.Raw = JObject.FromObject(triggerMetadata);
127-
}
128123
TryParseTriggerParameter(triggerMetadata.Raw, out triggerParameter, parameterType);
129124
break;
130125
}

src/WebJobs.Script/Host/ScriptHost.cs

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ private static FunctionMetadata ParseFunctionMetadata(string functionName, IName
390390
{
391391
foreach (JObject binding in bindingArray)
392392
{
393-
BindingMetadata bindingMetadata = ParseBindingMetadata(binding, nameResolver);
393+
BindingMetadata bindingMetadata = BindingMetadata.Create(binding, nameResolver);
394394
functionMetadata.Bindings.Add(bindingMetadata);
395395
if (bindingMetadata.IsTrigger)
396396
{
@@ -409,72 +409,6 @@ private static FunctionMetadata ParseFunctionMetadata(string functionName, IName
409409
return functionMetadata;
410410
}
411411

412-
private static BindingMetadata ParseBindingMetadata(JObject binding, INameResolver nameResolver)
413-
{
414-
BindingMetadata bindingMetadata = null;
415-
string bindingDirectionValue = (string)binding["direction"];
416-
string connection = (string)binding["connection"];
417-
string bindingType = (string)binding["type"];
418-
BindingDirection bindingDirection = default(BindingDirection);
419-
420-
if (!string.IsNullOrEmpty(bindingDirectionValue) &&
421-
!Enum.TryParse<BindingDirection>(bindingDirectionValue, true, out bindingDirection))
422-
{
423-
throw new FormatException(string.Format(CultureInfo.InvariantCulture, "'{0}' is not a valid binding direction.", bindingDirectionValue));
424-
}
425-
426-
// TODO: Validate the binding type somehow?
427-
428-
if (!string.IsNullOrEmpty(connection) &&
429-
string.IsNullOrEmpty(Utility.GetAppSettingOrEnvironmentValue(connection)))
430-
{
431-
throw new FormatException("Invalid Connection value specified.");
432-
}
433-
434-
switch (bindingType.ToLowerInvariant())
435-
{
436-
case "httptrigger":
437-
bindingMetadata = binding.ToObject<HttpTriggerBindingMetadata>();
438-
break;
439-
case "http":
440-
bindingMetadata = binding.ToObject<HttpBindingMetadata>();
441-
break;
442-
case "table":
443-
bindingMetadata = binding.ToObject<TableBindingMetadata>();
444-
break;
445-
case "manualtrigger":
446-
bindingMetadata = binding.ToObject<BindingMetadata>();
447-
break;
448-
default:
449-
// TEMP - Still require a BindingMetadata until refactoring is complete
450-
bindingMetadata = binding.ToObject<BindingMetadata>();
451-
break;
452-
}
453-
454-
bindingMetadata.Type = bindingType;
455-
bindingMetadata.Direction = bindingDirection;
456-
bindingMetadata.Connection = connection;
457-
458-
nameResolver.ResolveAllProperties(bindingMetadata);
459-
460-
// TEMP - We want to pass resolved metadata values into
461-
// binding extensions
462-
JObject resolved = new JObject(binding);
463-
foreach (JProperty property in resolved.Properties().ToArray())
464-
{
465-
if (property.Value != null &&
466-
property.Value.Type == JTokenType.String)
467-
{
468-
string val = (string)property.Value;
469-
string newVal = nameResolver.ResolveWholeString(val);
470-
resolved[property.Name] = newVal;
471-
}
472-
}
473-
bindingMetadata.Raw = resolved;
474-
475-
return bindingMetadata;
476-
}
477-
478412
private Collection<FunctionDescriptor> ReadFunctions(ScriptHostConfiguration config, IEnumerable<FunctionDescriptorProvider> descriptorProviders)
479413
{
480414
string scriptRootPath = config.RootScriptPath;

0 commit comments

Comments
 (0)