This is an automated email from the ASF dual-hosted git repository. jamesbognar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push: new 82928fd Tests 82928fd is described below commit 82928fd33b7287fc8ad94888c6a940f6b3297ac6 Author: JamesBognar <jamesbog...@apache.org> AuthorDate: Fri Apr 10 12:48:50 2020 -0400 Tests --- .../juneau/SerializerPropertiesComboTest.java | 2 +- .../org/apache/juneau/jena/RdfParserSession.java | 14 +- .../org/apache/juneau/html/HtmlParserSession.java | 7 +- .../org/apache/juneau/json/JsonParserSession.java | 7 +- .../org/apache/juneau/json/SimpleJsonParser.java | 2 +- .../juneau/msgpack/MsgPackParserSession.java | 7 +- .../org/apache/juneau/parser/ParserListener.java | 12 ++ .../org/apache/juneau/parser/ParserSession.java | 14 ++ .../org/apache/juneau/uon/UonParserSession.java | 14 +- .../urlencoding/UrlEncodingParserSession.java | 24 ++- .../org/apache/juneau/xml/XmlParserSession.java | 7 +- .../apache/juneau/rest/client2/RestClientTest.java | 175 ++++++++++++++++----- .../juneau/rest/client2/RestClientBuilder.java | 8 +- .../apache/juneau/rest/mock2/MockRestClient.java | 11 +- 14 files changed, 242 insertions(+), 62 deletions(-) diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java index 077c139..941bb40 100644 --- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java +++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/SerializerPropertiesComboTest.java @@ -326,7 +326,7 @@ public class SerializerPropertiesComboTest extends ComboRoundTripTest { }, { /* 10 */ new ComboInput<>( - "WSERIALIZER_maxIndent", + "WSERIALIZER_maxIndent/WSERIALIZER_useWhitespace", T10.class, new T10().init() ) diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java index 71e2907..b54feed 100644 --- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java +++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfParserSession.java @@ -185,11 +185,21 @@ public class RdfParserSession extends ReaderParserSession { ClassMeta<?> et = cm.getElementType(); Object value = parseAnything(et, o, m.getBean(false), pMeta); setName(et, value, key); - pMeta.add(m, key, value); + try { + pMeta.add(m, key, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } else { Object value = parseAnything(cm, o, m.getBean(false), pMeta); setName(cm, value, key); - pMeta.set(m, key, value); + try { + pMeta.set(m, key, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } } else if (! (p.equals(pRoot) || p.equals(pType))) { onUnknownProperty(key, m); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java index a72dc3a..c0732ed 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java @@ -521,7 +521,12 @@ public final class HtmlParserSession extends XmlParserSession { ClassMeta<?> cm = pMeta.getClassMeta(); Object value = parseAnything(cm, r, m.getBean(false), false, pMeta); setName(cm, value, key); - pMeta.set(m, key, value); + try { + pMeta.set(m, key, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } } HtmlTag t = nextTag(r, xTD, xTR); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java index 574685c..56098e3 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java @@ -521,7 +521,12 @@ public final class JsonParserSession extends ReaderParserSession { ClassMeta<?> cm = pMeta.getClassMeta(); Object value = parseAnything(cm, r.unread(), m.getBean(false), pMeta); setName(cm, value, currAttr); - pMeta.set(m, currAttr, value); + try { + pMeta.set(m, currAttr, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } setCurrentProperty(null); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonParser.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonParser.java index 4189c80..0754761 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonParser.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/SimpleJsonParser.java @@ -41,7 +41,7 @@ public class SimpleJsonParser extends JsonParser { * @param ps The property store containing all the settings for this object. */ public SimpleJsonParser(PropertyStore ps) { - super(ps, "application/json+simple", "text/json+simple"); + super(ps, "application/json+simple", "text/json+simple", "application/json", "text/json"); } @Override /* Context */ diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java index 49d40e1..1d5dafe 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackParserSession.java @@ -138,7 +138,12 @@ public final class MsgPackParserSession extends InputStreamParserSession { ClassMeta<?> cm = bpm.getClassMeta(); Object value = parseAnything(cm, is, m.getBean(false), bpm); setName(cm, value, pName); - bpm.set(m, pName, value); + try { + bpm.set(m, pName, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } } o = builder == null ? m.getBean() : builder.build(this, m.getBean(), eType); diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java index ac7c974..a04f1d2 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserListener.java @@ -47,6 +47,18 @@ public class ParserListener { } /** + * Called when an exception is thrown when trying to call a bean setter method. + * + * @param session The serializer session. + * @param t The throwable that was thrown by the setter method. + * @param p The bean property we had an issue on. + */ + public void onBeanSetterException(ParserSession session, Throwable t, BeanPropertyMeta p) { + onError(session, t, format("Could not call setValue() on property ''{0}'' of class ''{1}'', exception = {2}", + p.getName(), p.getBeanMeta().getClassMeta(), t.getLocalizedMessage())); + } + + /** * Called when an error occurs during parsing but is ignored. * * @param session The parser session. diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java index 5c08951..d5ef179 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java @@ -298,6 +298,20 @@ public abstract class ParserSession extends BeanSession { } /** + * Specialized warning when an exception is thrown while executing a bean setter. + * + * @param p The bean map entry representing the bean property. + * @param t The throwable that the bean setter threw. + */ + protected final void onBeanSetterException(BeanPropertyMeta p, Throwable t) { + if (listener != null) + listener.onBeanSetterException(this, t, p); + String prefix = ""; + addWarning("{0}Could not call setValue() on property ''{1}'' of class ''{2}'', exception = {3}", prefix, + p.getName(), p.getBeanMeta().getClassMeta(), t.getLocalizedMessage()); + } + + /** * Method that gets called when an unknown bean property name is encountered. * * @param propertyName The unknown bean property name. diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java index 04a9f58..b09fded 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java @@ -544,7 +544,12 @@ public class UonParserSession extends ReaderParserSession implements HttpPartPar } else { unmark(); Object value = convertToType("", pMeta.getClassMeta()); - pMeta.set(m, currAttr, value); + try { + pMeta.set(m, currAttr, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } } if (c == -1 || c == ')' || c == AMP) @@ -563,7 +568,12 @@ public class UonParserSession extends ReaderParserSession implements HttpPartPar ClassMeta<?> cm = pMeta.getClassMeta(); Object value = parseAnything(cm, r.unread(), m.getBean(false), false, pMeta); setName(cm, value, currAttr); - pMeta.set(m, currAttr, value); + try { + pMeta.set(m, currAttr, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } setCurrentProperty(null); } } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java index 9a4244f..55851ba 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParserSession.java @@ -297,8 +297,14 @@ public class UrlEncodingParserSession extends UonParserSession { // In cases of "&foo=", create an empty instance of the value if createable. // Otherwise, leave it null. ClassMeta<?> cm = pMeta.getClassMeta(); - if (cm.canCreateNewInstance()) - pMeta.set(m, currAttr, cm.newInstance()); + if (cm.canCreateNewInstance()) { + try { + pMeta.set(m, currAttr, cm.newInstance()); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } + } setCurrentProperty(null); } } @@ -319,12 +325,22 @@ public class UrlEncodingParserSession extends UonParserSession { ClassMeta et = pMeta.getClassMeta().getElementType(); Object value = parseAnything(et, r.unread(), m.getBean(false), true, pMeta); setName(et, value, currAttr); - pMeta.add(m, currAttr, value); + try { + pMeta.add(m, currAttr, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } else { ClassMeta<?> cm = pMeta.getClassMeta(); Object value = parseAnything(cm, r.unread(), m.getBean(false), true, pMeta); setName(cm, value, currAttr); - pMeta.set(m, currAttr, value); + try { + pMeta.set(m, currAttr, value); + } catch (BeanRuntimeException e) { + onBeanSetterException(pMeta, e); + throw e; + } } setCurrentProperty(null); } diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java index 422c8b7..7e74691 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java @@ -498,7 +498,12 @@ public class XmlParserSession extends ReaderParserSession { onUnknownProperty(key, m); } } else { - bpm.set(m, key, val); + try { + bpm.set(m, key, val); + } catch (BeanRuntimeException e) { + onBeanSetterException(bpm, e); + throw e; + } } } } diff --git a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java index 6fd829a..b752f42 100644 --- a/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java +++ b/juneau-rest/juneau-rest-client-utest/src/test/java/org/apache/juneau/rest/client2/RestClientTest.java @@ -2243,11 +2243,11 @@ public class RestClientTest { } @Test - public void l10_serializer_listenerSClass() throws Exception { + public void l10_serializer_serializerListener() throws Exception { MockRestClient .create(A.class) .simpleJson() - .listenerS(L10.class) + .serializerListener(L10.class) .ws() .build() .post("/echoBody", new L10a()) @@ -2608,44 +2608,141 @@ public class RestClientTest { .run() .getBody().assertValue("{f1:'foo'}"); } -// public RestClientBuilder sq() { -// @Test -// public void l29_serializer_useWhitespaceBoolean() throws Exception { fail(); } -//// public RestClientBuilder useWhitespace(boolean value) { -// -// @Test -// public void l30_serializer_useWhitespace() throws Exception { fail(); } -//// public RestClientBuilder useWhitespace() { -// -// @Test -// public void l31_serializer_ws() throws Exception { fail(); } -//// public RestClientBuilder ws() { -// -// @Test -// public void l32_serializer_binaryOutputFormat() throws Exception { fail(); } -//// public RestClientBuilder binaryOutputFormat(BinaryFormat value) { -// -// //----------------------------------------------------------------------------------------------------------------- -// // Parser properties -// //----------------------------------------------------------------------------------------------------------------- -// -// @Test -// public void m01_parser_autoCloseStreamsBoolean() throws Exception { fail(); } -//// public RestClientBuilder autoCloseStreams(boolean value) { -// -// @Test -// public void m02_parser_autoCloseStreams() throws Exception { fail(); } -//// public RestClientBuilder autoCloseStreams() { -// -// @Test -// public void m03_parser_debugOutputLines() throws Exception { fail(); } -//// public RestClientBuilder debugOutputLines(int value) { -// -// @Test -// public void m04_parser_listenerPClass() throws Exception { fail(); } -//// public RestClientBuilder listenerP(Class<? extends ParserListener> value) { -// + @Test + public void l29_serializer_useWhitespace() throws Exception { + L27 x = new L27(); + + MockRestClient + .create(A.class) + .simpleJson() + .useWhitespace(true) + .build() + .post("/echoBody", x) + .run() + .getBody().assertValue("{\n\tf1: 'foo'\n}"); + + MockRestClient + .create(A.class) + .simpleJson() + .ws() + .build() + .post("/echoBody", x) + .run() + .getBody().assertValue("{\n\tf1: 'foo'\n}"); + + MockRestClient + .create(A.class) + .simpleJson() + .useWhitespace(false) + .build() + .post("/echoBody", x) + .run() + .getBody().assertValue("{f1:'foo'}"); + + } + + //----------------------------------------------------------------------------------------------------------------- + // Parser properties + //----------------------------------------------------------------------------------------------------------------- + + @Test + public void m01_parser_autoCloseStreams() throws Exception { + String x = "foo"; + RestClient rc = null; + + rc = MockRestClient + .create(A.class) + .simpleJson() + .autoCloseStreams() + .build(); + + assertTrue(rc.parsers.getParser("application/json").toMap().getMap("Parser").getBoolean("autoCloseStreams")); + + rc + .post("/echoBody", x) + .run() + .getBody().assertValue("'foo'"); + + rc = MockRestClient + .create(A.class) + .simpleJson() + .autoCloseStreams(true) + .build(); + + assertTrue(rc.parsers.getParser("application/json").toMap().getMap("Parser").getBoolean("autoCloseStreams")); + + rc + .post("/echoBody", x) + .run() + .getBody().assertValue("'foo'"); + + rc = MockRestClient + .create(A.class) + .simpleJson() + .autoCloseStreams(false) + .build(); + + assertFalse(rc.parsers.getParser("application/json").toMap().getMap("Parser").getBoolean("autoCloseStreams", false)); + + rc + .post("/echoBody", x) + .run() + .getBody().assertValue("'foo'"); + } + + @Test + public void m03_parser_debugOutputLines() throws Exception { + RestClient rc = null; + + rc = MockRestClient + .create(A.class) + .simpleJson() + .debugOutputLines(10) + .build(); + + assertEquals(10, rc.parsers.getParser("application/json").toMap().getMap("Parser").getInt("debugOutputLines").intValue()); + } + + public static class M4L extends ParserListener { + public static Throwable T; + public static String MSG; + + @Override + public void onError(ParserSession session, Throwable t, String msg) { + T = t; + MSG = msg; + } + } + + public static class M4 { + public void setF(String f) { + throw new RuntimeException("foo"); + } + } + + @Test + public void m04_parser_parserListener() throws Exception { + RestClient rc = null; + + rc = MockRestClient + .create(A.class) + .parser(JsonParser.class) + .parserListener(M4L.class) + .build(); + + try { + rc + .post("/echoBody", "{f:'1'}") + .run() + .getBody().as(M4.class); + fail("Exception expected"); + } catch (Exception e) { + assertTrue(M4L.T instanceof RuntimeException); + assertTrue(M4L.MSG.contains("Error occurred trying to set property 'f'")); + } + } + // @Test // public void m05_parser_strictBoolean() throws Exception { fail(); } //// public RestClientBuilder strict(boolean value) { diff --git a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java index 81bc1ec..43d26e0 100644 --- a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java +++ b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client2/RestClientBuilder.java @@ -2133,7 +2133,7 @@ public class RestClientBuilder extends BeanContextBuilder { * @return This object (for method chaining). */ @ConfigurationProperty - public RestClientBuilder listenerS(Class<? extends SerializerListener> value) { + public RestClientBuilder serializerListener(Class<? extends SerializerListener> value) { return set(SERIALIZER_listener, value); } @@ -2625,7 +2625,7 @@ public class RestClientBuilder extends BeanContextBuilder { * @return This object (for method chaining). */ @ConfigurationProperty - public RestClientBuilder listenerP(Class<? extends ParserListener> value) { + public RestClientBuilder parserListener(Class<? extends ParserListener> value) { return set(PARSER_listener, value); } @@ -2812,7 +2812,7 @@ public class RestClientBuilder extends BeanContextBuilder { * @return This object (for method chaining). */ @ConfigurationProperty - public RestClientBuilder paramFormat(String value) { + public RestClientBuilder paramFormat(ParamFormat value) { return set(UON_paramFormat, value); } @@ -2827,7 +2827,7 @@ public class RestClientBuilder extends BeanContextBuilder { */ @ConfigurationProperty public RestClientBuilder paramFormatPlain() { - return set(UON_paramFormat, "PLAINTEXT"); + return set(UON_paramFormat, ParamFormat.PLAINTEXT); } // <CONFIGURATION-PROPERTIES> diff --git a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java index 5641b38..7a23d3d 100644 --- a/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java +++ b/juneau-rest/juneau-rest-mock/src/main/java/org/apache/juneau/rest/mock2/MockRestClient.java @@ -32,6 +32,7 @@ import org.apache.juneau.rest.annotation.*; import org.apache.juneau.rest.client2.*; import org.apache.juneau.serializer.*; import org.apache.juneau.svl.*; +import org.apache.juneau.uon.*; /** * Mocked {@link RestClient}. @@ -1209,14 +1210,14 @@ public class MockRestClient extends RestClientBuilder { } @Override /* GENERATED - RestClientBuilder */ - public MockRestClient listenerP(Class<? extends org.apache.juneau.parser.ParserListener> value) { - super.listenerP(value); + public MockRestClient parserListener(Class<? extends org.apache.juneau.parser.ParserListener> value) { + super.parserListener(value); return this; } @Override /* GENERATED - RestClientBuilder */ - public MockRestClient listenerS(Class<? extends org.apache.juneau.serializer.SerializerListener> value) { - super.listenerS(value); + public MockRestClient serializerListener(Class<? extends org.apache.juneau.serializer.SerializerListener> value) { + super.serializerListener(value); return this; } @@ -1287,7 +1288,7 @@ public class MockRestClient extends RestClientBuilder { } @Override /* GENERATED - RestClientBuilder */ - public MockRestClient paramFormat(String value) { + public MockRestClient paramFormat(ParamFormat value) { super.paramFormat(value); return this; }