//---------------------------------------------------------------------------------- // Dokumentoperationen public bool NewDoc(string currentLevel, string nameNewDoc, string newTitle, string descr) { // XPath- Ausdruck zur Abfrage des aktuellen Knotens lock (this) { string[] levels = currentLevel.Split('.'); // Zugriff auf den Knoten XElement currentEntry = _directory.XPathSelectElement(WocNameToXPath(levels), _nsmgr); Debug.Assert(currentEntry != null); mkoIt.Xhtml.Directory.e newDir = new mkoIt.Xhtml.Directory.e(); newDir.id = nameNewDoc; newDir.t = newTitle; newDir.descr = descr; newDir.ver = 1; newDir.d = DateTime.Now; newDir.ix = 1; // Prüfen, ob das Dokument bereits existiert string[] newLevels = (currentLevel + "." + newDir.id).Split('.'); if (_directory.XPathSelectElement(WocNameToXPath(newLevels), _nsmgr) != null) { throw new Exception("Das Unterverzeichnis " + nameNewDoc + " existiert bereits"); } // Markieren des Knotens als Dokumentknoten mkoIt.Xhtml.Directory.eVal val = new mkoIt.Xhtml.Directory.eVal(); val.parser = "Editor.aspx"; val.viewer = "woc.aspx"; val.Value = currentLevel + "." + newDir.id; newDir.Items = new object[] { val }; string newDirSerialized; mko.algorithm.InfosSerializer <mkoIt.Xhtml.Directory.e> .WriteToXml(newDir, out newDirSerialized); currentEntry.Add(XElement.Parse(newDirSerialized)); // Alle Index- Attribute neu nummerieren int ix = 1; foreach (XElement e in currentEntry.XPathSelectElements("./vz:e", _nsmgr)) { e.SetAttributeValue(XName.Get("ix"), ix++); } // Erweiterten Verzeichnisbaum sichern SaveDirectoryChanges(); } return(true); }
/// <summary> /// Verschiebt ein Woc- Dokument innerhalb der Woc Hierarchie. /// Ein Woc- Name ist der Dateiname der Xhtml- Datei im App_Data Verzeichnis ohne Extension /// </summary> /// <param name="oldWocName"></param> /// <param name="newWocName"></param> /// <returns></returns> public bool DocCopy(string srcWocName, string destWocName, string newTitle, bool deleteSrcWoc) { lock (this) { if (srcWocName == destWocName) { return(true); } string[] srcLevels = srcWocName.Split('.'); string[] destLevels = destWocName.Split('.'); // Zugriff auf den bestehenden Knoten XElement srcEntry = _directory.XPathSelectElement(WocNameToXPath(srcLevels), _nsmgr); Debug.Assert(srcEntry != null); // Prüfen, ob das Verzeichnis für den neuen Namen existiert XElement destHomeDir = _directory.XPathSelectElement(WocNameToXPath(destLevels, destLevels.Length - 1), _nsmgr); if (destHomeDir == null) { throw new Exception("Das Zielverzeichnis existiert nicht"); } // Prüfen, ob der neue Name nicht bereits für ein anderes Dokument vergeben wurde if (_directory.XPathSelectElement(WocNameToXPath(destLevels), _nsmgr) != null) { throw new Exception("Der Name " + destWocName + " wurde bereits für ein Unterverzeichnis verwendet"); } // Neuen Verzeichniseintrag anlegen mkoIt.Xhtml.Directory.e newDir = new mkoIt.Xhtml.Directory.e(); newDir.id = GetWocNodeId(destLevels); newDir.t = newTitle; newDir.descr = srcEntry.XPathSelectElement("./vz:descr", _nsmgr).Value; if (srcEntry.Attribute(XName.Get("ver")) != null) { newDir.ver = int.Parse(srcEntry.Attribute(XName.Get("ver")).Value) + 1; } else { newDir.ver = 1; } newDir.d = DateTime.Now; newDir.ix = 1; // Markieren des Knotens als Dokumentknoten mkoIt.Xhtml.Directory.eVal val = new mkoIt.Xhtml.Directory.eVal(); val.parser = "Editor.aspx"; val.viewer = "woc.aspx"; val.Value = destWocName; newDir.Items = new object[] { val }; string newDocSerialized; mko.algorithm.InfosSerializer <mkoIt.Xhtml.Directory.e> .WriteToXml(newDir, out newDocSerialized); destHomeDir.Add(XElement.Parse(newDocSerialized)); // Alten Verzeichniseintrag löschen if (deleteSrcWoc) { srcEntry.Remove(); } // xhtml Datei an neuen Speicherort verschieben/kopieren und Hyperlinks im Dokument anpassen string oldXhtmlName = HttpContext.Current.Server.MapPath("~/App_Data/" + srcWocName + ".xhtml"); if (File.Exists(oldXhtmlName)) { string newXhtmlName = HttpContext.Current.Server.MapPath("~/App_Data/" + destWocName + ".xhtml"); if (File.Exists(destWocName)) { throw new Exception("Das Dokument " + srcWocName + ".xhtml kann nicht in " + destWocName + " umbenannt werden, da Datei bereits existiert !"); } if (deleteSrcWoc) { File.Move(oldXhtmlName, newXhtmlName); } else { File.Copy(oldXhtmlName, newXhtmlName); } // Zugehörige Bilder umbenennen // Alle Bilder zum Dokument bestimmen foreach (string img in Directory.GetFiles(HttpContext.Current.Server.MapPath("~/Bilder"))) { if (img.Contains(srcWocName)) { // Umbenennen string newImgName = img.Replace(srcWocName, destWocName); if (deleteSrcWoc) { File.Move(img, newImgName); } else { File.Copy(img, newImgName); } } } // Bildreferenzen im Xhtml- Dokument ändern string txtXhtml = "<body>" + File.ReadAllText(newXhtmlName) + "</body>"; XElement xhtmlDoc = XElement.Parse(txtXhtml); foreach (XElement img in xhtmlDoc.XPathSelectElements("//img")) { string oldSrc = img.Attribute(XName.Get("src")).Value; string newSrc = oldSrc.Replace(srcWocName, destWocName); img.SetAttributeValue(XName.Get("src"), newSrc); } // Geändertes Xhtml zurückschreiben StringBuilder bld = new StringBuilder(); foreach (XElement xe in xhtmlDoc.Elements()) { bld.Append(xe.ToString()); } File.WriteAllText(newXhtmlName, bld.ToString()); } // Erweiterten Verzeichnisbaum sichern SaveDirectoryChanges(); } return(true); }
public bool DirCopy(string srcWocName, string destWocName, string newTitle, bool deleteSrcWoc) { // XPath- Ausdruck zur Abfrage des aktuellen Knotens lock (this) { if (srcWocName == destWocName) { return(true); } if (srcWocName == RootNode.Key) { throw new Exception("Das Hauptverzeichnis kann nicht kopiert werden"); } if (destWocName == RootNode.Key) { throw new Exception("Das Hauptverzeichnis darf nicht das Ziel einer Kopier-/Verschiebeoperation sein."); } string[] srcLevels = srcWocName.Split('.'); string[] destLevels = destWocName.Split('.'); // Zugriff auf den bestehenden Knoten XElement srcEntry = _directory.XPathSelectElement(WocNameToXPath(srcLevels), _nsmgr); Debug.Assert(srcEntry != null); // Prüfen, ob das Verzeichnis für den neuen Namen existiert XElement destHomeDir = _directory.XPathSelectElement(WocNameToXPath(destLevels, destLevels.Length - 1), _nsmgr); if (destHomeDir == null) { throw new Exception("Das Zielverzeichnis existiert nicht"); } // Prüfen, ob der neue Name nicht bereits für ein anderes Dokument vergeben wurde if (_directory.XPathSelectElement(WocNameToXPath(destLevels), _nsmgr) != null) { throw new Exception("Der Name " + destWocName + " wurde bereits für ein Unterverzeichnis verwendet"); } // Neuen Verzeichniseintrag anlegen mkoIt.Xhtml.Directory.e newDir = new mkoIt.Xhtml.Directory.e(); newDir.id = GetWocNodeId(destLevels); newDir.t = newTitle; newDir.descr = srcEntry.XPathSelectElement("./vz:descr", _nsmgr).Value; if (srcEntry.Attribute(XName.Get("ver")) != null) { newDir.ver = int.Parse(srcEntry.Attribute(XName.Get("ver")).Value); } else { newDir.ver = 1; } newDir.d = DateTime.Now; newDir.ix = 1; string newDirSerialized; mko.algorithm.InfosSerializer <mkoIt.Xhtml.Directory.e> .WriteToXml(newDir, out newDirSerialized); destHomeDir.Add(XElement.Parse(newDirSerialized)); // Alle Dokumente und Unterverzeichnisse an die neue Position verschieben foreach (XElement entry in srcEntry.Elements(XName.Get("e", NamespaceDirectory)).ToArray()) { string srcSubWocName = srcWocName + "." + entry.Attribute(XName.Get("id")).Value; string newSubTitle = entry.Attribute(XName.Get("t")).Value; string destSubWocName = destWocName + "." + entry.Attribute(XName.Get("id")).Value; if (entry.XPathSelectElement("./vz:val", _nsmgr) != null) { // Dokument verschieben DocCopy(srcSubWocName, destSubWocName, newSubTitle, deleteSrcWoc); } else { // Unterverzeichnis verschieben-> Rekursion DirCopy(srcSubWocName, destSubWocName, newSubTitle, deleteSrcWoc); } // Zwischenstand sichern BuildSiteMap(); } // Löschen des alten Knotens if (deleteSrcWoc) { srcEntry.Remove(); } // Erweiterten Verzeichnisbaum sichern SaveDirectoryChanges(); } return(true); }