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
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
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
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
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
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
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
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 }