XmlData.cs

00001 using System;
00002 using System.Collections.Generic;
00003 using System.Text;
00004 using System.Xml;
00005 using System.Reflection;
00006 using System.IO;
00007 using System.Data;
00008 using Shared;
00009 using Server.Data;
00010 
00011 namespace Server.Data
00012 {
00018     public class XmlData : IPersistentData
00019     {
00020         XmlWriterSettings writerSettings;
00021         DataContainer data;
00022         private Dictionary<int, Comment> LoadComments()
00023         {
00024             return new Dictionary<int, Comment>();
00025         }
00026         
00030         public XmlData()
00031         {
00032             writerSettings = new XmlWriterSettings();
00033             writerSettings.Indent = true;
00034             writerSettings.IndentChars = ("    ");
00035         }
00036         
00041         public DataContainer LoadData()
00042         {
00043             data = new DataContainer(LoadProjects(), LoadLiterature(), LoadComments(), LoadPersons(), DataContainer.CreateEmptyTagTable());
00044             LoadTags();
00045             LoadRoles();
00046             LoadReferences();
00047             return data;
00048         }
00049 
00054         public void SaveData(DataContainer data)
00055         {
00056             SaveProjects(data);
00057             SaveLiterature(data);
00058             SavePersons(data);
00059             SaveTags(data);
00060         }
00065         private Dictionary<int, Project> LoadProjects()
00066         {
00067             Dictionary<int, Project> projectTable = new Dictionary<int, Project>();
00068             
00069             string projectPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Projects.XML";
00070             if (!File.Exists(projectPath))
00071                 return projectTable;
00072             
00073             using (System.Xml.XmlTextReader reader =
00074             new System.Xml.XmlTextReader(projectPath))
00075             {
00076                 // temp variables 
00077                 int id = 0;
00078                 DateTime start = DateTime.Now;
00079                 string title = "";
00080                 string subject = "";
00081                 string department = "";
00082                 
00083                 Project project = null;
00084                 while (reader.Read())
00085                 {
00086                     reader.MoveToContent();
00087 
00088                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00089                         reader.Name == "Project")
00090                     {
00091                         if (project != null) 
00092                             projectTable.Add(project.ID, project);
00093                         project = new Project(id, start, DateTime.MinValue, subject, title, department, "", false);
00094                     }
00095 
00096                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00097                         reader.Name == "StartDate")
00098                     {
00099                         reader.Read(); reader.MoveToContent();
00100                         project.StartDate = DateTime.FromFileTime(Convert.ToInt64(reader.Value));
00101 
00102                     }
00103 
00104                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00105                         reader.Name == "Title")
00106                     {
00107                         reader.Read(); reader.MoveToContent();
00108                         project.Title = reader.Value;
00109                     }
00110 
00111                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00112                         reader.Name == "Subject")
00113                     {
00114                         reader.Read(); reader.MoveToContent();
00115                         project.Subject = reader.Value;
00116                     }
00117 
00118                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00119                         reader.Name == "Synopsis")
00120                     {
00121                         reader.Read(); reader.MoveToContent();
00122                         project.Synopsis = reader.Value;
00123                     }
00124 
00125                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00126                         reader.Name == "EndDate")
00127                     {
00128                         reader.Read(); reader.MoveToContent();
00129                         project.EndDate = DateTime.FromFileTime(Convert.ToInt64(reader.Value));
00130                     }
00131                     
00132                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00133                         reader.Name == "Department")
00134                     {
00135                         reader.Read(); reader.MoveToContent();
00136                         project.Department = reader.Value;
00137                     }
00138 
00139                     if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "Submitted")
00140                     {
00141                         reader.Read(); reader.MoveToContent();
00142                         project.IsSubmitted = Convert.ToBoolean(reader.Value);
00143                     }
00144 
00145                 }
00146                 if (project != null)
00147                     projectTable.Add(project.ID, project);
00148             }
00149             return projectTable;
00150         }
00155         private Dictionary<int, Literature> LoadLiterature()
00156         {
00157             Dictionary<int, Literature> literatureTable = new Dictionary<int, Literature>();
00158             string literaturePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Literature.XML";
00159             if (!File.Exists(literaturePath))
00160                 return literatureTable;
00161 
00162             using (System.Xml.XmlTextReader reader =
00163             new System.Xml.XmlTextReader(literaturePath))
00164             {
00165                 // temp variables 
00166                 int id = 0;
00167                 string title = "";
00168                 string author = "";
00169                 string summary = "";
00170                 string source = "";
00171                 LiteratureType type = LiteratureType.Book;
00172                 DateTime date = DateTime.Now;
00173 
00174                 Literature lit = null;
00175                 while (reader.Read())
00176                 {
00177                     reader.MoveToContent();
00178 
00179                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00180                         reader.Name == "Literature")
00181                     {
00182                         if (lit != null) literatureTable.Add(lit.ID, lit);
00183                         lit = new Literature(id, null, title, author, summary, source, "", date, type);
00184                     }
00185                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00186                         reader.Name == "ISBN")
00187                     {
00188                         reader.Read(); reader.MoveToContent();
00189                         lit.ISBN = reader.Value;
00190 
00191                     }
00192 
00193                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00194                         reader.Name == "Title")
00195                     {
00196                         reader.Read(); reader.MoveToContent();
00197                         lit.Title = reader.Value;
00198                     }
00199 
00200                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00201                         reader.Name == "Author")
00202                     {
00203                         reader.Read(); reader.MoveToContent();
00204                         lit.Author = reader.Value;
00205                     }
00206 
00207                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00208                         reader.Name == "Summary")
00209                     {
00210                         reader.Read(); reader.MoveToContent();
00211                         lit.Summary = reader.Value;
00212                     }
00213 
00214                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00215                         reader.Name == "Source")
00216                     {
00217                         reader.Read(); reader.MoveToContent();
00218                         lit.Source = reader.Value;
00219                     }
00220 
00221                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00222     reader.Name == "Date")
00223                     {
00224                         reader.Read(); reader.MoveToContent();
00225                         lit.Date = DateTime.FromFileTime(Convert.ToInt64(reader.Value));
00226                     }
00227 
00228                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00229     reader.Name == "Creator")
00230                     {
00231                         reader.Read(); reader.MoveToContent();
00232                         lit.Creator = data.PersonTable[reader.Value];
00233                     }
00234 
00235                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00236                         reader.Name == "Type")
00237                     {
00238                         reader.Read(); reader.MoveToContent();
00239                         lit.Type = (LiteratureType)
00240                             Enum.Parse(typeof(LiteratureType), reader.Value.ToString());
00241                     }
00242                 }
00243                 if (lit != null)
00244                     literatureTable.Add(lit.ID, lit);
00245             }
00246             return literatureTable;
00247         }
00252         private Dictionary<string, Person> LoadPersons()
00253         {
00254             Dictionary<string, Person> personTable = new Dictionary<string, Person>();
00255             string peoplePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Persons.XML";
00256             if (!File.Exists(peoplePath))
00257                 return personTable;
00258 
00259             using (System.Xml.XmlTextReader reader =
00260             new System.Xml.XmlTextReader(peoplePath))
00261             {
00262 
00263                 Person person = null;
00264                 while (reader.Read())
00265                 {
00266                     reader.MoveToContent();
00267 
00268                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00269                         reader.Name == "Person")
00270                     {
00271                         if (person != null) personTable.Add(person.UserName, person);
00272                         person = new Person("", "", "", "", "");
00273                     }
00274 
00275                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00276                         reader.Name == "UserName")
00277                     {
00278                         reader.Read(); reader.MoveToContent();
00279                         person.UserName = reader.Value;
00280                     }
00281 
00282                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00283                         reader.Name == "Moderator")
00284                     {
00285                         reader.Read(); reader.MoveToContent();
00286                         person.Moderator = Convert.ToBoolean(reader.Value);
00287                     }
00288 
00289                     if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "Password")
00290                     {
00291                         reader.Read(); reader.MoveToContent();
00292                         person.Password = reader.Value;
00293                     }
00294 
00295 
00296 
00297                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00298                         reader.Name == "Name")
00299                     {
00300                         reader.Read(); reader.MoveToContent();
00301                         person.Name = reader.Value;
00302                     }
00303 
00304                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00305                         reader.Name == "Department")
00306                     {
00307                         reader.Read(); reader.MoveToContent();
00308                         person.Department = reader.Value;
00309                     }
00310 
00311                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00312                         reader.Name == "Email")
00313                     {
00314                         reader.Read(); reader.MoveToContent();
00315                         person.Department = reader.Value;
00316                     }
00317 
00318                 }
00319                 if (person != null)
00320                     personTable.Add(person.UserName, person);
00321             }
00322             return personTable;
00323         }
00327         private void LoadRoles()
00328         {
00329             string rolePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Roles.XML";
00330             if (!File.Exists(rolePath))
00331                 return;
00332 
00333             using (System.Xml.XmlTextReader reader =
00334             new System.Xml.XmlTextReader(rolePath))
00335             {
00336                 Person person = null;
00337                 Project project = null;
00338                 RoleType type = 0;
00339                 bool foundOne = false;
00340 
00341                 while (reader.Read())
00342                 {
00343                     reader.MoveToContent();
00344 
00345                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00346                         reader.Name == "Role")
00347                     {
00348                         if (foundOne)
00349                         {
00350                             project.AddPerson(person, type);
00351                         }
00352                         foundOne = true;
00353                     }
00354 
00355                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00356                         reader.Name == "Person")
00357                     {
00358                         reader.Read(); reader.MoveToContent();
00359                         person = data.PersonTable[reader.Value];
00360                     }
00361 
00362                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00363                         reader.Name == "Type")
00364                     {
00365                         reader.Read(); reader.MoveToContent();
00366                         type = (RoleType)Enum.Parse(typeof(RoleType), reader.Value.ToString());
00367 
00368                     }
00369                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00370                         reader.Name == "Project")
00371                     {
00372                         reader.Read(); reader.MoveToContent();
00373                         project = data.ProjectTable[Convert.ToInt32(reader.Value)];
00374 
00375                     }
00376 
00377                 }
00378                 if (foundOne)
00379                     project.AddPerson(person, type);
00380             }
00381         }
00385         private void LoadTags()
00386         {
00387             string tagPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Tags.XML";
00388             if (!File.Exists(tagPath))
00389                 return;
00390 
00391             using (System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(tagPath))
00392             {
00393                 string tag = null, user = null;
00394                 int id = -1;
00395 
00396                 while (reader.Read())
00397                 {
00398                     reader.MoveToContent();
00399 
00400                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00401                         reader.Name == "Tag")
00402                     {
00403                         tag = reader.GetAttribute("name");
00404                     }
00405 
00406                     if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "ID")
00407                     {
00408                         user = reader.GetAttribute("UserName");
00409                         id = Convert.ToInt32(reader.ReadString());
00410                         data.Tags.Rows.Add(tag, id.ToString(), user);
00411                     }
00412                 }
00413             }
00414         }
00418         private void LoadReferences()
00419         {
00420             string refPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "References.XML";
00421             if (!File.Exists(refPath))
00422                 return;
00423 
00424             using (System.Xml.XmlTextReader reader =
00425             new System.Xml.XmlTextReader(refPath))
00426             {
00427                 Person person = null;
00428                 Project project = null;
00429                 RoleType type = 0;
00430                 bool foundOne = false;
00431 
00432                 while (reader.Read())
00433                 {
00434                     reader.MoveToContent();
00435 
00436                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00437                         reader.Name == "Role")
00438                     {
00439                         if (foundOne)
00440                         {
00441                             project.AddPerson(person, type);
00442                         }
00443                         foundOne = true;
00444                     }
00445 
00446                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00447                         reader.Name == "Person")
00448                     {
00449                         reader.Read(); reader.MoveToContent();
00450                         person = data.PersonTable[reader.Value];
00451                     }
00452 
00453                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00454                         reader.Name == "Type")
00455                     {
00456                         reader.Read(); reader.MoveToContent();
00457                         type = (RoleType)Enum.Parse(typeof(RoleType), reader.Value.ToString());
00458 
00459                     }
00460                     if (reader.NodeType == System.Xml.XmlNodeType.Element &&
00461                         reader.Name == "Project")
00462                     {
00463                         reader.Read(); reader.MoveToContent();
00464                         project = data.ProjectTable[Convert.ToInt32(reader.Value)];
00465 
00466                     }
00467 
00468                 }
00469                 if (foundOne)
00470                     project.AddPerson(person, type);
00471             }
00472         }
00473 
00478         private void SaveTags(DataContainer data)
00479         {
00480             using (XmlWriter writer = XmlWriter.Create(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Tags.XML", writerSettings))
00481             {
00482                 writer.WriteStartElement("Tags");
00483                 string currentTag = null;
00484                 DataRow[] hat = data.Tags.Select("", "Tag");
00485                 for (int i = 0; i < hat.Length; i++)
00486                 {
00487                     // Write XML data.
00488                     if (currentTag != hat[i]["Tag"].ToString())
00489                     {
00490                         if(currentTag != null)
00491                             writer.WriteEndElement();
00492 
00493                         writer.WriteStartElement("Tag");
00494                         writer.WriteAttributeString("name", hat[i]["Tag"].ToString());
00495                         currentTag = hat[i]["Tag"].ToString();
00496                     }
00497                     writer.WriteStartElement("ID");
00498                     writer.WriteAttributeString("UserName", hat[i]["UserName"].ToString());
00499                     writer.WriteValue(hat[i]["ID"].ToString());
00500                     writer.WriteEndElement();
00501                 }
00502                 if(currentTag != null)
00503                     writer.WriteEndElement();
00504                 writer.Flush();
00505             }
00506         }
00511         private void SaveProjects(DataContainer data)
00512         {
00513             List<Project> list = new List<Project>();
00514             List<Role> roles = new List<Role>();
00515 
00516             foreach (Project p in data.ProjectTable.Values) list.Add(p);
00517 
00518             using (XmlWriter refWriter = XmlWriter.Create(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "References.XML", writerSettings))
00519                 using (XmlWriter writer = XmlWriter.Create(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Projects.XML", writerSettings))
00520                 {
00521                     refWriter.WriteStartElement("References");
00522                     writer.WriteStartElement("Projects");
00523                     for (int i = 0; i < list.Count; i++)
00524                     {
00525                         // Write XML data.
00526                         writer.WriteStartElement("Project");
00527                         writer.WriteElementString("ID", list[i].ID.ToString());
00528                         writer.WriteElementString("StartDate", list[i].StartDate.ToFileTime().ToString());
00529                         writer.WriteElementString("Title", list[i].Title);
00530                         writer.WriteElementString("Department", list[i].Department);
00531                         writer.WriteElementString("Subject", list[i].Subject);
00532                         writer.WriteElementString("Synopsis", list[i].Synopsis);
00533                         writer.WriteElementString("EndDate", list[i].EndDate.ToFileTime().ToString());
00534                         writer.WriteElementString("Submitted", list[i].IsSubmitted.ToString());
00535                         writer.WriteEndElement();
00536 
00537                         roles.AddRange(list[i].Roles);
00538 
00539                         foreach (Reference r in list[i].References)
00540                         {
00541                             refWriter.WriteStartElement(r.GetType().Name);
00542                             refWriter.WriteElementString("Project", list[i].ID.ToString());
00543                             refWriter.WriteElementString("Literature", r.Literature.ID.ToString());
00544                             refWriter.WriteElementString("Date", r.Date.ToString());
00545                             refWriter.WriteElementString("Used", r.Used.ToString());
00546                             refWriter.WriteElementString("Status", r.Status);
00547 
00548                             if (r is Review)
00549                             {
00550                                 Review review = (Review)r;
00551                                 refWriter.WriteElementString("Title", review.Title);
00552                                 refWriter.WriteElementString("Text", review.Text);
00553                                 refWriter.WriteElementString("Rating", review.Rating.ToString());
00554                                 refWriter.WriteElementString("Member", review.Person.UserName);
00555                                 refWriter.WriteElementString("Title", review.Title);
00556                             }
00557                             if (r is Suggestion)
00558                             {
00559                                 Suggestion sg = (Suggestion)r;
00560                                 refWriter.WriteElementString("Supervisor", sg.Person.UserName);
00561                             }
00562                             refWriter.WriteEndElement();
00563                         }
00564 
00565 
00566                     }
00567                     refWriter.WriteEndElement();
00568                     refWriter.Flush();
00569                     writer.WriteEndElement();
00570                     writer.Flush();
00571                 }
00572 
00573             using (XmlWriter writer = XmlWriter.Create(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Roles.XML", writerSettings))
00574             {
00575                 writer.WriteStartElement("Roles");
00576                 for (int i = 0; i < roles.Count; i++)
00577                 {
00578                     // Write XML data.
00579                     writer.WriteStartElement("Role");
00580                     writer.WriteElementString("Project", roles[i].Project.ID.ToString());
00581                     writer.WriteElementString("Person", roles[i].Person.UserName);
00582                     writer.WriteElementString("Type", roles[i].Type.ToString());
00583                     writer.WriteEndElement();
00584                 }
00585                 writer.WriteEndElement();
00586                 writer.Flush();
00587             }    
00588         }
00593         private void SaveLiterature(DataContainer data)
00594         {
00595             List<Literature> list = new List<Literature>();
00596             foreach (Literature l in data.LiteratureTable.Values) list.Add(l);
00597                         
00598             using (XmlWriter writer = XmlWriter.Create(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar + "Literature.XML", writerSettings))
00599             {
00600                 writer.WriteStartElement("LiteratureEntries");
00601                 for (int i = 0; i < list.Count; i++)
00602                 {
00603                     // Write XML data.
00604                     writer.WriteStartElement("Literature");
00605                     writer.WriteElementString("ID", list[i].ID.ToString());
00606                     writer.WriteElementString("ISBN", list[i].ISBN);
00607                     writer.WriteElementString("Title", list[i].Title);
00608                     writer.WriteElementString("Author", list[i].Author);
00609                     writer.WriteElementString("Summary", list[i].Summary);
00610                     writer.WriteElementString("Source", list[i].Source);
00611                     writer.WriteElementString("Type", list[i].Type.ToString());
00612                     writer.WriteElementString("Creator", list[i].Creator.UserName.ToString());
00613                     writer.WriteEndElement();
00614                 }
00615                 writer.WriteEndElement();
00616                 writer.Flush();
00617             }    
00618         }
00623         private void SavePersons(DataContainer data)
00624         {
00625             List<Person> list = new List<Person>();
00626             foreach (Person p in data.PersonTable.Values) list.Add(p);
00627                         
00628             using (XmlWriter writer = XmlWriter.Create(Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location) + Path.DirectorySeparatorChar +  "Persons.XML", writerSettings))
00629             {
00630                 writer.WriteStartElement("Persons");
00631                 for (int i = 0; i < list.Count; i++)
00632                 {
00633                     // Write XML data.
00634                     writer.WriteStartElement("Person");
00635                     writer.WriteElementString("UserName", list[i].UserName);
00636                     writer.WriteElementString("Password", list[i].Password);
00637                     writer.WriteElementString("Moderator", list[i].Moderator.ToString());
00638                     writer.WriteElementString("Name", list[i].Name);
00639                     writer.WriteElementString("Email", list[i].Email);
00640                     writer.WriteElementString("Department", list[i].Department);
00641                     writer.WriteEndElement();
00642                 }
00643                 writer.WriteEndElement();
00644                 writer.Flush();
00645             }    
00646         }
00647     }
00648 }

Generated on Thu Dec 21 06:21:56 2006 for SCRAML by  doxygen 1.5.1-p1