http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/756ffe72/content/site/apidocs/src-html/org/apache/juneau/ClassMeta.html
----------------------------------------------------------------------
diff --git a/content/site/apidocs/src-html/org/apache/juneau/ClassMeta.html 
b/content/site/apidocs/src-html/org/apache/juneau/ClassMeta.html
index 1078c4e..fb58e40 100644
--- a/content/site/apidocs/src-html/org/apache/juneau/ClassMeta.html
+++ b/content/site/apidocs/src-html/org/apache/juneau/ClassMeta.html
@@ -149,1387 +149,1413 @@
 <span class="sourceLineNo">141</span>      if (beanContext != null &amp;&amp; 
beanContext.cmCache != null)<a name="line.141"></a>
 <span class="sourceLineNo">142</span>         
beanContext.cmCache.put(innerClass, this);<a name="line.142"></a>
 <span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>      this.implClass = implClass;<a 
name="line.144"></a>
-<span class="sourceLineNo">145</span>      this.childPojoSwaps = 
childPojoSwaps;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      this.childSwapMap = childPojoSwaps 
== null ? null : new 
ConcurrentHashMap&lt;Class&lt;?&gt;,PojoSwap&lt;?,?&gt;&gt;();<a 
name="line.146"></a>
-<span class="sourceLineNo">147</span>      this.childUnswapMap = 
childPojoSwaps == null ? null : new 
ConcurrentHashMap&lt;Class&lt;?&gt;,PojoSwap&lt;?,?&gt;&gt;();<a 
name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>      Class&lt;T&gt; c = innerClass;<a 
name="line.149"></a>
-<span class="sourceLineNo">150</span>      ClassCategory _cc = 
ClassCategory.OTHER;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      boolean _isDelegate = false;<a 
name="line.151"></a>
-<span class="sourceLineNo">152</span>      Method<a name="line.152"></a>
-<span class="sourceLineNo">153</span>         _fromStringMethod = null,<a 
name="line.153"></a>
-<span class="sourceLineNo">154</span>         _swapMethod = null,<a 
name="line.154"></a>
-<span class="sourceLineNo">155</span>         _unswapMethod = null,<a 
name="line.155"></a>
-<span class="sourceLineNo">156</span>         _parentPropertyMethod = null,<a 
name="line.156"></a>
-<span class="sourceLineNo">157</span>         _namePropertyMethod = null;<a 
name="line.157"></a>
-<span class="sourceLineNo">158</span>      Constructor&lt;T&gt;<a 
name="line.158"></a>
-<span class="sourceLineNo">159</span>         _noArgConstructor = null,<a 
name="line.159"></a>
-<span class="sourceLineNo">160</span>         _stringConstructor = null,<a 
name="line.160"></a>
-<span class="sourceLineNo">161</span>         _swapConstructor = null,<a 
name="line.161"></a>
-<span class="sourceLineNo">162</span>         _numberConstructor = null;<a 
name="line.162"></a>
-<span class="sourceLineNo">163</span>      Class&lt;?&gt;<a 
name="line.163"></a>
-<span class="sourceLineNo">164</span>         _swapMethodType = null,<a 
name="line.164"></a>
-<span class="sourceLineNo">165</span>         _numberConstructorType = null;<a 
name="line.165"></a>
-<span class="sourceLineNo">166</span>      Object _primitiveDefault = null;<a 
name="line.166"></a>
-<span class="sourceLineNo">167</span>      Map&lt;String,Method&gt;<a 
name="line.167"></a>
-<span class="sourceLineNo">168</span>         _publicMethods = new 
LinkedHashMap&lt;String,Method&gt;(),<a name="line.168"></a>
-<span class="sourceLineNo">169</span>         _remoteableMethods = null;<a 
name="line.169"></a>
-<span class="sourceLineNo">170</span>      ClassMeta&lt;?&gt;<a 
name="line.170"></a>
-<span class="sourceLineNo">171</span>         _keyType = null,<a 
name="line.171"></a>
-<span class="sourceLineNo">172</span>         _valueType = null,<a 
name="line.172"></a>
-<span class="sourceLineNo">173</span>         _elementType = null,<a 
name="line.173"></a>
-<span class="sourceLineNo">174</span>         _serializedClassMeta = null;<a 
name="line.174"></a>
-<span class="sourceLineNo">175</span>      String<a name="line.175"></a>
-<span class="sourceLineNo">176</span>         _notABeanReason = null,<a 
name="line.176"></a>
-<span class="sourceLineNo">177</span>         _dictionaryName = null,<a 
name="line.177"></a>
-<span class="sourceLineNo">178</span>         _resolvedDictionaryName = 
null;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      Throwable _initException = null;<a 
name="line.179"></a>
-<span class="sourceLineNo">180</span>      BeanMeta _beanMeta = null;<a 
name="line.180"></a>
-<span class="sourceLineNo">181</span>      PojoSwap _pojoSwap = null;<a 
name="line.181"></a>
-<span class="sourceLineNo">182</span>      InvocationHandler 
_invocationHandler = null;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      BeanRegistry _beanRegistry = 
null;<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>      if (c.isPrimitive()) {<a 
name="line.185"></a>
-<span class="sourceLineNo">186</span>         if (c == Boolean.TYPE)<a 
name="line.186"></a>
-<span class="sourceLineNo">187</span>            _cc = BOOLEAN;<a 
name="line.187"></a>
-<span class="sourceLineNo">188</span>         else if (c == Byte.TYPE || c == 
Short.TYPE || c == Integer.TYPE || c == Long.TYPE || c == Float.TYPE || c == 
Double.TYPE) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>            if (c == Float.TYPE || c == 
Double.TYPE)<a name="line.189"></a>
-<span class="sourceLineNo">190</span>               _cc = DECIMAL;<a 
name="line.190"></a>
-<span class="sourceLineNo">191</span>            else<a name="line.191"></a>
-<span class="sourceLineNo">192</span>               _cc = NUMBER;<a 
name="line.192"></a>
-<span class="sourceLineNo">193</span>         }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>         else if (c == Character.TYPE)<a 
name="line.194"></a>
-<span class="sourceLineNo">195</span>            _cc = CHAR;<a 
name="line.195"></a>
-<span class="sourceLineNo">196</span>      } else {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>         if 
(isParentClass(Delegate.class, c))<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            _isDelegate = true;<a 
name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>         if (c == Object.class)<a 
name="line.200"></a>
-<span class="sourceLineNo">201</span>            _cc = OBJ;<a 
name="line.201"></a>
-<span class="sourceLineNo">202</span>         else if (c.isEnum())<a 
name="line.202"></a>
-<span class="sourceLineNo">203</span>            _cc = ENUM;<a 
name="line.203"></a>
-<span class="sourceLineNo">204</span>         else if 
(c.equals(Class.class))<a name="line.204"></a>
-<span class="sourceLineNo">205</span>            _cc = CLASS;<a 
name="line.205"></a>
-<span class="sourceLineNo">206</span>         else if 
(isParentClass(CharSequence.class, c)) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>            if (c.equals(String.class))<a 
name="line.207"></a>
-<span class="sourceLineNo">208</span>               _cc = STR;<a 
name="line.208"></a>
-<span class="sourceLineNo">209</span>            else<a name="line.209"></a>
-<span class="sourceLineNo">210</span>               _cc = CHARSEQ;<a 
name="line.210"></a>
-<span class="sourceLineNo">211</span>         }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>         else if 
(isParentClass(Number.class, c)) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>            if 
(isParentClass(Float.class, c) || isParentClass(Double.class, c))<a 
name="line.213"></a>
-<span class="sourceLineNo">214</span>               _cc = DECIMAL;<a 
name="line.214"></a>
-<span class="sourceLineNo">215</span>            else<a name="line.215"></a>
-<span class="sourceLineNo">216</span>               _cc = NUMBER;<a 
name="line.216"></a>
-<span class="sourceLineNo">217</span>         }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>         else if 
(isParentClass(Collection.class, c))<a name="line.218"></a>
-<span class="sourceLineNo">219</span>            _cc = COLLECTION;<a 
name="line.219"></a>
-<span class="sourceLineNo">220</span>         else if 
(isParentClass(Map.class, c)) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>            if 
(isParentClass(BeanMap.class, c))<a name="line.221"></a>
-<span class="sourceLineNo">222</span>               _cc = BEANMAP;<a 
name="line.222"></a>
-<span class="sourceLineNo">223</span>            else<a name="line.223"></a>
-<span class="sourceLineNo">224</span>               _cc = MAP;<a 
name="line.224"></a>
-<span class="sourceLineNo">225</span>         }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>         else if (c == Character.class)<a 
name="line.226"></a>
-<span class="sourceLineNo">227</span>            _cc = CHAR;<a 
name="line.227"></a>
-<span class="sourceLineNo">228</span>         else if (c == Boolean.class)<a 
name="line.228"></a>
-<span class="sourceLineNo">229</span>            _cc = BOOLEAN;<a 
name="line.229"></a>
-<span class="sourceLineNo">230</span>         else if 
(isParentClass(Date.class, c) || isParentClass(Calendar.class, c))<a 
name="line.230"></a>
-<span class="sourceLineNo">231</span>            _cc = DATE;<a 
name="line.231"></a>
-<span class="sourceLineNo">232</span>         else if (c.isArray())<a 
name="line.232"></a>
-<span class="sourceLineNo">233</span>            _cc = ARRAY;<a 
name="line.233"></a>
-<span class="sourceLineNo">234</span>         else if 
(isParentClass(URL.class, c) || isParentClass(URI.class, c) || 
c.isAnnotationPresent(org.apache.juneau.annotation.URI.class))<a 
name="line.234"></a>
-<span class="sourceLineNo">235</span>            _cc = URI;<a 
name="line.235"></a>
-<span class="sourceLineNo">236</span>         else if 
(isParentClass(Reader.class, c))<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            _cc = READER;<a 
name="line.237"></a>
-<span class="sourceLineNo">238</span>         else if 
(isParentClass(InputStream.class, c))<a name="line.238"></a>
-<span class="sourceLineNo">239</span>            _cc = INPUTSTREAM;<a 
name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>      isMemberClass = c.isMemberClass() 
&amp;&amp; ! isStatic(c);<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>      // Find static fromString(String) 
or equivalent method.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      // fromString() must be checked 
before valueOf() so that Enum classes can create their own<a 
name="line.245"></a>
-<span class="sourceLineNo">246</span>      //    specialized fromString() 
methods to override the behavior of Enum.valueOf(String).<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      // valueOf() is used by enums.<a 
name="line.247"></a>
-<span class="sourceLineNo">248</span>      // parse() is used by the java 
logging Level class.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      // forName() is used by Class and 
Charset<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      for (String methodName : new 
String[]{"fromString","valueOf","parse","parseString","forName","forString"}) 
{<a name="line.250"></a>
-<span class="sourceLineNo">251</span>         if (_fromStringMethod == null) 
{<a name="line.251"></a>
-<span class="sourceLineNo">252</span>            for (Method m : 
c.getMethods()) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>               if (isStatic(m) &amp;&amp; 
isPublic(m) &amp;&amp; isNotDeprecated(m)) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>                  String mName = 
m.getName();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>                  if 
(mName.equals(methodName) &amp;&amp; m.getReturnType() == c) {<a 
name="line.255"></a>
-<span class="sourceLineNo">256</span>                     Class&lt;?&gt;[] 
args = m.getParameterTypes();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                     if (args.length == 1 
&amp;&amp; args[0] == String.class) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>                        _fromStringMethod 
= m;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>                        break;<a 
name="line.259"></a>
-<span class="sourceLineNo">260</span>                     }<a 
name="line.260"></a>
-<span class="sourceLineNo">261</span>                  }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>               }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>         }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      }<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>      // Special cases<a 
name="line.267"></a>
-<span class="sourceLineNo">268</span>      try {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>         if (c == TimeZone.class)<a 
name="line.269"></a>
-<span class="sourceLineNo">270</span>            _fromStringMethod = 
c.getMethod("getTimeZone", String.class);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>         else if (c == Locale.class)<a 
name="line.271"></a>
-<span class="sourceLineNo">272</span>            _fromStringMethod = 
LocaleAsString.class.getMethod("fromString", String.class);<a 
name="line.272"></a>
-<span class="sourceLineNo">273</span>      } catch (NoSuchMethodException e1) 
{}<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>      // Find swap() method if present.<a 
name="line.275"></a>
-<span class="sourceLineNo">276</span>      for (Method m : c.getMethods()) {<a 
name="line.276"></a>
-<span class="sourceLineNo">277</span>         if (isPublic(m) &amp;&amp; 
isNotDeprecated(m) &amp;&amp; ! isStatic(m)) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            String mName = m.getName();<a 
name="line.278"></a>
-<span class="sourceLineNo">279</span>            if (mName.equals("swap")) {<a 
name="line.279"></a>
-<span class="sourceLineNo">280</span>               Class&lt;?&gt;[] pt = 
m.getParameterTypes();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>               if (pt.length == 1 
&amp;&amp; pt[0] == BeanSession.class) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>                  _swapMethod = m;<a 
name="line.282"></a>
-<span class="sourceLineNo">283</span>                  _swapMethodType = 
m.getReturnType();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>                  break;<a 
name="line.284"></a>
-<span class="sourceLineNo">285</span>               }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>         }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // Find unswap() method if 
present.<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      if (_swapMethod != null) {<a 
name="line.290"></a>
-<span class="sourceLineNo">291</span>         for (Method m : c.getMethods()) 
{<a name="line.291"></a>
-<span class="sourceLineNo">292</span>            if (isPublic(m) &amp;&amp; 
isNotDeprecated(m) &amp;&amp; isStatic(m)) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>               String mName = 
m.getName();<a name="line.293"></a>
-<span class="sourceLineNo">294</span>               if 
(mName.equals("unswap")) {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                  Class&lt;?&gt;[] pt = 
m.getParameterTypes();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                  if (pt.length == 2 
&amp;&amp; pt[0] == BeanSession.class &amp;&amp; pt[1] == _swapMethodType) {<a 
name="line.296"></a>
-<span class="sourceLineNo">297</span>                     _unswapMethod = m;<a 
name="line.297"></a>
-<span class="sourceLineNo">298</span>                     break;<a 
name="line.298"></a>
-<span class="sourceLineNo">299</span>                  }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>               }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>         }<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      }<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>      // Find @NameProperty and 
@ParentProperty methods if present.<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      for (Method m : 
c.getDeclaredMethods()) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>         if 
(m.isAnnotationPresent(ParentProperty.class) &amp;&amp; 
m.getParameterTypes().length == 1) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            m.setAccessible(true);<a 
name="line.308"></a>
-<span class="sourceLineNo">309</span>            _parentPropertyMethod = m;<a 
name="line.309"></a>
-<span class="sourceLineNo">310</span>         }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>         if 
(m.isAnnotationPresent(NameProperty.class) &amp;&amp; 
m.getParameterTypes().length == 1) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            m.setAccessible(true);<a 
name="line.312"></a>
-<span class="sourceLineNo">313</span>            _namePropertyMethod = m;<a 
name="line.313"></a>
-<span class="sourceLineNo">314</span>         }<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span><a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // Note:  Primitive types are 
normally abstract.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      isAbstract = 
Modifier.isAbstract(c.getModifiers()) &amp;&amp; ! c.isPrimitive();<a 
name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Find constructor(String) method 
if present.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      for (Constructor cs : 
c.getConstructors()) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>         if (isPublic(cs) &amp;&amp; 
isNotDeprecated(cs)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>            Class&lt;?&gt;[] args = 
cs.getParameterTypes();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>            if (args.length == 
(isMemberClass ? 1 : 0) &amp;&amp; c != Object.class &amp;&amp; ! isAbstract) 
{<a name="line.324"></a>
-<span class="sourceLineNo">325</span>               _noArgConstructor = cs;<a 
name="line.325"></a>
-<span class="sourceLineNo">326</span>            } else if (args.length == 
(isMemberClass ? 2 : 1)) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>               Class&lt;?&gt; arg = 
args[(isMemberClass ? 1 : 0)];<a name="line.327"></a>
-<span class="sourceLineNo">328</span>               if (arg == String.class)<a 
name="line.328"></a>
-<span class="sourceLineNo">329</span>                  _stringConstructor = 
cs;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>               else if (_swapMethodType 
!= null &amp;&amp; _swapMethodType.isAssignableFrom(arg))<a name="line.330"></a>
-<span class="sourceLineNo">331</span>                  _swapConstructor = 
cs;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>               else if (_cc != NUMBER 
&amp;&amp; (Number.class.isAssignableFrom(arg) || (arg.isPrimitive() &amp;&amp; 
(arg == int.class || arg == short.class || arg == long.class || arg == 
float.class || arg == double.class)))) {<a name="line.332"></a>
-<span class="sourceLineNo">333</span>                  _numberConstructor = 
cs;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                  _numberConstructorType 
= ClassUtils.getWrapperIfPrimitive(arg);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>               }<a name="line.335"></a>
-<span class="sourceLineNo">336</span>            }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>         }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>      if (c.isPrimitive()) {<a 
name="line.340"></a>
-<span class="sourceLineNo">341</span>         if (c == Boolean.TYPE)<a 
name="line.341"></a>
-<span class="sourceLineNo">342</span>            _primitiveDefault = 
BOOLEAN_DEFAULT;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>         else if (c == Character.TYPE)<a 
name="line.343"></a>
-<span class="sourceLineNo">344</span>            _primitiveDefault = 
CHARACTER_DEFAULT;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>         else if (c == Short.TYPE)<a 
name="line.345"></a>
-<span class="sourceLineNo">346</span>            _primitiveDefault = 
SHORT_DEFAULT;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>         else if (c == Integer.TYPE)<a 
name="line.347"></a>
-<span class="sourceLineNo">348</span>            _primitiveDefault = 
INTEGER_DEFAULT;<a name="line.348"></a>
-<span class="sourceLineNo">349</span>         else if (c == Long.TYPE)<a 
name="line.349"></a>
-<span class="sourceLineNo">350</span>            _primitiveDefault = 
LONG_DEFAULT;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>         else if (c == Float.TYPE)<a 
name="line.351"></a>
-<span class="sourceLineNo">352</span>            _primitiveDefault = 
FLOAT_DEFAULT;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>         else if (c == Double.TYPE)<a 
name="line.353"></a>
-<span class="sourceLineNo">354</span>            _primitiveDefault = 
DOUBLE_DEFAULT;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>         else if (c == Byte.TYPE)<a 
name="line.355"></a>
-<span class="sourceLineNo">356</span>            _primitiveDefault = 
BYTE_DEFAULT;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      } else {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>         if (c == Boolean.class)<a 
name="line.358"></a>
-<span class="sourceLineNo">359</span>            _primitiveDefault = 
BOOLEAN_DEFAULT;<a name="line.359"></a>
-<span class="sourceLineNo">360</span>         else if (c == Character.class)<a 
name="line.360"></a>
-<span class="sourceLineNo">361</span>            _primitiveDefault = 
CHARACTER_DEFAULT;<a name="line.361"></a>
-<span class="sourceLineNo">362</span>         else if (c == Short.class)<a 
name="line.362"></a>
-<span class="sourceLineNo">363</span>            _primitiveDefault = 
SHORT_DEFAULT;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>         else if (c == Integer.class)<a 
name="line.364"></a>
-<span class="sourceLineNo">365</span>            _primitiveDefault = 
INTEGER_DEFAULT;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>         else if (c == Long.class)<a 
name="line.366"></a>
-<span class="sourceLineNo">367</span>            _primitiveDefault = 
LONG_DEFAULT;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>         else if (c == Float.class)<a 
name="line.368"></a>
-<span class="sourceLineNo">369</span>            _primitiveDefault = 
FLOAT_DEFAULT;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>         else if (c == Double.class)<a 
name="line.370"></a>
-<span class="sourceLineNo">371</span>            _primitiveDefault = 
DOUBLE_DEFAULT;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>         else if (c == Byte.class)<a 
name="line.372"></a>
-<span class="sourceLineNo">373</span>            _primitiveDefault = 
BYTE_DEFAULT;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      }<a name="line.374"></a>
+<span class="sourceLineNo">144</span>      ClassMetaBuilder&lt;T&gt; builder = 
new ClassMetaBuilder(innerClass, beanContext, implClass, beanFilter, pojoSwap, 
childPojoSwaps);<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>      this.cc = builder.cc;<a 
name="line.146"></a>
+<span class="sourceLineNo">147</span>      this.isDelegate = 
builder.isDelegate;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      this.fromStringMethod = 
builder.fromStringMethod;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      this.swapMethod = 
builder.swapMethod;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      this.unswapMethod = 
builder.unswapMethod;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      this.swapMethodType = 
builder.swapMethodType;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.parentPropertyMethod = 
builder.parentPropertyMethod;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.namePropertyMethod = 
builder.namePropertyMethod;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      this.noArgConstructor = 
builder.noArgConstructor;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.stringConstructor = 
builder.stringConstructor;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      this.swapConstructor = 
builder.swapConstructor;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      this.numberConstructor = 
builder.numberConstructor;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      this.numberConstructorType = 
builder.numberConstructorType;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      this.primitiveDefault = 
builder.primitiveDefault;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.publicMethods = 
builder.publicMethods;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.remoteableMethods = 
builder.remoteableMethods;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      this.beanFilter = beanFilter;<a 
name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.pojoSwap = builder.pojoSwap;<a 
name="line.163"></a>
+<span class="sourceLineNo">164</span>      this.extMeta = new MetadataMap();<a 
name="line.164"></a>
+<span class="sourceLineNo">165</span>      this.keyType = builder.keyType;<a 
name="line.165"></a>
+<span class="sourceLineNo">166</span>      this.valueType = 
builder.valueType;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      this.elementType = 
builder.elementType;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      this.notABeanReason = 
builder.notABeanReason;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>      this.beanMeta = builder.beanMeta;<a 
name="line.169"></a>
+<span class="sourceLineNo">170</span>      this.initException = 
builder.initException;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      this.dictionaryName = 
builder.dictionaryName;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.resolvedDictionaryName = 
builder.resolvedDictionaryName;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      this.serializedClassMeta = 
builder.serializedClassMeta;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.invocationHandler = 
builder.invocationHandler;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      this.beanRegistry = 
builder.beanRegistry;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.isMemberClass = 
builder.isMemberClass;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      this.isAbstract = 
builder.isAbstract;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      this.implClass = 
builder.implClass;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      this.childUnswapMap = 
builder.childUnswapMap;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.childSwapMap = 
builder.childSwapMap;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.childPojoSwaps = 
builder.childPojoSwaps;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>   /**<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    * Copy constructor.<a 
name="line.185"></a>
+<span class="sourceLineNo">186</span>    * Used for creating Map and 
Collection class metas that shouldn't be cached.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   ClassMeta(ClassMeta&lt;T&gt; mainType, 
ClassMeta&lt;?&gt; keyType, ClassMeta&lt;?&gt; valueType, ClassMeta&lt;?&gt; 
elementType) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.innerClass = 
mainType.innerClass;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      this.implClass = 
mainType.implClass;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      this.childPojoSwaps = 
mainType.childPojoSwaps;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      this.childSwapMap = 
mainType.childSwapMap;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.childUnswapMap = 
mainType.childUnswapMap;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      this.cc = mainType.cc;<a 
name="line.194"></a>
+<span class="sourceLineNo">195</span>      this.fromStringMethod = 
mainType.fromStringMethod;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      this.noArgConstructor = 
mainType.noArgConstructor;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      this.stringConstructor = 
mainType.stringConstructor;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      this.numberConstructor = 
mainType.numberConstructor;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      this.swapConstructor = 
mainType.swapConstructor;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      this.swapMethodType = 
mainType.swapMethodType;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      this.numberConstructorType = 
mainType.numberConstructorType;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      this.swapMethod = 
mainType.swapMethod;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      this.unswapMethod = 
mainType.unswapMethod;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      this.namePropertyMethod = 
mainType.namePropertyMethod;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      this.parentPropertyMethod = 
mainType.parentPropertyMethod;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      this.isDelegate = 
mainType.isDelegate;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      this.isAbstract = 
mainType.isAbstract;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      this.isMemberClass = 
mainType.isMemberClass;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      this.primitiveDefault = 
mainType.primitiveDefault;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      this.remoteableMethods = 
mainType.remoteableMethods;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      this.publicMethods = 
mainType.publicMethods;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      this.beanContext = 
mainType.beanContext;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      this.serializedClassMeta = this;<a 
name="line.213"></a>
+<span class="sourceLineNo">214</span>      this.elementType = elementType;<a 
name="line.214"></a>
+<span class="sourceLineNo">215</span>      this.keyType = keyType;<a 
name="line.215"></a>
+<span class="sourceLineNo">216</span>      this.valueType = valueType;<a 
name="line.216"></a>
+<span class="sourceLineNo">217</span>      this.invocationHandler = 
mainType.invocationHandler;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      this.beanMeta = 
mainType.beanMeta;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      this.dictionaryName = 
mainType.dictionaryName;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.resolvedDictionaryName = 
mainType.resolvedDictionaryName;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.notABeanReason = 
mainType.notABeanReason;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      this.pojoSwap = 
mainType.pojoSwap;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      this.beanFilter = 
mainType.beanFilter;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      this.extMeta = mainType.extMeta;<a 
name="line.224"></a>
+<span class="sourceLineNo">225</span>      this.initException = 
mainType.initException;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      this.beanRegistry = 
mainType.beanRegistry;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   }<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>   
@SuppressWarnings({"unchecked","rawtypes","hiding"})<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   private class 
ClassMetaBuilder&lt;T&gt; {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      Class&lt;T&gt; innerClass;<a 
name="line.231"></a>
+<span class="sourceLineNo">232</span>      Class&lt;? extends T&gt; 
implClass;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      BeanContext beanContext;<a 
name="line.233"></a>
+<span class="sourceLineNo">234</span>      ClassCategory cc = 
ClassCategory.OTHER;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      boolean<a name="line.235"></a>
+<span class="sourceLineNo">236</span>         isDelegate = false,<a 
name="line.236"></a>
+<span class="sourceLineNo">237</span>         isMemberClass = false,<a 
name="line.237"></a>
+<span class="sourceLineNo">238</span>         isAbstract = false;<a 
name="line.238"></a>
+<span class="sourceLineNo">239</span>      Method<a name="line.239"></a>
+<span class="sourceLineNo">240</span>         fromStringMethod = null,<a 
name="line.240"></a>
+<span class="sourceLineNo">241</span>         swapMethod = null,<a 
name="line.241"></a>
+<span class="sourceLineNo">242</span>         unswapMethod = null,<a 
name="line.242"></a>
+<span class="sourceLineNo">243</span>         parentPropertyMethod = null,<a 
name="line.243"></a>
+<span class="sourceLineNo">244</span>         namePropertyMethod = null;<a 
name="line.244"></a>
+<span class="sourceLineNo">245</span>      Constructor&lt;T&gt;<a 
name="line.245"></a>
+<span class="sourceLineNo">246</span>         noArgConstructor = null,<a 
name="line.246"></a>
+<span class="sourceLineNo">247</span>         stringConstructor = null,<a 
name="line.247"></a>
+<span class="sourceLineNo">248</span>         swapConstructor = null,<a 
name="line.248"></a>
+<span class="sourceLineNo">249</span>         numberConstructor = null;<a 
name="line.249"></a>
+<span class="sourceLineNo">250</span>      Class&lt;?&gt;<a 
name="line.250"></a>
+<span class="sourceLineNo">251</span>         swapMethodType = null,<a 
name="line.251"></a>
+<span class="sourceLineNo">252</span>         numberConstructorType = null;<a 
name="line.252"></a>
+<span class="sourceLineNo">253</span>      Object primitiveDefault = null;<a 
name="line.253"></a>
+<span class="sourceLineNo">254</span>      Map&lt;String,Method&gt;<a 
name="line.254"></a>
+<span class="sourceLineNo">255</span>         publicMethods = new 
LinkedHashMap&lt;String,Method&gt;(),<a name="line.255"></a>
+<span class="sourceLineNo">256</span>         remoteableMethods = null;<a 
name="line.256"></a>
+<span class="sourceLineNo">257</span>      ClassMeta&lt;?&gt;<a 
name="line.257"></a>
+<span class="sourceLineNo">258</span>         keyType = null,<a 
name="line.258"></a>
+<span class="sourceLineNo">259</span>         valueType = null,<a 
name="line.259"></a>
+<span class="sourceLineNo">260</span>         elementType = null,<a 
name="line.260"></a>
+<span class="sourceLineNo">261</span>         serializedClassMeta = null;<a 
name="line.261"></a>
+<span class="sourceLineNo">262</span>      String<a name="line.262"></a>
+<span class="sourceLineNo">263</span>         notABeanReason = null,<a 
name="line.263"></a>
+<span class="sourceLineNo">264</span>         dictionaryName = null,<a 
name="line.264"></a>
+<span class="sourceLineNo">265</span>         resolvedDictionaryName = null;<a 
name="line.265"></a>
+<span class="sourceLineNo">266</span>      Throwable initException = null;<a 
name="line.266"></a>
+<span class="sourceLineNo">267</span>      BeanMeta beanMeta = null;<a 
name="line.267"></a>
+<span class="sourceLineNo">268</span>      PojoSwap pojoSwap = null;<a 
name="line.268"></a>
+<span class="sourceLineNo">269</span>      InvocationHandler invocationHandler 
= null;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      BeanRegistry beanRegistry = null;<a 
name="line.270"></a>
+<span class="sourceLineNo">271</span>      PojoSwap&lt;?,?&gt;[] 
childPojoSwaps;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      
ConcurrentHashMap&lt;Class&lt;?&gt;,PojoSwap&lt;?,?&gt;&gt;<a 
name="line.272"></a>
+<span class="sourceLineNo">273</span>         childSwapMap,<a 
name="line.273"></a>
+<span class="sourceLineNo">274</span>         childUnswapMap;<a 
name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>      private 
ClassMetaBuilder(Class&lt;T&gt; innerClass, BeanContext beanContext, Class&lt;? 
extends T&gt; implClass, BeanFilter beanFilter, PojoSwap&lt;T,?&gt; pojoSwap, 
PojoSwap&lt;?,?&gt;[] childPojoSwaps) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>         this.innerClass = innerClass;<a 
name="line.277"></a>
+<span class="sourceLineNo">278</span>         this.beanContext = 
beanContext;<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>         this.implClass = implClass;<a 
name="line.280"></a>
+<span class="sourceLineNo">281</span>         this.childPojoSwaps = 
childPojoSwaps;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>         this.childSwapMap = 
childPojoSwaps == null ? null : new 
ConcurrentHashMap&lt;Class&lt;?&gt;,PojoSwap&lt;?,?&gt;&gt;();<a 
name="line.282"></a>
+<span class="sourceLineNo">283</span>         this.childUnswapMap = 
childPojoSwaps == null ? null : new 
ConcurrentHashMap&lt;Class&lt;?&gt;,PojoSwap&lt;?,?&gt;&gt;();<a 
name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>         Class&lt;T&gt; c = innerClass;<a 
name="line.285"></a>
+<span class="sourceLineNo">286</span>         if (c.isPrimitive()) {<a 
name="line.286"></a>
+<span class="sourceLineNo">287</span>            if (c == Boolean.TYPE)<a 
name="line.287"></a>
+<span class="sourceLineNo">288</span>               cc = BOOLEAN;<a 
name="line.288"></a>
+<span class="sourceLineNo">289</span>            else if (c == Byte.TYPE || c 
== Short.TYPE || c == Integer.TYPE || c == Long.TYPE || c == Float.TYPE || c == 
Double.TYPE) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>               if (c == Float.TYPE || c 
== Double.TYPE)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>                  cc = DECIMAL;<a 
name="line.291"></a>
+<span class="sourceLineNo">292</span>               else<a name="line.292"></a>
+<span class="sourceLineNo">293</span>                  cc = NUMBER;<a 
name="line.293"></a>
+<span class="sourceLineNo">294</span>            }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>            else if (c == 
Character.TYPE)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>               cc = CHAR;<a 
name="line.296"></a>
+<span class="sourceLineNo">297</span>         } else {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>            if 
(isParentClass(Delegate.class, c))<a name="line.298"></a>
+<span class="sourceLineNo">299</span>               isDelegate = true;<a 
name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>            if (c == Object.class)<a 
name="line.301"></a>
+<span class="sourceLineNo">302</span>               cc = OBJ;<a 
name="line.302"></a>
+<span class="sourceLineNo">303</span>            else if (c.isEnum())<a 
name="line.303"></a>
+<span class="sourceLineNo">304</span>               cc = ENUM;<a 
name="line.304"></a>
+<span class="sourceLineNo">305</span>            else if 
(c.equals(Class.class))<a name="line.305"></a>
+<span class="sourceLineNo">306</span>               cc = CLASS;<a 
name="line.306"></a>
+<span class="sourceLineNo">307</span>            else if 
(isParentClass(CharSequence.class, c)) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>               if 
(c.equals(String.class))<a name="line.308"></a>
+<span class="sourceLineNo">309</span>                  cc = STR;<a 
name="line.309"></a>
+<span class="sourceLineNo">310</span>               else<a name="line.310"></a>
+<span class="sourceLineNo">311</span>                  cc = CHARSEQ;<a 
name="line.311"></a>
+<span class="sourceLineNo">312</span>            }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>            else if 
(isParentClass(Number.class, c)) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>               if 
(isParentClass(Float.class, c) || isParentClass(Double.class, c))<a 
name="line.314"></a>
+<span class="sourceLineNo">315</span>                  cc = DECIMAL;<a 
name="line.315"></a>
+<span class="sourceLineNo">316</span>               else<a name="line.316"></a>
+<span class="sourceLineNo">317</span>                  cc = NUMBER;<a 
name="line.317"></a>
+<span class="sourceLineNo">318</span>            }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            else if 
(isParentClass(Collection.class, c))<a name="line.319"></a>
+<span class="sourceLineNo">320</span>               cc = COLLECTION;<a 
name="line.320"></a>
+<span class="sourceLineNo">321</span>            else if 
(isParentClass(Map.class, c)) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>               if 
(isParentClass(BeanMap.class, c))<a name="line.322"></a>
+<span class="sourceLineNo">323</span>                  cc = BEANMAP;<a 
name="line.323"></a>
+<span class="sourceLineNo">324</span>               else<a name="line.324"></a>
+<span class="sourceLineNo">325</span>                  cc = MAP;<a 
name="line.325"></a>
+<span class="sourceLineNo">326</span>            }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>            else if (c == 
Character.class)<a name="line.327"></a>
+<span class="sourceLineNo">328</span>               cc = CHAR;<a 
name="line.328"></a>
+<span class="sourceLineNo">329</span>            else if (c == 
Boolean.class)<a name="line.329"></a>
+<span class="sourceLineNo">330</span>               cc = BOOLEAN;<a 
name="line.330"></a>
+<span class="sourceLineNo">331</span>            else if 
(isParentClass(Date.class, c) || isParentClass(Calendar.class, c))<a 
name="line.331"></a>
+<span class="sourceLineNo">332</span>               cc = DATE;<a 
name="line.332"></a>
+<span class="sourceLineNo">333</span>            else if (c.isArray())<a 
name="line.333"></a>
+<span class="sourceLineNo">334</span>               cc = ARRAY;<a 
name="line.334"></a>
+<span class="sourceLineNo">335</span>            else if 
(isParentClass(URL.class, c) || isParentClass(URI.class, c) || 
c.isAnnotationPresent(org.apache.juneau.annotation.URI.class))<a 
name="line.335"></a>
+<span class="sourceLineNo">336</span>               cc = URI;<a 
name="line.336"></a>
+<span class="sourceLineNo">337</span>            else if 
(isParentClass(Reader.class, c))<a name="line.337"></a>
+<span class="sourceLineNo">338</span>               cc = READER;<a 
name="line.338"></a>
+<span class="sourceLineNo">339</span>            else if 
(isParentClass(InputStream.class, c))<a name="line.339"></a>
+<span class="sourceLineNo">340</span>               cc = INPUTSTREAM;<a 
name="line.340"></a>
+<span class="sourceLineNo">341</span>         }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>         isMemberClass = 
c.isMemberClass() &amp;&amp; ! isStatic(c);<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>         // Find static 
fromString(String) or equivalent method.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>         // fromString() must be checked 
before valueOf() so that Enum classes can create their own<a 
name="line.346"></a>
+<span class="sourceLineNo">347</span>         //    specialized fromString() 
methods to override the behavior of Enum.valueOf(String).<a name="line.347"></a>
+<span class="sourceLineNo">348</span>         // valueOf() is used by enums.<a 
name="line.348"></a>
+<span class="sourceLineNo">349</span>         // parse() is used by the java 
logging Level class.<a name="line.349"></a>
+<span class="sourceLineNo">350</span>         // forName() is used by Class 
and Charset<a name="line.350"></a>
+<span class="sourceLineNo">351</span>         for (String methodName : new 
String[]{"fromString","valueOf","parse","parseString","forName","forString"}) 
{<a name="line.351"></a>
+<span class="sourceLineNo">352</span>            if (fromStringMethod == null) 
{<a name="line.352"></a>
+<span class="sourceLineNo">353</span>               for (Method m : 
c.getMethods()) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                  if (isStatic(m) 
&amp;&amp; isPublic(m) &amp;&amp; isNotDeprecated(m)) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>                     String mName = 
m.getName();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>                     if 
(mName.equals(methodName) &amp;&amp; m.getReturnType() == c) {<a 
name="line.356"></a>
+<span class="sourceLineNo">357</span>                        Class&lt;?&gt;[] 
args = m.getParameterTypes();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>                        if (args.length 
== 1 &amp;&amp; args[0] == String.class) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>                           
fromStringMethod = m;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>                           break;<a 
name="line.360"></a>
+<span class="sourceLineNo">361</span>                        }<a 
name="line.361"></a>
+<span class="sourceLineNo">362</span>                     }<a 
name="line.362"></a>
+<span class="sourceLineNo">363</span>                  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span>               }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>            }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>         }<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>         // Special cases<a 
name="line.368"></a>
+<span class="sourceLineNo">369</span>         try {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>            if (c == TimeZone.class)<a 
name="line.370"></a>
+<span class="sourceLineNo">371</span>               fromStringMethod = 
c.getMethod("getTimeZone", String.class);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>            else if (c == Locale.class)<a 
name="line.372"></a>
+<span class="sourceLineNo">373</span>               fromStringMethod = 
LocaleAsString.class.getMethod("fromString", String.class);<a 
name="line.373"></a>
+<span class="sourceLineNo">374</span>         } catch (NoSuchMethodException 
e1) {}<a name="line.374"></a>
 <span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>      for (Method m : c.getMethods())<a 
name="line.376"></a>
-<span class="sourceLineNo">377</span>         if (isPublic(m) &amp;&amp; 
isNotDeprecated(m))<a name="line.377"></a>
-<span class="sourceLineNo">378</span>            
_publicMethods.put(ClassUtils.getMethodSignature(m), m);<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>      if 
(c.getAnnotation(Remoteable.class) != null) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>         _remoteableMethods = 
_publicMethods;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      } else {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>         for (Method m : c.getMethods()) 
{<a name="line.383"></a>
-<span class="sourceLineNo">384</span>            if 
(m.getAnnotation(Remoteable.class) != null) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>               if (_remoteableMethods == 
null)<a name="line.385"></a>
-<span class="sourceLineNo">386</span>                  _remoteableMethods = 
new LinkedHashMap&lt;String,Method&gt;();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>               
_remoteableMethods.put(ClassUtils.getMethodSignature(m), m);<a 
name="line.387"></a>
+<span class="sourceLineNo">376</span>         // Find swap() method if 
present.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>         for (Method m : c.getMethods()) 
{<a name="line.377"></a>
+<span class="sourceLineNo">378</span>            if (isPublic(m) &amp;&amp; 
isNotDeprecated(m) &amp;&amp; ! isStatic(m)) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>               String mName = 
m.getName();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>               if (mName.equals("swap")) 
{<a name="line.380"></a>
+<span class="sourceLineNo">381</span>                  Class&lt;?&gt;[] pt = 
m.getParameterTypes();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>                  if (pt.length == 1 
&amp;&amp; pt[0] == BeanSession.class) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>                     swapMethod = m;<a 
name="line.383"></a>
+<span class="sourceLineNo">384</span>                     swapMethodType = 
m.getReturnType();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>                     break;<a 
name="line.385"></a>
+<span class="sourceLineNo">386</span>                  }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>               }<a name="line.387"></a>
 <span class="sourceLineNo">388</span>            }<a name="line.388"></a>
 <span class="sourceLineNo">389</span>         }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>      if (innerClass != Object.class) {<a 
name="line.392"></a>
-<span class="sourceLineNo">393</span>         _noArgConstructor = 
(Constructor&lt;T&gt;)findNoArgConstructor(implClass == null ? innerClass : 
implClass, Visibility.PUBLIC);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      if (beanFilter == null)<a 
name="line.396"></a>
-<span class="sourceLineNo">397</span>         beanFilter = findBeanFilter();<a 
name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>      if (_swapMethod != null) {<a 
name="line.399"></a>
-<span class="sourceLineNo">400</span>         final Method fSwapMethod = 
_swapMethod;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>         final Method fUnswapMethod = 
_unswapMethod;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>         final Constructor&lt;T&gt; 
fSwapConstructor = _swapConstructor;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>         _pojoSwap = new 
PojoSwap&lt;T,Object&gt;(c, _swapMethod.getReturnType()) {<a 
name="line.403"></a>
-<span class="sourceLineNo">404</span>            @Override<a 
name="line.404"></a>
-<span class="sourceLineNo">405</span>            public Object 
swap(BeanSession session, Object o) throws SerializeException {<a 
name="line.405"></a>
-<span class="sourceLineNo">406</span>               try {<a 
name="line.406"></a>
-<span class="sourceLineNo">407</span>                  return 
fSwapMethod.invoke(o, session);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>               } catch (Exception e) {<a 
name="line.408"></a>
-<span class="sourceLineNo">409</span>                  throw new 
SerializeException(e);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>               }<a name="line.410"></a>
+<span class="sourceLineNo">390</span>         // Find unswap() method if 
present.<a name="line.390"></a>
+<span class="sourceLineNo">391</span>         if (swapMethod != null) {<a 
name="line.391"></a>
+<span class="sourceLineNo">392</span>            for (Method m : 
c.getMethods()) {<a name="line.392"></a>
+<span class="sourceLineNo">393</span>               if (isPublic(m) &amp;&amp; 
isNotDeprecated(m) &amp;&amp; isStatic(m)) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>                  String mName = 
m.getName();<a name="line.394"></a>
+<span class="sourceLineNo">395</span>                  if 
(mName.equals("unswap")) {<a name="line.395"></a>
+<span class="sourceLineNo">396</span>                     Class&lt;?&gt;[] pt 
= m.getParameterTypes();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>                     if (pt.length == 2 
&amp;&amp; pt[0] == BeanSession.class &amp;&amp; pt[1] == swapMethodType) {<a 
name="line.397"></a>
+<span class="sourceLineNo">398</span>                        unswapMethod = 
m;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>                        break;<a 
name="line.399"></a>
+<span class="sourceLineNo">400</span>                     }<a 
name="line.400"></a>
+<span class="sourceLineNo">401</span>                  }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>               }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
+<span class="sourceLineNo">404</span>         }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>         // Find @NameProperty and 
@ParentProperty methods if present.<a name="line.406"></a>
+<span class="sourceLineNo">407</span>         for (Method m : 
c.getDeclaredMethods()) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            if 
(m.isAnnotationPresent(ParentProperty.class) &amp;&amp; 
m.getParameterTypes().length == 1) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>               m.setAccessible(true);<a 
name="line.409"></a>
+<span class="sourceLineNo">410</span>               parentPropertyMethod = 
m;<a name="line.410"></a>
 <span class="sourceLineNo">411</span>            }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>            @Override<a 
name="line.412"></a>
-<span class="sourceLineNo">413</span>            public T unswap(BeanSession 
session, Object f, ClassMeta&lt;?&gt; hint) throws ParseException {<a 
name="line.413"></a>
-<span class="sourceLineNo">414</span>               try {<a 
name="line.414"></a>
-<span class="sourceLineNo">415</span>                  if (fUnswapMethod != 
null)<a name="line.415"></a>
-<span class="sourceLineNo">416</span>                     return 
(T)fUnswapMethod.invoke(null, session, f);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>                  if (fSwapConstructor != 
null)<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                     return 
fSwapConstructor.newInstance(f);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                  return 
super.unswap(session, f, hint);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>               } catch (Exception e) {<a 
name="line.420"></a>
-<span class="sourceLineNo">421</span>                  throw new 
ParseException(e);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>               }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>            }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>         };<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      }<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      if (_pojoSwap == null)<a 
name="line.426"></a>
-<span class="sourceLineNo">427</span>         _pojoSwap = findPojoSwap();<a 
name="line.427"></a>
-<span class="sourceLineNo">428</span>      if (_pojoSwap == null)<a 
name="line.428"></a>
-<span class="sourceLineNo">429</span>         _pojoSwap = pojoSwap;<a 
name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      try {<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>         // If this is an array, get the 
element type.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>         if (_cc == ARRAY)<a 
name="line.434"></a>
-<span class="sourceLineNo">435</span>            _elementType = 
findClassMeta(innerClass.getComponentType());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>         // If this is a MAP, see if it's 
parameterized (e.g. AddressBook extends HashMap&lt;String,Person&gt;)<a 
name="line.437"></a>
-<span class="sourceLineNo">438</span>         else if (_cc == MAP) {<a 
name="line.438"></a>
-<span class="sourceLineNo">439</span>            ClassMeta[] parameters = 
findParameters();<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            if (parameters != null 
&amp;&amp; parameters.length == 2) {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>               _keyType = 
parameters[0];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>               _valueType = 
parameters[1];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>            } else {<a 
name="line.443"></a>
-<span class="sourceLineNo">444</span>               _keyType = 
findClassMeta(Object.class);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>               _valueType = 
findClassMeta(Object.class);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>            }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>         }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>         // If this is a COLLECTION, see 
if it's parameterized (e.g. AddressBook extends LinkedList&lt;Person&gt;)<a 
name="line.449"></a>
-<span class="sourceLineNo">450</span>         else if (_cc == COLLECTION) {<a 
name="line.450"></a>
-<span class="sourceLineNo">451</span>            ClassMeta[] parameters = 
findParameters();<a name="line.451"></a>
-<span class="sourceLineNo">452</span>            if (parameters != null 
&amp;&amp; parameters.length == 1) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>               _elementType = 
parameters[0];<a name="line.453"></a>
-<span class="sourceLineNo">454</span>            } else {<a 
name="line.454"></a>
-<span class="sourceLineNo">455</span>               _elementType = 
findClassMeta(Object.class);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>         }<a name="line.457"></a>
-<span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>         // If the category is unknown, 
see if it's a bean.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>         // Note that this needs to be 
done after all other initialization has been done.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>         else if (_cc == OTHER) {<a 
name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>            BeanMeta newMeta = null;<a 
name="line.463"></a>
-<span class="sourceLineNo">464</span>            try {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>               newMeta = new 
BeanMeta(this, beanContext, beanFilter, null);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>               _notABeanReason = 
newMeta.notABeanReason;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>               _beanRegistry = 
newMeta.beanRegistry;  // Always get the bean registry even if it's not a 
bean.<a name="line.467"></a>
-<span class="sourceLineNo">468</span>            } catch (RuntimeException e) 
{<a name="line.468"></a>
-<span class="sourceLineNo">469</span>               _notABeanReason = 
e.getMessage();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>               throw e;<a 
name="line.470"></a>
-<span class="sourceLineNo">471</span>            }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>            if (_notABeanReason == 
null)<a name="line.472"></a>
-<span class="sourceLineNo">473</span>               _beanMeta = newMeta;<a 
name="line.473"></a>
-<span class="sourceLineNo">474</span>         }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>      } catch (NoClassDefFoundError e) 
{<a name="line.476"></a>
-<span class="sourceLineNo">477</span>         _initException = e;<a 
name="line.477"></a>
-<span class="sourceLineNo">478</span>      } catch (RuntimeException e) {<a 
name="line.478"></a>
-<span class="sourceLineNo">479</span>         _initException = e;<a 
name="line.479"></a>
-<span class="sourceLineNo">480</span>         throw e;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      }<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>      if (_beanMeta != null)<a 
name="line.483"></a>
-<span class="sourceLineNo">484</span>         _dictionaryName = 
_resolvedDictionaryName = _beanMeta.getDictionaryName();<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>      if (_cc == ARRAY &amp;&amp; 
_elementType != null) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>         _resolvedDictionaryName = 
_elementType.getResolvedDictionaryName();<a name="line.487"></a>
-<span class="sourceLineNo">488</span>         if (_resolvedDictionaryName != 
null)<a name="line.488"></a>
-<span class="sourceLineNo">489</span>            _resolvedDictionaryName += 
"^";<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      }<a name="line.490"></a>
-<span class="sourceLineNo">491</span><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      _serializedClassMeta = (_pojoSwap 
== null ? this : findClassMeta(_pojoSwap.getSwapClass()));<a 
name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (_serializedClassMeta == null)<a 
name="line.493"></a>
-<span class="sourceLineNo">494</span>         _serializedClassMeta = this;<a 
name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>      if (_beanMeta != null &amp;&amp; 
beanContext != null &amp;&amp; beanContext.useInterfaceProxies &amp;&amp; 
innerClass.isInterface())<a name="line.496"></a>
-<span class="sourceLineNo">497</span>         _invocationHandler = new 
BeanProxyInvocationHandler&lt;T&gt;(_beanMeta);<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>      Bean b = 
c.getAnnotation(Bean.class);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      if (b != null &amp;&amp; 
b.beanDictionary().length != 0)<a name="line.500"></a>
-<span class="sourceLineNo">501</span>         _beanRegistry = new 
BeanRegistry(beanContext, null, b.beanDictionary());<a name="line.501"></a>
-<span class="sourceLineNo">502</span><a name="line.502"></a>
-<span class="sourceLineNo">503</span>      this.cc = _cc;<a 
name="line.503"></a>
-<span class="sourceLineNo">504</span>      this.isDelegate = _isDelegate;<a 
name="line.504"></a>
-<span class="sourceLineNo">505</span>      this.fromStringMethod = 
_fromStringMethod;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      this.swapMethod = _swapMethod;<a 
name="line.506"></a>
-<span class="sourceLineNo">507</span>      this.unswapMethod = 
_unswapMethod;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      this.swapMethodType = 
_swapMethodType;<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      this.parentPropertyMethod = 
_parentPropertyMethod;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      this.namePropertyMethod 
=_namePropertyMethod;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      this.noArgConstructor = 
_noArgConstructor;<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      this.stringConstructor = 
_stringConstructor;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      this.swapConstructor = 
_swapConstructor;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      this.numberConstructor = 
_numberConstructor;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      this.numberConstructorType = 
_numberConstructorType;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      this.primitiveDefault = 
_primitiveDefault;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.publicMethods = 
_publicMethods;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      this.remoteableMethods = 
_remoteableMethods;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      this.beanFilter = beanFilter;<a 
name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.pojoSwap = _pojoSwap;<a 
name="line.520"></a>
-<span class="sourceLineNo">521</span>      this.extMeta = new MetadataMap();<a 
name="line.521"></a>
-<span class="sourceLineNo">522</span>      this.keyType = _keyType;<a 
name="line.522"></a>
-<span class="sourceLineNo">523</span>      this.valueType = _valueType;<a 
name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.elementType = _elementType;<a 
name="line.524"></a>
-<span class="sourceLineNo">525</span>      this.notABeanReason = 
_notABeanReason;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      this.beanMeta = _beanMeta;<a 
name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.initException = 
_initException;<a name="line.527"></a>
-<span class="sourceLineNo">528</span>      this.dictionaryName = 
_dictionaryName;<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      this.resolvedDictionaryName = 
_resolvedDictionaryName;<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.serializedClassMeta = 
_serializedClassMeta;<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      this.invocationHandler = 
_invocationHandler;<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      this.beanRegistry = 
_beanRegistry;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   }<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>   /**<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    * Copy constructor.<a 
name="line.536"></a>
-<span class="sourceLineNo">537</span>    * Used for creating Map and 
Collection class metas that shouldn't be cached.<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   ClassMeta(ClassMeta&lt;T&gt; mainType, 
ClassMeta&lt;?&gt; keyType, ClassMeta&lt;?&gt; valueType, ClassMeta&lt;?&gt; 
elementType) {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      this.innerClass = 
mainType.innerClass;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      this.implClass = 
mainType.implClass;<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      this.childPojoSwaps = 
mainType.childPojoSwaps;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>      this.childSwapMap = 
mainType.childSwapMap;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      this.childUnswapMap = 
mainType.childUnswapMap;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      this.cc = mainType.cc;<a 
name="line.545"></a>
-<span class="sourceLineNo">546</span>      this.fromStringMethod = 
mainType.fromStringMethod;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      this.noArgConstructor = 
mainType.noArgConstructor;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      this.stringConstructor = 
mainType.stringConstructor;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      this.numberConstructor = 
mainType.numberConstructor;<a name="line.549"></a>
-<span class="sourceLineNo">550</span>      this.swapConstructor = 
mainType.swapConstructor;<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      this.swapMethodType = 
mainType.swapMethodType;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this.numberConstructorType = 
mainType.numberConstructorType;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>      this.swapMethod = 
mainType.swapMethod;<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      this.unswapMethod = 
mainType.unswapMethod;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      this.namePropertyMethod = 
mainType.namePropertyMethod;<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      this.parentPropertyMethod = 
mainType.parentPropertyMethod;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      this.isDelegate = 
mainType.isDelegate;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      this.isAbstract = 
mainType.isAbstract;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      this.isMemberClass = 
mainType.isMemberClass;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      this.primitiveDefault = 
mainType.primitiveDefault;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this.remoteableMethods = 
mainType.remoteableMethods;<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      this.publicMethods = 
mainType.publicMethods;<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      this.beanContext = 
mainType.beanContext;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      this.serializedClassMeta = this;<a 
name="line.564"></a>
-<span class="sourceLineNo">565</span>      this.elementType = elementType;<a 
name="line.565"></a>
-<span class="sourceLineNo">566</span>      this.keyType = keyType;<a 
name="line.566"></a>
-<span class="sourceLineNo">567</span>      this.valueType = valueType;<a 
name="line.567"></a>
-<span class="sourceLineNo">568</span>      this.invocationHandler = 
mainType.invocationHandler;<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      this.beanMeta = 
mainType.beanMeta;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      this.dictionaryName = 
mainType.dictionaryName;<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.resolvedDictionaryName = 
mainType.resolvedDictionaryName;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.notABeanReason = 
mainType.notABeanReason;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.pojoSwap = 
mainType.pojoSwap;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.beanFilter = 
mainType.beanFilter;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.extMeta = mainType.extMeta;<a 
name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.initException = 
mainType.initException;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.beanRegistry = 
mainType.beanRegistry;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   }<a name="line.578"></a>
-<span class="sourceLineNo">579</span><a name="line.579"></a>
-<span class="sourceLineNo">580</span>   private ClassMeta&lt;?&gt; 
findClassMeta(Class&lt;?&gt; c) {<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      return 
beanContext.getClassMeta(c);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   }<a name="line.582"></a>
+<span class="sourceLineNo">412</span>            if 
(m.isAnnotationPresent(NameProperty.class) &amp;&amp; 
m.getParameterTypes().length == 1) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>               m.setAccessible(true);<a 
name="line.413"></a>
+<span class="sourceLineNo">414</span>               namePropertyMethod = m;<a 
name="line.414"></a>
+<span class="sourceLineNo">415</span>            }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>         }<a name="line.416"></a>
+<span class="sourceLineNo">417</span><a name="line.417"></a>
+<span class="sourceLineNo">418</span>         // Note:  Primitive types are 
normally abstract.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>         isAbstract = 
Modifier.isAbstract(c.getModifiers()) &amp;&amp; ! c.isPrimitive();<a 
name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>         // Find constructor(String) 
method if present.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>         for (Constructor cs : 
c.getConstructors()) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>            if (isPublic(cs) &amp;&amp; 
isNotDeprecated(cs)) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>               Class&lt;?&gt;[] args = 
cs.getParameterTypes();<a name="line.424"></a>
+<span class="sourceLineNo">425</span>               if (args.length == 
(isMemberClass ? 1 : 0) &amp;&amp; c != Object.class &amp;&amp; ! isAbstract) 
{<a name="line.425"></a>
+<span class="sourceLineNo">426</span>                  noArgConstructor = 
cs;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>               } else if (args.length == 
(isMemberClass ? 2 : 1)) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>                  Class&lt;?&gt; arg = 
args[(isMemberClass ? 1 : 0)];<a name="line.428"></a>
+<span class="sourceLineNo">429</span>                  if (arg == 
String.class)<a name="line.429"></a>
+<span class="sourceLineNo">430</span>                     stringConstructor = 
cs;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  else if (swapMethodType 
!= null &amp;&amp; swapMethodType.isAssignableFrom(arg))<a name="line.431"></a>
+<span class="sourceLineNo">432</span>                     swapConstructor = 
cs;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>                  else if (cc != NUMBER 
&amp;&amp; (Number.class.isAssignableFrom(arg) || (arg.isPrimitive() &amp;&amp; 
(arg == int.class || arg == short.class || arg == long.class || arg == 
float.class || arg == double.class)))) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>                     numberConstructor = 
cs;<a name="line.434"></a>
+<span class="sourceLineNo">435</span>                     
numberConstructorType = ClassUtils.getWrapperIfPrimitive(arg);<a 
name="line.435"></a>
+<span class="sourceLineNo">436</span>                  }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>               }<a name="line.437"></a>
+<span class="sourceLineNo">438</span>            }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>         }<a name="line.439"></a>
+<span class="sourceLineNo">440</span><a name="line.440"></a>
+<span class="sourceLineNo">441</span>         if (c.isPrimitive()) {<a 
name="line.441"></a>
+<span class="sourceLineNo">442</span>            if (c == Boolean.TYPE)<a 
name="line.442"></a>
+<span class="sourceLineNo">443</span>               primitiveDefault = 
BOOLEAN_DEFAULT;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>            else if (c == 
Character.TYPE)<a name="line.444"></a>
+<span class="sourceLineNo">445</span>               primitiveDefault = 
CHARACTER_DEFAULT;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>            else if (c == Short.TYPE)<a 
name="line.446"></a>
+<span class="sourceLineNo">447</span>               primitiveDefault = 
SHORT_DEFAULT;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>            else if (c == Integer.TYPE)<a 
name="line.448"></a>
+<span class="sourceLineNo">449</span>               primitiveDefault = 
INTEGER_DEFAULT;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>            else if (c == Long.TYPE)<a 
name="line.450"></a>
+<span class="sourceLineNo">451</span>               primitiveDefault = 
LONG_DEFAULT;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>            else if (c == Float.TYPE)<a 
name="line.452"></a>
+<span class="sourceLineNo">453</span>               primitiveDefault = 
FLOAT_DEFAULT;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            else if (c == Double.TYPE)<a 
name="line.454"></a>
+<span class="sourceLineNo">455</span>               primitiveDefault = 
DOUBLE_DEFAULT;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>            else if (c == Byte.TYPE)<a 
name="line.456"></a>
+<span class="sourceLineNo">457</span>               primitiveDefault = 
BYTE_DEFAULT;<a name="line.457"></a>
+<span class="sourceLineNo">458</span>         } else {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>            if (c == Boolean.class)<a 
name="line.459"></a>
+<span class="sourceLineNo">460</span>               primitiveDefault = 
BOOLEAN_DEFAULT;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            else if (c == 
Character.class)<a name="line.461"></a>
+<span class="sourceLineNo">462</span>               primitiveDefault = 
CHARACTER_DEFAULT;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            else if (c == Short.class)<a 
name="line.463"></a>
+<span class="sourceLineNo">464</span>               primitiveDefault = 
SHORT_DEFAULT;<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            else if (c == 
Integer.class)<a name="line.465"></a>
+<span class="sourceLineNo">466</span>               primitiveDefault = 
INTEGER_DEFAULT;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>            else if (c == Long.class)<a 
name="line.467"></a>
+<span class="sourceLineNo">468</span>               primitiveDefault = 
LONG_DEFAULT;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>            else if (c == Float.class)<a 
name="line.469"></a>
+<span class="sourceLineNo">470</span>               primitiveDefault = 
FLOAT_DEFAULT;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>            else if (c == Double.class)<a 
name="line.471"></a>
+<span class="sourceLineNo">472</span>               primitiveDefault = 
DOUBLE_DEFAULT;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>            else if (c == Byte.class)<a 
name="line.473"></a>
+<span class="sourceLineNo">474</span>               primitiveDefault = 
BYTE_DEFAULT;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>         }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>         for (Method m : 
c.getMethods())<a name="line.477"></a>
+<span class="sourceLineNo">478</span>            if (isPublic(m) &amp;&amp; 
isNotDeprecated(m))<a name="line.478"></a>
+<span class="sourceLineNo">479</span>               
publicMethods.put(ClassUtils.getMethodSignature(m), m);<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>         if 
(c.getAnnotation(Remoteable.class) != null) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>            remoteableMethods = 
publicMethods;<a name="line.482"></a>
+<span class="sourceLineNo">483</span>         } else {<a name="line.483"></a>
+<span class="sourceLineNo">484</span>            for (Method m : 
c.getMethods()) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>               if 
(m.getAnnotation(Remoteable.class) != null) {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>                  if (remoteableMethods 
== null)<a name="line.486"></a>
+<span class="sourceLineNo">487</span>                     remoteableMethods = 
new LinkedHashMap&lt;String,Method&gt;();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>                  
remoteableMethods.put(ClassUtils.getMethodSignature(m), m);<a 
name="line.488"></a>
+<span class="sourceLineNo">489</span>               }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>            }<a name="line.490"></a>
+<span class="sourceLineNo">491</span>         }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>         if (innerClass != Object.class) 
{<a name="line.493"></a>
+<span class="sourceLineNo">494</span>            noArgConstructor = 
(Constructor&lt;T&gt;)findNoArgConstructor(implClass == null ? innerClass : 
implClass, Visibility.PUBLIC);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>         }<a name="line.495"></a>
+<span class="sourceLineNo">496</span><a name="line.496"></a>
+<span class="sourceLineNo">497</span>         if (beanFilter == null)<a 
name="line.497"></a>
+<span class="sourceLineNo">498</span>            beanFilter = 
findBeanFilter();<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>         if (swapMethod != null) {<a 
name="line.500"></a>
+<span class="sourceLineNo">501</span>            final Method fSwapMethod = 
swapMethod;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>            final Method fUnswapMethod = 
unswapMethod;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>            final Constructor&lt;T&gt; 
fSwapConstructor = swapConstructor;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>            this.pojoSwap = new 
PojoSwap&lt;T,Object&gt;(c, swapMethod.getReturnType()) {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>               @Override<a 
name="line.505"></a>
+<span class="sourceLineNo">506</span>               public Object 
swap(BeanSession session, Object o) throws SerializeException {<a 
name="line.506"></a>
+<span class="sourceLineNo">507</span>                  try {<a 
name="line.507"></a>
+<span class="sourceLineNo">508</span>                     return 
fSwapMethod.invoke(o, session);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>                  } catch (Exception e) 
{<a name="line.509"></a>
+<span class="sourceLineNo">510</span>                     throw new 
SerializeException(e);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>                  }<a name="line.511"></a>
+<span class="sourceLineNo">512</span>               }<a name="line.512"></a>
+<span class="sourceLineNo">513</span>               @Override<a 
name="line.513"></a>
+<span class="sourceLineNo">514</span>               public T 
unswap(BeanSession session, Object f, ClassMeta&lt;?&gt; hint) throws 
ParseException {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>                  try {<a 
name="line.515"></a>
+<span class="sourceLineNo">516</span>                     if (fUnswapMethod != 
null)<a name="line.516"></a>
+<span class="sourceLineNo">517</span>                        return 
(T)fUnswapMethod.invoke(null, session, f);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>                     if (fSwapConstructor 
!= null)<a name="line.518"></a>
+<span class="sourceLineNo">519</span>                        return 
fSwapConstructor.newInstance(f);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>                     return 
super.unswap(session, f, hint);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>                  } catch (Exception e) 
{<a name="line.521"></a>
+<span class="sourceLineNo">522</span>                     throw new 
ParseException(e);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>                  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>               }<a name="line.524"></a>
+<span class="sourceLineNo">525</span>            };<a name="line.525"></a>
+<span class="sourceLineNo">526</span>         }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>         if (this.pojoSwap == null)<a 
name="line.527"></a>
+<span class="sourceLineNo">528</span>            this.pojoSwap = 
findPojoSwap();<a name="line.528"></a>
+<span class="sourceLineNo">529</span>         if (this.pojoSwap == null)<a 
name="line.529"></a>
+<span class="sourceLineNo">530</span>            this.pojoSwap = pojoSwap;<a 
name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>         try {<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>            // If this is an array, get 
the element type.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>            if (cc == ARRAY)<a 
name="line.535"></a>
+<span class="sourceLineNo">536</span>               elementType = 
findClassMeta(innerClass.getComponentType());<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>            // If this is a MAP, see if 
it's parameterized (e.g. AddressBook extends HashMap&lt;String,Person&gt;)<a 
name="line.538"></a>
+<span class="sourceLineNo">539</span>            else if (cc == MAP) {<a 
name="line.539"></a>
+<span class="sourceLineNo">540</span>               ClassMeta[] parameters = 
findParameters();<a name="line.540"></a>
+<span class="sourceLineNo">541</span>               if (parameters != null 
&amp;&amp; parameters.length == 2) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>                  keyType = 
parameters[0];<a name="line.542"></a>
+<span class="sourceLineNo">543</span>                  valueType = 
parameters[1];<a name="line.543"></a>
+<span class="sourceLineNo">544</span>               } else {<a 
name="line.544"></a>
+<span class="sourceLineNo">545</span>                  keyType = 
findClassMeta(Object.class);<a name="line.545"></a>
+<span class="sourceLineNo">546</span>                  valueType = 
findClassMeta(Object.class);<a name="line.546"></a>
+<span class="sourceLineNo">547</span>               }<a name="line.547"></a>
+<span class="sourceLineNo">548</span>            }<a name="line.548"></a>
+<span class="sourceLineNo">549</span><a name="line.549"></a>
+<span class="sourceLineNo">550</span>            // If this is a COLLECTION, 
see if it's parameterized (e.g. AddressBook extends LinkedList&lt;Person&gt;)<a 
name="line.550"></a>
+<span class="sourceLineNo">551</span>            else if (cc == COLLECTION) 
{<a name="line.551"></a>
+<span class="sourceLineNo">552</span>               ClassMeta[] parameters = 
findParameters();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>               if (parameters != null 
&amp;&amp; parameters.length == 1) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>                  elementType = 
parameters[0];<a name="line.554"></a>
+<span class="sourceLineNo">555</span>               } else {<a 
name="line.555"></a>
+<span class="sourceLineNo">556</span>                  elementType = 
findClassMeta(Object.class);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>               }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>            }<a name="line.558"></a>
+<span class="sourceLineNo">559</span><a name="line.559"></a>
+<span class="sourceLineNo">560</span>            // If the category is 
unknown, see if it's a bean.<a name="line.560"></a>
+<span class="sourceLineNo">561</span>            // Note that this needs to be 
done after all other initialization has been done.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>            else if (cc == OTHER) {<a 
name="line.562"></a>
+<span class="sourceLineNo">563</span><a name="line.563"></a>
+<span class="sourceLineNo">564</span>               BeanMeta newMeta = nul

<TRUNCATED>

Reply via email to