export( String treeName, DatabaseInterface dbConnection) { /////////////////////////////////////// MemoryStream XmlCompressedStream = new MemoryStream(); try { Albero treeToExport = dbConnection.getAlbero(treeName); XmlCompressedStream = FileEngine.assembleXML(treeToExport); } catch (Exception dbError) { Console.WriteLine(dbError.Message); return null; } return XmlCompressedStream; } // End of method export()
create (String treeName, String treeType, String[] buildingParameters, Dictionary <String, String[]> nodeAttrList, Dictionary <String, String[]> edgeAttrList) { /////////////////////////////////////////////////////////////////////// /* * Il parametro buildingParameters e' un array di stringhe ciascuna * contenente un'informazione utile alla costruzione del generico * grafo, in questo caso "splitSize" e "depth" per determinare la * struttura dell'albero. I dizionari devono essere cosi impiegati: * Dictionary<String -> NomeAttributo, String[] -> ParametriAddizionali * Nello specifico: * <String[0] -> Tipo, String[1] -> RegolaGenerazione * Tipo := "string", "numeric" * RegolaGenerazione := "string", "random" * Nota: la regola di generazione random e' acquisita inserendo un dash * per indicare l'intervallo K-N (e.g. "17-244" ). */ int splitSize = int.Parse(buildingParameters[0]); int depth = int.Parse(buildingParameters[1]); Albero tree = new Albero(treeName, treeType, splitSize, depth, nodeAttrList, edgeAttrList); /*** buildingParameters[0] = splitSize; buildingParameters[1] = depth; ***/ MemoryStream XmlCompressedStream = new MemoryStream(); XmlCompressedStream = FileEngine.assembleXML(tree); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * ATTENZIONE: Chiusura del writer, cleanup finale * da effettuare nel Main(), dopo l'invio dello stream * al client! * * XmlStream.Close(); * XmlStream.Dispose(); * * * * * * * * * * * * * * * * * * * * * * * * * * */ return(XmlCompressedStream); } // End of method create()
import( MemoryStream XmlCompressedStream, DatabaseInterface dbConnection ) { /////////////////////////////////////////////// int success = 0; int failure = 1; Albero treeToImport = FileEngine.parseXML(XmlCompressedStream); // Console.WriteLine(treeToImport.nome); if (!Convert.ToBoolean(dbConnection.storeAlbero(treeToImport))) { return success; } else { return failure; } /*DatabaseInterface db = new DatabaseInterface("local", null,null); Dictionary<String, String[]> vertexAttrib = new Dictionary<string, string[]>(); vertexAttrib.Add("Altezza", new String[]{"string", "primoValore"}); vertexAttrib.Add ("Peso", new String[]{"numeric", "1"}); Albero a = new Albero("enzo4", "Triste", 3, 2, vertexAttrib, vertexAttrib); db.storeAlbero(a);*/ } // End of method import()
/*___________________________________________________________________________________________________*/ public void HandleClient(object obj) { TcpClient client = (TcpClient)obj; StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.UTF8); StreamReader sReader = new StreamReader(client.GetStream(), Encoding.UTF8); Boolean bClientConnected = true; String[] dbCred = sReader.ReadLine().Split('$'); DatabaseInterface dbInter = new DatabaseInterface(dbCred[0], dbCred[1], dbCred[2]); String check_auth = dbInter.check().ToString(); sWriter.WriteLine(check_auth); sWriter.Flush(); /*Connessione al database fallita*/ if (check_auth.Equals("1")) { client.Close(); return; } /*Connessione al database andata a buon fine*/ /*Prendiamo i dati dal database*/ /*Dobbiamo separare i dati contenuti in infoAlbero[] in lista alberi con relativi attributi (Divisi tra * vertex ed edge)*/ /*NomeAlbero#attr1Vertex?tipo:attr2Vertex?tipo#attrEdge?tipo:attrEdge2?tipo$NomeAlbero2#etc*/ InfoAlbero[] infoAlbero = dbInter.getListaAlberi(); if (infoAlbero.Length == 0) { sWriter.WriteLine("Vuoto"); sWriter.Flush(); } else { //Console.WriteLine(parametersParser(dbInter.getListaAlberi())); sWriter.WriteLine(parametersParser(infoAlbero)); sWriter.Flush(); } /*Dobbiamo spedire la attribute definitions*/ Dictionary <String, String> attributeDefinition = dbInter.getAttributeDefinition(); /*foreach (KeyValuePair<String, String> val in attributeDefinition) * { * Console.WriteLine(val); * }*/ //Console.WriteLine(parametersParser(attributeDefinition)); sWriter.WriteLine(parametersParser(attributeDefinition)); sWriter.Flush(); String response = ""; /*_____Inizio scelta funzioni in base all'operazione scelta__________________________________________________*/ NetworkStream netStr = client.GetStream(); TreeLogicEngine engine = new TreeLogicEngine(); while (bClientConnected) { response = sReader.ReadLine(); if (response.Equals("Return")) { continue; } switch (response) { /******************IMPORTA FILE*****************************/ case "Importa": sWriter.WriteLine("Importa"); sWriter.Flush(); /*Leggiamo la dimensione del file da leggere*/ response = sReader.ReadLine(); if (response.Equals("Return")) { break; } int length = int.Parse(response); //Console.WriteLine(length); byte[] file = new byte[length]; netStr.Read(file, 0, length); //Console.WriteLine(file.Length); MemoryStream stream = new MemoryStream(file); /* public static int import(MemoryStream XmlStream, DatabaseInterface DbConnection);*/ sWriter.WriteLine(FileEngine.import(stream, dbInter).ToString()); sWriter.Flush(); break; /******************ESPORTA FILE*****************************/ case "Esporta": sWriter.WriteLine("Esporta"); sWriter.Flush(); response = sReader.ReadLine(); if (response.Equals("Return")) { break; } /*public static MemoryStream export(String treeName, DatabaseInterface DbConnection);*/ //byte[] fileXml = File.ReadAllBytes("Tree.xml"); byte[] fileXml = FileEngine.export(response, dbInter).ToArray(); sWriter.WriteLine(fileXml.Length.ToString()); sWriter.Flush(); netStr.Write(fileXml, 0, fileXml.Length); break; /******************CREA ALBERO*****************************/ case "Crea": sWriter.WriteLine("Crea"); sWriter.Flush(); String[] NomTipSplitDepth = new String[4]; String[] SplitDept = new String[2]; //Nome$Tipo$Splitsize$Depth response = sReader.ReadLine(); if (response.Equals("Return")) { break; } NomTipSplitDepth = response.Split('$'); SplitDept[0] = NomTipSplitDepth[2]; SplitDept[1] = NomTipSplitDepth[3]; //NomeAttrVertex1#tipoAttr:valore$NomeAttrVertex2#tipoAttr2:valore2$etc response = sReader.ReadLine(); if (response.Equals("Return")) { break; } Dictionary <String, String[]> vertexAttrList = parametersParser(response); //NomeAttrEdge1#tipoAttr:valore$NomeAttrEdge2#tipoAttr2:valore2$etc response = sReader.ReadLine(); if (response.Equals("Return")) { break; } Dictionary <String, String[]> edgeAttrList = parametersParser(response); //byte[] fileX = File.ReadAllBytes("Tree.xml"); byte[] fileX = engine.create(NomTipSplitDepth[0], NomTipSplitDepth[1], SplitDept, vertexAttrList, edgeAttrList).ToArray(); sWriter.WriteLine(fileX.Length.ToString()); sWriter.Flush(); netStr.Write(fileX, 0, fileX.Length); break; /******************MODIFICA ALBERO*****************************/ case "Modifica": /* int edit(String graphName,int startNode,int endNode, Dictionary<String, String> newNodeAttrList, Dictionary<String, String> newEdgeAttrList, DatabaseInterface dbConnection);*/ sWriter.WriteLine("Modifica"); sWriter.Flush(); infoAlbero = dbInter.getListaAlberi(); if (infoAlbero.Length == 0) { sWriter.WriteLine("Vuoto"); sWriter.Flush(); } else { //Console.WriteLine(parametersParser(dbInter.getListaAlberi())); /*NomeAlbero#attr1Vertex?tipo:attr2Vertex?tipo#attrEdge?tipo:attrEdge2?tipo$NomeAlbero2#etc*/ sWriter.WriteLine(parametersParser(infoAlbero)); sWriter.Flush(); } response = sReader.ReadLine(); if (response.Equals("Return")) { break; } String[] nomeInizFin = response.Split('$'); response = sReader.ReadLine(); String newAttrVertex = response; if (response.Equals("Return")) { break; } Dictionary <String, String> newNodeAttrList = paramParser(response); response = sReader.ReadLine(); String newAttrEdge = response; if (response.Equals("Return")) { break; } Dictionary <String, String> newEdgeAttrList = paramParser(response); sWriter.WriteLine(engine.edit(nomeInizFin[0], int.Parse(nomeInizFin[1]), int.Parse(nomeInizFin[2]), newNodeAttrList, newEdgeAttrList, dbInter).ToString()); sWriter.Flush(); break; /******************CALCOLA ALBERO*****************************/ case "Calcola": sWriter.WriteLine("Calcola"); sWriter.Flush(); attributeDefinition = dbInter.getAttributeDefinition(); infoAlbero = dbInter.getListaAlberi(); if (infoAlbero.Length == 0) { sWriter.WriteLine("Vuoto"); sWriter.Flush(); } else { //Console.WriteLine(parametersParser(dbInter.getListaAlberi())); /*NomeAlbero#attr1Vertex?tipo:attr2Vertex?tipo#attrEdge?tipo:attrEdge2?tipo$NomeAlbero2#etc*/ sWriter.WriteLine(parametersParser(infoAlbero)); sWriter.Flush(); } response = sReader.ReadLine(); if (response.Equals("Return")) { break; } String[] nif = response.Split('$'); response = sReader.ReadLine(); if (response.Equals("Return")) { break; } String[] vertAttr = response.Split('$'); response = sReader.ReadLine(); if (response.Equals("Return")) { break; } String[] edgAttr = response.Split('$'); /*long calculate(int startNode, int endNode, String treeName, Dictionayr<String, String> edgeAttrList, Dictionary<String, String> vertexAttrList, DatabaseInterface dbInterface)*/ Dictionary <String, String> edgeAttr = getAttrType(edgAttr, attributeDefinition); Dictionary <String, String> vertexAttr = getAttrType(vertAttr, attributeDefinition); sWriter.WriteLine(engine.calculate(int.Parse(nif[1]), int.Parse(nif[2]), nif[0], edgeAttr, vertexAttr, dbInter).ToString()); sWriter.Flush(); break; case "Disconnect": bClientConnected = false; break; default: Console.WriteLine("Errore..."); bClientConnected = false; break; } //Fine switch } //Fine while client.Close(); }//Fine HandleClient
parseXML( MemoryStream XmlCompressedStream ) { //////////////////////////////////////////////////// MemoryStream XmlDecompressedStream = new MemoryStream(); XmlDecompressedStream = Exflator.decompress(XmlCompressedStream); /*** Rimozione dall'heap degli oggetti oramai non più utili ***/ XmlCompressedStream.Close(); XmlCompressedStream.Dispose(); XmlDecompressedStream.Position = 0; XmlReader reader = XmlReader.Create(XmlDecompressedStream); /* /*** Controllo se il file XML contiene un albero *** while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { switch(reader.Name) { case "tree": break; case "header": return null; } } } */ /*** Analisi del custom XML header ***/ /*** Strutture ed oggetti che verranno riempiti per costruire l'albero ***/ String treeName = ""; String treeType = ""; int treeSplit = 0; int treeDepth = 0; Dictionary<String, String[]> nodeAttributeList = new Dictionary<String, String[]>(); Dictionary<String, String[]> edgeAttributeList = new Dictionary<String, String[]>(); /*** Finchè non si raggiunge la treeDepth non si e' conclusa l'analisi dell'header ***/ bool EndOfTreeInfo = false; while (reader.Read() && !EndOfTreeInfo) { if (reader.NodeType == XmlNodeType.Element) { switch(reader.Name) { case "treeName": while (reader.Read()) { if (reader.NodeType == XmlNodeType.Text) { treeName = reader.Value; break; } } break; case "treeType": while (reader.Read()) { if (reader.NodeType == XmlNodeType.Text) { treeType = reader.Value; break; } } break; case "treeSplit": while (reader.Read()) { if (reader.NodeType == XmlNodeType.Text) { treeSplit = Int32.Parse(reader.Value); break; } } break; case "treeDepth": while (reader.Read()) { if (reader.NodeType == XmlNodeType.Text) { treeDepth = Int32.Parse(reader.Value); EndOfTreeInfo = true; break; } } break; } } } nodeAttributeList = FileEngine.nodeAttrParser(XmlDecompressedStream); edgeAttributeList = FileEngine.edgeAttrParser(XmlDecompressedStream); Albero Tree = new Albero(treeName, treeType, treeSplit, treeDepth, nodeAttributeList, edgeAttributeList); /*** Analisi dell'XML elementTable ***/ restoreValues(Tree, XmlDecompressedStream); return Tree; } // End of method parseXML()
assembleXML( Albero Tree ) { /////////////////////////////////// /*** Settaggio impostazioni XmlWriter ***/ XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = ("\t"); settings.Encoding = System.Text.Encoding.UTF8; settings.NewLineChars = Environment.NewLine; settings.NewLineHandling = NewLineHandling.Replace; settings.OmitXmlDeclaration = false; MemoryStream XmlStream = new MemoryStream(); XmlWriter writer = XmlWriter.Create(XmlStream, settings); /*** Inizio scrittura del codice XML ***/ String depth = Convert.ToString(Tree.depth); String splitSize = Convert.ToString(Tree.splitSize); writer.WriteStartDocument(); writer.WriteStartElement("tree"); writer.WriteStartElement("header"); writer.WriteElementString("treeName", Tree.nome); writer.WriteElementString("treeType", Tree.tipo); writer.WriteElementString("treeSplit", splitSize); writer.WriteElementString("treeDepth", depth); writer.WriteStartElement("treeNodeAttributeList"); foreach (KeyValuePair<String, String[]> pair in Tree.VertexAttributeList) { writer.WriteStartElement("treeNodeAttribute"); writer.WriteElementString("treeNodeAttrName", pair.Key.ToString()); writer.WriteElementString("treeNodeAttrType", pair.Value[0].ToString()); writer.WriteElementString("treeNodeAttrGenRule", pair.Value[1].ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteStartElement("treeEdgeAttributeList"); foreach (KeyValuePair<String, String[]> pair in Tree.EdgeAttributeList) { writer.WriteStartElement("treeEdgeAttribute"); writer.WriteElementString("treeEdgeAttrName", pair.Key.ToString()); writer.WriteElementString("treeEdgeAttrType", pair.Value[0].ToString()); writer.WriteElementString("treeEdgeAttrGenRule", pair.Value[1].ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); /*** Chiusura di header ***/ writer.WriteEndElement(); writer.WriteStartElement("elementTable"); FileEngine.XmlTraversal(writer, Tree); /*** Chiusura di elementTable ***/ writer.WriteEndElement(); /*** Chiusura di tree ***/ writer.WriteEndElement(); writer.WriteEndDocument(); writer.Flush(); MemoryStream XmlCompressedStream = new MemoryStream(); XmlCompressedStream = Exflator.compress(XmlStream); XmlStream.Close(); XmlStream.Dispose(); return XmlCompressedStream; } // End of method assembleXML()