juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] branch master updated: Fix bug in handling of HTML5 boolean attributes
Date Thu, 13 Sep 2018 16:32:14 GMT
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 fc96395  Fix bug in handling of HTML5 boolean attributes
fc96395 is described below

commit fc9639571664965003d2c3d023bcaa8364e7d811
Author: JamesBognar <jamesbognar@apache.org>
AuthorDate: Thu Sep 13 12:32:00 2018 -0400

    Fix bug in handling of HTML5 boolean attributes
---
 .../apache/juneau/dto/html5/Html5ComboTest.java    |  84 +++++------
 .../juneau/httppart/HttpPartSchemaTest_Path.java   |  70 +++++++--
 .../java/org/apache/juneau/dto/html5/Audio.java    |   4 +-
 .../java/org/apache/juneau/dto/html5/Button.java   |   2 +-
 .../java/org/apache/juneau/dto/html5/Fieldset.java |   2 +-
 .../org/apache/juneau/dto/html5/HtmlElement.java   |  28 +++-
 .../main/java/org/apache/juneau/dto/html5/Img.java |   2 +-
 .../java/org/apache/juneau/dto/html5/Input.java    |   6 +-
 .../java/org/apache/juneau/dto/html5/Keygen.java   |   2 +-
 .../main/java/org/apache/juneau/dto/html5/Ol.java  |   2 +-
 .../java/org/apache/juneau/dto/html5/Optgroup.java |   2 +-
 .../java/org/apache/juneau/dto/html5/Option.java   |   4 +-
 .../java/org/apache/juneau/dto/html5/Script.java   |   4 +-
 .../java/org/apache/juneau/dto/html5/Select.java   |   4 +-
 .../java/org/apache/juneau/dto/html5/Textarea.java |   2 +-
 .../java/org/apache/juneau/dto/html5/Video.java    |   4 +-
 juneau-doc/src/main/javadoc/overview.html          |  52 +++++--
 .../src/main/resources/ReleaseNotes/7.2.0.html     |   5 +-
 .../27.Swagger/06.ParameterExamples.html           |   2 +-
 .../27.Swagger/07.Responses.html                   |  44 +++++-
 .../27.Swagger/08.ResponseExamples.html            | 159 ++++++++++++++++++++-
 21 files changed, 391 insertions(+), 93 deletions(-)

diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
index 449e3ed..f19b2a9 100755
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/html5/Html5ComboTest.java
@@ -421,27 +421,27 @@ public class Html5ComboTest extends ComboRoundTripTest {
 						source("foo.ogg", "audio/ogg"),
 						source("foo.mp3", "audio/mpeg")
 					),
-					/* Json */		"{_type:'audio',a:{controls:true},c:[{_type:'source',a:{src:'foo.ogg',type:'audio/ogg'}},{_type:'source',a:{src:'foo.mp3',type:'audio/mpeg'}}]}",
-					/* JsonT */		"{t:'audio',a:{controls:true},c:[{t:'source',a:{src:'foo.ogg',type:'audio/ogg'}},{t:'source',a:{src:'foo.mp3',type:'audio/mpeg'}}]}",
-					/* JsonR */		"{\n\t_type: 'audio',\n\ta: {\n\t\tcontrols: true\n\t},\n\tc: [\n\t\t{\n\t\t\t_type: 'source',\n\t\t\ta: {\n\t\t\t\tsrc: 'foo.ogg',\n\t\t\t\ttype: 'audio/ogg'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t_type: 'source',\n\t\t\ta: {\n\t\t\t\tsrc: 'foo.mp3',\n\t\t\t\ttype: 'audio/mpeg'\n\t\t\t}\n\t\t}\n\t]\n}",
-					/* Xml */		"<audio controls='true'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
-					/* XmlT */		"<audio controls='true'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
-					/* XmlR */		"<audio controls='true'>\n\t<source src='foo.ogg' type='audio/ogg'/>\n\t<source src='foo.mp3' type='audio/mpeg'/>\n</audio>\n",
-					/* XmlNs */		"<audio controls='true'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
-					/* Html */		"<audio controls='true'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
-					/* HtmlT */		"<audio controls='true'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
-					/* HtmlR */		"<audio controls='true'>\n\t<source src='foo.ogg' type='audio/ogg'/>\n\t<source src='foo.mp3' type='audio/mpeg'/>\n</audio>\n",
-					/* Uon */		"(_type=audio,a=(controls=true),c=@((_type=source,a=(src=foo.ogg,type=audio/ogg)),(_type=source,a=(src=foo.mp3,type=audio/mpeg))))",
-					/* UonT */		"(t=audio,a=(controls=true),c=@((t=source,a=(src=foo.ogg,type=audio/ogg)),(t=source,a=(src=foo.mp3,type=audio/mpeg))))",
-					/* UonR */		"(\n\t_type=audio,\n\ta=(\n\t\tcontrols=true\n\t),\n\tc=@(\n\t\t(\n\t\t\t_type=source,\n\t\t\ta=(\n\t\t\t\tsrc=foo.ogg,\n\t\t\t\ttype=audio/ogg\n\t\t\t)\n\t\t),\n\t\t(\n\t\t\t_type=source,\n\t\t\ta=(\n\t\t\t\tsrc=foo.mp3,\n\t\t\t\ttype=audio/mpeg\n\t\t\t)\n\t\t)\n\t)\n)",
-					/* UrlEnc */	"_type=audio&a=(controls=true)&c=@((_type=source,a=(src=foo.ogg,type=audio/ogg)),(_type=source,a=(src=foo.mp3,type=audio/mpeg)))",
-					/* UrlEncT */	"t=audio&a=(controls=true)&c=@((t=source,a=(src=foo.ogg,type=audio/ogg)),(t=source,a=(src=foo.mp3,type=audio/mpeg)))",
-					/* UrlEncR */	"_type=audio\n&a=(\n\tcontrols=true\n)\n&c=@(\n\t(\n\t\t_type=source,\n\t\ta=(\n\t\t\tsrc=foo.ogg,\n\t\t\ttype=audio/ogg\n\t\t)\n\t),\n\t(\n\t\t_type=source,\n\t\ta=(\n\t\t\tsrc=foo.mp3,\n\t\t\ttype=audio/mpeg\n\t\t)\n\t)\n)",
-					/* MsgPack */	"83A55F74797065A5617564696FA16181A8636F6E74726F6C73C3A1639282A55F74797065A6736F75726365A16182A3737263A7666F6F2E6F6767A474797065A9617564696F2F6F676782A55F74797065A6736F75726365A16182A3737263A7666F6F2E6D7033A474797065AA617564696F2F6D706567",
-					/* MsgPackT */	"83A174A5617564696FA16181A8636F6E74726F6C73C3A1639282A174A6736F75726365A16182A3737263A7666F6F2E6F6767A474797065A9617564696F2F6F676782A174A6736F75726365A16182A3737263A7666F6F2E6D7033A474797065AA617564696F2F6D706567",
-					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:_type>audio</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:controls>true</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>source</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.ogg</jp:src>\n<jp:type>audio/ogg</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>source</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp3</jp:src>\n<jp:type>audio/mpeg</jp:t [...]
-					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:t>audio</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:controls>true</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>source</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.ogg</jp:src>\n<jp:type>audio/ogg</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>source</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp3</jp:src>\n<jp:type>audio/mpeg</jp:type>\n</jp:a>\n</rdf:li [...]
-					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:_type>audio</jp:_type>\n    <jp:a rdf:parseType='Resource'>\n      <jp:controls>true</jp:controls>\n    </jp:a>\n    <jp:c>\n      <rdf:Seq>\n        <rdf:li rdf:parseType='Resource'>\n          <jp:_type>source</jp:_type>\n          <jp:a rdf:parseType='Resource'>\n            <jp:src>foo.ogg</jp:src>\n            <jp:type>audio/ogg</jp:type>\n          </jp:a>\n        </rdf:li>\n        <rdf:li rdf:parseType='Resource'>\n     [...]
+					/* Json */		"{_type:'audio',a:{controls:'controls'},c:[{_type:'source',a:{src:'foo.ogg',type:'audio/ogg'}},{_type:'source',a:{src:'foo.mp3',type:'audio/mpeg'}}]}",
+					/* JsonT */		"{t:'audio',a:{controls:'controls'},c:[{t:'source',a:{src:'foo.ogg',type:'audio/ogg'}},{t:'source',a:{src:'foo.mp3',type:'audio/mpeg'}}]}",
+					/* JsonR */		"{\n\t_type: 'audio',\n\ta: {\n\t\tcontrols: 'controls'\n\t},\n\tc: [\n\t\t{\n\t\t\t_type: 'source',\n\t\t\ta: {\n\t\t\t\tsrc: 'foo.ogg',\n\t\t\t\ttype: 'audio/ogg'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t_type: 'source',\n\t\t\ta: {\n\t\t\t\tsrc: 'foo.mp3',\n\t\t\t\ttype: 'audio/mpeg'\n\t\t\t}\n\t\t}\n\t]\n}",
+					/* Xml */		"<audio controls='controls'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
+					/* XmlT */		"<audio controls='controls'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
+					/* XmlR */		"<audio controls='controls'>\n\t<source src='foo.ogg' type='audio/ogg'/>\n\t<source src='foo.mp3' type='audio/mpeg'/>\n</audio>\n",
+					/* XmlNs */		"<audio controls='controls'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
+					/* Html */		"<audio controls='controls'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
+					/* HtmlT */		"<audio controls='controls'><source src='foo.ogg' type='audio/ogg'/><source src='foo.mp3' type='audio/mpeg'/></audio>",
+					/* HtmlR */		"<audio controls='controls'>\n\t<source src='foo.ogg' type='audio/ogg'/>\n\t<source src='foo.mp3' type='audio/mpeg'/>\n</audio>\n",
+					/* Uon */		"(_type=audio,a=(controls=controls),c=@((_type=source,a=(src=foo.ogg,type=audio/ogg)),(_type=source,a=(src=foo.mp3,type=audio/mpeg))))",
+					/* UonT */		"(t=audio,a=(controls=controls),c=@((t=source,a=(src=foo.ogg,type=audio/ogg)),(t=source,a=(src=foo.mp3,type=audio/mpeg))))",
+					/* UonR */		"(\n\t_type=audio,\n\ta=(\n\t\tcontrols=controls\n\t),\n\tc=@(\n\t\t(\n\t\t\t_type=source,\n\t\t\ta=(\n\t\t\t\tsrc=foo.ogg,\n\t\t\t\ttype=audio/ogg\n\t\t\t)\n\t\t),\n\t\t(\n\t\t\t_type=source,\n\t\t\ta=(\n\t\t\t\tsrc=foo.mp3,\n\t\t\t\ttype=audio/mpeg\n\t\t\t)\n\t\t)\n\t)\n)",
+					/* UrlEnc */	"_type=audio&a=(controls=controls)&c=@((_type=source,a=(src=foo.ogg,type=audio/ogg)),(_type=source,a=(src=foo.mp3,type=audio/mpeg)))",
+					/* UrlEncT */	"t=audio&a=(controls=controls)&c=@((t=source,a=(src=foo.ogg,type=audio/ogg)),(t=source,a=(src=foo.mp3,type=audio/mpeg)))",
+					/* UrlEncR */	"_type=audio\n&a=(\n\tcontrols=controls\n)\n&c=@(\n\t(\n\t\t_type=source,\n\t\ta=(\n\t\t\tsrc=foo.ogg,\n\t\t\ttype=audio/ogg\n\t\t)\n\t),\n\t(\n\t\t_type=source,\n\t\ta=(\n\t\t\tsrc=foo.mp3,\n\t\t\ttype=audio/mpeg\n\t\t)\n\t)\n)",
+					/* MsgPack */	"83A55F74797065A5617564696FA16181A8636F6E74726F6C73A8636F6E74726F6C73A1639282A55F74797065A6736F75726365A16182A3737263A7666F6F2E6F6767A474797065A9617564696F2F6F676782A55F74797065A6736F75726365A16182A3737263A7666F6F2E6D7033A474797065AA617564696F2F6D706567",
+					/* MsgPackT */	"83A174A5617564696FA16181A8636F6E74726F6C73A8636F6E74726F6C73A1639282A174A6736F75726365A16182A3737263A7666F6F2E6F6767A474797065A9617564696F2F6F676782A174A6736F75726365A16182A3737263A7666F6F2E6D7033A474797065AA617564696F2F6D706567",
+					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:_type>audio</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:controls>controls</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>source</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.ogg</jp:src>\n<jp:type>audio/ogg</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>source</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp3</jp:src>\n<jp:type>audio/mpeg</ [...]
+					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:t>audio</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:controls>controls</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>source</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.ogg</jp:src>\n<jp:type>audio/ogg</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>source</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp3</jp:src>\n<jp:type>audio/mpeg</jp:type>\n</jp:a>\n</rd [...]
+					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:_type>audio</jp:_type>\n    <jp:a rdf:parseType='Resource'>\n      <jp:controls>controls</jp:controls>\n    </jp:a>\n    <jp:c>\n      <rdf:Seq>\n        <rdf:li rdf:parseType='Resource'>\n          <jp:_type>source</jp:_type>\n          <jp:a rdf:parseType='Resource'>\n            <jp:src>foo.ogg</jp:src>\n            <jp:type>audio/ogg</jp:type>\n          </jp:a>\n        </rdf:li>\n        <rdf:li rdf:parseType='Resource'>\n [...]
 				)
 				{
 					@Override
@@ -2698,27 +2698,27 @@ public class Html5ComboTest extends ComboRoundTripTest {
 						source("foo.mp4", "video/mp4"),
 						track("subtitles_en.vtt", "subtitles").srclang("en")
 					),
-					/* Json */		"{_type:'video',a:{width:100,height:200,controls:true},c:[{_type:'source',a:{src:'foo.mp4',type:'video/mp4'}},{_type:'track',a:{src:'subtitles_en.vtt',kind:'subtitles',srclang:'en'}}]}",
-					/* JsonT */		"{t:'video',a:{width:100,height:200,controls:true},c:[{t:'source',a:{src:'foo.mp4',type:'video/mp4'}},{t:'track',a:{src:'subtitles_en.vtt',kind:'subtitles',srclang:'en'}}]}",
-					/* JsonR */		"{\n\t_type: 'video',\n\ta: {\n\t\twidth: 100,\n\t\theight: 200,\n\t\tcontrols: true\n\t},\n\tc: [\n\t\t{\n\t\t\t_type: 'source',\n\t\t\ta: {\n\t\t\t\tsrc: 'foo.mp4',\n\t\t\t\ttype: 'video/mp4'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t_type: 'track',\n\t\t\ta: {\n\t\t\t\tsrc: 'subtitles_en.vtt',\n\t\t\t\tkind: 'subtitles',\n\t\t\t\tsrclang: 'en'\n\t\t\t}\n\t\t}\n\t]\n}",
-					/* Xml */		"<video width='100' height='200' controls='true'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
-					/* XmlT */		"<video width='100' height='200' controls='true'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
-					/* XmlR */		"<video width='100' height='200' controls='true'>\n\t<source src='foo.mp4' type='video/mp4'/>\n\t<track src='subtitles_en.vtt' kind='subtitles' srclang='en'/>\n</video>\n",
-					/* XmlNs */		"<video width='100' height='200' controls='true'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
-					/* Html */		"<video width='100' height='200' controls='true'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
-					/* HtmlT */		"<video width='100' height='200' controls='true'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
-					/* HtmlR */		"<video width='100' height='200' controls='true'>\n\t<source src='foo.mp4' type='video/mp4'/>\n\t<track src='subtitles_en.vtt' kind='subtitles' srclang='en'/>\n</video>\n",
-					/* Uon */		"(_type=video,a=(width=100,height=200,controls=true),c=@((_type=source,a=(src=foo.mp4,type=video/mp4)),(_type=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en))))",
-					/* UonT */		"(t=video,a=(width=100,height=200,controls=true),c=@((t=source,a=(src=foo.mp4,type=video/mp4)),(t=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en))))",
-					/* UonR */		"(\n\t_type=video,\n\ta=(\n\t\twidth=100,\n\t\theight=200,\n\t\tcontrols=true\n\t),\n\tc=@(\n\t\t(\n\t\t\t_type=source,\n\t\t\ta=(\n\t\t\t\tsrc=foo.mp4,\n\t\t\t\ttype=video/mp4\n\t\t\t)\n\t\t),\n\t\t(\n\t\t\t_type=track,\n\t\t\ta=(\n\t\t\t\tsrc=subtitles_en.vtt,\n\t\t\t\tkind=subtitles,\n\t\t\t\tsrclang=en\n\t\t\t)\n\t\t)\n\t)\n)",
-					/* UrlEnc */	"_type=video&a=(width=100,height=200,controls=true)&c=@((_type=source,a=(src=foo.mp4,type=video/mp4)),(_type=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en)))",
-					/* UrlEncT */	"t=video&a=(width=100,height=200,controls=true)&c=@((t=source,a=(src=foo.mp4,type=video/mp4)),(t=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en)))",
-					/* UrlEncR */	"_type=video\n&a=(\n\twidth=100,\n\theight=200,\n\tcontrols=true\n)\n&c=@(\n\t(\n\t\t_type=source,\n\t\ta=(\n\t\t\tsrc=foo.mp4,\n\t\t\ttype=video/mp4\n\t\t)\n\t),\n\t(\n\t\t_type=track,\n\t\ta=(\n\t\t\tsrc=subtitles_en.vtt,\n\t\t\tkind=subtitles,\n\t\t\tsrclang=en\n\t\t)\n\t)\n)",
-					/* MsgPack */	"83A55F74797065A5766964656FA16183A5776964746864A6686569676874D100C8A8636F6E74726F6C73C3A1639282A55F74797065A6736F75726365A16182A3737263A7666F6F2E6D7034A474797065A9766964656F2F6D703482A55F74797065A5747261636BA16183A3737263B07375627469746C65735F656E2E767474A46B696E64A97375627469746C6573A77372636C616E67A2656E",
-					/* MsgPackT */	"83A174A5766964656FA16183A5776964746864A6686569676874D100C8A8636F6E74726F6C73C3A1639282A174A6736F75726365A16182A3737263A7666F6F2E6D7034A474797065A9766964656F2F6D703482A174A5747261636BA16183A3737263B07375627469746C65735F656E2E767474A46B696E64A97375627469746C6573A77372636C616E67A2656E",
-					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:_type>video</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:width>100</jp:width>\n<jp:height>200</jp:height>\n<jp:controls>true</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>source</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp4</jp:src>\n<jp:type>video/mp4</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>track</jp:_type>\n<jp:a rdf:parseType='Resource'> [...]
-					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:t>video</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:width>100</jp:width>\n<jp:height>200</jp:height>\n<jp:controls>true</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>source</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp4</jp:src>\n<jp:type>video/mp4</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>track</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>subtitles_en. [...]
-					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:_type>video</jp:_type>\n    <jp:a rdf:parseType='Resource'>\n      <jp:width>100</jp:width>\n      <jp:height>200</jp:height>\n      <jp:controls>true</jp:controls>\n    </jp:a>\n    <jp:c>\n      <rdf:Seq>\n        <rdf:li rdf:parseType='Resource'>\n          <jp:_type>source</jp:_type>\n          <jp:a rdf:parseType='Resource'>\n            <jp:src>foo.mp4</jp:src>\n            <jp:type>video/mp4</jp:type>\n          </jp:a>\n [...]
+					/* Json */		"{_type:'video',a:{width:100,height:200,controls:'controls'},c:[{_type:'source',a:{src:'foo.mp4',type:'video/mp4'}},{_type:'track',a:{src:'subtitles_en.vtt',kind:'subtitles',srclang:'en'}}]}",
+					/* JsonT */		"{t:'video',a:{width:100,height:200,controls:'controls'},c:[{t:'source',a:{src:'foo.mp4',type:'video/mp4'}},{t:'track',a:{src:'subtitles_en.vtt',kind:'subtitles',srclang:'en'}}]}",
+					/* JsonR */		"{\n\t_type: 'video',\n\ta: {\n\t\twidth: 100,\n\t\theight: 200,\n\t\tcontrols: 'controls'\n\t},\n\tc: [\n\t\t{\n\t\t\t_type: 'source',\n\t\t\ta: {\n\t\t\t\tsrc: 'foo.mp4',\n\t\t\t\ttype: 'video/mp4'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t_type: 'track',\n\t\t\ta: {\n\t\t\t\tsrc: 'subtitles_en.vtt',\n\t\t\t\tkind: 'subtitles',\n\t\t\t\tsrclang: 'en'\n\t\t\t}\n\t\t}\n\t]\n}",
+					/* Xml */		"<video width='100' height='200' controls='controls'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
+					/* XmlT */		"<video width='100' height='200' controls='controls'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
+					/* XmlR */		"<video width='100' height='200' controls='controls'>\n\t<source src='foo.mp4' type='video/mp4'/>\n\t<track src='subtitles_en.vtt' kind='subtitles' srclang='en'/>\n</video>\n",
+					/* XmlNs */		"<video width='100' height='200' controls='controls'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
+					/* Html */		"<video width='100' height='200' controls='controls'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
+					/* HtmlT */		"<video width='100' height='200' controls='controls'><source src='foo.mp4' type='video/mp4'/><track src='subtitles_en.vtt' kind='subtitles' srclang='en'/></video>",
+					/* HtmlR */		"<video width='100' height='200' controls='controls'>\n\t<source src='foo.mp4' type='video/mp4'/>\n\t<track src='subtitles_en.vtt' kind='subtitles' srclang='en'/>\n</video>\n",
+					/* Uon */		"(_type=video,a=(width=100,height=200,controls=controls),c=@((_type=source,a=(src=foo.mp4,type=video/mp4)),(_type=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en))))",
+					/* UonT */		"(t=video,a=(width=100,height=200,controls=controls),c=@((t=source,a=(src=foo.mp4,type=video/mp4)),(t=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en))))",
+					/* UonR */		"(\n\t_type=video,\n\ta=(\n\t\twidth=100,\n\t\theight=200,\n\t\tcontrols=controls\n\t),\n\tc=@(\n\t\t(\n\t\t\t_type=source,\n\t\t\ta=(\n\t\t\t\tsrc=foo.mp4,\n\t\t\t\ttype=video/mp4\n\t\t\t)\n\t\t),\n\t\t(\n\t\t\t_type=track,\n\t\t\ta=(\n\t\t\t\tsrc=subtitles_en.vtt,\n\t\t\t\tkind=subtitles,\n\t\t\t\tsrclang=en\n\t\t\t)\n\t\t)\n\t)\n)",
+					/* UrlEnc */	"_type=video&a=(width=100,height=200,controls=controls)&c=@((_type=source,a=(src=foo.mp4,type=video/mp4)),(_type=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en)))",
+					/* UrlEncT */	"t=video&a=(width=100,height=200,controls=controls)&c=@((t=source,a=(src=foo.mp4,type=video/mp4)),(t=track,a=(src=subtitles_en.vtt,kind=subtitles,srclang=en)))",
+					/* UrlEncR */	"_type=video\n&a=(\n\twidth=100,\n\theight=200,\n\tcontrols=controls\n)\n&c=@(\n\t(\n\t\t_type=source,\n\t\ta=(\n\t\t\tsrc=foo.mp4,\n\t\t\ttype=video/mp4\n\t\t)\n\t),\n\t(\n\t\t_type=track,\n\t\ta=(\n\t\t\tsrc=subtitles_en.vtt,\n\t\t\tkind=subtitles,\n\t\t\tsrclang=en\n\t\t)\n\t)\n)",
+					/* MsgPack */	"83A55F74797065A5766964656FA16183A5776964746864A6686569676874D100C8A8636F6E74726F6C73A8636F6E74726F6C73A1639282A55F74797065A6736F75726365A16182A3737263A7666F6F2E6D7034A474797065A9766964656F2F6D703482A55F74797065A5747261636BA16183A3737263B07375627469746C65735F656E2E767474A46B696E64A97375627469746C6573A77372636C616E67A2656E",
+					/* MsgPackT */	"83A174A5766964656FA16183A5776964746864A6686569676874D100C8A8636F6E74726F6C73A8636F6E74726F6C73A1639282A174A6736F75726365A16182A3737263A7666F6F2E6D7034A474797065A9766964656F2F6D703482A174A5747261636BA16183A3737263B07375627469746C65735F656E2E767474A46B696E64A97375627469746C6573A77372636C616E67A2656E",
+					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:_type>video</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:width>100</jp:width>\n<jp:height>200</jp:height>\n<jp:controls>controls</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>source</jp:_type>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp4</jp:src>\n<jp:type>video/mp4</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:_type>track</jp:_type>\n<jp:a rdf:parseType='Resour [...]
+					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:t>video</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:width>100</jp:width>\n<jp:height>200</jp:height>\n<jp:controls>controls</jp:controls>\n</jp:a>\n<jp:c>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>source</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>foo.mp4</jp:src>\n<jp:type>video/mp4</jp:type>\n</jp:a>\n</rdf:li>\n<rdf:li rdf:parseType='Resource'>\n<jp:t>track</jp:t>\n<jp:a rdf:parseType='Resource'>\n<jp:src>subtitles [...]
+					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:_type>video</jp:_type>\n    <jp:a rdf:parseType='Resource'>\n      <jp:width>100</jp:width>\n      <jp:height>200</jp:height>\n      <jp:controls>controls</jp:controls>\n    </jp:a>\n    <jp:c>\n      <rdf:Seq>\n        <rdf:li rdf:parseType='Resource'>\n          <jp:_type>source</jp:_type>\n          <jp:a rdf:parseType='Resource'>\n            <jp:src>foo.mp4</jp:src>\n            <jp:type>video/mp4</jp:type>\n          </jp: [...]
 				)
 				{
 					@Override
diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java
index 4d005d6..1fe94ca 100644
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/httppart/HttpPartSchemaTest_Path.java
@@ -369,7 +369,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, B03a.class).build();
 		s.validateInput("12");
 		s.validateInput("123");
-		s.validateInput(null);
+		try {
+			s.validateInput(null);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("No value specified.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateInput("1");
 			fail();
@@ -476,7 +481,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, B04a.class).build();
 		s.validateInput("X");
 		s.validateInput("Y");
-		s.validateInput(null);
+		try {
+			s.validateInput(null);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("No value specified.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateInput("Z");
 			fail();
@@ -493,7 +503,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, B04b.class).build();
 		s.validateInput("X");
 		s.validateInput("Y");
-		s.validateInput(null);
+		try {
+			s.validateInput(null);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("No value specified.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateInput("Z");
 			fail();
@@ -510,7 +525,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, B04c.class).build();
 		s.validateInput("X");
 		s.validateInput("Y");
-		s.validateInput(null);
+		try {
+			s.validateInput(null);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("No value specified.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateInput("Z");
 			fail();
@@ -580,7 +600,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, C01a.class).build();
 		s.validateOutput(10, BeanContext.DEFAULT);
 		s.validateOutput(100, BeanContext.DEFAULT);
-		s.validateOutput(null, BeanContext.DEFAULT);
+		try {
+			s.validateOutput(null, BeanContext.DEFAULT);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("Required value not provided.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateOutput(9, BeanContext.DEFAULT);
 			fail();
@@ -682,7 +707,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, C02a.class).build();
 		s.validateOutput(11, BeanContext.DEFAULT);
 		s.validateOutput(99, BeanContext.DEFAULT);
-		s.validateOutput(null, BeanContext.DEFAULT);
+		try {
+			s.validateOutput(null, BeanContext.DEFAULT);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("Required value not provided.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateOutput(10, BeanContext.DEFAULT);
 			fail();
@@ -784,7 +814,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, C03a.class).build();
 		s.validateOutput(10.1f, BeanContext.DEFAULT);
 		s.validateOutput(100.1f, BeanContext.DEFAULT);
-		s.validateOutput(null, BeanContext.DEFAULT);
+		try {
+			s.validateOutput(null, BeanContext.DEFAULT);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("Required value not provided.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateOutput(10f, BeanContext.DEFAULT);
 			fail();
@@ -886,7 +921,12 @@ public class HttpPartSchemaTest_Path {
 		HttpPartSchema s = HttpPartSchema.create().apply(Path.class, C04a.class).build();
 		s.validateOutput(10.2f, BeanContext.DEFAULT);
 		s.validateOutput(100f, BeanContext.DEFAULT);
-		s.validateOutput(null, BeanContext.DEFAULT);
+		try {
+			s.validateOutput(null, BeanContext.DEFAULT);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("Required value not provided.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateOutput(10.1f, BeanContext.DEFAULT);
 			fail();
@@ -991,7 +1031,12 @@ public class HttpPartSchemaTest_Path {
 		s.validateOutput(20, BeanContext.DEFAULT);
 		s.validateOutput(10f, BeanContext.DEFAULT);
 		s.validateOutput(20f, BeanContext.DEFAULT);
-		s.validateOutput(null, BeanContext.DEFAULT);
+		try {
+			s.validateOutput(null, BeanContext.DEFAULT);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("Required value not provided.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateOutput(11, BeanContext.DEFAULT);
 			fail();
@@ -1078,7 +1123,12 @@ public class HttpPartSchemaTest_Path {
 		s.validateOutput(0, BeanContext.DEFAULT);
 		s.validateOutput(10.1f, BeanContext.DEFAULT);
 		s.validateOutput(20.2f, BeanContext.DEFAULT);
-		s.validateOutput(null, BeanContext.DEFAULT);
+		try {
+			s.validateOutput(null, BeanContext.DEFAULT);
+			fail();
+		} catch (SchemaValidationException e) {
+			assertEquals("Required value not provided.", e.getLocalizedMessage());
+		}
 		try {
 			s.validateOutput(10.2f, BeanContext.DEFAULT);
 			fail();
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Audio.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Audio.java
index 71b120a..1309481 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Audio.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Audio.java
@@ -43,7 +43,7 @@ public class Audio extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Audio autoplay(Object autoplay) {
-		attr("autoplay", autoplay);
+		attr("autoplay", deminimize(autoplay, "autoplay"));
 		return this;
 	}
 
@@ -60,7 +60,7 @@ public class Audio extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Audio controls(Object controls) {
-		attr("controls", controls);
+		attr("controls", deminimize(controls, "controls"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Button.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Button.java
index 22052d0..28cc704 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Button.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Button.java
@@ -58,7 +58,7 @@ public class Button extends HtmlElementMixed {
 	 * @return This object (for method chaining).
 	 */
 	public final Button disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Fieldset.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Fieldset.java
index dbe8878..0c5bf89 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Fieldset.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Fieldset.java
@@ -38,7 +38,7 @@ public class Fieldset extends HtmlElementMixed {
 	 * @return This object (for method chaining).
 	 */
 	public final Fieldset disabled(Boolean disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
index c1aad59..c1b8803 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
@@ -80,9 +80,13 @@ public abstract class HtmlElement {
 	public HtmlElement attr(String key, Object val) {
 		if (this.attrs == null)
 			this.attrs = new LinkedHashMap<>();
-		if ("url".equals(key) || "href".equals(key) || key.endsWith("action"))
-			val = StringUtils.toURI(val);
-		this.attrs.put(key, val);
+		if (val == null)
+			this.attrs.remove(key);
+		else {
+			if ("url".equals(key) || "href".equals(key) || key.endsWith("action"))
+				val = StringUtils.toURI(val);
+			this.attrs.put(key, val);
+		}
 		return this;
 	}
 
@@ -190,7 +194,7 @@ public abstract class HtmlElement {
 	 * @return This object (for method chaining).
 	 */
 	public HtmlElement hidden(Object hidden) {
-		attr("hidden", hidden);
+		attr("hidden", deminimize(hidden, "hidden"));
 		return this;
 	}
 
@@ -841,6 +845,22 @@ public abstract class HtmlElement {
 		return this;
 	}
 
+	/**
+	 * If the specified attribute is a boolean, it gets converted to the attribute name if <jk>true</jk> or <jk>null</jk> if <jk>false</jk>.
+	 *
+	 * @param value The attribute value.
+	 * @param attr The attribute name.
+	 * @return The deminimized value, or the same value if the value wasn't a boolean.
+	 */
+	protected Object deminimize(Object value, String attr) {
+		if (value instanceof Boolean) {
+			if ((Boolean)value)
+				return attr;
+			return null;
+		}
+		return value;
+	}
+
 	@Override /* Object */
 	public String toString() {
 		return HtmlSerializer.DEFAULT_SQ.toString(this);
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Img.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Img.java
index 53d4377..daf068f 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Img.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Img.java
@@ -88,7 +88,7 @@ public class Img extends HtmlElementVoid {
 	 * @return This object (for method chaining).
 	 */
 	public final Img ismap(Object ismap) {
-		attr("ismap", ismap);
+		attr("ismap", deminimize(ismap, "ismap"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Input.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Input.java
index 4789a4f..c786905 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Input.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Input.java
@@ -96,7 +96,7 @@ public class Input extends HtmlElementVoid {
 	 * @return This object (for method chaining).
 	 */
 	public final Input checked(Object checked) {
-		attr("checked", checked);
+		attr("checked", deminimize(checked, "checked"));
 		return this;
 	}
 
@@ -126,7 +126,7 @@ public class Input extends HtmlElementVoid {
 	 * @return This object (for method chaining).
 	 */
 	public final Input disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
@@ -332,7 +332,7 @@ public class Input extends HtmlElementVoid {
 	 * @return This object (for method chaining).
 	 */
 	public final Input multiple(Object multiple) {
-		attr("multiple", multiple);
+		attr("multiple", deminimize(multiple, "multiple"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Keygen.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Keygen.java
index 0c39b6a..d5a3236 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Keygen.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Keygen.java
@@ -68,7 +68,7 @@ public class Keygen extends HtmlElementVoid {
 	 * @return This object (for method chaining).
 	 */
 	public final Keygen disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Ol.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Ol.java
index 52d9224..a509a9a 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Ol.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Ol.java
@@ -39,7 +39,7 @@ public class Ol extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Ol reversed(Object reversed) {
-		attr("reversed", reversed);
+		attr("reversed", deminimize(reversed, "reversed"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Optgroup.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Optgroup.java
index b753e84..fefd24b 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Optgroup.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Optgroup.java
@@ -38,7 +38,7 @@ public class Optgroup extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Optgroup disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Option.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Option.java
index 808eeb6..ac38894 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Option.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Option.java
@@ -38,7 +38,7 @@ public class Option extends HtmlElementText {
 	 * @return This object (for method chaining).
 	 */
 	public final Option disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
@@ -68,7 +68,7 @@ public class Option extends HtmlElementText {
 	 * @return This object (for method chaining).
 	 */
 	public final Option selected(Object selected) {
-		attr("selected", selected);
+		attr("selected", deminimize(selected, "selected"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Script.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Script.java
index b88f2b6..cd1f83a 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Script.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Script.java
@@ -42,7 +42,7 @@ public class Script extends HtmlElementRawText {
 	 * @return This object (for method chaining).
 	 */
 	public final Script async(Object async) {
-		attr("async", async);
+		attr("async", deminimize(async, "async"));
 		return this;
 	}
 
@@ -87,7 +87,7 @@ public class Script extends HtmlElementRawText {
 	 * @return This object (for method chaining).
 	 */
 	public final Script defer(Object defer) {
-		attr("defer", defer);
+		attr("defer", deminimize(defer, "defer"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java
index 74642ec..7580545 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Select.java
@@ -55,7 +55,7 @@ public class Select extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Select disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
@@ -85,7 +85,7 @@ public class Select extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Select multiple(Object multiple) {
-		attr("multiple", multiple);
+		attr("multiple", deminimize(multiple, "multiple"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Textarea.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Textarea.java
index 93333c8..088b2fb 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Textarea.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Textarea.java
@@ -98,7 +98,7 @@ public class Textarea extends HtmlElementRawText {
 	 * @return This object (for method chaining).
 	 */
 	public final Textarea disabled(Object disabled) {
-		attr("disabled", disabled);
+		attr("disabled", deminimize(disabled, "disabled"));
 		return this;
 	}
 
diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Video.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Video.java
index 7cccfb2..1b30c3e 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Video.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/html5/Video.java
@@ -43,7 +43,7 @@ public class Video extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Video autoplay(Object autoplay) {
-		attr("autoplay", autoplay);
+		attr("autoplay", deminimize(autoplay, "autoplay"));
 		return this;
 	}
 
@@ -60,7 +60,7 @@ public class Video extends HtmlElementContainer {
 	 * @return This object (for method chaining).
 	 */
 	public final Video controls(Object controls) {
-		attr("controls", controls);
+		attr("controls", deminimize(controls, "controls"));
 		return this;
 	}
 
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 7539150..73154c8 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -341,7 +341,7 @@
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Swagger.Operations'>Operations</a></p>
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Swagger.Parameters'>Parameters</a></p>
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Swagger.ParameterExamples'>Parameter Examples</a></p>
-			<li><p class='todo'><a class='doclink' href='#juneau-rest-server.Swagger.Responses'>Responses</a></p>
+			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Swagger.Responses'>Responses</a></p>
 			<li><p class='todo'><a class='doclink' href='#juneau-rest-server.Swagger.ResponseExamples'>Response Examples</a></p>
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Swagger.Models'>Models</a></p>
 			<li><p class='new'><a class='doclink' href='#juneau-rest-server.Swagger.Stylesheet'>SwaggerUI.css</a></p>
@@ -19190,7 +19190,7 @@
 		}
 	)
 </p>
-<h5 class='section'>See also:</h5>
+<h5 class='section'>See Also:</h5>
 <ul>
 	<li class='ja'>{@link org.apache.juneau.annotation.Example}
 	<li class='jc'>{@link org.apache.juneau.BeanContext}
@@ -19207,15 +19207,47 @@
 
 <!-- ==================================================================================================== -->
 
-<h4 class='topic todo' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Responses' id='juneau-rest-server.Swagger.Responses'>7.27.7 - Responses</a></h4>
+<h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Responses' id='juneau-rest-server.Swagger.Responses'>7.27.7 - Responses</a></h4>
 <div class='topic'><!-- START: 7.27.7 - juneau-rest-server.Swagger.Responses -->
 <p>
-	TODO
+	Under the input parameters are listed the possible responses for the resource:
 </p>
 <img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Operations.3.png'> 
-<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.1.png'> 
-<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.2.png'> 
-<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.3.png'>
+<p>
+	The <code>200</code> response is determined by the return type on the method, in this case a collection of <code>Pet</code> objects:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(
+		name=<jsf>GET</jsf>,
+		path=<js>"/pet"</js>,
+		summary=<js>"All pets in the store"</js>,
+		...
+	)
+	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
+		<jk>return</jk> <jf>store</jf>.getPets();
+	}
+</p>
+<p>
+	Note that additional responses can be specified by throwing exceptions annotated with the {@link org.apache.juneau.http.annotation.Response @Response} annotation such
+	as this one:
+</p>
+<p class='bpcode w800'>
+	<ja>@Response</ja>(code=406, description=<js>"Not Acceptable"</js>)
+	<jk>public class</jk> NotAcceptable <jk>extends</jk> RestException {...}
+</p>
+<p>
+	Like input parameters, the Swagger for responses can be define in multiple locations such as:
+</p>
+<ul>
+	<li>{@link org.apache.juneau.http.annotation.Response @Response} annotated classes, methods, and parameters.
+	<li>{@link org.apache.juneau.rest.annotation.RestResource#swagger() @RestResource(swagger)} / {@link org.apache.juneau.rest.annotation.RestMethod#swagger() @RestMethod(swagger)} annotations.
+</ul>
+<h5 class='section'>See Also:</h5>
+<ul>
+	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.Response}
+	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.ResponseHeader}
+	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.ResponseStatus}
+</ul>
 </div><!-- END: 7.27.7 - juneau-rest-server.Swagger.Responses -->
 
 <!-- ==================================================================================================== -->
@@ -19225,6 +19257,10 @@
 <p>
 	TODO
 </p>
+
+<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.1.png'> 
+<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.2.png'> 
+<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.3.png'>
 </div><!-- END: 7.27.8 - juneau-rest-server.Swagger.ResponseExamples -->
 
 <!-- ==================================================================================================== -->
@@ -33787,7 +33823,7 @@
 		The behavior of the default values for {@link org.apache.juneau.rest.annotation.RestMethod#name()} and {@link org.apache.juneau.rest.annotation.RestMethod#path()}
 		have changed.
 		<br>If not specified, the values are inferred from the Java method name.
-		<br>See also: {@doc juneau-rest-server.RestMethod}
+		<br>See Also: {@doc juneau-rest-server.RestMethod}
 	<li>
 		<code>RedirectToServletRoot</code> class has been renamed to {@link org.apache.juneau.rest.helper.SeeOtherRoot}.
 	<li>
diff --git a/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html b/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
index 351311f..fb2c6a2 100644
--- a/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
+++ b/juneau-doc/src/main/resources/ReleaseNotes/7.2.0.html
@@ -240,6 +240,9 @@
 	<li>
 		Fixed bug where Swagger {@link oaj.dto.swagger.SchemaInfo#required(Object...)} was defined as a boolean
 		instead of a list of strings.
+	<li>
+		Boolean attributes are now handled correctly for HTML5.
+		<br>For example, calling <code><jk>new</jk> Select().disabled(<jk>true</jk>)</code> will produce <code>&lt;select disabled='disabled'&gt;</code>
 </ul>
 
 <h5 class='topic w800'>juneau-rest-server</h5>
@@ -445,7 +448,7 @@
 		The behavior of the default values for {@link oajr.annotation.RestMethod#name()} and {@link oajr.annotation.RestMethod#path()}
 		have changed.
 		<br>If not specified, the values are inferred from the Java method name.
-		<br>See also: {@doc juneau-rest-server.RestMethod}
+		<br>See Also: {@doc juneau-rest-server.RestMethod}
 	<li>
 		<code>RedirectToServletRoot</code> class has been renamed to {@link oajr.helper.SeeOtherRoot}.
 	<li>
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/06.ParameterExamples.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/06.ParameterExamples.html
index 8b95d59..4d4ef82 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/06.ParameterExamples.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/06.ParameterExamples.html
@@ -227,7 +227,7 @@
 		}
 	)
 </p>
-<h5 class='section'>See also:</h5>
+<h5 class='section'>See Also:</h5>
 <ul>
 	<li class='ja'>{@link oaj.annotation.Example}
 	<li class='jc'>{@link oaj.BeanContext}
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/07.Responses.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/07.Responses.html
index 50c9db2..0b95178 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/07.Responses.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/07.Responses.html
@@ -13,12 +13,46 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} Responses
+{new} Responses
 
 <p>
-	TODO
+	Under the input parameters are listed the possible responses for the resource:
 </p>
 <img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Operations.3.png'> 
-<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.1.png'> 
-<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.2.png'> 
-<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.3.png'> 
+<p>
+	The <code>200</code> response is determined by the return type on the method, in this case a collection of <code>Pet</code> objects:
+</p>
+<p class='bpcode w800'>
+	<ja>@RestMethod</ja>(
+		name=<jsf>GET</jsf>,
+		path=<js>"/pet"</js>,
+		summary=<js>"All pets in the store"</js>,
+		...
+	)
+	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
+		<jk>return</jk> <jf>store</jf>.getPets();
+	}
+</p>
+<p>
+	Note that additional responses can be specified by throwing exceptions annotated with the {@link oaj.http.annotation.Response @Response} annotation such
+	as this one:
+</p>
+<p class='bpcode w800'>
+	<ja>@Response</ja>(code=406, description=<js>"Not Acceptable"</js>)
+	<jk>public class</jk> NotAcceptable <jk>extends</jk> RestException {...}
+</p>
+<p>
+	Like input parameters, the Swagger for responses can be define in multiple locations such as:
+</p>
+<ul>
+	<li>{@link oaj.http.annotation.Response @Response} annotated classes, methods, and parameters.
+	<li>{@link oajr.annotation.RestResource#swagger() @RestResource(swagger)} / {@link oajr.annotation.RestMethod#swagger() @RestMethod(swagger)} annotations.
+</ul>
+<h5 class='section'>See Also:</h5>
+<ul>
+	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.Response}
+	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.ResponseHeader}
+	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.ResponseStatus}
+</ul>
+
+
diff --git a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/08.ResponseExamples.html b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/08.ResponseExamples.html
index 6dae56b..6f2ab31 100644
--- a/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/08.ResponseExamples.html
+++ b/juneau-doc/src/main/resources/Topics/07.juneau-rest-server/27.Swagger/08.ResponseExamples.html
@@ -13,8 +13,163 @@
  ***************************************************************************************************************************/
  -->
 
-{todo} Response Examples
+{new} Response Examples
 
 <p>
-	TODO
+	The <code>model</code> select box in the responses can be expanded to show examples:
 </p>
+<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.1.png'> 
+<p class='w800'>
+	The {@link oaj.http.annotation.Response#example @Response(annotation)} annotation can be used on either your <ja>@RestMethod</ja>-annotated
+	method or return class to define the example of the body.
+</p>	
+<p class='bpcode w800'>
+	<jc>// A JSON representation of a Pet object.</jc>
+	<ja>@Response</ja>(
+		example=<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>
+	)
+</p>
+<p>
+	This is a Simple JSON representation of the body that is converted to a POJO and then serialized to all the registered serializers on the REST method to produce examples for all
+	supported language types.
+	These values are then used to automatically populate the {@link #examples} field.
+</p>
+<h5 class='section'>Example:</h5>
+<p>
+There are several other options for defining this example:
+<ul class='spaced-list'>
+	<li>
+		Defining an <js>"x-example"</js> field in the inherited Swagger JSON response object (classpath file or <code><ja>@ResourceSwagger</ja>(value)</code>/<code><ja>@MethodSwagger</ja>(value)</code>).
+	<li>
+		Defining an <js>"x-example"</js> field in the Swagger Schema Object for the response object (including referenced <js>"$ref"</js> schemas).
+	<li>
+		Allowing Juneau to auto-generate a code example.
+</ul>
+<p>
+The latter is important because Juneau also supports auto-generation of JSON-Schema from POJO classes using {@link JsonSchemaSerializer} which has several of it's own
+options for auto-detecting and calculation POJO examples.
+<p>
+In particular, examples can be defined via static methods, fields, and annotations on the classes themselves.
+<p class='bcode w800'>
+	<jc>// Annotation on class.</jc>
+	<ja>@Example</ja>(<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>)
+	<jk>public class</jk> PetCreate {
+		...
+	}
+</p>
+<p class='bcode w800'>
+	<jc>// Annotation on static method.</jc>
+	<jk>public class</jk> PetCreate {
+		<ja>@Example</ja>
+		<jk>public static</jk> PetCreate <jsm>sample</jsm>() {
+			<jk>return new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
+		}
+	}
+</p>
+<p class='bcode w800'>
+	<jc>// Static method with specific name 'example'.</jc>
+	<jk>public class</jk> PetCreate {
+		<jk>public static</jk> PetCreate <jsm>example</jsm>() {
+			<jk>return new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
+		}
+	}
+</p>
+<p class='bcode w800'>
+	<jc>// Static field.</jc>
+	<jk>public class</jk> PetCreate {
+		<ja>@Example</ja>
+		<jk>public static</jk> PetCreate <jsf>EXAMPLE</jsf> = <jk>new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
+	}
+</p>
+<p>
+Examples can also be specified via generic properties as well using the {@link BeanContext#BEAN_examples} property at either the class or method level.
+<p class='bcode w800'>
+	<jc>// Examples defined at class level.</jc>
+	<ja>@RestResource</ja>(
+		properties={
+			<ja>@Property</ja>(
+				name=<jsf>BEAN_examples</jsf>,
+				value=<js>"{'org.apache.juneau.examples.rest.petstore.PetCreate': {name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}}"</js>
+			)
+		}
+	)
+</p>
+<h5 class='section'>Used for:</h5>
+<ul class='spaced-list'>
+	<li>
+		Server-side generated Swagger documentation.
+</ul>
+<h5 class='section'>See also:</h5>
+<ul>
+	<li class='ja'>{@link Example}
+	<li class='jc'>{@link BeanContext}
+	<ul>
+		<li class='jf'>{@link BeanContext#BEAN_examples BEAN_examples}
+	</ul>
+	<li class='jc'>{@link JsonSchemaSerializer}
+	<ul>
+		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
+		<li class='jf'>{@link JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
+	</ul>
+</ul>
+<h5 class='section'>Notes:</h5>
+<ul class='spaced-list'>
+	<li>
+		The format is any {@doc juneau-marshall.JsonDetails.SimplifiedJson} if the object can be converted to a POJO using {@link JsonParser#DEFAULT} or a simple String if the object
+		has a schema associated with it meancan be converted from a String.
+		<br>Multiple lines are concatenated with newlines.
+	<li>
+		The format of this object can also be a simple String if the body has a schema associated with it, meaning it's meant to be treated as an HTTP part.
+	<li>
+		Supports {@doc DefaultRestSvlVariables}
+		(e.g. <js>"$L{my.localized.variable}"</js>).
+</ul>
+
+Serialized examples of the body of a response.
+<p>
+This is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object whose keys are media types and values are string representations of that value.
+<p>
+In general you won't need to populate this value directly since it will automatically be calculated based on the value provided in the {@link #example()} field.
+<br>However, this field allows you to override the behavior and show examples for only specified media types or different examples for different media types.
+<p class='bcode w800'>
+	<jc>// A JSON representation of a PetCreate object.</jc>
+	<ja>@Response</ja>(
+		examples={
+			<js>"'application/json':'{name:\\'Doggie\\',species:\\'Dog\\'}',"</js>,
+			<js>"'text/uon':'(name:Doggie,species=Dog)'"</js>
+		}
+	)
+</p>
+<h5 class='section'>Used for:</h5>
+<ul class='spaced-list'>
+	<li>
+		Server-side generated Swagger documentation.
+</ul>
+<h5 class='section'>Notes:</h5>
+<ul class='spaced-list'>
+	<li>
+		The format is a {@doc juneau-marshall.JsonDetails.SimplifiedJson} object with string keys (media type) and string values (example for that media type) .
+	<li>
+		The leading/trailing <code>{ }</code> characters are optional.
+	<li>
+		Multiple lines are concatenated with newlines so that you can format the value to be readable:
+	<li>
+		Supports {@doc DefaultRestSvlVariables}
+		(e.g. <js>"$L{my.localized.variable}"</js>).
+	<li>
+		Resolution of variables is delayed until request time and occurs before parsing.
+		<br>This allows you to, for example, pull in a JSON construct from a properties file based on the locale of the HTTP request.
+</ul>
+
+
+
+
+
+
+
+
+
+
+
+<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.2.png'> 
+<img class='bordered' style='width:900px' src='doc-files/juneau-rest-server.Swagger.Responses.3.png'> 


Mime
View raw message