From 2924f0e8570083b60a880cd0215c565960b3e155 Mon Sep 17 00:00:00 2001 From: Michael Edgar Date: Wed, 13 Oct 2021 16:37:03 -0400 Subject: [PATCH] Use case-insensitive comparison for enum conversion in schema reader --- .../io/xlate/edi/internal/schema/SchemaReaderBase.java | 6 +++--- src/main/java/io/xlate/edi/schema/EDISimpleType.java | 9 +++++++++ src/main/java/io/xlate/edi/schema/EDISyntaxRule.java | 9 +++++++++ src/main/java/io/xlate/edi/schema/EDIType.java | 9 +++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/xlate/edi/internal/schema/SchemaReaderBase.java b/src/main/java/io/xlate/edi/internal/schema/SchemaReaderBase.java index e0bd4dbc..fa62d55b 100644 --- a/src/main/java/io/xlate/edi/internal/schema/SchemaReaderBase.java +++ b/src/main/java/io/xlate/edi/internal/schema/SchemaReaderBase.java @@ -570,7 +570,7 @@ void readSyntax(XMLStreamReader reader, List rules) { EDISyntaxRule.Type typeInt = null; try { - typeInt = EDISyntaxRule.Type.valueOf(type.toUpperCase()); + typeInt = EDISyntaxRule.Type.fromString(type); } catch (IllegalArgumentException e) { throw schemaException("Invalid syntax 'type': [" + type + ']', reader, e); } @@ -607,7 +607,7 @@ List readSyntaxPositions(XMLStreamReader reader) { ElementType readSimpleType(XMLStreamReader reader) { String name = parseAttribute(reader, "name", String::valueOf); String code = parseAttribute(reader, "code", String::valueOf, name); - Base base = parseAttribute(reader, "base", val -> Base.valueOf(val.toUpperCase()), Base.STRING); + Base base = parseAttribute(reader, "base", val -> Base.fromString(val), Base.STRING); int scale = (Base.NUMERIC == base) ? parseAttribute(reader, "scale", Integer::parseInt, 0) : -1; int number = parseAttribute(reader, "number", Integer::parseInt, -1); long minLength = parseAttribute(reader, "minLength", Long::parseLong, 1L); @@ -793,7 +793,7 @@ void setReferences(StructureType struct, Map types) { final EDIType.Type refType = target.getType(); - if (refType != EDIType.Type.valueOf(impl.getRefTag().toUpperCase())) { + if (refType != EDIType.Type.fromString(impl.getRefTag())) { throw schemaException(String.format(REFERR_ILLEGAL, impl.getRefId(), impl.getRefTag(), struct.getId())); } diff --git a/src/main/java/io/xlate/edi/schema/EDISimpleType.java b/src/main/java/io/xlate/edi/schema/EDISimpleType.java index 4594136d..cc1ff7f5 100644 --- a/src/main/java/io/xlate/edi/schema/EDISimpleType.java +++ b/src/main/java/io/xlate/edi/schema/EDISimpleType.java @@ -30,6 +30,15 @@ public enum Base { TIME, BINARY, IDENTIFIER; + + public static Base fromString(String value) { + for (Base entry : values()) { + if (entry.name().equalsIgnoreCase(value)) { + return entry; + } + } + throw new IllegalArgumentException("No enum constant for " + Base.class.getName() + "." + value); + } } Base getBase(); diff --git a/src/main/java/io/xlate/edi/schema/EDISyntaxRule.java b/src/main/java/io/xlate/edi/schema/EDISyntaxRule.java index 9eb5fe14..3791f0aa 100644 --- a/src/main/java/io/xlate/edi/schema/EDISyntaxRule.java +++ b/src/main/java/io/xlate/edi/schema/EDISyntaxRule.java @@ -55,6 +55,15 @@ public enum Type { * EDIFACT: (D7) If first, then none of the others */ FIRSTONLY; + + public static Type fromString(String value) { + for (Type entry : values()) { + if (entry.name().equalsIgnoreCase(value)) { + return entry; + } + } + throw new IllegalArgumentException("No enum constant for " + Type.class.getName() + "." + value); + } } Type getType(); diff --git a/src/main/java/io/xlate/edi/schema/EDIType.java b/src/main/java/io/xlate/edi/schema/EDIType.java index 2ce7e0b9..aedf4dbe 100644 --- a/src/main/java/io/xlate/edi/schema/EDIType.java +++ b/src/main/java/io/xlate/edi/schema/EDIType.java @@ -25,6 +25,15 @@ public enum Type { SEGMENT, COMPOSITE, ELEMENT; + + public static Type fromString(String value) { + for (Type entry : values()) { + if (entry.name().equalsIgnoreCase(value)) { + return entry; + } + } + throw new IllegalArgumentException("No enum constant for " + Type.class.getName() + "." + value); + } } String getId();