public override void Salva(object o, PersistEvent param) { //TODO bel controllo sul tipo con reflection string badUser = (string)param.ToPersist; //Questo metodo riceverà un set di stringhe quindi effettuo il cast //prima il documento andrà letto XmlDocument xdocument = new XmlDocument(); try { //Carico il documento xml xdocument.Load(Filename); //Flusso normale il file esiste //Prendo tutti i nodi blacklist XmlNodeList blacklists = xdocument.SelectNodes("/blacklists/blacklist"); /*DA LEGGERE PER CAPIRE IL FLUSSO*/ //Da inserire cosa fare dipendentemente dall'azione //se l'aggiunta va a buon fine aggiungo senza controllare //Dato che il set mi ha dato true nel controller //Questa voce è univoca //Idem per la delete, se lo tolgo e l'operazione ha dato true //Cerco la entry e la tolgo a colpo sicuro //Per prima cosa trovo la mia blacklist foreach (XmlNode blacklist in blacklists) { if (blacklist.Attributes.GetNamedItem("proprietario").Value.Equals(Utente.GetNomeUtente())) { //Se l'operazione era di aggiunta appendo l'elemento if (param.Action.Equals("aggiungi")) { var xutente = xdocument.CreateElement("utente"); xutente.InnerText = badUser; blacklist.AppendChild(xutente); //Se era rimuovi -> rimuovo like pino la lavatrice } else if (param.Action.Equals("rimuovi")) { foreach (XmlNode user in blacklist.ChildNodes) { if (user.InnerText.Equals(badUser)) { blacklist.RemoveChild(user); } } } } } XmlWriterSettings settings = new XmlWriterSettings { Indent = true }; //Scrivo il file XmlWriter writer = XmlWriter.Create(Filename, settings); xdocument.Save(writer); //Ricordarsi la close sennò si hanno vari problemi writer.Close(); } catch (Exception e) { //Tutto da fare solamente in caso di add, //Dato che il file è vuoto, non esistono regole //La remove non avrebbe senso xdocument = new XmlDocument(); //flusso anormale il file non esiste //creo il tag blacklists XmlElement blacklists = xdocument.CreateElement("blacklists"); //creo il tag blacklist XmlElement blacklist = xdocument.CreateElement("blacklist"); //metto l'attributo per il proprietario blacklist.SetAttribute("proprietario", Utente.GetNomeUtente()); //Aggiungo l'utente al dom var utentexml = xdocument.CreateElement("utente"); utentexml.InnerText = badUser; blacklist.AppendChild(utentexml); //Aggangio la blacklist al nostro contenitore blacklists blacklists.AppendChild(blacklist); //Solfa per creare il documento xml XmlDeclaration xmlDeclaration = xdocument.CreateXmlDeclaration("1.0", "UTF-8", null); XmlElement root = xdocument.DocumentElement; xdocument.InsertBefore(xmlDeclaration, root); //Aggiungo blacklists al dom xdocument.AppendChild(blacklists); XmlWriterSettings settings = new XmlWriterSettings { Indent = true }; //Aggiungo il writer XmlWriter writer = XmlWriter.Create(Filename, settings); //XmlSchemaSet schemas = new XmlSchemaSet(); //Bisogna trovare una LLLLLLOCATION per tutte queste impostazioni //chemas.Add("", @"C:\Users\massi\Desktop\blacklist.xsd"); //xdocument.Schemas = schemas; try { //Scrivo il file // xdocument.Validate((oggetto, handler) => { }); xdocument.Save(writer); writer.Close(); }catch (Exception ex) { throw new PersistenceException("Non è stato possibile scrivere il file .xml"); } } }
//Si suppone che object o sia una impostazione trasferimento public override void Salva(object o, PersistEvent param) { ImpostazioneTrasferimento.ImpostazioneTrasferimento toPut = (ImpostazioneTrasferimento.ImpostazioneTrasferimento)param.ToPersist; XmlDocument xdocument = new XmlDocument(); try { xdocument.Load(Filename); //Dato che sono stato chiamato e il file esiste, si suppone che ci sia da fare un inserimento consono //Mi ri-permetto di andare liscio (a spade) XmlNode impostazioniMainNode = xdocument.DocumentElement; if (param.Action.Equals("aggiungi")) { //Caso di aggiunta si veda sotto nel catch per commenti dettagliati XmlElement xImpostazione = xdocument.CreateElement("impostazione"); xImpostazione.SetAttribute("utente", Utente.GetNomeUtente()); XmlElement cartellaSorgente = xdocument.CreateElement("cartella-sorgente"); cartellaSorgente.InnerText = toPut.CartellaSorgente.Path; XmlElement cartellaDestinazione = xdocument.CreateElement("cartella-destinazione"); cartellaDestinazione.InnerText = toPut.CartellaDestinazione; XmlElement verso = xdocument.CreateElement("verso"); verso.InnerText = toPut.Verso; xImpostazione.AppendChild(cartellaSorgente); xImpostazione.AppendChild(cartellaDestinazione); xImpostazione.AppendChild(verso); impostazioniMainNode.AppendChild(xImpostazione); } else if (param.Action.Equals("rimuovi")) { //Caso di rimozione //Itero, trovo l'impostazione che fa al caso mio e la rimuovo da impostazioni main node //E tutti amici come prima foreach (XmlNode impostazioneNode in impostazioniMainNode.ChildNodes) { if (impostazioneNode.Attributes.GetNamedItem("utente").Value.Equals(Utente.GetNomeUtente())) { //Controllo il contenuto bool found = true; foreach (XmlNode valueImpostazione in impostazioneNode.ChildNodes) { if (!valueImpostazione.Name.Equals("verso")) { found = found && ( ((valueImpostazione.Name.Equals("cartella-sorgente") && valueImpostazione.InnerText.Equals(toPut.CartellaSorgente.Path))) || (valueImpostazione.Name.Equals("cartella-destinazione") && valueImpostazione.InnerText.Equals(toPut.CartellaDestinazione))); } } if (found) { impostazioniMainNode.RemoveChild(impostazioneNode); } } } } XmlWriterSettings settings = new XmlWriterSettings { Indent = true }; //Scrivo il file XmlWriter writer = XmlWriter.Create(Filename, settings); xdocument.Save(writer); //Ricordarsi la close sennò si hanno vari problemi writer.Close(); } catch { //Il documento esiste, aggiungo andando liscio(a spade) xdocument = new XmlDocument(); //Creo il tag contenitore XmlElement impostazioni = xdocument.CreateElement("impostazioni"); //Creo il tag per la mia impostazione XmlElement impostazione = xdocument.CreateElement("impostazione"); //Imposto l'attributo utente in modo consono impostazione.SetAttribute("utente", Utente.GetNomeUtente()); //Creo gli i figli che compongono il tag impostazione e gli do il valore che devo inserire XmlElement cartellaSorgente = xdocument.CreateElement("cartella-sorgente"); cartellaSorgente.InnerText = toPut.CartellaSorgente.Path; XmlElement cartellaDestinazione = xdocument.CreateElement("cartella-destinazione"); cartellaDestinazione.InnerText = toPut.CartellaDestinazione; XmlElement verso = xdocument.CreateElement("verso"); verso.InnerText = toPut.Verso; //Creo l'albero XML da aggiungere al DOM appena verra creato impostazione.AppendChild(cartellaSorgente); impostazione.AppendChild(cartellaDestinazione); impostazione.AppendChild(verso); impostazioni.AppendChild(impostazione); XmlDeclaration xmlDeclaration = xdocument.CreateXmlDeclaration("1.0", "UTF-8", null); //Creo la document root XmlElement root = xdocument.DocumentElement; xdocument.InsertBefore(xmlDeclaration, root); //Aggiungo impostazioni al dom xdocument.AppendChild(impostazioni); //Scrivo il file XmlWriterSettings settings = new XmlWriterSettings { Indent = true }; //Aggiungo il writer XmlWriter writer = XmlWriter.Create(Filename, settings); //TODO Aggiungere lo schema xdocument.Save(writer); writer.Close(); } }
public abstract void Salva(object o, PersistEvent e);