Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence/3.3/Default/Xml/XmlGenerator.cs @ 1566

Last change on this file since 1566 was 1566, checked in by epitzer, 15 years ago

Format white space. (Ctrl-K, Ctrl-D) (#548)

File size: 5.2 KB
Line 
1using System.Collections.Generic;
2using System;
3using System.Text;
4using HeuristicLab.Persistence.Interfaces;
5using HeuristicLab.Persistence.Core;
6using System.IO;
7using ICSharpCode.SharpZipLib.Zip;
8using HeuristicLab.Tracing;
9using log4net;
10using HeuristicLab.Persistence.Core.Tokens;
11
12namespace HeuristicLab.Persistence.Default.Xml {
13
14  struct XmlStrings {
15    public const string PRIMITIVE = "PRIMITVE";
16    public const string COMPOSITE = "COMPOSITE";
17    public const string REFERENCE = "REFERENCE";
18    public const string NULL = "NULL";
19    public const string TYPECACHE = "TYPECACHE";
20    public const string TYPE = "TYPE";
21    public const string METAINFO = "METAINFO";
22  }
23
24  public class XmlGenerator : GeneratorBase<string> {
25
26    private int depth;
27
28    public XmlGenerator() {
29      depth = 0;
30    }
31
32    private enum NodeType { Start, End, Inline } ;
33
34    private static string FormatNode(string name,
35        Dictionary<string, object> attributes,
36        NodeType type) {
37      return FormatNode(name, attributes, type, " ");
38    }
39
40    private static string FormatNode(string name,
41        Dictionary<string, object> attributes,
42        NodeType type, string space) {
43      StringBuilder sb = new StringBuilder();
44      sb.Append('<');
45      if (type == NodeType.End)
46        sb.Append('/');
47      sb.Append(name);
48      foreach (var attribute in attributes) {
49        if (attribute.Value != null && !string.IsNullOrEmpty(attribute.Value.ToString())) {
50          sb.Append(space);
51          sb.Append(attribute.Key);
52          sb.Append("=\"");
53          sb.Append(attribute.Value);
54          sb.Append('"');
55        }
56      }
57      if (type == NodeType.Inline)
58        sb.Append('/');
59      sb.Append(">");
60      return sb.ToString();
61    }
62
63    private string Prefix {
64      get { return new string(' ', depth * 2); }
65    }
66
67    protected override string Format(BeginToken beginToken) {
68      var attributes = new Dictionary<string, object> {
69        {"name", beginToken.Name},
70        {"typeId", beginToken.TypeId},
71        {"id", beginToken.Id}};
72      string result = Prefix +
73                      FormatNode(XmlStrings.COMPOSITE, attributes, NodeType.Start) + "\r\n";
74      depth += 1;
75      return result;
76    }
77
78    protected override string Format(EndToken endToken) {
79      depth -= 1;
80      return Prefix + "</" + XmlStrings.COMPOSITE + ">\r\n";
81    }
82
83    protected override string Format(PrimitiveToken dataToken) {
84      var attributes =
85        new Dictionary<string, object> {
86            {"typeId", dataToken.TypeId},
87            {"name", dataToken.Name},
88            {"id", dataToken.Id}};
89      return Prefix +
90        FormatNode(XmlStrings.PRIMITIVE, attributes, NodeType.Start) +
91        ((XmlString)dataToken.SerialData).Data + "</" + XmlStrings.PRIMITIVE + ">\r\n";
92    }
93
94    protected override string Format(ReferenceToken refToken) {
95      var attributes = new Dictionary<string, object> {
96        {"ref", refToken.Id},
97        {"name", refToken.Name}};
98      return Prefix + FormatNode(XmlStrings.REFERENCE, attributes, NodeType.Inline) + "\r\n";
99    }
100
101    protected override string Format(NullReferenceToken nullRefToken) {
102      var attributes = new Dictionary<string, object>{
103        {"name", nullRefToken.Name}};
104      return Prefix + FormatNode(XmlStrings.NULL, attributes, NodeType.Inline) + "\r\n";
105    }
106
107    protected override string Format(MetaInfoBeginToken metaInfoBeginToken) {
108      string result = Prefix + "<" + XmlStrings.METAINFO + ">\r\n";
109      depth += 1;
110      return result;
111    }
112
113    protected override string Format(MetaInfoEndToken metaInfoEndToken) {
114      depth -= 1;
115      return Prefix + "</" + XmlStrings.METAINFO + ">\r\n";
116    }
117
118    public IEnumerable<string> Format(List<TypeMapping> typeCache) {
119      yield return "<" + XmlStrings.TYPECACHE + ">";
120      foreach (var mapping in typeCache)
121        yield return "  " + FormatNode(
122          XmlStrings.TYPE,
123          mapping.GetDict(),
124          NodeType.Inline,
125          "\r\n    ");
126      yield return "</" + XmlStrings.TYPECACHE + ">";
127    }
128
129    public static void Serialize(object o, string filename) {
130      Serialize(o, filename, ConfigurationService.Instance.GetDefaultConfig(new XmlFormat()));
131    }
132
133    public static void Serialize(object obj, string filename, Configuration config) {
134      Serializer serializer = new Serializer(obj, config);
135      XmlGenerator generator = new XmlGenerator();
136      ZipOutputStream zipStream = new ZipOutputStream(File.Create(filename));
137      zipStream.SetLevel(9);
138      zipStream.PutNextEntry(new ZipEntry("data.xml"));
139      StreamWriter writer = new StreamWriter(zipStream);
140      ILog logger = Logger.GetDefaultLogger();
141      foreach (ISerializationToken token in serializer) {
142        string line = generator.Format(token);
143        writer.Write(line);
144        logger.Debug(line);
145      }
146      writer.Flush();
147      zipStream.PutNextEntry(new ZipEntry("typecache.xml"));
148      writer = new StreamWriter(zipStream);
149      foreach (string line in generator.Format(serializer.TypeCache)) {
150        writer.WriteLine(line);
151        logger.Debug(line);
152      }
153      writer.Flush();
154      zipStream.Close();
155    }
156
157  }
158}
Note: See TracBrowser for help on using the repository browser.