Skip to content

Commit

Permalink
Test for too many elements, re-factor to resolve several code smells
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeEdgar committed Mar 13, 2020
1 parent 3701022 commit 021808f
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 127 deletions.
113 changes: 56 additions & 57 deletions src/main/java/io/xlate/edi/internal/schema/SchemaReaderBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ void nameCheck(String name, Map<String, EDIType> types, XMLStreamReader reader)
StructureType readComplexType(XMLStreamReader reader,
QName complexType,
Map<String, EDIType> types) throws XMLStreamException {

final EDIType.Type type = complex.get(complexType);
final String id;
String code = reader.getAttributeValue(null, "code");
Expand All @@ -360,73 +361,54 @@ StructureType readComplexType(XMLStreamReader reader,

final List<EDIReference> refs = new ArrayList<>(8);
final List<EDISyntaxRule> rules = new ArrayList<>(2);
boolean sequence = false;
boolean endOfType = false;

while (!endOfType && reader.hasNext()) {
switch (reader.next()) {
case XMLStreamConstants.START_ELEMENT:
QName element = reader.getName();

if (element.equals(qnSequence)) {
if (sequence) {
throw schemaException("multiple sequence elements", reader);
}
sequence = true;
readReferences(reader, types, refs);
} else if (element.equals(qnSyntax)) {
switch (type) {
case SEGMENT:
case COMPOSITE:
readSyntax(reader, rules);
break;
default:
break;
}
} else {
throw schemaException("Unexpected element " + element, reader);
}
reader.nextTag();
requireElementStart(qnSequence, reader);
readReferences(reader, types, refs);

break;
int event = reader.nextTag();

case XMLStreamConstants.END_ELEMENT:
if (reader.getName().equals(complexType)) {
endOfType = true;
}
break;

default:
checkEvent(reader);
break;
}
if (event == XMLStreamConstants.START_ELEMENT) {
requireElementStart(qnSyntax, reader);
readSyntax(reader, rules);
event = reader.nextTag();
}

return new StructureType(id, type, code, refs, rules);
if (event == XMLStreamConstants.END_ELEMENT) {
return new StructureType(id, type, code, refs, rules);
} else {
throw unexpectedEvent(reader);
}
}

void readReferences(XMLStreamReader reader,
Map<String, EDIType> types,
List<EDIReference> refs) throws XMLStreamException {
while (reader.hasNext()) {
switch (reader.next()) {
case XMLStreamConstants.START_ELEMENT:
refs.add(readReference(reader, types));
break;
List<EDIReference> refs) {

case XMLStreamConstants.END_ELEMENT:
if (reader.getName().equals(qnSequence)) {
return;
}
try {
while (reader.hasNext()) {
switch (reader.next()) {
case XMLStreamConstants.START_ELEMENT:
refs.add(readReference(reader, types));
break;

case XMLStreamConstants.END_ELEMENT:
if (reader.getName().equals(qnSequence)) {
return;
}

break;
default:
checkEvent(reader);
break;
break;
default:
checkEvent(reader);
break;
}
}
} catch (XMLStreamException xse) {
throw schemaException("Exception reading sequence", reader, xse);
}
}

Reference readReference(XMLStreamReader reader, Map<String, EDIType> types) throws XMLStreamException {
Reference readReference(XMLStreamReader reader, Map<String, EDIType> types) {
QName element = reader.getName();
String refId = null;

Expand All @@ -446,7 +428,14 @@ Reference readReference(XMLStreamReader reader, Map<String, EDIType> types) thro
Reference ref;

if (qnLoop.equals(element)) {
StructureType loop = readComplexType(reader, element, types);
StructureType loop;

try {
loop = readComplexType(reader, element, types);
} catch (XMLStreamException xse) {
throw schemaException("Exception reading loop", reader, xse);
}

String loopRefId = qnLoop.toString() + '.' + refId;
types.put(loopRefId, loop);
ref = new Reference(loopRefId, refTag, minOccurs, maxOccurs);
Expand All @@ -458,7 +447,7 @@ Reference readReference(XMLStreamReader reader, Map<String, EDIType> types) thro
return ref;
}

void readSyntax(XMLStreamReader reader, List<EDISyntaxRule> rules) throws XMLStreamException {
void readSyntax(XMLStreamReader reader, List<EDISyntaxRule> rules) {
String type = reader.getAttributeValue(null, "type");
EDISyntaxRule.Type typeInt = null;

Expand All @@ -470,9 +459,11 @@ void readSyntax(XMLStreamReader reader, List<EDISyntaxRule> rules) throws XMLStr
throw schemaException("Invalid syntax 'type': [" + type + ']', reader, e);
}

SyntaxRestriction rule = new SyntaxRestriction(typeInt, readSyntaxPositions(reader));

rules.add(rule);
try {
rules.add(new SyntaxRestriction(typeInt, readSyntaxPositions(reader)));
} catch (XMLStreamException xse) {
throw schemaException("Exception reading syntax", reader, xse);
}
}

List<Integer> readSyntaxPositions(XMLStreamReader reader) throws XMLStreamException {
Expand Down Expand Up @@ -598,6 +589,14 @@ void requireEvent(int eventId, XMLStreamReader reader) {
}
}

void requireElementStart(QName element, XMLStreamReader reader) {
requireEvent(XMLStreamConstants.START_ELEMENT, reader);

if (!element.equals(reader.getName())) {
throw schemaException("Unexpected XML element [" + reader.getName() + "]", reader);
}
}

void checkEvent(XMLStreamReader reader, int... expected) {
Integer event = reader.getEventType();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,13 @@ int validate(Dialect dialect, CharSequence value) {

case '-':
length--;

if (i > 0 && value.charAt(i - 1) != 'E') {
invalid = true;
}
invalid = !validNegativeSymbol(i, value, invalid);
break;

default:
if (value.charAt(i) == decimalMark) {
length--;

if (++dec > 1 || exp > 0) {
invalid = true;
}
invalid = !validDecimalSymbol(++dec, exp, invalid);
} else {
invalid = true;
}
Expand All @@ -84,4 +78,20 @@ int validate(Dialect dialect, CharSequence value) {

return invalid ? -length : length;
}

boolean validNegativeSymbol(int currentIndex, CharSequence value, boolean currentlyInvalid) {
if (currentlyInvalid) {
return false;
}

return currentIndex == 0 || value.charAt(currentIndex - 1) == 'E';
}

boolean validDecimalSymbol(int decimalCount, int exponentCount, boolean currentlyInvalid) {
if (currentlyInvalid) {
return false;
}

return !(decimalCount > 1 || exponentCount > 0);
}
}
Loading

0 comments on commit 021808f

Please sign in to comment.