Skip to content

Commit 56b94f7

Browse files
committed
Fix handling entity references (in Android context they are exposed). The
Android parser is relatively stupid and exposes these. This fixes bug #44
1 parent 55d197c commit 56b94f7

File tree

4 files changed

+20
-7
lines changed

4 files changed

+20
-7
lines changed

core/src/commonMain/kotlin/nl/adaptivity/xmlutil/EventType.kt

+7
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ enum class EventType {
7373
writer.comment(reader.text)
7474
},
7575
TEXT {
76+
override val isTextElement: Boolean get() = true
77+
7678
override fun createEvent(reader: XmlReader) = reader.run {
7779
XmlEvent.TextEvent(locationInfo, TEXT, text)
7880
}
@@ -83,6 +85,8 @@ enum class EventType {
8385
writer.text(reader.text)
8486
},
8587
CDSECT {
88+
override val isTextElement: Boolean get() = true
89+
8690
override fun createEvent(reader: XmlReader) = reader.run {
8791
XmlEvent.TextEvent(locationInfo, CDSECT, text)
8892
}
@@ -115,6 +119,8 @@ enum class EventType {
115119
writer.endDocument()
116120
},
117121
ENTITY_REF {
122+
override val isTextElement: Boolean get() = true
123+
118124
override fun createEvent(reader: XmlReader) = reader.run {
119125
XmlEvent.TextEvent(locationInfo, ENTITY_REF, text)
120126
}
@@ -162,6 +168,7 @@ enum class EventType {
162168
};
163169

164170
open val isIgnorable: Boolean get() = false
171+
open val isTextElement: Boolean get() = false
165172

166173
open fun writeEvent(writer: XmlWriter, textEvent: XmlEvent.TextEvent): Unit = throw UnsupportedOperationException(
167174
"This is not generally supported, only by text types"

core/src/commonMain/kotlin/nl/adaptivity/xmlutil/XmlReader.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ fun XmlReader.isPrefixDeclaredInElement(prefix: String): Boolean {
198198
@JvmOverloads
199199
internal fun XmlReader.unhandledEvent(message: String? = null) {
200200
val actualMessage = when (eventType) {
201+
EventType.ENTITY_REF,
201202
EventType.CDSECT,
202203
EventType.TEXT -> if (!isWhitespace()) message
203204
?: "Content found where not expected [$locationInfo] Text:'$text'" else null
@@ -231,7 +232,7 @@ fun XmlReader.isElement(elementname: QName): Boolean {
231232
fun XmlReader.allText(): String {
232233
val t = this
233234
return buildString {
234-
if (eventType == EventType.TEXT || eventType == EventType.CDSECT) {
235+
if (eventType.isTextElement) {
235236
append(text)
236237
}
237238

@@ -247,6 +248,7 @@ fun XmlReader.allText(): String {
247248
EventType.IGNORABLE_WHITESPACE
248249
-> if (length != 0) append(t.text)
249250

251+
EventType.ENTITY_REF,
250252
EventType.TEXT,
251253
EventType.CDSECT
252254
-> append(t.text)
@@ -276,7 +278,7 @@ fun XmlBufferedReader.consecutiveTextContent(): String {
276278
val whiteSpace = StringBuilder()
277279
val t = this
278280
return buildString {
279-
if (eventType == EventType.TEXT || eventType == EventType.CDSECT) {
281+
if (eventType.isTextElement) {
280282
append(text)
281283
}
282284

@@ -293,6 +295,7 @@ fun XmlBufferedReader.consecutiveTextContent(): String {
293295
-> { t.next(); whiteSpace.append(t.text) }
294296

295297
EventType.TEXT,
298+
EventType.ENTITY_REF,
296299
EventType.CDSECT
297300
-> {
298301
t.next()

serialization/src/commonMain/kotlin/nl/adaptivity/xmlutil/serialization/XMLDecoder.kt

+1
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ internal open class XmlDecoderBase internal constructor(
452452
when (eventType) {
453453
EventType.END_ELEMENT -> return readElementEnd(descriptor)
454454

455+
EventType.ENTITY_REF,
455456
EventType.CDSECT,
456457
EventType.TEXT -> {
457458
// The android reader doesn't check whitespaceness. This code should throw

serialization/src/commonTest/kotlin/nl/adaptivity/xml/serialization/TestCommon.kt

+7-5
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ import nl.adaptivity.xmlutil.serialization.XmlSerializationPolicy.XmlEncodeDefau
3939
import nl.adaptivity.xmlutil.util.CompactFragment
4040
import kotlin.test.*
4141

42-
private fun String.normalize() = replace(" />", "/>").replace("\r\n", "\n")
42+
private fun String.normalize() = replace(" />", "/>")
43+
.replace("\r\n", "\n")
44+
.replace(">", ">")
4345

4446
fun JsonBuilder.defaultJsonTestConfiguration() {
4547
isLenient = true
@@ -167,15 +169,15 @@ class TestCommon {
167169
}
168170

169171
class ValueContainerTest : TestBase<ValueContainer>(
170-
ValueContainer("foobar"),
172+
ValueContainer("<foo&bar>"),
171173
ValueContainer.serializer()
172174
) {
173-
override val expectedXML: String = "<valueContainer>foobar</valueContainer>"
174-
override val expectedJson: String = "{\"content\":\"foobar\"}"
175+
override val expectedXML: String = "<valueContainer>&lt;foo&amp;bar></valueContainer>"
176+
override val expectedJson: String = "{\"content\":\"<foo&bar>\"}"
175177

176178
@Test
177179
fun testAlternativeXml() {
178-
val alternativeXml = "<valueContainer><![CDATA[foo]]>bar</valueContainer>"
180+
val alternativeXml = "<valueContainer><![CDATA[<foo&]]>bar&gt;</valueContainer>"
179181
assertEquals(value, baseXmlFormat.decodeFromString(serializer, alternativeXml))
180182
}
181183

0 commit comments

Comments
 (0)