public Profile.ProfileStructureComponent Expand(Profile.ProfileStructureComponent differential) { var baseStructure = _loader.LocateBaseStructure(differential.TypeElement); if (baseStructure == null) throw Error.InvalidOperation("Could not locate the base profile for type {0}", differential.TypeElement.ToString()); var baseUri = StructureLoader.BuildBaseStructureUri(differential.TypeElement).ToString(); var snapshot = (Profile.ProfileStructureComponent)baseStructure.DeepCopy(); snapshot.SetStructureForm(StructureForm.Snapshot); snapshot.SetStructureBaseUri(baseUri.ToString()); mergeStructure(snapshot, differential); var fullDifferential = new DifferentialTreeConstructor(differential).MakeTree(); var snapNav = new ElementNavigator(snapshot); snapNav.MoveToFirstChild(); var diffNav = new ElementNavigator(fullDifferential); diffNav.MoveToFirstChild(); merge(snapNav, diffNav); //TODO: Merge search params? snapNav.CommitChanges(); return snapshot; }
public void MakeDifferentialTree() { var struc = new Profile.ProfileStructureComponent(); struc.Element = new List<Profile.ElementComponent>(); struc.Element.Add(new Profile.ElementComponent() { Path = "A.B.C1" }); struc.Element.Add(new Profile.ElementComponent() { Path = "A.B.C1" }); struc.Element.Add(new Profile.ElementComponent() { Path = "A.B.C2" }); struc.Element.Add(new Profile.ElementComponent() { Path = "A.B" }); struc.Element.Add(new Profile.ElementComponent() { Path = "A.B.C1.D" }); struc.Element.Add(new Profile.ElementComponent() { Path = "A.D.F" }); var tree = new DifferentialTreeConstructor(struc).MakeTree(); Assert.IsNotNull(tree); var nav = new ElementNavigator(tree); Assert.AreEqual(10, nav.Count); Assert.IsTrue(nav.MoveToChild("A")); Assert.IsTrue(nav.MoveToChild("B")); Assert.IsTrue(nav.MoveToChild("C1")); Assert.IsTrue(nav.MoveToNext("C1")); Assert.IsTrue(nav.MoveToNext("C2")); Assert.IsTrue(nav.MoveToParent()); // 1st A.B Assert.IsTrue(nav.MoveToNext() && nav.Path == "A.B"); // (now) 2nd A.B Assert.IsTrue(nav.MoveToChild("C1")); Assert.IsTrue(nav.MoveToChild("D")); Assert.IsTrue(nav.MoveToParent()); // A.B.C1 Assert.IsTrue(nav.MoveToParent()); // A.B (2nd) Assert.IsTrue(nav.MoveToNext() && nav.Path == "A.D"); Assert.IsTrue(nav.MoveToChild("F")); }
public Profile.ProfileStructureComponent Expand(Profile.ProfileStructureComponent differential) { var baseStructure = _loader.LocateBaseStructure(differential.TypeElement); if (baseStructure == null) { throw Error.InvalidOperation("Could not locate the base profile for type {0}", differential.TypeElement.ToString()); } var baseUri = StructureLoader.BuildBaseStructureUri(differential.TypeElement).ToString(); var snapshot = (Profile.ProfileStructureComponent)baseStructure.DeepCopy(); snapshot.SetStructureForm(StructureForm.Snapshot); snapshot.SetStructureBaseUri(baseUri.ToString()); mergeStructure(snapshot, differential); var fullDifferential = new DifferentialTreeConstructor(differential).MakeTree(); var snapNav = new ElementNavigator(snapshot); snapNav.MoveToFirstChild(); var diffNav = new ElementNavigator(fullDifferential); diffNav.MoveToFirstChild(); merge(snapNav, diffNav); //TODO: Merge search params? snapNav.CommitChanges(); return(snapshot); }