/// <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);
                }
            }
        }
Example #2
0
 /// <summary>
 /// return null if valid, otherwise nice verbose description of what went wrong
 /// </summary>
 public string ValidateFile(string pathToFile, IProgress progress)
 {
     try
     {
         using (var reader = XmlReader.Create(pathToFile, CanonicalXmlSettings.CreateXmlReaderSettings()))
         {
             reader.MoveToContent();
             if (reader.LocalName == "ldml")
             {
                 // It would be nice, if it could really validate it.
                 while (reader.Read())
                 {
                 }
             }
             else
             {
                 throw new InvalidOperationException("Not an LDML file.");
             }
         }
     }
     catch (Exception error)
     {
         return(error.Message);
     }
     return(null);
 }
Example #3
0
        public ChorusNotesMergeEventListener(string path)
        {
            _path = path;

            try
            {
                if (!File.Exists(path))
                {
                    var doc = new XmlDocument();
                    doc.LoadXml(string.Format("<notes version='{0}'/>", FormatVersionNumber.ToString()));
                    using (var fileWriter = XmlWriter.Create(path, CanonicalXmlSettings.CreateXmlWriterSettings()))
                    {
                        doc.Save(fileWriter);
                    }
                }
            }
            catch (Exception error)
            {
                Debug.Fail("Something went wrong trying to create a blank ChorusNotes file :" + error.Message);
                //todo log that the xml was the wrong format
            }

            _tempFile     = new TempFile();
            _readerStream = new FileStream(path, FileMode.Open);
            _reader       = XmlReader.Create(_readerStream, CanonicalXmlSettings.CreateXmlReaderSettings());
            _writer       = XmlWriter.Create(_tempFile.Path, CanonicalXmlSettings.CreateXmlWriterSettings());
            StreamToInsertionPoint(_reader, _writer);
        }
Example #4
0
 //private static void WriteProblemDataFile(string pathname, XmlNode data)
 //{
 //    var doc = data.OwnerDocument;
 //    doc.Save(pathname);
 //}
 private static void WriteProblemDataFile(string pathname, byte[] data)
 {
     using (var reader = XmlReader.Create(new MemoryStream(data, false), CanonicalXmlSettings.CreateXmlReaderSettings()))
         using (var writer = XmlWriter.Create(pathname, CanonicalXmlSettings.CreateXmlWriterSettings()))
         {
             writer.WriteNode(reader, true);
         }
 }
Example #5
0
        private string GetLiftBranchName()
        {
            const string LIFT = @"LIFT";

            using (var reader = XmlReader.Create(_dataPathname, CanonicalXmlSettings.CreateXmlReaderSettings()))
            {
                reader.MoveToContent();
                reader.MoveToAttribute(@"version");
                var liftVersionString = reader.Value;
                return((liftVersionString == @"0.13") ? @"default" : LIFT + reader.Value);
            }
        }
Example #6
0
        internal static string GetVersionNumber(string mainDataPathname)
        {
#if USEFAKEVERSION
            return(@"7000067");
#else
            using (var reader = XmlReader.Create(mainDataPathname, CanonicalXmlSettings.CreateXmlReaderSettings()))
            {
                reader.MoveToContent();
                reader.MoveToAttribute("version");
                return(reader.Value);
            }
#endif
        }
Example #7
0
        private static SortedDictionary <string, string> SortRootElementAttributes(string pathname)
        {
            var sortedRootAttributes = new SortedDictionary <string, string>(StringComparer.InvariantCultureIgnoreCase);

            using (var tempReader = XmlReader.Create(pathname, CanonicalXmlSettings.CreateXmlReaderSettings()))
            {
                tempReader.MoveToContent();
                for (var i = 0; i < tempReader.AttributeCount; ++i)
                {
                    tempReader.MoveToAttribute(i);
                    sortedRootAttributes.Add(GetUniqueKey(sortedRootAttributes.Keys, tempReader.Name), tempReader.Value);
                }
            }
            return(sortedRootAttributes);
        }
Example #8
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);
                }
            }
        }
Example #9
0
        private string GetBranchNameFromLiftFile()
        {
            const string LIFT = @"LIFT";

            using (var reader = XmlReader.Create(_liftPathName, CanonicalXmlSettings.CreateXmlReaderSettings()))
            {
                reader.MoveToContent();
                reader.MoveToAttribute(@"version");
                var liftVersionString = reader.Value;
                if (liftVersionString == @"0.13")
                {
                    return(@"default");
                }
                return(LIFT + reader.Value);
            }
        }
        public void ReplaceWritingSystemId(string oldId, string newId)
        {
            var fileToBeWrittenTo = new TempFile();
            var reader            = XmlReader.Create(_liftFilePath, CanonicalXmlSettings.CreateXmlReaderSettings());
            var writer            = XmlWriter.Create(fileToBeWrittenTo.Path, CanonicalXmlSettings.CreateXmlWriterSettings());

            //System.Diagnostics.Process.Start(fileToBeWrittenTo.Path);
            try
            {
                bool readerMovedByXmlDocument = false;
                while (readerMovedByXmlDocument || reader.Read())
                {
                    readerMovedByXmlDocument = false;
                    var xmldoc = new XmlDocument();
                    //We load up the header and entry nodes individually as XmlDocuments and replace the writing systems
                    //This is not as fast as pure reader writers, but as this is not a frequent operation, that is ok and
                    //it is MUCH easier to code than a statemachine using readers and writers only.
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "header")
                    {
                        var headerFragment = xmldoc.ReadNode(reader);
                        readerMovedByXmlDocument = true;
                        GetNodeWithWritingSystemIdsReplaced(oldId, newId, headerFragment);
                        headerFragment.WriteTo(writer);
                    }
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "entry")
                    {
                        var entryFragment = xmldoc.ReadNode(reader);
                        readerMovedByXmlDocument = true;
                        GetNodeWithWritingSystemIdsReplaced(oldId, newId, entryFragment);
                        entryFragment.WriteTo(writer);
                    }
                    else
                    {
                        writer.WriteNodeShallow(reader);
                    }
                    //writer.Flush();
                }
            }
            finally
            {
                reader.Close();
                writer.Close();
            }
            File.Delete(_liftFilePath);
            fileToBeWrittenTo.MoveTo(_liftFilePath);
        }
        private static float GetLiftVersionNumber(string repoLocation)
        {
            // Return 0.13 if there is no lift file or it has no 'version' attr on the main 'lift' element.
            var firstLiftFile = FileAndDirectoryServices.GetPathToFirstLiftFile(repoLocation);

            if (firstLiftFile == null)
            {
                return(float.MaxValue);
            }

            using (var reader = XmlReader.Create(firstLiftFile, CanonicalXmlSettings.CreateXmlReaderSettings()))
            {
                reader.MoveToContent();
                reader.MoveToAttribute("version");
                return(float.Parse(reader.Value));
            }
        }
Example #12
0
        public ChorusNotesMergeEventListener(string path)
        {
            _path = path;
            try
            {
                CreateEmptyChorusNotesFile(path);
            }
            catch (Exception error)
            {
                Debug.Fail("Something went wrong trying to create a blank ChorusNotes file :" + error.Message);
                //todo log that the xml was the wrong format
            }

            _tempFile     = new TempFile();
            _readerStream = new FileStream(path, FileMode.Open);
            _reader       = XmlReader.Create(_readerStream, CanonicalXmlSettings.CreateXmlReaderSettings());
            _writer       = XmlWriter.Create(_tempFile.Path, CanonicalXmlSettings.CreateXmlWriterSettings());
            StreamToInsertionPoint(_reader, _writer);
        }
Example #13
0
        /// <summary>
        /// This simply checks that the file is well-formed
        /// </summary>
        public static string ValidateFile(string pathToFile, IProgress progress)
        {
            XmlReader reader = null;

            try
            {
                reader = XmlReader.Create(pathToFile, CanonicalXmlSettings.CreateXmlReaderSettings());
                while (reader.Read())
                {
                }
            }
            catch (Exception error)
            {
                return(error.Message);
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
            return(null);
        }
Example #14
0
 public void CanonicalXmlReaderSettings_ForDocumentFragment_HaveCorrectSettings()
 {
     CheckReaderSettings(CanonicalXmlSettings.CreateXmlReaderSettings(ConformanceLevel.Fragment), ConformanceLevel.Fragment);
 }
        public void DeleteWritingSystemId(string id)
        {
            var fileToBeWrittenTo = new TempFile();
            var reader            = XmlReader.Create(_liftFilePath, CanonicalXmlSettings.CreateXmlReaderSettings());
            var writer            = XmlWriter.Create(fileToBeWrittenTo.Path, CanonicalXmlSettings.CreateXmlWriterSettings());

            //System.Diagnostics.Process.Start(fileToBeWrittenTo.Path);
            try
            {
                bool readerMovedByXmlDocument = false;
                while (readerMovedByXmlDocument || reader.Read())
                {
                    readerMovedByXmlDocument = false;
                    var xmldoc = new XmlDocument();
                    if (reader.NodeType == XmlNodeType.Element && reader.Name == "entry")
                    {
                        var entryFragment = xmldoc.ReadNode(reader);
                        readerMovedByXmlDocument = true;
                        var nodesWithLangId = entryFragment.SelectNodes(String.Format("//*[@lang='{0}']", id));
                        if (nodesWithLangId != null)
                        {
                            foreach (XmlNode node in nodesWithLangId)
                            {
                                var parent = node.SelectSingleNode("parent::*");
                                if (node.Name == "gloss")
                                {
                                    parent.RemoveChild(node);
                                }
                                else
                                {
                                    var siblingNodes =
                                        node.SelectNodes("following-sibling::form | preceding-sibling::form");
                                    if (siblingNodes.Count == 0)
                                    {
                                        var grandParent = parent.SelectSingleNode("parent::*");
                                        grandParent.RemoveChild(parent);
                                    }
                                    else
                                    {
                                        parent.RemoveChild(node);
                                    }
                                }
                            }
                        }
                        entryFragment.WriteTo(writer);
                    }
                    else
                    {
                        writer.WriteNodeShallow(reader);
                    }
                    //writer.Flush();
                }
            }
            finally
            {
                reader.Close();
                writer.Close();
            }
            File.Delete(_liftFilePath);
            fileToBeWrittenTo.MoveTo(_liftFilePath);
        }