Skip to content

Commit

Permalink
Update Json provider to support schema and hierarchy
Browse files Browse the repository at this point in the history
  • Loading branch information
Paul Schaeflein committed Nov 17, 2022
1 parent e0e0e24 commit 41d1e30
Show file tree
Hide file tree
Showing 14 changed files with 1,199 additions and 107 deletions.
85 changes: 85 additions & 0 deletions src/lib/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@

[*.{cs,vb}]
#### Naming styles ####

# Naming rules

dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case

# Symbol specifications

dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =

dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =

# Naming styles

dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case

dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_namespace_match_folder = true:suggestion

[*.cs]
csharp_indent_labels = one_less_than_current
csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent
csharp_style_namespace_declarations = block_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_throw_expression = true:suggestion
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ public void CanHandleDomainObjectWithJsonFormatter()
{
using (Stream _formattedTemplate = new FileStream(this._provisioningTemplatePath7, FileMode.Open, FileAccess.Read, FileShare.Read))
{
ITemplateFormatter formatter = new JsonPnPFormatter();
ITemplateFormatter formatter = new JsonPnPSchemaFormatter();

JsonTemplateProvider provider =
new JsonFileSystemTemplateProvider(
Expand Down
5 changes: 3 additions & 2 deletions src/lib/PnP.Framework.sln
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30503.244
# Visual Studio Version 17
VisualStudioVersion = 17.4.33110.190
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C3C026AD-0B78-4779-9DC4-F875B42A48F4}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
CHANGELOG.md = CHANGELOG.md
EndProjectSection
EndProject
Expand Down
4 changes: 4 additions & 0 deletions src/lib/PnP.Framework/PnP.Framework.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -304,4 +304,8 @@
<Folder Include="Provisioning\Providers\Xml\Serializers\V202209\" />
</ItemGroup>

<ItemGroup>
<EditorConfigFiles Remove=".editorconfig" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PnP.Framework.Provisioning.Model;
using PnP.Framework.Provisioning.Providers.Xml;
using System;

namespace PnP.Framework.Provisioning.Providers.Json.Converters
{
public class SiteCollectionsAndSitesConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
var siteTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.SiteCollection, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
var siteType = Type.GetType(siteTypeName, true);
return siteType.IsAssignableFrom(objectType);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Define the specific source schema types
var communicationSiteTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.CommunicationSite, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
var communicationSiteType = Type.GetType(communicationSiteTypeName, true);
var teamSiteTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.TeamSite, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
var teamSiteType = Type.GetType(teamSiteTypeName, true);
var teamSiteNoGroupTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.TeamSiteNoGroup, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
var teamSiteNoGroupType = Type.GetType(teamSiteNoGroupTypeName, true);
var teamSubSiteNoGroupTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.TeamSubSiteNoGroup, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
var teamSubSiteNoGroupType = Type.GetType(teamSubSiteNoGroupTypeName, true);

JObject sourceJObject = JObject.Load(reader);
JToken discriminatorToken = sourceJObject.SelectToken("Type");
string discriminator = discriminatorToken?.Value<string>() ?? "CommunicationSite";
discriminatorToken.Parent.Remove();

Object targetItem = null;
switch (discriminator)
{
case "CommunicationSite":
targetItem = sourceJObject.ToObject(communicationSiteType);
break;
case "TeamSite":
targetItem = sourceJObject.ToObject(teamSiteType);
break;
case "TeamSiteNoGroup":
targetItem = sourceJObject.ToObject(teamSiteNoGroupType);
break;
case "TeamNoGroupSubSite":
targetItem = sourceJObject.ToObject(teamSubSiteNoGroupType);
break;
}

return targetItem;
}


public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);

if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
string typeProperty =value.GetType().Name;

JObject o = (JObject)t;
o.AddFirst(new JProperty("Type", typeProperty));

o.WriteTo(writer);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PnP.Framework.Extensions;
using PnP.Framework.Provisioning.Providers.Xml;
using System;

namespace PnP.Framework.Provisioning.Providers.Json.Converters
{
public class SiteColumnsConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
var fieldsTypeName = $"{PnPSerializationScope.Current?.BaseSchemaNamespace}.ProvisioningTemplateSiteFields, {PnPSerializationScope.Current?.BaseSchemaAssemblyName}";
var fieldsType = Type.GetType(fieldsTypeName, true);
return fieldsType.IsAssignableFrom(objectType);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray sourceJObject = JArray.Load(reader);
var e = sourceJObject.ToObject<System.Xml.XmlElement[]>();

var fields = Activator.CreateInstance(objectType);
fields.SetPublicInstancePropertyValue("Any", e);

return fields;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);

if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JArray a = (JArray)t.SelectToken("Any");
a.WriteTo(writer);
}
}
}
}

This file was deleted.

Loading

0 comments on commit 41d1e30

Please sign in to comment.