Exemple #1
0
        public void XElementTest()
        {
            // xmlns
            var el = XElement.Parse("<fpl:test xmlns:fpl=\"test\" />");

            Assert.Throws <NotSupportedException>(() => new XMLEntity(el));

            // basic
            el = XElement.Parse("<test a=\"1\" b=\"aBcDeF\" />");
            var en = new XMLEntity(el);

            Assert.AreEqual("test", en.XName);
            Assert.AreEqual(2, en.Attributes.Count);
            Assert.AreEqual("1", en.Attributes["a"]);
            Assert.AreEqual("aBcDeF", en.Attributes["b"]);

            // children
            el = XElement.Parse("<test a=\"1\" b=\"aBcDeF\"><a abc=\"1\" /><b>d</b>hallo</test>");
            en = new XMLEntity(el);
            Assert.AreEqual("hallo", en.Value);
            Assert.AreEqual(2, en.Attributes.Count); // attributes again
            Assert.AreEqual("1", en.Attributes["a"]);
            Assert.AreEqual("aBcDeF", en.Attributes["b"]);
            Assert.AreEqual(2, en.Children.Count);
            Assert.AreEqual("a", en.Children[0].XName);
            Assert.AreEqual("1", en.Children[0].Attributes["abc"]);
            Assert.AreEqual(null, en.Children[0].Value);
            Assert.AreEqual("b", en.Children[1].XName);
            Assert.AreEqual("d", en.Children[1].Value);
        }
Exemple #2
0
 private bool XDiff(XMLEntity x1, XMLEntity x2)
 {
     if (x1.XName != x2.XName)
     {
         return(false);
     }
     if (x1.Value != x2.Value)
     {
         return(false);
     }
     if (x1.Attributes.Count != x2.Attributes.Count)
     {
         return(false);
     }
     foreach (var a in x1.Attributes)
     {
         if (a.Value != x2.GetAttribute <string>(a.Key, null))
         {
             return(false);
         }
     }
     if (x1.Children.Count != x2.Children.Count)
     {
         return(false);
     }
     foreach (var c in x1.Children)
     {
         if (!XDiff(c, x2.Children[x1.Children.IndexOf(c)]))
         {
             return(false);
         }
     }
     return(true);
 }
Exemple #3
0
        public Timetable Import(string filename, IInfo info, ILog replaceLog = null)
        {
            try
            {
                XElement el = XElement.Load(filename);

                XMLEntity en = new XMLEntity(el);
                var       tt = new Timetable(en);

                var actions = info.GetRegistered <ITimetableInitAction>();
                foreach (var action in actions)
                {
                    var message = action.Init(tt);
                    if (message != null)
                    {
                        info.Logger.Warning(message);
                    }
                }

                return(tt);
            }
            catch (Exception ex)
            {
                var log = replaceLog ?? info.Logger;
                log.Error("XMLImporter: " + ex.Message);
                return(null);
            }
        }
Exemple #4
0
        public Timetable Import(Stream stream, IReducedPluginInterface pluginInterface, ILog replaceLog = null)
        {
            var xElement = XElement.Load(stream);

            var xmlEntity = new XMLEntity(xElement);
            var tt        = new Timetable(TimetableType.Linear);

            var stations = xmlEntity.Children.Where(x => x.XName == "sta") // Filters other xml elements.
                           .Select(x =>
            {
                // Fix importing linear line files wich only support old style chainage.
                var km = x.GetAttribute <string>("km");
                if (km != null)
                {
                    x.SetAttribute("kml", km);
                    x.SetAttribute("kmr", km);
                    x.RemoveAttribute("km");
                }

                return(new Station(x, tt));
            });

            foreach (var i in stations)
            {
                tt.AddStation(i, Timetable.LINEAR_ROUTE_ID);
            }

            return(tt);
        }
 private static void ConvertElement(XMLEntity xml, string[] attributesToConvert, TimetableVersion version)
 {
     foreach (var xe in xml.Attributes.ToArray())
     {
         if (attributesToConvert.Contains(xe.Key))
         {
             xml.SetAttribute(xe.Key, ConvertColor(xe.Value, version));
         }
     }
 }
Exemple #6
0
        protected void UpgradeTimePrecision(XMLEntity xclone, bool updateTrainLinks)
        {
            // Update some properties to time entry format.
            var properties = new[] { "dTt", "odBT", "hlI", "mpP", "sLine", "tMin", "tMax" };

            foreach (var prop in properties)
            {
                if (xclone.Attributes.TryGetValue(prop, out var v) && int.TryParse(v, out var vi))
                {
                    var te = new TimeEntry(0, vi);
                    xclone.SetAttribute(prop, te.ToString());
                }
            }

            if (!updateTrainLinks)
            {
                return;
            }
            // Update tlo/tld
            var tlProperties = new[] { "tlo", "tld" };
            var trainsElem   = xclone.Children.SingleOrDefault(x => x.XName == "trains");

            if (trainsElem == null)
            {
                return;
            }

            foreach (var t in trainsElem.Children)
            {
                var tlElem = t.Children.SingleOrDefault(x => x.XName == "tl");
                if (tlElem == null)
                {
                    continue;
                }

                foreach (var prop in tlProperties)
                {
                    if (!tlElem.Attributes.TryGetValue(prop, out var v) || !int.TryParse(v, out var vi))
                    {
                        continue;
                    }

                    var te = new TimeEntry(0, vi);
                    tlElem.SetAttribute(prop, te.ToString());
                }
            }
        }
Exemple #7
0
        public void CreationTest()
        {
            var x = new XMLEntity("test");

            Assert.AreEqual("test", x.XName);
            Assert.AreEqual(0, x.Attributes.Count);
            Assert.AreEqual(0, x.Children.Count);
            Assert.AreEqual(null, x.Value);

            // externes setzen
            x.SetAttribute("test-attr1", "test-attr1-val");
            Assert.IsTrue(x.Attributes.Count == 1);
            Assert.IsTrue(x.Attributes.ContainsKey("test-attr1"));
            Assert.AreEqual("test-attr1-val", x.Attributes["test-attr1"]);
            Assert.AreEqual("test-attr1-val", x.GetAttribute <string>("test-attr1"));

            // internes setzen
            Assert.AreEqual(null, x.GetAttribute <string>("test-attr2"));
            Assert.AreEqual(0, x.GetAttribute <int>("test-attr2"));
            x.Attributes["test-attr2"] = "2";
            Assert.AreEqual("2", x.GetAttribute <string>("test-attr2"));
            Assert.AreEqual(2, x.GetAttribute <int>("test-attr2"));

            // externes Löschen
            x.RemoveAttribute("test-attr1");
            Assert.AreEqual(null, x.GetAttribute <string>("test-attr1"));
            Assert.IsFalse(x.Attributes.ContainsKey("test-attr1"));

            // internes Löschen
            x.Attributes.Remove("test-attr2");
            Assert.AreEqual(0, x.GetAttribute <int>("test-attr2"));

            // Value
            x.Value = "testval";
            Assert.AreEqual("testval", x.Value);

            // Children (simple)
            var x2 = new XMLEntity("c");

            x.Children.Add(x2);
            Assert.AreEqual(1, x.Children.Count);
            Assert.AreEqual("c", x.Children[0].XName);
            x.Children.RemoveAt(0);
            Assert.AreEqual(0, x.Children.Count);
        }
Exemple #8
0
        private void AddTimetableListener(IPluginInterface pluginInterface)
        {
            lastTimetableNode = new XMLEntity("dummy");

            // Log Timetable changes
            pluginInterface.FileStateChanged += (s, e) =>
            {
                try
                {
                    if (pluginInterface.Timetable == null || lastTimetableNode.XDiff(pluginInterface.Timetable.XMLEntity))
                    {
                        return;
                    }

                    var clone = pluginInterface.Timetable.Clone();

                    var x = new XMLEntity("dump-info");
                    x.SetAttribute("session", session);
                    x.SetAttribute("date", DateTime.Now.ToShortDateString());
                    x.SetAttribute("time", DateTime.Now.ToShortTimeString());
                    x.SetAttribute("pf", Environment.OSVersion.Platform.ToString());

                    clone.Children.Add(x);

                    using (var ms = new MemoryStream())
                    {
                        var exp = new XMLExport();
                        exp.Export(clone, ms, pluginInterface, new[] { XMLExport.FLAG_INDENT_XML });
                        ms.Seek(0, SeekOrigin.Begin);
                        using (var tr = new StreamReader(ms))
                        {
                            var text = tr.ReadToEnd();
                            writer.WriteEvent(DumpEventType.TimetableChange, text);
                        }
                    }

                    var clone2 = pluginInterface.Timetable.Clone();
                    lastTimetableNode = clone2.XMLEntity;
                }
                catch (Exception ex)
                {
                    pluginInterface.Logger.LogException(ex);
                }
            };
        }
Exemple #9
0
        private XElement BuildNode(XMLEntity node)
        {
            XElement elm = new XElement(node.XName);

            if (node.Value != null)
            {
                elm.SetValue(node.Value);
            }
            foreach (var attr in node.Attributes)
            {
                elm.SetAttributeValue(attr.Key, attr.Value);
            }
            foreach (var ch in node.Children)
            {
                elm.Add(BuildNode(ch));
            }
            return(elm);
        }
Exemple #10
0
        public void XmlEntityTest()
        {
            var tt = new Timetable(TimetableType.Linear);

            // children
            var el = XElement.Parse("<test a=\"1\" b=\"aBcDeF\"><a abc=\"1\" /><b>d</b>hallo</test>");
            var x  = new XMLEntity(el);
            var en = new TestEntity(x, tt);

            Assert.AreEqual(2, en.Attributes.Count); // attributes again
            Assert.AreEqual("1", en.Attributes["a"]);
            Assert.AreEqual("aBcDeF", en.Attributes["b"]);
            Assert.AreEqual(2, en.Children.Count);
            Assert.AreEqual("a", en.Children[0].XName);
            Assert.AreEqual("1", en.Children[0].Attributes["abc"]);
            Assert.AreEqual(null, en.Children[0].Value);
            Assert.AreEqual("b", en.Children[1].XName);
            Assert.AreEqual("d", en.Children[1].Value);
            Assert.AreEqual(tt, en.ParentTimetable);
        }
Exemple #11
0
        public bool ExportGenericNode(XMLEntity xmlEntity, Stream stream, IReducedPluginInterface pluginInterface, string[]?flags = null)
        {
            bool debug = pluginInterface.Settings.Get <bool>("xml.indent") || (flags?.Contains(FLAG_INDENT_XML) ?? false);

#if DEBUG
            debug = true;
#endif

            var ttElm = BuildNode(xmlEntity);

            using (var sw = new StreamWriter(stream, new UTF8Encoding(false), 1024, true))
                using (var writer = new XmlTextWriter(sw))
                {
                    if (debug)
                    {
                        writer.Formatting = Formatting.Indented;
                    }
                    ttElm.Save(writer);
                }
            return(true);
        }
Exemple #12
0
        public Timetable?Import(Stream stream, IReducedPluginInterface pluginInterface, ILog?replaceLog = null)
        {
            var xElement = XElement.Load(stream);

            var xmlEntity = new XMLEntity(xElement);
            var tt        = new Timetable(xmlEntity);

            if (tt.Initialized)
            {
                var actions = pluginInterface.GetRegistered <ITimetableInitAction>();
                foreach (var action in actions)
                {
                    var message = action.Init(tt, pluginInterface);
                    if (message != null)
                    {
                        pluginInterface.Logger.Warning(message);
                    }
                }
            }

            return(tt);
        }
Exemple #13
0
        public Timetable Import(string filename, IInfo info, ILog replaceLog = null)
        {
            try
            {
                XElement el = XElement.Load(filename);

                XMLEntity en   = new XMLEntity(el);
                var       list = new StationsList(en);
                var       tt   = new Timetable(TimetableType.Linear);
                foreach (var i in list.Stations)
                {
                    tt.AddStation(i, 0);
                }
                return(tt);
            }
            catch (Exception ex)
            {
                var log = replaceLog ?? info.Logger;
                log.Error("XMLStationsImporter: " + ex.Message);
                return(null);
            }
        }
Exemple #14
0
        private void ProcessEntity(XMLEntity node)
        {
            if (attrsNames.TryGetValue(node.XName, out var localAttrsNames))
            {
                foreach (var attr in localAttrsNames)
                {
                    node.RemoveAttribute(attr);
                }
            }

            IEnumerable <string> removeNodeNames = nodeNames[""];

            if (nodeNames.TryGetValue(node.XName, out var localNodeNames))
            {
                removeNodeNames = removeNodeNames.Concat(localNodeNames);
            }
            node.Children.RemoveAll(x => removeNodeNames.Contains(x.XName));

            foreach (var ch in node.Children)
            {
                ProcessEntity(ch);
            }
        }
Exemple #15
0
        private XElement BuildNode(XMLEntity node)
        {
            XElement elm = new XElement(node.XName);

            if (node.Value != null)
            {
                elm.SetValue(node.Value);
            }

            var f_attrs = node.Attributes.Where(a => !attrs_names.Contains(a.Key));

            foreach (var attr in f_attrs)
            {
                elm.SetAttributeValue(attr.Key, attr.Value);
            }

            var f_nodes = node.Children.Where(c => !node_names.Contains(c.XName));

            foreach (var ch in f_nodes)
            {
                elm.Add(BuildNode(ch));
            }
            return(elm);
        }
Exemple #16
0
 public BfplPoint(XMLEntity en, Timetable tt) : base(en, tt)
 {
 }
Exemple #17
0
 public ShuntMove(XMLEntity en, Timetable tt) : base(en, tt)
 {
 }
Exemple #18
0
        public void Init(IInfo info)
        {
            XMLEntity last = new XMLEntity("dummy");

            this.info = info;

            session  = Guid.NewGuid().ToString();
            basePath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "ttDumps", session);
            dir      = new DirectoryInfo(basePath);

            if (!dir.Exists)
            {
                dir.Create();
            }

            // Log UI interaction
            FFormHandler.Init += (se, a) =>
            {
                var w = (Window)se;
                var n = w.GetType().FullName;
                w.Shown  += (s, e) => info.Logger.Debug("Form shown: " + n);
                w.Closed += (s, e) => info.Logger.Debug("Form closed: " + n);
            };

            var     logPath = Path.Combine(basePath, "session.log");
            dynamic l       = info.Logger;

            l.Loggers.Add(new FileLogger(logPath));

            // Log Timetable changes
            info.FileStateChanged += (s, e) =>
            {
                try
                {
                    if (info.Timetable == null || XDiff(last, info.Timetable.XMLEntity))
                    {
                        return;
                    }

                    var clone = info.Timetable.Clone();
                    var exp   = new XMLExport();

                    var fn = Path.Combine(basePath, $"fpldump-{sessionCounter++}.fpl");

                    var x = new XMLEntity("dump-info");
                    x.SetAttribute("session", session);
                    x.SetAttribute("date", DateTime.Now.ToShortDateString());
                    x.SetAttribute("time", DateTime.Now.ToShortTimeString());
                    x.SetAttribute("pf", Environment.OSVersion.Platform.ToString());

                    clone.Children.Add(x);
                    exp.Export(clone, fn, info);
                    info.Logger.Debug("Dump erstellt: " + fn);

                    var clone2 = info.Timetable.Clone();
                    last = clone2.XMLEntity;
                }
                catch { }
            };

            info.ExtensionsLoaded += (s, e) =>
            {
                info.Logger.Info("DebugDump aktiviert. Session: " + session);
                info.Logger.Debug("Enabled extensions: " + info.Settings.Get("extmgr.enabled", ""));
            };

            var tmpDir  = info.GetTemp("");
            var watcher = new FileSystemWatcher(tmpDir, "*.*")
            {
                NotifyFilter = NotifyFilters.LastWrite
            };

            watcher.Changed            += WatcherEvent;
            watcher.Created            += WatcherEvent;
            watcher.EnableRaisingEvents = true;
        }
Exemple #19
0
        public void CreationTest()
        {
            var tt = new Timetable(TimetableType.Linear);

            var x = new TestEntity("test", tt);

            Assert.AreEqual("test", x.XMLEntity.XName);
            Assert.AreEqual(0, x.Attributes.Count);
            Assert.AreEqual(0, x.Children.Count);
            Assert.AreEqual(0, x.XMLEntity.Attributes.Count);
            Assert.AreEqual(0, x.XMLEntity.Children.Count);
            Assert.AreEqual(null, x.XMLEntity.Value);
            Assert.AreEqual(tt, x.ParentTimetable);

            // externes setzen
            x.SetAttribute("test-attr1", "test-attr1-val");
            Assert.IsTrue(x.Attributes.Count == 1);
            Assert.IsTrue(x.Attributes.ContainsKey("test-attr1"));
            Assert.AreEqual("test-attr1-val", x.Attributes["test-attr1"]);
            Assert.AreEqual("test-attr1-val", x.GetAttribute <string>("test-attr1"));

            Assert.IsTrue(x.XMLEntity.Attributes.Count == 1);
            Assert.IsTrue(x.XMLEntity.Attributes.ContainsKey("test-attr1"));
            Assert.AreEqual("test-attr1-val", x.XMLEntity.Attributes["test-attr1"]);
            Assert.AreEqual("test-attr1-val", x.XMLEntity.GetAttribute <string>("test-attr1"));

            // internes setzen
            Assert.AreEqual(null, x.GetAttribute <string>("test-attr2"));
            Assert.AreEqual(0, x.GetAttribute <int>("test-attr2"));
            Assert.AreEqual(null, x.XMLEntity.GetAttribute <string>("test-attr2"));
            Assert.AreEqual(0, x.XMLEntity.GetAttribute <int>("test-attr2"));
            x.Attributes["test-attr2"] = "2";
            Assert.AreEqual("2", x.GetAttribute <string>("test-attr2"));
            Assert.AreEqual(2, x.GetAttribute <int>("test-attr2"));
            Assert.AreEqual("2", x.XMLEntity.GetAttribute <string>("test-attr2"));
            Assert.AreEqual(2, x.XMLEntity.GetAttribute <int>("test-attr2"));

            // externes Löschen
            x.RemoveAttribute("test-attr1");
            Assert.AreEqual(null, x.GetAttribute <string>("test-attr1"));
            Assert.IsFalse(x.Attributes.ContainsKey("test-attr1"));
            Assert.AreEqual(null, x.XMLEntity.GetAttribute <string>("test-attr1"));
            Assert.IsFalse(x.XMLEntity.Attributes.ContainsKey("test-attr1"));

            // internes Löschen
            x.Attributes.Remove("test-attr2");
            Assert.AreEqual(0, x.GetAttribute <int>("test-attr2"));
            Assert.AreEqual(0, x.XMLEntity.GetAttribute <int>("test-attr2"));

            // Collections tauschen
            x.SetAttribute("test", "1");
            x.Attributes = new Dictionary <string, string>();
            Assert.AreEqual(null, x.GetAttribute <string>("test"));
            Assert.IsEmpty(x.XMLEntity.Attributes);

            // Children (simple)
            var x2 = new XMLEntity("c");

            x.Children.Add(x2);
            Assert.AreEqual(1, x.Children.Count);
            Assert.AreEqual("c", x.Children[0].XName);
            Assert.AreEqual(1, x.XMLEntity.Children.Count);
            Assert.AreEqual("c", x.XMLEntity.Children[0].XName);
            x.Children.RemoveAt(0);
            Assert.AreEqual(0, x.Children.Count);
            Assert.AreEqual(0, x.XMLEntity.Children.Count);
        }
Exemple #20
0
 public TestEntity(XMLEntity en, Timetable tt) : base(en, tt)
 {
 }
Exemple #21
0
 /// <inheritdoc />
 public Track(XMLEntity en, Timetable tt) : base(en, tt)
 {
 }