Skip to content

Commit

Permalink
[BMSPT-306] document update in schema converter to V21
Browse files Browse the repository at this point in the history
  • Loading branch information
BalintBende committed Jul 24, 2024
1 parent 176958d commit 06bcb94
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 34 deletions.
2 changes: 2 additions & 0 deletions bcf-toolkit.sln.DotSettings.user
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=9d2ef61b_002Ddc22_002D4ed8_002Da2d1_002D9b4b3bcf144d/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="BuildV30BcfFromStreamWithInternalDocumentTest" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::8113526D-8A68-4E3E-B4DB-CE235875DDD1::net8.0::Tests.Converter.Bcf21.ConverterTests.BuildV30BcfFromStreamWithInternalDocumentTest&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::8113526D-8A68-4E3E-B4DB-CE235875DDD1::net8.0::Tests.Converter.Bcf30.ConverterTests.BuildSimpleV21BcfFromStreamTest&lt;/TestId&gt;
&lt;TestId&gt;NUnit3x::8113526D-8A68-4E3E-B4DB-CE235875DDD1::net8.0::Tests.Converter.Bcf30.ConverterTests.BuildV21BcfFromStreamWithInternalDocumentTest&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>

Expand Down
33 changes: 30 additions & 3 deletions src/bcf-toolkit/Builder/Bcf21/BcfBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.IO.Compression;
using System.Linq;
using System.Threading.Tasks;
using BcfToolkit.Model;
using BcfToolkit.Model.Bcf21;
using BcfToolkit.Utils;

Expand All @@ -15,7 +16,7 @@ public async Task<Bcf> BuildFromStream(Stream source) {
_bcf.Markups =
await BcfExtensions.ParseMarkups<Markup, VisualizationInfo>(source);
_bcf.Project = await BcfExtensions.ParseProject<ProjectExtension>(source);
SetDocumentData(source);
SetDocumentDataFromReferences(source);
return BuilderUtils.ValidateItem(_bcf);
}

Expand All @@ -29,15 +30,41 @@ public BcfBuilder SetProject(ProjectExtension? project) {
return this;
}

/// <summary>
/// It sets the document file name and base64 data from the specified
/// document data dictionary.
/// </summary>
/// <param name="documentData">
/// Dictionary contains document guid as the key and a tuple of document
/// file name and file data as the value
/// </param>
/// <returns></returns>
public BcfBuilder SetDocumentData(
Dictionary<string, Tuple<string, FileData>>? documentData) {
if (documentData is null) return this;
var documentReferences =
_bcf.Markups.SelectMany(m => m.Topic.DocumentReference).ToList();
foreach (var data in documentData) {
var documentReference =
documentReferences.FirstOrDefault(r =>
r.ReferencedDocument.Equals(data.Key));
if (documentReference is null) continue;
//It is recommended to put files in a folder called Documents in the root
//folder of the zip archive.
documentReference.ReferencedDocument = $"../documents/{data.Value.Item1}";
documentReference.DocumentData = data.Value.Item2;
}
return this;
}

/// <summary>
/// It turns the additional file data that are referenced as internal
/// document in markups into the DocumentInfo.
/// </summary>
/// <param name="stream">The file stream of the BCFzip.</param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
private void SetDocumentData(
Stream stream) {
private void SetDocumentDataFromReferences(Stream stream) {
if (stream is null || !stream.CanRead)
throw new ArgumentException("Source stream is not readable.");

Expand Down
25 changes: 12 additions & 13 deletions src/bcf-toolkit/Converter/Bcf30/SchemaConverterToBcf21.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System;
using System.Linq;
using BcfToolkit.Builder.Bcf21;
using BcfToolkit.Model.Bcf21;
Expand Down Expand Up @@ -27,11 +28,12 @@ public static class SchemaConverterToBcf21 {
/// <returns>Returns the converted object.</returns>
public static Model.Bcf21.Bcf Convert(Model.Bcf30.Bcf from) {
var builder = new BcfBuilder();

return
builder
return builder
.AddMarkups(from.Markups.Select(ConvertMarkup).ToList())
.SetProject(ConvertProject(from.Project?.Project))
.SetDocumentData(from.Document?.Documents
.Select(d => new { d.Guid, Data = Tuple.Create(d.Filename, d.DocumentData) })
.ToDictionary(e => e.Guid, e => e.Data))
.Build();
}

Expand All @@ -43,8 +45,7 @@ private static Model.Bcf21.ProjectExtension?
return null;
}

return
builder
return builder
.SetProjectId(from.ProjectId)
.SetProjectName(from.Name)
.SetExtensionSchema("extensions.xsd")
Expand Down Expand Up @@ -80,8 +81,6 @@ private static Model.Bcf21.Markup ConvertMarkup(Model.Bcf30.Markup from) {
.AddViewPoints(from.Topic.Viewpoints.Select(ConvertViewPoint).ToList())
.AddRelatedTopics(from.Topic.RelatedTopics.Select(ConvertRelatedTopic).ToList())
.Build();

return builder.Build();
}

private static Model.Bcf21.HeaderFile ConvertHeaderFile(Model.Bcf30.File from) {
Expand Down Expand Up @@ -114,7 +113,7 @@ private static Model.Bcf21.HeaderFile ConvertHeaderFile(Model.Bcf30.File from) {
private static Model.Bcf21.TopicDocumentReference ConvertDocumentReference(
Model.Bcf30.DocumentReference from) {
var builder = new DocumentReferenceBuilder();
var isExternal = string.IsNullOrEmpty(from.Url);
var isExternal = !string.IsNullOrEmpty(from.Url);

return builder
.SetGuid(from.Guid)
Expand Down Expand Up @@ -206,11 +205,11 @@ private static Model.Bcf21.ViewPoint ConvertViewPoint(
var builder = new PerspectiveCameraBuilder();

return builder
.SetCameraDirection(from.CameraDirection.X, from.CameraDirection.Y, from.CameraDirection.Z)
.SetCameraViewPoint(from.CameraViewPoint.X, from.CameraViewPoint.Y, from.CameraViewPoint.Z)
.SetCameraUpVector(from.CameraUpVector.X, from.CameraUpVector.Y, from.CameraUpVector.Z)
.SetFieldOfView(from.FieldOfView)
.Build();
.SetCameraDirection(from.CameraDirection.X, from.CameraDirection.Y, from.CameraDirection.Z)
.SetCameraViewPoint(from.CameraViewPoint.X, from.CameraViewPoint.Y, from.CameraViewPoint.Z)
.SetCameraUpVector(from.CameraUpVector.X, from.CameraUpVector.Y, from.CameraUpVector.Z)
.SetFieldOfView(from.FieldOfView)
.Build();
//TODO: AspectRatio data loss
}

Expand Down
1 change: 0 additions & 1 deletion src/bcf-toolkit/Model/Bcf30/DocumentsExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Collections.Generic;
using System.IO.Compression;
using System.Linq;
using System.Xml.Serialization;
Expand Down
52 changes: 35 additions & 17 deletions src/tests/Converter/Bcf30/ConverterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -220,21 +220,39 @@ public async Task WriteBcfWithInternalDocumentsTest() {
await _converter.ToBcf(bcf, "Resources/output/Bcf/v3.0/DocumentReferenceInternal.bcfzip");
}

// /// <summary>
// /// It should generate a bcf v2.1 object downgraded from bcf v3.0.
// /// </summary>
// [Test]
// [Category("BCF v3.0")]
// public async Task BuildSimpleV21BcfFromStreamTest() {
// await using var stream =
// new FileStream(
// "Resources/Bcf/v3.0/ComponentSelection.bcfzip",
// FileMode.Open,
// FileAccess.Read);
// var bcf = await _converter.BuildBcfFromStream<BcfToolkit.Model.Bcf21.Bcf>(stream);
// Assert.AreEqual(typeof(BcfToolkit.Model.Bcf21.Bcf),bcf.GetType());
// Assert.AreEqual(1, bcf.Markups.Count);
// Assert.AreEqual("OPEN", bcf.Extensions.TopicStatuses.FirstOrDefault());
// Assert.AreEqual("2.1", bcf.Version?.VersionId);
// }
/// <summary>
/// It should generate a bcf v2.1 object downgraded from bcf v3.0.
/// </summary>
[Test]
[Category("BCF v3.0")]
public async Task BuildSimpleV21BcfFromStreamTest() {
await using var stream =
new FileStream(
"Resources/Bcf/v3.0/ComponentSelection.bcfzip",
FileMode.Open,
FileAccess.Read);
var bcf = await _converter.BcfFromStream<BcfToolkit.Model.Bcf21.Bcf>(stream);
Assert.That(bcf.GetType(), Is.EqualTo(typeof(BcfToolkit.Model.Bcf21.Bcf)));
Assert.That(bcf.Markups.Count, Is.EqualTo(1));
Assert.That(bcf.Version.VersionId, Is.EqualTo("2.1"));
}

/// <summary>
/// It should generate a bcf v2.1 object downgraded from bcf v3.0.
/// </summary>
[Test]
[Category("BCF v3.0")]
public async Task BuildV21BcfFromStreamWithInternalDocumentTest() {
await using var stream =
new FileStream(
"Resources/Bcf/v3.0/DocumentReferenceInternal.bcfzip",
FileMode.Open,
FileAccess.Read);
var bcf = await _converter.BcfFromStream<BcfToolkit.Model.Bcf21.Bcf>(stream);
Assert.That(bcf.GetType(), Is.EqualTo(typeof(BcfToolkit.Model.Bcf21.Bcf)));
var markup = bcf.Markups.FirstOrDefault(m => m.Topic.Guid.Equals("8ac9822a-761a-4deb-9f39-f61286acbf6a"));
var documentReference =
markup?.Topic.DocumentReference.FirstOrDefault(d => !d.IsExternal);
Assert.That(documentReference?.DocumentData.Mime, Is.EqualTo("data:text/plain;base64"));
}
}

0 comments on commit 06bcb94

Please sign in to comment.