/// <summary>
        /// Do a 3-file merge, placing the result over the "ours" file and returning an error status
        /// </summary>
        /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with.
        /// The must not have any UI, no interaction with the user.</remarks>
        public void Do3WayMerge(MergeOrder mergeOrder)
        {
            Guard.AgainstNull(mergeOrder, "mergeOrder");

            if (mergeOrder == null)
            {
                throw new ArgumentNullException("mergeOrder");
            }

            var merger = new XmlMerger(mergeOrder.MergeSituation);

            SetupElementStrategies(merger);

            merger.EventListener = mergeOrder.EventListener;

            using (var oursXml = new HtmlFileForMerging(mergeOrder.pathToOurs))
                using (var theirsXml = new HtmlFileForMerging(mergeOrder.pathToTheirs))
                    using (var ancestorXml = new HtmlFileForMerging(mergeOrder.pathToCommonAncestor))
                    {
                        var result = merger.MergeFiles(oursXml.GetPathToXHtml(), theirsXml.GetPathToXHtml(), ancestorXml.GetPathToXHtml());

                        CarefullyWriteOutResultingXml(oursXml, result);

                        //now convert back to html
                        oursXml.SaveHtml();
                    }
        }
        /// <summary>
        /// Do a 3-file merge, placing the result over the "ours" file and returning an error status
        /// </summary>
        /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with.
        /// The must not have any UI, no interaction with the user.</remarks>
        public void Do3WayMerge(MergeOrder mergeOrder)
        {
            if (mergeOrder == null)
            {
                throw new ArgumentNullException("mergeOrder");
            }

            bool addedCollationAttr;

            PreMergeFile(mergeOrder, out addedCollationAttr);

            var merger = new XmlMerger(mergeOrder.MergeSituation);

            SetupElementStrategies(merger);

            merger.EventListener = mergeOrder.EventListener;
            XmlMergeService.RemoveAmbiguousChildNodes = true;
            var result = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor);

            using (var writer = XmlWriter.Create(mergeOrder.pathToOurs, CanonicalXmlSettings.CreateXmlWriterSettings()))
            {
                var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto);
                readerSettings.XmlResolver = null;
                readerSettings.ProhibitDtd = false;
                using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings))
                {
                    writer.WriteNode(nodeReader, false);
                }
            }
        }
Beispiel #3
0
        public void Do3WayMerge(MetadataCache mdc, MergeOrder mergeOrder)
        {
            var merger = new XmlMerger(mergeOrder.MergeSituation)
            {
                EventListener = mergeOrder.EventListener
            };
            var rootStrategy = ElementStrategy.CreateSingletonElement();

            rootStrategy.IsAtomic = true;
            merger.MergeStrategies.SetStrategy("DictionaryConfiguration", rootStrategy);
            var mergeResults = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor);

            // Write merged data
            File.WriteAllText(mergeOrder.pathToOurs, mergeResults.MergedNode.OuterXml, Encoding.UTF8);
        }
Beispiel #4
0
        /// <summary>
        /// Do a 3-file merge, placing the result over the "ours" file and returning an error status
        /// </summary>
        /// <remarks>Implementations can exit with an exception, which the caller will catch and deal with.
        /// The must not have any UI, no interaction with the user.</remarks>
        public void Do3WayMerge(MergeOrder mergeOrder)
        {
            if (mergeOrder == null)
            {
                throw new ArgumentNullException("mergeOrder");
            }

            bool addedCollationAttr;

            PreMergeFile(mergeOrder, out addedCollationAttr);

            var merger = new XmlMerger(mergeOrder.MergeSituation);

            SetupElementStrategies(merger);

            merger.EventListener = mergeOrder.EventListener;
            XmlMergeService.RemoveAmbiguousChildNodes = true;
            var result = merger.MergeFiles(mergeOrder.pathToOurs, mergeOrder.pathToTheirs, mergeOrder.pathToCommonAncestor);

            using (var writer = XmlWriter.Create(mergeOrder.pathToOurs, CanonicalXmlSettings.CreateXmlWriterSettings()))
            {
                var nameSpaceManager = new XmlNamespaceManager(new NameTable());
                nameSpaceManager.AddNamespace("palaso", "urn://palaso.org/ldmlExtensions/v1");
                nameSpaceManager.AddNamespace("palaso2", "urn://palaso.org/ldmlExtensions/v2");
                nameSpaceManager.AddNamespace("fw", "urn://fieldworks.sil.org/ldmlExtensions/v1");
                nameSpaceManager.AddNamespace("sil", "urn://www.sil.org/ldml/0.1");

                var readerSettings = CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Auto);
                readerSettings.NameTable   = nameSpaceManager.NameTable;
                readerSettings.XmlResolver = null;
                readerSettings.ProhibitDtd = false;
                if (addedCollationAttr)
                {
                    // Remove the optional 'key' attr we added.
                    var adjustedCollation = result.MergedNode.SelectSingleNode("collations")
                                            .SelectNodes("collation")
                                            .Cast <XmlNode>().FirstOrDefault(collation => collation.Attributes["type"].Value == "standard");
                    if (adjustedCollation != null)
                    {
                        adjustedCollation.Attributes.Remove(adjustedCollation.Attributes["type"]);
                    }
                }
                using (var nodeReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(result.MergedNode.OuterXml)), readerSettings))
                {
                    writer.WriteNode(nodeReader, false);
                }
            }
        }