You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/02/15 20:50:44 UTC
[5/8] incubator-juneau git commit: Modification to UON spec. Remove
bean subtype support.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
index 3366856..84f240b 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/urlencoding/UrlEncodingSerializerTest.java
@@ -17,13 +17,13 @@ import static org.junit.Assert.*;
import java.util.*;
import org.apache.juneau.*;
+import org.apache.juneau.json.JsonSerializer;
import org.junit.*;
@SuppressWarnings("javadoc")
public class UrlEncodingSerializerTest {
static UrlEncodingSerializer s = UrlEncodingSerializer.DEFAULT;
- static UrlEncodingSerializer ss = UrlEncodingSerializer.DEFAULT_SIMPLE;
static UrlEncodingSerializer sr = UrlEncodingSerializer.DEFAULT_READABLE;
@@ -43,253 +43,214 @@ public class UrlEncodingSerializerTest {
// 2nd level
t = new ObjectMap("{a:'a'}");
assertEquals("a=a", s.serialize(t));
- assertEquals("a=a", ss.serialize(t));
assertEquals("a=a", sr.serialize(t));
// Simple map
// Top level
t = new ObjectMap("{a:'b',c:123,d:false,e:true,f:null}");
- assertEquals("a=b&c=$n(123)&d=$b(false)&e=$b(true)&f=%00", s.serialize(t));
- assertEquals("a=b&c=123&d=false&e=true&f=%00", ss.serialize(t));
- assertEquals("a=b\n&c=$n(123)\n&d=$b(false)\n&e=$b(true)\n&f=%00", sr.serialize(t));
+ assertEquals("a=b&c=123&d=false&e=true&f=null", s.serialize(t));
+ assertEquals("a=b\n&c=123\n&d=false\n&e=true\n&f=null", sr.serialize(t));
// 2nd level
t = new ObjectMap("{a:{a:'b',c:123,d:false,e:true,f:null}}");
- assertEquals("a=$o(a=b,c=$n(123),d=$b(false),e=$b(true),f=%00)", s.serialize(t));
- assertEquals("a=(a=b,c=123,d=false,e=true,f=%00)", ss.serialize(t));
- assertEquals("a=$o(\n\ta=b,\n\tc=$n(123),\n\td=$b(false),\n\te=$b(true),\n\tf=%00\n)", sr.serialize(t));
+ assertEquals("a=(a=b,c=123,d=false,e=true,f=null)", s.serialize(t));
+ assertEquals("a=(\n\ta=b,\n\tc=123,\n\td=false,\n\te=true,\n\tf=null\n)", sr.serialize(t));
// Simple map with primitives as literals
t = new ObjectMap("{a:'b',c:'123',d:'false',e:'true',f:'null'}");
- assertEquals("a=b&c=123&d=false&e=true&f=null", s.serialize(t));
- assertEquals("a=b&c=123&d=false&e=true&f=null", ss.serialize(t));
- assertEquals("a=b\n&c=123\n&d=false\n&e=true\n&f=null", sr.serialize(t));
+ assertEquals("a=b&c='123'&d='false'&e='true'&f='null'", s.serialize(t));
+ assertEquals("a=b\n&c='123'\n&d='false'\n&e='true'\n&f='null'", sr.serialize(t));
// null
// Note that serializeParams is always encoded.
// Top level
t = null;
- assertEquals("_value=%00", s.serialize(t));
- assertEquals("_value=%00", ss.serialize(t));
- assertEquals("_value=%00", sr.serialize(t));
+ assertEquals("_value=null", s.serialize(t));
+ assertEquals("_value=null", sr.serialize(t));
// 2nd level
t = new ObjectMap("{null:null}");
- assertEquals("%00=%00", s.serialize(t));
- assertEquals("%00=%00", ss.serialize(t));
- assertEquals("%00=%00", sr.serialize(t));
+ assertEquals("null=null", s.serialize(t));
+ assertEquals("null=null", sr.serialize(t));
// 3rd level
t = new ObjectMap("{null:{null:null}}");
- assertEquals("%00=$o(%00=%00)", s.serialize(t));
- assertEquals("%00=(%00=%00)", ss.serialize(t));
- assertEquals("%00=$o(\n\t%00=%00\n)", sr.serialize(t));
+ assertEquals("null=(null=null)", s.serialize(t));
+ assertEquals("null=(\n\tnull=null\n)", sr.serialize(t));
// Empty array
// Top level
t = new String[0];
- assertEquals("_value=$a()", s.serialize(t));
- assertEquals("_value=()", ss.serialize(t));
- assertEquals("_value=$a()", sr.serialize(t));
+ assertEquals("_value=@()", s.serialize(t));
+ assertEquals("_value=@()", sr.serialize(t));
// 2nd level in map
t = new ObjectMap("{x:[]}");
- assertEquals("x=$a()", s.serialize(t));
- assertEquals("x=()", ss.serialize(t));
- assertEquals("x=$a()", sr.serialize(t));
+ assertEquals("x=@()", s.serialize(t));
+ assertEquals("x=@()", sr.serialize(t));
// Empty 2 dimensional array
t = new String[1][0];
- assertEquals("_value=$a($a())", s.serialize(t));
- assertEquals("_value=(())", ss.serialize(t));
- assertEquals("_value=$a(\n\t$a()\n)", sr.serialize(t));
+ assertEquals("_value=@(@())", s.serialize(t));
+ assertEquals("_value=@(\n\t@()\n)", sr.serialize(t));
// Array containing empty string
// Top level
t = new String[]{""};
- assertEquals("_value=$a(())", s.serialize(t));
- assertEquals("_value=(())", ss.serialize(t));
- assertEquals("_value=$a(\n\t()\n)", sr.serialize(t));
+ assertEquals("_value=@('')", s.serialize(t));
+ assertEquals("_value=@(\n\t''\n)", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:['']}");
- assertEquals("x=$a(())", s.serialize(t));
- assertEquals("x=(())", ss.serialize(t));
- assertEquals("x=$a(\n\t()\n)", sr.serialize(t));
+ assertEquals("x=@('')", s.serialize(t));
+ assertEquals("x=@(\n\t''\n)", sr.serialize(t));
// Array containing 3 empty strings
t = new String[]{"","",""};
- assertEquals("_value=$a(,,)", s.serialize(t));
- assertEquals("_value=(,,)", ss.serialize(t));
- assertEquals("_value=$a(\n\t(),\n\t(),\n\t()\n)", sr.serialize(t));
+ assertEquals("_value=@('','','')", s.serialize(t));
+ assertEquals("_value=@(\n\t'',\n\t'',\n\t''\n)", sr.serialize(t));
// String containing \u0000
// Top level
t = "\u0000";
- assertEquals("_value=(%00)", s.serialize(t));
- assertEquals("_value=(%00)", ss.serialize(t));
- assertEquals("_value=(%00)", sr.serialize(t));
+ assertEquals("_value=%00", s.serialize(t));
+ assertEquals("_value=%00", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'\u0000':'\u0000'}");
- assertEquals("(%00)=(%00)", s.serialize(t));
- assertEquals("(%00)=(%00)", ss.serialize(t));
- assertEquals("(%00)=(%00)", sr.serialize(t));
+ assertEquals("%00=%00", s.serialize(t));
+ assertEquals("%00=%00", sr.serialize(t));
// Boolean
// Top level
t = false;
- assertEquals("_value=$b(false)", s.serialize(t));
- assertEquals("_value=false", ss.serialize(t));
- assertEquals("_value=$b(false)", sr.serialize(t));
+ assertEquals("_value=false", s.serialize(t));
+ assertEquals("_value=false", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:false}");
- assertEquals("x=$b(false)", s.serialize(t));
- assertEquals("x=false", ss.serialize(t));
- assertEquals("x=$b(false)", sr.serialize(t));
+ assertEquals("x=false", s.serialize(t));
+ assertEquals("x=false", sr.serialize(t));
// Number
// Top level
t = 123;
- assertEquals("_value=$n(123)", s.serialize(t));
- assertEquals("_value=123", ss.serialize(t));
- assertEquals("_value=$n(123)", sr.serialize(t));
+ assertEquals("_value=123", s.serialize(t));
+ assertEquals("_value=123", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:123}");
- assertEquals("x=$n(123)", s.serialize(t));
- assertEquals("x=123", ss.serialize(t));
- assertEquals("x=$n(123)", sr.serialize(t));
+ assertEquals("x=123", s.serialize(t));
+ assertEquals("x=123", sr.serialize(t));
// Unencoded chars
// Top level
t = "x;/?:@-_.!*'";
- assertEquals("_value=x;/?:@-_.!*'", s.serialize(t));
- assertEquals("_value=x;/?:@-_.!*'", ss.serialize(t));
- assertEquals("_value=x;/?:@-_.!*'", sr.serialize(t));
+ assertEquals("_value=x;/?:@-_.!*~'", s.serialize(t));
+ assertEquals("_value=x;/?:@-_.!*~'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{x:'x;/?:@-_.!*\\''}");
- assertEquals("x=x;/?:@-_.!*'", s.serialize(t));
- assertEquals("x=x;/?:@-_.!*'", ss.serialize(t));
- assertEquals("x=x;/?:@-_.!*'", sr.serialize(t));
+ assertEquals("x=x;/?:@-_.!*~'", s.serialize(t));
+ assertEquals("x=x;/?:@-_.!*~'", sr.serialize(t));
// Encoded chars
// Top level
t = "x{}|\\^[]`<>#%\"&+";
assertEquals("_value=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
- assertEquals("_value=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", ss.serialize(t));
assertEquals("_value=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'x{}|\\\\^[]`<>#%\"&+':'x{}|\\\\^[]`<>#%\"&+'}");
assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", s.serialize(t));
- assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", ss.serialize(t));
assertEquals("x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B=x%7B%7D%7C%5C%5E%5B%5D%60%3C%3E%23%25%22%26%2B", sr.serialize(t));
// Escaped chars
// Top level
t = "x$,()~";
- assertEquals("_value=x$,()~", s.serialize(t));
- assertEquals("_value=x$,()~", ss.serialize(t));
- assertEquals("_value=x$,()~", sr.serialize(t));
+ assertEquals("_value='x$,()~~'", s.serialize(t));
+ assertEquals("_value='x$,()~~'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'x$,()~':'x$,()~'}");
- assertEquals("x$,()~=x$,()~", s.serialize(t));
- assertEquals("x$,()~=x$,()~", ss.serialize(t));
- assertEquals("x$,()~=x$,()~", sr.serialize(t));
+ assertEquals("'x$,()~~'='x$,()~~'", s.serialize(t));
+ assertEquals("'x$,()~~'='x$,()~~'", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'x$,()~':{'x$,()~':'x$,()~'}}");
- assertEquals("x$,()~=$o(x$~,~(~)~~=x$~,~(~)~~)", s.serialize(t));
- assertEquals("x$,()~=(x$~,~(~)~~=x$~,~(~)~~)", ss.serialize(t));
- assertEquals("x$,()~=$o(\n\tx$~,~(~)~~=x$~,~(~)~~\n)", sr.serialize(t));
+ assertEquals("'x$,()~~'=('x$,()~~'='x$,()~~')", s.serialize(t));
+ assertEquals("'x$,()~~'=(\n\t'x$,()~~'='x$,()~~'\n)", sr.serialize(t));
// Equals sign
// Gets encoded at top level, and encoded+escaped at 2nd level.
// Top level
t = "x=";
- assertEquals("_value=x=", s.serialize(t));
- assertEquals("_value=x=", ss.serialize(t));
- assertEquals("_value=x=", sr.serialize(t));
+ assertEquals("_value='x='", s.serialize(t));
+ assertEquals("_value='x='", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'x=':'x='}");
- assertEquals("x%3D=x=", s.serialize(t));
- assertEquals("x%3D=x=", ss.serialize(t));
- assertEquals("x%3D=x=", sr.serialize(t));
+ assertEquals("'x%3D'='x='", s.serialize(t));
+ assertEquals("'x%3D'='x='", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'x=':{'x=':'x='}}");
- assertEquals("x%3D=$o(x~==x~=)", s.serialize(t));
- assertEquals("x%3D=(x~==x~=)", ss.serialize(t));
- assertEquals("x%3D=$o(\n\tx~==x~=\n)", sr.serialize(t));
+ assertEquals("'x%3D'=('x='='x=')", s.serialize(t));
+ assertEquals("'x%3D'=(\n\t'x='='x='\n)", sr.serialize(t));
// String starting with parenthesis
// Top level
t = "()";
- assertEquals("_value=(~(~))", s.serialize(t));
- assertEquals("_value=(~(~))", ss.serialize(t));
- assertEquals("_value=(~(~))", sr.serialize(t));
+ assertEquals("_value='()'", s.serialize(t));
+ assertEquals("_value='()'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'()':'()'}");
- assertEquals("(~(~))=(~(~))", s.serialize(t));
- assertEquals("(~(~))=(~(~))", ss.serialize(t));
- assertEquals("(~(~))=(~(~))", sr.serialize(t));
+ assertEquals("'()'='()'", s.serialize(t));
+ assertEquals("'()'='()'", sr.serialize(t));
// String starting with $
// Top level
t = "$a";
- assertEquals("_value=($a)", s.serialize(t));
- assertEquals("_value=($a)", ss.serialize(t));
- assertEquals("_value=($a)", sr.serialize(t));
+ assertEquals("_value=$a", s.serialize(t));
+ assertEquals("_value=$a", sr.serialize(t));
// 2nd level
t = new ObjectMap("{$a:'$a'}");
- assertEquals("($a)=($a)", s.serialize(t));
- assertEquals("($a)=($a)", ss.serialize(t));
- assertEquals("($a)=($a)", sr.serialize(t));
+ assertEquals("$a=$a", s.serialize(t));
+ assertEquals("$a=$a", sr.serialize(t));
// Blank string
// Top level
t = "";
- assertEquals("_value=", s.serialize(t));
- assertEquals("_value=", ss.serialize(t));
- assertEquals("_value=", sr.serialize(t));
+ assertEquals("_value=''", s.serialize(t));
+ assertEquals("_value=''", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'':''}");
- assertEquals("=", s.serialize(t));
- assertEquals("=", ss.serialize(t));
- assertEquals("=", sr.serialize(t));
+ assertEquals("''=''", s.serialize(t));
+ assertEquals("''=''", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'':{'':''}}");
- assertEquals("=$o(=)", s.serialize(t));
- assertEquals("=(=)", ss.serialize(t));
- assertEquals("=$o(\n\t()=()\n)", sr.serialize(t));
+ assertEquals("''=(''='')", s.serialize(t));
+ assertEquals("''=(\n\t''=''\n)", sr.serialize(t));
// Newline character
// Top level
t = "\n";
- assertEquals("_value=%0A", s.serialize(t));
- assertEquals("_value=%0A", ss.serialize(t));
- assertEquals("_value=(%0A)", sr.serialize(t));
+ assertEquals("_value='%0A'", s.serialize(t));
+ assertEquals("_value='%0A'", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'\n':'\n'}");
- assertEquals("%0A=%0A", s.serialize(t));
- assertEquals("%0A=%0A", ss.serialize(t));
- assertEquals("(%0A)=(%0A)", sr.serialize(t));
+ assertEquals("'%0A'='%0A'", s.serialize(t));
+ assertEquals("'%0A'='%0A'", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'\n':{'\n':'\n'}}");
- assertEquals("%0A=$o(%0A=%0A)", s.serialize(t));
- assertEquals("%0A=(%0A=%0A)", ss.serialize(t));
- assertEquals("(%0A)=$o(\n\t(%0A)=(%0A)\n)", sr.serialize(t));
+ assertEquals("'%0A'=('%0A'='%0A')", s.serialize(t));
+ assertEquals("'%0A'=(\n\t'%0A'='%0A'\n)", sr.serialize(t));
}
//====================================================================================================
@@ -303,58 +264,49 @@ public class UrlEncodingSerializerTest {
// Top level
t = "�";
assertEquals("_value=%C2%A2", s.serialize(t));
- assertEquals("_value=%C2%A2", ss.serialize(t));
assertEquals("_value=%C2%A2", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'�':'�'}");
assertEquals("%C2%A2=%C2%A2", s.serialize(t));
- assertEquals("%C2%A2=%C2%A2", ss.serialize(t));
assertEquals("%C2%A2=%C2%A2", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'�':{'�':'�'}}");
- assertEquals("%C2%A2=$o(%C2%A2=%C2%A2)", s.serialize(t));
- assertEquals("%C2%A2=(%C2%A2=%C2%A2)", ss.serialize(t));
- assertEquals("%C2%A2=$o(\n\t%C2%A2=%C2%A2\n)", sr.serialize(t));
+ assertEquals("%C2%A2=(%C2%A2=%C2%A2)", s.serialize(t));
+ assertEquals("%C2%A2=(\n\t%C2%A2=%C2%A2\n)", sr.serialize(t));
// 3-byte UTF-8 character
// Top level
t = "\u20ac";
assertEquals("_value=%E2%82%AC", s.serialize(t));
- assertEquals("_value=%E2%82%AC", ss.serialize(t));
assertEquals("_value=%E2%82%AC", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'\u20ac':'\u20ac'}");
assertEquals("%E2%82%AC=%E2%82%AC", s.serialize(t));
- assertEquals("%E2%82%AC=%E2%82%AC", ss.serialize(t));
assertEquals("%E2%82%AC=%E2%82%AC", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'\u20ac':{'\u20ac':'\u20ac'}}");
- assertEquals("%E2%82%AC=$o(%E2%82%AC=%E2%82%AC)", s.serialize(t));
- assertEquals("%E2%82%AC=(%E2%82%AC=%E2%82%AC)", ss.serialize(t));
- assertEquals("%E2%82%AC=$o(\n\t%E2%82%AC=%E2%82%AC\n)", sr.serialize(t));
+ assertEquals("%E2%82%AC=(%E2%82%AC=%E2%82%AC)", s.serialize(t));
+ assertEquals("%E2%82%AC=(\n\t%E2%82%AC=%E2%82%AC\n)", sr.serialize(t));
// 4-byte UTF-8 character
// Top level
t = "\U00024b62";
assertEquals("_value=%F0%A4%AD%A2", s.serialize(t));
- assertEquals("_value=%F0%A4%AD%A2", ss.serialize(t));
assertEquals("_value=%F0%A4%AD%A2", sr.serialize(t));
// 2nd level
t = new ObjectMap("{'\U00024b62':'\U00024b62'}");
assertEquals("%F0%A4%AD%A2=%F0%A4%AD%A2", s.serialize(t));
- assertEquals("%F0%A4%AD%A2=%F0%A4%AD%A2", ss.serialize(t));
assertEquals("%F0%A4%AD%A2=%F0%A4%AD%A2", sr.serialize(t));
// 3rd level
t = new ObjectMap("{'\U00024b62':{'\U00024b62':'\U00024b62'}}");
- assertEquals("%F0%A4%AD%A2=$o(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
- assertEquals("%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2)", ss.serialize(t));
- assertEquals("%F0%A4%AD%A2=$o(\n\t%F0%A4%AD%A2=%F0%A4%AD%A2\n)", sr.serialize(t));
+ assertEquals("%F0%A4%AD%A2=(%F0%A4%AD%A2=%F0%A4%AD%A2)", s.serialize(t));
+ assertEquals("%F0%A4%AD%A2=(\n\t%F0%A4%AD%A2=%F0%A4%AD%A2\n)", sr.serialize(t));
}
//====================================================================================================
@@ -366,54 +318,54 @@ public class UrlEncodingSerializerTest {
DTOs.B t = DTOs.B.create();
String r;
- s = UrlEncodingSerializer.DEFAULT_SIMPLE;
+ s = UrlEncodingSerializer.DEFAULT;
r = s.serialize(t);
String e = ""
- + "f01=(a,b)"
- + "&f02=(c,d)"
- + "&f03=(1,2)"
- + "&f04=(3,4)"
- + "&f05=((e,f),(g,h))"
- + "&f06=((i,j),(k,l))"
- + "&f07=((a=a,b=1,c=true),(a=a,b=1,c=true))"
- + "&f08=((a=a,b=1,c=true),(a=a,b=1,c=true))"
- + "&f09=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))"
- + "&f10=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))"
- + "&f11=(a,b)"
- + "&f12=(c,d)"
- + "&f13=(1,2)"
- + "&f14=(3,4)"
- + "&f15=((e,f),(g,h))"
- + "&f16=((i,j),(k,l))"
- + "&f17=((a=a,b=1,c=true),(a=a,b=1,c=true))"
- + "&f18=((a=a,b=1,c=true),(a=a,b=1,c=true))"
- + "&f19=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))"
- + "&f20=(((a=a,b=1,c=true)),((a=a,b=1,c=true)))";
+ + "f01=@(a,b)"
+ + "&f02=@(c,d)"
+ + "&f03=@(1,2)"
+ + "&f04=@(3,4)"
+ + "&f05=@(@(e,f),@(g,h))"
+ + "&f06=@(@(i,j),@(k,l))"
+ + "&f07=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+ + "&f08=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+ + "&f09=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"
+ + "&f10=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"
+ + "&f11=@(a,b)"
+ + "&f12=@(c,d)"
+ + "&f13=@(1,2)"
+ + "&f14=@(3,4)"
+ + "&f15=@(@(e,f),@(g,h))"
+ + "&f16=@(@(i,j),@(k,l))"
+ + "&f17=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+ + "&f18=@((a=a,b=1,c=true),(a=a,b=1,c=true))"
+ + "&f19=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))"
+ + "&f20=@(@((a=a,b=1,c=true)),@((a=a,b=1,c=true)))";
assertEquals(e, r);
- s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone().setExpandedParams(true);
+ s = UrlEncodingSerializer.DEFAULT.clone().setExpandedParams(true);
r = s.serialize(t);
e = ""
+ "f01=a&f01=b"
+ "&f02=c&f02=d"
+ "&f03=1&f03=2"
+ "&f04=3&f04=4"
- + "&f05=(e,f)&f05=(g,h)"
- + "&f06=(i,j)&f06=(k,l)"
+ + "&f05=@(e,f)&f05=@(g,h)"
+ + "&f06=@(i,j)&f06=@(k,l)"
+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"
+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"
- + "&f09=((a=a,b=1,c=true))&f09=((a=a,b=1,c=true))"
- + "&f10=((a=a,b=1,c=true))&f10=((a=a,b=1,c=true))"
+ + "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"
+ + "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"
+ "&f11=a&f11=b"
+ "&f12=c&f12=d"
+ "&f13=1&f13=2"
+ "&f14=3&f14=4"
- + "&f15=(e,f)&f15=(g,h)"
- + "&f16=(i,j)&f16=(k,l)"
+ + "&f15=@(e,f)&f15=@(g,h)"
+ + "&f16=@(i,j)&f16=@(k,l)"
+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"
+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"
- + "&f19=((a=a,b=1,c=true))&f19=((a=a,b=1,c=true))"
- + "&f20=((a=a,b=1,c=true))&f20=((a=a,b=1,c=true))";
+ + "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"
+ + "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";
assertEquals(e, r);
}
@@ -427,54 +379,54 @@ public class UrlEncodingSerializerTest {
DTOs.C t = DTOs.C.create();
String r;
- s = UrlEncodingSerializer.DEFAULT_SIMPLE;
+ s = UrlEncodingSerializer.DEFAULT;
r = s.serialize(t);
String e = ""
+ "f01=a&f01=b"
+ "&f02=c&f02=d"
+ "&f03=1&f03=2"
+ "&f04=3&f04=4"
- + "&f05=(e,f)&f05=(g,h)"
- + "&f06=(i,j)&f06=(k,l)"
+ + "&f05=@(e,f)&f05=@(g,h)"
+ + "&f06=@(i,j)&f06=@(k,l)"
+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"
+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"
- + "&f09=((a=a,b=1,c=true))&f09=((a=a,b=1,c=true))"
- + "&f10=((a=a,b=1,c=true))&f10=((a=a,b=1,c=true))"
+ + "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"
+ + "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"
+ "&f11=a&f11=b"
+ "&f12=c&f12=d"
+ "&f13=1&f13=2"
+ "&f14=3&f14=4"
- + "&f15=(e,f)&f15=(g,h)"
- + "&f16=(i,j)&f16=(k,l)"
+ + "&f15=@(e,f)&f15=@(g,h)"
+ + "&f16=@(i,j)&f16=@(k,l)"
+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"
+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"
- + "&f19=((a=a,b=1,c=true))&f19=((a=a,b=1,c=true))"
- + "&f20=((a=a,b=1,c=true))&f20=((a=a,b=1,c=true))";
+ + "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"
+ + "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";
assertEquals(e, r);
- s = UrlEncodingSerializer.DEFAULT_SIMPLE.clone().setExpandedParams(true);
+ s = UrlEncodingSerializer.DEFAULT.clone().setExpandedParams(true);
r = s.serialize(t);
e = ""
+ "f01=a&f01=b"
+ "&f02=c&f02=d"
+ "&f03=1&f03=2"
+ "&f04=3&f04=4"
- + "&f05=(e,f)&f05=(g,h)"
- + "&f06=(i,j)&f06=(k,l)"
+ + "&f05=@(e,f)&f05=@(g,h)"
+ + "&f06=@(i,j)&f06=@(k,l)"
+ "&f07=(a=a,b=1,c=true)&f07=(a=a,b=1,c=true)"
+ "&f08=(a=a,b=1,c=true)&f08=(a=a,b=1,c=true)"
- + "&f09=((a=a,b=1,c=true))&f09=((a=a,b=1,c=true))"
- + "&f10=((a=a,b=1,c=true))&f10=((a=a,b=1,c=true))"
+ + "&f09=@((a=a,b=1,c=true))&f09=@((a=a,b=1,c=true))"
+ + "&f10=@((a=a,b=1,c=true))&f10=@((a=a,b=1,c=true))"
+ "&f11=a&f11=b"
+ "&f12=c&f12=d"
+ "&f13=1&f13=2"
+ "&f14=3&f14=4"
- + "&f15=(e,f)&f15=(g,h)"
- + "&f16=(i,j)&f16=(k,l)"
+ + "&f15=@(e,f)&f15=@(g,h)"
+ + "&f16=@(i,j)&f16=@(k,l)"
+ "&f17=(a=a,b=1,c=true)&f17=(a=a,b=1,c=true)"
+ "&f18=(a=a,b=1,c=true)&f18=(a=a,b=1,c=true)"
- + "&f19=((a=a,b=1,c=true))&f19=((a=a,b=1,c=true))"
- + "&f20=((a=a,b=1,c=true))&f20=((a=a,b=1,c=true))";
+ + "&f19=@((a=a,b=1,c=true))&f19=@((a=a,b=1,c=true))"
+ + "&f20=@((a=a,b=1,c=true))&f20=@((a=a,b=1,c=true))";
assertEquals(e, r);
}
@@ -487,9 +439,18 @@ public class UrlEncodingSerializerTest {
t.put("f1", new String[]{"bar"});
t.put("f2", new String[]{"bar","baz"});
t.put("f3", new String[]{});
- s = UrlEncodingSerializer.DEFAULT_SIMPLE_EXPANDED;
+ s = UrlEncodingSerializer.DEFAULT_EXPANDED;
r = s.serialize(t);
String e = "f1=bar&f2=bar&f2=baz";
assertEquals(e, r);
}
+
+ @Test
+ public void testParseParameterObjectMap() throws Exception {
+ String in = "(name='foo bar')";
+
+ ObjectMap r = UrlEncodingParser.DEFAULT.parseParameter(in, ObjectMap.class);
+
+ assertEquals("{name:'foo bar'}", JsonSerializer.DEFAULT_LAX.toString(r));
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java b/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
index 5450e2d..be25076 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoRestTest.java
@@ -71,7 +71,7 @@ public class PojoRestTest {
model.put("/person1", p);
// Make sure it got stored correctly.
- JsonSerializer serializer = JsonSerializer.DEFAULT_LAX;
+ JsonSerializer serializer = JsonSerializer.DEFAULT_LAX.clone().setAddBeanTypeProperties(false);
assertEquals("{person1:{name:'some name',age:123,addresses:[{street:'street A',city:'city A',state:'state A',zip:12345,isCurrent:true},{street:'street B',city:'city B',state:'state B',zip:12345,isCurrent:false}]}}", serializer.serialize(model.getRootObject()));
// Get the original Person object back.
@@ -82,7 +82,7 @@ public class PojoRestTest {
Address a3 = (Address)model.get("/person1/addresses/1");
assertEquals("city B", a3.city);
- serializer = new JsonSerializer.Simple().setAddBeanTypeProperties(true);
+ serializer = new JsonSerializer.Simple();
p = new Person("some name", 123,
new Address("street A", "city A", "state A", 12345, true),
new Address("street B", "city B", "state B", 12345, false)
@@ -115,7 +115,7 @@ public class PojoRestTest {
model.put("addresses/0", new Address("street D", "city D", "state D", 12345, false));
model.put("addresses/1", new Address("street E", "city E", "state E", 12345, false));
model.put("addresses/2", new Address("street F", "city F", "state F", 12345, false));
- serializer = JsonSerializer.DEFAULT_LAX;
+ serializer = JsonSerializer.DEFAULT_LAX.clone().setAddBeanTypeProperties(false);
s = serializer.serialize(p);
expectedValue = "{name:'some name',age:123,addresses:[{street:'street D',city:'city D',state:'state D',zip:12345,isCurrent:false},{street:'street E',city:'city E',state:'state E',zip:12345,isCurrent:false},{street:'street F',city:'city F',state:'state F',zip:12345,isCurrent:false}]}";
assertEquals(expectedValue, s);
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java b/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
index d695969..e11fe18 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/xml/XmlContentTest.java
@@ -34,7 +34,7 @@ public class XmlContentTest {
public void testContentFormat() throws Exception {
A t = A.newInstance(), t2;
XmlSerializer s1 = XmlSerializer.DEFAULT_SQ,
- s2 = new XmlSerializer().setQuoteChar('\'').setUseIndentation(true).setEnableNamespaces(false);
+ s2 = new XmlSerializer().setQuoteChar('\'').setUseWhitespace(true).setEnableNamespaces(false);
XmlParser p = XmlParser.DEFAULT;
XmlSerializerSession session;
String r;
@@ -142,7 +142,7 @@ public class XmlContentTest {
public void testXmlMixed() throws Exception {
B t = B.newInstance(), t2;
XmlSerializer s1 = XmlSerializer.DEFAULT_SQ,
- s2 = new XmlSerializer().setQuoteChar('\'').setUseIndentation(true).setEnableNamespaces(false);
+ s2 = new XmlSerializer().setQuoteChar('\'').setUseWhitespace(true).setEnableNamespaces(false);
XmlParser p = XmlParser.DEFAULT;
XmlSerializerSession session;
String r;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/.project
----------------------------------------------------------------------
diff --git a/juneau-core/.project b/juneau-core/.project
index fe1874b..cd59d79 100644
--- a/juneau-core/.project
+++ b/juneau-core/.project
@@ -1,28 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ***************************************************************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
- * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
- * with the License. You may obtain a copy of the License at *
- * *
- * http://www.apache.org/licenses/LICENSE-2.0 *
- * *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
- * specific language governing permissions and limitations under the License. *
- ***************************************************************************************************************************
--->
<projectDescription>
- <name>juneau-core</name>
- <comment>Base toolkit for serializers, parsers, and bean contexts. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
- <projects/>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
\ No newline at end of file
+ <name>juneau-core</name>
+ <comment>Base toolkit for serializers, parsers, and bean contexts. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature>
+ </natures>
+</projectDescription>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
index 116d6e9..881ccf3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanContext.java
@@ -917,8 +917,8 @@ public class BeanContext extends Context {
if (! cmCacheCache.containsKey(hashCode)) {
ConcurrentHashMap<Class,ClassMeta> cm = new ConcurrentHashMap<Class,ClassMeta>();
- cm.put(String.class, new ClassMeta(String.class, this, null, null, findPojoSwap(String.class), findChildPojoSwaps(String.class)));
- cm.put(Object.class, new ClassMeta(Object.class, this, null, null, findPojoSwap(Object.class), findChildPojoSwaps(Object.class)));
+ cm.putIfAbsent(String.class, new ClassMeta(String.class, this, null, null, findPojoSwap(String.class), findChildPojoSwaps(String.class)));
+ cm.putIfAbsent(Object.class, new ClassMeta(Object.class, this, null, null, findPojoSwap(Object.class), findChildPojoSwaps(Object.class)));
cmCacheCache.putIfAbsent(hashCode, cm);
}
this.cmCache = cmCacheCache.get(hashCode);
@@ -1006,7 +1006,7 @@ public class BeanContext extends Context {
int ctCount = 0;
for (Map<Class,ClassMeta> cm : cmCacheCache.values())
ctCount += cm.size();
- System.out.println(MessageFormat.format("ClassMeta cache: {0} instances in {1} caches", ctCount, cmCacheCache.size()));
+ System.out.println(MessageFormat.format("ClassMeta cache: {0} instances in {1} caches", ctCount, cmCacheCache.size())); // NOT DEBUG
} catch (Exception e) {
e.printStackTrace();
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
index 4e1bad6..48fbd40 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java
@@ -203,15 +203,6 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T
if (meta.ctx.ignoreUnknownBeanProperties)
return null;
- // If this bean has subtypes, and we haven't set the subtype yet,
- // store the property in a temporary cache until the bean can be instantiated.
- // This eliminates the need for requiring that the sub type attribute be provided first.
- if (meta.subTypeProperty != null) {
- if (propertyCache == null)
- propertyCache = new TreeMap<String,Object>();
- return propertyCache.put(property, value);
- }
-
if (property.equals(session.getBeanTypePropertyName()))
return null;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
index 40f1346..a98677c 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
@@ -19,7 +19,6 @@ import java.beans.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;
-import java.util.Map.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.internal.*;
@@ -88,7 +87,6 @@ public class BeanMeta<T> {
private final MetadataMap extMeta; // Extended metadata
// Other fields
- final BeanPropertyMeta subTypeProperty; // The property indentified as the sub type differentiator property (identified by @Bean.subTypeProperty annotation).
private final BeanPropertyMeta typeProperty; // "_type" mock bean property.
private final String dictionaryName; // The @Bean.typeName() annotation defined on this bean class.
final String notABeanReason; // Readable string explaining why this class wasn't a bean.
@@ -111,7 +109,7 @@ public class BeanMeta<T> {
this.notABeanReason = b.init(this);
this.beanFilter = beanFilter;
- this.dictionaryName = beanFilter == null ? null : beanFilter.getTypeName();
+ this.dictionaryName = b.dictionaryName;
this.properties = b.properties == null ? null : Collections.unmodifiableMap(b.properties);
this.getterProps = Collections.unmodifiableMap(b.getterProps);
this.setterProps = Collections.unmodifiableMap(b.setterProps);
@@ -119,7 +117,6 @@ public class BeanMeta<T> {
this.constructor = b.constructor;
this.constructorArgs = b.constructorArgs;
this.extMeta = b.extMeta;
- this.subTypeProperty = b.subTypeIdProperty == null ? null : b.subTypeIdProperty.build();
this.beanRegistry = b.beanRegistry;
this.typeProperty = new BeanPropertyMeta.Builder(this, ctx.getBeanTypePropertyName(), ctx.string(), beanRegistry).build();
}
@@ -136,9 +133,9 @@ public class BeanMeta<T> {
Constructor<T> constructor;
String[] constructorArgs = new String[0];
MetadataMap extMeta = new MetadataMap();
- BeanPropertyMeta.Builder subTypeIdProperty;
PropertyNamer propertyNamer;
BeanRegistry beanRegistry;
+ String dictionaryName;
private Builder(ClassMeta<T> classMeta, BeanContext ctx, BeanFilter beanFilter, String[] pNames) {
this.classMeta = classMeta;
@@ -159,9 +156,10 @@ public class BeanMeta<T> {
fVis = ctx.beanFieldVisibility;
List<Class<?>> bdClasses = new ArrayList<Class<?>>();
+ if (beanFilter != null && beanFilter.getBeanDictionary() != null)
+ bdClasses.addAll(Arrays.asList(beanFilter.getBeanDictionary()));
Bean bean = classMeta.innerClass.getAnnotation(Bean.class);
if (bean != null) {
- bdClasses.addAll(Arrays.asList(bean.beanDictionary()));
if (! bean.typeName().isEmpty())
bdClasses.add(classMeta.innerClass);
}
@@ -335,12 +333,10 @@ public class BeanMeta<T> {
properties = sortProperties ? new TreeMap<String,BeanPropertyMeta>() : new LinkedHashMap<String,BeanPropertyMeta>();
- if (beanFilter != null && beanFilter.getSubTypeProperty() != null) {
- String subTypeProperty = beanFilter.getSubTypeProperty();
- BeanPropertyMeta.Builder stp = normalProps.remove(subTypeProperty);
- this.subTypeIdProperty = new SubTypePropertyMeta.Builder(beanMeta, subTypeProperty, beanFilter.getSubTypes(), stp == null ? null : stp.build(), beanRegistry);
- properties.put(subTypeProperty, this.subTypeIdProperty.build());
- }
+ if (beanFilter != null && beanFilter.getTypeName() != null)
+ dictionaryName = beanFilter.getTypeName();
+ if (dictionaryName == null)
+ dictionaryName = findDictionaryName(this.classMeta);
for (Map.Entry<String,BeanPropertyMeta.Builder> e : normalProps.entrySet())
properties.put(e.getKey(), e.getValue().build());
@@ -385,6 +381,27 @@ public class BeanMeta<T> {
return null;
}
+ private String findDictionaryName(ClassMeta<?> cm) {
+ BeanRegistry br = cm.getBeanRegistry();
+ if (br != null) {
+ String s = br.getTypeName(this.classMeta);
+ if (s != null)
+ return s;
+ }
+ Class<?> pcm = cm.innerClass.getSuperclass();
+ if (pcm != null) {
+ String s = findDictionaryName(ctx.getClassMeta(pcm));
+ if (s != null)
+ return s;
+ }
+ for (Class<?> icm : cm.innerClass.getInterfaces()) {
+ String s = findDictionaryName(ctx.getClassMeta(icm));
+ if (s != null)
+ return s;
+ }
+ return null;
+ }
+
/*
* Returns the property name of the specified field if it's a valid property.
* Returns null if the field isn't a valid property.
@@ -402,10 +419,8 @@ public class BeanMeta<T> {
return name;
return null;
}
-
}
-
/**
* Returns the {@link ClassMeta} of this bean.
*
@@ -426,27 +441,6 @@ public class BeanMeta<T> {
}
/**
- * Returns the subtype property of this bean if it has one.
- * <p>
- * The subtype is specified using the {@link Bean#subTypeProperty()} annotation.
- *
- * @return The meta property for the sub type property, or <jk>null</jk> if no subtype is defined for this bean.
- */
- public BeanPropertyMeta getSubTypeProperty() {
- return subTypeProperty;
- }
-
- /**
- * Returns <jk>true</jk> if this bean has subtypes associated with it.
- * Subtypes are defined using the {@link Bean#subTypes()} annotation.
- *
- * @return <jk>true</jk> if this bean has subtypes associated with it.
- */
- public boolean isSubTyped() {
- return subTypeProperty != null;
- }
-
- /**
* Returns a mock bean property that resolves to the name <js>"_type"</js> and whose value always resolves
* to the dictionary name of the bean.
*
@@ -738,75 +732,6 @@ public class BeanMeta<T> {
}
}
- /*
- * Bean property for getting and setting bean subtype.
- */
- @SuppressWarnings({"rawtypes","unchecked"})
- private static class SubTypePropertyMeta extends BeanPropertyMeta {
-
- private final Map<Class<?>,String> subTypes;
- private final BeanPropertyMeta realProperty; // Bean property if bean actually has a real subtype field.
-
- static class Builder extends BeanPropertyMeta.Builder {
- Map<Class<?>,String> subTypes;
- BeanPropertyMeta realProperty;
-
- Builder(BeanMeta beanMeta, String subTypeAttr, Map<Class<?>,String> subTypes, BeanPropertyMeta realProperty, BeanRegistry beanRegistry) {
- super(beanMeta, subTypeAttr, beanMeta.ctx.string(), beanRegistry);
- this.subTypes = subTypes;
- this.realProperty = realProperty;
- }
-
- @Override
- public SubTypePropertyMeta build() {
- return new SubTypePropertyMeta(this);
- }
- }
-
- SubTypePropertyMeta(Builder b) {
- super(b);
- this.subTypes = b.subTypes;
- this.realProperty = b.realProperty;
- }
-
- /*
- * Setting this bean property causes the inner bean to be set to the subtype implementation.
- */
- @Override /* BeanPropertyMeta */
- public Object set(BeanMap<?> m, Object value) throws BeanRuntimeException {
- if (value == null)
- throw new BeanRuntimeException("Attempting to set bean subtype property to null.");
- String subTypeId = value.toString();
- for (Entry<Class<?>,String> e : subTypes.entrySet()) {
- if (e.getValue().equals(subTypeId)) {
- Class subTypeClass = e.getKey();
- m.meta = beanMeta.ctx.getBeanMeta(subTypeClass);
- try {
- m.setBean(subTypeClass.newInstance());
- if (realProperty != null)
- realProperty.set(m, value);
- // If subtype attribute wasn't specified first, set them again from the temporary cache.
- if (m.propertyCache != null)
- for (Map.Entry<String,Object> me : m.propertyCache.entrySet())
- m.put(me.getKey(), me.getValue());
- } catch (Exception e1) {
- throw new BeanRuntimeException(e1);
- }
- return null;
- }
- }
- throw new BeanRuntimeException(beanMeta.c, "Unknown subtype ID ''{0}''", subTypeId);
- }
-
- @Override /* BeanPropertyMeta */
- public Object get(BeanMap<?> m) throws BeanRuntimeException {
- String subTypeId = beanMeta.beanFilter.getSubTypes().get(beanMeta.c);
- if (subTypeId == null)
- throw new BeanRuntimeException(beanMeta.c, "Unmapped sub type class");
- return subTypeId;
- }
- }
-
@Override /* Object */
public String toString() {
StringBuilder sb = new StringBuilder(c.getName());
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 516d3d4..ba6f2df 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -451,11 +451,6 @@ public class BeanPropertyMeta {
if (m.bean == null) {
- // If this bean has subtypes, and we haven't set the subtype yet,
- // store the property in a temporary cache until the bean can be instantiated.
- if (m.meta.subTypeProperty != null && m.propertyCache == null)
- m.propertyCache = new TreeMap<String,Object>();
-
// Read-only beans get their properties stored in a cache.
if (m.propertyCache != null)
return m.propertyCache.put(name, value);
@@ -612,10 +607,10 @@ public class BeanPropertyMeta {
} else {
if (swap != null && value != null && isParentClass(swap.getSwapClass(), value.getClass())) {
- value = swap.unswap(session, value, rawTypeMeta);
+ value = swap.unswap(session, value, rawTypeMeta);
} else {
- value = session.convertToType(value, rawTypeMeta);
- }
+ value = session.convertToType(value, rawTypeMeta);
+ }
if (setter != null)
setter.invoke(bean, new Object[] { value });
else if (field != null)
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
index 13f9657..090fd91 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -36,18 +36,19 @@ import org.apache.juneau.internal.*;
public class BeanRegistry {
private final Map<String,ClassMeta<?>> map;
+ private final Map<Class<?>,String> reverseMap;
private final BeanContext beanContext;
- private final String beanTypePropertyName;
private final boolean isEmpty;
BeanRegistry(BeanContext beanContext, BeanRegistry parent, Class<?>...classes) {
this.beanContext = beanContext;
- this.beanTypePropertyName = beanContext.getBeanTypePropertyName();
this.map = new ConcurrentHashMap<String,ClassMeta<?>>();
+ this.reverseMap = new ConcurrentHashMap<Class<?>,String>();
for (Class<?> c : beanContext.beanDictionaryClasses)
addClass(c);
if (parent != null)
- this.map.putAll(parent.map);
+ for (Map.Entry<String,ClassMeta<?>> e : parent.map.entrySet())
+ addToMap(e.getKey(), e.getValue());
for (Class<?> c : classes)
addClass(c);
isEmpty = map.isEmpty();
@@ -77,13 +78,13 @@ public class BeanRegistry {
val = getTypedClassMeta(v);
else
throw new BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but value of type ''{1}'' found in map is not a Type object.", c.getName(), v.getClass().getName());
- map.put(typeName, val);
+ addToMap(typeName, val);
}
} else {
Bean b = c.getAnnotation(Bean.class);
if (b == null || b.typeName().isEmpty())
throw new BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but it doesn't have a @Bean.typeName() annotation defined.", c.getName());
- map.put(b.typeName(), beanContext.getClassMeta(c));
+ addToMap(b.typeName(), beanContext.getClassMeta(c));
}
}
} catch (BeanRuntimeException e) {
@@ -104,34 +105,9 @@ public class BeanRegistry {
return beanContext.getClassMeta(type, args);
}
- /**
- * Converts the specified object map into a bean if it contains a <js>"_type"</js> entry in it.
- *
- * @param m The object map to convert to a bean if possible.
- * @return The new bean, or the original <code>ObjectMap</code> if no <js>"_type"</js> entry was found.
- */
- public Object cast(ObjectMap m) {
- if (isEmpty)
- return m;
- Object o = m.get(beanTypePropertyName);
- if (o == null)
- return m;
- String typeName = o.toString();
- ClassMeta<?> cm = getClassMeta(typeName);
- BeanMap<?> bm = m.getBeanSession().newBeanMap(cm.getInnerClass());
-
- // Iterate through all the entries in the map and set the individual field values.
- for (Map.Entry<String,Object> e : m.entrySet()) {
- String k = e.getKey();
- Object v = e.getValue();
- if (! k.equals(beanTypePropertyName)) {
- // Attempt to recursively cast child maps.
- if (v instanceof ObjectMap)
- v = cast((ObjectMap)v);
- bm.put(k, v);
- }
- }
- return bm.getBean();
+ private void addToMap(String typeName, ClassMeta<?> cm) {
+ map.put(typeName, cm);
+ reverseMap.put(cm.innerClass, typeName);
}
/**
@@ -151,15 +127,28 @@ public class BeanRegistry {
return cm;
if (typeName.charAt(typeName.length()-1) == '^') {
cm = getClassMeta(typeName.substring(0, typeName.length()-1));
- if (cm != null)
+ if (cm != null) {
cm = beanContext.getClassMeta(Array.newInstance(cm.innerClass, 1).getClass());
- map.put(typeName, cm);
+ map.put(typeName, cm);
+ }
return cm;
}
return null;
}
/**
+ * Given the specified class, return the dictionary name for it.
+ *
+ * @param c The class to lookup in this registry.
+ * @return The dictionary name for the specified class in this registry, or <jk>null</jk> if not found.
+ */
+ public String getTypeName(ClassMeta<?> c) {
+ if (isEmpty)
+ return null;
+ return reverseMap.get(c.innerClass);
+ }
+
+ /**
* Returns <jk>true</jk> if this dictionary has an entry for the specified type name.
*
* @param typeName The bean type name.
@@ -168,4 +157,14 @@ public class BeanRegistry {
public boolean hasName(String typeName) {
return getClassMeta(typeName) != null;
}
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append('{');
+ for (Map.Entry<String,ClassMeta<?>> e : map.entrySet())
+ sb.append(e.getKey()).append(":").append(e.getValue().toString(true)).append(", ");
+ sb.append('}');
+ return sb.toString();
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
index 540329b..abc9959 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanSession.java
@@ -551,8 +551,18 @@ public class BeanSession extends Session {
}
// It's a bean being initialized with a Map
- if (type.isBean() && value instanceof Map)
+ if (type.isBean() && value instanceof Map) {
+ if (value instanceof ObjectMap) {
+ ObjectMap m2 = (ObjectMap)value;
+ String typeName = m2.getString(getBeanTypePropertyName());
+ if (typeName != null) {
+ ClassMeta cm = type.getBeanRegistry().getClassMeta(typeName);
+ if (cm != null && ClassUtils.isParentClass(type.innerClass, cm.innerClass))
+ return (T)m2.cast(cm);
+ }
+ }
return newBeanMap(tc).load((Map<?,?>) value).getBean();
+ }
if (type.canCreateNewInstanceFromNumber(outer) && value instanceof Number)
return type.newInstanceFromNumber(this, outer, (Number)value);
@@ -722,12 +732,8 @@ public class BeanSession extends Session {
if (m == null)
return null;
T bean = null;
- if (m.constructorArgs.length == 0) {
+ if (m.constructorArgs.length == 0)
bean = newBean(outer, c);
- // Beans with subtypes won't be instantiated until the sub type property is specified.
- if (bean == null && ! m.getClassMeta().hasSubTypes())
- return null;
- }
return new BeanMap<T>(this, bean, m);
}
@@ -768,12 +774,8 @@ public class BeanSession extends Session {
return null;
try {
T o = (T)m.newBean(outer);
- if (o == null) {
- // Beans with subtypes won't be instantiated until the sub type property is specified.
- if (cm.hasSubTypes())
- return null;
+ if (o == null)
throw new BeanRuntimeException(c, "Class does not have a no-arg constructor.");
- }
return o;
} catch (BeanRuntimeException e) {
throw e;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
index fdcbd2a..c1c2e72 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ClassMeta.java
@@ -104,6 +104,7 @@ public final class ClassMeta<T> implements Type {
resolvedDictionaryName; // The name if this is an array type (e.g. "X^^").
private final Throwable initException; // Any exceptions thrown in the init() method.
private final InvocationHandler invocationHandler; // The invocation handler for this class (if it has one).
+ private final BeanRegistry beanRegistry; // The bean registry of this class meta (if it has one).
private static final Boolean BOOLEAN_DEFAULT = false;
private static final Character CHARACTER_DEFAULT = (char)0;
@@ -179,6 +180,7 @@ public final class ClassMeta<T> implements Type {
BeanMeta _beanMeta = null;
PojoSwap _pojoSwap = null;
InvocationHandler _invocationHandler = null;
+ BeanRegistry _beanRegistry = null;
if (c.isPrimitive()) {
if (c == Boolean.TYPE)
@@ -462,6 +464,7 @@ public final class ClassMeta<T> implements Type {
try {
newMeta = new BeanMeta(this, beanContext, beanFilter, null);
_notABeanReason = newMeta.notABeanReason;
+ _beanRegistry = newMeta.beanRegistry; // Always get the bean registry even if it's not a bean.
} catch (RuntimeException e) {
_notABeanReason = e.getMessage();
throw e;
@@ -493,6 +496,10 @@ public final class ClassMeta<T> implements Type {
if (_beanMeta != null && beanContext != null && beanContext.useInterfaceProxies && innerClass.isInterface())
_invocationHandler = new BeanProxyInvocationHandler<T>(_beanMeta);
+ Bean b = c.getAnnotation(Bean.class);
+ if (b != null && b.beanDictionary().length != 0)
+ _beanRegistry = new BeanRegistry(beanContext, null, b.beanDictionary());
+
this.cc = _cc;
this.isDelegate = _isDelegate;
this.fromStringMethod = _fromStringMethod;
@@ -522,6 +529,7 @@ public final class ClassMeta<T> implements Type {
this.resolvedDictionaryName = _resolvedDictionaryName;
this.serializedClassMeta = _serializedClassMeta;
this.invocationHandler = _invocationHandler;
+ this.beanRegistry = _beanRegistry;
}
/**
@@ -566,6 +574,7 @@ public final class ClassMeta<T> implements Type {
this.beanFilter = mainType.beanFilter;
this.extMeta = mainType.extMeta;
this.initException = mainType.initException;
+ this.beanRegistry = mainType.beanRegistry;
}
private ClassMeta<?> findClassMeta(Class<?> c) {
@@ -578,7 +587,7 @@ public final class ClassMeta<T> implements Type {
private BeanFilter findBeanFilter() {
try {
- List<Bean> ba = ReflectionUtils.findAnnotations(Bean.class, innerClass);
+ Map<Class<?>,Bean> ba = ReflectionUtils.findAnnotationsMap(Bean.class, innerClass);
if (! ba.isEmpty())
return new AnnotationBeanFilterBuilder(innerClass, ba).build();
} catch (Exception e) {
@@ -629,6 +638,19 @@ public final class ClassMeta<T> implements Type {
}
/**
+ * Returns the bean registry for this class.
+ * <p>
+ * This bean registry contains names specified in the {@link Bean#beanDictionary()} annotation defined
+ * on the class, regardless of whether the class is an actual bean.
+ * This allows interfaces to define subclasses with type names.
+ *
+ * @return The bean registry for this class, or <jk>null</jk> if no bean registry is associated with it.
+ */
+ public BeanRegistry getBeanRegistry() {
+ return beanRegistry;
+ }
+
+ /**
* Returns the category of this class.
*
* @return The category of this class.
@@ -648,15 +670,6 @@ public final class ClassMeta<T> implements Type {
}
/**
- * Returns <jk>true</jk> if this class as subtypes defined through {@link Bean#subTypes}.
- *
- * @return <jk>true</jk> if this class has subtypes.
- */
- public boolean hasSubTypes() {
- return beanFilter != null && beanFilter.getSubTypeProperty() != null;
- }
-
- /**
* Returns <jk>true</jk> if this class is a subclass of or the same as the specified class.
*
* @param c The comparison class.
@@ -694,7 +707,9 @@ public final class ClassMeta<T> implements Type {
s = f;
if (s == null)
s = PojoSwap.NULL;
- childSwapMap.putIfAbsent(normalClass, s);
+ PojoSwap<?,?> s2 = childSwapMap.putIfAbsent(normalClass, s);
+ if (s2 != null)
+ s = s2;
}
if (s == PojoSwap.NULL)
return null;
@@ -719,7 +734,9 @@ public final class ClassMeta<T> implements Type {
s = f;
if (s == null)
s = PojoSwap.NULL;
- childUnswapMap.putIfAbsent(swapClass, s);
+ PojoSwap<?,?> s2 = childUnswapMap.putIfAbsent(swapClass, s);
+ if (s2 != null)
+ s = s2;
}
if (s == PojoSwap.NULL)
return null;
@@ -1155,9 +1172,6 @@ public final class ClassMeta<T> implements Type {
public boolean canCreateNewBean(Object outer) {
if (beanMeta == null)
return false;
- // Beans with transforms with subtype properties are assumed to be constructable.
- if (beanFilter != null && beanFilter.getSubTypeProperty() != null)
- return true;
if (beanMeta.constructor == null)
return false;
if (isMemberClass)
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
index 1bb1979..f93b180 100644
--- a/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
+++ b/juneau-core/src/main/java/org/apache/juneau/CoreApi.java
@@ -1364,7 +1364,7 @@ public abstract class CoreApi extends Lockable {
* @see BeanContext#BEAN_beanTypePropertyName
*/
public CoreApi setBeanTypePropertyName(String value) throws LockedException {
- return addToProperty(BEAN_beanTypePropertyName, value);
+ return setProperty(BEAN_beanTypePropertyName, value);
}
/**
@@ -1390,7 +1390,7 @@ public abstract class CoreApi extends Lockable {
* @see BeanContext#BEAN_defaultParser
*/
public CoreApi setDefaultParser(Class<?> value) throws LockedException {
- return addToProperty(BEAN_defaultParser, value);
+ return setProperty(BEAN_defaultParser, value);
}
/**
@@ -1414,7 +1414,7 @@ public abstract class CoreApi extends Lockable {
* @see BeanContext#BEAN_locale
*/
public CoreApi setLocale(Locale value) throws LockedException {
- return addToProperty(BEAN_locale, value);
+ return setProperty(BEAN_locale, value);
}
/**
@@ -1464,7 +1464,7 @@ public abstract class CoreApi extends Lockable {
* @see BeanContext#BEAN_mediaType
*/
public CoreApi setMediaType(MediaType value) throws LockedException {
- return addToProperty(BEAN_mediaType, value);
+ return setProperty(BEAN_mediaType, value);
}
/**
@@ -1501,7 +1501,7 @@ public abstract class CoreApi extends Lockable {
* @see BeanContext#BEAN_debug
*/
public CoreApi setDebug(boolean value) throws LockedException {
- return addToProperty(BEAN_debug, value);
+ return setProperty(BEAN_debug, value);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/LockedException.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/LockedException.java b/juneau-core/src/main/java/org/apache/juneau/LockedException.java
index 9ba5063..4ad8303 100644
--- a/juneau-core/src/main/java/org/apache/juneau/LockedException.java
+++ b/juneau-core/src/main/java/org/apache/juneau/LockedException.java
@@ -25,6 +25,6 @@ public final class LockedException extends RuntimeException {
private static final long serialVersionUID = 1L;
LockedException() {
- super("Object is locked and object settings cannot be modified.");
+ super("Object is locked and object settings cannot be modified. Try cloning the object.");
}
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
index 63ae64f..983588d 100644
--- a/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
+++ b/juneau-core/src/main/java/org/apache/juneau/annotation/Bean.java
@@ -164,59 +164,6 @@ public @interface Bean {
Class<? extends PropertyNamer> propertyNamer() default PropertyNamerDefault.class;
/**
- * Defines a virtual property on a superclass that identifies bean subtype classes.
- * <p>
- * In the following example, the abstract class has two subclasses that are differentiated
- * by a property called <code>subType</code>
- * <p class='bcode'>
- * <jc>// Abstract superclass</jc>
- * <ja>@Bean</ja>(
- * subTypeProperty=<js>"subType"</js>,
- * subTypes={A1.class, A2.class}
- * )
- * <jk>public class</jk> A {
- * <jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
- * }
- *
- * <jc>// Subclass 1</jc>
- * <ja>@Bean</ja>(typeName=<js>"A1"</js>)
- * <jk>public class</jk> A1 <jk>extends</jk> A {
- * <jk>public</jk> String <jf>f1</jf>;
- * }
- *
- * <jc>// Subclass 2</jc>
- * <ja>@Bean</ja>(typeName=<js>"A2"</js>)
- * <jk>public class</jk> A2 <jk>extends</jk> A {
- * <jk>public</jk> String <jf>f2</jf>;
- * }
- * <p>
- * The following shows what happens when serializing a subclassed object to JSON:
- * <p class='bcode'>
- * JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>;
- * A1 a1 = <jk>new</jk> A1();
- * a1.<jf>f1</jf> = <js>"f1"</js>;
- * String r = s.serialize(a1);
- * <jsm>assertEquals</jsm>(<js>"{subType:'A1',f1:'f1',f0:'f0'}"</js>, r);
- * </p>
- * <p>
- * The following shows what happens when parsing back into the original object.
- * <p>
- * <p class='bcode'>
- * JsonParser p = JsonParser.<jsf>DEFAULT</jsf>;
- * A a = p.parse(r, A.<jk>class</jk>);
- * <jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
- * </p>
- * <p>
- * This annotation is an alternative to using the {@link BeanFilter} class with an implemented {@link BeanFilter#getSubTypeProperty()} method.
- */
- String subTypeProperty() default "_subtype";
-
- /**
- * Used in conjunction with {@link #subTypeProperty()} to set up bean subtypes.
- */
- Class<?>[] subTypes() default {};
-
- /**
* Identifies a class to be used as the interface class for this and all subclasses.
* <p>
* When specified, only the list of properties defined on the interface class will be used during serialization.
@@ -273,7 +220,8 @@ public @interface Bean {
/**
- * The list of classes that make up the bean dictionary for all properties of this bean.
+ * The list of classes that make up the bean dictionary for all properties of this bean
+ * or for subclasses of this bean.
* <p>
* This is a shorthand for setting the {@link BeanProperty#beanDictionary()} on all properties of the bean.
* <p>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
index 60d578a..623d79e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/atom/AtomBuilder.java
@@ -129,7 +129,7 @@ public class AtomBuilder {
* @return The new element.
*/
public static final Icon icon(String uri) {
- return icon(uri);
+ return new Icon(uri);
}
/**
@@ -171,7 +171,7 @@ public class AtomBuilder {
* @return The new element.
*/
public static final Logo logo(String uri) {
- return logo(uri);
+ return new Logo(uri);
}
/**
@@ -181,7 +181,7 @@ public class AtomBuilder {
* @return The new element.
*/
public static final Logo logo(URI uri) {
- return logo(uri);
+ return new Logo(uri);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
index d105866..e3539ec 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElement.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.xml.annotation.XmlFormat.*;
import java.util.*;
+import org.apache.juneau.annotation.*;
import org.apache.juneau.html.*;
import org.apache.juneau.utils.*;
import org.apache.juneau.xml.annotation.*;
@@ -35,6 +36,7 @@ public abstract class HtmlElement {
* @return The attributes of this element.
*/
@Xml(format=ATTRS)
+ @BeanProperty(name="a")
public LinkedHashMap<String,Object> getAttrs() {
return attrs;
}
@@ -44,6 +46,7 @@ public abstract class HtmlElement {
* @param attrs The new attributes for this element.
* @return This object (for method chaining).
*/
+ @BeanProperty(name="a")
public HtmlElement setAttrs(LinkedHashMap<String,Object> attrs) {
this.attrs = attrs;
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
index 9878c40..1b8269e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementContainer.java
@@ -33,7 +33,7 @@ public class HtmlElementContainer extends HtmlElement {
* @return The children of this element.
*/
@Xml(format=ELEMENTS)
- @BeanProperty(beanDictionary=HtmlBeanDictionary.class)
+ @BeanProperty(beanDictionary=HtmlBeanDictionary.class, name="c")
public LinkedList<Object> getChildren() {
return children;
}
@@ -43,6 +43,7 @@ public class HtmlElementContainer extends HtmlElement {
* @param children The new children for this container.
* @return This object (for method chaining).
*/
+ @BeanProperty(name="c")
public HtmlElementContainer setChildren(LinkedList<Object> children) {
this.children = children;
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
index 0890bc9..65b779e 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementMixed.java
@@ -33,7 +33,7 @@ public class HtmlElementMixed extends HtmlElement {
* @return The children of this element.
*/
@Xml(format=MIXED)
- @BeanProperty(beanDictionary=HtmlBeanDictionary.class)
+ @BeanProperty(beanDictionary=HtmlBeanDictionary.class, name="c")
public LinkedList<Object> getChildren() {
return children;
}
@@ -44,6 +44,7 @@ public class HtmlElementMixed extends HtmlElement {
* @param children The new children of this element.
* @return This object (for method chaining).
*/
+ @BeanProperty(name="c")
public HtmlElement setChildren(LinkedList<Object> children) {
this.children = children;
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
index 5c66b7e..a27cef2 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/HtmlElementText.java
@@ -12,6 +12,7 @@
// ***************************************************************************************************************************
package org.apache.juneau.dto.html5;
+import org.apache.juneau.annotation.*;
import org.apache.juneau.xml.annotation.*;
/**
@@ -28,6 +29,7 @@ public class HtmlElementText extends HtmlElement {
* @return The inner text of this element, or <jk>null</jk> if no text is set.
*/
@Xml(format=XmlFormat.TEXT)
+ @BeanProperty(name="c")
public Object getText() {
return text;
}
@@ -38,6 +40,7 @@ public class HtmlElementText extends HtmlElement {
* @param text The inner text of this element, or <jk>null</jk> if no text is set.
* @return This object (for method chaining).
*/
+ @BeanProperty(name="c")
public HtmlElement setText(Object text) {
this.text = text;
return this;
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
index 7d1f553..4f97bd6 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Pre.java
@@ -31,7 +31,7 @@ public class Pre extends HtmlElementMixed {
//--------------------------------------------------------------------------------
@Xml(format=MIXED_PWS)
- @BeanProperty(beanDictionary=HtmlBeanDictionary.class)
+ @BeanProperty(beanDictionary=HtmlBeanDictionary.class, name="c")
@Override
public LinkedList<Object> getChildren() {
return super.getChildren();
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
index 4992a5c..8e5d4c9 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Script.java
@@ -99,6 +99,7 @@ public class Script extends HtmlElementText {
//--------------------------------------------------------------------------------
@Xml(format=XmlFormat.TEXT_PWS)
+ @BeanProperty(name="c")
@Override
public Object getText() {
return super.getText();
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
index 174c1f5..5c8516a 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/html5/Style.java
@@ -50,6 +50,7 @@ public class Style extends HtmlElementText {
//--------------------------------------------------------------------------------
@Xml(format=XmlFormat.TEXT_PWS)
+ @BeanProperty(name="c")
@Override /* HtmlElementText */
public Object getText() {
return super.getText();
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
index 8e37172..a9aa605 100644
--- a/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
+++ b/juneau-core/src/main/java/org/apache/juneau/dto/jsonschema/Sample.java
@@ -53,7 +53,7 @@ class Sample {
.getProperty("address",true) // Get "address" property, resolved to Address schema.
.getProperty("street") // Get "street" property.
.getTypeAsJsonType(); // Get data type.
- System.err.println("streetType=" + streetType); // Prints "streetType=string"
+ System.err.println("streetType=" + streetType); // Prints "streetType=string" // NOT DEBUG
JsonType productIdType = purchaseOrderSchema
.getProperty("product") // Get "product" property
@@ -62,6 +62,6 @@ class Sample {
.resolve() // Resolve to Product schema.
.getProperty("productId") // Get "productId" property.
.getTypeAsJsonType(); // Get data type.
- System.err.println("productIdType=" + productIdType); // Prints "productIdType=number"
+ System.err.println("productIdType=" + productIdType); // Prints "productIdType=number" // NOT DEBUG
}
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java b/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
index 5f148d2..4f437c4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
+++ b/juneau-core/src/main/java/org/apache/juneau/encoders/EncoderGroup.java
@@ -69,7 +69,7 @@ public final class EncoderGroup extends Lockable {
*/
public EncoderGroup append(Encoder e) {
checkLock();
- synchronized(encoders) {
+ synchronized(this) {
cache.clear();
encoders.add(0, e);
}
@@ -101,7 +101,7 @@ public final class EncoderGroup extends Lockable {
append(e.newInstance());
} catch (NoClassDefFoundError x) {
// Ignore if dependent library not found (e.g. Jena).
- System.err.println(e);
+ System.err.println(e); // NOT DEBUG
}
return this;
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index 692357d..ac79d08 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -225,8 +225,8 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
}
@Override /* Serializer */
- public HtmlDocSerializer setUseIndentation(boolean value) throws LockedException {
- super.setUseIndentation(value);
+ public HtmlDocSerializer setUseWhitespace(boolean value) throws LockedException {
+ super.setUseWhitespace(value);
return this;
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
index de55239..f270030 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
@@ -132,6 +132,6 @@ public final class HtmlDocSerializerSession extends HtmlSerializerSession {
Object output = getOutput();
if (output instanceof HtmlWriter)
return (HtmlWriter)output;
- return new HtmlWriter(super.getWriter(), isUseIndentation(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
+ return new HtmlWriter(super.getWriter(), isUseWhitespace(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
}
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
index decdaad..39705ca 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParser.java
@@ -69,7 +69,6 @@ public final class HtmlParser extends XmlParser {
PojoSwap<T,Object> transform = (PojoSwap<T,Object>)eType.getPojoSwap();
ClassMeta<?> sType = eType.getSerializedClassMeta();
session.setCurrentClass(sType);
- BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
int event = r.getEventType();
if (event != START_ELEMENT)
@@ -160,9 +159,10 @@ public final class HtmlParser extends XmlParser {
} else if (tag == TABLE) {
String typeName = getAttribute(r, session.getBeanTypePropertyName(), "object");
+ ClassMeta cm = session.getClassMeta(typeName, pMeta, eType);
- if (breg.hasName(typeName)) {
- sType = eType = (ClassMeta<T>)breg.getClassMeta(typeName);
+ if (cm != null) {
+ sType = eType = cm;
typeName = sType.isArray() ? "array" : "object";
} else if (! "array".equals(typeName)) {
// Type name could be a subtype name.
@@ -201,9 +201,9 @@ public final class HtmlParser extends XmlParser {
} else if (tag == UL) {
String typeName = getAttribute(r, session.getBeanTypePropertyName(), "array");
-
- if (breg.hasName(typeName))
- sType = eType = (ClassMeta<T>)breg.getClassMeta(typeName);
+ ClassMeta cm = session.getClassMeta(typeName, pMeta, eType);
+ if (cm != null)
+ sType = eType = cm;
if (sType.isObject())
o = parseIntoCollection(session, r, (Collection)new ObjectList(session), sType.getElementType(), pMeta);
@@ -332,7 +332,6 @@ public final class HtmlParser extends XmlParser {
if (elementType == null)
elementType = (ClassMeta<E>)object();
- BeanRegistry breg = (pMeta == null ? session.getBeanRegistry() : pMeta.getBeanRegistry());
HtmlTag tag = nextTag(r, TR);
List<String> keys = new ArrayList<String>();
@@ -350,9 +349,9 @@ public final class HtmlParser extends XmlParser {
break;
String type = getAttribute(r, session.getBeanTypePropertyName(), null);
- if (breg.hasName(type)) {
- elementType = (ClassMeta)breg.getClassMeta(type);
- }
+ ClassMeta elementType2 = session.getClassMeta(type, pMeta, null);
+ if (elementType2 != null)
+ elementType = elementType2;
if (elementType.canCreateNewBean(l)) {
BeanMap m = session.newBeanMap(l, elementType.getInnerClass());
@@ -398,7 +397,7 @@ public final class HtmlParser extends XmlParser {
if (m != null && c != null) {
ObjectMap m2 = (m instanceof ObjectMap ? (ObjectMap)m : new ObjectMap(m).setBeanSession(session));
m2.put(session.getBeanTypePropertyName(), c);
- l.add((E)breg.cast(m2));
+ l.add((E)session.cast(m2, pMeta, null));
} else {
l.add((E)m);
}
@@ -429,13 +428,8 @@ public final class HtmlParser extends XmlParser {
nextTag(r, TD);
BeanPropertyMeta pMeta = m.getPropertyMeta(key);
if (pMeta == null) {
- if (m.getMeta().isSubTyped()) {
- Object value = parseAnything(session, object(), r, m.getBean(false), false, null);
- m.put(key, value);
- } else {
- onUnknownProperty(session, key, m, -1, -1);
- parseAnything(session, object(), r, null, false, null);
- }
+ onUnknownProperty(session, key, m, -1, -1);
+ parseAnything(session, object(), r, null, false, null);
} else {
ClassMeta<?> cm = pMeta.getClassMeta();
Object value = parseAnything(session, cm, r, m.getBean(false), false, pMeta);
@@ -448,8 +442,6 @@ public final class HtmlParser extends XmlParser {
return m;
}
-
-
/*
* Reads the next tag. Advances past anything that's not a start or end tag. Throws an exception if
* it's not one of the expected tags.
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index 80645af..f885578 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -32,7 +32,6 @@ import org.apache.juneau.xml.*;
*/
public final class HtmlParserSession extends XmlParserSession {
- private XMLEventReader xmlEventReader;
private static final Set<String> whitespaceElements = new HashSet<String>(
Arrays.asList(
new String[]{"br","bs","sp","ff"}
@@ -203,19 +202,4 @@ public final class HtmlParserSession extends XmlParserSession {
throw new XMLStreamException("Invalid tag found in parseWhitespaceElement(): " + tag);
}
}
-
- @Override /* ParserSession */
- public boolean close() {
- if (super.close()) {
- if (xmlEventReader != null) {
- try {
- xmlEventReader.close();
- } catch (XMLStreamException e) {
- throw new BeanRuntimeException(e);
- }
- }
- return true;
- }
- return false;
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
index d462732..e5d4589 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializer.java
@@ -152,7 +152,7 @@ public class HtmlSerializer extends XmlSerializer {
public static class SqReadable extends Sq {
/** Constructor */
public SqReadable() {
- setUseIndentation(true);
+ setUseWhitespace(true);
}
}
@@ -831,8 +831,8 @@ public class HtmlSerializer extends XmlSerializer {
}
@Override /* Serializer */
- public HtmlSerializer setUseIndentation(boolean value) throws LockedException {
- super.setUseIndentation(value);
+ public HtmlSerializer setUseWhitespace(boolean value) throws LockedException {
+ super.setUseWhitespace(value);
return this;
}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index b97bb9e..3d67924 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -83,7 +83,7 @@ public class HtmlSerializerSession extends XmlSerializerSession {
Object output = getOutput();
if (output instanceof HtmlWriter)
return (HtmlWriter)output;
- return new HtmlWriter(super.getWriter(), isUseIndentation(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
+ return new HtmlWriter(super.getWriter(), isUseWhitespace(), isTrimStrings(), getQuoteChar(), getRelativeUriBase(), getAbsolutePathUriBase());
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
index 3a2a810..95b6092 100644
--- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
+++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlWriter.java
@@ -26,14 +26,14 @@ public class HtmlWriter extends XmlWriter {
* Constructor.
*
* @param out The writer being wrapped.
- * @param useIndentation If <jk>true</jk>, tabs will be used in output.
+ * @param useWhitespace If <jk>true</jk>, tabs will be used in output.
* @param trimStrings If <jk>true</jk>, strings should be trimmed before they're serialized.
* @param quoteChar The quote character to use (i.e. <js>'\''</js> or <js>'"'</js>)
* @param uriContext The web application context path (e.g. "/contextRoot").
* @param uriAuthority The web application URI authority (e.g. "http://hostname:9080")
*/
- public HtmlWriter(Writer out, boolean useIndentation, boolean trimStrings, char quoteChar, String uriContext, String uriAuthority) {
- super(out, useIndentation, trimStrings, quoteChar, uriContext, uriAuthority, false, null);
+ public HtmlWriter(Writer out, boolean useWhitespace, boolean trimStrings, char quoteChar, String uriContext, String uriAuthority) {
+ super(out, useWhitespace, trimStrings, quoteChar, uriContext, uriAuthority, false, null);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
index 7188624..0ebf523 100644
--- a/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
+++ b/juneau-core/src/main/java/org/apache/juneau/ini/ConfigMgr.java
@@ -303,10 +303,10 @@ public class ConfigMgr {
}
private static void printUsageAndExit() {
- System.err.println("---Usage---");
- System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createBatchEnvFile -configFile <configFile> -envFile <envFile> [-verbose]");
- System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createShellEnvFile -configFile <configFile> -envFile <envFile> [-verbose]");
- System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile setVals -configFile <configFile> -vals [var1 val1 [var2 val2...]] [-verbose]");
+ System.err.println("---Usage---"); // NOT DEBUG
+ System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createBatchEnvFile -configFile <configFile> -envFile <envFile> [-verbose]"); // NOT DEBUG
+ System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile createShellEnvFile -configFile <configFile> -envFile <envFile> [-verbose]"); // NOT DEBUG
+ System.err.println("java -cp juneau.jar org.apache.juneau.ini.ConfigFile setVals -configFile <configFile> -vals [var1 val1 [var2 val2...]] [-verbose]"); // NOT DEBUG
int rc = Integer.getInteger("exit.2", 2);
if (rc != 0)
System.exit(rc);
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/097b8103/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java b/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
index 999de00..7f84418 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/AsciiSet.java
@@ -54,4 +54,19 @@ public final class AsciiSet {
return false;
return store[c];
}
+
+ /**
+ * Returns <jk>true</jk> if the specified string contains at least one character in this set.
+ *
+ * @param s The string to test.
+ * @return <jk>true</jk> if the string is not null and contains at least one character in this set.
+ */
+ public boolean contains(CharSequence s) {
+ if (s == null)
+ return false;
+ for (int i = 0; i < s.length(); i++)
+ if (contains(s.charAt(i)))
+ return true;
+ return false;
+ }
}