Skip to content

Commit 3e38451

Browse files
authored
Detect lexical errors for JSON and YAML parsers (#582)
* Parsers check for lexical errors as well as parser errors
1 parent 23627d9 commit 3e38451

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-1
lines changed

core/src/main/java/oracle/weblogic/deploy/json/AbstractJsonTranslator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2019, Oracle Corporation and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2020, Oracle Corporation and/or its affiliates. All rights reserved.
33
* Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
44
*/
55
package oracle.weblogic.deploy.json;
@@ -288,6 +288,9 @@ protected PyDictionary parseInternal(String jsonFileName, InputStream jsonStream
288288
try {
289289
CharStream input = CharStreams.fromStream(jsonStream);
290290
JSONLexer lexer = new JSONLexer(input);
291+
lexer.removeErrorListeners();
292+
lexer.addErrorListener(errorListener);
293+
291294
CommonTokenStream tokens = new CommonTokenStream(lexer);
292295
JSONParser parser = new JSONParser(tokens);
293296

core/src/main/java/oracle/weblogic/deploy/yaml/AbstractYamlTranslator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ protected PyDictionary parseInternal(String yamlFileName, InputStream yamlStream
175175
try {
176176
CharStream input = CharStreams.fromStream(yamlStream);
177177
YamlLexer lexer = new YamlLexer(input);
178+
lexer.removeErrorListeners();
179+
lexer.addErrorListener(errorListener);
180+
178181
CommonTokenStream tokens = new CommonTokenStream(lexer);
179182
YamlParser parser = new YamlParser(tokens);
180183

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2020, Oracle Corporation and/or its affiliates.
3+
* Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4+
*/
5+
package oracle.weblogic.deploy.json;
6+
7+
import org.junit.Assert;
8+
import org.junit.Test;
9+
10+
import java.io.ByteArrayInputStream;
11+
import java.io.InputStream;
12+
import java.util.logging.Level;
13+
import java.util.logging.Logger;
14+
15+
import static java.nio.charset.StandardCharsets.UTF_8;
16+
17+
public class JsonTranslatorTest {
18+
19+
/**
20+
* Verify that a lexical error will throw an Exception
21+
*/
22+
@Test
23+
public void testLexicalError() {
24+
// Temporarily disable logging for this test. Intended lexical failure will log a stack trace.
25+
Logger logger = Logger.getLogger("wlsdeploy.json");
26+
Level originalLevel = logger.getLevel();
27+
logger.setLevel(Level.OFF);
28+
29+
try {
30+
// JSON { "abc": "xyz"\ } causes lexical error
31+
String text = "{ \"abc\": \"xyz\"/ }";
32+
InputStream stream = new ByteArrayInputStream(text.getBytes(UTF_8));
33+
JsonStreamTranslator translator = new JsonStreamTranslator("String", stream);
34+
translator.parse();
35+
Assert.fail("Test must raise JsonException when model has a lexical error");
36+
37+
} catch(JsonException e) {
38+
// expected result
39+
40+
} finally {
41+
logger.setLevel(originalLevel);
42+
}
43+
}
44+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (c) 2020, Oracle Corporation and/or its affiliates.
3+
* Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
4+
*/
5+
package oracle.weblogic.deploy.yaml;
6+
7+
import org.junit.Assert;
8+
import org.junit.Test;
9+
10+
import java.io.ByteArrayInputStream;
11+
import java.io.InputStream;
12+
import java.util.logging.Level;
13+
import java.util.logging.Logger;
14+
15+
import static java.nio.charset.StandardCharsets.UTF_8;
16+
17+
public class YamlTranslatorTest {
18+
19+
/**
20+
* Verify that a lexical error will throw an Exception
21+
*/
22+
@Test
23+
public void testLexicalError() {
24+
// Temporarily disable logging for this test. Intended lexical failure will log a stack trace.
25+
Logger logger = Logger.getLogger("wlsdeploy.yaml");
26+
Level originalLevel = logger.getLevel();
27+
logger.setLevel(Level.OFF);
28+
29+
try {
30+
// YAML causes lexical error:
31+
// abc:
32+
// xyz: aa-bb
33+
String text = "abc:\n xyz: aa-bb\n";
34+
InputStream stream = new ByteArrayInputStream(text.getBytes(UTF_8));
35+
YamlStreamTranslator translator = new YamlStreamTranslator("String", stream);
36+
translator.parse();
37+
Assert.fail("Test must raise YamlException when model has a lexical error");
38+
39+
} catch(YamlException e) {
40+
// expected result
41+
42+
} finally {
43+
logger.setLevel(originalLevel);
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)