TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
Artifacts.cs
Go to the documentation of this file.
1 // TraceLab Component Library
2 // Copyright © 2012-2013 SEMERU
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 using System;
18 using System.Collections.Generic;
19 using System.IO;
20 using System.Xml;
21 using System.Xml.XPath;
22 using TraceLabSDK.Types;
23 
24 namespace TraceLab.Components.DevelopmentKit.IO
25 {
30  public static class Artifacts
31  {
32  #region Import
33 
40  public static TLArtifactsCollection ImportFile(string filename)
41  {
42  StreamReader file = new StreamReader(filename);
43  TLArtifactsCollection answer = new TLArtifactsCollection();
44  String line;
45  while ((line = file.ReadLine()) != null)
46  {
47  List<string> artifacts = new List<string>(line.Split());
48  String id = artifacts[0].Trim();
49  artifacts.RemoveAt(0);
50  String doc = String.Join(" ", artifacts);
51  answer.Add(new TLArtifact(id, doc));
52  }
53  return answer;
54  }
55 
64  public static TLArtifactsCollection ImportFile(string filename, out List<string> map)
65  {
66  map = new List<string>();
67  StreamReader file = new StreamReader(filename);
68  TLArtifactsCollection answer = new TLArtifactsCollection();
69  String line;
70  while ((line = file.ReadLine()) != null)
71  {
72  List<string> artifacts = new List<string>(line.Split());
73  String id = artifacts[0].Trim();
74  artifacts.RemoveAt(0);
75  String doc = String.Join(" ", artifacts);
76  answer.Add(new TLArtifact(id, doc));
77  map.Add(id);
78  }
79  return answer;
80  }
81 
88  public static TLArtifactsCollection ImportDirectory(string path, string filter)
89  {
90  TLArtifactsCollection artifacts = new TLArtifactsCollection();
91  if (String.IsNullOrWhiteSpace(filter))
92  {
93  foreach (string file in Directory.GetFiles(path))
94  {
95  artifacts.Add(new TLArtifact(Path.GetFileName(file), File.ReadAllText(file)));
96  }
97  }
98  else
99  {
100  foreach (string file in Directory.GetFiles(path, "*." + filter))
101  {
102  artifacts.Add(new TLArtifact(Path.GetFileNameWithoutExtension(file), File.ReadAllText(file)));
103  }
104  }
105  return artifacts;
106  }
107 
115  public static TLArtifactsCollection ImportFromMapping(string mappingFile, string rawFile)
116  {
117  TextReader map = new StreamReader(mappingFile);
118  TextReader raw = new StreamReader(rawFile);
119  TLArtifactsCollection artifacts = new TLArtifactsCollection();
120  string mapLine, rawLine;
121  while ((mapLine = map.ReadLine()) != null)
122  {
123  if ((rawLine = raw.ReadLine()) == null)
124  {
125  rawLine = "";
126  }
127  artifacts.Add(new TLArtifact(mapLine, rawLine));
128  }
129  return artifacts;
130  }
131 
138  public static TLArtifactsCollection ImportXMLFile(string filepath, bool trimValues)
139  {
140  TLArtifactsCollection artifacts = new TLArtifactsCollection();
141  XPathDocument doc = new XPathDocument(filepath);
142  XPathNavigator nav = doc.CreateNavigator();
143  //read collection info
144  artifacts.CollectionId = ReadSingleXMLNode(filepath, nav, "/artifacts_collection/collection_info/id");
145  artifacts.CollectionName = ReadSingleXMLNode(filepath, nav, "/artifacts_collection/collection_info/name");
146  artifacts.CollectionVersion = ReadSingleXMLNode(filepath, nav, "/artifacts_collection/collection_info/version");
147  artifacts.CollectionDescription = ReadSingleXMLNode(filepath, nav, "/artifacts_collection/collection_info/description");
148  if (trimValues)
149  {
150  artifacts.CollectionId = artifacts.CollectionId.Trim();
151  artifacts.CollectionName = artifacts.CollectionName.Trim();
152  artifacts.CollectionVersion = artifacts.CollectionVersion.Trim();
153  artifacts.CollectionDescription = artifacts.CollectionDescription.Trim();
154  }
155  //check what type of content location the file has
156  XPathNavigator iter = nav.SelectSingleNode("/artifacts_collection/collection_info/content_location");
157  string content_location_type = "internal"; //default content location is internal
158  //if content location has been sprecified read it
159  if (iter != null)
160  {
161  content_location_type = iter.Value;
162  }
163  //root dir is going to be needed to external content type, to determine absolute paths of the files
164  string rootDir = System.IO.Path.GetDirectoryName(filepath);
165  XPathNodeIterator artifactsIterator = nav.Select("/artifacts_collection/artifacts/artifact");
166  string artifactId;
167  string content;
168  while (artifactsIterator.MoveNext())
169  {
170  iter = artifactsIterator.Current.SelectSingleNode("id");
171  artifactId = iter.InnerXml;
172  iter = artifactsIterator.Current.SelectSingleNode("content");
173  if (content_location_type.Equals("external"))
174  {
175  content = System.IO.File.ReadAllText(System.IO.Path.Combine(rootDir, iter.InnerXml.Trim()));
176  }
177  else
178  {
179  content = iter.InnerXml;
180  }
181  if (trimValues)
182  {
183  artifactId = artifactId.Trim();
184  content = content.Trim();
185  }
186  // Checking if ID is already in Artifacts List
187  if (!artifacts.ContainsKey(artifactId))
188  {
189  TLArtifact artifact = new TLArtifact(artifactId, content);
190  artifacts.Add(artifactId, artifact);
191  }
192  else
193  {
194  /*
195  CoestDatasetImporterHelper.Logger.Warn(
196  String.Format("Repeated artifact ID '{0}' found in file '{1}'.", artifactId, filepath)
197  );
198  */
199  }
200  }
201  return artifacts;
202  }
203 
211  private static string ReadSingleXMLNode(string filepath, XPathNavigator nav, string xpath)
212  {
213  XPathNavigator iter = nav.SelectSingleNode(xpath);
214  if (iter == null)
215  {
216  throw new XmlException(String.Format("The format of the given file {0} is not correct. The xml node {1} has not been found in the file.", filepath, xpath));
217  }
218  return iter.InnerXml;
219  }
220 
221  #endregion
222 
223  #region Export
224 
231  public static void ExportFile(TLArtifactsCollection artifacts, string outputfile)
232  {
233  TextWriter tw = new StreamWriter(outputfile);
234  foreach (TLArtifact artifact in artifacts.Values)
235  {
236  tw.WriteLine(artifact.Id + " " + artifact.Text.Replace("\n", " ").Replace("\r", String.Empty));
237  }
238  tw.Flush();
239  tw.Close();
240  }
241 
251  public static void ExportXML(TLArtifactsCollection artifactsCollection, string outputPath, string collectionId, string name, string version, string description)
252  {
253  XmlWriterSettings settings = new XmlWriterSettings();
254  settings.Indent = true;
255  settings.CloseOutput = true;
256  settings.CheckCharacters = true;
257  //create file
258  using (XmlWriter writer = XmlWriter.Create(outputPath, settings))
259  {
260  writer.WriteStartDocument();
261  writer.WriteStartElement("artifacts_collection");
262  WriteXMLCollectionInfo(writer, collectionId, name, version, description);
263  WriteXMLArtifacts(artifactsCollection, writer);
264  writer.WriteEndElement(); //artifacts_collection
265  writer.WriteEndDocument();
266  writer.Close();
267  }
268  System.Diagnostics.Trace.WriteLine("File created, you can find the file " + outputPath);
269  }
270 
279  private static void WriteXMLCollectionInfo(XmlWriter writer, string collectionId, string name, string version, string description)
280  {
281  writer.WriteStartElement("collection_info");
282  writer.WriteElementString("id", collectionId.Trim());
283  writer.WriteElementString("name", name.Trim());
284  writer.WriteElementString("version", version.Trim());
285  writer.WriteElementString("description", description.Trim());
286  writer.WriteEndElement();
287  }
288 
294  private static void WriteXMLArtifacts(TLArtifactsCollection artifactsCollection, XmlWriter writer)
295  {
296  writer.WriteStartElement("artifacts");
297  foreach (KeyValuePair<string, TLArtifact> artifact in artifactsCollection)
298  {
299  writer.WriteStartElement("artifact");
300  writer.WriteElementString("id", artifact.Value.Id.Trim());
301  writer.WriteElementString("content", artifact.Value.Text.Trim());
302  writer.WriteElementString("parent_id", String.Empty);
303  writer.WriteEndElement();
304  }
305  writer.WriteEndElement(); // artifacts
306  }
307 
308  #endregion
309  }
310 }