Skip to content

Commit a56d9db

Browse files
authored
Merge pull request #84 from jenetics/issues/JPX-82-parsing_error
#82: Fix GPX 'extensions' parsing error.
2 parents 2e7637a + e748d07 commit a56d9db

File tree

7 files changed

+166
-108
lines changed

7 files changed

+166
-108
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,12 @@ The library is licensed under the [Apache License, Version 2.0](http://www.apach
285285

286286
## Release notes
287287

288+
### [1.5.1](https://github.com/jenetics/jpx/releases/tag/v1.5.1)
289+
290+
#### Bugs
291+
292+
* [#82](https://github.com/jenetics/jpx/issues/82): Fix parsing of GPX `extensions`.
293+
288294
### [1.5.0](https://github.com/jenetics/jpx/releases/tag/v1.5.0)
289295

290296
#### Enhancement

RELEASE_NOTES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
## Release notes
22

3+
### [1.5.1](https://github.com/jenetics/jpx/releases/tag/v1.5.1)
4+
5+
#### Bugs
6+
7+
* [#82](https://github.com/jenetics/jpx/issues/82): Fix parsing of GPX `extensions`.
8+
39
### [1.5.0](https://github.com/jenetics/jpx/releases/tag/v1.5.0)
410

511
#### Enhancement

jpx/src/main/java/io/jenetics/jpx/XMLReader.java

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ static enum Type {
118118
* @throws NullPointerException if the given {@code xml} stream reader is
119119
* {@code null}
120120
*/
121-
public abstract T read(final XMLStreamReader xml, final boolean lenient)
121+
public abstract T read(final XMLStreamReaderAdapter xml, final boolean lenient)
122122
throws XMLStreamException;
123123

124124
/**
@@ -135,7 +135,7 @@ public <B> XMLReader<B> map(final Function<? super T, ? extends B> mapper) {
135135

136136
return new XMLReader<B>(_name, _type) {
137137
@Override
138-
public B read(final XMLStreamReader xml, final boolean lenient)
138+
public B read(final XMLStreamReaderAdapter xml, final boolean lenient)
139139
throws XMLStreamException
140140
{
141141
try {
@@ -384,7 +384,7 @@ final class AttrReader extends XMLReader<String> {
384384
}
385385

386386
@Override
387-
public String read(final XMLStreamReader xml, final boolean lenient)
387+
public String read(final XMLStreamReaderAdapter xml, final boolean lenient)
388388
throws XMLStreamException
389389
{
390390
xml.require(START_ELEMENT, null, null);
@@ -407,7 +407,7 @@ final class TextReader extends XMLReader<String> {
407407
}
408408

409409
@Override
410-
public String read(final XMLStreamReader xml, final boolean lenient)
410+
public String read(final XMLStreamReaderAdapter xml, final boolean lenient)
411411
throws XMLStreamException
412412
{
413413
final StringBuilder out = new StringBuilder();
@@ -417,7 +417,6 @@ public String read(final XMLStreamReader xml, final boolean lenient)
417417
out.append(xml.getText());
418418
} while (xml.hasNext() && (type = xml.next()) == CHARACTERS || type == CDATA);
419419

420-
421420
return out.toString();
422421
}
423422
}
@@ -441,7 +440,7 @@ final class ListReader<T> extends XMLReader<List<T>> {
441440
}
442441

443442
@Override
444-
public List<T> read(final XMLStreamReader xml, final boolean lenient)
443+
public List<T> read(final XMLStreamReaderAdapter xml, final boolean lenient)
445444
throws XMLStreamException
446445
{
447446
xml.require(START_ELEMENT, null, name());
@@ -475,7 +474,7 @@ final class IgnoreReader extends XMLReader<Object> {
475474
}
476475

477476
@Override
478-
public Object read(final XMLStreamReader xml, final boolean lenient)
477+
public Object read(final XMLStreamReaderAdapter xml, final boolean lenient)
479478
throws XMLStreamException
480479
{
481480
return _reader.read(xml, true);
@@ -496,7 +495,7 @@ final class DocReader extends XMLReader<Document> {
496495
}
497496

498497
@Override
499-
public Document read(final XMLStreamReader xml, final boolean lenient)
498+
public Document read(final XMLStreamReaderAdapter xml, final boolean lenient)
500499
throws XMLStreamException
501500
{
502501
Document doc = null;
@@ -527,7 +526,8 @@ public String getVersion() {
527526
throw e;
528527
}
529528
}
530-
529+
// Mark the next XML element as consumed, by the StaX transformer: #82
530+
xml.consumed();
531531
return doc;
532532
}
533533

@@ -582,7 +582,7 @@ final class ElemReader<T> extends XMLReader<T> {
582582
}
583583

584584
@Override
585-
public T read(final XMLStreamReader xml, final boolean lenient)
585+
public T read(final XMLStreamReaderAdapter xml, final boolean lenient)
586586
throws XMLStreamException
587587
{
588588
while (xml.getEventType() == COMMENT) {
@@ -607,18 +607,16 @@ public T read(final XMLStreamReader xml, final boolean lenient)
607607
}
608608
}
609609

610-
if (xml.hasNext()) {
611-
xml.next();
612-
610+
if (xml.safeNext()) {
613611
boolean hasNext = false;
614612
do {
615613
switch (xml.getEventType()) {
616614
case COMMENT:
617615
consumeComment(xml);
618616
break;
619617
case START_ELEMENT:
620-
Integer index = _readerIndexMapping
621-
.get(xml.getLocalName());
618+
final String localName = xml.getLocalName();
619+
Integer index = _readerIndexMapping.get(localName);
622620

623621
if (index == null && !lenient) {
624622
throw new XMLStreamException(format(
@@ -633,12 +631,7 @@ public T read(final XMLStreamReader xml, final boolean lenient)
633631

634632
if (result != null) {
635633
throwUnexpectedElement(xml, lenient, result);
636-
if (xml.hasNext()) {
637-
hasNext = true;
638-
xml.next();
639-
} else {
640-
hasNext = false;
641-
}
634+
hasNext = xml.safeNext();
642635
}
643636

644637
break;
@@ -687,7 +680,7 @@ private void consumeComment(final XMLStreamReader xml) throws XMLStreamException
687680
}
688681

689682
private void throwUnexpectedElement(
690-
final XMLStreamReader xml,
683+
final XMLStreamReaderAdapter xml,
691684
final boolean lenient,
692685
final ReaderResult text
693686
)

jpx/src/main/java/io/jenetics/jpx/XMLStreamReaderAdapter.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,30 @@
3535
class XMLStreamReaderAdapter implements XMLStreamReader, AutoCloseable {
3636
private final XMLStreamReader _reader;
3737

38+
private boolean _consumed;
39+
3840
XMLStreamReaderAdapter(final XMLStreamReader reader) {
3941
_reader = requireNonNull(reader);
4042
}
4143

44+
void consumed() {
45+
_consumed = true;
46+
}
47+
48+
boolean safeNext() throws XMLStreamException {
49+
final boolean result = hasNext();
50+
try {
51+
if (result && !_consumed) {
52+
next();
53+
}
54+
} finally {
55+
_consumed = false;
56+
}
57+
return result;
58+
}
59+
4260
@Override
43-
public Object getProperty(final String name) throws IllegalArgumentException {
61+
public Object getProperty(final String name) {
4462
return _reader.getProperty(name);
4563
}
4664

0 commit comments

Comments
 (0)