Skip to content

Commit 48f75cd

Browse files
committed
fix EvilBeaver#1705: проверка приемника данных; возврат строки из Закрыть
1 parent 0cd65f0 commit 48f75cd

2 files changed

Lines changed: 75 additions & 22 deletions

File tree

src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public class XmlWriterImpl : AutoContext<XmlWriterImpl>, IDisposable
2525
{
2626
private TextWriterWithSettings _internalTextWriter;
2727
private XmlTextWriter _writer;
28-
private XmlWriterSettingsImpl _settings = (XmlWriterSettingsImpl)XmlWriterSettingsImpl.Constructor();
28+
private XmlWriterSettingsImpl _settings = XmlWriterSettingsImpl.Constructor();
2929
private int _depth;
30-
private Stack<Dictionary<string, string>> _nsmap = new Stack<Dictionary<string, string>>();
30+
private readonly Stack<Dictionary<string, string>> _nsmap = new();
3131
private StringBuilder _stringBuffer;
3232

3333
private const string DEFAULT_INDENT_STRING = " ";
@@ -51,6 +51,12 @@ private void ExitScope()
5151
--_depth;
5252
}
5353

54+
private void CheckIfOpen()
55+
{
56+
if (_writer == null)
57+
throw NotOpenException();
58+
}
59+
5460
#region Properties
5561

5662
[ContextProperty("Отступ","Indent")]
@@ -77,8 +83,9 @@ public XmlWriterSettingsImpl Settings
7783

7884
[ContextMethod("ЗаписатьАтрибут","WriteAttribute")]
7985
public void WriteAttribute(string localName, string valueOrNamespace, string value = null)
80-
{
81-
if(value == null)
86+
{
87+
CheckIfOpen();
88+
if (value == null)
8289
{
8390
_writer.WriteAttributeString(localName, valueOrNamespace);
8491
}
@@ -91,30 +98,35 @@ public void WriteAttribute(string localName, string valueOrNamespace, string val
9198
[ContextMethod("ЗаписатьБезОбработки","WriteRaw")]
9299
public void WriteRaw(string data)
93100
{
101+
CheckIfOpen();
94102
_writer.WriteRaw(data);
95103
}
96104

97105
[ContextMethod("ЗаписатьИнструкциюОбработки","WriteProcessingInstruction")]
98106
public void WriteProcessingInstruction(string name, string text)
99107
{
108+
CheckIfOpen();
100109
_writer.WriteProcessingInstruction(name, text);
101110
}
102111

103112
[ContextMethod("ЗаписатьКомментарий","WriteComment")]
104113
public void WriteComment(string text)
105114
{
115+
CheckIfOpen();
106116
_writer.WriteComment(text);
107117
}
108118

109119
[ContextMethod("ЗаписатьКонецАтрибута","WriteEndAttribute")]
110120
public void WriteEndAttribute()
111121
{
122+
CheckIfOpen();
112123
_writer.WriteEndAttribute();
113124
}
114125

115126
[ContextMethod("ЗаписатьКонецЭлемента","WriteEndElement")]
116127
public void WriteEndElement()
117128
{
129+
CheckIfOpen();
118130
_internalTextWriter.TrimEndSlashes = true;
119131
_writer.WriteEndElement();
120132
_internalTextWriter.TrimEndSlashes = false;
@@ -124,7 +136,8 @@ public void WriteEndElement()
124136
[ContextMethod("ЗаписатьНачалоАтрибута","WriteStartAttribute")]
125137
public void WriteStartAttribute(string name, string ns = null)
126138
{
127-
if(ns == null)
139+
CheckIfOpen();
140+
if (ns == null)
128141
{
129142
_writer.WriteStartAttribute(name);
130143
}
@@ -138,6 +151,7 @@ public void WriteStartAttribute(string name, string ns = null)
138151
[ContextMethod("ЗаписатьНачалоЭлемента","WriteStartElement")]
139152
public void WriteStartElement(string name, string ns = null)
140153
{
154+
CheckIfOpen();
141155
if (ns == null)
142156
{
143157
_writer.WriteStartElement(name);
@@ -152,12 +166,14 @@ public void WriteStartElement(string name, string ns = null)
152166
[ContextMethod("ЗаписатьОбъявлениеXML","WriteXMLDeclaration")]
153167
public void WriteXMLDeclaration()
154168
{
169+
CheckIfOpen();
155170
_writer.WriteStartDocument();
156171
}
157172

158173
[ContextMethod("ЗаписатьСекциюCDATA","WriteCDATASection")]
159174
public void WriteCDATASection(string data)
160175
{
176+
CheckIfOpen();
161177
_writer.WriteCData(data);
162178
}
163179

@@ -171,18 +187,21 @@ public void WriteNamespaceMapping(string prefix, string uri)
171187
[ContextMethod("ЗаписатьСсылкуНаСущность","WriteEntityReference")]
172188
public void WriteEntityReference(string name)
173189
{
190+
CheckIfOpen();
174191
_writer.WriteEntityRef(name);
175192
}
176193

177194
[ContextMethod("ЗаписатьТекст","WriteText")]
178195
public void WriteText(string text)
179196
{
197+
CheckIfOpen();
180198
_writer.WriteString(text);
181199
}
182200

183201
[ContextMethod("ЗаписатьТекущий","WriteCurrent")]
184202
public void WriteCurrent(XmlReaderImpl reader)
185203
{
204+
CheckIfOpen();
186205
var nodeType = reader.NodeType.UnderlyingValue;
187206
switch (nodeType)
188207
{
@@ -225,7 +244,8 @@ public void WriteCurrent(XmlReaderImpl reader)
225244
case XmlNodeType.Document:
226245
case XmlNodeType.DocumentFragment:
227246
case XmlNodeType.Notation:
228-
throw new RuntimeException(new Localization.BilingualString($"Копирование узла {nodeType} не поддерживается"));
247+
throw CopyingNotSupportedException(nodeType);
248+
229249
default:
230250
break;
231251
}
@@ -292,7 +312,8 @@ private static (string prefix, string localName) splitName(string nameOrLocalNam
292312
[ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")]
293313
public void WriteDocumentType(string name, string varArg2, string varArg3 = null, string varArg4 = null)
294314
{
295-
if(varArg4 != null)
315+
CheckIfOpen();
316+
if (varArg4 != null)
296317
{
297318
_writer.WriteDocType(name, varArg2, varArg3, varArg4);
298319
}
@@ -309,6 +330,7 @@ public void WriteDocumentType(string name, string varArg2, string varArg3 = null
309330
[ContextMethod("НайтиПрефикс","LookupPrefix")]
310331
public IValue LookupPrefix(string uri)
311332
{
333+
CheckIfOpen();
312334
string prefix = _writer.LookupPrefix(uri);
313335
if (prefix == null)
314336
return ValueFactory.Create();
@@ -318,26 +340,24 @@ public IValue LookupPrefix(string uri)
318340
[ContextMethod("Закрыть","Close")]
319341
public IValue Close()
320342
{
321-
if(IsOpenForString())
343+
if (_writer==null)
344+
return ValueFactory.Create(String.Empty);
345+
346+
_writer.Flush();
347+
_writer.Close();
348+
Dispose();
349+
350+
if (IsOpenForString())
322351
{
323-
_writer.Flush();
324-
_writer.Close();
325-
326-
Dispose();
327-
328352
var result = _stringBuffer.ToString();
329353
_stringBuffer = null;
354+
330355
return ValueFactory.Create(result);
331356
}
332357
else
333358
{
334-
_writer.Flush();
335-
_writer.Close();
336-
Dispose();
337-
338-
return ValueFactory.Create();
359+
return ValueFactory.Create(String.Empty);
339360
}
340-
341361
}
342362

343363
private void ApplySettings(BslValue encodingOrSettings)
@@ -477,9 +497,7 @@ protected override void Dispose(bool disposing)
477497

478498
public void Dispose()
479499
{
480-
if (_writer != null)
481-
_writer.Close();
482-
500+
_writer?.Close();
483501
_writer = null;
484502
}
485503

@@ -490,5 +508,19 @@ public static XmlWriterImpl Create()
490508
}
491509

492510
public XmlWriter GetNativeWriter() => _writer;
511+
512+
public static RuntimeException NotOpenException()
513+
{
514+
return new RuntimeException
515+
("Приемник данных XML не открыт",
516+
"XML data target is not opened");
517+
}
518+
public static RuntimeException CopyingNotSupportedException(XmlNodeType nodeType)
519+
{
520+
return new RuntimeException
521+
($"Копирование узла типа {nodeType} не поддерживается",
522+
$"Copying a node of type {nodeType} is not supported");
523+
}
524+
493525
}
494526
}

tests/xmlwrite.os

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ИнструкцииОбработки");
4444

4545
ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента");
46+
47+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗакрытиеПустого");
48+
ВсеТесты.Добавить("ТестДолжен_ПроверитьТипВозвратаЗакрыть_ИзФайла");
4649

4750
Возврат ВсеТесты;
4851

@@ -759,3 +762,21 @@
759762
ЧтениеXML.Прочитать();
760763
юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла, ТипУзла, Сообщение);
761764
КонецПроцедуры
765+
766+
Процедура ТестДолжен_ПроверитьЗакрытиеПустого() Экспорт
767+
Запись = Новый ЗаписьXML;
768+
Результат = Запись.Закрыть();
769+
770+
юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("Строка"));
771+
юТест.ПроверитьРавенство(Результат, "");
772+
КонецПроцедуры
773+
774+
Процедура ТестДолжен_ПроверитьТипВозвратаЗакрыть_ИзФайла() Экспорт
775+
Запись = Новый ЗаписьXML;
776+
ИмяФайла = юТест.ИмяВременногоФайла("xml");
777+
Запись.ОткрытьФайл(ИмяФайла);
778+
Результат = Запись.Закрыть();
779+
780+
юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("Строка"));
781+
юТест.ПроверитьРавенство(Результат, "");
782+
КонецПроцедуры

0 commit comments

Comments
 (0)